From 3d7a16393f479c4711f9cdbf20eaf8c77607ea2b Mon Sep 17 00:00:00 2001 From: Merijn Hendriks Date: Mon, 20 Sep 2021 18:20:01 +0200 Subject: [PATCH] Initial project --- .editorconfig | 112 + .gitignore | 9 + .gitmodules | 21 + Build/AppHostPatcher/AppHostPatcher.csproj | 18 + Build/AppHostPatcher/Program.cs | 133 + .../ConvertToNetstandardReferences.cs | 202 + .../ConvertToNetstandardReferences.csproj | 25 + .../ConvertToNetstandardReferences.tasks | 12 + Build/MakeEverythingPublic/IVTPatcher.cs | 194 + .../MakeEverythingPublic.cs | 211 + .../MakeEverythingPublic.csproj | 25 + .../MakeEverythingPublic.tasks | 22 + .../ConvertToNetstandardReferences.dll | Bin 0 -> 11776 bytes Build/compiled/MakeEverythingPublic.dll | Bin 0 -> 14848 bytes Build/compiled/dnlib.dll | Bin 0 -> 1149952 bytes Directory.Build.props | 2 + Directory.Build.targets | 43 + DnSpyCommon.props | 60 + .../Example1.Extension/CodeCtxMenus.cs | 155 + .../Example1.Extension.csproj | 20 + .../Example1.Extension/MainMenuCommands.cs | 49 + .../Examples/Example1.Extension/MySettings.cs | 85 + .../Example1.Extension/MySettingsControl.xaml | 8 + .../MySettingsControl.xaml.cs | 7 + .../Example1.Extension/MySettingsPage.cs | 73 + .../Examples/Example1.Extension/README.md | 9 + .../Example1.Extension/TheExtension.cs | 24 + .../Example1.Extension/ToolBarCommands.cs | 39 + .../Example1.Extension/TreeViewCtxMenus.cs | 137 + .../AssemblyChildNodeTabContent.cs | 177 + .../Examples/Example2.Extension/Colorizer.cs | 146 + .../DocumentViewerToolTipProvider.cs | 26 + .../Example2.Extension.csproj | 20 + .../Example2.Extension/HexColorizer.cs | 125 + .../Example2.Extension/NewDsDocument.cs | 122 + .../Example2.Extension/OutputTextPane.cs | 92 + .../Examples/Example2.Extension/README.md | 12 + .../Example2.Extension/TheExtension.cs | 23 + .../Themes/resourcedict.xaml | 24 + .../Example2.Extension/ToolWindowContent.cs | 170 + .../Example2.Extension/ToolWindowControl.xaml | 30 + .../ToolWindowControl.xaml.cs | 7 + .../TreeNodeDataProvider.cs | 200 + .../TreeViewNodeColorizer.cs | 91 + .../CSharp/AssemblyInfoTransform.cs | 71 + .../CSharp/BuilderCache.cs | 90 + .../CSharp/BuilderState.cs | 45 + .../CSharp/CSharpDecompiler.cs | 525 + .../CSharp/DecompilePartialTransform.cs | 84 + .../CSharp/DecompileTypeMethodsTransform.cs | 137 + .../CSharp/ThreadSafeObjectPool.cs | 57 + .../IL/ILDecompiler.cs | 200 + .../IL/ILDecompilerUtils.cs | 57 + .../ILAst/ILAstDecompiler.cs | 386 + .../Properties/AssemblyInfo.cs | 3 + ...ecompiler.ILSpy.Core.Resources.Designer.cs | 415 + ...py.Decompiler.ILSpy.Core.Resources.cs.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.de.resx | 237 + ...Decompiler.ILSpy.Core.Resources.es-ES.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.fa.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.fr.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.hu.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.it.resx | 237 + ...Decompiler.ILSpy.Core.Resources.pt-BR.resx | 237 + ...Decompiler.ILSpy.Core.Resources.pt-PT.resx | 237 + ...dnSpy.Decompiler.ILSpy.Core.Resources.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.ru.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.tr.resx | 237 + ...py.Decompiler.ILSpy.Core.Resources.uk.resx | 237 + ...Decompiler.ILSpy.Core.Resources.zh-CN.resx | 237 + .../Settings/CSharpVBDecompilerSettings.cs | 281 + .../Settings/DecompilerSettingsService.cs | 48 + .../Settings/ILAstDecompilerSettings.cs | 46 + .../Settings/ILDecompilerSettings.cs | 95 + .../Settings/ILSettings.cs | 175 + .../Text/ContentTypesInternal.cs | 28 + .../VisualBasic/ILSpyEnvironmentProvider.cs | 172 + .../VisualBasic/VBDecompiler.cs | 333 + .../VisualBasic/VBTextOutputFormatter.cs | 374 + .../XmlDoc/AddXmlDocTransform.cs | 64 + .../XmlDoc/StringLineIterator.cs | 91 + .../XmlDoc/SubString.cs | 37 + .../XmlDoc/XmlDocLine.cs | 153 + .../dnSpy.Decompiler.ILSpy.Core.csproj | 39 + .../CSharp/DecompilerCreator.cs | 36 + .../ContentTypeDefinitions.cs | 57 + .../IL/DecompilerCreator.cs | 36 + .../IL/SimpleILPrinter.cs | 36 + .../ILAst/DecompilerCreator.cs | 36 + ...Spy.Decompiler.ILSpy.Resources.Designer.cs | 117 + .../dnSpy.Decompiler.ILSpy.Resources.cs.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.de.resx | 138 + ...nSpy.Decompiler.ILSpy.Resources.es-ES.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.fa.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.fr.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.hu.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.it.resx | 138 + ...nSpy.Decompiler.ILSpy.Resources.pt-BR.resx | 138 + ...nSpy.Decompiler.ILSpy.Resources.pt-PT.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.ru.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.tr.resx | 138 + .../dnSpy.Decompiler.ILSpy.Resources.uk.resx | 138 + ...nSpy.Decompiler.ILSpy.Resources.zh-CN.resx | 138 + .../Settings/CSharpDecompilerSettingsPage.cs | 202 + .../DecompilerAppSettingsModifiedListener.cs | 69 + .../Settings/DecompilerSettingsImpl.cs | 131 + .../DecompilerSettingsPageProvider.cs | 42 + .../Settings/DecompilerSettingsServiceImpl.cs | 32 + .../Settings/ILDecompilerSettingsPage.cs | 49 + .../Settings/ILSettingsImpl.cs | 65 + .../Settings/SettingsConstants.cs | 44 + .../dnSpy.Decompiler.ILSpy/TheExtension.cs | 39 + .../Themes/wpf.styles.templates.xaml | 60 + .../VisualBasic/DecompilerCreator.cs | 36 + .../dnSpy.Decompiler.ILSpy.csproj | 44 + Extensions/dnSpy.Analyzer/AnalyzerService.cs | 376 + Extensions/dnSpy.Analyzer/AnalyzerSettings.cs | 101 + .../AnalyzerToolWindowContent.cs | 69 + .../AnalyzerTreeNodeDataContext.cs | 41 + Extensions/dnSpy.Analyzer/Commands.cs | 210 + .../dnSpy.Analyzer/ContentTypeDefinitions.cs | 33 + .../dnSpy.Analyzer.Resources.Designer.cs | 342 + .../dnSpy.Analyzer.Resources.cs.resx | 213 + .../dnSpy.Analyzer.Resources.de.resx | 213 + .../dnSpy.Analyzer.Resources.es-ES.resx | 213 + .../dnSpy.Analyzer.Resources.fa.resx | 213 + .../dnSpy.Analyzer.Resources.fr.resx | 213 + .../dnSpy.Analyzer.Resources.hu.resx | 213 + .../dnSpy.Analyzer.Resources.it.resx | 213 + .../dnSpy.Analyzer.Resources.pt-BR.resx | 213 + .../dnSpy.Analyzer.Resources.pt-PT.resx | 213 + .../Properties/dnSpy.Analyzer.Resources.resx | 213 + .../dnSpy.Analyzer.Resources.ru.resx | 213 + .../dnSpy.Analyzer.Resources.tr.resx | 213 + .../dnSpy.Analyzer.Resources.uk.resx | 213 + .../dnSpy.Analyzer.Resources.zh-CN.resx | 213 + Extensions/dnSpy.Analyzer/TheExtension.cs | 38 + .../TreeNodes/AnalyzerTreeNodeData.cs | 145 + .../dnSpy.Analyzer/TreeNodes/AssemblyNode.cs | 35 + .../TreeNodes/AsyncFetchChildrenHelper.cs | 97 + .../TreeNodes/AttributeAppliedToNode.cs | 310 + .../dnSpy.Analyzer/TreeNodes/ComUtils.cs | 143 + .../dnSpy.Analyzer/TreeNodes/Commands.cs | 326 + .../dnSpy.Analyzer/TreeNodes/EntityNode.cs | 53 + .../TreeNodes/EventAccessorNode.cs | 37 + .../TreeNodes/EventFiredByNode.cs | 122 + .../dnSpy.Analyzer/TreeNodes/EventNode.cs | 91 + .../TreeNodes/EventOverriddenNode.cs | 87 + .../TreeNodes/EventOverridesNode.cs | 61 + .../TreeNodes/FieldAccessNode.cs | 209 + .../dnSpy.Analyzer/TreeNodes/FieldNode.cs | 52 + .../dnSpy.Analyzer/TreeNodes/Helpers.cs | 118 + .../TreeNodes/IAnalyzerTreeNodeDataContext.cs | 38 + .../TreeNodes/IAsyncCancellable.cs | 24 + .../InterfaceEventImplementedByNode.cs | 111 + .../InterfaceMethodImplementedByNode.cs | 138 + .../InterfacePropertyImplementedByNode.cs | 90 + .../dnSpy.Analyzer/TreeNodes/MethodNode.cs | 78 + .../TreeNodes/MethodOverriddenNode.cs | 72 + .../TreeNodes/MethodOverridesNode.cs | 62 + .../TreeNodes/MethodUsedByNode.cs | 161 + .../TreeNodes/MethodUsesNode.cs | 79 + .../dnSpy.Analyzer/TreeNodes/ModuleNode.cs | 38 + .../TreeNodes/PropertyAccessorNode.cs | 37 + .../dnSpy.Analyzer/TreeNodes/PropertyNode.cs | 89 + .../TreeNodes/PropertyOverriddenNode.cs | 87 + .../TreeNodes/PropertyOverridesNode.cs | 62 + .../TreeNodes/ScopedWhereUsedAnalyzer.cs | 341 + .../dnSpy.Analyzer/TreeNodes/SearchNode.cs | 182 + .../dnSpy.Analyzer/TreeNodes/SourceRef.cs | 33 + .../dnSpy.Analyzer/TreeNodes/TIAHelper.cs | 221 + .../TreeNodes/TypeExposedByNode.cs | 233 + .../TreeNodes/TypeExtensionMethodsNode.cs | 81 + .../TreeNodes/TypeInstantiationsNode.cs | 74 + .../dnSpy.Analyzer/TreeNodes/TypeNode.cs | 59 + .../TreeNodes/TypeUsedByNode.cs | 361 + .../TreeNodes/VirtualMethodUsedByNode.cs | 164 + Extensions/dnSpy.Analyzer/TreeTraversal.cs | 105 + .../dnSpy.Analyzer/dnSpy.Analyzer.csproj | 42 + .../Assembly/AssemblyCommands.cs | 441 + .../Assembly/AssemblyOptions.cs | 79 + .../Assembly/AssemblyOptionsDlg.xaml | 177 + .../Assembly/AssemblyOptionsDlg.xaml.cs | 33 + .../Assembly/AssemblyOptionsVM.cs | 261 + .../dnSpy.AsmEditor/Commands/AppService.cs | 51 + .../Commands/AsmEditorContext.cs | 28 + .../Commands/ClipboardDataHolder.cs | 98 + .../Commands/CloseAllMissingFilesCommand.cs | 57 + .../CloseOldInMemoryModulesCommand.cs | 64 + .../Commands/CodeContextMenuHandler.cs | 78 + .../CodeContextMenuHandlerCommandProxy.cs | 69 + .../dnSpy.AsmEditor/Commands/CommandUtils.cs | 51 + .../Commands/ContextMenuHandler.cs | 35 + .../Commands/DeletableNodes.cs | 80 + .../Commands/DeletedEventUpdater.cs | 60 + .../Commands/DeletedFieldUpdater.cs | 60 + .../Commands/DeletedMethodUpdater.cs | 60 + .../Commands/DeletedPropertyUpdater.cs | 60 + .../Commands/DeletedTypeUpdater.cs | 71 + .../Commands/DocumentsContextMenuHandler.cs | 40 + .../Commands/EditMenuHandler.cs | 42 + .../Commands/EditMenuHandlerCommandProxy.cs | 49 + .../Commands/EditedEventUpdater.cs | 50 + .../Commands/EditedFieldUpdater.cs | 50 + .../Commands/EditedMethodUpdater.cs | 78 + .../Commands/EditedPropertyUpdater.cs | 50 + .../Commands/EventNodeCreator.cs | 70 + .../Commands/FieldNodeCreator.cs | 54 + .../Commands/FileMenuHandler.cs | 42 + .../dnSpy.AsmEditor/Commands/IIndexedItem.cs | 25 + .../Commands/IndexObservableCollection.cs | 211 + .../Commands/InstructionCommands.cs | 159 + .../Commands/ListBoxHelperBase.cs | 369 + .../Commands/MethodNodeCreator.cs | 54 + .../Commands/MyObservableCollection.cs | 94 + .../Commands/NamespaceNodeCreator.cs | 70 + .../Commands/NestedTypeNodeCreator.cs | 67 + .../Commands/PropertyNodeCreator.cs | 68 + .../dnSpy.AsmEditor/Commands/RefFinder.cs | 114 + .../Commands/RootDocumentNodeCreator.cs | 82 + .../Commands/TypeNodeCreator.cs | 89 + .../Compiler/AddClassCommands.cs | 153 + .../Compiler/AddClassMembersCommands.cs | 160 + .../dnSpy.AsmEditor/Compiler/AddClassVM.cs | 42 + .../Compiler/AddMembersCodeVM.cs | 83 + .../Compiler/AddUpdatedNodesHelper.cs | 197 + .../Compiler/AssemblyReferenceResolver.cs | 111 + .../Compiler/CodeEditorCommands.cs | 104 + .../dnSpy.AsmEditor/Compiler/Commands.cs | 225 + .../CompilerAppSettingsPageContainer.cs | 25 + .../Compiler/CompilerDiagnosticComparer.cs | 49 + .../Compiler/CompilerDiagnosticVM.cs | 91 + .../Compiler/EditAssemblyCommands.cs | 150 + .../Compiler/EditAssemblyVM.cs | 53 + .../Compiler/EditClassCommands.cs | 219 + .../dnSpy.AsmEditor/Compiler/EditClassVM.cs | 74 + .../Compiler/EditCodeCommandBase.cs | 36 + .../Compiler/EditCodeCommandConstants.cs | 29 + .../Compiler/EditCodeCommandInfoProvider.cs | 43 + .../Compiler/EditCodeCommandTargetFilter.cs | 88 + .../dnSpy.AsmEditor/Compiler/EditCodeDlg.xaml | 148 + .../Compiler/EditCodeDlg.xaml.cs | 147 + .../dnSpy.AsmEditor/Compiler/EditCodeIds.cs | 30 + .../Compiler/EditCodeIdsExtensions.cs | 42 + .../dnSpy.AsmEditor/Compiler/EditCodeVM.cs | 660 + .../Compiler/EditCodeVMCreator.cs | 212 + .../Compiler/EditCodeVMOptions.cs | 51 + .../Compiler/EditMethodCodeVM.cs | 86 + .../Compiler/ExistingTypeNodeUpdater.cs | 178 + .../Compiler/ImportSigComparer.cs | 2019 +++ .../dnSpy.AsmEditor/Compiler/ImportedType.cs | 194 + .../Compiler/MDEditor/BlobHeapWriter.cs | 35 + .../Compiler/MDEditor/BlobMDHeap.cs | 84 + .../MDEditor/DotNetMetadataSectionData.cs | 108 + .../Compiler/MDEditor/GuidHeapWriter.cs | 35 + .../Compiler/MDEditor/GuidMDHeap.cs | 46 + .../MDEditor/ImageCor20HeaderSectionData.cs | 82 + .../Compiler/MDEditor/MDHeap.cs | 25 + .../Compiler/MDEditor/MDHeapWriter.cs | 52 + .../Compiler/MDEditor/MDWriter.cs | 295 + .../Compiler/MDEditor/MDWriterMemoryStream.cs | 213 + .../Compiler/MDEditor/MDWriterStream.cs | 36 + .../Compiler/MDEditor/MetadataEditor.cs | 119 + .../Compiler/MDEditor/PESectionData.cs | 26 + .../Compiler/MDEditor/RawRowColumnReader.cs | 194 + .../Compiler/MDEditor/SectionSizes.cs | 90 + .../Compiler/MDEditor/StringsHeapWriter.cs | 35 + .../Compiler/MDEditor/StringsMDHeap.cs | 79 + .../StrongNameSignatureSectionData.cs | 34 + .../Compiler/MDEditor/TableWriter.cs | 123 + .../Compiler/MDEditor/TablesHeapWriter.cs | 229 + .../Compiler/MDEditor/TablesMDHeap.cs | 300 + .../Compiler/MDEditor/USMDHeap.cs | 36 + .../Compiler/MDEditor/UnknownMDHeap.cs | 36 + .../Compiler/MDEditorPatcher.cs | 620 + .../Compiler/MDPatcherUtils.cs | 240 + .../dnSpy.AsmEditor/Compiler/MDSigPatcher.cs | 354 + .../Compiler/MergeWithAssemblyCommand.cs | 211 + .../Compiler/MetadataReferenceFinder.cs | 158 + .../Compiler/ModuleImporter.MemberLookup.cs | 164 + .../Compiler/ModuleImporter.cs | 2320 ++++ .../ModuleImporterAssemblyResolver.cs | 90 + .../dnSpy.AsmEditor/Compiler/ModulePatcher.cs | 87 + .../Compiler/NativeMemoryAllocator.cs | 43 + .../Compiler/PlatformHelper.cs | 60 + .../Compiler/RawModuleBytes.cs | 66 + .../Compiler/RawModuleBytesProvider.cs | 117 + .../Compiler/RecursionCounter.cs | 42 + .../Compiler/RemappedTypeTokens.cs | 95 + .../Compiler/ResourceNodeCreator.cs | 61 + .../dnSpy.AsmEditor/Compiler/TIAHelper.cs | 248 + .../Converters/CilObjectConverter.cs | 90 + ...InstructionOperandTextBoxStyleConverter.cs | 35 + .../DnlibDialogs/CAArgumentVM.cs | 405 + .../DnlibDialogs/CANamedArgumentControl.xaml | 52 + .../CANamedArgumentControl.xaml.cs | 36 + .../DnlibDialogs/CANamedArgumentVM.cs | 325 + .../DnlibDialogs/CANamedArgumentsControl.xaml | 30 + .../CANamedArgumentsControl.xaml.cs | 26 + .../DnlibDialogs/CANamedArgumentsVM.cs | 36 + .../DnlibDialogs/ConstantControl.xaml | 38 + .../DnlibDialogs/ConstantControl.xaml.cs | 26 + .../DnlibDialogs/ConstantTypeControl.xaml | 260 + .../DnlibDialogs/ConstantTypeControl.xaml.cs | 38 + .../DnlibDialogs/ConstantTypeDlg.xaml | 58 + .../DnlibDialogs/ConstantTypeDlg.xaml.cs | 26 + .../DnlibDialogs/ConstantTypeVM.cs | 859 ++ .../DnlibDialogs/ConstantVM.cs | 99 + .../BooleanToGridrowLengthConverter.cs | 41 + .../Converters/BooleanToThicknessConverter.cs | 41 + .../Converters/RadioButtonConverter.cs | 29 + .../CreateTypeSigArrayControl.xaml | 80 + .../CreateTypeSigArrayControl.xaml.cs | 26 + .../DnlibDialogs/CreateTypeSigArrayDlg.xaml | 63 + .../CreateTypeSigArrayDlg.xaml.cs | 26 + .../DnlibDialogs/CreateTypeSigArrayVM.cs | 130 + .../DnlibDialogs/CustomAttributeControl.xaml | 72 + .../CustomAttributeControl.xaml.cs | 36 + .../DnlibDialogs/CustomAttributeDlg.xaml | 53 + .../DnlibDialogs/CustomAttributeDlg.xaml.cs | 26 + .../DnlibDialogs/CustomAttributeOptions.cs | 47 + .../DnlibDialogs/CustomAttributeVM.cs | 235 + .../DnlibDialogs/CustomAttributesControl.xaml | 25 + .../CustomAttributesControl.xaml.cs | 36 + .../DnlibDialogs/CustomAttributesVM.cs | 34 + .../DnlibDialogs/DeclSecuritiesControl.xaml | 25 + .../DeclSecuritiesControl.xaml.cs | 36 + .../DnlibDialogs/DeclSecuritiesVM.cs | 34 + .../DnlibDialogs/DeclSecurityControl.xaml | 61 + .../DnlibDialogs/DeclSecurityControl.xaml.cs | 26 + .../DnlibDialogs/DeclSecurityDlg.xaml | 51 + .../DnlibDialogs/DeclSecurityDlg.xaml.cs | 26 + .../DnlibDialogs/DeclSecurityOptions.cs | 55 + .../DnlibDialogs/DeclSecurityVM.cs | 140 + .../DnlibDialogs/DecompilerVM.cs | 29 + .../dnSpy.AsmEditor/DnlibDialogs/DlgUtils.cs | 112 + .../DnlibDialogs/EnumDataFieldVM.cs | 254 + .../DnlibDialogs/GenericParamControl.xaml | 94 + .../DnlibDialogs/GenericParamControl.xaml.cs | 32 + .../DnlibDialogs/GenericParamDlg.xaml | 51 + .../DnlibDialogs/GenericParamDlg.xaml.cs | 26 + .../DnlibDialogs/GenericParamOptions.cs | 58 + .../DnlibDialogs/GenericParamVM.cs | 170 + .../DnlibDialogs/GenericParamsControl.xaml | 25 + .../DnlibDialogs/GenericParamsControl.xaml.cs | 36 + .../DnlibDialogs/GenericParamsVM.cs | 43 + .../DnlibDialogs/ImplMapControl.xaml | 61 + .../DnlibDialogs/ImplMapControl.xaml.cs | 26 + .../dnSpy.AsmEditor/DnlibDialogs/ImplMapVM.cs | 165 + .../dnSpy.AsmEditor/DnlibDialogs/ListVM.cs | 138 + .../DnlibDialogs/ListVMControl.xaml | 76 + .../DnlibDialogs/ListVMControl.xaml.cs | 35 + .../DnlibDialogs/MarshalTypeControl.xaml | 121 + .../DnlibDialogs/MarshalTypeControl.xaml.cs | 26 + .../DnlibDialogs/MarshalTypeVM.cs | 532 + .../DnlibDialogs/MemberPickerDlg.xaml | 94 + .../DnlibDialogs/MemberPickerDlg.xaml.cs | 75 + .../DnlibDialogs/MemberPickerVM.cs | 380 + .../DnlibDialogs/MemberRefControl.xaml | 98 + .../DnlibDialogs/MemberRefControl.xaml.cs | 40 + .../DnlibDialogs/MemberRefDlg.xaml | 51 + .../DnlibDialogs/MemberRefDlg.xaml.cs | 26 + .../DnlibDialogs/MemberRefOptions.cs | 51 + .../DnlibDialogs/MemberRefVM.cs | 210 + .../DnlibDialogs/MethodDefVM.cs | 67 + .../DnlibDialogs/MethodDefsControl.xaml | 25 + .../DnlibDialogs/MethodDefsControl.xaml.cs | 36 + .../DnlibDialogs/MethodDefsVM.cs | 33 + .../DnlibDialogs/MethodOverrideOptions.cs | 37 + .../DnlibDialogs/MethodOverrideVM.cs | 71 + .../DnlibDialogs/MethodOverridesControl.xaml | 25 + .../MethodOverridesControl.xaml.cs | 36 + .../DnlibDialogs/MethodOverridesVM.cs | 34 + .../DnlibDialogs/MethodSigCreatorControl.xaml | 109 + .../MethodSigCreatorControl.xaml.cs | 36 + .../DnlibDialogs/MethodSigCreatorDlg.xaml | 60 + .../DnlibDialogs/MethodSigCreatorDlg.xaml.cs | 26 + .../DnlibDialogs/MethodSigCreatorOptions.cs | 55 + .../DnlibDialogs/MethodSigCreatorVM.cs | 239 + .../DnlibDialogs/MethodSpecControl.xaml | 66 + .../DnlibDialogs/MethodSpecControl.xaml.cs | 36 + .../DnlibDialogs/MethodSpecDlg.xaml | 51 + .../DnlibDialogs/MethodSpecDlg.xaml.cs | 26 + .../DnlibDialogs/MethodSpecOptions.cs | 48 + .../DnlibDialogs/MethodSpecVM.cs | 112 + .../DnlibDialogs/ModelUtils.cs | 134 + .../dnSpy.AsmEditor/DnlibDialogs/Null.cs | 32 + .../DnlibDialogs/ObjectListDataFieldVM.cs | 126 + .../DnlibDialogs/ParamDefControl.xaml | 83 + .../DnlibDialogs/ParamDefControl.xaml.cs | 32 + .../DnlibDialogs/ParamDefDlg.xaml | 51 + .../DnlibDialogs/ParamDefDlg.xaml.cs | 26 + .../DnlibDialogs/ParamDefOptions.cs | 57 + .../DnlibDialogs/ParamDefVM.cs | 206 + .../DnlibDialogs/ParamDefsControl.xaml | 25 + .../DnlibDialogs/ParamDefsControl.xaml.cs | 36 + .../DnlibDialogs/ParamDefsVM.cs | 43 + .../SecurityAttributeControl.xaml | 42 + .../SecurityAttributeControl.xaml.cs | 36 + .../DnlibDialogs/SecurityAttributeDlg.xaml | 53 + .../DnlibDialogs/SecurityAttributeDlg.xaml.cs | 26 + .../DnlibDialogs/SecurityAttributeVM.cs | 135 + .../SecurityAttributesControl.xaml | 25 + .../SecurityAttributesControl.xaml.cs | 36 + .../DnlibDialogs/SecurityAttributesVM.cs | 34 + .../TypeDefOrRefAndCAControl.xaml | 33 + .../TypeDefOrRefAndCAControl.xaml.cs | 26 + .../DnlibDialogs/TypeDefOrRefAndCADlg.xaml | 50 + .../DnlibDialogs/TypeDefOrRefAndCADlg.xaml.cs | 26 + .../DnlibDialogs/TypeDefOrRefAndCAOptions.cs | 60 + .../DnlibDialogs/TypeDefOrRefAndCAVM.cs | 82 + .../TypeDefOrRefAndCAsControl.xaml | 25 + .../TypeDefOrRefAndCAsControl.xaml.cs | 40 + .../DnlibDialogs/TypeDefOrRefAndCAsVM.cs | 47 + .../DnlibDialogs/TypeSigCreatorControl.xaml | 134 + .../TypeSigCreatorControl.xaml.cs | 39 + .../DnlibDialogs/TypeSigCreatorDlg.xaml | 50 + .../DnlibDialogs/TypeSigCreatorDlg.xaml.cs | 26 + .../DnlibDialogs/TypeSigCreatorOptions.cs | 70 + .../DnlibDialogs/TypeSigCreatorVM.cs | 328 + .../dnSpy.AsmEditor/DnlibDialogs/TypeSigVM.cs | 197 + .../dnSpy.AsmEditor/Event/EventDefCommands.cs | 452 + .../dnSpy.AsmEditor/Event/EventDefOptions.cs | 70 + .../Event/EventOptionsDlg.xaml | 128 + .../Event/EventOptionsDlg.xaml.cs | 36 + .../dnSpy.AsmEditor/Event/EventOptionsVM.cs | 226 + .../dnSpy.AsmEditor/ExtensionMethods.cs | 29 + .../dnSpy.AsmEditor/Field/FieldDefCommands.cs | 470 + .../dnSpy.AsmEditor/Field/FieldDefOptions.cs | 82 + .../Field/FieldOptionsDlg.xaml | 143 + .../Field/FieldOptionsDlg.xaml.cs | 26 + .../dnSpy.AsmEditor/Field/FieldOptionsVM.cs | 283 + .../dnSpy.AsmEditor/Hex/ClipboardUtils.cs | 84 + Extensions/dnSpy.AsmEditor/Hex/Commands.cs | 1355 ++ ...xAddressReferenceFileTabContentProvider.cs | 130 + .../Hex/HexBoxDocumentTabContent.cs | 267 + .../Hex/HexBufferFileBufferServiceListener.cs | 46 + .../dnSpy.AsmEditor/Hex/HexBufferService.cs | 204 + .../dnSpy.AsmEditor/Hex/HexBufferUndoRedo.cs | 101 + .../Hex/HexBufferWriterHelper.cs | 42 + Extensions/dnSpy.AsmEditor/Hex/HexTabSaver.cs | 60 + .../Hex/HexUndoableDocumentsProvider.cs | 62 + .../dnSpy.AsmEditor/Hex/HexViewUIState.cs | 62 + .../Hex/HexViewUIStateSerializer.cs | 87 + .../dnSpy.AsmEditor/Hex/InstructionUtils.cs | 92 + .../Hex/MDTableContextMenuCommands.cs | 423 + .../Hex/Nodes/HexDocumentTabContent.cs | 106 + .../Nodes/HexDocumentTreeNodeDataFinder.cs | 41 + .../dnSpy.AsmEditor/Hex/Nodes/HexNode.cs | 112 + .../Hex/Nodes/ImageCor20HeaderNode.cs | 52 + .../Hex/Nodes/ImageDosHeaderNode.cs | 46 + .../Hex/Nodes/ImageFileHeaderNode.cs | 46 + .../Hex/Nodes/ImageOptionalHeader32Node.cs | 47 + .../Hex/Nodes/ImageOptionalHeader64Node.cs | 47 + .../Hex/Nodes/ImageSectionHeaderNode.cs | 66 + .../Hex/Nodes/MetadataTableNode.cs | 165 + .../Hex/Nodes/MetadataTableRecordNode.cs | 196 + .../dnSpy.AsmEditor/Hex/Nodes/PENode.cs | 180 + .../Hex/Nodes/PETreeNodeDataProvider.cs | 95 + .../Hex/Nodes/StorageHeaderNode.cs | 47 + .../Hex/Nodes/StorageSignatureNode.cs | 47 + .../Hex/Nodes/StorageStreamNode.cs | 92 + .../Hex/Nodes/TablesStreamNode.cs | 79 + ...okenReferenceDocumentTabContentProvider.cs | 47 + .../Hex/Nodes/wpf.styles.templates.xaml | 4567 +++++++ ...NormalizedHexChangeCollectionExtensions.cs | 32 + .../Hex/PE/BufferToDocumentNodeService.cs | 65 + Extensions/dnSpy.AsmEditor/Hex/PE/HexField.cs | 639 + .../Hex/PE/HexFieldReference.cs | 35 + .../PE/HexFileStructureInfoProviderImpl.cs | 159 + .../Hex/PE/HexReferenceConverterImpl.cs | 47 + Extensions/dnSpy.AsmEditor/Hex/PE/HexVM.cs | 37 + .../Hex/PE/ImageCor20HeaderVM.cs | 90 + .../Hex/PE/ImageDosHeaderVM.cs | 132 + .../Hex/PE/ImageFileHeaderVM.cs | 128 + .../Hex/PE/ImageOptionalHeader32VM.cs | 82 + .../Hex/PE/ImageOptionalHeader64VM.cs | 79 + .../Hex/PE/ImageOptionalHeaderVM.cs | 192 + .../Hex/PE/ImageSectionHeaderVM.cs | 117 + .../Hex/PE/MetadataTableRecordVM.cs | 1165 ++ .../dnSpy.AsmEditor/Hex/PE/MetadataTableVM.cs | 710 ++ .../Hex/PE/PEStructureProvider.cs | 147 + .../dnSpy.AsmEditor/Hex/PE/StorageHeaderVM.cs | 48 + .../Hex/PE/StorageSignatureVM.cs | 57 + .../dnSpy.AsmEditor/Hex/PE/StorageStreamVM.cs | 52 + .../dnSpy.AsmEditor/Hex/PE/TablesStreamVM.cs | 241 + .../dnSpy.AsmEditor/Hex/PE/VirtualizedList.cs | 96 + Extensions/dnSpy.AsmEditor/Hex/TableSorter.cs | 219 + .../Method/MethodDefCommands.cs | 558 + .../Method/MethodDefOptions.cs | 90 + .../Method/MethodOptionsDlg.xaml | 175 + .../Method/MethodOptionsDlg.xaml.cs | 26 + .../dnSpy.AsmEditor/Method/MethodOptionsVM.cs | 391 + .../MethodBody/BodyCommandUtils.cs | 79 + .../dnSpy.AsmEditor/MethodBody/BodyUtils.cs | 671 + .../MethodBody/CilBodyOptions.cs | 80 + .../dnSpy.AsmEditor/MethodBody/CilBodyVM.cs | 824 ++ .../MethodBody/ComboBoxAttachedProps.cs | 31 + .../MethodBody/ContentTypeDefinitions.cs | 33 + .../MethodBody/ExceptionHandlerOptions.cs | 60 + .../MethodBody/ExceptionHandlerVM.cs | 175 + .../MethodBody/ExceptionHandlersListHelper.cs | 140 + .../MethodBody/FastClickButton.cs | 37 + .../MethodBody/IEditOperand.cs | 29 + .../MethodBody/InstructionOperandControl.cs | 211 + .../MethodBody/InstructionOperandVM.cs | 525 + .../MethodBody/InstructionOptions.cs | 48 + .../MethodBody/InstructionVM.cs | 241 + .../MethodBody/InstructionsListHelper.cs | 620 + .../MethodBody/LocalOptions.cs | 48 + .../dnSpy.AsmEditor/MethodBody/LocalVM.cs | 169 + .../MethodBody/LocalsListHelper.cs | 107 + .../MethodBody/MethodBodyCommands.cs | 207 + .../MethodBody/MethodBodyControl.xaml | 354 + .../MethodBody/MethodBodyControl.xaml.cs | 66 + .../MethodBody/MethodBodyDlg.xaml | 51 + .../MethodBody/MethodBodyDlg.xaml.cs | 26 + .../MethodBody/MethodBodyOptions.cs | 70 + .../MethodBody/MethodBodyType.cs | 26 + .../MethodBody/MethodBodyVM.cs | 124 + .../MethodBody/NativeMethodBodyOptions.cs | 39 + .../MethodBody/NativeMethodBodyVM.cs | 49 + .../MethodBody/SwitchInstructionVM.cs | 42 + .../MethodBody/SwitchOperandControl.xaml | 74 + .../MethodBody/SwitchOperandControl.xaml.cs | 41 + .../MethodBody/SwitchOperandDlg.xaml | 51 + .../MethodBody/SwitchOperandDlg.xaml.cs | 26 + .../MethodBody/SwitchOperandVM.cs | 73 + .../MethodBody/SwitchOperandsListHelper.cs | 51 + .../dnSpy.AsmEditor/Module/ClrVersion.cs | 52 + .../Module/ClrVersionValues.cs | 68 + .../dnSpy.AsmEditor/Module/ModuleCommands.cs | 779 ++ .../dnSpy.AsmEditor/Module/ModuleOptions.cs | 92 + .../Module/ModuleOptionsDlg.xaml | 286 + .../Module/ModuleOptionsDlg.xaml.cs | 36 + .../dnSpy.AsmEditor/Module/ModuleOptionsVM.cs | 571 + .../dnSpy.AsmEditor/Module/ModuleUtils.cs | 92 + .../Module/NetModuleOptions.cs | 29 + .../Module/NetModuleOptionsDlg.xaml | 72 + .../Module/NetModuleOptionsDlg.xaml.cs | 26 + .../Module/NetModuleOptionsVM.cs | 77 + .../Namespace/NamespaceCommands.cs | 517 + .../Namespace/NamespaceDlg.xaml | 61 + .../Namespace/NamespaceDlg.xaml.cs | 26 + .../dnSpy.AsmEditor/Namespace/NamespaceVM.cs | 48 + .../dnSpy.AsmEditor.Resources.Designer.cs | 6631 ++++++++++ .../dnSpy.AsmEditor.Resources.cs.resx | 2312 ++++ .../dnSpy.AsmEditor.Resources.de.resx | 2311 ++++ .../dnSpy.AsmEditor.Resources.es-ES.resx | 2308 ++++ .../dnSpy.AsmEditor.Resources.fa.resx | 2315 ++++ .../dnSpy.AsmEditor.Resources.fr.resx | 2309 ++++ .../dnSpy.AsmEditor.Resources.hu.resx | 2315 ++++ .../dnSpy.AsmEditor.Resources.it.resx | 2309 ++++ .../dnSpy.AsmEditor.Resources.pt-BR.resx | 2312 ++++ .../dnSpy.AsmEditor.Resources.pt-PT.resx | 2314 ++++ .../Properties/dnSpy.AsmEditor.Resources.resx | 2315 ++++ .../dnSpy.AsmEditor.Resources.ru.resx | 2309 ++++ .../dnSpy.AsmEditor.Resources.tr.resx | 2313 ++++ .../dnSpy.AsmEditor.Resources.uk.resx | 2309 ++++ .../dnSpy.AsmEditor.Resources.zh-CN.resx | 2311 ++++ .../Property/PropertyDefCommands.cs | 453 + .../Property/PropertyDefOptions.cs | 75 + .../Property/PropertyOptionsDlg.xaml | 110 + .../Property/PropertyOptionsDlg.xaml.cs | 26 + .../Property/PropertyOptionsVM.cs | 186 + .../Resources/ImageListDlg.xaml | 86 + .../Resources/ImageListDlg.xaml.cs | 26 + .../Resources/ImageListStreamerControl.xaml | 31 + .../ImageListStreamerControl.xaml.cs | 36 + .../Resources/ImageListStreamerVM.cs | 33 + .../dnSpy.AsmEditor/Resources/ImageListVM.cs | 107 + .../ImageResourceElementControl.xaml | 42 + .../ImageResourceElementControl.xaml.cs | 39 + .../Resources/ImageResourceElementDlg.xaml | 53 + .../Resources/ImageResourceElementDlg.xaml.cs | 26 + .../Resources/ImageResourceElementVM.cs | 100 + .../dnSpy.AsmEditor/Resources/ImageVM.cs | 38 + .../Resources/NodeAndResource.cs | 38 + .../Resources/NodeAndResourceElement.cs | 38 + .../Resources/ResourceCommands.cs | 2153 ++++ .../Resources/ResourceControl.xaml | 54 + .../Resources/ResourceControl.xaml.cs | 39 + .../Resources/ResourceDlg.xaml | 51 + .../Resources/ResourceDlg.xaml.cs | 26 + .../Resources/ResourceElementControl.xaml | 56 + .../Resources/ResourceElementControl.xaml.cs | 50 + .../Resources/ResourceElementDlg.xaml | 51 + .../Resources/ResourceElementDlg.xaml.cs | 26 + .../Resources/ResourceElementOptions.cs | 43 + .../Resources/ResourceElementVM.cs | 330 + .../Resources/ResourceOptions.cs | 83 + .../dnSpy.AsmEditor/Resources/ResourceVM.cs | 200 + .../dnSpy.AsmEditor/Resources/UserTypeVM.cs | 149 + .../SaveModule/CharacteristicsHelper.cs | 43 + .../SaveModule/DocumentSaver.cs | 151 + .../SaveModule/MmapDisabler.cs | 71 + .../dnSpy.AsmEditor/SaveModule/ModuleSaver.cs | 266 + .../dnSpy.AsmEditor/SaveModule/PathUtils.cs | 80 + .../SaveModule/SaveHexOptionsDlg.xaml | 64 + .../SaveModule/SaveHexOptionsDlg.xaml.cs | 33 + .../SaveModule/SaveHexOptionsVM.cs | 54 + .../SaveModule/SaveModuleCommand.cs | 140 + .../SaveModule/SaveModuleOptionsDlg.xaml | 474 + .../SaveModule/SaveModuleOptionsDlg.xaml.cs | 33 + .../SaveModule/SaveModuleOptionsVM.cs | 1135 ++ .../SaveModule/SaveModuleWindow.cs | 95 + .../SaveModule/SaveMultiModuleDlg.xaml | 178 + .../SaveModule/SaveMultiModuleDlg.xaml.cs | 39 + .../SaveModule/SaveMultiModuleVM.cs | 352 + .../SaveModule/SaveOptionsType.cs | 25 + .../SaveModule/SaveOptionsVM.cs | 75 + .../SaveModule/SaveSingleModuleDlg.xaml | 114 + .../SaveModule/SaveSingleModuleDlg.xaml.cs | 24 + Extensions/dnSpy.AsmEditor/TheExtension.cs | 83 + .../TextEditorResourceColorInitializer.cs | 79 + .../Themes/wpf.styles.templates.xaml | 785 ++ .../dnSpy.AsmEditor/Types/TypeDefCommands.cs | 616 + .../dnSpy.AsmEditor/Types/TypeDefOptions.cs | 91 + .../dnSpy.AsmEditor/Types/TypeOptionsDlg.xaml | 158 + .../Types/TypeOptionsDlg.xaml.cs | 26 + .../dnSpy.AsmEditor/Types/TypeOptionsVM.cs | 490 + .../dnSpy.AsmEditor/UndoRedo/Commands.cs | 66 + .../DsDocumentUndoableDocumentsProvider.cs | 113 + .../dnSpy.AsmEditor/UndoRedo/IUndoCommand.cs | 52 + .../dnSpy.AsmEditor/UndoRedo/IUndoObject.cs | 25 + .../UndoRedo/IUndoableDocumentsProvider.cs | 29 + .../UndoRedo/ToolbarCommands.cs | 41 + .../UndoRedo/UndoCommandService.cs | 428 + .../UndoRedo/UndoCommandServiceEventArgs.cs | 42 + .../dnSpy.AsmEditor/UndoRedo/UndoObject.cs | 33 + .../UndoRedo/UndoRedoDocumentListListener.cs | 72 + .../UndoRedo/UndoRedoMenuCommands.cs | 37 + .../UndoRedo/UndoRoutedCommands.cs | 36 + .../dnSpy.AsmEditor/Utilities/UIUtils.cs | 67 + .../ViewHelpers/CreateConstantType.cs | 84 + .../ViewHelpers/CreateMethodPropertySig.cs | 49 + .../ViewHelpers/CreateTypeSigArray.cs | 47 + .../ViewHelpers/DnlibTypePicker.cs | 97 + .../ViewHelpers/EditCustomAttribute.cs | 45 + .../ViewHelpers/EditDeclSecurity.cs | 45 + .../ViewHelpers/EditGenericParam.cs | 45 + .../dnSpy.AsmEditor/ViewHelpers/EditImage.cs | 66 + .../ViewHelpers/EditMemberRef.cs | 45 + .../ViewHelpers/EditMethodDef.cs | 49 + .../ViewHelpers/EditMethodOverride.cs | 46 + .../ViewHelpers/EditMethodSpec.cs | 45 + .../ViewHelpers/EditParamDef.cs | 45 + .../ViewHelpers/EditSecurityAttribute.cs | 45 + .../ViewHelpers/EditTypeDefOrRefAndCA.cs | 45 + .../ViewHelpers/ICreateConstantType.cs | 42 + .../ViewHelpers/ICreateMethodPropertySig.cs | 33 + .../ViewHelpers/ICreateTypeSigArray.cs | 35 + .../ViewHelpers/IDnlibTypePicker.cs | 36 + .../dnSpy.AsmEditor/ViewHelpers/IEdit.cs | 30 + .../ViewHelpers/IOpenAssembly.cs | 36 + .../dnSpy.AsmEditor/ViewHelpers/IOpenFile.cs | 29 + .../ViewHelpers/IOpenPublicKeyFile.cs | 31 + .../ViewHelpers/ISelectItems.cs | 30 + .../ViewHelpers/IShowWarningMessage.cs | 32 + .../ViewHelpers/ITypeSigCreator.cs | 34 + .../ViewHelpers/OpenAssembly.cs | 55 + .../dnSpy.AsmEditor/ViewHelpers/OpenFile.cs | 58 + .../ViewHelpers/OpenPublicKeyFile.cs | 65 + .../ViewHelpers/ShowWarningMessage.cs | 41 + .../ViewHelpers/TypeSigCreator.cs | 49 + .../dnSpy.AsmEditor/dnSpy.AsmEditor.csproj | 49 + .../dnSpy.BamlDecompiler/Annotations.cs | 7 + .../dnSpy.BamlDecompiler/Baml/BamlContext.cs | 98 + .../dnSpy.BamlDecompiler/Baml/BamlDocument.cs | 39 + .../dnSpy.BamlDecompiler/Baml/BamlNode.cs | 164 + .../dnSpy.BamlDecompiler/Baml/BamlReader.cs | 259 + .../dnSpy.BamlDecompiler/Baml/BamlRecords.cs | 992 ++ .../dnSpy.BamlDecompiler/Baml/BamlWriter.cs | 65 + .../dnSpy.BamlDecompiler/Baml/KnownMembers.cs | 297 + .../dnSpy.BamlDecompiler/Baml/KnownThings.cs | 94 + .../Baml/KnownThings.g.cs | 1319 ++ .../Baml/KnownThings.gen.cs | 278 + .../dnSpy.BamlDecompiler/Baml/KnownTypes.cs | 788 ++ .../dnSpy.BamlDecompiler/BamlDecompiler.cs | 41 + .../dnSpy.BamlDecompiler/BamlDisassembler.cs | 579 + .../dnSpy.BamlDecompiler/BamlElement.cs | 60 + .../BamlResourceElementNode.cs | 128 + .../BamlResourceNodeProvider.cs | 62 + .../dnSpy.BamlDecompiler/BamlSettings.cs | 153 + .../dnSpy.BamlDecompiler/BamlSettings.xaml | 14 + .../BamlToolTipProvider.cs | 44 + .../ContentTypeDefinitions.cs | 33 + .../Blocks/ConstructorParametersHandler.cs | 39 + .../Handlers/Blocks/DocumentHandler.cs | 38 + .../Handlers/Blocks/ElementHandler.cs | 56 + .../Handlers/Blocks/KeyElementStartHandler.cs | 49 + .../Handlers/Blocks/PropertyArrayHandler.cs | 47 + .../Handlers/Blocks/PropertyComplexHandler.cs | 47 + .../Blocks/PropertyDictionaryHandler.cs | 47 + .../Handlers/Blocks/PropertyListHandler.cs | 47 + .../Handlers/Records/AssemblyInfoHandler.cs | 31 + .../Handlers/Records/AttributeInfoHandler.cs | 31 + .../Handlers/Records/ConnectionIdHandler.cs | 37 + .../ConstructorParameterTypeHandler.cs | 48 + .../Records/ContentPropertyHandler.cs | 36 + .../Handlers/Records/DefAttributeHandler.cs | 39 + .../Records/DefAttributeKeyStringHandler.cs | 49 + .../Records/DefAttributeKeyTypeHandler.cs | 56 + .../Records/DeferableContentStartHandler.cs | 38 + .../Records/LineNumberAndPositionHandler.cs | 31 + .../Handlers/Records/LinePositionHandler.cs | 31 + .../Handlers/Records/LiteralContentHandler.cs | 42 + .../Records/OptimizedStaticResourceHandler.cs | 106 + .../Handlers/Records/PIMappingHandler.cs | 31 + .../PresentationOptionsAttributeHandler.cs | 40 + .../Handlers/Records/PropertyCustomHandler.cs | 160 + .../Handlers/Records/PropertyHandler.cs | 44 + .../Records/PropertyTypeReferenceHandler.cs | 56 + .../Records/PropertyWithConverterHandler.cs | 29 + .../Records/PropertyWithExtensionHandler.cs | 101 + .../PropertyWithStaticResourceIdHandler.cs | 65 + .../Handlers/Records/TextHandler.cs | 49 + .../Records/TextWithConverterHandler.cs | 29 + .../Handlers/Records/TypeInfoHandler.cs | 37 + .../Handlers/Records/XmlnsPropertyHandler.cs | 70 + Extensions/dnSpy.BamlDecompiler/IHandlers.cs | 69 + .../dnSpy.BamlDecompiler/IRewritePass.cs | 29 + .../dnSpy.BamlDecompiler/MenuCommands.cs | 52 + ...dnSpy.BamlDecompiler.Resources.Designer.cs | 153 + .../dnSpy.BamlDecompiler.Resources.cs.resx | 150 + .../dnSpy.BamlDecompiler.Resources.de.resx | 150 + .../dnSpy.BamlDecompiler.Resources.es-ES.resx | 150 + .../dnSpy.BamlDecompiler.Resources.fa.resx | 150 + .../dnSpy.BamlDecompiler.Resources.fr.resx | 150 + .../dnSpy.BamlDecompiler.Resources.hu.resx | 150 + .../dnSpy.BamlDecompiler.Resources.it.resx | 150 + .../dnSpy.BamlDecompiler.Resources.pt-BR.resx | 150 + .../dnSpy.BamlDecompiler.Resources.pt-PT.resx | 150 + .../dnSpy.BamlDecompiler.Resources.resx | 150 + .../dnSpy.BamlDecompiler.Resources.ru.resx | 150 + .../dnSpy.BamlDecompiler.Resources.tr.resx | 150 + .../dnSpy.BamlDecompiler.Resources.uk.resx | 150 + .../dnSpy.BamlDecompiler.Resources.zh-CN.resx | 150 + .../dnSpy.BamlDecompiler/RecursionCounter.cs | 42 + .../Rewrite/AttributeRewritePass.cs | 72 + .../Rewrite/ConnectionIdRewritePass.cs | 301 + .../Rewrite/DocumentRewritePass.cs | 44 + .../Rewrite/MarkupExtensionRewritePass.cs | 175 + .../Rewrite/XClassRewritePass.cs | 62 + .../dnSpy.BamlDecompiler/TheExtension.cs | 41 + .../dnSpy.BamlDecompiler/Xaml/NamespaceMap.cs | 45 + .../Xaml/XamlExtension.cs | 83 + .../Xaml/XamlPathDeserializer.cs | 178 + .../dnSpy.BamlDecompiler/Xaml/XamlProperty.cs | 94 + .../Xaml/XamlResourceKey.cs | 98 + .../dnSpy.BamlDecompiler/Xaml/XamlType.cs | 103 + .../dnSpy.BamlDecompiler/Xaml/XamlUtils.cs | 77 + .../dnSpy.BamlDecompiler/XamlContext.cs | 209 + .../dnSpy.BamlDecompiler/XamlDecompiler.cs | 62 + .../dnSpy.BamlDecompiler/XamlOutputCreator.cs | 55 + .../XamlOutputOptionsProvider.cs | 42 + .../dnSpy.BamlDecompiler/XmlnsDictionary.cs | 125 + .../dnSpy.BamlDecompiler.csproj | 49 + .../AppHostInfoGenerator.csproj | 33 + .../AppHostInfoGenerator/NRT.cs | 17 + .../AppHostInfoGenerator/Program.cs | 656 + .../AntiAntiDebug/CorDebugUtils.cs | 39 + .../AntiAntiDebug/ECallManager.cs | 369 + .../AntiAntiDebug/IsDebuggerPresentHook.cs | 90 + .../IsDebuggerPresentPatcherX86.cs | 136 + .../AntiAntiDebug/ManagedDebuggerHook.cs | 64 + .../ManagedDebuggerPatcherX86.cs | 85 + .../AntiAntiDebug/PatcherX86.cs | 51 + ...BreakpointLocationFormatterProviderImpl.cs | 48 + .../DbgBreakpointGlyphFormatterImpl.cs | 100 + ...ointGlyphTextMarkerLocationProviderImpl.cs | 49 + .../CallStack/DbgEngineStackWalkerImpl.cs | 173 + .../CallStack/ILDbgEngineStackFrame.cs | 168 + .../CallStack/NullDbgEngineStackWalker.cs | 29 + .../CallStack/StackFrameData.cs | 27 + ...GlyphTextMarkerLocationInfoProviderImpl.cs | 52 + .../DbgStackFrameTextViewMarkerImpl.cs | 122 + .../Code/BreakpointFormatterService.cs | 67 + .../DbgBreakpointLocationFormatterImpl.cs | 157 + .../DbgDotNetNativeCodeLocationFactory.cs | 49 + .../Code/DbgDotNetNativeCodeLocationImpl.cs | 74 + .../Code/ReferenceConverterImpl.cs | 55 + .../DAC/ClrDac.cs | 27 + .../DAC/ClrDacImpl.cs | 141 + .../DAC/ClrDacProvider.cs | 86 + .../DAC/ClrDacThreadInfo.cs | 78 + .../DAC/IClrDacDebugger.cs | 28 + .../DAC/NullClrDac.cs | 32 + .../AttachToProcess/DebuggableProcesses.cs | 103 + .../DotNetAttachProgramOptionsProvider.cs | 79 + ...etFrameworkAttachProgramOptionsProvider.cs | 85 + .../DebugProgram/BreakProcessKindsUtils.cs | 32 + .../DotNetCommonStartDebuggingOptionsPage.cs | 172 + ...otNetFrameworkStartDebuggingOptionsPage.cs | 108 + .../DotNetGenericDebugEngineGuidProvider.cs | 52 + .../DotNetStartDebuggingOptionsPage.cs | 174 + .../StartDebuggingOptionsPageProviderImpl.cs | 42 + .../Impl/AppHostInfo.cs | 60 + .../Impl/AppHostInfoData.cs | 86 + .../Impl/AppHostInfoData.g.cs | 5186 ++++++++ .../Impl/AppHostUtils.cs | 248 + .../Attach/CorDebugAttachToProgramOptions.cs | 44 + .../Attach/DotNetAttachToProgramOptions.cs | 59 + .../DotNetFrameworkAttachToProgramOptions.cs | 52 + .../Impl/CorDebugTypeCreator.cs | 123 + .../Impl/DbgCorDebugInternalAppDomainImpl.cs | 42 + .../Impl/DbgCorDebugInternalModuleImpl.cs | 52 + .../Impl/DbgEngineImpl.Breakpoints.cs | 225 + .../Impl/DbgEngineImpl.Evaluation.cs | 796 ++ .../Impl/DbgEngineImpl.ModuleDef.cs | 54 + .../Impl/DbgEngineImpl.Threads.cs | 483 + .../Impl/DbgEngineImpl.cs | 974 ++ .../Impl/DbgEngineImplDependencies.cs | 51 + .../Impl/DbgEngineProviderImpl.cs | 54 + .../DbgModuleMemoryRefreshedNotifierImpl.cs | 40 + .../Impl/DebugMessageDispatcher.cs | 126 + .../Impl/DebugOptionsProviderImpl.cs | 93 + .../Impl/DebuggerThread.cs | 108 + .../Impl/DmdDispatcherImpl.cs | 37 + .../Impl/DmdDynamicModuleHelperImpl.cs | 125 + .../Impl/DnDebuggerObjectHolder.cs | 76 + .../Impl/DnModuleIdExtensions.cs | 28 + .../Impl/DnThreadUtils.cs | 60 + .../Impl/DnlibAssemblyResolverImpl.cs | 65 + .../Impl/DotNetDbgEngineImpl.cs | 95 + .../Impl/DotNetDbgProcessStarter.cs | 56 + .../Impl/DotNetFrameworkDbgEngineImpl.cs | 68 + .../Impl/Evaluation/CordbgErrorHelper.cs | 43 + .../Impl/Evaluation/CreateCorValueResult.cs | 33 + ...gCorDebugInternalRuntimeImpl.NativeCode.cs | 551 + .../DbgCorDebugInternalRuntimeImpl.cs | 1388 +++ .../Impl/Evaluation/DbgCorValueHolder.cs | 77 + .../DbgDotNetDispatcherExtensions.cs | 43 + .../Evaluation/DbgDotNetDispatcherImpl.cs | 38 + .../DbgDotNetEngineObjectIdFactoryImpl.cs | 41 + .../Impl/Evaluation/DbgDotNetObjectIdImpl.cs | 44 + .../Evaluation/DbgDotNetRawValueFactory.cs | 293 + .../Impl/Evaluation/DbgDotNetValueImpl.cs | 421 + .../Impl/Evaluation/DispatcherConstants.cs | 24 + .../Impl/Evaluation/DmdEvaluatorImpl.cs | 93 + .../Impl/Evaluation/EvalArgumentConverter.cs | 473 + .../Impl/Evaluation/Hooks/ClassHook.cs | 28 + .../Impl/Evaluation/Hooks/ClassHookInfo.cs | 33 + .../Evaluation/Hooks/ClassHookProvider.cs | 29 + .../Hooks/CorDebugValueConverterImpl.cs | 126 + .../Impl/Evaluation/Hooks/ICorDebugRuntime.cs | 30 + .../Impl/Evaluation/Hooks/System_String.cs | 100 + .../Impl/Evaluation/NullableTypeUtils.cs | 56 + .../Impl/Evaluation/SyntheticValues.cs | 168 + .../Impl/ExceptionUtils.cs | 28 + .../Impl/ExeUtils.cs | 293 + .../Impl/ModuleCreator.cs | 248 + .../Impl/ModuleIdExtensions.cs | 28 + .../Impl/PathUtils.cs | 35 + .../Impl/ReflectionTypeCreator.cs | 161 + .../Impl/ThreadProperties.cs | 63 + .../Metadata/DbgAssemblyInfoProviderImpl.cs | 41 + .../Metadata/DbgDynamicModuleProviderImpl.cs | 244 + .../Metadata/DbgModuleIdProviderImpl.cs | 31 + .../Metadata/LastValidRids.cs | 41 + .../Native/NativeMethods.cs | 44 + ...gger.DotNet.CorDebug.Resources.Designer.cs | 530 + ...Debugger.DotNet.CorDebug.Resources.cs.resx | 279 + ...Debugger.DotNet.CorDebug.Resources.de.resx | 280 + ...ugger.DotNet.CorDebug.Resources.es-ES.resx | 276 + ...Debugger.DotNet.CorDebug.Resources.fa.resx | 280 + ...Debugger.DotNet.CorDebug.Resources.fr.resx | 273 + ...Debugger.DotNet.CorDebug.Resources.hu.resx | 280 + ...Debugger.DotNet.CorDebug.Resources.it.resx | 278 + ...ugger.DotNet.CorDebug.Resources.pt-BR.resx | 280 + ...ugger.DotNet.CorDebug.Resources.pt-PT.resx | 280 + ...py.Debugger.DotNet.CorDebug.Resources.resx | 280 + ...Debugger.DotNet.CorDebug.Resources.ru.resx | 280 + ...Debugger.DotNet.CorDebug.Resources.tr.resx | 280 + ...Debugger.DotNet.CorDebug.Resources.uk.resx | 280 + ...ugger.DotNet.CorDebug.Resources.zh-CN.resx | 280 + .../Steppers/DbgDotNetEngineStepperImpl.cs | 470 + .../DbgDotNetStepperBreakpointImpl.cs | 57 + .../TheExtension.cs | 37 + .../Themes/wpf.styles.templates.xaml | 96 + .../UI/UIDispatcher.cs | 40 + .../Utilities/DotNetAssemblyUtilities.cs | 55 + .../Utilities/DotNetHelpers.cs | 170 + .../PortableExecutableFileHelpers.cs | 105 + .../dnSpy.Debugger.DotNet.CorDebug.csproj | 70 + .../dndbg/COM/CorDebug.cs | 2032 +++ .../dndbg/COM/MetaData.cs | 319 + .../dndbg/COM/MetaHost.cs | 86 + .../dndbg/DotNet/CorAssemblyDef.cs | 56 + .../dndbg/DotNet/CorAssemblyRef.cs | 54 + .../dndbg/DotNet/CorDeclSecurity.cs | 67 + .../dndbg/DotNet/CorEventDef.cs | 93 + .../dndbg/DotNet/CorExportedType.cs | 59 + .../dndbg/DotNet/CorFieldDef.cs | 152 + .../dndbg/DotNet/CorFileDef.cs | 51 + .../dndbg/DotNet/CorGenericParam.cs | 113 + .../dndbg/DotNet/CorGenericParamConstraint.cs | 48 + .../dndbg/DotNet/CorInterfaceImpl.cs | 47 + .../dndbg/DotNet/CorManifestResource.cs | 51 + .../dndbg/DotNet/CorMemberRef.cs | 72 + .../dndbg/DotNet/CorMethodDef.cs | 213 + .../dndbg/DotNet/CorMethodSpec.cs | 51 + .../dndbg/DotNet/CorModuleDef.cs | 1280 ++ .../dndbg/DotNet/CorModuleRef.cs | 52 + .../dndbg/DotNet/CorParamDef.cs | 103 + .../dndbg/DotNet/CorPropertyDef.cs | 109 + .../dndbg/DotNet/CorStandAloneSig.cs | 50 + .../dndbg/DotNet/CorTypeDef.cs | 415 + .../dndbg/DotNet/CorTypeRef.cs | 65 + .../dndbg/DotNet/CorTypeSpec.cs | 52 + .../dndbg/DotNet/ICorMDTokenProvider.cs | 40 + .../dndbg/DotNet/ICorModuleDefHelper.cs | 88 + .../dndbg/DotNet/IProcessReader.cs | 36 + .../dndbg/DotNet/ProcessBinaryReader.cs | 200 + .../dndbg/DotNet/TypeUpdatedEventArgs.cs | 49 + .../dndbg/DotNet/Utils.cs | 59 + .../dndbg/Engine/AttachProcessOptions.cs | 84 + .../dndbg/Engine/BreakProcessHelper.cs | 103 + .../dndbg/Engine/BreakProcessKind.cs | 25 + .../dndbg/Engine/BreakpointList.cs | 52 + .../dndbg/Engine/COMObject.cs | 37 + .../dndbg/Engine/CorAppDomain.cs | 101 + .../dndbg/Engine/CorAssembly.cs | 112 + .../dndbg/Engine/CorChain.cs | 114 + .../dndbg/Engine/CorClass.cs | 56 + .../dndbg/Engine/CorCode.cs | 222 + .../dndbg/Engine/CorDebugExtensions.cs | 31 + .../dndbg/Engine/CorDebugManagedCallback.cs | 148 + .../dndbg/Engine/CorEval.cs | 136 + .../dndbg/Engine/CorFrame.cs | 257 + .../dndbg/Engine/CorFunction.cs | 130 + .../dndbg/Engine/CorFunctionBreakpoint.cs | 57 + .../dndbg/Engine/CorMDA.cs | 86 + .../dndbg/Engine/CorModule.cs | 200 + .../dndbg/Engine/CorModuleDefHelper.cs | 214 + .../dndbg/Engine/CorProcess.cs | 205 + .../dndbg/Engine/CorProcessReader.cs | 38 + .../dndbg/Engine/CorStepper.cs | 84 + .../dndbg/Engine/CorThread.cs | 165 + .../dndbg/Engine/CorType.cs | 92 + .../dndbg/Engine/CorValue.cs | 350 + .../dndbg/Engine/CordbgErrors.cs | 47 + .../dndbg/Engine/CoreCLRHelper.cs | 299 + .../dndbg/Engine/DebugCallbackEventArgs.cs | 685 + .../dndbg/Engine/DebugEventBreakpointList.cs | 30 + .../dndbg/Engine/DebugOptions.cs | 61 + .../dndbg/Engine/DebugProcessOptions.cs | 153 + .../dndbg/Engine/DebuggeeVersionDetector.cs | 65 + .../dndbg/Engine/DebuggerCollection.cs | 82 + .../dndbg/Engine/DebuggerEventArgs.cs | 100 + .../dndbg/Engine/DebuggerPauseState.cs | 104 + .../dndbg/Engine/DebuggerProcessState.cs | 28 + .../dndbg/Engine/DebuggerState.cs | 111 + .../dndbg/Engine/DnAnyDebugEventBreakpoint.cs | 41 + .../dndbg/Engine/DnAppDomain.cs | 109 + .../dndbg/Engine/DnAssembly.cs | 137 + .../dndbg/Engine/DnBreakpoint.cs | 45 + .../dndbg/Engine/DnCodeBreakpoint.cs | 140 + .../dndbg/Engine/DnDebugEventBreakpoint.cs | 92 + .../dndbg/Engine/DnDebugger.cs | 1752 +++ .../dndbg/Engine/DnEval.cs | 342 + .../dndbg/Engine/DnILCodeBreakpoint.cs | 44 + .../dndbg/Engine/DnModule.cs | 97 + .../dndbg/Engine/DnModuleId.cs | 204 + .../dndbg/Engine/DnNativeCodeBreakpoint.cs | 47 + .../dndbg/Engine/DnProcess.cs | 188 + .../dndbg/Engine/DnThread.cs | 74 + .../dndbg/Engine/IDebugMessageDispatcher.cs | 46 + .../dndbg/Engine/ILFrameIP.cs | 51 + .../dndbg/Engine/MDAPI.cs | 1687 +++ .../dndbg/Engine/NativeMethods.cs | 67 + .../dndbg/Engine/ProcessCreationFlags.cs | 63 + .../dndbg/Engine/ProcessDataStream.cs | 91 + .../dndbg/Engine/StartDebuggerException.cs | 31 + .../dndbg/Engine/StepRange.cs | 40 + .../Engine/Win32EnvironmentStringBuilder.cs | 39 + .../DebuggerRuntime.cs | 236 + .../dnSpy.Debugger.DotNet.Interpreter/ILVM.cs | 48 + .../ILVMFactory.cs | 33 + .../ILValue.cs | 1078 ++ .../Impl/DebuggerILInterpreter.cs | 4839 +++++++ .../Impl/ILVMImpl.cs | 57 + .../Impl/OpCodes.cs | 259 + .../InterpreterException.cs | 111 + .../InterpreterMessageException.cs | 49 + .../InterpreterThrownExceptionException.cs | 38 + .../dnSpy.Debugger.DotNet.Interpreter/NRT.cs | 9 + .../NRT_Helpers.cs | 31 + .../Tests/FakeDebuggerRuntime.cs | 545 + .../Tests/InterpreterTest.cs | 3872 ++++++ .../Tests/dbgintrptest.il | 10382 ++++++++++++++++ .../dnSpy.Debugger.DotNet.Interpreter.csproj | 26 + .../AssemblyHasher.cs | 98 + .../CustomAttributesHelper.cs | 651 + .../DmdAppDomain.cs | 771 ++ .../DmdAssembly.cs | 384 + .../DmdAssemblyContentType.cs | 35 + .../DmdAssemblyHashAlgorithm.cs | 34 + .../DmdAssemblyName.cs | 197 + .../DmdAssemblyNameFlags.cs | 50 + .../DmdAssemblyNameFormatter.cs | 79 + .../DmdBindingFlags.cs | 52 + .../DmdCallingConventions.cs | 36 + .../DmdConstructorInfo.cs | 122 + .../DmdCustomAttributeData.cs | 280 + .../DmdCustomModifier.cs | 83 + .../DmdCustomModifierUtilities.cs | 46 + .../DmdDataStream.cs | 155 + .../DmdDispatcher.cs | 56 + .../DmdDynamicModuleHelper.cs | 61 + .../DmdEvaluator.cs | 62 + .../DmdEventAttributes.cs | 33 + .../DmdEventInfo.cs | 200 + .../DmdFieldAttributes.cs | 49 + .../DmdFieldInfo.cs | 179 + .../DmdGenericParameterAttributes.cs | 39 + .../DmdGetAccessorOptions.cs | 40 + .../DmdImageFileMachine.cs | 58 + .../DmdImplMap.cs | 59 + .../DmdLazyMetadataBytes.cs | 154 + .../DmdMarshalType.cs | 95 + .../DmdMemberFormatter.cs | 601 + .../DmdMemberInfo.cs | 205 + .../DmdMemberInfoEqualityComparer.cs | 104 + .../DmdMemberTypes.cs | 40 + .../DmdMethodAttributes.cs | 54 + .../DmdMethodBase.cs | 291 + .../DmdMethodBody.cs | 217 + .../DmdMethodImplAttributes.cs | 48 + .../DmdMethodInfo.cs | 226 + .../DmdMethodSignature.cs | 141 + .../DmdModule.cs | 729 ++ .../DmdObject.cs | 114 + .../DmdParameterAttributes.cs | 39 + .../DmdParameterInfo.cs | 198 + .../DmdPortableExecutableKinds.cs | 37 + .../DmdProcessorArchitecture.cs | 34 + .../DmdPropertyAttributes.cs | 34 + .../DmdPropertyInfo.cs | 287 + .../DmdReadOnlyAssemblyName.cs | 185 + .../DmdRuntime.cs | 66 + .../DmdRuntimeFactory.cs | 40 + .../DmdSigComparer.cs | 759 ++ .../DmdSignatureCallingConvention.cs | 47 + .../DmdType.CanCastTo.cs | 678 + .../dnSpy.Debugger.DotNet.Metadata/DmdType.cs | 1438 +++ .../DmdTypeAttributes.cs | 64 + .../DmdTypeName.cs | 153 + .../DmdTypeScope.cs | 125 + .../DmdTypeSignatureKind.cs | 70 + .../DmdWellKnownType.cs | 348 + .../DmdWellKnownTypeUtils.cs | 379 + .../HexUtils.cs | 51 + .../IDmdAssemblyName.cs | 96 + .../IDmdCustomAttributeProvider.cs | 87 + .../IDmdSecurityAttributeProvider.cs | 38 + .../Impl/AccessorUtils.cs | 34 + .../Impl/AssemblyNameEqualityComparer.cs | 107 + .../Impl/COMD/DmdComMetadataReader.cs | 1204 ++ .../Impl/COMD/DmdConstructorDefCOMD.cs | 60 + .../Impl/COMD/DmdEventDefCOMD.cs | 80 + .../Impl/COMD/DmdExportedTypeCOMD.cs | 76 + .../Impl/COMD/DmdFieldDefCOMD.cs | 55 + .../Impl/COMD/DmdGenericParameterTypeCOMD.cs | 77 + .../Impl/COMD/DmdMethodDefCOMD.cs | 73 + .../Impl/COMD/DmdMethodRefCOMD.cs | 40 + .../Impl/COMD/DmdParameterDefCOMD.cs | 48 + .../Impl/COMD/DmdPointerDataStream.cs | 103 + .../Impl/COMD/DmdPropertyDefCOMD.cs | 80 + .../Impl/COMD/DmdTypeDefCOMD.cs | 197 + .../Impl/COMD/DmdTypeRefCOMD.cs | 77 + .../Impl/COMD/LazyList.cs | 94 + .../Impl/COMD/MDAPI.cs | 1367 ++ .../Impl/COMD/MetaData.cs | 200 + .../Impl/DmdAppDomainImpl.cs | 1153 ++ .../Impl/DmdAssemblyImpl.cs | 296 + .../Impl/DmdByRefType.cs | 75 + .../Impl/DmdConstructorDef.cs | 130 + .../Impl/DmdConstructorInfoBase.cs | 42 + .../Impl/DmdConstructorRef.cs | 88 + .../Impl/DmdCreatedConstructorDef.cs | 53 + .../Impl/DmdCreatedGenericParameterType.cs | 41 + .../Impl/DmdCreatedMethodDef.cs | 54 + .../Impl/DmdCreatedParameterDef.cs | 31 + .../Impl/DmdCreatedParameterInfo.cs | 44 + .../Impl/DmdCustomAttributeReader.cs | 494 + .../Impl/DmdDeclSecurityReader.cs | 135 + .../Impl/DmdEventDef.cs | 130 + .../Impl/DmdFieldDef.cs | 54 + .../Impl/DmdFieldInfoBase.cs | 31 + .../Impl/DmdFieldRef.cs | 79 + .../Impl/DmdFunctionPointerType.cs | 76 + .../Impl/DmdGenericInstanceType.cs | 127 + .../Impl/DmdGenericInstanceTypeRef.cs | 89 + .../Impl/DmdGenericParameterType.cs | 121 + .../Impl/DmdGenericParameterTypeImpl.cs | 44 + .../Impl/DmdLazyMetadataReader.cs | 88 + .../Impl/DmdMDArrayType.cs | 135 + .../Impl/DmdMarshalBlobReader.cs | 110 + .../Impl/DmdMemberInfoComparer.cs | 189 + .../Impl/DmdMetadataReader.cs | 55 + .../Impl/DmdMetadataReaderBase.cs | 278 + .../Impl/DmdMethodBodyImpl.cs | 49 + .../Impl/DmdMethodBodyReader.cs | 176 + .../Impl/DmdMethodDef.cs | 171 + .../Impl/DmdMethodInfoBase.cs | 49 + .../Impl/DmdMethodRef.cs | 92 + .../Impl/DmdMethodSpec.cs | 98 + .../Impl/DmdMethodSpecRef.cs | 79 + .../Impl/DmdModuleImpl.cs | 140 + .../Impl/DmdNullGlobalType.cs | 50 + .../Impl/DmdNullMetadataReader.cs | 73 + .../Impl/DmdParameterDef.cs | 86 + .../Impl/DmdParameterInfoBase.cs | 26 + .../Impl/DmdParsedTypeRef.cs | 46 + .../Impl/DmdPointerType.cs | 75 + .../Impl/DmdPropertyDef.cs | 164 + .../Impl/DmdPropertyParameter.cs | 43 + .../Impl/DmdRuntimeImpl.cs | 99 + .../Impl/DmdSZArrayType.cs | 97 + .../Impl/DmdSignatureReader.cs | 396 + .../Impl/DmdTypeBase.cs | 1249 ++ .../Impl/DmdTypeDef.cs | 240 + .../Impl/DmdTypeNameParser.cs | 646 + .../Impl/DmdTypeRef.cs | 109 + .../Impl/DmdTypeUtilities.cs | 97 + .../Impl/MD/DmdConstructorDefMD.cs | 56 + .../Impl/MD/DmdDataStreamImpl.cs | 40 + .../Impl/MD/DmdEcma335MetadataReader.cs | 700 ++ .../Impl/MD/DmdEventDefMD.cs | 88 + .../Impl/MD/DmdExportedTypeMD.cs | 73 + .../Impl/MD/DmdFieldDefMD.cs | 58 + .../Impl/MD/DmdGenericParameterTypeMD.cs | 78 + .../Impl/MD/DmdMethodDefMD.cs | 75 + .../Impl/MD/DmdMethodRefMD.cs | 39 + .../Impl/MD/DmdParameterDefMD.cs | 43 + .../Impl/MD/DmdPropertyDefMD.cs | 82 + .../Impl/MD/DmdTypeDefMD.cs | 170 + .../Impl/MD/DmdTypeRefMD.cs | 75 + .../Impl/MD/LazyList.cs | 122 + .../Impl/MD/MetadataConstantUtilities.cs | 98 + .../Impl/ReflectionTests.cs | 1335 ++ .../Impl/WellKnownMemberResolver.cs | 83 + .../ListCache.cs | 32 + .../MemberNotFoundException.cs | 94 + .../dnSpy.Debugger.DotNet.Metadata/NRT.cs | 22 + .../NRT_Helpers.cs | 31 + .../ObjectCache.cs | 41 + .../ObjectPools.cs | 96 + .../ReadOnlyCollectionHelpers.cs | 35 + .../ResolveException.cs | 85 + .../TIAHelper.cs | 206 + .../dnSpy.Debugger.DotNet.Metadata.csproj | 26 + .../AntiAntiDebug/DisableAntiAntiDebugCode.cs | 52 + .../CallStack/DbgEngineStackWalkerImpl.cs | 114 + .../CallStack/ILDbgEngineStackFrame.cs | 157 + .../CallStack/NullDbgEngineStackWalker.cs | 29 + .../CallStack/StackFrameData.cs | 27 + .../Dialogs/AttachToProcess/ProcessUtils.cs | 52 + .../UnityAttachProgramOptionsImpl.cs | 53 + .../AttachToProcess/UnityDataReceiver.cs | 139 + ...UnityEditorAttachProgramOptionsProvider.cs | 50 + ...UnityPlayerAttachProgramOptionsProvider.cs | 160 + .../Dialogs/DebugMenuCommands.cs | 73 + .../DebugProgram/BreakProcessKindsUtils.cs | 32 + .../MonoConnectStartDebuggingOptionsPage.cs | 60 + ...onoConnectStartDebuggingOptionsPageBase.cs | 126 + .../MonoStartDebuggingOptionsPage.cs | 139 + .../MonoStartDebuggingOptionsPageBase.cs | 201 + .../PortableExecutableFileHelpers.cs | 47 + .../StartDebuggingOptionsPageProviderImpl.cs | 46 + .../UnityConnectStartDebuggingOptionsPage.cs | 72 + .../UnityGenericDebugEngineGuidProvider.cs | 52 + .../UnityStartDebuggingOptionsPage.cs | 109 + .../Dialogs/DebuggingUnityGamesHelper.cs | 37 + .../Attach/MonoAttachToProgramOptionsBase.cs | 61 + .../Attach/UnityAttachToProgramOptions.cs | 46 + .../Impl/DbgEngineImpl.Breakpoints.cs | 338 + .../Impl/DbgEngineImpl.Evaluation.cs | 588 + .../Impl/DbgEngineImpl.Steppers.cs | 94 + .../Impl/DbgEngineImpl.Threads.cs | 420 + .../Impl/DbgEngineImpl.cs | 1530 +++ .../Impl/DbgEngineImplDependencies.cs | 45 + .../Impl/DbgEngineProviderImpl.cs | 51 + .../DbgModuleMemoryRefreshedNotifierImpl.cs | 40 + .../Impl/DbgMonoDebugInternalAppDomainImpl.cs | 42 + .../Impl/DbgMonoDebugInternalModuleImpl.cs | 52 + .../Impl/DebuggerThread.cs | 106 + .../Impl/DmdDispatcherImpl.cs | 37 + .../Impl/DotNetMonoRuntimeId.cs | 35 + .../Impl/EvalReflectionUtils.cs | 49 + .../DbgDotNetDispatcherExtensions.cs | 43 + .../Evaluation/DbgDotNetDispatcherImpl.cs | 38 + .../DbgDotNetEngineObjectIdFactoryImpl.cs | 41 + .../Impl/Evaluation/DbgDotNetObjectIdImpl.cs | 50 + .../Evaluation/DbgDotNetRawValueFactory.cs | 320 + .../Impl/Evaluation/DbgDotNetValueImpl.cs | 325 + .../DbgMonoDebugInternalRuntimeImpl.cs | 1282 ++ .../Impl/Evaluation/DispatcherConstants.cs | 24 + .../Impl/Evaluation/DmdEvaluatorImpl.cs | 93 + .../Impl/Evaluation/EvalArgumentConverter.cs | 426 + .../Impl/Evaluation/Hooks/ClassHook.cs | 28 + .../Impl/Evaluation/Hooks/ClassHookInfo.cs | 33 + .../Evaluation/Hooks/ClassHookProvider.cs | 29 + .../Evaluation/Hooks/IMonoDebugRuntime.cs | 30 + .../Hooks/MonoDebugValueConverterImpl.cs | 126 + .../Impl/Evaluation/Hooks/System_String.cs | 111 + .../Impl/Evaluation/MemberMirrorUtils.cs | 52 + .../Impl/Evaluation/MethodCache.cs | 102 + .../Impl/Evaluation/MonoDebugTypeCreator.cs | 170 + .../Impl/Evaluation/MonoValueFactory.cs | 108 + .../Impl/Evaluation/MonoValueTypeCreator.cs | 68 + .../Impl/Evaluation/SyntheticValues.cs | 35 + .../Impl/Evaluation/ValueLocations.cs | 271 + .../Impl/Evaluation/ValueUtils.cs | 90 + .../Impl/ExceptionUtils.cs | 28 + .../Impl/FuncEvalFactory.cs | 171 + .../Impl/ModuleCreator.cs | 307 + .../Impl/ModuleIdUtils.cs | 44 + .../Impl/MonoExeFinder.cs | 105 + .../Impl/MonoTypeLoader.cs | 111 + .../Impl/NativeMethods.cs | 36 + .../Impl/NetUtils.cs | 134 + .../Impl/ObjectConstants.cs | 142 + .../Impl/PortableExecutableFileHelpers.cs | 51 + .../Impl/PortableExecutableHelper.cs | 80 + .../Impl/ReflectionTypeCreator.cs | 137 + .../Impl/ThreadMirrorUtils.cs | 60 + .../Impl/ThreadProperties.cs | 63 + .../Impl/TypeCache.cs | 47 + .../Impl/WpfDebugMessageDispatcher.cs | 149 + .../Metadata/DbgAssemblyInfoProviderImpl.cs | 41 + .../Metadata/DbgModuleIdProviderImpl.cs | 31 + ...Debugger.DotNet.Mono.Resources.Designer.cs | 459 + ...Spy.Debugger.DotNet.Mono.Resources.cs.resx | 253 + ...Spy.Debugger.DotNet.Mono.Resources.de.resx | 252 + ....Debugger.DotNet.Mono.Resources.es-ES.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.fa.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.fr.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.hu.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.it.resx | 252 + ....Debugger.DotNet.Mono.Resources.pt-BR.resx | 252 + ....Debugger.DotNet.Mono.Resources.pt-PT.resx | 252 + .../dnSpy.Debugger.DotNet.Mono.Resources.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.ru.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.tr.resx | 252 + ...Spy.Debugger.DotNet.Mono.Resources.uk.resx | 252 + ....Debugger.DotNet.Mono.Resources.zh-CN.resx | 252 + .../Steppers/DbgDotNetEngineStepperImpl.cs | 234 + .../DbgDotNetStepperBreakpointImpl.cs | 58 + .../TheExtension.cs | 37 + .../Themes/wpf.styles.templates.xaml | 169 + .../dnSpy.Debugger.DotNet.Mono.csproj | 50 + ...BreakpointLocationFormatterProviderImpl.cs | 48 + .../Code/DbgDotNetBreakpointFactoryImpl.cs | 56 + .../TextEditor/ClassBreakpointCommands.cs | 271 + .../DbgBreakpointGlyphFormatterImpl.cs | 97 + ...ointGlyphTextMarkerLocationProviderImpl.cs | 48 + .../DeleteBreakpointsInRemovedModules.cs | 99 + ...GlyphTextMarkerLocationInfoProviderImpl.cs | 51 + .../DbgStackFrameTextViewMarkerImpl.cs | 121 + .../Code/BreakpointFormatterService.cs | 66 + .../DbgBreakpointLocationFormatterImpl.cs | 147 + .../Code/DbgCodeLocationSerializerImpl.cs | 104 + .../Code/DbgDotNetCodeLocationFactoryImpl.cs | 37 + .../Code/DbgDotNetCodeLocationImpl.cs | 59 + .../Code/DbgDotNetDebugInfoServiceImpl.cs | 108 + .../DbgDotNetDecompilerGuidProviderImpl.cs | 36 + .../Code/DbgDotNetDecompilerServiceImpl.cs | 73 + .../Code/DbgMethodDebugInfoProvider.cs | 206 + .../Code/DbgMethodDebugInfoUtils.cs | 150 + .../Code/DecompilerOutputImpl.cs | 112 + .../Code/DotNetReferenceNavigator.cs | 243 + .../Code/ReferenceConverterImpl.cs | 55 + .../DbgTextViewCodeLocationProviderImpl.cs | 68 + .../DotNetGenericDebugEngineGuidProvider.cs | 74 + .../PortableExecutableFileHelpers.cs | 47 + .../DbgRuntimeNativeCodeProviderImpl.cs | 304 + .../Disassembly/DecompiledCodeProvider.cs | 124 + .../Disassembly/DecompilerOutputImpl.cs | 120 + .../Disassembly/ILSourceStatementProvider.cs | 66 + .../Disassembly/SourceStatementProvider.cs | 66 + .../Evaluation/Engine/DbgAliasProvider.cs | 99 + .../Engine/DbgDotNetDispatcherExtensions.cs | 46 + .../Engine/DbgDotNetEngineValueNodeFactory.cs | 74 + ...gDotNetEngineValueNodeFactoryExtensions.cs | 35 + .../DbgDotNetEngineValueNodeFactoryService.cs | 96 + .../Engine/DbgDotNetLanguageServiceImpl.cs | 141 + .../Engine/DbgDotNetValueCreator.cs | 63 + .../Evaluation/Engine/DbgDotNetValueError.cs | 29 + .../Engine/DbgEngineAutosProviderImpl.cs | 68 + .../Engine/DbgEngineExceptionsProviderImpl.cs | 73 + .../DbgEngineExpressionEvaluatorImpl.cs | 416 + .../Engine/DbgEngineFormatterImpl.cs | 65 + .../Engine/DbgEngineLanguageImpl.cs | 184 + .../Engine/DbgEngineLanguageProviderImpl.cs | 38 + .../Engine/DbgEngineLocalsProviderImpl.cs | 308 + .../Engine/DbgEngineObjectIdFactoryImpl.cs | 88 + .../Engine/DbgEngineObjectIdImpl.cs | 71 + .../DbgEngineReturnValuesProviderImpl.cs | 70 + .../DbgEngineTypeVariablesProviderImpl.cs | 91 + .../Evaluation/Engine/DbgEngineValueImpl.cs | 41 + .../Engine/DbgEngineValueNodeFactoryImpl.cs | 126 + .../Engine/DbgEngineValueNodeImpl.cs | 197 + .../Engine/DbgModuleReferenceProvider.cs | 502 + .../Evaluation/Engine/DispatcherConstants.cs | 24 + .../Evaluation/Engine/ExceptionUtils.cs | 28 + .../Engine/ExpressionCompilerConstants.cs | 34 + .../Engine/Interpreter/AddressILValue.cs | 193 + .../Engine/Interpreter/ArrayILValue.cs | 152 + .../Interpreter/BoxedValueTypeILValue.cs | 49 + .../Engine/Interpreter/ByRefILValueImpl.cs | 61 + .../Interpreter/DbgDotNetILInterpreter.cs | 213 + .../Interpreter/DebuggerRuntimeFactory.cs | 26 + .../Interpreter/DebuggerRuntimeFactoryImpl.cs | 49 + .../Engine/Interpreter/DebuggerRuntimeImpl.cs | 947 ++ .../DefaultArgumentsProviderImpl.cs | 49 + .../Interpreter/DefaultLocalsProviderImpl.cs | 49 + .../Engine/Interpreter/DotNetClassHook.cs | 34 + .../Interpreter/DotNetClassHookFactory.cs | 52 + .../Hooks/DotNetClassHookFactoryImpl.cs | 32 + ...Runtime_CompilerServices_RuntimeHelpers.cs | 85 + ...yn_ExpressionEvaluator_IntrinsicMethods.cs | 138 + .../Engine/Interpreter/IDebuggerRuntime.cs | 44 + .../Evaluation/Engine/Interpreter/ILValues.cs | 62 + .../Interpreter/InterpreterLocalsProvider.cs | 99 + .../Interpreter/RuntimeHandleILValues.cs | 56 + .../Engine/Interpreter/SyntheticValues.cs | 146 + .../Engine/Interpreter/TypeILValueImpl.cs | 78 + .../Engine/Interpreter/UnboxAddressILValue.cs | 39 + .../Engine/Interpreter/VariablesProvider.cs | 33 + .../Engine/IntrinsicsAssemblyBuilder.cs | 135 + .../Evaluation/Engine/LanguageConstants.cs | 27 + .../Evaluation/Engine/MetadataFixer.cs | 174 + .../Engine/MethodDebugScopeUtils.cs | 40 + .../Evaluation/Engine/ModuleRefFinder.cs | 81 + .../Evaluation/Engine/ObjectCache.cs | 55 + .../Evaluation/Engine/StateWithKey.cs | 46 + .../BreakWhenThrownExceptionCommand.cs | 138 + .../Exceptions/CLRDbgExceptionFormatter.cs | 48 + .../Metadata/ClassLoader.cs | 214 + .../Metadata/Commands.cs | 90 + .../DbgAssemblyInfoProviderService.cs | 51 + .../DbgDynamicModuleProviderService.cs | 51 + .../Metadata/DbgInMemoryModuleService.cs | 469 + .../Metadata/DbgMetadataServiceImpl.cs | 150 + .../Metadata/DbgModuleIdProviderService.cs | 84 + .../DbgModuleMemoryRefreshedNotifierImpl.cs | 40 + .../Metadata/DsDocumentProvider.cs | 93 + .../Metadata/DynamicModuleDefDocument.cs | 66 + .../Metadata/IModuleIdHolder.cs | 26 + .../Metadata/Internal/DbgRawMetadataImpl.cs | 199 + .../Internal/DbgRawMetadataServiceImpl.cs | 96 + .../Metadata/Internal/NativeMethods.cs | 34 + .../Metadata/KnownMemberNames.cs | 98 + .../Metadata/MemoryModuleDefDocument.cs | 152 + .../Metadata/ModuleIdFactoryProviderImpl.cs | 48 + .../Metadata/ModuleLoaderDlg.xaml | 50 + .../Metadata/ModuleLoaderDlg.xaml.cs | 63 + .../Metadata/ModuleLoaderVM.cs | 205 + .../Metadata/RuntimeAssemblyResolver.cs | 176 + .../Metadata/ShowModuleLoaderService.cs | 45 + .../Metadata/TreeViewUpdater.cs | 193 + .../DbgLoadModuleReferenceHandlerImpl.cs | 111 + ...nSpy.Debugger.DotNet.Resources.Designer.cs | 270 + .../dnSpy.Debugger.DotNet.Resources.cs.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.de.resx | 189 + ...dnSpy.Debugger.DotNet.Resources.es-ES.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.fa.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.fr.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.hu.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.it.resx | 189 + ...dnSpy.Debugger.DotNet.Resources.pt-BR.resx | 189 + ...dnSpy.Debugger.DotNet.Resources.pt-PT.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.ru.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.tr.resx | 189 + .../dnSpy.Debugger.DotNet.Resources.uk.resx | 189 + ...dnSpy.Debugger.DotNet.Resources.zh-CN.resx | 189 + .../Steppers/Engine/CompilerUtils.cs | 99 + .../Engine/DbgEngineStepperFactoryImpl.cs | 53 + .../Steppers/Engine/DbgEngineStepperImpl.cs | 1226 ++ .../Steppers/Engine/TaskEvalUtils.cs | 303 + .../dnSpy.Debugger.DotNet/TheExtension.cs | 36 + .../dnSpy.Debugger.DotNet/UI/UIDispatcher.cs | 62 + .../dnSpy.Debugger.DotNet/debug/DotNet.ex.xml | 439 + .../dnSpy.Debugger.DotNet.csproj | 54 + .../AntiAntiDebug/ApiPatcherX86.cs | 317 + .../CheckRemoteDebuggerPresentHook.cs | 63 + .../CheckRemoteDebuggerPresentPatcherX86.cs | 159 + .../AntiAntiDebug/DbgHookException.cs | 26 + .../DbgHookedNativeFunctionImpl.cs | 41 + .../DbgHookedNativeFunctionProviderImpl.cs | 153 + .../DbgNativeFunctionHookContextImpl.cs | 50 + .../AntiAntiDebug/ExportedFunctions.cs | 33 + .../AntiAntiDebug/ExportedFunctionsReader.cs | 114 + .../AntiAntiDebug/IsDebuggerPresentHook.cs | 78 + .../IsDebuggerPresentPatcherX86.cs | 77 + .../AntiAntiDebug/NativeMethods.cs | 41 + .../AntiAntiDebug/PatchAPIResult.cs | 55 + .../AntiAntiDebug/PatcherX86.cs | 51 + .../PreventNativeDebuggerDetection.cs | 118 + .../AntiAntiDebug/ProcessMemoryBlock.cs | 52 + .../ProcessMemoryBlockAllocator.cs | 129 + .../Attach/AppCommandLineArgsHandler.cs | 51 + .../Attach/AttachableProcessImpl.cs | 50 + .../Attach/AttachableProcessInfo.cs | 158 + .../Attach/AttachableProcessesServiceImpl.cs | 201 + .../Attach/Win32CommandLineProvider.cs | 153 + .../Code/BoundCodeBreakpointsService.cs | 73 + .../Code/BreakpointConditionsFormatter.cs | 214 + .../Code/BreakpointImageUtilities.cs | 102 + .../Breakpoints/Code/BreakpointsSerializer.cs | 153 + .../Code/CodeBreakpointsListSettings.cs | 98 + .../CondChecker/BreakpointBreakChecker.cs | 112 + .../DbgCodeBreakpointCheckResult.cs | 37 + .../DbgCodeBreakpointConditionChecker.cs | 284 + .../DbgCodeBreakpointFilterChecker.cs | 87 + .../DbgCodeBreakpointHitCountChecker.cs | 51 + .../DbgCodeBreakpointTraceMessagePrinter.cs | 51 + .../DbgFilterExpressionEvaluatorService.cs | 74 + .../Breakpoints/Code/CondChecker/ListCache.cs | 34 + .../Code/CondChecker/ObjectCache.cs | 37 + .../CondChecker/ParsedTracepointMessage.cs | 121 + .../CondChecker/TracepointMessageCreator.cs | 463 + .../CondChecker/TracepointMessageParser.cs | 260 + .../DbgBreakpointLocationFormatterService.cs | 63 + .../DbgBreakpointLocationSerializerService.cs | 85 + .../DbgCodeBreakpointDisplaySettingsBase.cs | 203 + .../DbgCodeBreakpointHitCountServiceImpl.cs | 205 + .../Breakpoints/Code/DbgCodeBreakpointImpl.cs | 284 + .../DbgCodeBreakpointSerializerService.cs | 65 + .../Code/DbgCodeBreakpointsServiceImpl.cs | 325 + .../Code/ITracepointMessageListener.cs | 24 + .../Code/RemoveTemporaryBreakpoints.cs | 53 + .../Breakpoints/Code/ResetHitCount.cs | 56 + .../BreakpointGlyphPopupControl.xaml | 82 + .../BreakpointGlyphPopupControl.xaml.cs | 133 + .../Code/TextEditor/BreakpointGlyphPopupVM.cs | 57 + .../BreakpointGlyphTextMarkerHandler.cs | 143 + ...tGlyphTextMarkerLocationProviderService.cs | 52 + .../Code/TextEditor/BreakpointInfo.cs | 42 + .../Code/TextEditor/BreakpointMarker.cs | 211 + .../Code/TextEditor/GlyphMarginCommands.cs | 76 + .../Code/TextEditor/GlyphMarginOperations.cs | 49 + .../GlyphTextMarkerMouseProcessor.cs | 80 + .../TextEditor/TextViewBreakpointService.cs | 277 + .../Modules/BreakpointsSerializer.cs | 79 + .../Modules/DbgModuleBreakpointImpl.cs | 169 + .../DbgModuleBreakpointsServiceImpl.cs | 194 + .../Modules/ModuleBreakpointHitChecker.cs | 48 + .../Modules/ModuleBreakpointsListSettings.cs | 75 + .../CallStack/DbgCallStackServiceImpl.cs | 181 + .../CallStack/DbgStackFrameImpl.cs | 59 + .../CallStack/DbgStackWalkerImpl.cs | 58 + .../CallStack/SpecialDbgEngineStackFrame.cs | 58 + .../TextEditor/ActiveStatementService.cs | 115 + .../TextEditor/CallStackFrameKind.cs | 25 + .../CallStackGlyphTextMarkerHandler.cs | 62 + .../CallStack/TextEditor/CallStackMarker.cs | 166 + .../Code/GoToInMemoryModuleStatement.cs | 57 + .../DbgTextViewCodeLocationService.cs | 56 + .../DbgUI/CurrentStatementUpdater.cs | 64 + .../DbgUI/DbgProcessStarterService.cs | 86 + .../dnSpy.Debugger/DbgUI/DebugMenu.cs | 26 + .../dnSpy.Debugger/DbgUI/DebugMenuCommands.cs | 281 + .../dnSpy.Debugger/DbgUI/Debugger.cs | 82 + .../dnSpy.Debugger/DbgUI/DebuggerImpl.cs | 641 + .../DbgUI/DefaultDbgProcessStarter.cs | 49 + .../DbgUI/DocumentViewerCommands.cs | 144 + .../DbgUI/KeyboardShortcutCommands.cs | 53 + .../DbgUI/PortableExecutableFileHelpers.cs | 47 + .../DbgUI/StartDebuggingOptionsMru.cs | 84 + .../DbgUI/StartDebuggingOptionsProvider.cs | 182 + .../DbgUI/ToolbarButtonCommands.cs | 153 + .../DbgUI/WpfCurrentStatementUpdater.cs | 57 + .../AttachProgramOptionsAggregator.cs | 40 + .../AttachProgramOptionsAggregatorImpl.cs | 206 + .../AttachToProcess/AttachToProcessContext.cs | 51 + .../AttachToProcess/AttachToProcessDlg.xaml | 149 + .../AttachToProcessDlg.xaml.cs | 110 + .../AttachToProcess/AttachToProcessVM.cs | 515 + .../AttachToProcessWindowColumnIds.cs | 31 + .../AttachToProcess/ProgramColumnConverter.cs | 61 + .../AttachToProcess/ProgramFormatter.cs | 43 + .../Dialogs/AttachToProcess/ProgramVM.cs | 80 + .../SearchTextClassifierProvider.cs | 35 + .../ShowAttachToProcessDialogImpl.cs | 85 + .../ShowCodeBreakpointSettingsDlg.xaml | 87 + .../ShowCodeBreakpointSettingsDlg.xaml.cs | 26 + .../ShowCodeBreakpointSettingsService.cs | 69 + .../ShowCodeBreakpointSettingsVM.cs | 351 + .../Dialogs/DebugProgram/DebugProgramDlg.xaml | 71 + .../DebugProgram/DebugProgramDlg.xaml.cs | 26 + .../Dialogs/DebugProgram/DebugProgramVM.cs | 80 + .../Dialogs/DebugProgram/OptionsPageVM.cs | 53 + .../dnSpy.Debugger/Disassembly/Commands.cs | 50 + .../Disassembly/DbgNativeCodeProviderImpl.cs | 157 + .../DbgShowNativeCodeServiceImpl.cs | 100 + .../Disassembly/DisassemblyOperations.cs | 66 + .../Evaluation/DbgEvalFormatterSettings.cs | 53 + .../DbgEvalFormatterSettingsBase.cs | 107 + .../Evaluation/DbgEvaluationContextImpl.cs | 69 + .../Evaluation/DbgExpressionEvaluatorImpl.cs | 90 + .../Evaluation/DbgFormatterImpl.cs | 191 + .../Evaluation/DbgLanguageImpl.cs | 76 + .../Evaluation/DbgLanguageServiceImpl.cs | 195 + .../Evaluation/DbgLanguageServiceSettings.cs | 62 + .../DbgLocalsValueNodeProviderImpl.cs | 49 + .../Evaluation/DbgObjectIdImpl.cs | 57 + .../Evaluation/DbgObjectIdServiceImpl.cs | 142 + .../Evaluation/DbgRuntimeObjectIdService.cs | 266 + .../dnSpy.Debugger/Evaluation/DbgValueImpl.cs | 44 + .../Evaluation/DbgValueNodeFactoryImpl.cs | 100 + .../Evaluation/DbgValueNodeImpl.cs | 131 + .../Evaluation/DbgValueNodeProviderImpl.cs | 49 + .../Evaluation/DbgValueNodeUtils.cs | 46 + .../Evaluation/ExceptionUtils.cs | 28 + .../Evaluation/NullDbgEngineLanguage.cs | 105 + .../NullDbgEngineObjectIdFactory.cs | 32 + ...PredefinedEvaluationErrorMessagesHelper.cs | 71 + .../Evaluation/UI/ValueNodesProviderImpl.cs | 231 + .../UI/VariablesWindowColumnConverter.cs | 69 + .../UI/VariablesWindowContentBase.cs | 67 + .../Evaluation/UI/VariablesWindowControl.xaml | 105 + .../UI/VariablesWindowControl.xaml.cs | 95 + .../UI/VariablesWindowToolWindowContent.cs | 141 + .../Evaluation/UI/VariablesWindowVM.cs | 184 + .../Evaluation/UI/VariablesWindowVMOptions.cs | 69 + .../Evaluation/ViewModel/ClipboardFormats.cs | 24 + .../Evaluation/ViewModel/IValueNodesVM.cs | 45 + .../Impl/DbgValueNodeFormatParameters.cs | 64 + .../Impl/DbgValueNodeImageReferenceService.cs | 163 + .../ViewModel/Impl/DbgValueNodeReader.cs | 67 + .../Impl/IEditValueNodeExpression.cs | 26 + .../Impl/LanguageEditValueProvider.cs | 91 + .../Evaluation/ViewModel/Impl/RawNode.cs | 278 + .../ViewModel/Impl/ValueNodeFormatter.cs | 93 + .../ViewModel/Impl/ValueNodeImpl.cs | 569 + .../ViewModel/Impl/ValueNodeTextClassifier.cs | 55 + .../Impl/ValueNodeTextClassifierContext.cs | 43 + .../ViewModel/Impl/ValueNodesContext.cs | 109 + .../Evaluation/ViewModel/Impl/ValueNodesVM.cs | 708 ++ .../ViewModel/Impl/ValueNodesVMFactoryImpl.cs | 124 + .../Impl/VariablesWindowOperationsImpl.cs | 607 + .../Impl/VariablesWindowsCommands.cs | 354 + .../Evaluation/ViewModel/ValueNode.cs | 54 + .../ViewModel/ValueNodesProvider.cs | 142 + .../ViewModel/ValueNodesVMFactory.cs | 72 + .../ViewModel/VariablesWindowOperations.cs | 89 + .../Watch/WatchExpressionsService.cs | 24 + .../DbgExceptionFormatterService.cs | 130 + .../Exceptions/DbgExceptionImpl.cs | 48 + .../DbgExceptionSettingsServiceImpl.cs | 218 + .../DefaultExceptionDefinitionsProvider.cs | 101 + .../Exceptions/ExceptionConditionsChecker.cs | 103 + .../Exceptions/ExceptionListSettings.cs | 292 + .../Exceptions/ExceptionsFileReader.cs | 125 + .../Exceptions/GenerateExceptionsXmlFile.cs | 166 + .../dnSpy.Debugger/Impl/CurrentObject.cs | 37 + .../dnSpy.Debugger/Impl/DbgAppDomainImpl.cs | 71 + .../Impl/DbgBoundCodeBreakpointImpl.cs | 105 + .../Impl/DbgBreakInfoCollectionBuilder.cs | 66 + .../dnSpy.Debugger/Impl/DbgDispatcherImpl.cs | 45 + .../Impl/DbgDispatcherProvider.cs | 39 + .../Impl/DbgEngineAppDomainImpl.cs | 42 + .../Impl/DbgEngineBoundCodeBreakpointImpl.cs | 60 + ...ineBoundCodeBreakpointMessageExtensions.cs | 62 + .../Impl/DbgEngineModuleImpl.cs | 62 + .../Impl/DbgEngineThreadImpl.cs | 72 + .../DbgManagerImpl.BoundBreakpointsManager.cs | 248 + .../Impl/DbgManagerImpl.BreakAllHelper.cs | 147 + .../Impl/DbgManagerImpl.CurrentObjects.cs | 265 + .../Impl/DbgManagerImpl.ProcessKey.cs | 39 + .../Impl/DbgManagerImpl.Steppers.cs | 81 + .../DbgManagerImpl.StopDebuggingHelper.cs | 115 + .../Impl/DbgManagerImpl.TagsCollection.cs | 75 + .../dnSpy.Debugger/Impl/DbgManagerImpl.cs | 1234 ++ .../dnSpy.Debugger/Impl/DbgModuleImpl.cs | 223 + .../Impl/DbgObjectFactoryImpl.cs | 166 + .../dnSpy.Debugger/Impl/DbgProcessImpl.cs | 555 + .../dnSpy.Debugger/Impl/DbgRuntimeImpl.cs | 367 + .../dnSpy.Debugger/Impl/DbgThreadImpl.cs | 280 + .../dnSpy.Debugger/Impl/DebuggerThread.cs | 74 + .../Impl/DelayedIsRunningHelper.cs | 65 + .../Impl/SwitchToDebuggedProcess.cs | 95 + .../Modules/ReferenceNavigatorImpl.cs | 80 + .../dnSpy.Debugger/Native/Memset.cs | 40 + .../dnSpy.Debugger/Native/NativeMethods.cs | 74 + .../dnSpy.Debugger.Resources.Designer.cs | 4290 +++++++ .../dnSpy.Debugger.Resources.cs.resx | 1533 +++ .../dnSpy.Debugger.Resources.de.resx | 1533 +++ .../dnSpy.Debugger.Resources.es-ES.resx | 1530 +++ .../dnSpy.Debugger.Resources.fa.resx | 1533 +++ .../dnSpy.Debugger.Resources.fr.resx | 1531 +++ .../dnSpy.Debugger.Resources.hu.resx | 1533 +++ .../dnSpy.Debugger.Resources.it.resx | 1527 +++ .../dnSpy.Debugger.Resources.pt-BR.resx | 1531 +++ .../dnSpy.Debugger.Resources.pt-PT.resx | 1529 +++ .../Properties/dnSpy.Debugger.Resources.resx | 1533 +++ .../dnSpy.Debugger.Resources.ru.resx | 1533 +++ .../dnSpy.Debugger.Resources.tr.resx | 1533 +++ .../dnSpy.Debugger.Resources.uk.resx | 1532 +++ .../dnSpy.Debugger.Resources.zh-CN.resx | 1533 +++ .../Settings/DebuggerAppSettingsPage.cs | 143 + .../Settings/DebuggerSettingsImpl.cs | 758 ++ .../dnSpy.Debugger/Shared/Dispatcher.cs | 170 + .../dnSpy.Debugger/Shared/DispatcherTimer.cs | 77 + .../dnSpy.Debugger/Shared/FileUtilities.cs | 114 + .../dnSpy.Debugger/Steppers/DbgStepperImpl.cs | 181 + .../dnSpy.Debugger/Text/ClassifiedText.cs | 65 + .../Text/ClassifiedTextWriter.cs | 60 + .../dnSpy.Debugger/TheExtension.cs | 37 + .../Themes/wpf.styles.templates.xaml | 134 + .../ToolWindows/AntiFlickerConstants.cs | 27 + .../ToolWindows/Autos/AutosContent.cs | 50 + .../Autos/AutosToolWindowContent.cs | 48 + .../AutosVariablesWindowValueNodesProvider.cs | 46 + .../ToolWindows/Autos/Commands.cs | 46 + .../CallStack/CallStackColumnConverter.cs | 48 + .../ToolWindows/CallStack/CallStackContent.cs | 85 + .../ToolWindows/CallStack/CallStackContext.cs | 62 + .../CallStack/CallStackControl.xaml | 85 + .../CallStack/CallStackControl.xaml.cs | 39 + .../CallStack/CallStackDisplaySettings.cs | 88 + .../CallStack/CallStackDisplaySettingsBase.cs | 240 + .../CallStack/CallStackFormatter.cs | 52 + .../CallStack/CallStackOperations.cs | 437 + .../CallStack/CallStackToolWindowContent.cs | 80 + .../ToolWindows/CallStack/CallStackVM.cs | 474 + .../CallStack/CallStackWindowColumnIds.cs | 25 + .../ToolWindows/CallStack/Commands.cs | 432 + .../ToolWindows/CallStack/StackFrameVM.cs | 196 + .../CodeBreakpointColumnConverter.cs | 61 + .../CodeBreakpoints/CodeBreakpointContext.cs | 65 + .../CodeBreakpointFormatter.cs | 60 + .../CodeBreakpoints/CodeBreakpointVM.cs | 218 + .../CodeBreakpointsColumnIds.cs | 31 + .../CodeBreakpoints/CodeBreakpointsContent.cs | 133 + .../CodeBreakpointsControl.xaml | 192 + .../CodeBreakpointsControl.xaml.cs | 52 + .../CodeBreakpointsOperations.cs | 375 + .../CodeBreakpointsToolWindowContent.cs | 81 + .../CodeBreakpoints/CodeBreakpointsVM.cs | 640 + .../ToolWindows/CodeBreakpoints/Commands.cs | 292 + .../SearchTextClassifierProvider.cs | 35 + .../dnSpy.Debugger/ToolWindows/Commands.cs | 260 + .../Exceptions/AddExceptionControl.xaml | 36 + .../Exceptions/AddExceptionControl.xaml.cs | 26 + .../ToolWindows/Exceptions/AddExceptionVM.cs | 198 + .../ToolWindows/Exceptions/Commands.cs | 222 + .../EditExceptionConditionsDlg.xaml | 86 + .../EditExceptionConditionsDlg.xaml.cs | 26 + .../Exceptions/EditExceptionConditionsVM.cs | 128 + .../Exceptions/ExceptionCategoryVM.cs | 42 + .../Exceptions/ExceptionColumnConverter.cs | 53 + .../Exceptions/ExceptionContext.cs | 63 + .../Exceptions/ExceptionControl.xaml | 152 + .../Exceptions/ExceptionControl.xaml.cs | 52 + .../Exceptions/ExceptionFormatter.cs | 79 + .../ToolWindows/Exceptions/ExceptionVM.cs | 103 + .../Exceptions/ExceptionsContent.cs | 132 + .../Exceptions/ExceptionsOperations.cs | 186 + .../Exceptions/ExceptionsToolWindowContent.cs | 81 + .../ToolWindows/Exceptions/ExceptionsVM.cs | 566 + .../Exceptions/ExceptionsWindowColumnIds.cs | 27 + .../SearchTextClassifierProvider.cs | 35 + .../ToolWindows/FormatterUtils.cs | 102 + .../ToolWindows/LazyToolWindowVMHelper.cs | 179 + .../Locals/AutoShowLocalsWindow.cs | 47 + .../ToolWindows/Locals/Commands.cs | 46 + .../ToolWindows/Locals/LocalsContent.cs | 58 + .../Locals/LocalsToolWindowContent.cs | 48 + ...LocalsVariablesWindowValueNodesProvider.cs | 206 + .../ToolWindows/Logger/Commands.cs | 136 + .../Logger/ContentTypeDefinitions.cs | 33 + .../ToolWindows/Logger/OutputLogger.cs | 263 + .../Logger/OutputLoggerSettings.cs | 164 + .../BackgroundImageOptionDefinitions.cs | 38 + .../ToolWindows/Memory/BufferFileCreator.cs | 220 + .../ToolWindows/Memory/Commands.cs | 134 + .../Memory/DebuggerHexBufferStream.cs | 248 + .../Memory/HexEditorOptionsDefinitions.cs | 31 + .../ToolWindows/Memory/MemoryContent.cs | 64 + .../ToolWindows/Memory/MemoryControl.xaml | 31 + .../ToolWindows/Memory/MemoryControl.xaml.cs | 32 + .../Memory/MemoryToolWindowContentProvider.cs | 123 + .../ToolWindows/Memory/MemoryVM.cs | 76 + .../ToolWindows/Memory/MemoryWindowService.cs | 137 + .../ToolWindows/Memory/MemoryWindowsHelper.cs | 40 + .../Memory/ProcessHexBufferProvider.cs | 366 + .../ToolWindows/ModuleBreakpoints/Commands.cs | 211 + .../ModuleBreakpointColumnConverter.cs | 55 + .../ModuleBreakpointContext.cs | 55 + .../ModuleBreakpointFormatter.cs | 57 + .../ModuleBreakpoints/ModuleBreakpointVM.cs | 184 + .../ModuleBreakpointsContent.cs | 123 + .../ModuleBreakpointsControl.xaml | 178 + .../ModuleBreakpointsControl.xaml.cs | 52 + .../ModuleBreakpointsOperations.cs | 307 + .../ModuleBreakpointsToolWindowContent.cs | 81 + .../ModuleBreakpoints/ModuleBreakpointsVM.cs | 530 + .../ModuleBreakpointsWindowColumnIds.cs | 32 + .../SearchTextClassifierProvider.cs | 35 + .../ModuleBreakpoints/TextViewTaggers.cs | 85 + .../ToolWindows/Modules/Commands.cs | 263 + .../Modules/ModuleColumnConverter.cs | 69 + .../ToolWindows/Modules/ModuleContext.cs | 55 + .../ToolWindows/Modules/ModuleFormatter.cs | 105 + .../ToolWindows/Modules/ModuleVM.cs | 144 + .../ToolWindows/Modules/ModuleVersion.cs | 63 + .../ToolWindows/Modules/ModulesContent.cs | 103 + .../ToolWindows/Modules/ModulesControl.xaml | 195 + .../Modules/ModulesControl.xaml.cs | 52 + .../ToolWindows/Modules/ModulesOperations.cs | 283 + .../ToolWindows/Modules/ModulesSaver.cs | 117 + .../Modules/ModulesToolWindowContent.cs | 81 + .../ToolWindows/Modules/ModulesVM.cs | 829 ++ .../Modules/ModulesWindowColumnIds.cs | 36 + .../ToolWindows/Modules/PEFilesSaver.cs | 130 + .../Modules/SearchTextClassifierProvider.cs | 35 + .../ToolWindows/Processes/Commands.cs | 173 + .../Processes/ProcessColumnConverter.cs | 61 + .../ToolWindows/Processes/ProcessContext.cs | 55 + .../ToolWindows/Processes/ProcessFormatter.cs | 98 + .../ToolWindows/Processes/ProcessVM.cs | 252 + .../ToolWindows/Processes/ProcessesContent.cs | 119 + .../Processes/ProcessesControl.xaml | 192 + .../Processes/ProcessesControl.xaml.cs | 52 + .../Processes/ProcessesOperations.cs | 261 + .../Processes/ProcessesToolWindowContent.cs | 80 + .../ToolWindows/Processes/ProcessesVM.cs | 533 + .../Processes/ProcessesWindowColumnIds.cs | 32 + .../Processes/SearchTextClassifierProvider.cs | 35 + .../ToolWindows/SimpleProcessVM.cs | 45 + .../TextView/DebuggerCommandConstants.cs | 26 + .../TextView/DebuggerToolWindowIds.cs | 28 + .../DebuggerToolWindowIdsExtensions.cs | 27 + .../DocumentViewerCommandInfoProvider.cs | 42 + .../DocumentViewerCommandTargetFilter.cs | 80 + ...cumentViewerCommandTargetFilterProvider.cs | 42 + .../ToolWindows/Threads/Commands.cs | 150 + .../Threads/DefaultThreadCategoryProvider.cs | 47 + .../Threads/SearchTextClassifierProvider.cs | 35 + .../ToolWindows/Threads/TextViewTaggers.cs | 65 + .../Threads/ThreadCategoryService.cs | 60 + .../Threads/ThreadColumnConverter.cs | 69 + .../ToolWindows/Threads/ThreadContext.cs | 67 + .../ToolWindows/Threads/ThreadFormatter.cs | 149 + .../ToolWindows/Threads/ThreadUtilities.cs | 61 + .../ToolWindows/Threads/ThreadVM.cs | 412 + .../ToolWindows/Threads/ThreadsContent.cs | 107 + .../ToolWindows/Threads/ThreadsControl.xaml | 223 + .../Threads/ThreadsControl.xaml.cs | 52 + .../ToolWindows/Threads/ThreadsOperations.cs | 224 + .../Threads/ThreadsToolWindowContent.cs | 81 + .../ToolWindows/Threads/ThreadsVM.cs | 924 ++ .../Threads/ThreadsWindowColumnIds.cs | 35 + .../ToolWindows/ToolWindowsOperations.cs | 103 + .../ToolWindows/Watch/CommandsLoader.cs | 52 + .../ToolWindows/Watch/WatchContent.cs | 54 + .../ToolWindows/Watch/WatchContentFactory.cs | 58 + .../Watch/WatchExpressionsServiceImpl.cs | 50 + .../Watch/WatchToolWindowContent.cs | 50 + .../WatchVariablesWindowValueNodesProvider.cs | 212 + .../Watch/WatchWindowExpressionsSettings.cs | 100 + .../ToolWindows/Watch/WatchWindowsHelper.cs | 34 + .../ToolWindows/Watch/WpfMemLeakWorkaround.cs | 57 + .../UI/BooleanToHiddenVisibilityConverter.cs | 36 + .../UI/BulkObservableCollection.cs | 47 + .../UI/ContentTypeDefinitions.cs | 118 + .../UI/DynamicCheckableMenuItem.cs | 36 + .../dnSpy.Debugger/UI/FormatterObject.cs | 41 + .../dnSpy.Debugger/UI/UIDispatcher.cs | 56 + .../UI/Wpf/ITextBlockContentInfoFactory.cs | 27 + .../dnSpy.Debugger/UI/Wpf/SmartTextBlock.cs | 59 + .../UI/Wpf/TextBlockContentInfo.cs | 114 + .../UI/Wpf/TextBlockContentInfoFactory.cs | 62 + .../Utilities/ProcessProvider.cs | 66 + .../Utilities/ProcessUtilities.cs | 41 + .../Utilities/WildcardsUtils.cs | 32 + .../dnSpy.Debugger/dnSpy.Debugger.csproj | 51 + .../CSharp/CSharpContent.cs | 52 + .../CSharp/CSharpControlVM.cs | 114 + .../CSharp/CSharpReplSettingsImpl.cs | 35 + .../CSharp/CSharpToolWindowContent.cs | 84 + .../CSharp/ReplOptionsDefinitions.cs | 31 + .../CSharpInteractive.rsp | 24 + .../Commands/RoslynReplCommandConstants.cs | 40 + .../Commands/RoslynReplIds.cs | 40 + .../Commands/RoslynReplIdsExtensions.cs | 42 + .../Common/CachedWriter.cs | 76 + .../Common/ClearCommand.cs | 35 + .../dnSpy.Scripting.Roslyn/Common/Commands.cs | 143 + .../Common/HelpCommand.cs | 96 + .../Common/IScriptCommand.cs | 44 + .../Common/IScriptGlobalsHelper.cs | 38 + .../Common/PrintOptionsImpl.cs | 69 + .../Common/ReplSettings.cs | 72 + .../Common/ResetCommand.cs | 37 + .../Common/RespFileUtils.cs | 49 + .../Common/ResponseFileReader.cs | 52 + .../Common/RoslynReplCommandInfoProvider.cs | 39 + .../Common/RoslynReplCommandTargetFilter.cs | 96 + .../RoslynReplCommandTargetFilterProvider.cs | 36 + .../Common/RoslynReplEditorUtils.cs | 52 + .../Common/ScriptContent.cs | 72 + .../Common/ScriptControl.xaml | 68 + .../Common/ScriptControl.xaml.cs | 30 + .../Common/ScriptControlVM.cs | 648 + .../Common/ScriptGlobals.cs | 122 + .../Common/ScriptToolWindowContent.cs | 72 + .../ContentTypeDefinitions.cs | 43 + ...Spy.Scripting.Roslyn.Resources.Designer.cs | 630 + .../dnSpy.Scripting.Roslyn.Resources.cs.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.de.resx | 309 + ...nSpy.Scripting.Roslyn.Resources.es-ES.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.fa.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.fr.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.hu.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.it.resx | 309 + ...nSpy.Scripting.Roslyn.Resources.pt-BR.resx | 309 + ...nSpy.Scripting.Roslyn.Resources.pt-PT.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.ru.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.tr.resx | 309 + .../dnSpy.Scripting.Roslyn.Resources.uk.resx | 309 + ...nSpy.Scripting.Roslyn.Resources.zh-CN.resx | 309 + .../dnSpy.Scripting.Roslyn/TheExtension.cs | 42 + .../VisualBasic/ReplOptionsDefinitions.cs | 31 + .../VisualBasic/VisualBasicContent.cs | 52 + .../VisualBasic/VisualBasicControlVM.cs | 111 + .../VisualBasicReplSettingsImpl.cs | 35 + .../VisualBasicToolWindowContent.cs | 84 + .../VisualBasicInteractive.rsp | 25 + .../dnSpy.Scripting.Roslyn.csproj | 61 + README.md | 103 + build.ps1 | 95 + clean-all.cmd | 15 + dnSpy.sln | 723 ++ dnSpy.snk | Bin 0 -> 596 bytes .../Dummy.cs | 23 + .../MakeEverythingPublic.cs | 24 + .../Properties/AssemblyInfo.cs | 4 + .../TextStructureNavigatorProvider.cs | 77 + .../dnSpy.Roslyn.CSharp.EditorFeatures.csproj | 25 + .../MakeEverythingPublic.cs | 25 + .../Properties/AssemblyInfo.cs | 3 + .../QuickInfo/SemanticQuickInfoProvider.cs | 22 + .../QuickInfo/SyntacticQuickInfoProvider.cs | 125 + .../CSharpIndentationService.Indenter.cs | 437 + .../SmartIndent/CSharpIndentationService.cs | 205 + .../dnSpy.Roslyn.CSharp.Internal.csproj | 23 + .../dnSpy.Roslyn.EditorFeatures/Dummy.cs | 23 + .../Editor/ContentTypeNames.cs | 16 + .../EditorFeaturesResources.cs | 12 + .../Extensions/Extensions2.cs | 114 + .../Extensions/ITextSnapshotLineExtensions.cs | 164 + .../Extensions/TextSpanExtensions.cs | 29 + .../Host/IWaitContext.cs | 24 + .../Host/IWaitIndicator.cs | 24 + .../Host/ProgressTracker.cs | 59 + .../Host/WaitIndicator.cs | 63 + .../MakeEverythingPublic.cs | 30 + .../Properties/AssemblyInfo.cs | 6 + .../SmartIndent/SmartIndent.cs | 63 + .../SmartIndent/SmartIndentExtensions.cs | 26 + .../SmartIndent/SmartIndentProvider.cs | 30 + ...avigatorProvider.TextStructureNavigator.cs | 363 + .../AbstractTextStructureNavigatorProvider.cs | 53 + .../dnSpy.Roslyn.EditorFeatures.csproj | 25 + .../dnSpy.Roslyn.Internal/GlyphExtensions.cs | 108 + .../MakeEverythingPublic.cs | 31 + .../Properties/AssemblyInfo.cs | 6 + .../ExportQuickInfoProviderAttribute.cs | 22 + .../QuickInfo/IQuickInfoProvider.cs | 13 + .../PredefinedQuickInfoProviderNames.cs | 11 + .../Providers/AbstractQuickInfoProvider.cs | 141 + ...tSemanticQuickInfoProvider.ErrorVisitor.cs | 100 + ...emanticQuickInfoProvider.SymbolComparer.cs | 40 + .../AbstractSemanticQuickInfoProvider.cs | 325 + .../QuickInfo/QuickInfoContent.cs | 74 + .../QuickInfo/QuickInfoItem.cs | 18 + .../QuickInfo/QuickInfoService.cs | 96 + .../dnSpy.Roslyn.Internal/RoslynGlyph.cs | 113 + .../SignatureHelp/SignatureHelpItem.cs | 116 + .../SignatureHelp/SignatureHelpItems.cs | 54 + .../SignatureHelp/SignatureHelpParameter.cs | 96 + .../SignatureHelpService.Roslyn.cs | 256 + .../SignatureHelp/SignatureHelpService.cs | 150 + ...ractIndentationService.AbstractIndenter.cs | 234 + .../SmartIndent/AbstractIndentationService.cs | 69 + .../SmartIndent/IIndentationService.cs | 51 + .../dnSpy.Roslyn.Internal.csproj | 18 + .../Dummy.vb | 20 + .../MakeEverythingPublic.vb | 35 + .../My Project/AssemblyInfo.vb | 4 + .../TextStructureNavigatorProvider.vb | 71 + ...y.Roslyn.VisualBasic.EditorFeatures.vbproj | 43 + .../Extensions/EnumerableExtensions2.vb | 14 + .../MakeEverythingPublic.vb | 38 + .../My Project/AssemblyInfo.vb | 3 + .../QuickInfo/SemanticQuickInfoProvider.vb | 183 + .../SmartIndent/SpecialFormattingOperation.vb | 164 + .../VisualBasicIndentationService.Indenter.vb | 306 + .../VisualBasicIndentationService.vb | 122 + .../dnSpy.Roslyn.VisualBasic.Internal.vbproj | 42 + .../Compiler/CSharp/CSharpCompilerSettings.cs | 58 + .../CSharp/CSharpCompilerSettingsImpl.cs | 120 + .../CSharp/CSharpCompilerSettingsPage.cs | 42 + .../CSharpCompilerSettingsPageProvider.cs | 36 + .../Compiler/CSharp/CSharpLanguageCompiler.cs | 131 + .../Compiler/CodeEditorOptionsDefinitions.cs | 34 + .../Compiler/DiagnosticExtensions.cs | 66 + .../dnSpy.Roslyn/Compiler/Extensions.cs | 66 + .../Compiler/FrameworkDetector.cs | 128 + .../Compiler/RoslynCodeDocument.cs | 40 + .../Compiler/RoslynLanguageCompiler.cs | 293 + .../VisualBasicCompilerSettings.cs | 75 + .../VisualBasicCompilerSettingsImpl.cs | 162 + .../VisualBasicCompilerSettingsPage.cs | 42 + ...VisualBasicCompilerSettingsPageProvider.cs | 36 + .../VisualBasicLanguageCompiler.cs | 140 + .../dnSpy.Roslyn/Debugger/AliasConstants.cs | 71 + .../CSharp/CSharpExpressionCompiler.cs | 164 + .../CSharp/GeneratedNames.cs | 35 + .../CSharp/MonoGeneratedNames.cs | 32 + .../ExpressionCompiler/ImageNameUtils.cs | 185 + .../LanguageExpressionCompiler.cs | 572 + .../RoslynExpressionCompilerMethods.cs | 51 + .../VisualBasic/GeneratedNames.cs | 43 + .../VisualBasicExpressionCompiler.cs | 154 + .../DbgFilterExpressionEvaluatorImpl.cs | 240 + .../EvalDelegateCreator.cs | 289 + .../Formatters/CSharp/CSharpFormatter.cs | 39 + .../CSharp/CSharpPrimitiveValueFormatter.cs | 584 + .../CSharp/CSharpStackFrameFormatter.cs | 506 + .../Formatters/CSharp/CSharpTypeFormatter.cs | 420 + .../Formatters/CSharp/CSharpValueFormatter.cs | 207 + .../Debugger/Formatters/CSharp/Operators.cs | 59 + .../DbgValueFormatterOptionsExtensions.cs | 51 + .../DbgValueFormatterTypeOptionsExtensions.cs | 39 + .../DebuggerDisplayAttributeFormatter.cs | 305 + .../Formatters/DictionaryEntryTypeUtils.cs | 36 + .../Debugger/Formatters/EnumInfo.cs | 81 + .../Formatters/KeyValuePairTypeUtils.cs | 66 + .../Debugger/Formatters/LanguageFormatter.cs | 42 + .../Debugger/Formatters/ListCache.cs | 34 + .../Debugger/Formatters/NullableTypeUtils.cs | 57 + .../Debugger/Formatters/NumberUtils.cs | 76 + .../Debugger/Formatters/StateMachineUtils.cs | 155 + .../Debugger/Formatters/ToStringFormatter.cs | 72 + .../Debugger/Formatters/TupleTypeUtils.cs | 86 + .../Formatters/TypeFormatterOptions.cs | 50 + .../Debugger/Formatters/TypeFormatterUtils.cs | 261 + .../Formatters/ValueFormatterOptions.cs | 38 + .../ValueFormatterOptionsExtensions.cs | 68 + .../Formatters/ValueFormatterUtils.cs | 56 + .../Formatters/VisualBasic/Operators.cs | 60 + .../VisualBasic/VisualBasicFormatter.cs | 39 + .../VisualBasicPrimitiveValueFormatter.cs | 617 + .../VisualBasicStackFrameFormatter.cs | 503 + .../VisualBasic/VisualBasicTypeFormatter.cs | 436 + .../VisualBasic/VisualBasicValueFormatter.cs | 207 + .../Debugger/GetLocalsAssemblyBuilder.cs | 273 + .../dnSpy.Roslyn/Debugger/ObjectCache.cs | 79 + .../dnSpy.Roslyn/Debugger/StateWithKey.cs | 62 + .../ValueNodes/AggregateValueNodeProvider.cs | 82 + .../ValueNodes/ArrayValueNodeProvider.cs | 127 + .../CSharp/CSharpValueNodeFactory.cs | 238 + .../CSharp/CSharpValueNodeProviderFactory.cs | 133 + .../CSharp/UnicodeCharacterUtilities.cs | 190 + .../ValueNodes/CSharpDynamicPropertyHelper.cs | 79 + .../Debugger/ValueNodes/ColumnFormatter.cs | 32 + .../ValueNodes/DbgDotNetTypeVariablesNode.cs | 109 + .../ValueNodes/DbgDotNetValueNodeImpl.cs | 139 + .../ValueNodes/DbgDotNetValueNodeInfo.cs | 85 + .../ValueNodes/DbgDotNetValueNodeProvider.cs | 55 + .../DbgDotNetValueNodeProviderFactory.cs | 673 + .../ValueNodes/DebugViewNoResultsValueNode.cs | 88 + .../ValueNodes/DebuggerTypeProxyFinder.cs | 175 + ...ynamicMetaObjectProviderDebugViewHelper.cs | 57 + .../DynamicViewMembersValueNodeProvider.cs | 117 + .../ValueNodes/EnumerableDebugViewHelper.cs | 110 + .../ValueNodes/GeneratedMetadataNames.cs | 20 + .../Debugger/ValueNodes/ImageNameUtils.cs | 176 + .../InstanceMembersValueNodeProvider.cs | 47 + .../ValueNodes/LanguageValueNodeFactory.cs | 273 + .../Debugger/ValueNodes/MemberUtils.cs | 40 + .../ValueNodes/MemberValueNodeInfo.cs | 156 + .../ValueNodes/MembersValueNodeProvider.cs | 341 + .../ValueNodes/PointerValueNodeProvider.cs | 78 + .../ValueNodes/ReflectionAssemblyLoader.cs | 56 + .../ResultsViewMembersValueNodeProvider.cs | 187 + .../ValueNodes/ReturnValueColumnFormatter.cs | 56 + .../StaticMembersValueNodeProvider.cs | 107 + .../Debugger/ValueNodes/SyntheticNullValue.cs | 35 + .../Debugger/ValueNodes/TupleField.cs | 39 + .../ValueNodes/TupleValueNodeProvider.cs | 119 + .../ValueNodes/VisualBasic/SyntaxFacts.cs | 46 + .../VisualBasicValueNodeFactory.cs | 155 + .../VisualBasicValueNodeProviderFactory.cs | 139 + .../IRoslynDocumentationProviderFactory.cs | 34 + .../RoslynDocumentationProvider.cs | 58 + .../RoslynDocumentationProviderFactory.cs | 33 + .../Roslyn/dnSpy.Roslyn/Glyphs/GlyphHelper.cs | 109 + .../Classification/CompletionClassifier.cs | 183 + .../CompletionKindTextColorHelper.cs | 103 + .../Completions/CommandTargetFilter.cs | 254 + .../Completions/CompletionImageHelper.cs | 104 + .../Completions/CompletionInfo.cs | 54 + .../Completions/CompletionKind.cs | 321 + .../Completions/CompletionSource.cs | 81 + .../Completions/CompletionToolTipProvider.cs | 136 + .../Completions/ContentTypeDefinitions.cs | 52 + .../Completions/MruCompletionService.cs | 57 + .../Completions/RoslynCompletion.cs | 57 + .../Completions/RoslynCompletionSet.cs | 198 + .../Completions/RoslynIntellisenseFilters.cs | 60 + .../QuickInfo/CommandTargetFilter.cs | 102 + .../InformationQuickInfoContentControl.xaml | 52 + ...InformationQuickInfoContentControl.xaml.cs | 26 + .../InformationQuickInfoContentVM.cs | 101 + .../QuickInfo/QuickInfoContentCreator.cs | 91 + .../QuickInfo/QuickInfoSession.cs | 119 + .../Intellisense/QuickInfo/QuickInfoSource.cs | 100 + .../Intellisense/QuickInfo/QuickInfoState.cs | 54 + .../QuickInfo/QuickInfoTriggerService.cs | 89 + .../SignatureHelp/CommandTargetFilter.cs | 189 + .../Intellisense/SignatureHelp/Parameter.cs | 78 + .../Intellisense/SignatureHelp/Signature.cs | 163 + .../SignatureHelp/SignatureHelpInfo.cs | 54 + .../SignatureHelp/SignatureHelpSession.cs | 207 + .../SignatureHelp/SignatureHelpSource.cs | 47 + .../SignatureHelp/SignatureHelpTagger.cs | 108 + .../SignatureHelp/SignatureHelpTaggerEx.cs | 132 + .../Optimizations/FirstUseOptimization.cs | 172 + .../dnSpy.Roslyn/Properties/AssemblyInfo.cs | 3 + .../dnSpy.Roslyn.Resources.Designer.cs | 468 + .../Properties/dnSpy.Roslyn.Resources.cs.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.de.resx | 255 + .../dnSpy.Roslyn.Resources.es-ES.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.fa.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.fr.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.hu.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.it.resx | 255 + .../dnSpy.Roslyn.Resources.pt-BR.resx | 255 + .../dnSpy.Roslyn.Resources.pt-PT.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.ru.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.tr.resx | 255 + .../Properties/dnSpy.Roslyn.Resources.uk.resx | 255 + .../dnSpy.Roslyn.Resources.zh-CN.resx | 255 + .../CompletionToolTipTextClassifier.cs | 97 + .../Classification/ContentTypeDefinitions.cs | 33 + .../ITaggedTextElementProvider.cs | 40 + .../ITaggedTextElementProviderService.cs | 33 + .../RoslynClassificationTypes.cs | 228 + .../Text/Classification/RoslynClassifier.cs | 440 + .../Classification/TaggedTextClassifier.cs | 62 + .../TaggedTextClassifierContext.cs | 64 + .../TaggedTextElementProvider.cs | 51 + .../TaggedTextElementProviderService.cs | 46 + .../Text/Classification/TextTagsHelper.cs | 72 + dnSpy/Roslyn/dnSpy.Roslyn/Text/Extensions.cs | 137 + .../dnSpy.Roslyn/Text/RoslynContentTypes.cs | 28 + .../Text/RoslynDocumentChangedService.cs | 45 + .../Text/RoslynMefHostServices.cs | 70 + .../dnSpy.Roslyn/Text/Tagging/AsyncTagger.cs | 330 + .../dnSpy.Roslyn/Text/Tagging/RoslynTagger.cs | 111 + .../Text/Tagging/RoslynTaggerAsyncState.cs | 45 + .../Text/Tagging/RoslynTaggerProvider.cs | 44 + .../Text/TextBufferSourceTextContainer.cs | 53 + .../Text/TextSnapshotSourceText.cs | 44 + .../Text/TextSnapshotTextLineCollection.cs | 43 + .../Themes/wpf.styles.templates.xaml | 55 + dnSpy/Roslyn/dnSpy.Roslyn/dnSpy.Roslyn.csproj | 58 + dnSpy/dnSpy-x86/Program.cs | 35 + dnSpy/dnSpy-x86/dnSpy-x86.csproj | 39 + dnSpy/dnSpy.Console/Program.cs | 1046 ++ .../dnSpy.Console.Resources.Designer.cs | 666 + .../dnSpy.Console.Resources.cs.resx | 321 + .../dnSpy.Console.Resources.de.resx | 321 + .../dnSpy.Console.Resources.es-ES.resx | 321 + .../dnSpy.Console.Resources.fa.resx | 321 + .../dnSpy.Console.Resources.fr.resx | 321 + .../dnSpy.Console.Resources.hu.resx | 321 + .../dnSpy.Console.Resources.it.resx | 321 + .../dnSpy.Console.Resources.pt-BR.resx | 321 + .../dnSpy.Console.Resources.pt-PT.resx | 321 + .../Properties/dnSpy.Console.Resources.resx | 321 + .../dnSpy.Console.Resources.ru.resx | 321 + .../dnSpy.Console.Resources.tr.resx | 321 + .../dnSpy.Console.Resources.uk.resx | 321 + .../dnSpy.Console.Resources.zh-CN.resx | 321 + dnSpy/dnSpy.Console/dnSpy.Console.csproj | 62 + .../Code/DbgDotNetNativeCodeLocation.cs | 59 + .../CorDebugRuntimeKind.cs | 35 + .../CorDebugRuntimeVersion.cs | 58 + .../CorDebugStartDebuggingOptions.cs | 67 + .../CorThreadUserStates.cs | 37 + .../DbgCorDebugInternalRuntime.cs | 47 + .../DotNetFrameworkStartDebuggingOptions.cs | 46 + .../DotNetStartDebuggingOptions.cs | 66 + ....Contracts.Debugger.DotNet.CorDebug.csproj | 23 + .../DbgMonoDebugInternalRuntime.cs | 32 + .../MonoConnectStartDebuggingOptions.cs | 45 + .../MonoConnectStartDebuggingOptionsBase.cs | 66 + .../MonoDebugRuntimeKind.cs | 35 + .../MonoStartDebuggingOptions.cs | 98 + .../MonoStartDebuggingOptionsBase.cs | 84 + .../ThreadStates.cs | 37 + .../UnityConnectStartDebuggingOptions.cs | 45 + .../UnityStartDebuggingOptions.cs | 52 + ...nSpy.Contracts.Debugger.DotNet.Mono.csproj | 23 + .../Code/DbgDotNetBreakpointFactory.cs | 116 + .../Code/DbgAsyncMethodDebugInfo.cs | 62 + .../Code/DbgAsyncStepInfo.cs | 55 + .../Code/DbgCodeRange.cs | 61 + .../Code/DbgCompilerKind.cs | 45 + .../Code/DbgDotNetCodeLocation.cs | 58 + .../Code/DbgDotNetCodeLocationFactory.cs | 47 + .../Code/DbgDotNetDecompilerGuidProvider.cs | 63 + .../Code/DbgDotNetDecompilerService.cs | 40 + .../DbgDotNetInstructionOffsetConstants.cs | 35 + .../Code/DbgILInstruction.cs | 59 + .../Code/DbgILOffsetMapping.cs | 60 + .../Code/DbgILSpan.cs | 148 + .../Code/DbgLocal.cs | 93 + .../Code/DbgMethodDebugInfo.cs | 221 + .../Code/DbgMethodDebugScope.cs | 190 + .../Code/DbgParameter.cs | 49 + .../Code/DbgSourceStatement.cs | 99 + .../Code/DbgTextSpan.cs | 113 + .../Code/IDbgDotNetCodeLocation.cs | 92 + .../DbgDotNetInternalAppDomain.cs | 32 + .../DbgDotNetInternalModule.cs | 32 + .../DbgDotNetInternalRuntime.cs | 33 + .../Disassembly/DbgDotNetNativeCode.cs | 83 + .../Disassembly/DbgDotNetNativeCodeBlock.cs | 62 + .../Evaluation/DbgDotNetAliasInfo.cs | 90 + .../Evaluation/DbgDotNetCustomTypeInfo.cs | 48 + .../Evaluation/DbgDotNetDispatcher.cs | 104 + .../Evaluation/DbgDotNetExceptionInfo.cs | 75 + .../Evaluation/DbgDotNetLanguageGuids.cs | 35 + .../Evaluation/DbgDotNetObjectId.cs | 38 + .../Evaluation/DbgDotNetReturnValueInfo.cs | 55 + .../Evaluation/DbgDotNetRuntimeExtensions.cs | 42 + .../Evaluation/DbgDotNetValue.cs | 214 + .../Evaluation/DbgDotNetValueResult.cs | 89 + .../Evaluation/DbgLanguageDebugInfo.cs | 109 + .../Engine/DbgDotNetEngineObjectIdFactory.cs | 79 + .../Engine/DbgDotNetLanguageService.cs | 35 + .../ExpressionCompiler/DbgDotNetAlias.cs | 99 + .../DbgDotNetCompilationResult.cs | 199 + .../DbgDotNetExpressionCompiler.cs | 187 + .../ExpressionCompiler/DbgModuleReference.cs | 47 + .../PredefinedDecompilerGuids.cs | 35 + .../Formatters/DbgDotNetFormatter.cs | 131 + .../IDebuggerDisplayAttributeEvaluator.cs | 66 + .../Evaluation/IDbgDotNetRuntime.cs | 444 + .../ValueNodes/DbgDotNetValueNode.cs | 153 + .../ValueNodes/DbgDotNetValueNodeFactory.cs | 162 + .../Extensions/DbgAppDomainExtensions.cs | 42 + .../Extensions/DbgModuleExtensions.cs | 42 + .../Extensions/DbgRuntimeExtensions.cs | 42 + .../Extensions/DbgValueExtensions.cs | 34 + .../Extensions/DmdAppDomainExtensions.cs | 34 + .../Extensions/DmdModuleExtensions.cs | 38 + .../Extensions/DmdRuntimeExtensions.cs | 34 + .../Metadata/DbgAssemblyInfoProvider.cs | 42 + .../DbgAssemblyInfoProviderFactory.cs | 32 + .../Metadata/DbgDynamicModuleProvider.cs | 95 + .../DbgDynamicModuleProviderFactory.cs | 32 + .../Metadata/DbgMetadataService.cs | 66 + .../Metadata/DbgModuleIdProvider.cs | 34 + .../Metadata/Internal/DbgRawMetadata.cs | 73 + .../Internal/DbgRawMetadataService.cs | 44 + .../Modules/DbgModuleDotNetExtensions.cs | 32 + .../PredefinedDotNetDbgRuntimeTags.cs | 50 + .../Runtimes/DbgRuntimeDotNetExtensions.cs | 36 + .../Steppers/Engine/DbgDotNetEngineStepper.cs | 196 + .../Engine/DbgDotNetEngineStepperFrameInfo.cs | 53 + .../Engine/DbgEngineStepperFactory.cs | 37 + .../Steppers/Engine/Exceptions.cs | 44 + .../Text/DbgDotNetText.cs | 98 + .../Text/DbgDotNetTextOutput.cs | 66 + .../dnSpy.Contracts.Debugger.DotNet.csproj | 24 + .../AntiAntiDebug/DbgHookedNativeFunction.cs | 54 + .../DbgHookedNativeFunctionProvider.cs | 60 + .../DbgNativeFunctionHookContext.cs | 35 + .../AntiAntiDebug/IDbgNativeFunctionHook.cs | 117 + .../Attach/AttachProgramOptions.cs | 88 + .../Attach/AttachProgramOptionsProvider.cs | 75 + .../AttachProgramOptionsProviderFactory.cs | 60 + .../Attach/AttachableProcess.cs | 88 + .../Attach/AttachableProcessesService.cs | 67 + .../Dialogs/ShowAttachToProcessDialog.cs | 38 + .../ShowAttachToProcessDialogOptions.cs | 66 + ...efinedAttachProgramOptionsProviderNames.cs | 45 + .../AttachToProgramOptions.cs | 40 + .../Code/DbgBoundCodeBreakpoint.cs | 151 + .../Code/DbgBreakpointLocationFormatter.cs | 135 + .../DbgBreakpointLocationFormatterProvider.cs | 68 + .../Breakpoints/Code/DbgCodeBreakpoint.cs | 191 + .../Code/DbgCodeBreakpointDisplaySettings.cs | 78 + .../Code/DbgCodeBreakpointHitCountService.cs | 94 + .../Code/DbgCodeBreakpointOptions.cs | 48 + .../Code/DbgCodeBreakpointSettings.cs | 369 + .../Code/DbgCodeBreakpointsService.cs | 246 + .../ShowCodeBreakpointSettingsService.cs | 46 + .../DbgFilterEEVariableProvider.cs | 50 + .../DbgFilterExpressionEvaluator.cs | 115 + .../TextEditor/DbgBreakpointGlyphFormatter.cs | 66 + ...eakpointGlyphTextMarkerLocationProvider.cs | 61 + .../Modules/DbgModuleBreakpoint.cs | 80 + .../Modules/DbgModuleBreakpointInfo.cs | 79 + .../Modules/DbgModuleBreakpointSettings.cs | 108 + .../Modules/DbgModuleBreakpointsService.cs | 169 + .../CallStack/DbgCallStackService.cs | 115 + .../CallStack/DbgStackFrame.cs | 105 + .../CallStack/DbgStackWalker.cs | 52 + ...rameGlyphTextMarkerLocationInfoProvider.cs | 34 + .../TextEditor/DbgStackFrameTextViewMarker.cs | 47 + .../Code/DbgCodeLocation.cs | 56 + .../Code/DbgCodeLocationSerializer.cs | 75 + .../Code/PredefinedDbgCodeLocationTypes.cs | 35 + .../DbgTextViewCodeLocationProvider.cs | 96 + .../dnSpy.Contracts.Debugger/DbgAppDomain.cs | 63 + .../DbgCollectionChangedEventArgs.cs | 69 + .../dnSpy.Contracts.Debugger/DbgDispatcher.cs | 48 + .../DbgEnvironment.cs | 97 + .../DbgImageLayout.cs | 40 + .../DbgInternalAppDomain.cs | 30 + .../DbgInternalModule.cs | 30 + .../DbgInternalRuntime.cs | 30 + dnSpy/dnSpy.Contracts.Debugger/DbgManager.cs | 463 + .../DbgMessageEventArgs.cs | 795 ++ dnSpy/dnSpy.Contracts.Debugger/DbgModule.cs | 129 + .../DbgModuleMemoryRefreshedNotifier.cs | 55 + dnSpy/dnSpy.Contracts.Debugger/DbgObject.cs | 172 + dnSpy/dnSpy.Contracts.Debugger/DbgProcess.cs | 297 + dnSpy/dnSpy.Contracts.Debugger/DbgRuntime.cs | 205 + .../dnSpy.Contracts.Debugger/DbgStateInfo.cs | 86 + dnSpy/dnSpy.Contracts.Debugger/DbgThread.cs | 176 + .../DebugProgramOptions.cs | 31 + .../DebuggerSettings.cs | 220 + .../Disassembly/DbgNativeCodeProvider.cs | 134 + .../DbgRuntimeNativeCodeProvider.cs | 126 + .../Engine/CallStack/DbgEngineStackFrame.cs | 80 + .../Engine/CallStack/DbgEngineStackWalker.cs | 32 + .../Engine/DbgEngine.cs | 196 + .../Engine/DbgEngineAppDomain.cs | 79 + .../Engine/DbgEngineBoundCodeBreakpoint.cs | 185 + .../Engine/DbgEngineMessage.cs | 316 + .../Engine/DbgEngineMessageFlags.cs | 48 + .../Engine/DbgEngineMessageKind.cs | 77 + .../Engine/DbgEngineModule.cs | 199 + .../Engine/DbgEngineProvider.cs | 61 + .../Engine/DbgEngineRuntimeInfo.cs | 73 + .../Engine/DbgEngineThread.cs | 140 + .../Engine/DbgObjectFactory.cs | 292 + .../DbgEngineExpressionEvaluator.cs | 137 + .../Engine/Evaluation/DbgEngineFormatter.cs | 91 + .../Engine/Evaluation/DbgEngineLanguage.cs | 88 + .../Evaluation/DbgEngineLanguageProvider.cs | 76 + .../Engine/Evaluation/DbgEngineObjectId.cs | 39 + .../Evaluation/DbgEngineObjectIdFactory.cs | 101 + .../Engine/Evaluation/DbgEngineValue.cs | 59 + .../Engine/Evaluation/DbgEngineValueNode.cs | 125 + .../Evaluation/DbgEngineValueNodeFactory.cs | 44 + .../Evaluation/DbgEngineValueNodeProvider.cs | 75 + .../PredefinedEvaluationErrorMessages.cs | 106 + .../Engine/Steppers/DbgEngineStepKind.cs | 40 + .../Engine/Steppers/DbgEngineStepper.cs | 85 + .../Evaluation/DbgEvaluationContext.cs | 62 + .../Evaluation/DbgEvaluationInfo.cs | 71 + .../Evaluation/DbgExpressionEvaluationInfo.cs | 61 + .../Evaluation/DbgExpressionEvaluator.cs | 235 + .../Evaluation/DbgFormatter.cs | 95 + .../Evaluation/DbgLanguage.cs | 140 + .../Evaluation/DbgLanguageService.cs | 79 + .../Evaluation/DbgObjectId.cs | 52 + .../Evaluation/DbgObjectIdService.cs | 123 + .../DbgStackFrameFormatterOptions.cs | 98 + .../Evaluation/DbgValue.cs | 202 + .../Evaluation/DbgValueFormatterOptions.cs | 90 + .../DbgValueFormatterTypeOptions.cs | 58 + .../Evaluation/DbgValueNode.cs | 274 + .../DbgValueNodeEvaluationOptions.cs | 80 + .../Evaluation/DbgValueNodeFactory.cs | 86 + .../Evaluation/DbgValueNodeProvider.cs | 135 + .../Evaluation/PredefinedDbgLanguageNames.cs | 40 + .../PredefinedDbgValueNodeImageNames.cs | 138 + .../Evaluation/PredefinedFormatSpecifiers.cs | 334 + .../Exceptions/DbgException.cs | 75 + .../DbgExceptionCategoryDefinition.cs | 67 + .../DbgExceptionCategoryDefinitionFlags.cs | 48 + .../DbgExceptionConditionSettings.cs | 62 + .../Exceptions/DbgExceptionDefinition.cs | 71 + .../Exceptions/DbgExceptionDefinitionFlags.cs | 43 + .../DbgExceptionDefinitionProvider.cs | 80 + .../Exceptions/DbgExceptionEventFlags.cs | 48 + .../Exceptions/DbgExceptionFormatter.cs | 73 + .../Exceptions/DbgExceptionId.cs | 197 + .../Exceptions/DbgExceptionSettings.cs | 101 + .../Exceptions/DbgExceptionSettingsService.cs | 193 + .../PredefinedExceptionCategories.cs | 35 + .../IDbgManagerStartListener.cs | 34 + .../PredefinedDbgRuntimeGuids.cs | 67 + .../PredefinedDbgRuntimeKindGuids.cs | 37 + .../PredefinedDebugTags.cs | 30 + .../PredefinedThreadKinds.cs | 60 + .../References/DbgLoadModuleReference.cs | 49 + .../DbgLoadModuleReferenceHandler.cs | 90 + dnSpy/dnSpy.Contracts.Debugger/RuntimeId.cs | 38 + .../StartDebugging/DbgProcessStarter.cs | 101 + ...dStartDebuggingOptionsPageDisplayOrders.cs | 55 + .../Dialog/StartDebuggingOptionsPage.cs | 177 + .../StartDebuggingOptionsPageContext.cs | 38 + .../StartDebuggingOptionsPageProvider.cs | 34 + .../GenericDebugEngineGuidProvider.cs | 80 + .../PredefinedGenericDebugEngineGuids.cs | 42 + .../StartDebuggingOptions.cs | 63 + .../Steppers/DbgStepKind.cs | 55 + .../Steppers/DbgStepper.cs | 105 + .../Text/DbgStringBuilderTextWriter.cs | 75 + .../Text/DbgTextColor.cs | 72 + .../Text/DnSpy/ColorConverter.cs | 119 + .../DnSpy/DbgTextClassifierTextColorWriter.cs | 78 + .../Text/DnSpy/DbgTextColorWriter.cs | 53 + .../Text/IDbgTextWriter.cs | 32 + .../ThreadCategoryProvider.cs | 85 + .../dnSpy.Contracts.Debugger.csproj | 26 + .../App/AppDirectories.cs | 82 + .../App/IAppCommandLineArgs.cs | 116 + .../App/IAppCommandLineArgsHandler.cs | 36 + .../App/IAppStatusBar.cs | 41 + dnSpy/dnSpy.Contracts.DnSpy/App/IAppWindow.cs | 88 + dnSpy/dnSpy.Contracts.DnSpy/App/IDsLoader.cs | 73 + .../App/IMessageBoxService.cs | 73 + .../dnSpy.Contracts.DnSpy/App/IOpenFromGAC.cs | 43 + .../App/LoaderConstants.cs | 37 + dnSpy/dnSpy.Contracts.DnSpy/App/MsgBox.cs | 40 + .../dnSpy.Contracts.DnSpy/App/MsgBoxButton.cs | 39 + .../AsmEditor/Compiler/CompilationKind.cs | 50 + .../AsmEditor/Compiler/CompilationResult.cs | 73 + .../AsmEditor/Compiler/CompilerDiagnostic.cs | 100 + .../Compiler/CompilerDiagnosticSeverity.cs | 45 + .../Compiler/CompilerDocumentInfo.cs | 47 + .../Compiler/CompilerMetadataReference.cs | 85 + .../AsmEditor/Compiler/CompilerProjectInfo.cs | 68 + .../AsmEditor/Compiler/DebugFileFormat.cs | 45 + .../AsmEditor/Compiler/DebugFileResult.cs | 45 + .../Compiler/IAssemblyReferenceResolver.cs | 34 + .../AsmEditor/Compiler/ICodeDocument.cs | 43 + .../AsmEditor/Compiler/ILanguageCompiler.cs | 73 + .../Compiler/ILanguageCompilerProvider.cs | 59 + .../AsmEditor/Compiler/LineLocation.cs | 57 + .../AsmEditor/Compiler/LineLocationSpan.cs | 51 + .../AsmEditor/Compiler/TargetPlatform.cs | 60 + ...ackgroundImageOptionDefinitionConstants.cs | 93 + .../BackgroundImage/DefaultImageSettings.cs | 114 + .../IBackgroundImageOptionDefinition.cs | 95 + .../BackgroundImage/ImagePlacement.cs | 70 + .../Bookmarks/BMObject.cs | 166 + .../Bookmarks/Bookmark.cs | 62 + .../Bookmarks/BookmarkDisplaySettings.cs | 78 + .../Bookmarks/BookmarkLocation.cs | 44 + .../Bookmarks/BookmarkLocationFormatter.cs | 135 + .../BookmarkLocationFormatterProvider.cs | 67 + .../Bookmarks/BookmarkLocationSerializer.cs | 75 + .../Bookmarks/BookmarkSettings.cs | 98 + .../Bookmarks/BookmarksService.cs | 204 + .../Bookmarks/BookmarksSettings.cs | 44 + .../Bookmarks/CollectionChangedEventArgs.cs | 69 + .../Bookmarks/DotNet/DotNetBookmarkFactory.cs | 153 + .../DotNet/DotNetBookmarkLocation.cs | 57 + .../Bookmarks/Navigator/BookmarkDocument.cs | 38 + .../Navigator/BookmarkDocumentProvider.cs | 60 + .../Bookmarks/Navigator/BookmarkNavigator.cs | 97 + .../PredefinedBookmarkLocationTypes.cs | 35 + ...BookmarkGlyphTextMarkerLocationProvider.cs | 61 + .../TextViewBookmarkLocationProvider.cs | 78 + .../Command/BookmarkIds.cs | 85 + .../Command/BookmarkIdsExtensions.cs | 40 + .../Command/CommandConstants.cs | 48 + .../Command/CommandInfo.cs | 54 + .../Command/CommandInfoProviderOrder.cs | 52 + .../Command/CommandShortcut.cs | 47 + .../Command/CommandTargetCommand.cs | 70 + .../Command/CommandTargetFilterOrder.cs | 82 + .../Command/CommandTargetStatus.cs | 40 + .../Command/HexEditorIds.cs | 394 + .../Command/HexEditorIdsExtensions.cs | 40 + .../Command/ICommandHolder.cs | 32 + .../Command/ICommandInfoProvider.cs | 72 + .../Command/ICommandService.cs | 35 + .../Command/ICommandTarget.cs | 55 + .../Command/ICommandTargetCollection.cs | 38 + .../ICommandTargetCollectionProvider.cs | 30 + .../Command/ICommandTargetFilter.cs | 33 + .../Command/ICommandTargetFilterProvider.cs | 58 + .../Command/IRegisteredCommandElement.cs | 32 + .../dnSpy.Contracts.DnSpy/Command/KeyInput.cs | 80 + .../Command/KeyShortcut.cs | 58 + .../Command/OutputTextPaneIds.cs | 32 + .../Command/OutputTextPaneIdsExtensions.cs | 40 + .../dnSpy.Contracts.DnSpy/Command/ReplIds.cs | 75 + .../Command/ReplIdsExtensions.cs | 40 + .../Command/StandardIds.cs | 95 + .../Command/StandardIdsExtensions.cs | 40 + .../Command/TextEditorIds.cs | 446 + .../Command/TextEditorIdsExtensions.cs | 40 + .../Command/TextReferenceIds.cs | 55 + .../Command/TextReferenceIdsExtensions.cs | 40 + .../Controls/ControlConstants.cs | 106 + .../Controls/FastTextBlock.cs | 221 + .../Controls/FontUtilities.cs | 228 + .../Controls/IFocusable.cs | 35 + .../Controls/IUIObjectProvider.cs | 53 + .../Controls/IWpfCommandService.cs | 49 + .../Controls/IWpfCommands.cs | 64 + .../Controls/IWpfFocusChecker.cs | 33 + .../Controls/IWpfFocusService.cs | 41 + .../Controls/IZoomable.cs | 40 + .../Controls/MetroWindow.cs | 776 ++ .../Controls/MetroWindowCreatedEventArgs.cs | 38 + .../Controls/TextControl.cs | 61 + .../ToolWindows/EditValueControl.xaml | 23 + .../ToolWindows/EditValueControl.xaml.cs | 235 + .../ToolWindows/EditValueProviderService.cs | 253 + .../Controls/ToolWindows/IEditValue.cs | 72 + .../Controls/ToolWindows/IEditableValue.cs | 164 + .../ToolWindows/ListBoxSelectedItemsAP.cs | 152 + .../Controls/WindowBase.cs | 57 + .../Decompiler/IDecompilerService.cs | 57 + .../Decompiler/IMethodDebugService.cs | 148 + .../Disassembly/ISymbolResolver.cs | 97 + .../Disassembly/IX86DisassemblySettings.cs | 281 + .../Disassembly/MemorySizeOptions.cs | 45 + .../Disassembly/NativeCode.cs | 95 + .../Disassembly/NativeCodeBlock.cs | 61 + .../Disassembly/NativeCodeBlockKind.cs | 45 + .../Disassembly/NativeCodeKind.cs | 55 + .../Disassembly/NativeCodeOptimization.cs | 40 + .../Disassembly/NativeVariableInfo.cs | 54 + .../Disassembly/NumberBase.cs | 45 + .../Disassembly/Viewer/DisassemblyContent.cs | 72 + .../DisassemblyContentFormatterOptions.cs | 73 + .../Viewer/DisassemblyContentProvider.cs | 60 + .../DisassemblyContentProviderFactory.cs | 35 + .../Viewer/DisassemblyContentSettings.cs | 93 + .../Disassembly/Viewer/DisassemblyText.cs | 96 + .../Viewer/DisassemblyViewerService.cs | 43 + .../DisassemblyViewerServiceSettings.cs | 43 + .../Disassembly/X86NativeCodeInfo.cs | 39 + .../Disassembly/X86Register.cs | 269 + .../Disassembly/X86Variable.cs | 112 + .../Documents/AnnotationsImpl.cs | 42 + .../Documents/DocumentConstants.cs | 63 + .../Documents/DotNetReferences.cs | 89 + .../Documents/DsDocument.cs | 340 + .../Documents/DsDocumentInfo.cs | 112 + .../Documents/FilenameKey.cs | 79 + .../Documents/IAnnotations.cs | 55 + .../Documents/IDsDocument.cs | 207 + .../Documents/IDsDocumentNameKey.cs | 26 + .../Documents/IDsDocumentProvider.cs | 47 + .../Documents/IDsDocumentService.cs | 203 + .../Documents/IDsDocumentServiceProvider.cs | 31 + .../Documents/IDsDotNetDocument.cs | 26 + .../Documents/IDsPEDocument.cs | 26 + .../Documents/IInMemoryDocument.cs | 31 + .../Documents/IMethodAnnotations.cs | 41 + ...otifyDocumentCollectionChangedEventArgs.cs | 99 + .../Documents/NotifyDocumentCollectionType.cs | 40 + .../Documents/ReferenceNavigator.cs | 117 + .../dnSpy.Contracts.DnSpy/Documents/TList.cs | 162 + .../Documents/Tabs/AsyncDocumentTabContent.cs | 48 + ...aultDocumentTabContentProviderConstants.cs | 30 + .../Tabs/DocViewer/DocumentViewerContent.cs | 102 + .../DocViewer/DocumentViewerContentDataIds.cs | 54 + .../DocViewer/DocumentViewerExtensions.cs | 42 + .../DocumentViewerListenerConstants.cs | 52 + .../Tabs/DocViewer/IDecompileNode.cs | 61 + .../DocViewer/IDecompileNodeCollection.cs | 61 + .../Tabs/DocViewer/IDecompileNodeContext.cs | 70 + .../Tabs/DocViewer/IDecompileSelf.cs | 35 + .../Tabs/DocViewer/IDocumentViewer.cs | 189 + .../IDocumentViewerCustomDataContext.cs | 58 + .../IDocumentViewerCustomDataProvider.cs | 62 + .../Tabs/DocViewer/IDocumentViewerOutput.cs | 52 + .../DocViewer/IDocumentViewerPostProcessor.cs | 65 + .../IDocumentViewerPostProcessorContext.cs | 47 + ...IDocumentViewerReferenceEnablerProvider.cs | 76 + .../Tabs/DocViewer/IDocumentViewerService.cs | 201 + .../Tabs/DocViewer/IDocumentWriter.cs | 34 + .../Tabs/DocViewer/IDocumentWriterProvider.cs | 36 + .../Tabs/DocViewer/IDocumentWriterService.cs | 36 + .../Tabs/DocViewer/MoveCaretOptions.cs | 48 + .../PredefinedDocumentWriterProviderNames.cs | 30 + .../Tabs/DocViewer/ReferenceAndId.cs | 48 + .../Documents/Tabs/DocViewer/ReferenceInfo.cs | 136 + .../Documents/Tabs/DocViewer/TextReference.cs | 108 + .../ToolTips/ICodeToolTipProvider.cs | 55 + .../DocViewer/ToolTips/ICodeToolTipWriter.cs | 58 + .../IDocumentViewerToolTipProvider.cs | 65 + .../IDocumentViewerToolTipProviderContext.cs | 44 + .../Tabs/DocumentModifiedEventArgs.cs | 38 + .../Documents/Tabs/DocumentTabContent.cs | 103 + .../Tabs/DocumentTabReferenceResult.cs | 54 + .../Documents/Tabs/DocumentTabUIContext.cs | 103 + .../Documents/Tabs/IAsyncShowContext.cs | 37 + .../Documents/Tabs/IAsyncShowResult.cs | 43 + .../Documents/Tabs/IDecompilerTabContent.cs | 32 + .../IDefaultDocumentTabContentProvider.cs | 57 + .../Documents/Tabs/IDocumentListListener.cs | 82 + .../Documents/Tabs/IDocumentTab.cs | 149 + .../Tabs/IDocumentTabContentFactory.cs | 78 + .../Tabs/IDocumentTabContentFactoryContext.cs | 32 + .../Documents/Tabs/IDocumentTabService.cs | 148 + .../Tabs/IDocumentTabUIContextLocator.cs | 61 + .../Tabs/IDocumentTabUIContextProvider.cs | 66 + .../IReferenceDocumentTabContentProvider.cs | 60 + .../Documents/Tabs/IReferenceHandler.cs | 58 + .../Tabs/IReferenceHandlerContext.cs | 40 + .../Documents/Tabs/ISaveService.cs | 45 + .../Documents/Tabs/IShowContext.cs | 47 + .../Documents/Tabs/ITabSaver.cs | 40 + .../Documents/Tabs/ITabSaverProvider.cs | 58 + .../Documents/Tabs/ShowTabContentEventArgs.cs | 78 + .../Documents/Tabs/TabConstants.cs | 86 + .../TreeView/AssemblyDocumentNode.cs | 49 + .../TreeView/AssemblyReferenceNode.cs | 41 + .../Documents/TreeView/BaseTypeFolderNode.cs | 36 + .../Documents/TreeView/BaseTypeNode.cs | 41 + .../Documents/TreeView/DerivedTypeNode.cs | 41 + .../TreeView/DerivedTypesFolderNode.cs | 31 + .../Documents/TreeView/DocumentFilterType.cs | 32 + .../TreeView/DocumentNodeWriteOptions.cs | 44 + .../DocumentTreeNodeActivatedEventArgs.cs | 43 + .../TreeView/DocumentTreeNodeData.cs | 485 + .../TreeView/DocumentTreeNodeFilterResult.cs | 45 + .../TreeView/DocumentTreeNodeGroupType.cs | 63 + .../TreeView/DocumentTreeViewConstants.cs | 309 + .../Documents/TreeView/DsDocumentNode.cs | 50 + .../Documents/TreeView/EventNode.cs | 49 + .../Documents/TreeView/FieldNode.cs | 42 + .../Documents/TreeView/FilterType.cs | 34 + .../TreeView/IDocumentTreeNodeDataContext.cs | 94 + .../TreeView/IDocumentTreeNodeDataFinder.cs | 59 + .../TreeView/IDocumentTreeNodeFilter.cs | 215 + .../TreeView/IDocumentTreeNodeGroups.cs | 34 + .../TreeView/IDocumentTreeNodeProvider.cs | 119 + .../Documents/TreeView/IDocumentTreeView.cs | 211 + .../TreeView/IDocumentTreeViewProvider.cs | 32 + .../TreeView/IDocumentTreeViewSettings.cs | 75 + .../TreeView/IDsDocumentNodeProvider.cs | 60 + .../Documents/TreeView/MemberKind.cs | 36 + .../Documents/TreeView/MessageNode.cs | 36 + .../Documents/TreeView/MethodNode.cs | 42 + .../Documents/TreeView/ModuleDocumentNode.cs | 57 + .../Documents/TreeView/ModuleReferenceNode.cs | 42 + .../Documents/TreeView/NamespaceNode.cs | 45 + .../Documents/TreeView/NodeFormatter.cs | 346 + .../Documents/TreeView/NodePathName.cs | 84 + .../NotifyDocumentTreeViewCollection.cs | 40 + ...umentTreeViewCollectionChangedEventArgs.cs | 76 + .../Documents/TreeView/PEDocumentNode.cs | 40 + .../Documents/TreeView/PropertyNode.cs | 49 + .../TreeView/ReferencesFolderNode.cs | 41 + .../Resources/BuiltInResourceElementNode.cs | 37 + .../TreeView/Resources/Deserializer.cs | 101 + .../TreeView/Resources/GuessFileType.cs | 152 + .../Resources/IResourceDataProvider.cs | 175 + .../Resources/IResourceNodeFactory.cs | 47 + .../Resources/IResourceNodeProvider.cs | 71 + .../TreeView/Resources/ImageListOptions.cs | 78 + .../Resources/ImageResourceElementNode.cs | 37 + .../TreeView/Resources/ImageResourceNode.cs | 37 + .../Resources/ImageResourceUtilities.cs | 58 + .../TreeView/Resources/ResourceData.cs | 52 + .../TreeView/Resources/ResourceDataType.cs | 35 + .../TreeView/Resources/ResourceElementNode.cs | 399 + .../Resources/ResourceElementSetNode.cs | 43 + .../TreeView/Resources/ResourceNode.cs | 245 + .../TreeView/Resources/ResourceUtilities.cs | 162 + .../TreeView/Resources/SaveResources.cs | 198 + .../Resources/SerializationUtilities.cs | 144 + ...zedImageListStreamerResourceElementNode.cs | 43 + .../SerializedImageListStreamerUtilities.cs | 151 + .../SerializedImageResourceElementNode.cs | 43 + .../Resources/SerializedImageUtilities.cs | 123 + .../SerializedResourceElementNode.cs | 138 + .../TreeView/Resources/UnknownResourceNode.cs | 37 + .../UnknownSerializedResourceElementNode.cs | 43 + .../Documents/TreeView/ResourcesFolderNode.cs | 31 + .../Documents/TreeView/TypeNode.cs | 77 + .../TreeView/TypeReferencesFolderNode.cs | 166 + .../Documents/TreeView/UnknownDocumentNode.cs | 34 + .../ETW/DnSpyEventSource.cs | 65 + .../Extension/ExtensionEvent.cs | 40 + .../Extension/ExtensionInfo.cs | 37 + .../Extension/IAutoLoaded.cs | 83 + .../Extension/IExtension.cs | 68 + .../Hex/Adornments/HexToolTipProvider.cs | 72 + .../Adornments/HexToolTipProviderFactory.cs | 39 + .../DnSpy/HexTextElementCreator.cs | 52 + .../DnSpy/HexTextElementCreatorProvider.cs | 44 + .../HexClassificationChangedEventArgs.cs | 42 + .../HexClassificationContext.cs | 57 + .../HexClassificationFormatMapService.cs | 47 + .../Classification/HexClassificationSpan.cs | 49 + .../Hex/Classification/HexClassifier.cs | 65 + .../HexClassifierAggregatorService.cs | 37 + .../HexEditorFormatMapService.cs | 47 + .../HexViewClassifierAggregatorService.cs | 39 + .../DefaultHexEditorOptionDefinitions.cs | 29 + .../DefaultHexViewEditorOptionDefinitions.cs | 199 + ...faultHexViewHostEditorOptionDefinitions.cs | 53 + .../Hex/Editor/DefaultHexViewHostOptions.cs | 42 + .../Hex/Editor/DefaultHexViewOptions.cs | 90 + ...efaultWpfHexViewEditorOptionDefinitions.cs | 66 + .../Hex/Editor/DefaultWpfHexViewOptions.cs | 47 + .../Hex/Editor/HexAdornmentLayer.cs | 168 + .../Hex/Editor/HexAdornmentLayerDefinition.cs | 26 + .../Hex/Editor/HexAdornmentLayerElement.cs | 58 + .../Hex/Editor/HexCaret.cs | 304 + .../Hex/Editor/HexCaretPosition.cs | 88 + .../Hex/Editor/HexColumnLineKind.cs | 55 + .../Hex/Editor/HexCursorProvider.cs | 135 + .../Hex/Editor/HexEditorFactoryService.cs | 127 + .../Editor/HexEditorFactoryServiceListener.cs | 36 + .../Hex/Editor/HexEditorOptionDefinition.cs | 125 + .../Editor/HexEditorOptionsFactoryService.cs | 51 + .../Hex/Editor/HexGlyphFactory.cs | 41 + .../Hex/Editor/HexGlyphFactoryProvider.cs | 38 + .../Editor/HexGlyphMouseProcessorProvider.cs | 38 + .../Hex/Editor/HexGlyphTag.cs | 32 + .../HexGroups/HexEditorGroupFactoryService.cs | 49 + .../Hex/Editor/HexGroups/LocalGroupOptions.cs | 170 + .../Hex/Editor/HexImageReferenceTag.cs | 47 + .../Hex/Editor/HexIntraTextAdornmentTag.cs | 105 + .../Hex/Editor/HexKeyProcessor.cs | 97 + .../Hex/Editor/HexKeyProcessorProvider.cs | 37 + .../Hex/Editor/HexLayerKind.cs | 40 + .../Hex/Editor/HexLayerKindAttribute.cs | 38 + .../HexMarginContextMenuHandlerProvider.cs | 58 + .../Hex/Editor/HexMarginContextMenuService.cs | 42 + .../Hex/Editor/HexMarginNameAttribute.cs | 39 + .../Hex/Editor/HexMarkerServiceZIndexes.cs | 51 + .../Hex/Editor/HexMouseHoverAttribute.cs | 43 + .../Hex/Editor/HexMouseHoverEventArgs.cs | 56 + .../Hex/Editor/HexMouseProcessor.cs | 309 + .../Hex/Editor/HexMouseProcessorProvider.cs | 37 + .../Hex/Editor/HexReferenceConverter.cs | 38 + .../Hex/Editor/HexReferenceHandler.cs | 43 + .../Hex/Editor/HexReferenceHandlerService.cs | 41 + .../Hex/Editor/HexScrollMap.cs | 59 + .../Hex/Editor/HexScrollMapFactoryService.cs | 37 + .../Hex/Editor/HexSelection.cs | 123 + .../Hex/Editor/HexSpaceReservationAgent.cs | 65 + .../Hex/Editor/HexSpaceReservationManager.cs | 182 + .../HexSpaceReservationManagerDefinition.cs | 26 + .../Hex/Editor/HexStructureInfoAggregator.cs | 75 + .../HexStructureInfoAggregatorFactory.cs | 37 + .../Hex/Editor/HexStructureInfoProvider.cs | 115 + .../Editor/HexStructureInfoProviderAndData.cs | 53 + .../Editor/HexStructureInfoProviderFactory.cs | 41 + .../Hex/Editor/HexVerticalFractionMap.cs | 56 + .../Hex/Editor/HexView.cs | 290 + .../Hex/Editor/HexViewCreatedEventArgs.cs | 38 + .../Hex/Editor/HexViewCreationListener.cs | 36 + .../Hex/Editor/HexViewCreatorOptions.cs | 64 + .../Editor/HexViewLayoutChangedEventArgs.cs | 111 + .../Hex/Editor/HexViewLineCollection.cs | 119 + .../Hex/Editor/HexViewMargin.cs | 59 + .../Hex/Editor/HexViewScroller.cs | 111 + .../Hex/Editor/HexViewState.cs | 92 + .../DefaultHexViewHostOptionsExtensions.cs | 94 + .../DefaultHexViewOptionsExtensions.cs | 365 + .../DefaultWpfHexViewOptionsExtensions.cs | 94 + .../Editor/PredefinedHexAdornmentLayers.cs | 44 + .../PredefinedHexGlyphFactoryProviderNames.cs | 30 + .../Hex/Editor/PredefinedHexMarginNames.cs | 48 + .../PredefinedHexReferenceHandlerNames.cs | 30 + .../PredefinedHexReferenceHandlerTags.cs | 30 + ...edefinedHexSpaceReservationManagerNames.cs | 32 + ...nedHexStructureInfoProviderFactoryNames.cs | 32 + .../Hex/Editor/PredefinedHexViewRoles.cs | 49 + .../Hex/Editor/WpfHexView.cs | 97 + .../Hex/Editor/WpfHexViewCreationListener.cs | 36 + .../Hex/Editor/WpfHexViewHost.cs | 65 + .../Hex/Editor/WpfHexViewLineCollection.cs | 172 + .../Hex/Editor/WpfHexViewMargin.cs | 37 + .../Hex/Editor/WpfHexViewMarginProvider.cs | 38 + .../Hex/Files/BasicData.cs | 924 ++ .../Hex/Files/BufferData.cs | 626 + .../Hex/Files/BufferField.cs | 138 + .../Hex/Files/BufferFileHeadersProvider.cs | 36 + .../Files/BufferFileHeadersProviderFactory.cs | 37 + .../Hex/Files/BufferFileOptions.cs | 66 + .../Hex/Files/BufferFilesEventArgs.cs | 64 + .../DnSpy/HexFileImageReferenceProvider.cs | 40 + .../Hex/Files/DnSpy/ToolTipCreator.cs | 43 + .../Hex/Files/DnSpy/ToolTipCreatorFactory.cs | 36 + .../Hex/Files/DnSpy/ToolTipObjectFactory.cs | 39 + .../Hex/Files/DotNet/Bit7EncodedInt32Data.cs | 50 + .../Hex/Files/DotNet/Bit7EncodedStringData.cs | 64 + .../Hex/Files/DotNet/BlobEncodedUInt32Data.cs | 50 + .../Hex/Files/DotNet/CodedToken.cs | 234 + .../Hex/Files/DotNet/ColumnInfo.cs | 76 + .../Hex/Files/DotNet/ColumnSize.cs | 178 + .../Hex/Files/DotNet/DotNetCor20Data.cs | 62 + .../Files/DotNet/DotNetEmbeddedResource.cs | 61 + .../Hex/Files/DotNet/DotNetHeaders.cs | 62 + .../Hex/Files/DotNet/DotNetHeap.cs | 424 + .../Hex/Files/DotNet/DotNetHeapKind.cs | 65 + .../Files/DotNet/DotNetMetadataHeaderData.cs | 58 + .../Hex/Files/DotNet/DotNetMetadataHeaders.cs | 85 + .../Hex/Files/DotNet/DotNetMethodBodyData.cs | 423 + .../Hex/Files/DotNet/DotNetMethodProvider.cs | 51 + .../DotNetMultiFileResourceHeaderData.cs | 66 + .../Files/DotNet/DotNetMultiFileResources.cs | 55 + .../Files/DotNet/DotNetResourceProvider.cs | 57 + .../Hex/Files/DotNet/DotNetStorageStream.cs | 42 + .../Hex/Files/DotNet/HeapData.cs | 578 + .../Hex/Files/DotNet/MDStreamFlags.cs | 45 + .../Hex/Files/DotNet/MDTable.cs | 95 + .../Hex/Files/DotNet/MDToken.cs | 185 + .../DotNet/MultiResourceDataHeaderData.cs | 281 + .../MultiResourceUnicodeNameAndOffsetData.cs | 63 + .../Hex/Files/DotNet/PdbStreamHeaderData.cs | 44 + .../Files/DotNet/PredefinedDotNetDataIds.cs | 37 + .../Hex/Files/DotNet/ResourceTypeCode.cs | 127 + .../Hex/Files/DotNet/ResourceTypeCodeData.cs | 123 + .../Hex/Files/DotNet/SimpleData.cs | 149 + .../Hex/Files/DotNet/StructureData.cs | 102 + .../Hex/Files/DotNet/Table.cs | 135 + .../Hex/Files/DotNet/TableInfo.cs | 66 + .../Hex/Files/DotNet/TableRecordData.cs | 89 + .../Hex/Files/DotNet/TablesHeaderData.cs | 56 + .../Hex/Files/DotNet/TablesHeapType.cs | 35 + .../Hex/Files/DotNet/TokenData.cs | 323 + .../Hex/Files/DotNet/Utils.cs | 51 + .../Hex/Files/EnumFieldInfo.cs | 47 + .../Hex/Files/FlagInfo.cs | 91 + .../Hex/Files/HexBufferFile.cs | 204 + .../Hex/Files/HexBufferFileService.cs | 141 + .../Hex/Files/HexBufferFileServiceFactory.cs | 60 + .../Hex/Files/HexFieldFormatter.cs | 208 + .../Hex/Files/HexFieldFormatterFactory.cs | 50 + .../Hex/Files/HexFieldFormatterOptions.cs | 48 + .../Hex/Files/HexFileStructureInfoProvider.cs | 105 + .../HexFileStructureInfoProviderFactory.cs | 42 + .../Hex/Files/HexFileStructureInfoService.cs | 59 + .../HexFileStructureInfoServiceFactory.cs | 39 + .../Hex/Files/HexNumberOptions.cs | 73 + .../Hex/Files/IBufferFileHeaders.cs | 26 + .../Hex/Files/PE/DataDirectoryData.cs | 66 + .../Hex/Files/PE/PeDosHeaderData.cs | 74 + .../Hex/Files/PE/PeFileHeaderData.cs | 50 + .../Hex/Files/PE/PeFileLayoutProvider.cs | 60 + .../Hex/Files/PE/PeHeaders.cs | 87 + .../Hex/Files/PE/PeOptionalHeaderData.cs | 154 + .../Hex/Files/PE/PeSectionsData.cs | 72 + .../Hex/Files/PE/PredefinedPeDataIds.cs | 37 + .../Hex/Files/PE/SimpleData.cs | 140 + .../Hex/Files/PredefinedBufferFileTags.cs | 50 + ...exFileStructureInfoProviderFactoryNames.cs | 40 + ...PredefinedStructureProviderFactoryNames.cs | 40 + .../Hex/Files/StructureProvider.cs | 65 + .../Hex/Files/StructureProviderFactory.cs | 41 + .../Hex/Files/ToolTips/HexToolTipContent.cs | 48 + .../ToolTips/HexToolTipContentCreator.cs | 52 + .../HexToolTipContentCreatorFactory.cs | 36 + .../FormattedHexSourceFactoryService.cs | 55 + .../Hex/Formatting/HexAdornmentElement.cs | 72 + .../Formatting/HexAndAdornmentCollection.cs | 61 + .../Formatting/HexAndAdornmentSequencer.cs | 76 + .../HexAndAdornmentSequencerFactoryService.cs | 39 + .../Hex/Formatting/HexFormattedLine.cs | 91 + .../Hex/Formatting/HexFormattedLineSource.cs | 81 + .../Hex/Formatting/HexHtmlBuilderService.cs | 78 + .../Hex/Formatting/HexLineTransformSource.cs | 42 + .../HexLineTransformSourceProvider.cs | 39 + .../Hex/Formatting/HexSequenceElement.cs | 42 + .../Hex/Formatting/HexViewLine.cs | 295 + .../Hex/Formatting/NullHexClassifier.cs | 43 + .../Hex/Formatting/WpfHexViewLine.cs | 51 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBuffer.cs | 720 ++ .../Hex/HexBufferCreatedEventArgs.cs | 38 + .../Hex/HexBufferFactoryService.cs | 99 + .../Hex/HexBufferLine.cs | 632 + .../Hex/HexBufferLineFormatter.cs | 297 + .../HexBufferLineFormatterFactoryService.cs | 38 + .../Hex/HexBufferLineFormatterOptions.cs | 225 + .../Hex/HexBufferPoint.cs | 148 + .../Hex/HexBufferSpan.cs | 318 + .../Hex/HexBufferSpanEventArgs.cs | 42 + .../Hex/HexBufferSpanSelection.cs | 80 + .../Hex/HexBufferStream.cs | 306 + .../Hex/HexBufferStreamFactoryService.cs | 84 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBytes.cs | 426 + .../Hex/HexCachedBufferStream.cs | 41 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexCell.cs | 124 + .../Hex/HexCellCollection.cs | 159 + .../Hex/HexCellPosition.cs | 107 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexChange.cs | 85 + .../Hex/HexChangeImpl.cs | 80 + .../Hex/HexColumnPosition.cs | 122 + .../Hex/HexColumnType.cs | 40 + .../Hex/HexContentChangedEventArgs.cs | 40 + .../Hex/HexContentChangingEventArgs.cs | 66 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexEdit.cs | 169 + .../Hex/HexGroupInformation.cs | 59 + .../Hex/HexLinePositionInfo.cs | 178 + .../Hex/HexLinePositionInfoType.cs | 55 + .../dnSpy.Contracts.DnSpy/Hex/HexLineSpan.cs | 79 + .../Hex/HexOffsetFormat.cs | 45 + .../dnSpy.Contracts.DnSpy/Hex/HexPosition.cs | 260 + .../Hex/HexPositionConverter.cs | 51 + .../Hex/HexSimpleBufferStream.cs | 134 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexSpan.cs | 190 + .../dnSpy.Contracts.DnSpy/Hex/HexSpanInfo.cs | 68 + .../Hex/HexSpanSelectionFlags.cs | 88 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexTags.cs | 55 + .../Hex/HexValuesDisplayFormat.cs | 190 + dnSpy/dnSpy.Contracts.DnSpy/Hex/HexVersion.cs | 55 + .../Hex/HexVersionChangedEventArgs.cs | 54 + .../Intellisense/HexIntellisenseController.cs | 38 + .../HexIntellisenseControllerProvider.cs | 39 + .../Intellisense/HexIntellisensePresenter.cs | 45 + .../HexIntellisensePresenterProvider.cs | 37 + .../Intellisense/HexIntellisenseSession.cs | 100 + .../HexIntellisenseSessionStack.cs | 65 + .../HexIntellisenseSessionStackMapService.cs | 39 + ...ntellisenseSpaceReservationManagerNames.cs | 32 + .../Hex/Intellisense/HexQuickInfoBroker.cs | 72 + .../Hex/Intellisense/HexQuickInfoSession.cs | 58 + .../Hex/Intellisense/HexQuickInfoSource.cs | 51 + .../HexQuickInfoSourceProvider.cs | 39 + .../IHexCustomIntellisensePresenter.cs | 30 + .../IHexInteractiveQuickInfoContent.cs | 35 + .../IHexPopupIntellisensePresenter.cs | 71 + ...efinedHexIntellisensePresenterProviders.cs | 30 + .../Hex/NormalizedHexBufferSpanCollection.cs | 280 + .../Hex/NormalizedHexChangeCollection.cs | 177 + .../Hex/NormalizedHexSpanCollection.cs | 186 + .../Hex/Operations/HexEditorOperations.cs | 503 + .../HexEditorOperationsFactoryService.cs | 39 + .../Hex/Operations/HexFindOptions.cs | 48 + .../Hex/Operations/HexSearchService.cs | 87 + .../Operations/HexSearchServiceProvider.cs | 299 + .../Hex/PositionAndData.cs | 54 + .../Hex/PredefinedHexBufferTags.cs | 35 + .../Tagging/HexBatchedTagsChangedEventArgs.cs | 44 + .../HexBufferTagAggregatorFactoryService.cs | 38 + .../Hex/Tagging/HexClassificationTag.cs | 39 + .../Hex/Tagging/HexMarkerTag.cs | 39 + .../HexSpaceNegotiatingAdornmentTag.cs | 89 + .../Hex/Tagging/HexTag.cs | 30 + .../Hex/Tagging/HexTagAggregator.cs | 124 + .../Hex/Tagging/HexTagSpan.cs | 78 + .../Hex/Tagging/HexTagTypeAttribute.cs | 45 + .../Hex/Tagging/HexTagger.cs | 110 + .../Hex/Tagging/HexTaggerContext.cs | 57 + .../Hex/Tagging/HexTaggerProvider.cs | 38 + .../Hex/Tagging/HexTagsChangedEventArgs.cs | 42 + .../Hex/Tagging/HexTextTagSpan.cs | 65 + .../Hex/Tagging/HexToolTipStructureSpanTag.cs | 64 + .../HexViewTagAggregatorFactoryService.cs | 40 + .../Hex/Tagging/HexViewTaggerProvider.cs | 41 + .../Hex/Text/HexClassifiedText.cs | 47 + .../Hex/Text/HexClassifiedTextCollection.cs | 71 + .../Hex/Text/HexTextWriter.cs | 49 + .../Hex/Text/PredefinedClassifiedTextTags.cs | 66 + .../Hex/TextAndHexSpan.cs | 47 + dnSpy/dnSpy.Contracts.DnSpy/Images/DsImage.cs | 135 + .../Images/DsImageStrings.cs | 272 + .../dnSpy.Contracts.DnSpy/Images/DsImages.cs | 276 + .../Images/DsImagesAttribute.cs | 273 + .../Images/IDotNetImageService.cs | 138 + .../Images/IImageService.cs | 35 + .../Images/IImageSourceInfoProvider.cs | 78 + .../Images/ImageOptions.cs | 82 + .../Images/ImageReference.cs | 110 + .../Images/ImageReferenceConverter.cs | 77 + .../Images/ImageSourceInfo.cs | 42 + .../Intellisense/AcronymSearchHelpers.cs | 47 + .../Intellisense/BestMatchSelector.cs | 155 + .../CompletionClassifierContext.cs | 57 + .../CompletionClassifierKind.cs | 37 + .../CompletionDisplayTextClassifierContext.cs | 49 + .../CompletionSuffixClassifierContext.cs | 43 + .../Intellisense/CompletionConstants.cs | 30 + .../Intellisense/CompletionExtensions.cs | 35 + .../Language/Intellisense/CompletionFilter.cs | 79 + .../Language/Intellisense/DsCompletion.cs | 84 + .../Language/Intellisense/DsCompletionIcon.cs | 48 + .../Language/Intellisense/DsCompletionSet.cs | 209 + .../Intellisense/DsIntellisenseFilter.cs | 68 + .../FilteredCompletionCollection.cs | 129 + .../Intellisense/ICompletionFilter.cs | 42 + .../ICompletionSetContentTypeProvider.cs | 38 + .../PredefinedDsCompletionSourceProviders.cs | 32 + .../PredefinedDsQuickInfoSourceProviders.cs | 43 + ...redefinedDsSignatureHelpSourceProviders.cs | 32 + ...redefinedIntellisensePresenterProviders.cs | 42 + .../PredefinedUIElementProviderNames.cs | 32 + .../SignatureHelpClassifierContext.cs | 135 + .../Intellisense/SignatureHelpConstants.cs | 104 + .../AutomationPeerMemoryLeakWorkaround.cs | 121 + .../MVVM/Converters/FontSizeConverter.cs | 39 + .../MVVM/Converters/NegateBooleanConverter.cs | 32 + .../dnSpy.Contracts.DnSpy/MVVM/DataFieldVM.cs | 1725 +++ .../MVVM/Dialogs/ProgressDlg.xaml | 57 + .../MVVM/Dialogs/ProgressDlg.xaml.cs | 86 + .../MVVM/Dialogs/ProgressVM.cs | 294 + dnSpy/dnSpy.Contracts.DnSpy/MVVM/EnumVM.cs | 163 + .../MVVM/GridViewColumnSorter.cs | 163 + .../MVVM/IGridViewColumnDescsProvider.cs | 152 + .../MVVM/IInitializeDataTemplate.cs | 33 + .../MVVM/InitDataTemplateAP.cs | 72 + .../MVVM/IsDraggableAP.cs | 47 + dnSpy/dnSpy.Contracts.DnSpy/MVVM/ListVM.cs | 182 + .../MVVM/PickDirectory.cs | 51 + .../MVVM/PickFilename.cs | 91 + .../MVVM/PickFilenameConstants.cs | 38 + .../MVVM/PickSaveFilename.cs | 65 + .../MVVM/RelayCommand.cs | 51 + .../Menus/CommandTargetMenuItemBase.cs | 123 + .../Menus/CreatedMenuItem.cs | 45 + .../dnSpy.Contracts.DnSpy/Menus/GuidObject.cs | 53 + .../Menus/GuidObjectsProviderArgs.cs | 45 + .../Menus/IContextMenuInitializer.cs | 34 + .../Menus/IContextMenuProvider.cs | 33 + .../Menus/IGuidObjectsProvider.cs | 34 + dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenu.cs | 72 + .../dnSpy.Contracts.DnSpy/Menus/IMenuItem.cs | 145 + .../Menus/IMenuItemContext.cs | 67 + .../Menus/IMenuItemProvider.cs | 34 + .../Menus/IMenuService.cs | 59 + .../Menus/MenuConstants.cs | 631 + .../Menus/MenuItemBase.cs | 157 + .../Menus/MenuItemCommand.cs | 72 + .../Metadata/IModuleIdFactory.cs | 35 + .../Metadata/IModuleIdFactoryProvider.cs | 62 + .../Metadata/IModuleIdProvider.cs | 34 + .../Metadata/IRuntimeAssemblyResolver.cs | 110 + .../ModuleIdFactoryProviderConstants.cs | 35 + .../Output/ICachedWriter.cs | 33 + .../Output/IOutputService.cs | 62 + .../Output/IOutputServiceListener.cs | 69 + .../Output/IOutputTextPane.cs | 49 + .../Output/IOutputWriter.cs | 48 + .../Properties/AssemblyInfo.cs | 10 + ...nSpy.Contracts.DnSpy.Resources.Designer.cs | 273 + .../dnSpy.Contracts.DnSpy.Resources.cs.resx | 192 + .../dnSpy.Contracts.DnSpy.Resources.de.resx | 192 + ...dnSpy.Contracts.DnSpy.Resources.es-ES.resx | 191 + .../dnSpy.Contracts.DnSpy.Resources.fa.resx | 191 + .../dnSpy.Contracts.DnSpy.Resources.fr.resx | 189 + .../dnSpy.Contracts.DnSpy.Resources.hu.resx | 192 + .../dnSpy.Contracts.DnSpy.Resources.it.resx | 189 + ...dnSpy.Contracts.DnSpy.Resources.pt-BR.resx | 192 + ...dnSpy.Contracts.DnSpy.Resources.pt-PT.resx | 190 + .../dnSpy.Contracts.DnSpy.Resources.resx | 192 + .../dnSpy.Contracts.DnSpy.Resources.ru.resx | 192 + .../dnSpy.Contracts.DnSpy.Resources.tr.resx | 191 + .../dnSpy.Contracts.DnSpy.Resources.uk.resx | 189 + ...dnSpy.Contracts.DnSpy.Resources.zh-CN.resx | 192 + .../Scripting/IOutputWritable.cs | 49 + .../Scripting/IOutputWriter.cs | 69 + .../Scripting/IServiceLocator.cs | 39 + .../Scripting/Roslyn/ICachedWriter.cs | 33 + .../Scripting/Roslyn/IPrintOptions.cs | 59 + .../Scripting/Roslyn/IScriptGlobals.cs | 352 + .../Scripting/Roslyn/ITextPrinter.cs | 201 + .../Scripting/Roslyn/MemberDisplayFormat.cs | 42 + .../Scripting/ScriptException.cs | 51 + .../Scripting/UIUtils.cs | 128 + .../Search/BodyResult.cs | 36 + .../Search/ChainDocumentTreeNodeFilter.cs | 68 + .../Search/DocumentSearcherOptions.cs | 79 + .../Search/DocumentTreeNodeFilterBase.cs | 60 + .../EntryPointDocumentTreeNodeFilter.cs | 72 + .../FilterNothingDocumentTreeNodeFilter.cs | 30 + .../Search/FlagsDocumentTreeNodeFilter.cs | 363 + .../Search/IDocumentSearcher.cs | 81 + .../Search/IDocumentSearcherProvider.cs | 35 + .../Search/ISearchComparer.cs | 33 + .../Search/ISearchResult.cs | 67 + .../Search/NamespaceRef.cs | 47 + .../Search/NamespaceSearchResult.cs | 36 + .../SameAssemblyDocumentTreeNodeFilter.cs | 56 + .../SameModuleDocumentTreeNodeFilter.cs | 52 + .../Search/SearchComparers.cs | 314 + .../Search/SearchResultEventArgs.cs | 38 + .../Search/SearchTypeInfo.cs | 49 + .../ShowNothingDocumentTreeNodeFilterBase.cs | 60 + .../Search/VisibleMembersFlags.cs | 70 + .../AppearanceCategoryConstants.cs | 45 + .../TextAppearanceCategoryDefinition.cs | 52 + .../CodeEditor/CodeEditorOptionsDefinition.cs | 284 + .../CodeEditor/DefaultCodeEditorOptions.cs | 57 + .../Settings/Dialog/AppSettingsConstants.cs | 346 + .../Settings/Dialog/AppSettingsPage.cs | 122 + .../Settings/Dialog/IAppRefreshSettings.cs | 48 + .../Dialog/IAppSettingsModifiedListener.cs | 56 + .../Dialog/IAppSettingsPageContainer.cs | 93 + .../Dialog/IAppSettingsPageProvider.cs | 33 + .../Settings/Dialog/IAppSettingsService.cs | 41 + .../Settings/Fonts/FontSettings.cs | 70 + .../Settings/Fonts/FontType.cs | 45 + .../Settings/Fonts/ThemeFontSettings.cs | 67 + .../Fonts/ThemeFontSettingsDefinition.cs | 64 + .../Fonts/ThemeFontSettingsService.cs | 39 + .../FontsAndColors/FontAndColorOptions.cs | 57 + .../FontAndColorOptionsProvider.cs | 38 + .../Settings/FontsAndColors/FontOption.cs | 54 + .../Groups/ContentTypeOptionDefinition.cs | 92 + .../IContentTypeOptionDefinitionProvider.cs | 69 + .../Settings/Groups/ITextViewOptionsGroup.cs | 91 + .../ITextViewOptionsGroupNameProvider.cs | 59 + .../Groups/ITextViewOptionsGroupService.cs | 32 + .../Groups/PredefinedTextViewGroupNames.cs | 45 + .../Groups/TextViewOptionChangedEventArgs.cs | 48 + .../HexEditor/DefaultHexEditorOptions.cs | 56 + .../HexEditor/HexEditorOptionsDefinition.cs | 285 + .../HexViewOptionChangedEventArgs.cs | 48 + .../Settings/HexGroups/HexViewOptionsGroup.cs | 92 + .../HexViewOptionsGroupNameProvider.cs | 64 + .../HexGroups/HexViewOptionsGroupService.cs | 37 + .../HexGroups/PredefinedHexViewGroupNames.cs | 30 + .../Settings/HexGroups/TagOptionDefinition.cs | 92 + .../HexGroups/TagOptionDefinitionProvider.cs | 82 + .../Settings/ISettingsSection.cs | 63 + .../Settings/ISettingsSectionProvider.cs | 70 + .../Settings/ISettingsService.cs | 58 + .../Settings/ISettingsService2.cs | 37 + .../Settings/ISettingsServiceFactory.cs | 31 + .../Settings/Repl/DefaultReplOptions.cs | 57 + .../Settings/Repl/ReplOptionsDefinition.cs | 284 + .../dnSpy.Contracts.DnSpy/Tabs/ITabContent.cs | 56 + dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabGroup.cs | 133 + .../Tabs/ITabGroupService.cs | 227 + .../dnSpy.Contracts.DnSpy/Tabs/ITabService.cs | 50 + .../Tabs/ITabServiceProvider.cs | 31 + .../Tabs/TabContentAttachedEventArgs.cs | 47 + .../Tabs/TabContentVisibilityEvent.cs | 55 + .../TabGroupCollectionChangedEventArgs.cs | 47 + .../Tabs/TabGroupSelectedEventArgs.cs | 47 + .../Tabs/TabGroupServiceOptions.cs | 81 + .../Tabs/TabSelectedEventArgs.cs | 54 + .../Text/CachedTextColorsCollection.cs | 90 + .../EditorFormatMapConstants.cs | 38 + .../Classification/ISynchronousClassifier.cs | 38 + ...ISynchronousClassifierAggregatorService.cs | 35 + ...chronousViewClassifierAggregatorService.cs | 35 + .../Text/Classification/ITextClassifier.cs | 34 + .../ITextClassifierAggregator.cs | 28 + .../ITextClassifierAggregatorService.cs | 35 + .../Classification/ITextClassifierProvider.cs | 35 + .../Classification/ITextElementFactory.cs | 28 + .../Classification/ITextElementProvider.cs | 38 + .../IThemeClassificationTypeService.cs | 34 + .../Classification/IThemeFormatDefinition.cs | 36 + .../Text/Classification/LanguagePriority.cs | 30 + .../PredefinedClassificationTypeNames.cs | 42 + .../PredefinedTextClassifierTags.cs | 390 + .../RoslynClassificationTypeNames.cs | 62 + .../Text/Classification/TextBlockFactory.cs | 243 + .../Classification/TextClassificationTag.cs | 49 + .../Classification/TextClassifierContext.cs | 76 + .../TextClassifierTextColorWriter.cs | 81 + .../Text/Classification/TextElementFlags.cs | 79 + .../ThemeClassificationFormatDefinition.cs | 92 + .../ThemeClassificationTypeNameKeys.cs | 1620 +++ .../ThemeClassificationTypeNames.cs | 1620 +++ .../ThemeMarkerFormatDefinition.cs | 64 + .../Text/ColorAndText.cs | 55 + .../Text/ContentTypes.cs | 321 + .../Text/ContentTypesHelper.cs | 51 + .../Text/Editor/BlockStructureData.cs | 54 + .../Text/Editor/BlockStructureKind.cs | 175 + .../Text/Editor/BlockStructureLineKind.cs | 50 + .../Text/Editor/CodeEditorOptions.cs | 77 + .../Text/Editor/CommonTextEditorOptions.cs | 61 + .../Text/Editor/DefaultDsOptions.cs | 32 + .../Text/Editor/DefaultDsTextViewOptions.cs | 61 + .../Text/Editor/DefaultDsWpfViewOptions.cs | 32 + .../Text/Editor/DefaultReplEditorOptions.cs | 35 + .../Editor/GlyphTextMarkerServiceZIndexes.cs | 125 + .../Text/Editor/IBlockStructureService.cs | 31 + .../IBlockStructureServiceDataProvider.cs | 36 + .../Editor/IBlockStructureServiceProvider.cs | 34 + .../Text/Editor/ICodeEditor.cs | 44 + .../Text/Editor/ICodeEditorProvider.cs | 32 + .../Text/Editor/ICustomLineNumberMargin.cs | 135 + .../Editor/IDsTextEditorFactoryService.cs | 90 + .../Text/Editor/IDsTextView.cs | 29 + .../Text/Editor/IDsTextViewLine.cs | 32 + .../Text/Editor/IDsWpfTextView.cs | 34 + .../Text/Editor/IDsWpfTextViewHost.cs | 32 + .../Text/Editor/IGlyphTextMarkerHandler.cs | 268 + .../Editor/IGlyphTextMarkerMouseProcessor.cs | 238 + .../Text/Editor/IGlyphTextMarkerService.cs | 383 + .../Text/Editor/ILineSeparatorTag.cs | 48 + .../Text/Editor/ILogEditor.cs | 95 + .../Text/Editor/ILogEditorProvider.cs | 32 + .../Text/Editor/IMarginContextMenuHandler.cs | 53 + ...MarginContextMenuHandlerProviderService.cs | 38 + .../Text/Editor/IReplCommandHandler.cs | 55 + .../Text/Editor/IReplCommandInput.cs | 40 + .../Text/Editor/IReplEditor.cs | 171 + .../Text/Editor/IReplEditorProvider.cs | 32 + .../Text/Editor/IReplaceListener.cs | 37 + .../Text/Editor/IReplaceListenerProvider.cs | 34 + .../Text/Editor/IndentStyle.cs | 40 + .../Text/Editor/IsOverlayLayerAttribute.cs | 38 + .../Text/Editor/LayerKind.cs | 40 + .../Text/Editor/LayerKindAttribute.cs | 38 + .../Text/Editor/LogEditorOptions.cs | 50 + .../Text/Editor/MarginNameAttribute.cs | 40 + .../Editor/Operations/ITextViewUndoManager.cs | 43 + .../ITextViewUndoManagerProvider.cs | 48 + .../DefaultDsOptionsExtensions.cs | 39 + .../DefaultDsTextViewOptionsExtensions.cs | 193 + .../DefaultDsWpfViewOptionsExtensions.cs | 39 + .../DefaultReplEditorOptionsExtensions.cs | 50 + .../Editor/PredefinedDsAdornmentLayers.cs | 65 + .../PredefinedDsGlyphFactoryProviderNames.cs | 32 + ...redefinedDsGlyphMouseProcessorProviders.cs | 32 + ...phTextMarkerMouseProcessorProviderNames.cs | 30 + .../Text/Editor/PredefinedDsMarginNames.cs | 30 + .../PredefinedDsMouseProcessorProviders.cs | 44 + .../Text/Editor/PredefinedDsTextViewRoles.cs | 129 + .../PredefinedSpaceReservationManagerNames.cs | 38 + .../Text/Editor/ReplEditorOptions.cs | 94 + .../Text/Editor/ReplEditorUtils.cs | 55 + .../Text/Editor/TextMarkerServiceZIndexes.cs | 51 + .../Text/Editor/TextViewCreatorOptions.cs | 70 + .../Text/Editor/TextViewExtensions.cs | 44 + .../Text/Editor/WordWrapStylesConstants.cs | 42 + .../Formatting/HtmlClipboardFormatWriter.cs | 105 + .../Text/Formatting/IHtmlBuilderService.cs | 70 + .../Text/LineConstants.cs | 24 + .../Text/Operations/IReplEditorOperations.cs | 116 + .../Text/SpanDataCollection.cs | 273 + .../Text/StringBuilderTextColorOutput.cs | 77 + ...ronousBufferTagAggregatorFactoryService.cs | 45 + .../Text/Tagging/ISynchronousTagAggregator.cs | 55 + .../Text/Tagging/ISynchronousTagger.cs | 39 + ...chronousViewTagAggregatorFactoryService.cs | 45 + .../Text/TextEditorPosition.cs | 55 + .../Text/WPF/WpfUnicodeUtils.cs | 325 + .../dnSpy.Contracts.DnSpy/Themes/ColorType.cs | 798 ++ .../Themes/ExtensionMethods.cs | 34 + dnSpy/dnSpy.Contracts.DnSpy/Themes/ITheme.cs | 74 + .../Themes/IThemeColor.cs | 63 + .../Themes/IThemeService.cs | 50 + .../Themes/ThemeChangedEventArgs.cs | 29 + .../Themes/ThemeConstants.cs | 47 + .../ToolBars/IToolBarButton.cs | 107 + .../ToolBars/IToolBarItem.cs | 74 + .../ToolBars/IToolBarItemContext.cs | 32 + .../ToolBars/IToolBarObject.cs | 53 + .../ToolBars/IToolBarService.cs | 38 + .../ToolBars/IToolBarToggleButton.cs | 34 + .../ToolBars/ToolBarButtonBase.cs | 40 + .../ToolBars/ToolBarButtonCommand.cs | 44 + .../ToolBars/ToolBarConstants.cs | 58 + .../ToolBars/ToolBarObjectBase.cs | 32 + .../ToolWindows/App/AppToolWindowConstants.cs | 79 + .../ToolWindows/App/AppToolWindowLocation.cs | 38 + .../ToolWindows/App/IDsToolWindowService.cs | 111 + .../App/IToolWindowContentProvider.cs | 41 + .../ToolWindows/App/ToolWindowContentInfo.cs | 61 + .../ToolWindows/IToolWindowGroup.cs | 78 + .../ToolWindows/IToolWindowGroupService.cs | 215 + .../ToolWindows/IToolWindowService.cs | 32 + .../ToolWindows/IToolWindowServiceProvider.cs | 31 + .../Search/SearchColumnCommandParser.cs | 210 + .../Search/SearchColumnDefinition.cs | 48 + .../ToolWindows/Search/SearchMatcher.cs | 128 + .../Search/SearchTextClassifierContext.cs | 31 + .../Search/SearchTextClassifierProvider.cs | 51 + .../ToolWindows/ToolWindowContent.cs | 70 + .../ToolWindowContentVisibilityEvent.cs | 55 + ...olWindowGroupCollectionChangedEventArgs.cs | 47 + .../ToolWindowGroupSelectedEventArgs.cs | 47 + .../ToolWindowGroupServiceOptions.cs | 73 + .../ToolWindowSelectedEventArgs.cs | 54 + .../TreeView/AsyncNodeProvider.cs | 193 + .../TreeView/IMDTokenNode.cs | 32 + .../TreeView/ITreeNode.cs | 104 + .../TreeView/ITreeNodeDataProvider.cs | 66 + .../TreeView/ITreeNodeGroup.cs | 32 + .../TreeView/ITreeView.cs | 122 + .../TreeView/ITreeViewListener.cs | 32 + .../TreeView/ITreeViewService.cs | 36 + .../Text/ITreeViewNodeTextElementProvider.cs | 37 + .../TreeView/Text/TreeViewContentTypes.cs | 45 + .../Text/TreeViewNodeClassifierContext.cs | 63 + .../TreeView/TreeNodeData.cs | 213 + .../TreeView/TreeNodeDataProviderContext.cs | 36 + .../TreeView/TreeViewConstants.cs | 28 + .../TreeView/TreeViewListenerEvent.cs | 30 + .../TreeView/TreeViewListenerEventArgs.cs | 47 + .../TreeView/TreeViewNodeRemovedEventArgs.cs | 47 + .../TreeView/TreeViewOptions.cs | 84 + .../TreeViewSelectionChangedEventArgs.cs | 47 + .../Utilities/DelayedAction.cs | 61 + .../Utilities/ProfileOptimizationHelper.cs | 46 + .../Utilities/ToolTipHelper.cs | 28 + .../Utilities/UIUtilities.cs | 172 + .../dnSpy.Contracts.DnSpy.csproj | 55 + .../Decompiler/AddressReference.cs | 90 + .../Decompiler/AsyncMethodDebugInfo.cs | 62 + .../Decompiler/AsyncStepInfo.cs | 55 + .../Decompiler/BamlDecompilerOptions.cs | 63 + .../Decompiler/CodeBracesRange.cs | 52 + .../Decompiler/CodeBracesRangeFlags.cs | 146 + .../Decompiler/CustomAttributesUtils.cs | 646 + .../Decompiler/DecompilationContext.cs | 102 + .../Decompiler/DecompilationType.cs | 40 + .../Decompiler/DecompileAssemblyInfo.cs | 52 + .../Decompiler/DecompilePartialType.cs | 75 + .../Decompiler/DecompileTypeBase.cs | 47 + .../Decompiler/DecompileTypeMethods.cs | 70 + .../Decompiler/DecompilerConstants.cs | 72 + .../Decompiler/DecompilerOptionConstants.cs | 222 + .../Decompiler/DecompilerReferenceFlags.cs | 58 + .../Decompiler/DecompilerSettingsBase.cs | 91 + .../Decompiler/Extensions.cs | 320 + .../Decompiler/FormatterOptions.cs | 52 + .../Decompiler/GenericArgumentResolver.cs | 266 + .../Decompiler/IBamlDecompiler.cs | 72 + .../Decompiler/IDecompiler.cs | 256 + .../Decompiler/IDecompilerCreator.cs | 33 + .../Decompiler/IDecompilerOption.cs | 52 + .../Decompiler/IDecompilerOutput.cs | 187 + .../Decompiler/IDecompilerProvider.cs | 32 + .../Decompiler/IInstructionBytesReader.cs | 43 + .../Decompiler/ILSpan.cs | 161 + .../Decompiler/ISimpleILPrinter.cs | 54 + .../Decompiler/ISourceVariable.cs | 89 + .../Decompiler/IdentifierEscaper.cs | 150 + .../Decompiler/InstructionReference.cs | 69 + .../Decompiler/LineSeparator.cs | 36 + .../Decompiler/MemberComparer.cs | 256 + .../Decompiler/MetadataTextColorProvider.cs | 310 + .../Decompiler/MethodDebugInfo.cs | 202 + .../Decompiler/MethodDebugInfoBuilder.cs | 121 + .../Decompiler/MethodDebugScope.cs | 230 + .../Decompiler/MethodDebugScopeBuilder.cs | 106 + .../Decompiler/MethodSourceStatement.cs | 90 + .../Decompiler/MethodStatementReference.cs | 66 + .../Decompiler/NamespaceReference.cs | 61 + .../Decompiler/PredefinedCompilerNames.cs | 40 + .../Decompiler/PredefinedCustomDataIds.cs | 45 + .../Decompiler/PredefinedSpanReferenceIds.cs | 31 + .../Decompiler/SimpleXmlParser.cs | 85 + .../Decompiler/SourceLocal.cs | 101 + .../Decompiler/SourceParameter.cs | 87 + .../Decompiler/SourceStatement.cs | 99 + .../Decompiler/SpanReference.cs | 60 + .../StringBuilderDecompilerOutput.cs | 177 + .../Decompiler/StringBuilderExtensions.cs | 40 + .../TextColorWriterToDecompilerOutput.cs | 82 + .../Decompiler/TextSpan.cs | 127 + .../Decompiler/TextSpanData.cs | 46 + .../Decompiler/TextWriterDecompilerOutput.cs | 159 + .../Decompiler/TokenReference.cs | 82 + .../Decompiler/TypesHierarchyHelpers.cs | 372 + .../Decompiler/XmlDoc/XmlDocKeyProvider.cs | 303 + .../Decompiler/XmlDoc/XmlDocLoader.cs | 205 + .../Decompiler/XmlDoc/XmlDocRenderer.cs | 204 + .../XmlDoc/XmlDocumentationProvider.cs | 442 + .../MVVM/ViewModelBase.cs | 64 + .../Metadata/ModuleId.cs | 207 + .../Metadata/ModuleTokenId.cs | 95 + dnSpy/dnSpy.Contracts.Logic/NRT.cs | 33 + dnSpy/dnSpy.Contracts.Logic/NRT_Helpers.cs | 43 + .../Properties/AssemblyInfo.cs | 3 + ...nSpy.Contracts.Logic.Resources.Designer.cs | 279 + .../dnSpy.Contracts.Logic.Resources.cs.resx | 192 + .../dnSpy.Contracts.Logic.Resources.de.resx | 192 + ...dnSpy.Contracts.Logic.Resources.es-ES.resx | 192 + .../dnSpy.Contracts.Logic.Resources.fa.resx | 192 + .../dnSpy.Contracts.Logic.Resources.fr.resx | 192 + .../dnSpy.Contracts.Logic.Resources.hu.resx | 192 + .../dnSpy.Contracts.Logic.Resources.it.resx | 192 + ...dnSpy.Contracts.Logic.Resources.pt-BR.resx | 192 + ...dnSpy.Contracts.Logic.Resources.pt-PT.resx | 192 + .../dnSpy.Contracts.Logic.Resources.resx | 192 + .../dnSpy.Contracts.Logic.Resources.ru.resx | 192 + .../dnSpy.Contracts.Logic.Resources.tr.resx | 192 + .../dnSpy.Contracts.Logic.Resources.uk.resx | 192 + ...dnSpy.Contracts.Logic.Resources.zh-CN.resx | 192 + .../Resources/ResourceHelper.cs | 152 + .../Text/ITextColorWriter.cs | 63 + .../Text/ITextColorWriterExtensions.cs | 212 + dnSpy/dnSpy.Contracts.Logic/Text/Indenter.cs | 112 + .../Text/NameUtilities.cs | 64 + dnSpy/dnSpy.Contracts.Logic/Text/TextColor.cs | 1012 ++ .../Utilities/GacInfo.cs | 404 + .../Utilities/SimpleTypeConverter.cs | 1051 ++ .../dnSpy.Contracts.Logic.csproj | 35 + .../CSharp/CSharpFormatter.cs | 1529 +++ dnSpy/dnSpy.Decompiler/DecompilerBase.cs | 250 + dnSpy/dnSpy.Decompiler/FilenameUtils.cs | 97 + dnSpy/dnSpy.Decompiler/FormatterMethodInfo.cs | 67 + dnSpy/dnSpy.Decompiler/IL/ILLanguageHelper.cs | 50 + .../IL/InstructionBytesReader.cs | 37 + dnSpy/dnSpy.Decompiler/IL/InstructionUtils.cs | 225 + .../IL/ModifiedInstructionBytesReader.cs | 64 + .../IL/OriginalInstructionBytesReader.cs | 51 + .../MSBuild/AppConfigProjectFile.cs | 38 + .../MSBuild/ApplicationIcon.cs | 138 + .../MSBuild/ApplicationManifest.cs | 71 + .../MSBuild/AssemblyInfoProjectFile.cs | 53 + .../MSBuild/BamlResourceProjectFile.cs | 151 + dnSpy/dnSpy.Decompiler/MSBuild/BuildAction.cs | 35 + .../MSBuild/DecompileContext.cs | 32 + .../MSBuild/DefaultNamespaceFinder.cs | 131 + dnSpy/dnSpy.Decompiler/MSBuild/DotNetUtils.cs | 71 + dnSpy/dnSpy.Decompiler/MSBuild/FileUtils.cs | 58 + .../MSBuild/FilenameCreator.cs | 173 + dnSpy/dnSpy.Decompiler/MSBuild/IJob.cs | 29 + .../MSBuild/IMSBuildProgressListener.cs | 44 + .../MSBuild/IMSBuildProjectWriterLogger.cs | 31 + .../MSBuild/MSBuildProjectCreator.cs | 157 + .../MSBuild/NoMSBuildProjectWriterLogger.cs | 26 + dnSpy/dnSpy.Decompiler/MSBuild/Project.cs | 528 + .../MSBuild/ProjectCreatorOptions.cs | 93 + dnSpy/dnSpy.Decompiler/MSBuild/ProjectFile.cs | 35 + .../MSBuild/ProjectModuleOptions.cs | 96 + .../MSBuild/ProjectVersion.cs | 32 + .../dnSpy.Decompiler/MSBuild/ProjectWriter.cs | 406 + .../MSBuild/RawEmbeddedResourceProjectFile.cs | 43 + .../MSBuild/ResXProjectFile.cs | 148 + .../MSBuild/ResourceNameCreator.cs | 296 + .../MSBuild/ResourceProjectFile.cs | 44 + .../MSBuild/SatelliteAssemblyFinder.cs | 120 + .../MSBuild/SettingsProjectFile.cs | 277 + .../MSBuild/SettingsTypeProjectFile.cs | 150 + .../MSBuild/SolutionWriter.cs | 168 + .../MSBuild/SplashScreenProjectFile.cs | 44 + .../MSBuild/TypeProjectFile.cs | 58 + .../MSBuild/WinFormsProjectFile.cs | 141 + .../MSBuild/XamlTypeProjectFile.cs | 137 + .../Properties/AssemblyInfo.cs | 4 + .../dnSpy.Decompiler.Resources.Designer.cs | 468 + .../dnSpy.Decompiler.Resources.cs.resx | 255 + .../dnSpy.Decompiler.Resources.de.resx | 255 + .../dnSpy.Decompiler.Resources.es-ES.resx | 255 + .../dnSpy.Decompiler.Resources.fa.resx | 255 + .../dnSpy.Decompiler.Resources.fr.resx | 255 + .../dnSpy.Decompiler.Resources.hu.resx | 255 + .../dnSpy.Decompiler.Resources.it.resx | 255 + .../dnSpy.Decompiler.Resources.pt-BR.resx | 255 + .../dnSpy.Decompiler.Resources.pt-PT.resx | 255 + .../dnSpy.Decompiler.Resources.resx | 255 + .../dnSpy.Decompiler.Resources.ru.resx | 255 + .../dnSpy.Decompiler.Resources.tr.resx | 255 + .../dnSpy.Decompiler.Resources.uk.resx | 255 + .../dnSpy.Decompiler.Resources.zh-CN.resx | 255 + .../Settings/DecompilerOption.cs | 43 + dnSpy/dnSpy.Decompiler/TargetFrameworkInfo.cs | 408 + .../dnSpy.Decompiler/TargetFrameworkUtils.cs | 78 + dnSpy/dnSpy.Decompiler/TypeFormatterUtils.cs | 483 + .../Utils/StateMachineHelpers.cs | 259 + .../VisualBasic/VisualBasicFormatter.cs | 1559 +++ .../dnSpy.Decompiler/dnSpy.Decompiler.csproj | 36 + .../BackgroundImageOptionDefinitionService.cs | 60 + .../BackgroundImageOptionDefinitions.cs | 94 + .../BackgroundImage/BackgroundImageService.cs | 248 + .../BackgroundImageSettings.cs | 75 + .../BackgroundImageSettingsService.cs | 133 + .../BackgroundImage/DefaultRawSettings.cs | 44 + .../Dialog/AppSettingsPageImpl.cs | 350 + .../HexViewBackgroundImageService.cs | 86 + .../BackgroundImage/ImageSourceService.cs | 535 + .../ImageSourceServiceProvider.cs | 67 + dnSpy/dnSpy/BackgroundImage/RawSettings.cs | 274 + .../TextViewBackgroundImageService.cs | 85 + .../WpfHexViewCreationListenerImpl.cs | 36 + .../WpfTextViewCreationListener.cs | 40 + .../dnSpy/Bookmarks/BookmarkImageUtilities.cs | 46 + .../Bookmarks/Commands/AppMenuCommands.cs | 150 + .../Bookmarks/Commands/MainMenuOperations.cs | 97 + .../DotNet/BookmarkFormatterService.cs | 68 + .../BookmarkLocationFormatterProviderImpl.cs | 55 + .../DotNet/BookmarkLocationSerializerImpl.cs | 123 + .../DotNet/DotNetBookmarkFactoryImpl.cs | 44 + .../DotNet/DotNetBookmarkLocationFactory.cs | 38 + .../DotNet/DotNetBookmarkLocationFormatter.cs | 148 + .../DotNetMethodBodyBookmarkLocationImpl.cs | 49 + .../DotNet/DotNetReferenceConverter.cs | 38 + .../DotNet/DotNetTokenBookmarkLocationImpl.cs | 46 + .../DotNet/IDotNetBookmarkLocation.cs | 28 + .../BookmarkDocumentProviderImpl.cs | 98 + ...markGlyphTextMarkerLocationProviderImpl.cs | 36 + .../DeleteBookmarksInRemovedModules.cs | 97 + ...otNetMethodBodyBookmarkLocationProvider.cs | 66 + ...ViewDotNetTokenBookmarkLocationProvider.cs | 69 + .../Impl/BookmarkDisplaySettingsBase.cs | 203 + dnSpy/dnSpy/Bookmarks/Impl/BookmarkImpl.cs | 100 + .../Impl/BookmarkLocationFormatterService.cs | 62 + .../Impl/BookmarkLocationSerializerService.cs | 82 + .../Impl/BookmarkSerializerService.cs | 65 + .../Bookmarks/Impl/BookmarksListSettings.cs | 78 + .../Bookmarks/Impl/BookmarksSerializer.cs | 83 + .../Bookmarks/Impl/BookmarksServiceImpl.cs | 202 + .../Navigator/BookmarkNavigatorImpl.cs | 189 + .../Navigator/ViewBookmarkProvider.cs | 46 + .../Settings/BookmarksAppSettingsPage.cs | 56 + .../Settings/BookmarksSettingsImpl.cs | 78 + .../BookmarkGlyphTextMarkerHandler.cs | 46 + ...kGlyphTextMarkerLocationProviderService.cs | 52 + .../Bookmarks/TextEditor/BookmarkInfo.cs | 41 + .../Bookmarks/TextEditor/BookmarkMarker.cs | 156 + .../DocumentViewerBookmarksOperations.cs | 97 + .../DocumentViewerCommandInfoProvider.cs | 74 + .../DocumentViewerCommandTargetFilter.cs | 122 + ...cumentViewerCommandTargetFilterProvider.cs | 42 + .../TextEditor/TextViewBookmarkService.cs | 333 + .../Bookmarks/BookmarkColumnConverter.cs | 55 + .../ToolWindows/Bookmarks/BookmarkContext.cs | 57 + .../Bookmarks/BookmarkFormatter.cs | 61 + .../ToolWindows/Bookmarks/BookmarkVM.cs | 199 + .../ToolWindows/Bookmarks/BookmarksContent.cs | 147 + .../Bookmarks/BookmarksControl.xaml | 192 + .../Bookmarks/BookmarksControl.xaml.cs | 52 + .../Bookmarks/BookmarksOperations.cs | 371 + .../Bookmarks/BookmarksToolWindowContent.cs | 81 + .../ToolWindows/Bookmarks/BookmarksVM.cs | 566 + .../Bookmarks/BookmarksWindowColumnIds.cs | 28 + .../ToolWindows/Bookmarks/Commands.cs | 273 + .../Bookmarks/SearchTextClassifierProvider.cs | 35 + .../ToolWindows/Bookmarks/TextViewTaggers.cs | 66 + .../Bookmarks/ViewBookmarkProviderImpl.cs | 102 + .../ToolWindows/LazyToolWindowVMHelper.cs | 148 + .../Bookmarks/UI/BulkObservableCollection.cs | 47 + .../Bookmarks/UI/ContentTypeDefinitions.cs | 43 + dnSpy/dnSpy/Bookmarks/UI/FormatterObject.cs | 41 + dnSpy/dnSpy/Commands/CommandService.cs | 71 + .../Commands/DefaultCommandInfoProvider.cs | 50 + dnSpy/dnSpy/Commands/KeyShortcutCollection.cs | 61 + dnSpy/dnSpy/Commands/ProviderAndCommand.cs | 34 + .../Commands/RegisteredCommandElement.cs | 291 + dnSpy/dnSpy/Controls/DpiService.cs | 75 + dnSpy/dnSpy/Controls/FastTreeNodeView.cs | 210 + dnSpy/dnSpy/Controls/IStackedContentChild.cs | 30 + dnSpy/dnSpy/Controls/Screen.cs | 117 + dnSpy/dnSpy/Controls/StackedContent.cs | 338 + dnSpy/dnSpy/Controls/StackedContentState.cs | 60 + dnSpy/dnSpy/Controls/SysMenuButton.cs | 37 + dnSpy/dnSpy/Controls/TabButton.cs | 104 + dnSpy/dnSpy/Controls/TextElementFactory.cs | 266 + dnSpy/dnSpy/Controls/WinSysButton.cs | 127 + .../Controls/WindowDpiChangedEventArgs.cs | 39 + dnSpy/dnSpy/Controls/WpfCommandService.cs | 53 + dnSpy/dnSpy/Controls/WpfCommands.cs | 140 + dnSpy/dnSpy/Controls/WpfFocusService.cs | 46 + dnSpy/dnSpy/Controls/ZoomSelector.cs | 98 + dnSpy/dnSpy/Culture/Commands.cs | 114 + dnSpy/dnSpy/Culture/CultureService.cs | 161 + dnSpy/dnSpy/Culture/CultureSettings.cs | 64 + dnSpy/dnSpy/Culture/LanguageInfo.cs | 81 + .../DecompilerAppSettingsPageContainer.cs | 25 + dnSpy/dnSpy/Decompiler/DecompilerService.cs | 74 + .../Decompiler/DecompilerServiceSettings.cs | 65 + dnSpy/dnSpy/Decompiler/DummyDecompiler.cs | 68 + dnSpy/dnSpy/Decompiler/MethodDebugService.cs | 390 + .../CodeStyleAppSettingsPageContainer.cs | 25 + dnSpy/dnSpy/Disassembly/CodeStyleConstants.cs | 30 + .../Viewer/CachedSymbolResolver.cs | 56 + .../Viewer/DisassemblyAppSettingsPage.cs | 107 + .../Viewer/DisassemblyContentOutput.cs | 57 + .../DisassemblyContentProviderFactoryImpl.cs | 58 + .../Viewer/DisassemblyContentSettingsImpl.cs | 160 + .../Viewer/DisassemblyDocumentTabContent.cs | 165 + .../Viewer/DisassemblySettingsPageProvider.cs | 41 + .../Viewer/DisassemblyViewerServiceImpl.cs | 59 + .../DisassemblyViewerServiceSettingsImpl.cs | 35 + .../Viewer/InternalFormatterOptions.cs | 32 + .../Disassembly/Viewer/SymbolResolverUtils.cs | 29 + .../Viewer/X86/DisassemblyContentGenerator.cs | 377 + .../X86/DisassemblyContentProviderFactory.cs | 155 + .../X86/DisassemblyContentProviderImpl.cs | 249 + .../X86/DocumentViewerToolTipProvider.cs | 52 + .../Viewer/X86/MnemonicReference.cs | 43 + .../Disassembly/Viewer/X86/RegisterUtils.cs | 275 + .../Disassembly/Viewer/X86/SymbolKindUtils.cs | 46 + dnSpy/dnSpy/Disassembly/X86/Block.cs | 51 + dnSpy/dnSpy/Disassembly/X86/BlockFactory.cs | 235 + .../X86/CodeStyleSettingsPageProvider.cs | 44 + .../Disassembly/X86/DisasmBooleanSetting.cs | 60 + .../DisassemblyCodeStyleAppSettingsPage.cs | 249 + .../Disassembly/X86/DisassemblySettings.cs | 745 ++ .../X86/DisassemblySettingsUtils.cs | 109 + .../Disassembly/X86/GasAppSettingsPage.cs | 35 + .../X86/GasDisassemblySettingsImpl.cs | 67 + .../Disassembly/X86/MasmAppSettingsPage.cs | 35 + .../X86/MasmDisassemblySettingsImpl.cs | 67 + .../Disassembly/X86/NasmAppSettingsPage.cs | 35 + .../X86/NasmDisassemblySettingsImpl.cs | 67 + dnSpy/dnSpy/Documents/AssemblyResolver.cs | 750 ++ .../Documents/DefaultDsDocumentLoader.cs | 44 + .../Documents/DefaultDsDocumentProvider.cs | 85 + dnSpy/dnSpy/Documents/DotNetPathProvider.cs | 323 + dnSpy/dnSpy/Documents/DsDocumentLoader.cs | 100 + dnSpy/dnSpy/Documents/DsDocumentService.cs | 527 + ...umentServiceAppSettingsModifiedListener.cs | 44 + .../Documents/DsDocumentServiceProvider.cs | 41 + .../Documents/DsDocumentServiceSettings.cs | 64 + dnSpy/dnSpy/Documents/FileUtils.cs | 41 + dnSpy/dnSpy/Documents/FrameworkPath.cs | 173 + dnSpy/dnSpy/Documents/IDsDocumentLoader.cs | 36 + dnSpy/dnSpy/Documents/MethodAnnotations.cs | 104 + .../ReferenceNavigatorServiceImpl.cs | 66 + .../Tabs/AppCommandLineArgsHandler.cs | 111 + dnSpy/dnSpy/Documents/Tabs/AsyncShowResult.cs | 38 + dnSpy/dnSpy/Documents/Tabs/Commands.cs | 344 + .../dnSpy/Documents/Tabs/CopyTokenCommand.cs | 94 + .../Documents/Tabs/DecompilationCache.cs | 255 + .../Documents/Tabs/DefaultDecompileNode.cs | 32 + .../Documents/Tabs/DefaultDocumentList.cs | 439 + .../Tabs/DefaultDocumentTabContentProvider.cs | 36 + .../Tabs/Dialogs/ContentTypeDefinitions.cs | 43 + .../Dialogs/DocumentListColumnConverter.cs | 60 + .../Tabs/Dialogs/DocumentListPrinter.cs | 31 + .../Documents/Tabs/Dialogs/DocumentListVM.cs | 51 + .../Tabs/Dialogs/ExportToProjectDlg.xaml | 123 + .../Tabs/Dialogs/ExportToProjectDlg.xaml.cs | 35 + .../Tabs/Dialogs/ExportToProjectSettings.cs | 65 + .../Tabs/Dialogs/ExportToProjectVM.cs | 348 + .../Tabs/Dialogs/GACFileColumnConverter.cs | 60 + .../Documents/Tabs/Dialogs/GACFileFinder.cs | 76 + .../Documents/Tabs/Dialogs/GACFilePrinter.cs | 31 + .../dnSpy/Documents/Tabs/Dialogs/GACFileVM.cs | 130 + .../Tabs/Dialogs/OpenDocumentListDlg.xaml | 99 + .../Tabs/Dialogs/OpenDocumentListDlg.xaml.cs | 77 + .../Dialogs/OpenDocumentListTextClassifier.cs | 60 + .../OpenDocumentListTextClassifierContext.cs | 30 + .../Tabs/Dialogs/OpenDocumentListVM.cs | 239 + .../Tabs/Dialogs/OpenDocumentsHelper.cs | 45 + .../Documents/Tabs/Dialogs/OpenFromGAC.cs | 64 + .../Tabs/Dialogs/OpenFromGACDlg.xaml | 118 + .../Tabs/Dialogs/OpenFromGACDlg.xaml.cs | 60 + .../Tabs/Dialogs/OpenFromGACTextClassifier.cs | 60 + .../OpenFromGACTextClassifierContext.cs | 30 + .../Documents/Tabs/Dialogs/OpenFromGACVM.cs | 217 + .../Tabs/Dialogs/TabColumnConverter.cs | 62 + .../Documents/Tabs/Dialogs/TabPrinter.cs | 32 + dnSpy/dnSpy/Documents/Tabs/Dialogs/TabVM.cs | 60 + .../dnSpy/Documents/Tabs/Dialogs/TabsDlg.xaml | 89 + .../Documents/Tabs/Dialogs/TabsDlg.xaml.cs | 57 + dnSpy/dnSpy/Documents/Tabs/Dialogs/TabsVM.cs | 128 + .../Documents/Tabs/Dialogs/TabsVMSettings.cs | 64 + .../Tabs/DocTabReferenceNavigator.cs | 41 + .../DocViewer/BlockStructureCollection.cs | 187 + ...ructureDocumentViewerCustomDataProvider.cs | 32 + .../BlockStructureDocumentViewerListener.cs | 37 + .../BlockStructureServiceDataProvider.cs | 39 + .../Tabs/DocViewer/BracePairCollection.cs | 127 + ...acePairDocumentViewerCustomDataProvider.cs | 32 + .../Tabs/DocViewer/BracePairService.cs | 386 + .../Documents/Tabs/DocViewer/Commands.cs | 139 + ...bugInfoDocumentViewerCustomDataProvider.cs | 35 + .../DocViewer/DecompileDocumentTabContent.cs | 282 + .../Tabs/DocViewer/DecompileNodeContext.cs | 55 + .../DecompilerTabContentClassifierContext.cs | 33 + .../DecompilerTabContentContentTypes.cs | 37 + ...DecompilerTabContentTextElementProvider.cs | 41 + .../Tabs/DocViewer/DocumentViewer.cs | 415 + .../DocumentViewerCommandInfoProvider.cs | 40 + .../DocumentViewerCommandTargetFilter.cs | 117 + ...cumentViewerCommandTargetFilterProvider.cs | 35 + .../DocViewer/DocumentViewerContentFactory.cs | 181 + .../Tabs/DocViewer/DocumentViewerControl.cs | 581 + .../DocViewer/DocumentViewerDotNetSpanMap.cs | 83 + ...DocumentViewerHighlightReferencesTagger.cs | 331 + .../DocViewer/DocumentViewerMouseProcessor.cs | 197 + .../Tabs/DocViewer/DocumentViewerOutput.cs | 237 + .../Tabs/DocViewer/DocumentViewerProvider.cs | 67 + .../Tabs/DocViewer/DocumentViewerService.cs | 79 + .../DocumentViewerUIElementService.cs | 224 + .../Tabs/DocViewer/DocumentWriterService.cs | 73 + ...TextMarkerServiceDocumentViewerListener.cs | 42 + ...dKeywordsDocumentViewerReferenceEnabler.cs | 55 + .../DocViewer/LazyBlockStructureCollection.cs | 45 + .../Tabs/DocViewer/LineSeparatorCollection.cs | 84 + ...paratorDocumentViewerCustomDataProvider.cs | 32 + .../Tabs/DocViewer/LineSeparatorViewTagger.cs | 105 + .../Tabs/DocViewer/OpCodeReferenceHandler.cs | 59 + .../Settings/AdvancedAppSettingsPage.cs | 37 + .../Settings/AppSettingsPageContainer.cs | 25 + .../Settings/AppSettingsPageProvider.cs | 39 + .../ContentTypeOptionDefinitionProvider.cs | 69 + .../Settings/DocumentViewerOptions.cs | 30 + .../Settings/DocumentViewerOptionsService.cs | 40 + .../Settings/GeneralAppSettingsPage.cs | 34 + .../Settings/IDocumentViewerOptions.cs | 25 + .../Settings/ScrollBarsAppSettingsPage.cs | 34 + .../DocViewer/Settings/TabsAppSettingsPage.cs | 34 + .../TextViewOptionsGroupNameProvider.cs | 33 + .../DocViewer/SpanDataCollectionUtilities.cs | 47 + .../SpanDataReferenceInfoExtensions.cs | 88 + ...ferenceDocumentViewerCustomDataProvider.cs | 50 + .../DocViewer/ToolTips/CodeToolTipProvider.cs | 129 + .../DocViewer/ToolTips/CodeToolTipSettings.cs | 64 + .../DocViewer/ToolTips/CodeToolTipWriter.cs | 180 + ...bReferenceDocumentViewerToolTipProvider.cs | 207 + .../ToolTips/DocumentViewerToolTipService.cs | 259 + .../NumberDocumentViewerToolTipProvider.cs | 130 + .../Tabs/DocViewer/ToolTips/NumberUtils.cs | 130 + .../ToolTips/ToolTipProviderContext.cs | 52 + .../Documents/Tabs/DocViewer/WaitAdorner.xaml | 33 + .../Tabs/DocViewer/WaitAdorner.xaml.cs | 39 + .../Tabs/DocViewer/XmlDocumentWriter.cs | 46 + ...XmlParser.DocumentViewerToolTipProvider.cs | 79 + .../XmlParser.XamlAttributeParser.cs | 344 + .../Documents/Tabs/DocViewer/XmlParser.cs | 796 ++ dnSpy/dnSpy/Documents/Tabs/DocumentList.cs | 88 + .../Documents/Tabs/DocumentListLoader.cs | 207 + .../Documents/Tabs/DocumentListService.cs | 115 + .../Tabs/DocumentTabContentFactoryContext.cs | 30 + .../Tabs/DocumentTabContentFactoryService.cs | 77 + .../Documents/Tabs/DocumentTabSerializer.cs | 76 + .../Documents/Tabs/DocumentTabService.cs | 689 + .../Tabs/DocumentTabServiceLoader.cs | 84 + .../Tabs/DocumentTabServiceSettings.cs | 85 + .../Tabs/DocumentTabUIContextLocator.cs | 103 + .../DocumentTabUIContextLocatorProvider.cs | 36 + .../Tabs/DocumentTreeNodeDecompiler.cs | 73 + .../Tabs/DsDocumentInfoSerializer.cs | 47 + .../Documents/Tabs/EntryPointCommands.cs | 143 + .../dnSpy/Documents/Tabs/GoToTokenCommand.cs | 151 + .../Tabs/Hex/HexReferenceHandlerImpl.cs | 41 + .../Documents/Tabs/IDecompilationCache.cs | 61 + .../IDocumentTabUIContextLocatorProvider.cs | 33 + .../Documents/Tabs/NavigationCommands.cs | 79 + dnSpy/dnSpy/Documents/Tabs/NodeDecompiler.cs | 341 + ...NodeReferenceDocumentTabContentProvider.cs | 105 + dnSpy/dnSpy/Documents/Tabs/NullObjects.cs | 37 + dnSpy/dnSpy/Documents/Tabs/RedecompileTabs.cs | 53 + .../Documents/Tabs/RefreshResourcesCommand.cs | 98 + .../dnSpy/Documents/Tabs/ResourceCommands.cs | 234 + dnSpy/dnSpy/Documents/Tabs/SaveCommands.cs | 369 + dnSpy/dnSpy/Documents/Tabs/SaveService.cs | 63 + .../dnSpy/Documents/Tabs/SearchMsdnCommand.cs | 257 + dnSpy/dnSpy/Documents/Tabs/SerializedTabs.cs | 378 + .../AssemblyExplorerAppSettingsPage.cs | 267 + dnSpy/dnSpy/Documents/Tabs/TabCommands.cs | 644 + dnSpy/dnSpy/Documents/Tabs/TabContentImpl.cs | 522 + dnSpy/dnSpy/Documents/Tabs/TabHistory.cs | 117 + ...NodeReferenceDocumentTabContentProvider.cs | 211 + .../Documents/TargetFrameworkAttributeInfo.cs | 47 + .../TreeView/AssemblyDocumentNodeImpl.cs | 65 + .../AssemblyExplorerMostRecentlyUsedList.cs | 86 + .../TreeView/AssemblyReferenceNodeImpl.cs | 75 + .../TreeView/BaseTypeFolderNodeImpl.cs | 70 + .../Documents/TreeView/BaseTypeNodeImpl.cs | 100 + .../TreeView/ContentTypeDefinitions.cs | 33 + .../TreeView/DefaultDsDocumentNodeProvider.cs | 41 + .../Documents/TreeView/DerivedTypeNodeImpl.cs | 95 + .../Documents/TreeView/DerivedTypesFinder.cs | 90 + .../TreeView/DerivedTypesFolderNodeImpl.cs | 69 + .../TreeView/DocumentTreeNodeDataContext.cs | 59 + .../TreeView/DocumentTreeNodeGroups.cs | 625 + .../Documents/TreeView/DocumentTreeView.cs | 905 ++ .../DocumentTreeViewAppSettingsConstants.cs | 29 + ...mentTreeViewAppSettingsModifiedListener.cs | 38 + .../TreeView/DocumentTreeViewProvider.cs | 67 + .../TreeView/DocumentTreeViewSettings.cs | 211 + .../dnSpy/Documents/TreeView/EventNodeImpl.cs | 69 + .../dnSpy/Documents/TreeView/FieldNodeImpl.cs | 57 + .../TreeView/MemberReferenceFinder.cs | 183 + .../Documents/TreeView/MessageNodeImpl.cs | 49 + .../Documents/TreeView/MethodNodeImpl.cs | 57 + .../TreeView/ModuleDocumentNodeImpl.cs | 99 + .../TreeView/ModuleReferenceNodeImpl.cs | 49 + .../Documents/TreeView/NamespaceNodeImpl.cs | 73 + .../Documents/TreeView/PEDocumentNodeImpl.cs | 60 + .../Documents/TreeView/PropertyNodeImpl.cs | 67 + .../TreeView/ReferencesFolderNodeImpl.cs | 67 + .../BuiltInResourceElementNodeImpl.cs | 88 + .../TreeView/Resources/ImageResourceNode.cs | 221 + .../Resources/ResourceElementSetNodeImpl.cs | 114 + .../TreeView/Resources/ResourceNodeFactory.cs | 88 + ...zedImageListStreamerResourceElementNode.cs | 107 + .../SerializedImageResourceElementNode.cs | 119 + .../Resources/UnknownResourceNodeImpl.cs | 59 + .../UnknownSerializedResourceElementNode.cs | 37 + .../TreeView/ResourcesFolderNodeImpl.cs | 67 + dnSpy/dnSpy/Documents/TreeView/RootNode.cs | 86 + .../dnSpy/Documents/TreeView/TypeNodeImpl.cs | 80 + .../TreeView/TypeReferencesFolderNodeImpl.cs | 492 + .../TreeView/UnknownDocumentNodeImpl.cs | 46 + dnSpy/dnSpy/Events/WeakEventList.cs | 116 + dnSpy/dnSpy/Extension/ExtensionConfig.cs | 43 + .../dnSpy/Extension/ExtensionConfigReader.cs | 66 + dnSpy/dnSpy/Extension/ExtensionService.cs | 102 + dnSpy/dnSpy/Extension/LoadedExtension.cs | 28 + .../DOTNET Framework v3.5 Client.FileList.xml | 94 + .../DOTNET Framework v4.0 Client.FileList.xml | 93 + .../HexToolTipProviderFactoryImpl.cs | 37 + .../Hex/Adornments/HexToolTipProviderImpl.cs | 100 + dnSpy/dnSpy/Hex/ByteArrayHexBufferStream.cs | 444 + .../DnSpy/ContentTypeDefinitions.cs | 38 + .../DnSpy/HexTextElementCreatorImpl.cs | 49 + .../HexTextElementCreatorProviderImpl.cs | 48 + .../HexBufferClassifierAggregator.cs | 30 + .../HexClassificationFormatMapServiceImpl.cs | 36 + .../Classification/HexClassifierAggregator.cs | 164 + .../HexClassifierAggregatorServiceImpl.cs | 45 + .../HexEditorFormatMapServiceImpl.cs | 36 + dnSpy/dnSpy/Hex/Classification/HexTextView.cs | 150 + .../HexViewClassificationFormatMap.cs | 39 + .../HexViewClassifierAggregator.cs | 30 + .../HexViewClassifierAggregatorServiceImpl.cs | 45 + .../Classification/HexViewEditorFormatMap.cs | 39 + .../dnSpy/Hex/Commands/CommandInfoProvider.cs | 39 + .../dnSpy/Hex/Commands/CommandTargetFilter.cs | 199 + dnSpy/dnSpy/Hex/Commands/GoToMetadataDlg.xaml | 80 + .../Hex/Commands/GoToMetadataDlg.xaml.cs | 46 + dnSpy/dnSpy/Hex/Commands/GoToMetadataVM.cs | 240 + dnSpy/dnSpy/Hex/Commands/GoToPositionDlg.xaml | 79 + .../Hex/Commands/GoToPositionDlg.xaml.cs | 44 + dnSpy/dnSpy/Hex/Commands/GoToPositionVM.cs | 87 + .../dnSpy/Hex/Commands/HexCommandConstants.cs | 26 + dnSpy/dnSpy/Hex/Commands/HexCommandIds.cs | 39 + .../Hex/Commands/HexCommandIdsExtensions.cs | 27 + .../Hex/Commands/HexCommandOperations.cs | 478 + .../HexCommandOperationsFactoryService.cs | 55 + dnSpy/dnSpy/Hex/Commands/HexPositionVM.cs | 71 + dnSpy/dnSpy/Hex/Commands/Integer64VM.cs | 59 + .../dnSpy/Hex/Commands/LocalSettingsDlg.xaml | 90 + .../Hex/Commands/LocalSettingsDlg.xaml.cs | 26 + dnSpy/dnSpy/Hex/Commands/LocalSettingsVM.cs | 158 + dnSpy/dnSpy/Hex/Commands/SelectDlg.xaml | 102 + dnSpy/dnSpy/Hex/Commands/SelectDlg.xaml.cs | 48 + dnSpy/dnSpy/Hex/Commands/SelectVM.cs | 107 + dnSpy/dnSpy/Hex/Commands/SettingsConstants.cs | 63 + .../dnSpy/Hex/ContextMenuCommands/Commands.cs | 503 + .../ContextMenuCommands/EditFieldCommand.cs | 267 + .../Hex/Editor/ActiveColumnHighlighter.cs | 304 + dnSpy/dnSpy/Hex/Editor/BottomControlMargin.cs | 39 + .../Hex/Editor/BottomRightCornerMargin.cs | 70 + .../dnSpy/Hex/Editor/ColumnLineSeparators.cs | 370 + .../Editor/CopyWpfHexViewCreationListener.cs | 37 + .../Hex/Editor/CurrentLineHighlighter.cs | 258 + .../Hex/Editor/CurrentValueHighlighter.cs | 375 + .../DefaultHexEditorCommandInfoProvider.cs | 142 + .../Hex/Editor/DefaultHexMouseProcessor.cs | 49 + .../Hex/Editor/DefaultHexViewCommandTarget.cs | 673 + .../Editor/DefaultHexViewMouseProcessor.cs | 358 + .../Hex/Editor/HexAdornmentLayerCollection.cs | 101 + .../HexAdornmentLayerDefinitionService.cs | 26 + .../HexAdornmentLayerDefinitionServiceImpl.cs | 45 + .../Editor/HexAdornmentLayerElementImpl.cs | 41 + .../dnSpy/Hex/Editor/HexAdornmentLayerImpl.cs | 208 + dnSpy/dnSpy/Hex/Editor/HexCaretImpl.cs | 751 ++ dnSpy/dnSpy/Hex/Editor/HexCaretLayer.cs | 437 + .../Hex/Editor/HexContextMenuInitializer.cs | 73 + .../Hex/Editor/HexEditorFactoryServiceImpl.cs | 174 + dnSpy/dnSpy/Hex/Editor/HexEditorOptions.cs | 173 + .../HexEditorOptionsFactoryServiceImpl.cs | 57 + dnSpy/dnSpy/Hex/Editor/HexGlyphMargin.cs | 457 + .../HexEditorGroupFactoryServiceImpl.cs | 69 + .../HexImageReferenceGlyphFactoryProvider.cs | 57 + .../Editor/HexIntraTextAdornmentService.cs | 395 + .../Hex/Editor/HexKeyProcessorCollection.cs | 165 + .../Editor/HexMarginContextMenuServiceImpl.cs | 99 + dnSpy/dnSpy/Hex/Editor/HexMarkerHelper.cs | 73 + dnSpy/dnSpy/Hex/Editor/HexMarkerService.cs | 398 + dnSpy/dnSpy/Hex/Editor/HexMouseLocation.cs | 93 + .../Hex/Editor/HexMouseProcessorCollection.cs | 409 + dnSpy/dnSpy/Hex/Editor/HexPopupHelper.cs | 82 + .../Editor/HexPopupSpaceReservationAgent.cs | 378 + .../Editor/HexReferenceHandlerServiceImpl.cs | 65 + .../Editor/HexScrollMapFactoryServiceImpl.cs | 33 + dnSpy/dnSpy/Hex/Editor/HexScrollMapImpl.cs | 113 + .../Hex/Editor/HexSelectionExtensions.cs | 43 + dnSpy/dnSpy/Hex/Editor/HexSelectionImpl.cs | 185 + dnSpy/dnSpy/Hex/Editor/HexSelectionLayer.cs | 189 + .../Editor/HexSpaceReservationManagerImpl.cs | 163 + .../Hex/Editor/HexSpaceReservationStack.cs | 66 + .../Editor/HexSpaceReservationStackImpl.cs | 135 + .../HexSpaceReservationStackProvider.cs | 26 + .../HexSpaceReservationStackProviderImpl.cs | 41 + .../HexStructureInfoAggregatorFactoryImpl.cs | 49 + .../Editor/HexStructureInfoAggregatorImpl.cs | 31 + .../Editor/HexToolTipStructureSpanTagger.cs | 66 + dnSpy/dnSpy/Hex/Editor/HexViewExtensions.cs | 33 + .../dnSpy/Hex/Editor/HexViewLineExtensions.cs | 44 + .../Editor/HexViewMouseProcessorCollection.cs | 74 + dnSpy/dnSpy/Hex/Editor/HexViewScrollerImpl.cs | 344 + .../HorizontalScrollBarContainerMargin.cs | 46 + .../Hex/Editor/HorizontalScrollBarMargin.cs | 126 + .../KeyboardWpfHexViewCreationListener.cs | 45 + dnSpy/dnSpy/Hex/Editor/LeftSelectionMargin.cs | 114 + dnSpy/dnSpy/Hex/Editor/MetadataAndOrder.cs | 29 + .../Editor/MouseWpfHexViewCreationListener.cs | 50 + .../dnSpy/Hex/Editor/OffsetCursorProvider.cs | 121 + dnSpy/dnSpy/Hex/Editor/RightControlMargin.cs | 39 + .../Hex/Editor/Search/CommandTargetFilter.cs | 113 + .../Search/CommandTargetFilterProvider.cs | 57 + dnSpy/dnSpy/Hex/Editor/Search/DataParser.cs | 285 + dnSpy/dnSpy/Hex/Editor/Search/HexDataKind.cs | 36 + .../Hex/Editor/Search/HexMarkerTagger.cs | 73 + .../Editor/Search/HexSearchServiceFactory.cs | 103 + .../Hex/Editor/Search/HexViewSearchService.cs | 1273 ++ .../Search/HexViewSearchServiceProvider.cs | 53 + .../Hex/Editor/Search/SearchControl.xaml | 352 + .../Hex/Editor/Search/SearchControl.xaml.cs | 26 + .../dnSpy/Hex/Editor/Search/SearchSettings.cs | 55 + dnSpy/dnSpy/Hex/Editor/SelectionUtilities.cs | 39 + dnSpy/dnSpy/Hex/Editor/SpacerMargin.cs | 86 + dnSpy/dnSpy/Hex/Editor/TextLayer.cs | 75 + .../VerticalScrollBarContainerMargin.cs | 41 + .../Hex/Editor/VerticalScrollBarMargin.cs | 183 + dnSpy/dnSpy/Hex/Editor/WpfHexViewConstants.cs | 33 + .../Hex/Editor/WpfHexViewContainerMargin.cs | 109 + dnSpy/dnSpy/Hex/Editor/WpfHexViewHostImpl.cs | 183 + .../Hex/Editor/WpfHexViewImpl.LayoutHelper.cs | 276 + .../Editor/WpfHexViewImpl.MouseHoverHelper.cs | 246 + dnSpy/dnSpy/Hex/Editor/WpfHexViewImpl.cs | 1159 ++ .../Editor/WpfHexViewLineCollectionImpl.cs | 259 + .../WpfHexViewMarginProviderCollectionImpl.cs | 126 + ...iewMarginProviderCollectionProviderImpl.cs | 50 + dnSpy/dnSpy/Hex/Editor/ZoomControlMargin.cs | 214 + .../Files/DefaultHexStructureInfoProvider.cs | 97 + .../DefaultHexFileStructureInfoProvider.cs | 76 + .../DotNetHexFileImageReferenceProvider.cs | 42 + .../DotNetHexFileStructureInfoProvider.cs | 335 + .../Files/DnSpy/HexReferenceConverterImpl.cs | 94 + .../Hex/Files/DnSpy/ImageReferenceUtils.cs | 159 + .../Hex/Files/DnSpy/ToolTipCreatorImpl.cs | 52 + .../Files/DnSpy/ToolTipObjectFactoryImpl.cs | 108 + dnSpy/dnSpy/Hex/Files/DotNet/BlobHeapImpl.cs | 488 + .../Hex/Files/DotNet/DotNetCor20DataImpl.cs | 94 + .../DotNet/DotNetEmbeddedResourceImpl.cs | 44 + .../Hex/Files/DotNet/DotNetHeadersImpl.cs | 43 + .../Hex/Files/DotNet/DotNetHeapsReader.cs | 198 + .../DotNetHexFileStructureInfoProvider.cs | 343 + .../DotNet/DotNetMetadataHeaderDataImpl.cs | 90 + .../DotNet/DotNetMetadataHeaderReader.cs | 124 + .../Files/DotNet/DotNetMetadataHeadersImpl.cs | 74 + .../Files/DotNet/DotNetMethodProviderImpl.cs | 173 + .../DotNetMultiFileResourceHeaderDataImpl.cs | 117 + .../DotNet/DotNetMultiFileResourcesImpl.cs | 464 + .../DotNet/DotNetResourceProviderImpl.cs | 157 + .../Files/DotNet/DotNetStorageStreamImpl.cs | 47 + .../Files/DotNet/DotNetStructureProvider.cs | 174 + .../Hex/Files/DotNet/DotNetTableSizes.cs | 417 + .../dnSpy/Hex/Files/DotNet/ExceptionClause.cs | 105 + .../Hex/Files/DotNet/ExceptionHandlerTable.cs | 92 + .../Hex/Files/DotNet/FatMethodBodyImpl.cs | 85 + dnSpy/dnSpy/Hex/Files/DotNet/GUIDHeapImpl.cs | 44 + dnSpy/dnSpy/Hex/Files/DotNet/HotHeapImpl.cs | 34 + dnSpy/dnSpy/Hex/Files/DotNet/IDotNetHeap.cs | 26 + .../Hex/Files/DotNet/InvalidMethodBodyImpl.cs | 41 + .../dnSpy/Hex/Files/DotNet/MethodBodyInfo.cs | 62 + .../Hex/Files/DotNet/MethodBodyReader.cs | 145 + dnSpy/dnSpy/Hex/Files/DotNet/MethodSection.cs | 68 + .../MultiResourceStructureProviderFactory.cs | 57 + dnSpy/dnSpy/Hex/Files/DotNet/NameUtils.cs | 53 + dnSpy/dnSpy/Hex/Files/DotNet/PdbHeapImpl.cs | 129 + .../Files/DotNet/PdbStreamHeaderDataImpl.cs | 49 + .../Hex/Files/DotNet/StorageStreamHeader.cs | 36 + .../dnSpy/Hex/Files/DotNet/StringsHeapImpl.cs | 276 + .../Files/DotNet/TableRecordDataFactory.cs | 680 + .../Hex/Files/DotNet/TablesHeaderDataImpl.cs | 150 + .../dnSpy/Hex/Files/DotNet/TablesHeapImpl.cs | 281 + .../Hex/Files/DotNet/TinyMethodBodyImpl.cs | 50 + dnSpy/dnSpy/Hex/Files/DotNet/USHeapImpl.cs | 128 + .../dnSpy/Hex/Files/DotNet/UnknownHeapImpl.cs | 34 + dnSpy/dnSpy/Hex/Files/HexBufferFileImpl.cs | 186 + .../Files/HexBufferFileServiceFactoryImpl.cs | 52 + .../Hex/Files/HexBufferFileServiceImpl.cs | 101 + .../dnSpy/Hex/Files/HexFieldFormatterImpl.cs | 261 + .../HexFileStructureInfoServiceFactoryImpl.cs | 47 + .../Files/HexFileStructureInfoServiceImpl.cs | 155 + dnSpy/dnSpy/Hex/Files/NumberFormatter.cs | 325 + .../Hex/Files/PE/DataDirectoryDataUtils.cs | 44 + .../dnSpy/Hex/Files/PE/ImageSectionHeader.cs | 33 + .../dnSpy/Hex/Files/PE/PeDosHeaderDataImpl.cs | 105 + .../Hex/Files/PE/PeFileHeaderDataImpl.cs | 120 + dnSpy/dnSpy/Hex/Files/PE/PeHeadersImpl.cs | 103 + dnSpy/dnSpy/Hex/Files/PE/PeHeadersReader.cs | 207 + .../PE/PeHexFileStructureInfoProvider.cs | 106 + .../Files/PE/PeOptionalHeader32DataImpl.cs | 192 + .../Files/PE/PeOptionalHeader64DataImpl.cs | 139 + dnSpy/dnSpy/Hex/Files/PE/PeSectionDataImpl.cs | 117 + .../dnSpy/Hex/Files/PE/PeStructureProvider.cs | 120 + dnSpy/dnSpy/Hex/Files/SpanDataCollection.cs | 118 + .../ToolTips/HexToolTipContentCreatorImpl.cs | 81 + .../FormattedHexSourceFactoryServiceImpl.cs | 45 + ...AndAdornmentSequencerFactoryServiceImpl.cs | 40 + .../HexAndAdornmentSequencerImpl.cs | 176 + .../Hex/Formatting/HexFormattedLineImpl.cs | 697 ++ .../Formatting/HexFormattedLineSourceImpl.cs | 182 + dnSpy/dnSpy/Hex/Formatting/HexHtmlBuilder.cs | 114 + .../Formatting/HexHtmlBuilderServiceImpl.cs | 95 + dnSpy/dnSpy/Hex/Formatting/HexLinePart.cs | 103 + .../Hex/Formatting/HexLinePartsCollection.cs | 106 + .../Hex/Formatting/HexLinePartsTextSource.cs | 123 + .../HexLineTransformProviderService.cs | 76 + dnSpy/dnSpy/Hex/Formatting/PhysicalLine.cs | 98 + .../dnSpy/Hex/Formatting/PhysicalLineCache.cs | 81 + .../dnSpy/Hex/HexBufferFactoryServiceImpl.cs | 56 + dnSpy/dnSpy/Hex/HexBufferImpl.cs | 218 + ...exBufferLineFormatterFactoryServiceImpl.cs | 35 + dnSpy/dnSpy/Hex/HexBufferLineFormatterImpl.cs | 703 ++ dnSpy/dnSpy/Hex/HexBufferLineImpl.cs | 78 + .../Hex/HexBufferStreamFactoryServiceImpl.cs | 44 + dnSpy/dnSpy/Hex/HexCachedBufferStreamImpl.cs | 497 + dnSpy/dnSpy/Hex/HexEditImpl.cs | 110 + .../Hex/HexEditor/AdvancedAppSettingsPage.cs | 38 + .../Hex/HexEditor/AppSettingsPageContainer.cs | 25 + .../Hex/HexEditor/AppSettingsPageProvider.cs | 65 + .../Hex/HexEditor/GeneralAppSettingsPage.cs | 38 + dnSpy/dnSpy/Hex/HexEditor/HexEditorOptions.cs | 60 + .../HexEditor/HexEditorOptionsDefinitions.cs | 31 + .../Hex/HexEditor/HexEditorOptionsService.cs | 42 + .../HexViewOptionsGroupNameProviderImpl.cs | 32 + .../Hex/HexEditor/MainAppSettingsPage.cs | 40 + .../HexEditor/ScrollBarsAppSettingsPage.cs | 38 + .../TagOptionDefinitionProviderImpl.cs | 92 + .../dnSpy/Hex/HexGroups/HexViewGroupOption.cs | 50 + .../HexGroups/HexViewGroupOptionCollection.cs | 73 + .../Hex/HexGroups/HexViewOptionsGroupImpl.cs | 189 + .../HexViewOptionsGroupServiceImpl.cs | 101 + dnSpy/dnSpy/Hex/HexGroups/OptionsStorage.cs | 220 + dnSpy/dnSpy/Hex/HexOffsetFormatter.cs | 88 + .../dnSpy/Hex/HexProcessSimpleBufferStream.cs | 163 + dnSpy/dnSpy/Hex/HexValueFormatter.cs | 957 ++ dnSpy/dnSpy/Hex/HexVersionImpl.cs | 54 + .../DnSpy/QuickInfoCommandTargetFilter.cs | 102 + .../HexIntellisenseControllerService.cs | 64 + .../HexIntellisensePresenterFactoryService.cs | 50 + ...nseSessionStackImpl.CommandTargetFilter.cs | 103 + .../HexIntellisenseSessionStackImpl.cs | 348 + ...xIntellisenseSessionStackMapServiceImpl.cs | 37 + .../Intellisense/HexQuickInfoBrokerImpl.cs | 85 + .../Intellisense/HexQuickInfoController.cs | 77 + .../HexQuickInfoControllerProvider.cs | 35 + .../Hex/Intellisense/HexQuickInfoPresenter.cs | 165 + .../Intellisense/HexQuickInfoPresenterBase.cs | 70 + .../HexQuickInfoPresenterControl.xaml | 76 + .../HexQuickInfoPresenterControl.xaml.cs | 26 + .../HexQuickInfoPresenterProvider.cs | 37 + .../Intellisense/HexQuickInfoSessionImpl.cs | 169 + .../HexSpaceReservationQuickInfoPresenter.cs | 67 + .../Hex/Intellisense/HexToolTipService.cs | 336 + .../SpaceReservationManagerDefinitions.cs | 33 + dnSpy/dnSpy/Hex/MEF/Metadata.cs | 104 + dnSpy/dnSpy/Hex/NativeMethods.cs | 104 + ...alizedHexBufferSpanCollectionExtensions.cs | 32 + .../Hex/Operations/ByteHexSearchService.cs | 563 + dnSpy/dnSpy/Hex/Operations/ClipboardUtils.cs | 107 + .../HexEditorOperationsFactoryServiceImpl.cs | 55 + .../Hex/Operations/HexEditorOperationsImpl.cs | 1281 ++ .../Hex/Operations/HexSearchServiceImpl.cs | 150 + .../HexSearchServiceProviderImpl.cs | 53 + dnSpy/dnSpy/Hex/Operations/MDUtils.cs | 69 + .../Hex/Operations/StringHexSearchService.cs | 496 + .../Operations/Utf16StringHexSearchService.cs | 41 + .../Operations/Utf8StringHexSearchService.cs | 32 + .../Settings/AdvancedAppSettingsPageBase.cs | 161 + .../dnSpy/Hex/Settings/CommonEditorOptions.cs | 160 + .../Settings/GeneralAppSettingsPageBase.cs | 177 + .../Settings/ScrollBarsAppSettingsPageBase.cs | 64 + dnSpy/dnSpy/Hex/Tagging/DefaultTagger.cs | 145 + .../Hex/Tagging/HexBufferTagAggregator.cs | 36 + ...exBufferTagAggregatorFactoryServiceImpl.cs | 39 + dnSpy/dnSpy/Hex/Tagging/HexTaggerFactory.cs | 76 + .../dnSpy/Hex/Tagging/HexViewTagAggregator.cs | 48 + .../HexViewTagAggregatorFactoryServiceImpl.cs | 39 + dnSpy/dnSpy/Hex/Tagging/TagAggregator.cs | 207 + .../Images/DefaultImageSourceInfoProvider.cs | 123 + dnSpy/dnSpy/Images/DotNetImageService.cs | 370 + .../DsImageBitmapScalingModeConverter.cs | 48 + dnSpy/dnSpy/Images/DsImageConverter.cs | 62 + dnSpy/dnSpy/Images/ImageReferenceHelper.cs | 42 + dnSpy/dnSpy/Images/ImageService.cs | 288 + dnSpy/dnSpy/Images/ThemedImageCreator.cs | 144 + dnSpy/dnSpy/Images/dnSpy-x86.ico | Bin 0 -> 67646 bytes dnSpy/dnSpy/Images/dnSpy.ico | Bin 0 -> 67646 bytes .../CollectionBooleanToVisibilityConverter.cs | 35 + .../Language/Intellisense/CompletionBroker.cs | 96 + .../Intellisense/CompletionCollectionVM.cs | 126 + .../Language/Intellisense/CompletionIconVM.cs | 26 + .../Intellisense/CompletionPresenter.cs | 700 ++ .../CompletionPresenterControl.xaml | 121 + .../CompletionPresenterControl.xaml.cs | 26 + .../CompletionPresenterProvider.cs | 51 + .../Intellisense/CompletionSession.cs | 231 + .../CompletionSessionCommandTargetFilter.cs | 111 + .../CompletionSuffixTextClassifier.cs | 59 + .../Intellisense/CompletionTextConverter.cs | 48 + .../CompletionTextElementProvider.cs | 93 + .../CompletionTextElementProviderService.cs | 43 + .../Language/Intellisense/CompletionVM.cs | 108 + .../Intellisense/ContentTypeDefinitions.cs | 48 + .../CurrentLineSpaceReservationService.cs | 146 + ...FilterMatchCompletionClassifierProvider.cs | 61 + .../Intellisense/FilterToolTipConverter.cs | 36 + dnSpy/dnSpy/Language/Intellisense/FilterVM.cs | 66 + .../ICompletionTextElementProvider.cs | 41 + .../ICompletionTextElementProviderService.cs | 31 + .../IntellisenseControllerService.cs | 116 + .../IntellisensePresenterFactoryService.cs | 57 + .../Intellisense/IntellisenseSessionHelper.cs | 51 + ...lisenseSessionStack.CommandTargetFilter.cs | 104 + .../Intellisense/IntellisenseSessionStack.cs | 347 + .../IntellisenseSessionStackMapService.cs | 37 + .../Intellisense/PresenterMouseProcessor.cs | 100 + .../Language/Intellisense/QuickInfoBroker.cs | 87 + .../Intellisense/QuickInfoController.cs | 74 + .../QuickInfoControllerProvider.cs | 40 + .../Intellisense/QuickInfoPresenter.cs | 159 + .../Intellisense/QuickInfoPresenterBase.cs | 69 + .../QuickInfoPresenterControl.xaml | 76 + .../QuickInfoPresenterControl.xaml.cs | 26 + .../QuickInfoPresenterProvider.cs | 40 + .../Language/Intellisense/QuickInfoSession.cs | 190 + .../Intellisense/SignatureHelpBroker.cs | 96 + .../SignatureHelpCurrentParameterTagger.cs | 125 + .../Intellisense/SignatureHelpPresenter.cs | 447 + .../SignatureHelpPresenterControl.xaml | 122 + .../SignatureHelpPresenterControl.xaml.cs | 26 + .../SignatureHelpPresenterProvider.cs | 54 + .../Intellisense/SignatureHelpSession.cs | 231 + .../SpaceReservationManagerDefinitions.cs | 55 + .../SpaceReservationQuickInfoPresenter.cs | 65 + .../Intellisense/TrackingSpanHelpers.cs | 36 + dnSpy/dnSpy/Language/Intellisense/WpfUtils.cs | 103 + dnSpy/dnSpy/LicenseInfo/ApacheV2.txt | 202 + dnSpy/dnSpy/LicenseInfo/CREDITS.txt | 107 + dnSpy/dnSpy/LicenseInfo/GPLv3.txt | 674 + dnSpy/dnSpy/LicenseInfo/LICENSE.txt | 18 + dnSpy/dnSpy/LicenseInfo/OtherLicenses.txt | 185 + .../MVVM/InitializeDataTemplateContextMenu.cs | 41 + dnSpy/dnSpy/MainApp/AboutCommands.cs | 95 + dnSpy/dnSpy/MainApp/AboutScreen.cs | 264 + dnSpy/dnSpy/MainApp/App.xaml | 12 + dnSpy/dnSpy/MainApp/App.xaml.cs | 625 + dnSpy/dnSpy/MainApp/AppCommandLineArgs.cs | 273 + .../MainApp/AppCommandLineArgsHandler.cs | 104 + dnSpy/dnSpy/MainApp/AppSettings.cs | 60 + dnSpy/dnSpy/MainApp/AppStatusBar.cs | 64 + dnSpy/dnSpy/MainApp/AppToolBar.cs | 44 + dnSpy/dnSpy/MainApp/AppWindow.cs | 225 + dnSpy/dnSpy/MainApp/AskDlg.xaml | 57 + dnSpy/dnSpy/MainApp/AskDlg.xaml.cs | 26 + dnSpy/dnSpy/MainApp/AskVM.cs | 71 + dnSpy/dnSpy/MainApp/BGJitUtils.cs | 36 + dnSpy/dnSpy/MainApp/CachedMefInfo.cs | 173 + dnSpy/dnSpy/MainApp/Constants.cs | 26 + dnSpy/dnSpy/MainApp/DevBuildWarning.cs | 47 + .../MainApp/DocumentTreeViewWindowContent.cs | 97 + dnSpy/dnSpy/MainApp/DotNetAssemblyLoader.cs | 62 + dnSpy/dnSpy/MainApp/DsLoaderControl.xaml | 44 + dnSpy/dnSpy/MainApp/DsLoaderControl.xaml.cs | 26 + dnSpy/dnSpy/MainApp/DsLoaderService.cs | 148 + .../MainApp/DsToolWindowServiceCommands.cs | 342 + dnSpy/dnSpy/MainApp/MainWindow.xaml | 33 + dnSpy/dnSpy/MainApp/MainWindow.xaml.cs | 31 + dnSpy/dnSpy/MainApp/MainWindowControl.cs | 638 + dnSpy/dnSpy/MainApp/MessageBoxService.cs | 167 + dnSpy/dnSpy/MainApp/MsgBoxDlg.xaml | 54 + dnSpy/dnSpy/MainApp/MsgBoxDlg.xaml.cs | 54 + dnSpy/dnSpy/MainApp/MsgBoxVM.cs | 106 + .../MainApp/ResourceManagerTokenCacheImpl.cs | 72 + dnSpy/dnSpy/MainApp/SavedWindowState.cs | 118 + .../EnvironmentAppSettingsPageContainer.cs | 25 + .../MainApp/Settings/FontAppSettingsPage.cs | 234 + .../Settings/GeneralAppSettingsPage.cs | 209 + .../Settings/WindowsExplorerIntegration.cs | 129 + dnSpy/dnSpy/MainApp/StartUpClass.cs | 73 + dnSpy/dnSpy/MainApp/ToolBarCommands.cs | 125 + dnSpy/dnSpy/MainApp/ViewCommands.cs | 70 + dnSpy/dnSpy/Menus/AppMenus.cs | 37 + dnSpy/dnSpy/Menus/ContextMenuProvider.cs | 86 + dnSpy/dnSpy/Menus/MenuItemContext.cs | 83 + dnSpy/dnSpy/Menus/MenuService.cs | 460 + dnSpy/dnSpy/Metadata/ModuleIdProvider.cs | 74 + dnSpy/dnSpy/Output/CachedWriter.cs | 51 + dnSpy/dnSpy/Output/Commands.cs | 100 + dnSpy/dnSpy/Output/DefaultOutputOptions.cs | 32 + dnSpy/dnSpy/Output/EditorOptionDefinitions.cs | 35 + dnSpy/dnSpy/Output/NotPresentOutputWriter.cs | 55 + dnSpy/dnSpy/Output/NullOutputTextPane.cs | 39 + dnSpy/dnSpy/Output/OutputBufferVM.cs | 153 + dnSpy/dnSpy/Output/OutputCommands.cs | 42 + dnSpy/dnSpy/Output/OutputContent.cs | 129 + dnSpy/dnSpy/Output/OutputControl.xaml | 79 + dnSpy/dnSpy/Output/OutputControl.xaml.cs | 26 + dnSpy/dnSpy/Output/OutputService.cs | 275 + dnSpy/dnSpy/Output/OutputServiceSettings.cs | 64 + dnSpy/dnSpy/Output/OutputToolWindowContent.cs | 104 + .../Settings/AdvancedAppSettingsPage.cs | 34 + .../Settings/AppSettingsPageContainer.cs | 25 + .../Settings/AppSettingsPageProvider.cs | 39 + .../ContentTypeOptionDefinitionProvider.cs | 71 + .../Output/Settings/GeneralAppSettingsPage.cs | 67 + .../Output/Settings/IOutputWindowOptions.cs | 27 + .../Output/Settings/OptionChangedEventArgs.cs | 39 + .../Output/Settings/OutputWindowOptions.cs | 40 + .../Settings/OutputWindowOptionsService.cs | 47 + .../Settings/ScrollBarsAppSettingsPage.cs | 34 + .../Output/Settings/TabsAppSettingsPage.cs | 34 + .../TextViewOptionsGroupNameProvider.cs | 33 + .../TextAppearanceCategoryDefinitions.cs | 35 + .../Output/ThemeFontSettingsDefinitions.cs | 30 + .../Properties/dnSpy.Resources.Designer.cs | 5918 +++++++++ .../dnSpy/Properties/dnSpy.Resources.cs.resx | 2076 +++ .../dnSpy/Properties/dnSpy.Resources.de.resx | 2076 +++ .../Properties/dnSpy.Resources.es-ES.resx | 2075 +++ .../dnSpy/Properties/dnSpy.Resources.fa.resx | 2076 +++ .../dnSpy/Properties/dnSpy.Resources.fr.resx | 2074 +++ .../dnSpy/Properties/dnSpy.Resources.hu.resx | 2076 +++ .../dnSpy/Properties/dnSpy.Resources.it.resx | 2071 +++ .../Properties/dnSpy.Resources.pt-BR.resx | 2074 +++ .../Properties/dnSpy.Resources.pt-PT.resx | 2072 +++ dnSpy/dnSpy/Properties/dnSpy.Resources.resx | 2076 +++ .../dnSpy/Properties/dnSpy.Resources.ru.resx | 2075 +++ .../dnSpy/Properties/dnSpy.Resources.tr.resx | 2072 +++ .../dnSpy/Properties/dnSpy.Resources.uk.resx | 2071 +++ .../Properties/dnSpy.Resources.zh-CN.resx | 2075 +++ dnSpy/dnSpy/Scripting/ServiceLocator.cs | 64 + .../dnSpy/Search/AppCommandLineArgsHandler.cs | 182 + .../Search/BooleanToThicknessConverter.cs | 41 + dnSpy/dnSpy/Search/Commands.cs | 188 + dnSpy/dnSpy/Search/ContentTypeDefinitions.cs | 33 + dnSpy/dnSpy/Search/DocumentSearcher.cs | 202 + .../dnSpy/Search/DocumentSearcherProvider.cs | 57 + dnSpy/dnSpy/Search/FilterSearcher.cs | 736 ++ dnSpy/dnSpy/Search/FilterSearcherOptions.cs | 41 + dnSpy/dnSpy/Search/FrameworkFileUtils.cs | 479 + dnSpy/dnSpy/Search/SearchControl.xaml | 86 + dnSpy/dnSpy/Search/SearchControl.xaml.cs | 41 + dnSpy/dnSpy/Search/SearchControlVM.cs | 340 + dnSpy/dnSpy/Search/SearchResult.cs | 252 + dnSpy/dnSpy/Search/SearchResultContext.cs | 39 + dnSpy/dnSpy/Search/SearchService.cs | 266 + dnSpy/dnSpy/Search/SearchSettings.cs | 176 + dnSpy/dnSpy/Search/SearchToolWindowContent.cs | 75 + dnSpy/dnSpy/Search/SearchType.cs | 47 + dnSpy/dnSpy/Search/SearchTypeVM.cs | 42 + .../FontAndColorOptionsProviderImpl.cs | 62 + .../ITextAppearanceCategoryService.cs | 24 + .../TextAppearanceCategory.cs | 111 + .../TextAppearanceCategoryDefinitions.cs | 51 + .../TextAppearanceCategoryService.cs | 62 + .../Settings/Dialog/AppRefreshSettings.cs | 37 + .../dnSpy/Settings/Dialog/AppSettingsDlg.xaml | 374 + .../Settings/Dialog/AppSettingsDlg.xaml.cs | 26 + .../Settings/Dialog/AppSettingsPageVM.cs | 181 + .../Dialog/AppSettingsSearchTextClassifier.cs | 53 + .../Settings/Dialog/AppSettingsService.cs | 88 + .../AppSettingsTextClassifierContext.cs | 31 + ...ppSettingsTreeViewNodeClassifierContext.cs | 32 + ...ettingsTreeViewNodeSearchTextClassifier.cs | 54 + .../Dialog/ContentConverterPresenter.cs | 87 + .../Dialog/ContentConverterProperties.cs | 44 + .../Settings/Dialog/ContentTypeDefinitions.cs | 33 + .../Settings/Dialog/IContentConverter.cs | 34 + dnSpy/dnSpy/Settings/Dialog/PageContext.cs | 32 + dnSpy/dnSpy/Settings/Dialog/SearchMatcher.cs | 105 + .../SettingsAppCommandLineArgsHandler.cs | 56 + .../Settings/Dialog/ShowAppSettingsDialog.cs | 473 + .../Settings/Dialog/ShowOptionsCommand.cs | 36 + dnSpy/dnSpy/Settings/Dialog/UIHelpers.cs | 29 + dnSpy/dnSpy/Settings/Fonts/DefaultFontInfo.cs | 31 + .../dnSpy/Settings/Fonts/FontSettingsImpl.cs | 62 + .../Fonts/ThemeFontSettingsDefinitions.cs | 36 + .../Settings/Fonts/ThemeFontSettingsImpl.cs | 70 + .../Fonts/ThemeFontSettingsSerializer.cs | 166 + .../Fonts/ThemeFontSettingsServiceImpl.cs | 155 + dnSpy/dnSpy/Settings/SectionAttributes.cs | 85 + dnSpy/dnSpy/Settings/SettingsSection.cs | 60 + .../dnSpy/Settings/SettingsSectionProvider.cs | 93 + dnSpy/dnSpy/Settings/SettingsService.cs | 94 + dnSpy/dnSpy/Settings/SettingsService2.cs | 38 + .../dnSpy/Settings/SettingsServiceFactory.cs | 28 + dnSpy/dnSpy/Settings/XmlSettingsConstants.cs | 27 + dnSpy/dnSpy/Settings/XmlSettingsReader.cs | 77 + dnSpy/dnSpy/Settings/XmlSettingsWriter.cs | 77 + dnSpy/dnSpy/Settings/XmlUtils.cs | 107 + dnSpy/dnSpy/Tabs/TabElementZoomer.cs | 194 + dnSpy/dnSpy/Tabs/TabGroup.cs | 630 + dnSpy/dnSpy/Tabs/TabGroupService.cs | 346 + dnSpy/dnSpy/Tabs/TabItemImpl.cs | 154 + dnSpy/dnSpy/Tabs/TabService.cs | 74 + dnSpy/dnSpy/Tabs/TabServiceProvider.cs | 39 + dnSpy/dnSpy/Tabs/TabUtils.cs | 39 + .../dnSpy/Text/Adornments/ToolTipProvider.cs | 108 + .../Text/Adornments/ToolTipProviderFactory.cs | 37 + dnSpy/dnSpy/Text/AvalonEdit/CharRope.cs | 157 + dnSpy/dnSpy/Text/AvalonEdit/DocumentLine.cs | 218 + .../dnSpy/Text/AvalonEdit/DocumentLineTree.cs | 661 + dnSpy/dnSpy/Text/AvalonEdit/ITextSource.cs | 153 + dnSpy/dnSpy/Text/AvalonEdit/ImmutableStack.cs | 109 + dnSpy/dnSpy/Text/AvalonEdit/LineManager.cs | 224 + dnSpy/dnSpy/Text/AvalonEdit/LineNode.cs | 93 + dnSpy/dnSpy/Text/AvalonEdit/NewLineFinder.cs | 43 + dnSpy/dnSpy/Text/AvalonEdit/Rope.cs | 528 + dnSpy/dnSpy/Text/AvalonEdit/RopeNode.cs | 610 + dnSpy/dnSpy/Text/AvalonEdit/RopeTextSource.cs | 81 + dnSpy/dnSpy/Text/AvalonEdit/SimpleSegment.cs | 57 + dnSpy/dnSpy/Text/AvalonEdit/TextDocument.cs | 357 + dnSpy/dnSpy/Text/CachedColorsList.cs | 74 + dnSpy/dnSpy/Text/CachedColorsListTagger.cs | 115 + .../CategoryClassificationFormatMap.cs | 258 + .../Classification/CategoryEditorFormatMap.cs | 103 + .../CategoryEditorFormatMapUpdater.cs | 100 + .../Classification/ClassificationFontUtils.cs | 146 + .../ClassificationFormatMapService.cs | 81 + .../Text/Classification/ClassificationType.cs | 55 + .../ClassificationTypeRegistryService.cs | 167 + .../Classification/ClassifierAggregator.cs | 31 + .../ClassifierAggregatorBase.cs | 174 + .../ClassifierAggregatorService.cs | 52 + .../Text/Classification/ClassifierTagger.cs | 57 + .../ClassifierTaggerProvider.cs | 69 + .../DefaultTextClassifierProvider.cs | 62 + .../EditorFormatDefinitionExtensions.cs | 33 + .../EditorFormatDefinitionService.cs | 68 + .../Classification/EditorFormatMapService.cs | 87 + .../Text/Classification/NullClassifier.cs | 36 + .../TextClassifierAggregator.cs | 157 + .../TextClassifierAggregatorService.cs | 54 + .../Classification/TextElementProvider.cs | 67 + .../ThemeClassificationFormatDefinitions.cs | 4576 +++++++ .../ThemeClassificationTypeService.cs | 366 + .../ViewClassificationFormatMap.cs | 121 + .../ViewClassifierAggregator.cs | 31 + .../ViewClassifierAggregatorService.cs | 52 + .../Classification/ViewEditorFormatMap.cs | 110 + .../CodeEditor/AdvancedAppSettingsPage.cs | 38 + .../CodeEditor/AppSettingsPageContainer.cs | 25 + .../CodeEditor/AppSettingsPageProvider.cs | 67 + .../Text/CodeEditor/CodeEditorOptions.cs | 62 + .../CodeEditor/CodeEditorOptionsService.cs | 43 + .../ContentTypeOptionDefinitionProvider.cs | 86 + .../Text/CodeEditor/GeneralAppSettingsPage.cs | 38 + .../Text/CodeEditor/ICodeEditorOptions.cs | 28 + .../CodeEditor/LanguageAppSettingsPage.cs | 40 + .../CodeEditor/ScrollBarsAppSettingsPage.cs | 38 + .../Text/CodeEditor/TabsAppSettingsPage.cs | 38 + .../TextViewOptionsGroupNameProvider.cs | 33 + dnSpy/dnSpy/Text/ColorUtils.cs | 36 + dnSpy/dnSpy/Text/ContentType.cs | 59 + dnSpy/dnSpy/Text/ContentTypeDefinitions.cs | 134 + dnSpy/dnSpy/Text/ContentTypeExtensions.cs | 34 + .../dnSpy/Text/ContentTypeRegistryService.cs | 217 + .../ContentTypeRegistryServiceExtensions.cs | 32 + dnSpy/dnSpy/Text/Editor/AdornmentLayer.cs | 221 + .../Text/Editor/AdornmentLayerCollection.cs | 102 + .../Editor/AdornmentLayerDefinitionService.cs | 45 + .../Text/Editor/AdornmentLayerElement.cs | 46 + .../Text/Editor/BlockStructureService.cs | 563 + .../dnSpy/Text/Editor/BottomControlMargin.cs | 40 + .../Text/Editor/BottomRightCornerMargin.cs | 69 + dnSpy/dnSpy/Text/Editor/BoxSelectionHelper.cs | 62 + dnSpy/dnSpy/Text/Editor/CodeEditor.cs | 68 + dnSpy/dnSpy/Text/Editor/CodeEditorProvider.cs | 44 + .../Text/Editor/CommonGuidObjectsProvider.cs | 51 + .../Text/Editor/ContextMenuInitializer.cs | 64 + .../Editor/CopyWpfTextViewCreationListener.cs | 43 + .../Text/Editor/CurrentLineHighlighter.cs | 257 + .../Text/Editor/CustomLineNumberMargin.cs | 106 + .../Editor/DefaultEditorOptionDefinitions.cs | 30 + .../Text/Editor/DefaultMouseProcessor.cs | 49 + .../DefaultReplEditorOptionDefinitions.cs | 37 + dnSpy/dnSpy/Text/Editor/DefaultSmartIndent.cs | 33 + .../DefaultTextEditorCommandInfoProvider.cs | 170 + .../Editor/DefaultTextViewCommandTarget.cs | 781 ++ .../DefaultTextViewEditorOptionDefinitions.cs | 115 + .../Editor/DefaultTextViewMouseProcessor.cs | 377 + .../DefaultWpfViewEditorOptionDefinitions.cs | 30 + dnSpy/dnSpy/Text/Editor/DsScrollBar.cs | 65 + dnSpy/dnSpy/Text/Editor/EditorOptions.cs | 172 + .../Editor/EditorOptionsFactoryService.cs | 57 + .../dnSpy/Text/Editor/EditorPositionState.cs | 51 + dnSpy/dnSpy/Text/Editor/GlyphMargin.cs | 459 + .../Text/Editor/GlyphTextMarkerService.cs | 212 + .../GlyphTextMarkerServiceMouseProcessor.cs | 580 + ...GlyphTextViewMarkerClassificationTagger.cs | 77 + .../Editor/GlyphTextViewMarkerGlyphTagger.cs | 116 + ...lyphTextViewMarkerGlyphTextMarkerTagger.cs | 77 + .../Text/Editor/GlyphTextViewMarkerService.cs | 858 ++ dnSpy/dnSpy/Text/Editor/GoToCommand.cs | 164 + .../HorizontalScrollBarContainerMargin.cs | 47 + .../Text/Editor/HorizontalScrollBarMargin.cs | 126 + .../IAdornmentLayerDefinitionService.cs | 26 + .../Editor/IGlyphTextMarkerServiceImpl.cs | 88 + dnSpy/dnSpy/Text/Editor/IReplEditor2.cs | 61 + .../Text/Editor/ISpaceReservationStack.cs | 61 + .../Editor/ISpaceReservationStackProvider.cs | 31 + ...xtViewConnectionListenerServiceProvider.cs | 26 + .../IncrementalSearch/IncrementalSearch.cs | 130 + .../IncrementalSearchFactoryService.cs | 44 + dnSpy/dnSpy/Text/Editor/IndentHelper.cs | 101 + .../Text/Editor/IntraTextAdornmentService.cs | 342 + .../Text/Editor/KeyProcessorCollection.cs | 172 + .../KeyboardWpfTextViewCreationListener.cs | 46 + .../dnSpy/Text/Editor/LeftSelectionMargin.cs | 111 + dnSpy/dnSpy/Text/Editor/LineCompressor.cs | 130 + dnSpy/dnSpy/Text/Editor/LineNumberMargin.cs | 83 + .../dnSpy/Text/Editor/LineNumberMarginBase.cs | 410 + .../dnSpy/Text/Editor/LineSeparatorService.cs | 342 + dnSpy/dnSpy/Text/Editor/LogEditor.cs | 230 + dnSpy/dnSpy/Text/Editor/LogEditorProvider.cs | 44 + .../Text/Editor/MarginContextMenuService.cs | 100 + dnSpy/dnSpy/Text/Editor/MarkerHelper.cs | 160 + dnSpy/dnSpy/Text/Editor/MetadataAndOrder.cs | 29 + dnSpy/dnSpy/Text/Editor/MouseLocation.cs | 100 + .../Text/Editor/MouseProcessorCollection.cs | 409 + .../MouseWpfTextViewCreationListener.cs | 51 + .../Editor/NullRegisteredCommandElement.cs | 38 + .../Editor/Operations/TextViewUndoManager.cs | 59 + .../Operations/TextViewUndoManagerProvider.cs | 58 + .../Operations/UndoRedoCommandTargetFilter.cs | 82 + dnSpy/dnSpy/Text/Editor/OptionsHelpers.cs | 67 + .../OutputTextPaneCommandInfoProvider.cs | 37 + .../OutputTextPaneCommandTargetFilter.cs | 78 + ...tputTextPaneCommandTargetFilterProvider.cs | 35 + .../dnSpy/Text/Editor/OutputTextPaneUtils.cs | 56 + dnSpy/dnSpy/Text/Editor/PopupHelper.cs | 82 + .../Text/Editor/PopupSpaceReservationAgent.cs | 362 + dnSpy/dnSpy/Text/Editor/ReplBufferKind.cs | 25 + .../Text/Editor/ReplCommandInfoProvider.cs | 44 + .../Text/Editor/ReplCommandTargetFilter.cs | 693 ++ .../Editor/ReplCommandTargetFilterProvider.cs | 35 + dnSpy/dnSpy/Text/Editor/ReplCommands.cs | 114 + dnSpy/dnSpy/Text/Editor/ReplEditor.cs | 1075 ++ dnSpy/dnSpy/Text/Editor/ReplEditorProvider.cs | 59 + .../Text/Editor/ReplEditorReplaceListener.cs | 44 + dnSpy/dnSpy/Text/Editor/ReplSubBuffer.cs | 32 + .../Editor/ResourceDictionaryUtilities.cs | 36 + dnSpy/dnSpy/Text/Editor/RightControlMargin.cs | 40 + dnSpy/dnSpy/Text/Editor/ScrollMap.cs | 153 + .../Text/Editor/ScrollMapFactoryService.cs | 34 + .../Text/Editor/Search/CommandTargetFilter.cs | 113 + .../Search/CommandTargetFilterProvider.cs | 57 + .../Text/Editor/Search/SearchControl.xaml | 353 + .../Text/Editor/Search/SearchControl.xaml.cs | 26 + .../dnSpy/Text/Editor/Search/SearchService.cs | 1158 ++ .../Editor/Search/SearchServiceProvider.cs | 62 + .../Text/Editor/Search/SearchSettings.cs | 49 + .../Text/Editor/Search/TextMarkerTagger.cs | 72 + .../Search/WpfTextViewCreationListener.cs | 37 + dnSpy/dnSpy/Text/Editor/SelectionUtilities.cs | 40 + .../Text/Editor/SmartIndentationService.cs | 95 + .../Text/Editor/SpaceReservationManager.cs | 162 + .../Text/Editor/SpaceReservationStack.cs | 134 + .../Editor/SpaceReservationStackProvider.cs | 41 + dnSpy/dnSpy/Text/Editor/SpacerMargin.cs | 86 + dnSpy/dnSpy/Text/Editor/SystemTextCaret.cs | 37 + dnSpy/dnSpy/Text/Editor/TextCaret.cs | 563 + dnSpy/dnSpy/Text/Editor/TextCaretLayer.cs | 300 + .../Text/Editor/TextEditorFactoryService.cs | 243 + .../Text/Editor/TextFormattingUtilities.cs | 47 + dnSpy/dnSpy/Text/Editor/TextLayer.cs | 73 + dnSpy/dnSpy/Text/Editor/TextMarkerService.cs | 398 + .../TextReferenceCommandInfoProvider.cs | 41 + dnSpy/dnSpy/Text/Editor/TextSelection.cs | 230 + .../Text/Editor/TextSelectionExtensions.cs | 41 + dnSpy/dnSpy/Text/Editor/TextSelectionLayer.cs | 238 + .../Text/Editor/TextSnapshotLineExtensions.cs | 40 + dnSpy/dnSpy/Text/Editor/TextViewExtensions.cs | 32 + .../Text/Editor/TextViewLineExtensions.cs | 61 + dnSpy/dnSpy/Text/Editor/TextViewModel.cs | 49 + .../TextViewMouseProcessorCollection.cs | 81 + dnSpy/dnSpy/Text/Editor/TextViewRoleSet.cs | 80 + .../Text/Editor/UriClassificationTagger.cs | 79 + dnSpy/dnSpy/Text/Editor/UriFinder.cs | 123 + dnSpy/dnSpy/Text/Editor/UriHelper.cs | 43 + dnSpy/dnSpy/Text/Editor/UriMouseProcessor.cs | 137 + .../Text/Editor/UriQuickInfoSourceProvider.cs | 81 + dnSpy/dnSpy/Text/Editor/UriTagger.cs | 131 + .../Editor/UriWpfTextViewCreationListener.cs | 44 + .../VerticalScrollBarContainerMargin.cs | 42 + .../Text/Editor/VerticalScrollBarMargin.cs | 161 + dnSpy/dnSpy/Text/Editor/ViewScroller.cs | 336 + .../Text/Editor/WpfTextView.LayoutHelper.cs | 279 + .../Editor/WpfTextView.MouseHoverHelper.cs | 228 + dnSpy/dnSpy/Text/Editor/WpfTextView.cs | 963 ++ .../WpfTextViewConnectionListenerService.cs | 118 + ...xtViewConnectionListenerServiceProvider.cs | 45 + .../dnSpy/Text/Editor/WpfTextViewConstants.cs | 33 + .../Text/Editor/WpfTextViewContainerMargin.cs | 109 + .../Text/Editor/WpfTextViewExtensions.cs | 52 + dnSpy/dnSpy/Text/Editor/WpfTextViewHost.cs | 184 + .../Text/Editor/WpfTextViewLineCollection.cs | 302 + .../WpfTextViewMarginProviderCollection.cs | 133 + ...extViewMarginProviderCollectionProvider.cs | 50 + dnSpy/dnSpy/Text/Editor/ZoomControlMargin.cs | 200 + .../Text/Formatting/FormattedLineSource.cs | 244 + .../Text/Formatting/FormattedTextCache.cs | 62 + .../FormattedTextSourceFactoryService.cs | 62 + dnSpy/dnSpy/Text/Formatting/HtmlBuilder.cs | 94 + .../Text/Formatting/HtmlBuilderService.cs | 101 + .../Text/Formatting/ITextFormatterProvider.cs | 26 + ...ragraphPropertiesFactoryServiceSelector.cs | 27 + dnSpy/dnSpy/Text/Formatting/LinePart.cs | 103 + .../Text/Formatting/LinePartsCollection.cs | 120 + .../Text/Formatting/LinePartsTextSource.cs | 149 + .../LineTransformProviderService.cs | 83 + dnSpy/dnSpy/Text/Formatting/PhysicalLine.cs | 152 + .../Text/Formatting/PhysicalLineCache.cs | 81 + .../Formatting/TextAndAdornmentCollection.cs | 34 + .../Formatting/TextAndAdornmentSequencer.cs | 179 + ...TextAndAdornmentSequencerFactoryService.cs | 40 + .../Text/Formatting/TextFormatterProvider.cs | 39 + .../TextFormattingRunPropertiesExtensions.cs | 35 + .../Text/Formatting/TextLineExtensions.cs | 32 + ...ragraphPropertiesFactoryServiceSelector.cs | 46 + .../Text/Formatting/TextSequenceElement.cs | 31 + .../dnSpy/Text/Formatting/WpfTextViewLine.cs | 806 ++ dnSpy/dnSpy/Text/Groups/OptionsStorage.cs | 220 + .../dnSpy/Text/Groups/TextViewGroupOption.cs | 50 + .../Groups/TextViewGroupOptionCollection.cs | 74 + .../dnSpy/Text/Groups/TextViewOptionsGroup.cs | 224 + .../Groups/TextViewOptionsGroupService.cs | 108 + dnSpy/dnSpy/Text/MEF/Metadata.cs | 138 + dnSpy/dnSpy/Text/MappingPoint.cs | 64 + dnSpy/dnSpy/Text/MappingSpan.cs | 67 + .../Text/NormalizedTextChangeCollection.cs | 123 + dnSpy/dnSpy/Text/OffsetAndCachedColors.cs | 39 + .../Operations/AnyTextStructureNavigator.cs | 67 + .../AnyTextStructureNavigatorProvider.cs | 38 + dnSpy/dnSpy/Text/Operations/ChangeInfo.cs | 33 + .../dnSpy/Text/Operations/EditorOperations.cs | 1738 +++ .../EditorOperationsFactoryService.cs | 50 + .../Operations/EditorOptionsExtensions.cs | 41 + .../Text/Operations/ReplEditorOperations.cs | 502 + .../Text/Operations/TextBufferUndoManager.cs | 76 + .../TextBufferUndoManagerProvider.cs | 49 + .../Text/Operations/TextSearchNavigator.cs | 158 + .../TextSearchNavigatorFactoryService.cs | 39 + .../Text/Operations/TextSearchService.cs | 514 + .../Text/Operations/TextStructureNavigator.cs | 83 + .../TextStructureNavigatorSelectorService.cs | 76 + .../dnSpy/Text/Operations/TextUndoHistory.cs | 145 + .../Operations/TextUndoHistoryRegistry.cs | 83 + .../Text/Operations/TextUndoPrimitive.cs | 76 + .../Text/Operations/TextUndoTransaction.cs | 102 + dnSpy/dnSpy/Text/Operations/WordParser.cs | 83 + dnSpy/dnSpy/Text/Projection/BufferGraph.cs | 232 + .../Projection/BufferGraphFactoryService.cs | 34 + dnSpy/dnSpy/Text/ProviderSelector.cs | 87 + .../Text/Repl/AdvancedAppSettingsPage.cs | 38 + .../Text/Repl/AppSettingsPageContainer.cs | 25 + .../Text/Repl/AppSettingsPageProvider.cs | 67 + .../ContentTypeOptionDefinitionProvider.cs | 86 + .../dnSpy/Text/Repl/GeneralAppSettingsPage.cs | 38 + dnSpy/dnSpy/Text/Repl/IReplOptions.cs | 28 + .../Text/Repl/LanguageAppSettingsPage.cs | 40 + dnSpy/dnSpy/Text/Repl/ReplOptions.cs | 62 + dnSpy/dnSpy/Text/Repl/ReplOptionsService.cs | 43 + .../Text/Repl/ScrollBarsAppSettingsPage.cs | 38 + dnSpy/dnSpy/Text/Repl/TabsAppSettingsPage.cs | 38 + .../Repl/TextViewOptionsGroupNameProvider.cs | 33 + .../Settings/AdvancedAppSettingsPageBase.cs | 226 + .../Text/Settings/CommonEditorOptions.cs | 168 + .../Settings/GeneralAppSettingsPageBase.cs | 120 + .../Text/Settings/ICommonEditorOptions.cs | 54 + .../Settings/ScrollBarsAppSettingsPageBase.cs | 64 + .../Text/Settings/TabsAppSettingsPageBase.cs | 62 + dnSpy/dnSpy/Text/SimpleTextImage.cs | 66 + .../BufferTagAggregatorFactoryService.cs | 54 + dnSpy/dnSpy/Text/Tagging/ITaggerFactory.cs | 31 + dnSpy/dnSpy/Text/Tagging/TagAggregatorBase.cs | 177 + dnSpy/dnSpy/Text/Tagging/TaggerFactory.cs | 82 + .../Text/Tagging/TextBufferTagAggregator.cs | 37 + .../Text/Tagging/TextViewTagAggregator.cs | 48 + .../ViewTagAggregatorFactoryService.cs | 49 + .../Tagging/Xml/TaggerClassificationTypes.cs | 39 + .../Xml/XamlAttributeValueClassifier.cs | 313 + dnSpy/dnSpy/Text/Tagging/Xml/XamlTagger.cs | 88 + .../Xml/XamlTaggerClassificationTypes.cs | 50 + dnSpy/dnSpy/Text/Tagging/Xml/XmlClassifier.cs | 479 + dnSpy/dnSpy/Text/Tagging/Xml/XmlTagger.cs | 44 + dnSpy/dnSpy/Text/Tagging/Xml/XmlTaggerBase.cs | 142 + .../Xml/XmlTaggerClassificationTypes.cs | 43 + dnSpy/dnSpy/Text/TextBuffer.cs | 227 + dnSpy/dnSpy/Text/TextBufferFactoryService.cs | 104 + dnSpy/dnSpy/Text/TextChange.cs | 93 + dnSpy/dnSpy/Text/TextDataModel.cs | 50 + dnSpy/dnSpy/Text/TextEdit.cs | 94 + dnSpy/dnSpy/Text/TextImage.cs | 88 + dnSpy/dnSpy/Text/TextImageFactoryService.cs | 36 + dnSpy/dnSpy/Text/TextImageUtils.cs | 157 + dnSpy/dnSpy/Text/TextImageVersion.cs | 64 + dnSpy/dnSpy/Text/TextSnapshot.cs | 111 + dnSpy/dnSpy/Text/TextSnapshotLine.cs | 52 + dnSpy/dnSpy/Text/TextVersion.cs | 83 + dnSpy/dnSpy/Text/TrackingPoint.cs | 63 + dnSpy/dnSpy/Text/TrackingSpan.cs | 64 + dnSpy/dnSpy/Text/UnicodeUtilities.cs | 70 + dnSpy/dnSpy/Text/WPF/BrushComparer.cs | 44 + .../dnSpy/Themes/AppCommandLineArgsHandler.cs | 45 + dnSpy/dnSpy/Themes/Color.cs | 52 + dnSpy/dnSpy/Themes/ColorInfo.cs | 186 + dnSpy/dnSpy/Themes/ColorInfos.cs | 2226 ++++ dnSpy/dnSpy/Themes/Theme.cs | 372 + dnSpy/dnSpy/Themes/ThemeColor.cs | 47 + dnSpy/dnSpy/Themes/ThemeHelpers.cs | 49 + dnSpy/dnSpy/Themes/ThemeService.cs | 193 + dnSpy/dnSpy/Themes/ThemeSettings.cs | 73 + dnSpy/dnSpy/Themes/ThemesMenu.cs | 68 + dnSpy/dnSpy/Themes/blue.dntheme | 753 ++ dnSpy/dnSpy/Themes/dark.dntheme | 753 ++ dnSpy/dnSpy/Themes/hc.dntheme | 567 + dnSpy/dnSpy/Themes/light.dntheme | 321 + dnSpy/dnSpy/Themes/wpf.styles.templates.xaml | 7112 +++++++++++ dnSpy/dnSpy/ToolBars/ToolBarButtonVM.cs | 42 + dnSpy/dnSpy/ToolBars/ToolBarItemContext.cs | 29 + dnSpy/dnSpy/ToolBars/ToolBarService.cs | 228 + dnSpy/dnSpy/ToolWindows/TabContentImpl.cs | 278 + dnSpy/dnSpy/ToolWindows/ToolWindowGroup.cs | 116 + .../ToolWindows/ToolWindowGroupService.cs | 143 + dnSpy/dnSpy/ToolWindows/ToolWindowService.cs | 84 + .../ToolWindows/ToolWindowServiceProvider.cs | 34 + dnSpy/dnSpy/TreeView/DsSharpTreeNode.cs | 95 + .../TreeView/SharpTreeNodeChildrenList.cs | 104 + .../TreeView/Text/ContentTypeDefinitions.cs | 34 + .../Text/TreeViewNodeTextElementProvider.cs | 42 + dnSpy/dnSpy/TreeView/TreeNodeDataImpl.cs | 34 + dnSpy/dnSpy/TreeView/TreeNodeImpl.cs | 85 + dnSpy/dnSpy/TreeView/TreeViewImpl.cs | 307 + dnSpy/dnSpy/TreeView/TreeViewService.cs | 69 + dnSpy/dnSpy/UI/UIDispatcher.cs | 43 + dnSpy/dnSpy/app.config | 170 + dnSpy/dnSpy/app.manifest | 52 + dnSpy/dnSpy/dnSpy.csproj | 102 + dnSpy/dnSpy/packages.config | 3 + images/debug-animated.gif | Bin 0 -> 590346 bytes images/edit-code-animated.gif | Bin 0 -> 716067 bytes 4550 files changed, 715797 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Build/AppHostPatcher/AppHostPatcher.csproj create mode 100644 Build/AppHostPatcher/Program.cs create mode 100644 Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.cs create mode 100644 Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.csproj create mode 100644 Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.tasks create mode 100644 Build/MakeEverythingPublic/IVTPatcher.cs create mode 100644 Build/MakeEverythingPublic/MakeEverythingPublic.cs create mode 100644 Build/MakeEverythingPublic/MakeEverythingPublic.csproj create mode 100644 Build/MakeEverythingPublic/MakeEverythingPublic.tasks create mode 100644 Build/compiled/ConvertToNetstandardReferences.dll create mode 100644 Build/compiled/MakeEverythingPublic.dll create mode 100644 Build/compiled/dnlib.dll create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 DnSpyCommon.props create mode 100644 Extensions/Examples/Example1.Extension/CodeCtxMenus.cs create mode 100644 Extensions/Examples/Example1.Extension/Example1.Extension.csproj create mode 100644 Extensions/Examples/Example1.Extension/MainMenuCommands.cs create mode 100644 Extensions/Examples/Example1.Extension/MySettings.cs create mode 100644 Extensions/Examples/Example1.Extension/MySettingsControl.xaml create mode 100644 Extensions/Examples/Example1.Extension/MySettingsControl.xaml.cs create mode 100644 Extensions/Examples/Example1.Extension/MySettingsPage.cs create mode 100644 Extensions/Examples/Example1.Extension/README.md create mode 100644 Extensions/Examples/Example1.Extension/TheExtension.cs create mode 100644 Extensions/Examples/Example1.Extension/ToolBarCommands.cs create mode 100644 Extensions/Examples/Example1.Extension/TreeViewCtxMenus.cs create mode 100644 Extensions/Examples/Example2.Extension/AssemblyChildNodeTabContent.cs create mode 100644 Extensions/Examples/Example2.Extension/Colorizer.cs create mode 100644 Extensions/Examples/Example2.Extension/DocumentViewerToolTipProvider.cs create mode 100644 Extensions/Examples/Example2.Extension/Example2.Extension.csproj create mode 100644 Extensions/Examples/Example2.Extension/HexColorizer.cs create mode 100644 Extensions/Examples/Example2.Extension/NewDsDocument.cs create mode 100644 Extensions/Examples/Example2.Extension/OutputTextPane.cs create mode 100644 Extensions/Examples/Example2.Extension/README.md create mode 100644 Extensions/Examples/Example2.Extension/TheExtension.cs create mode 100644 Extensions/Examples/Example2.Extension/Themes/resourcedict.xaml create mode 100644 Extensions/Examples/Example2.Extension/ToolWindowContent.cs create mode 100644 Extensions/Examples/Example2.Extension/ToolWindowControl.xaml create mode 100644 Extensions/Examples/Example2.Extension/ToolWindowControl.xaml.cs create mode 100644 Extensions/Examples/Example2.Extension/TreeNodeDataProvider.cs create mode 100644 Extensions/Examples/Example2.Extension/TreeViewNodeColorizer.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/AssemblyInfoTransform.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderCache.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderState.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/CSharpDecompiler.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompilePartialTransform.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompileTypeMethodsTransform.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/ThreadSafeObjectPool.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompiler.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompilerUtils.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/ILAst/ILAstDecompiler.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/AssemblyInfo.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.Designer.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.cs.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.de.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.es-ES.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fa.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fr.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.hu.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.it.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-BR.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-PT.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.ru.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.tr.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.uk.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.zh-CN.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/CSharpVBDecompilerSettings.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/DecompilerSettingsService.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILAstDecompilerSettings.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILDecompilerSettings.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILSettings.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Text/ContentTypesInternal.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/ILSpyEnvironmentProvider.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBDecompiler.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBTextOutputFormatter.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/AddXmlDocTransform.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/StringLineIterator.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/SubString.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/XmlDocLine.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/dnSpy.Decompiler.ILSpy.Core.csproj create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/CSharp/DecompilerCreator.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ContentTypeDefinitions.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/DecompilerCreator.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/SimpleILPrinter.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ILAst/DecompilerCreator.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.Designer.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.cs.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.de.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.es-ES.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fa.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fr.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.hu.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.it.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-BR.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-PT.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.ru.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.tr.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.uk.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.zh-CN.resx create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/CSharpDecompilerSettingsPage.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerAppSettingsModifiedListener.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsImpl.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsPageProvider.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsServiceImpl.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILDecompilerSettingsPage.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILSettingsImpl.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/SettingsConstants.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/TheExtension.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Themes/wpf.styles.templates.xaml create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/VisualBasic/DecompilerCreator.cs create mode 100644 Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/dnSpy.Decompiler.ILSpy.csproj create mode 100644 Extensions/dnSpy.Analyzer/AnalyzerService.cs create mode 100644 Extensions/dnSpy.Analyzer/AnalyzerSettings.cs create mode 100644 Extensions/dnSpy.Analyzer/AnalyzerToolWindowContent.cs create mode 100644 Extensions/dnSpy.Analyzer/AnalyzerTreeNodeDataContext.cs create mode 100644 Extensions/dnSpy.Analyzer/Commands.cs create mode 100644 Extensions/dnSpy.Analyzer/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.cs.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.de.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fa.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fr.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.hu.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.it.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.ru.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.tr.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.uk.resx create mode 100644 Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Analyzer/TheExtension.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/AnalyzerTreeNodeData.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/AssemblyNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/AsyncFetchChildrenHelper.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/AttributeAppliedToNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/ComUtils.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/Commands.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EntityNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EventAccessorNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EventFiredByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EventNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EventOverriddenNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/EventOverridesNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/FieldAccessNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/FieldNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/Helpers.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/IAnalyzerTreeNodeDataContext.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/IAsyncCancellable.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/InterfaceEventImplementedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/InterfaceMethodImplementedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/InterfacePropertyImplementedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/MethodNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/MethodOverriddenNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/MethodOverridesNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/MethodUsedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/MethodUsesNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/ModuleNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/PropertyAccessorNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/PropertyNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverriddenNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverridesNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/ScopedWhereUsedAnalyzer.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/SearchNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/SourceRef.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TIAHelper.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TypeExposedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TypeExtensionMethodsNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TypeInstantiationsNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TypeNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/TypeUsedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeNodes/VirtualMethodUsedByNode.cs create mode 100644 Extensions/dnSpy.Analyzer/TreeTraversal.cs create mode 100644 Extensions/dnSpy.Analyzer/dnSpy.Analyzer.csproj create mode 100644 Extensions/dnSpy.AsmEditor/Assembly/AssemblyCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/AppService.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/AsmEditorContext.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/ClipboardDataHolder.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/CloseAllMissingFilesCommand.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/CloseOldInMemoryModulesCommand.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/CodeContextMenuHandler.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/CodeContextMenuHandlerCommandProxy.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/CommandUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/ContextMenuHandler.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletableNodes.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletedEventUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletedFieldUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletedMethodUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletedPropertyUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DeletedTypeUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/DocumentsContextMenuHandler.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditMenuHandler.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditMenuHandlerCommandProxy.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditedEventUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditedFieldUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditedMethodUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EditedPropertyUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/EventNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/FieldNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/FileMenuHandler.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/IIndexedItem.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/IndexObservableCollection.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/InstructionCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/ListBoxHelperBase.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/MethodNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/MyObservableCollection.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/NamespaceNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/NestedTypeNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/PropertyNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/RefFinder.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/RootDocumentNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Commands/TypeNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AddClassCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AddClassMembersCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AddClassVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AddMembersCodeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AddUpdatedNodesHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/AssemblyReferenceResolver.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/CodeEditorCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/Commands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/CompilerAppSettingsPageContainer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/CompilerDiagnosticComparer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/CompilerDiagnosticVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditAssemblyCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditAssemblyVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditClassCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditClassVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeCommandBase.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeCommandConstants.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeCommandInfoProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeCommandTargetFilter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeIds.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeIdsExtensions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeVMCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditCodeVMOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/EditMethodCodeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ExistingTypeNodeUpdater.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ImportSigComparer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ImportedType.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/BlobHeapWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/BlobMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/DotNetMetadataSectionData.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/GuidHeapWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/GuidMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/ImageCor20HeaderSectionData.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MDHeapWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MDWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MDWriterMemoryStream.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MDWriterStream.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/MetadataEditor.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/PESectionData.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/RawRowColumnReader.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/SectionSizes.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/StringsHeapWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/StringsMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/StrongNameSignatureSectionData.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/TableWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/TablesHeapWriter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/TablesMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/USMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditor/UnknownMDHeap.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDEditorPatcher.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDPatcherUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MDSigPatcher.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MergeWithAssemblyCommand.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/MetadataReferenceFinder.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ModuleImporter.MemberLookup.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ModuleImporter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ModuleImporterAssemblyResolver.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ModulePatcher.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/NativeMemoryAllocator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/PlatformHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/RawModuleBytes.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/RawModuleBytesProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/RecursionCounter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/RemappedTypeTokens.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/ResourceNodeCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/Compiler/TIAHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/Converters/CilObjectConverter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Converters/InstructionOperandTextBoxStyleConverter.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CAArgumentVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentsControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentsControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CANamedArgumentsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantTypeControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantTypeControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantTypeDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantTypeDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantTypeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ConstantVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/Converters/BooleanToGridrowLengthConverter.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/Converters/BooleanToThicknessConverter.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/Converters/RadioButtonConverter.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CreateTypeSigArrayControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CreateTypeSigArrayControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CreateTypeSigArrayDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CreateTypeSigArrayDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CreateTypeSigArrayVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributesControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributesControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/CustomAttributesVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecuritiesControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecuritiesControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecuritiesVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DeclSecurityVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DecompilerVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/DlgUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/EnumDataFieldVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamsControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamsControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/GenericParamsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ImplMapControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ImplMapControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ImplMapVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ListVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ListVMControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ListVMControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MarshalTypeControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MarshalTypeControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MarshalTypeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberPickerDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberPickerDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberPickerVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MemberRefVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodDefVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodDefsControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodDefsControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodDefsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodOverrideOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodOverrideVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodOverridesControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodOverridesControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodOverridesVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSigCreatorVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/MethodSpecVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ModelUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/Null.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ObjectListDataFieldVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefsControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefsControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/ParamDefsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributeControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributeControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributeDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributeDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributesControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributesControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/SecurityAttributesVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCADlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCADlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAsControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAsControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeDefOrRefAndCAsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigCreatorVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/DnlibDialogs/TypeSigVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Event/EventDefCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Event/EventDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Event/EventOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Event/EventOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Event/EventOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/ExtensionMethods.cs create mode 100644 Extensions/dnSpy.AsmEditor/Field/FieldDefCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Field/FieldDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Field/FieldOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Field/FieldOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Field/FieldOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/ClipboardUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Commands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexAddressReferenceFileTabContentProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexBoxDocumentTabContent.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexBufferFileBufferServiceListener.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexBufferService.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexBufferUndoRedo.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexBufferWriterHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexTabSaver.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexUndoableDocumentsProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexViewUIState.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/HexViewUIStateSerializer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/InstructionUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/MDTableContextMenuCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/HexDocumentTabContent.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/HexDocumentTreeNodeDataFinder.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/HexNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageCor20HeaderNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageDosHeaderNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageFileHeaderNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageOptionalHeader32Node.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageOptionalHeader64Node.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/ImageSectionHeaderNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/MetadataTableNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/MetadataTableRecordNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/PENode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/PETreeNodeDataProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/StorageHeaderNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/StorageSignatureNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/StorageStreamNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/TablesStreamNode.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/TokenReferenceDocumentTabContentProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/Nodes/wpf.styles.templates.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Hex/NormalizedHexChangeCollectionExtensions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/BufferToDocumentNodeService.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/HexField.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/HexFieldReference.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/HexFileStructureInfoProviderImpl.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/HexReferenceConverterImpl.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/HexVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageCor20HeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageDosHeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageFileHeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageOptionalHeader32VM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageOptionalHeader64VM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageOptionalHeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/ImageSectionHeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/MetadataTableRecordVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/MetadataTableVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/PEStructureProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/StorageHeaderVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/StorageSignatureVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/StorageStreamVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/TablesStreamVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/PE/VirtualizedList.cs create mode 100644 Extensions/dnSpy.AsmEditor/Hex/TableSorter.cs create mode 100644 Extensions/dnSpy.AsmEditor/Method/MethodDefCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Method/MethodDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Method/MethodOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Method/MethodOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Method/MethodOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/BodyCommandUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/BodyUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/CilBodyOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/CilBodyVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/ComboBoxAttachedProps.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/ExceptionHandlerOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/ExceptionHandlerVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/ExceptionHandlersListHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/FastClickButton.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/IEditOperand.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/InstructionOperandControl.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/InstructionOperandVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/InstructionOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/InstructionVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/InstructionsListHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/LocalOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/LocalVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/LocalsListHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyType.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/MethodBodyVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/NativeMethodBodyOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/NativeMethodBodyVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchInstructionVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/MethodBody/SwitchOperandsListHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ClrVersion.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ClrVersionValues.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/ModuleUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/NetModuleOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/NetModuleOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Module/NetModuleOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Module/NetModuleOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Namespace/NamespaceCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Namespace/NamespaceDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Namespace/NamespaceDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Namespace/NamespaceVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.Designer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.cs.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.de.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.fa.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.fr.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.hu.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.it.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.ru.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.tr.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.uk.resx create mode 100644 Extensions/dnSpy.AsmEditor/Properties/dnSpy.AsmEditor.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.AsmEditor/Property/PropertyDefCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Property/PropertyDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Property/PropertyOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Property/PropertyOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Property/PropertyOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListStreamerControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListStreamerControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListStreamerVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageListVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageResourceElementControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageResourceElementControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageResourceElementDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageResourceElementDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageResourceElementVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ImageVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/NodeAndResource.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/NodeAndResourceElement.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementControl.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementControl.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceElementVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/ResourceVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/Resources/UserTypeVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/CharacteristicsHelper.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/DocumentSaver.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/MmapDisabler.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/ModuleSaver.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/PathUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveHexOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveHexOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveHexOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveModuleCommand.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveModuleOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveModuleOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveModuleOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveModuleWindow.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveMultiModuleDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveMultiModuleDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveMultiModuleVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveOptionsType.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveSingleModuleDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/SaveModule/SaveSingleModuleDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/TheExtension.cs create mode 100644 Extensions/dnSpy.AsmEditor/Themes/TextEditorResourceColorInitializer.cs create mode 100644 Extensions/dnSpy.AsmEditor/Themes/wpf.styles.templates.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Types/TypeDefCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Types/TypeDefOptions.cs create mode 100644 Extensions/dnSpy.AsmEditor/Types/TypeOptionsDlg.xaml create mode 100644 Extensions/dnSpy.AsmEditor/Types/TypeOptionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.AsmEditor/Types/TypeOptionsVM.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/Commands.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/DsDocumentUndoableDocumentsProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/IUndoCommand.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/IUndoObject.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/IUndoableDocumentsProvider.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/ToolbarCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoCommandService.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoCommandServiceEventArgs.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoObject.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoRedoDocumentListListener.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoRedoMenuCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/UndoRedo/UndoRoutedCommands.cs create mode 100644 Extensions/dnSpy.AsmEditor/Utilities/UIUtils.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/CreateConstantType.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/CreateMethodPropertySig.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/CreateTypeSigArray.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/DnlibTypePicker.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditCustomAttribute.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditDeclSecurity.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditGenericParam.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditImage.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditMemberRef.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditMethodDef.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditMethodOverride.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditMethodSpec.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditParamDef.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditSecurityAttribute.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/EditTypeDefOrRefAndCA.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ICreateConstantType.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ICreateMethodPropertySig.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ICreateTypeSigArray.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IDnlibTypePicker.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IEdit.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IOpenAssembly.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IOpenFile.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IOpenPublicKeyFile.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ISelectItems.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/IShowWarningMessage.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ITypeSigCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/OpenAssembly.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/OpenFile.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/OpenPublicKeyFile.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/ShowWarningMessage.cs create mode 100644 Extensions/dnSpy.AsmEditor/ViewHelpers/TypeSigCreator.cs create mode 100644 Extensions/dnSpy.AsmEditor/dnSpy.AsmEditor.csproj create mode 100644 Extensions/dnSpy.BamlDecompiler/Annotations.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlContext.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlDocument.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlNode.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlReader.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlRecords.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/BamlWriter.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/KnownMembers.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/KnownThings.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/KnownThings.g.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/KnownThings.gen.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Baml/KnownTypes.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlDecompiler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlDisassembler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlElement.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlResourceElementNode.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlResourceNodeProvider.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlSettings.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlSettings.xaml create mode 100644 Extensions/dnSpy.BamlDecompiler/BamlToolTipProvider.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/ConstructorParametersHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/DocumentHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/ElementHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/KeyElementStartHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/PropertyArrayHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/PropertyComplexHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/PropertyDictionaryHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Blocks/PropertyListHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/AssemblyInfoHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/AttributeInfoHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/ConnectionIdHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/ConstructorParameterTypeHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/ContentPropertyHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/DefAttributeHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyStringHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/DefAttributeKeyTypeHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/DeferableContentStartHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/LineNumberAndPositionHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/LinePositionHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/LiteralContentHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/OptimizedStaticResourceHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PIMappingHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PresentationOptionsAttributeHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyCustomHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyTypeReferenceHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyWithConverterHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyWithExtensionHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/PropertyWithStaticResourceIdHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/TextHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/TextWithConverterHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/TypeInfoHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Handlers/Records/XmlnsPropertyHandler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/IHandlers.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/IRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/MenuCommands.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.Designer.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.cs.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.de.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.fa.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.fr.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.hu.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.it.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.ru.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.tr.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.uk.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/Properties/dnSpy.BamlDecompiler.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.BamlDecompiler/RecursionCounter.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Rewrite/AttributeRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Rewrite/ConnectionIdRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Rewrite/DocumentRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Rewrite/MarkupExtensionRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Rewrite/XClassRewritePass.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/TheExtension.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/NamespaceMap.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlExtension.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlPathDeserializer.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlProperty.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlResourceKey.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlType.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/Xaml/XamlUtils.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/XamlContext.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/XamlDecompiler.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/XamlOutputCreator.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/XamlOutputOptionsProvider.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/XmlnsDictionary.cs create mode 100644 Extensions/dnSpy.BamlDecompiler/dnSpy.BamlDecompiler.csproj create mode 100644 Extensions/dnSpy.Debugger/AppHostInfoGenerator/AppHostInfoGenerator.csproj create mode 100644 Extensions/dnSpy.Debugger/AppHostInfoGenerator/NRT.cs create mode 100644 Extensions/dnSpy.Debugger/AppHostInfoGenerator/Program.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/CorDebugUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/ECallManager.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/IsDebuggerPresentHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/IsDebuggerPresentPatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/ManagedDebuggerHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/ManagedDebuggerPatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/AntiAntiDebug/PatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Breakpoints/DbgBreakpointLocationFormatterProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Breakpoints/TextEditor/DbgBreakpointGlyphFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Breakpoints/TextEditor/DbgBreakpointGlyphTextMarkerLocationProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/DbgEngineStackWalkerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/ILDbgEngineStackFrame.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/NullDbgEngineStackWalker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/StackFrameData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/TextEditor/DbgStackFrameGlyphTextMarkerLocationInfoProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/CallStack/TextEditor/DbgStackFrameTextViewMarkerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Code/BreakpointFormatterService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Code/DbgBreakpointLocationFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Code/DbgDotNetNativeCodeLocationFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Code/DbgDotNetNativeCodeLocationImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Code/ReferenceConverterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/ClrDac.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/ClrDacImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/ClrDacProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/ClrDacThreadInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/IClrDacDebugger.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/DAC/NullClrDac.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/AttachToProcess/DebuggableProcesses.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/AttachToProcess/DotNetAttachProgramOptionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/AttachToProcess/DotNetFrameworkAttachProgramOptionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/BreakProcessKindsUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/DotNetCommonStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/DotNetFrameworkStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/DotNetGenericDebugEngineGuidProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/DotNetStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Dialogs/DebugProgram/StartDebuggingOptionsPageProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/AppHostInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/AppHostInfoData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/AppHostInfoData.g.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/AppHostUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Attach/CorDebugAttachToProgramOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Attach/DotNetAttachToProgramOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Attach/DotNetFrameworkAttachToProgramOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/CorDebugTypeCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgCorDebugInternalAppDomainImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgCorDebugInternalModuleImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImpl.Breakpoints.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImpl.Evaluation.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImpl.ModuleDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImpl.Threads.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineImplDependencies.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgEngineProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DbgModuleMemoryRefreshedNotifierImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DebugMessageDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DebugOptionsProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DebuggerThread.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DmdDispatcherImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DmdDynamicModuleHelperImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DnDebuggerObjectHolder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DnModuleIdExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DnThreadUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DnlibAssemblyResolverImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DotNetDbgEngineImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DotNetDbgProcessStarter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/DotNetFrameworkDbgEngineImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/CordbgErrorHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/CreateCorValueResult.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgCorDebugInternalRuntimeImpl.NativeCode.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgCorDebugInternalRuntimeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgCorValueHolder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetDispatcherExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetDispatcherImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetEngineObjectIdFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetObjectIdImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetRawValueFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DbgDotNetValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DispatcherConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/DmdEvaluatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/EvalArgumentConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/ClassHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/ClassHookInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/ClassHookProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/CorDebugValueConverterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/ICorDebugRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/Hooks/System_String.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/NullableTypeUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/Evaluation/SyntheticValues.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ExceptionUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ExeUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ModuleCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ModuleIdExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/PathUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ReflectionTypeCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Impl/ThreadProperties.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Metadata/DbgAssemblyInfoProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Metadata/DbgDynamicModuleProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Metadata/DbgModuleIdProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Metadata/LastValidRids.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Native/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.cs.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.de.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.fa.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.fr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.hu.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.it.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.ru.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.tr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.uk.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Properties/dnSpy.Debugger.DotNet.CorDebug.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Steppers/DbgDotNetEngineStepperImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Steppers/DbgDotNetStepperBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/TheExtension.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Themes/wpf.styles.templates.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/UI/UIDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Utilities/DotNetAssemblyUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Utilities/DotNetHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/Utilities/PortableExecutableFileHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dnSpy.Debugger.DotNet.CorDebug.csproj create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/COM/CorDebug.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/COM/MetaData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/COM/MetaHost.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorAssemblyDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorAssemblyRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorDeclSecurity.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorEventDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorExportedType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorFieldDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorFileDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorGenericParam.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorGenericParamConstraint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorInterfaceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorManifestResource.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorMemberRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorMethodDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorMethodSpec.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorModuleDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorModuleRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorParamDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorPropertyDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorStandAloneSig.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorTypeDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorTypeRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/CorTypeSpec.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/ICorMDTokenProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/ICorModuleDefHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/IProcessReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/ProcessBinaryReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/TypeUpdatedEventArgs.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/DotNet/Utils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/AttachProcessOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/BreakProcessHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/BreakProcessKind.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/BreakpointList.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/COMObject.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorAppDomain.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorAssembly.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorChain.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorClass.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorCode.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorDebugExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorDebugManagedCallback.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorEval.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorFrame.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorFunction.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorFunctionBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorMDA.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorModule.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorModuleDefHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorProcess.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorProcessReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorStepper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorThread.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CorValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CordbgErrors.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/CoreCLRHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebugCallbackEventArgs.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebugEventBreakpointList.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebugOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebugProcessOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggeeVersionDetector.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggerCollection.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggerEventArgs.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggerPauseState.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggerProcessState.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DebuggerState.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnAnyDebugEventBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnAppDomain.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnAssembly.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnCodeBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnDebugEventBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnDebugger.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnEval.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnILCodeBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnModule.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnModuleId.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnNativeCodeBreakpoint.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnProcess.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/DnThread.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/IDebugMessageDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/ILFrameIP.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/MDAPI.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/ProcessCreationFlags.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/ProcessDataStream.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/StartDebuggerException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/StepRange.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.CorDebug/dndbg/Engine/Win32EnvironmentStringBuilder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/DebuggerRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/ILVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/ILVMFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/ILValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Impl/DebuggerILInterpreter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Impl/ILVMImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Impl/OpCodes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/InterpreterException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/InterpreterMessageException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/InterpreterThrownExceptionException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/NRT.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/NRT_Helpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Tests/FakeDebuggerRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Tests/InterpreterTest.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/Tests/dbgintrptest.il create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Interpreter/dnSpy.Debugger.DotNet.Interpreter.csproj create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/AssemblyHasher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/CustomAttributesHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAppDomain.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssembly.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssemblyContentType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssemblyHashAlgorithm.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssemblyName.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssemblyNameFlags.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdAssemblyNameFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdBindingFlags.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdCallingConventions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdConstructorInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdCustomAttributeData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdCustomModifier.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdCustomModifierUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdDataStream.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdDynamicModuleHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdEvaluator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdEventAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdEventInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdFieldAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdFieldInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdGenericParameterAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdGetAccessorOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdImageFileMachine.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdImplMap.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdLazyMetadataBytes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMarshalType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMemberFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMemberInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMemberInfoEqualityComparer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMemberTypes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodBody.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodImplAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdMethodSignature.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdModule.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdObject.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdParameterAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdParameterInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdPortableExecutableKinds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdProcessorArchitecture.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdPropertyAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdPropertyInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdReadOnlyAssemblyName.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdRuntimeFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdSigComparer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdSignatureCallingConvention.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdType.CanCastTo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdTypeAttributes.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdTypeName.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdTypeScope.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdTypeSignatureKind.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdWellKnownType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/DmdWellKnownTypeUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/HexUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/IDmdAssemblyName.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/IDmdCustomAttributeProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/IDmdSecurityAttributeProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/AccessorUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/AssemblyNameEqualityComparer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdComMetadataReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdConstructorDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdEventDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdExportedTypeCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdFieldDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdGenericParameterTypeCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdMethodDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdMethodRefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdParameterDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdPointerDataStream.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdPropertyDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdTypeDefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/DmdTypeRefCOMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/LazyList.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/MDAPI.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/COMD/MetaData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdAppDomainImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdAssemblyImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdByRefType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdConstructorDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdConstructorInfoBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdConstructorRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCreatedConstructorDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCreatedGenericParameterType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCreatedMethodDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCreatedParameterDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCreatedParameterInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdCustomAttributeReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdDeclSecurityReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdEventDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdFieldDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdFieldInfoBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdFieldRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdFunctionPointerType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdGenericInstanceType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdGenericInstanceTypeRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdGenericParameterType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdGenericParameterTypeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdLazyMetadataReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMDArrayType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMarshalBlobReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMemberInfoComparer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMetadataReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMetadataReaderBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodBodyImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodBodyReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodInfoBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodSpec.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdMethodSpecRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdModuleImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdNullGlobalType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdNullMetadataReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdParameterDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdParameterInfoBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdParsedTypeRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdPointerType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdPropertyDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdPropertyParameter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdRuntimeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdSZArrayType.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdSignatureReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdTypeBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdTypeDef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdTypeNameParser.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdTypeRef.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/DmdTypeUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdConstructorDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdDataStreamImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdEcma335MetadataReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdEventDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdExportedTypeMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdFieldDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdGenericParameterTypeMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdMethodDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdMethodRefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdParameterDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdPropertyDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdTypeDefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/DmdTypeRefMD.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/LazyList.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/MD/MetadataConstantUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/ReflectionTests.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/Impl/WellKnownMemberResolver.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/ListCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/MemberNotFoundException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/NRT.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/NRT_Helpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/ObjectCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/ObjectPools.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/ReadOnlyCollectionHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/ResolveException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/TIAHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Metadata/dnSpy.Debugger.DotNet.Metadata.csproj create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/AntiAntiDebug/DisableAntiAntiDebugCode.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/CallStack/DbgEngineStackWalkerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/CallStack/ILDbgEngineStackFrame.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/CallStack/NullDbgEngineStackWalker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/CallStack/StackFrameData.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/AttachToProcess/ProcessUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/AttachToProcess/UnityAttachProgramOptionsImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/AttachToProcess/UnityDataReceiver.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/AttachToProcess/UnityEditorAttachProgramOptionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/AttachToProcess/UnityPlayerAttachProgramOptionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugMenuCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/BreakProcessKindsUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/MonoConnectStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/MonoConnectStartDebuggingOptionsPageBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/MonoStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/MonoStartDebuggingOptionsPageBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/PortableExecutableFileHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/StartDebuggingOptionsPageProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/UnityConnectStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/UnityGenericDebugEngineGuidProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebugProgram/UnityStartDebuggingOptionsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Dialogs/DebuggingUnityGamesHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Attach/MonoAttachToProgramOptionsBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Attach/UnityAttachToProgramOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImpl.Breakpoints.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImpl.Evaluation.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImpl.Steppers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImpl.Threads.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineImplDependencies.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgEngineProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgModuleMemoryRefreshedNotifierImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgMonoDebugInternalAppDomainImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DbgMonoDebugInternalModuleImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DebuggerThread.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DmdDispatcherImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/DotNetMonoRuntimeId.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/EvalReflectionUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetDispatcherExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetDispatcherImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetEngineObjectIdFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetObjectIdImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetRawValueFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgDotNetValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DbgMonoDebugInternalRuntimeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DispatcherConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/DmdEvaluatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/EvalArgumentConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/ClassHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/ClassHookInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/ClassHookProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/IMonoDebugRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/MonoDebugValueConverterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/Hooks/System_String.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/MemberMirrorUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/MethodCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/MonoDebugTypeCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/MonoValueFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/MonoValueTypeCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/SyntheticValues.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/ValueLocations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/Evaluation/ValueUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ExceptionUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/FuncEvalFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ModuleCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ModuleIdUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/MonoExeFinder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/MonoTypeLoader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/NetUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ObjectConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/PortableExecutableFileHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/PortableExecutableHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ReflectionTypeCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ThreadMirrorUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/ThreadProperties.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/TypeCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Impl/WpfDebugMessageDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Metadata/DbgAssemblyInfoProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Metadata/DbgModuleIdProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.cs.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.de.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.fa.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.fr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.hu.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.it.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.ru.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.tr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.uk.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Properties/dnSpy.Debugger.DotNet.Mono.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Steppers/DbgDotNetEngineStepperImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Steppers/DbgDotNetStepperBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/TheExtension.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/Themes/wpf.styles.templates.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet.Mono/dnSpy.Debugger.DotNet.Mono.csproj create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/DbgBreakpointLocationFormatterProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/DbgDotNetBreakpointFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/TextEditor/ClassBreakpointCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/TextEditor/DbgBreakpointGlyphFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/TextEditor/DbgBreakpointGlyphTextMarkerLocationProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Breakpoints/Code/TextEditor/DeleteBreakpointsInRemovedModules.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/CallStack/TextEditor/DbgStackFrameGlyphTextMarkerLocationInfoProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/CallStack/TextEditor/DbgStackFrameTextViewMarkerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/BreakpointFormatterService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgBreakpointLocationFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgCodeLocationSerializerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgDotNetCodeLocationFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgDotNetCodeLocationImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgDotNetDebugInfoServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgDotNetDecompilerGuidProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgDotNetDecompilerServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgMethodDebugInfoProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DbgMethodDebugInfoUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DecompilerOutputImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/DotNetReferenceNavigator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/ReferenceConverterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Code/TextEditor/DbgTextViewCodeLocationProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Dialogs/DebugProgram/DotNetGenericDebugEngineGuidProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Dialogs/DebugProgram/PortableExecutableFileHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Disassembly/DbgRuntimeNativeCodeProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Disassembly/DecompiledCodeProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Disassembly/DecompilerOutputImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Disassembly/ILSourceStatementProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Disassembly/SourceStatementProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgAliasProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetDispatcherExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetEngineValueNodeFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetEngineValueNodeFactoryExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetEngineValueNodeFactoryService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetLanguageServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetValueCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgDotNetValueError.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineAutosProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineExceptionsProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineExpressionEvaluatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineLanguageImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineLanguageProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineLocalsProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineObjectIdFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineObjectIdImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineReturnValuesProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineTypeVariablesProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineValueNodeFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgEngineValueNodeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DbgModuleReferenceProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/DispatcherConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/ExceptionUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/ExpressionCompilerConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/AddressILValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/ArrayILValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/BoxedValueTypeILValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/ByRefILValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DbgDotNetILInterpreter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DebuggerRuntimeFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DebuggerRuntimeFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DebuggerRuntimeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DefaultArgumentsProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DefaultLocalsProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DotNetClassHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/DotNetClassHookFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/Hooks/DotNetClassHookFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/Hooks/System_Runtime_CompilerServices_RuntimeHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/Hooks/dnSpy_Roslyn_ExpressionEvaluator_IntrinsicMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/IDebuggerRuntime.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/ILValues.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/InterpreterLocalsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/RuntimeHandleILValues.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/SyntheticValues.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/TypeILValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/UnboxAddressILValue.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/Interpreter/VariablesProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/IntrinsicsAssemblyBuilder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/LanguageConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/MetadataFixer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/MethodDebugScopeUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/ModuleRefFinder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/ObjectCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Evaluation/Engine/StateWithKey.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Exceptions/BreakWhenThrownExceptionCommand.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Exceptions/CLRDbgExceptionFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ClassLoader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgAssemblyInfoProviderService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgDynamicModuleProviderService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgInMemoryModuleService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgMetadataServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgModuleIdProviderService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DbgModuleMemoryRefreshedNotifierImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DsDocumentProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/DynamicModuleDefDocument.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/IModuleIdHolder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/Internal/DbgRawMetadataImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/Internal/DbgRawMetadataServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/Internal/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/KnownMemberNames.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/MemoryModuleDefDocument.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ModuleIdFactoryProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ModuleLoaderDlg.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ModuleLoaderDlg.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ModuleLoaderVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/RuntimeAssemblyResolver.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/ShowModuleLoaderService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Metadata/TreeViewUpdater.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Modules/DbgLoadModuleReferenceHandlerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.cs.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.de.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.fa.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.fr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.hu.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.it.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.ru.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.tr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.uk.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Properties/dnSpy.Debugger.DotNet.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Steppers/Engine/CompilerUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Steppers/Engine/DbgEngineStepperFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Steppers/Engine/DbgEngineStepperImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/Steppers/Engine/TaskEvalUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/TheExtension.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/UI/UIDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/debug/DotNet.ex.xml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger.DotNet/dnSpy.Debugger.DotNet.csproj create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/ApiPatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/CheckRemoteDebuggerPresentHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/CheckRemoteDebuggerPresentPatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/DbgHookException.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/DbgHookedNativeFunctionImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/DbgHookedNativeFunctionProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/DbgNativeFunctionHookContextImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/ExportedFunctions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/ExportedFunctionsReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/IsDebuggerPresentHook.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/IsDebuggerPresentPatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/PatchAPIResult.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/PatcherX86.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/PreventNativeDebuggerDetection.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/ProcessMemoryBlock.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/AntiAntiDebug/ProcessMemoryBlockAllocator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Attach/AppCommandLineArgsHandler.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Attach/AttachableProcessImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Attach/AttachableProcessInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Attach/AttachableProcessesServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Attach/Win32CommandLineProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/BoundCodeBreakpointsService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/BreakpointConditionsFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/BreakpointImageUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/BreakpointsSerializer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CodeBreakpointsListSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/BreakpointBreakChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgCodeBreakpointCheckResult.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgCodeBreakpointConditionChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgCodeBreakpointFilterChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgCodeBreakpointHitCountChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgCodeBreakpointTraceMessagePrinter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/DbgFilterExpressionEvaluatorService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/ListCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/ObjectCache.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/ParsedTracepointMessage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/TracepointMessageCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/CondChecker/TracepointMessageParser.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgBreakpointLocationFormatterService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgBreakpointLocationSerializerService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgCodeBreakpointDisplaySettingsBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgCodeBreakpointHitCountServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgCodeBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgCodeBreakpointSerializerService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/DbgCodeBreakpointsServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/ITracepointMessageListener.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/RemoveTemporaryBreakpoints.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/ResetHitCount.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointGlyphPopupControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointGlyphPopupControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointGlyphPopupVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointGlyphTextMarkerHandler.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointGlyphTextMarkerLocationProviderService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/BreakpointMarker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/GlyphMarginCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/GlyphMarginOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/GlyphTextMarkerMouseProcessor.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Code/TextEditor/TextViewBreakpointService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Modules/BreakpointsSerializer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Modules/DbgModuleBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Modules/DbgModuleBreakpointsServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Modules/ModuleBreakpointHitChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Breakpoints/Modules/ModuleBreakpointsListSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/DbgCallStackServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/DbgStackFrameImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/DbgStackWalkerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/SpecialDbgEngineStackFrame.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/TextEditor/ActiveStatementService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/TextEditor/CallStackFrameKind.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/TextEditor/CallStackGlyphTextMarkerHandler.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/CallStack/TextEditor/CallStackMarker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Code/GoToInMemoryModuleStatement.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Code/TextEditor/DbgTextViewCodeLocationService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/CurrentStatementUpdater.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DbgProcessStarterService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DebugMenu.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DebugMenuCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/Debugger.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DebuggerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DefaultDbgProcessStarter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/DocumentViewerCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/KeyboardShortcutCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/PortableExecutableFileHelpers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/StartDebuggingOptionsMru.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/StartDebuggingOptionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/ToolbarButtonCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/DbgUI/WpfCurrentStatementUpdater.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachProgramOptionsAggregator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachProgramOptionsAggregatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachToProcessContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachToProcessDlg.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachToProcessDlg.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachToProcessVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/AttachToProcessWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/ProgramColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/ProgramFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/ProgramVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/AttachToProcess/ShowAttachToProcessDialogImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/CodeBreakpoints/ShowCodeBreakpointSettingsDlg.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/CodeBreakpoints/ShowCodeBreakpointSettingsDlg.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/CodeBreakpoints/ShowCodeBreakpointSettingsService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/CodeBreakpoints/ShowCodeBreakpointSettingsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/DebugProgram/DebugProgramDlg.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/DebugProgram/DebugProgramDlg.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/DebugProgram/DebugProgramVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Dialogs/DebugProgram/OptionsPageVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Disassembly/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Disassembly/DbgNativeCodeProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Disassembly/DbgShowNativeCodeServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Disassembly/DisassemblyOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgEvalFormatterSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgEvalFormatterSettingsBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgEvaluationContextImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgExpressionEvaluatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgFormatterImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgLanguageImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgLanguageServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgLanguageServiceSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgLocalsValueNodeProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgObjectIdImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgObjectIdServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgRuntimeObjectIdService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgValueImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgValueNodeFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgValueNodeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgValueNodeProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/DbgValueNodeUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ExceptionUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/NullDbgEngineLanguage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/NullDbgEngineObjectIdFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/PredefinedEvaluationErrorMessagesHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/ValueNodesProviderImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowContentBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/UI/VariablesWindowVMOptions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/ClipboardFormats.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/IValueNodesVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/DbgValueNodeFormatParameters.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/DbgValueNodeImageReferenceService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/DbgValueNodeReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/IEditValueNodeExpression.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/LanguageEditValueProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/RawNode.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodeFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodeTextClassifier.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodeTextClassifierContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodesContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodesVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/ValueNodesVMFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/VariablesWindowOperationsImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/Impl/VariablesWindowsCommands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/ValueNode.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/ValueNodesProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/ValueNodesVMFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/ViewModel/VariablesWindowOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Evaluation/Watch/WatchExpressionsService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/DbgExceptionFormatterService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/DbgExceptionImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/DbgExceptionSettingsServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/DefaultExceptionDefinitionsProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/ExceptionConditionsChecker.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/ExceptionListSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/ExceptionsFileReader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Exceptions/GenerateExceptionsXmlFile.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/CurrentObject.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgAppDomainImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgBoundCodeBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgBreakInfoCollectionBuilder.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgDispatcherImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgDispatcherProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgEngineAppDomainImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgEngineBoundCodeBreakpointImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgEngineBoundCodeBreakpointMessageExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgEngineModuleImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgEngineThreadImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.BoundBreakpointsManager.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.BreakAllHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.CurrentObjects.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.ProcessKey.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.Steppers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.StopDebuggingHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.TagsCollection.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgManagerImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgModuleImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgObjectFactoryImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgProcessImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgRuntimeImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DbgThreadImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DebuggerThread.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/DelayedIsRunningHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Impl/SwitchToDebuggedProcess.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Modules/ReferenceNavigatorImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Native/Memset.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Native/NativeMethods.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.cs.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.de.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.fa.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.fr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.hu.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.it.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.ru.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.tr.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.uk.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Properties/dnSpy.Debugger.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Settings/DebuggerAppSettingsPage.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Settings/DebuggerSettingsImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Shared/Dispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Shared/DispatcherTimer.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Shared/FileUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Steppers/DbgStepperImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Text/ClassifiedText.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Text/ClassifiedTextWriter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/TheExtension.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Themes/wpf.styles.templates.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/AntiFlickerConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Autos/AutosContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Autos/AutosToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Autos/AutosVariablesWindowValueNodesProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Autos/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackDisplaySettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackDisplaySettingsBase.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/CallStackWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CallStack/StackFrameVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/CodeBreakpointsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/CodeBreakpoints/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/AddExceptionControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/AddExceptionControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/AddExceptionVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/EditExceptionConditionsDlg.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/EditExceptionConditionsDlg.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/EditExceptionConditionsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionCategoryVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionsContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionsOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionsToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/ExceptionsWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Exceptions/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/FormatterUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/LazyToolWindowVMHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Locals/AutoShowLocalsWindow.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Locals/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Locals/LocalsContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Locals/LocalsToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Locals/LocalsVariablesWindowValueNodesProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Logger/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Logger/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Logger/OutputLogger.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Logger/OutputLoggerSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/BackgroundImageOptionDefinitions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/BufferFileCreator.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/DebuggerHexBufferStream.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/HexEditorOptionsDefinitions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryToolWindowContentProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryWindowService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/MemoryWindowsHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Memory/ProcessHexBufferProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/ModuleBreakpointsWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ModuleBreakpoints/TextViewTaggers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModuleColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModuleContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModuleFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModuleVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModuleVersion.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesSaver.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/ModulesWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/PEFilesSaver.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Modules/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/ProcessesWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Processes/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/SimpleProcessVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DebuggerCommandConstants.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DebuggerToolWindowIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DebuggerToolWindowIdsExtensions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DocumentViewerCommandInfoProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DocumentViewerCommandTargetFilter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/TextView/DocumentViewerCommandTargetFilterProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/Commands.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/DefaultThreadCategoryProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/SearchTextClassifierProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/TextViewTaggers.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadCategoryService.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadColumnConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadContext.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadFormatter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsControl.xaml create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsControl.xaml.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsVM.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Threads/ThreadsWindowColumnIds.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/ToolWindowsOperations.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/CommandsLoader.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchContentFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchExpressionsServiceImpl.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchToolWindowContent.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchVariablesWindowValueNodesProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchWindowExpressionsSettings.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WatchWindowsHelper.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/ToolWindows/Watch/WpfMemLeakWorkaround.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/BooleanToHiddenVisibilityConverter.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/BulkObservableCollection.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/DynamicCheckableMenuItem.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/FormatterObject.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/UIDispatcher.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/Wpf/ITextBlockContentInfoFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/Wpf/SmartTextBlock.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/Wpf/TextBlockContentInfo.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/UI/Wpf/TextBlockContentInfoFactory.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Utilities/ProcessProvider.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Utilities/ProcessUtilities.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/Utilities/WildcardsUtils.cs create mode 100644 Extensions/dnSpy.Debugger/dnSpy.Debugger/dnSpy.Debugger.csproj create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharp/CSharpContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharp/CSharpControlVM.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharp/CSharpReplSettingsImpl.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharp/CSharpToolWindowContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharp/ReplOptionsDefinitions.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/CSharpInteractive.rsp create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Commands/RoslynReplCommandConstants.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Commands/RoslynReplIds.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Commands/RoslynReplIdsExtensions.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/CachedWriter.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ClearCommand.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/Commands.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/HelpCommand.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/IScriptCommand.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/IScriptGlobalsHelper.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/PrintOptionsImpl.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ReplSettings.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ResetCommand.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/RespFileUtils.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ResponseFileReader.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/RoslynReplCommandInfoProvider.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/RoslynReplCommandTargetFilter.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/RoslynReplCommandTargetFilterProvider.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/RoslynReplEditorUtils.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptControl.xaml create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptControl.xaml.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptControlVM.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptGlobals.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Common/ScriptToolWindowContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/ContentTypeDefinitions.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.Designer.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.cs.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.de.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.es-ES.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.fa.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.fr.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.hu.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.it.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.pt-BR.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.pt-PT.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.ru.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.tr.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.uk.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/Properties/dnSpy.Scripting.Roslyn.Resources.zh-CN.resx create mode 100644 Extensions/dnSpy.Scripting.Roslyn/TheExtension.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasic/ReplOptionsDefinitions.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasic/VisualBasicContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasic/VisualBasicControlVM.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasic/VisualBasicReplSettingsImpl.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasic/VisualBasicToolWindowContent.cs create mode 100644 Extensions/dnSpy.Scripting.Roslyn/VisualBasicInteractive.rsp create mode 100644 Extensions/dnSpy.Scripting.Roslyn/dnSpy.Scripting.Roslyn.csproj create mode 100644 README.md create mode 100644 build.ps1 create mode 100644 clean-all.cmd create mode 100644 dnSpy.sln create mode 100644 dnSpy.snk create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.EditorFeatures/Dummy.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.EditorFeatures/MakeEverythingPublic.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.EditorFeatures/Properties/AssemblyInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.EditorFeatures/TextStructureNavigation/TextStructureNavigatorProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.EditorFeatures/dnSpy.Roslyn.CSharp.EditorFeatures.csproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/MakeEverythingPublic.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/Properties/AssemblyInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/QuickInfo/SemanticQuickInfoProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/QuickInfo/SyntacticQuickInfoProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/SmartIndent/CSharpIndentationService.Indenter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/SmartIndent/CSharpIndentationService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.CSharp.Internal/dnSpy.Roslyn.CSharp.Internal.csproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Dummy.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Editor/ContentTypeNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/EditorFeaturesResources.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Extensions/Extensions2.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Extensions/ITextSnapshotLineExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Extensions/TextSpanExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Host/IWaitContext.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Host/IWaitIndicator.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Host/ProgressTracker.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Host/WaitIndicator.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/MakeEverythingPublic.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/Properties/AssemblyInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/SmartIndent/SmartIndent.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/SmartIndent/SmartIndentExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/SmartIndent/SmartIndentProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/TextStructureNavigation/AbstractTextStructureNavigatorProvider.TextStructureNavigator.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/TextStructureNavigation/AbstractTextStructureNavigatorProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.EditorFeatures/dnSpy.Roslyn.EditorFeatures.csproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/GlyphExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/MakeEverythingPublic.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/Properties/AssemblyInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/ExportQuickInfoProviderAttribute.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/IQuickInfoProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/PredefinedQuickInfoProviderNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/Providers/AbstractQuickInfoProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/Providers/AbstractSemanticQuickInfoProvider.ErrorVisitor.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/Providers/AbstractSemanticQuickInfoProvider.SymbolComparer.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/Providers/AbstractSemanticQuickInfoProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/QuickInfoContent.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/QuickInfoItem.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/QuickInfo/QuickInfoService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/RoslynGlyph.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SignatureHelp/SignatureHelpItem.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SignatureHelp/SignatureHelpItems.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SignatureHelp/SignatureHelpParameter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SignatureHelp/SignatureHelpService.Roslyn.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SignatureHelp/SignatureHelpService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SmartIndent/AbstractIndentationService.AbstractIndenter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SmartIndent/AbstractIndentationService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/SmartIndent/IIndentationService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.Internal/dnSpy.Roslyn.Internal.csproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.EditorFeatures/Dummy.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.EditorFeatures/MakeEverythingPublic.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.EditorFeatures/My Project/AssemblyInfo.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.EditorFeatures/TextStructureNavigation/TextStructureNavigatorProvider.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.EditorFeatures/dnSpy.Roslyn.VisualBasic.EditorFeatures.vbproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/Extensions/EnumerableExtensions2.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/MakeEverythingPublic.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/My Project/AssemblyInfo.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/QuickInfo/SemanticQuickInfoProvider.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/SmartIndent/SpecialFormattingOperation.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/SmartIndent/VisualBasicIndentationService.Indenter.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/SmartIndent/VisualBasicIndentationService.vb create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn.VisualBasic.Internal/dnSpy.Roslyn.VisualBasic.Internal.vbproj create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CSharp/CSharpCompilerSettings.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CSharp/CSharpCompilerSettingsImpl.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CSharp/CSharpCompilerSettingsPage.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CSharp/CSharpCompilerSettingsPageProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CSharp/CSharpLanguageCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/CodeEditorOptionsDefinitions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/DiagnosticExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/Extensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/FrameworkDetector.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/RoslynCodeDocument.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/RoslynLanguageCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/VisualBasic/VisualBasicCompilerSettings.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/VisualBasic/VisualBasicCompilerSettingsImpl.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/VisualBasic/VisualBasicCompilerSettingsPage.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/VisualBasic/VisualBasicCompilerSettingsPageProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Compiler/VisualBasic/VisualBasicLanguageCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/AliasConstants.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/CSharp/CSharpExpressionCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/CSharp/GeneratedNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/CSharp/MonoGeneratedNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/ImageNameUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/LanguageExpressionCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/RoslynExpressionCompilerMethods.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/VisualBasic/GeneratedNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ExpressionCompiler/VisualBasic/VisualBasicExpressionCompiler.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/FilterExpressionEvaluator/DbgFilterExpressionEvaluatorImpl.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/FilterExpressionEvaluator/EvalDelegateCreator.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/CSharpFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/CSharpPrimitiveValueFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/CSharpStackFrameFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/CSharpTypeFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/CSharpValueFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/CSharp/Operators.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/DbgValueFormatterOptionsExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/DbgValueFormatterTypeOptionsExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/DebuggerDisplayAttributeFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/DictionaryEntryTypeUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/EnumInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/KeyValuePairTypeUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/LanguageFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/ListCache.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/NullableTypeUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/NumberUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/StateMachineUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/ToStringFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/TupleTypeUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/TypeFormatterOptions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/TypeFormatterUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/ValueFormatterOptions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/ValueFormatterOptionsExtensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/ValueFormatterUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/Operators.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/VisualBasicFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/VisualBasicPrimitiveValueFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/VisualBasicStackFrameFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/VisualBasicTypeFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/Formatters/VisualBasic/VisualBasicValueFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/GetLocalsAssemblyBuilder.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ObjectCache.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/StateWithKey.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/AggregateValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ArrayValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/CSharp/CSharpValueNodeFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/CSharp/CSharpValueNodeProviderFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/CSharp/UnicodeCharacterUtilities.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/CSharpDynamicPropertyHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ColumnFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DbgDotNetTypeVariablesNode.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DbgDotNetValueNodeImpl.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DbgDotNetValueNodeInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DbgDotNetValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DbgDotNetValueNodeProviderFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DebugViewNoResultsValueNode.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DebuggerTypeProxyFinder.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DynamicMetaObjectProviderDebugViewHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/DynamicViewMembersValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/EnumerableDebugViewHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/GeneratedMetadataNames.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ImageNameUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/InstanceMembersValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/LanguageValueNodeFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/MemberUtils.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/MemberValueNodeInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/MembersValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/PointerValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ReflectionAssemblyLoader.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ResultsViewMembersValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/ReturnValueColumnFormatter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/StaticMembersValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/SyntheticNullValue.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/TupleField.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/TupleValueNodeProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/VisualBasic/SyntaxFacts.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/VisualBasic/VisualBasicValueNodeFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Debugger/ValueNodes/VisualBasic/VisualBasicValueNodeProviderFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Documentation/IRoslynDocumentationProviderFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Documentation/RoslynDocumentationProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Documentation/RoslynDocumentationProviderFactory.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Glyphs/GlyphHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/Classification/CompletionClassifier.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/Classification/CompletionKindTextColorHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CommandTargetFilter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CompletionImageHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CompletionInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CompletionKind.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CompletionSource.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/CompletionToolTipProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/ContentTypeDefinitions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/MruCompletionService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/RoslynCompletion.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/RoslynCompletionSet.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/Completions/RoslynIntellisenseFilters.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/CommandTargetFilter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/InformationQuickInfoContentControl.xaml create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/InformationQuickInfoContentControl.xaml.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/InformationQuickInfoContentVM.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/QuickInfoContentCreator.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/QuickInfoSession.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/QuickInfoSource.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/QuickInfoState.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/QuickInfo/QuickInfoTriggerService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/CommandTargetFilter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/Parameter.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/Signature.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/SignatureHelpInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/SignatureHelpSession.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/SignatureHelpSource.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/SignatureHelpTagger.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Intellisense/SignatureHelp/SignatureHelpTaggerEx.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Optimizations/FirstUseOptimization.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/AssemblyInfo.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.Designer.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.cs.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.de.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.es-ES.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.fa.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.fr.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.hu.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.it.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.pt-BR.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.pt-PT.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.ru.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.tr.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.uk.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Properties/dnSpy.Roslyn.Resources.zh-CN.resx create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/CompletionToolTipTextClassifier.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/ContentTypeDefinitions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/ITaggedTextElementProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/ITaggedTextElementProviderService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/RoslynClassificationTypes.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/RoslynClassifier.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/TaggedTextClassifier.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/TaggedTextClassifierContext.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/TaggedTextElementProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/TaggedTextElementProviderService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Classification/TextTagsHelper.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Extensions.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/RoslynContentTypes.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/RoslynDocumentChangedService.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/RoslynMefHostServices.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Tagging/AsyncTagger.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Tagging/RoslynTagger.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Tagging/RoslynTaggerAsyncState.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/Tagging/RoslynTaggerProvider.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/TextBufferSourceTextContainer.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/TextSnapshotSourceText.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Text/TextSnapshotTextLineCollection.cs create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/Themes/wpf.styles.templates.xaml create mode 100644 dnSpy/Roslyn/dnSpy.Roslyn/dnSpy.Roslyn.csproj create mode 100644 dnSpy/dnSpy-x86/Program.cs create mode 100644 dnSpy/dnSpy-x86/dnSpy-x86.csproj create mode 100644 dnSpy/dnSpy.Console/Program.cs create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.Designer.cs create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.cs.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.de.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.es-ES.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.fa.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.fr.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.hu.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.it.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.pt-BR.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.pt-PT.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.ru.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.tr.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.uk.resx create mode 100644 dnSpy/dnSpy.Console/Properties/dnSpy.Console.Resources.zh-CN.resx create mode 100644 dnSpy/dnSpy.Console/dnSpy.Console.csproj create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/Code/DbgDotNetNativeCodeLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/CorDebugRuntimeKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/CorDebugRuntimeVersion.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/CorDebugStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/CorThreadUserStates.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/DbgCorDebugInternalRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/DotNetFrameworkStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/DotNetStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.CorDebug/dnSpy.Contracts.Debugger.DotNet.CorDebug.csproj create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/DbgMonoDebugInternalRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/MonoConnectStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/MonoConnectStartDebuggingOptionsBase.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/MonoDebugRuntimeKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/MonoStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/MonoStartDebuggingOptionsBase.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/ThreadStates.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/UnityConnectStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/UnityStartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet.Mono/dnSpy.Contracts.Debugger.DotNet.Mono.csproj create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Breakpoints/Code/DbgDotNetBreakpointFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgAsyncMethodDebugInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgAsyncStepInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgCodeRange.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgCompilerKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgDotNetCodeLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgDotNetCodeLocationFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgDotNetDecompilerGuidProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgDotNetDecompilerService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgDotNetInstructionOffsetConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgILInstruction.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgILOffsetMapping.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgILSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgLocal.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgMethodDebugInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgMethodDebugScope.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgParameter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgSourceStatement.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/DbgTextSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Code/IDbgDotNetCodeLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/DbgDotNetInternalAppDomain.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/DbgDotNetInternalModule.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/DbgDotNetInternalRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Disassembly/DbgDotNetNativeCode.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Disassembly/DbgDotNetNativeCodeBlock.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetAliasInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetCustomTypeInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetDispatcher.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetExceptionInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetLanguageGuids.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetObjectId.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetReturnValueInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetRuntimeExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetValue.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgDotNetValueResult.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/DbgLanguageDebugInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/Engine/DbgDotNetEngineObjectIdFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/Engine/DbgDotNetLanguageService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ExpressionCompiler/DbgDotNetAlias.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ExpressionCompiler/DbgDotNetCompilationResult.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ExpressionCompiler/DbgDotNetExpressionCompiler.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ExpressionCompiler/DbgModuleReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ExpressionCompiler/PredefinedDecompilerGuids.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/Formatters/DbgDotNetFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/Formatters/IDebuggerDisplayAttributeEvaluator.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/IDbgDotNetRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ValueNodes/DbgDotNetValueNode.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Evaluation/ValueNodes/DbgDotNetValueNodeFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DbgAppDomainExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DbgModuleExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DbgRuntimeExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DbgValueExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DmdAppDomainExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DmdModuleExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Extensions/DmdRuntimeExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgAssemblyInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgAssemblyInfoProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgDynamicModuleProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgDynamicModuleProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgMetadataService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/DbgModuleIdProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/Internal/DbgRawMetadata.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Metadata/Internal/DbgRawMetadataService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Modules/DbgModuleDotNetExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/PredefinedDotNetDbgRuntimeTags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Runtimes/DbgRuntimeDotNetExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Steppers/Engine/DbgDotNetEngineStepper.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Steppers/Engine/DbgDotNetEngineStepperFrameInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Steppers/Engine/DbgEngineStepperFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Steppers/Engine/Exceptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Text/DbgDotNetText.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/Text/DbgDotNetTextOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger.DotNet/dnSpy.Contracts.Debugger.DotNet.csproj create mode 100644 dnSpy/dnSpy.Contracts.Debugger/AntiAntiDebug/DbgHookedNativeFunction.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/AntiAntiDebug/DbgHookedNativeFunctionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/AntiAntiDebug/DbgNativeFunctionHookContext.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/AntiAntiDebug/IDbgNativeFunctionHook.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/AttachProgramOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/AttachProgramOptionsProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/AttachProgramOptionsProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/AttachableProcess.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/AttachableProcessesService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/Dialogs/ShowAttachToProcessDialog.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/Dialogs/ShowAttachToProcessDialogOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Attach/PredefinedAttachProgramOptionsProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/AttachToProgramOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgBoundCodeBreakpoint.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgBreakpointLocationFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgBreakpointLocationFormatterProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpoint.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpointDisplaySettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpointHitCountService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpointOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpointSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/DbgCodeBreakpointsService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/Dialogs/ShowCodeBreakpointSettingsService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/FilterExpressionEvaluator/DbgFilterEEVariableProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/FilterExpressionEvaluator/DbgFilterExpressionEvaluator.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/TextEditor/DbgBreakpointGlyphFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Code/TextEditor/DbgBreakpointGlyphTextMarkerLocationProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Modules/DbgModuleBreakpoint.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Modules/DbgModuleBreakpointInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Modules/DbgModuleBreakpointSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Breakpoints/Modules/DbgModuleBreakpointsService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/CallStack/DbgCallStackService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/CallStack/DbgStackFrame.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/CallStack/DbgStackWalker.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/CallStack/TextEditor/DbgStackFrameGlyphTextMarkerLocationInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/CallStack/TextEditor/DbgStackFrameTextViewMarker.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Code/DbgCodeLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Code/DbgCodeLocationSerializer.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Code/PredefinedDbgCodeLocationTypes.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Code/TextEditor/DbgTextViewCodeLocationProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgAppDomain.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgCollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgDispatcher.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgEnvironment.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgImageLayout.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgInternalAppDomain.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgInternalModule.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgInternalRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgManager.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgMessageEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgModule.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgModuleMemoryRefreshedNotifier.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgObject.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgProcess.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgRuntime.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgStateInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DbgThread.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DebugProgramOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/DebuggerSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Disassembly/DbgNativeCodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Disassembly/DbgRuntimeNativeCodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/CallStack/DbgEngineStackFrame.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/CallStack/DbgEngineStackWalker.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngine.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineAppDomain.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineBoundCodeBreakpoint.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineMessage.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineMessageFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineMessageKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineModule.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineRuntimeInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgEngineThread.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/DbgObjectFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineExpressionEvaluator.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineLanguage.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineLanguageProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineObjectId.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineObjectIdFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineValue.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineValueNode.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineValueNodeFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/DbgEngineValueNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Evaluation/PredefinedEvaluationErrorMessages.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Steppers/DbgEngineStepKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Engine/Steppers/DbgEngineStepper.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgEvaluationContext.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgEvaluationInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgExpressionEvaluationInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgExpressionEvaluator.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgLanguage.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgLanguageService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgObjectId.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgObjectIdService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgStackFrameFormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValue.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueFormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueFormatterTypeOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueNode.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueNodeEvaluationOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueNodeFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/DbgValueNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/PredefinedDbgLanguageNames.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/PredefinedDbgValueNodeImageNames.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Evaluation/PredefinedFormatSpecifiers.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgException.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionCategoryDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionCategoryDefinitionFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionConditionSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionDefinitionFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionEventFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionId.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/DbgExceptionSettingsService.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Exceptions/PredefinedExceptionCategories.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/IDbgManagerStartListener.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/PredefinedDbgRuntimeGuids.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/PredefinedDbgRuntimeKindGuids.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/PredefinedDebugTags.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/PredefinedThreadKinds.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/References/DbgLoadModuleReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/References/DbgLoadModuleReferenceHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/RuntimeId.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/DbgProcessStarter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/Dialog/PredefinedStartDebuggingOptionsPageDisplayOrders.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/Dialog/StartDebuggingOptionsPage.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/Dialog/StartDebuggingOptionsPageContext.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/Dialog/StartDebuggingOptionsPageProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/GenericDebugEngineGuidProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebugging/PredefinedGenericDebugEngineGuids.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/StartDebuggingOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Steppers/DbgStepKind.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Steppers/DbgStepper.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/DbgStringBuilderTextWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/DbgTextColor.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/DnSpy/ColorConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/DnSpy/DbgTextClassifierTextColorWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/DnSpy/DbgTextColorWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/Text/IDbgTextWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/ThreadCategoryProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Debugger/dnSpy.Contracts.Debugger.csproj create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/AppDirectories.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IAppCommandLineArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IAppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IAppStatusBar.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IAppWindow.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IDsLoader.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IMessageBoxService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/IOpenFromGAC.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/LoaderConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/MsgBox.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/App/MsgBoxButton.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilationKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilationResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilerDiagnostic.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilerDiagnosticSeverity.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilerDocumentInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilerMetadataReference.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/CompilerProjectInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/DebugFileFormat.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/DebugFileResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/IAssemblyReferenceResolver.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/ICodeDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/ILanguageCompiler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/ILanguageCompilerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/LineLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/LineLocationSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/AsmEditor/Compiler/TargetPlatform.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/BackgroundImage/BackgroundImageOptionDefinitionConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/BackgroundImage/DefaultImageSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/BackgroundImage/IBackgroundImageOptionDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/BackgroundImage/ImagePlacement.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BMObject.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/Bookmark.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkDisplaySettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkLocationFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkLocationFormatterProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkLocationSerializer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarkSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarksService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/BookmarksSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/CollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/DotNet/DotNetBookmarkFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/DotNet/DotNetBookmarkLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/Navigator/BookmarkDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/Navigator/BookmarkDocumentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/Navigator/BookmarkNavigator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/PredefinedBookmarkLocationTypes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/TextEditor/BookmarkGlyphTextMarkerLocationProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Bookmarks/TextEditor/TextViewBookmarkLocationProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/BookmarkIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/BookmarkIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandInfoProviderOrder.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandShortcut.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandTargetCommand.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandTargetFilterOrder.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/CommandTargetStatus.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/HexEditorIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/HexEditorIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandHolder.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandTarget.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandTargetCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandTargetCollectionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandTargetFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ICommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/IRegisteredCommandElement.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/KeyInput.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/KeyShortcut.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/OutputTextPaneIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/OutputTextPaneIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ReplIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/ReplIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/StandardIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/StandardIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/TextEditorIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/TextEditorIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/TextReferenceIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Command/TextReferenceIdsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ControlConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/FastTextBlock.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/FontUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IFocusable.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IUIObjectProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IWpfCommandService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IWpfCommands.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IWpfFocusChecker.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IWpfFocusService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/IZoomable.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/MetroWindow.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/MetroWindowCreatedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/TextControl.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/EditValueControl.xaml create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/EditValueControl.xaml.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/EditValueProviderService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/IEditValue.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/IEditableValue.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/ToolWindows/ListBoxSelectedItemsAP.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Controls/WindowBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Decompiler/IDecompilerService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Decompiler/IMethodDebugService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/ISymbolResolver.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/IX86DisassemblySettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/MemorySizeOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeCode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeCodeBlock.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeCodeBlockKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeCodeKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeCodeOptimization.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NativeVariableInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/NumberBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyContentFormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyContentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyContentProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyContentSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyText.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyViewerService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/Viewer/DisassemblyViewerServiceSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/X86NativeCodeInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/X86Register.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Disassembly/X86Variable.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/AnnotationsImpl.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/DocumentConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/DotNetReferences.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/DsDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/DsDocumentInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/FilenameKey.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IAnnotations.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDocumentNameKey.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDocumentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDocumentService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDocumentServiceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsDotNetDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IDsPEDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IInMemoryDocument.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/IMethodAnnotations.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/NotifyDocumentCollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/NotifyDocumentCollectionType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/ReferenceNavigator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TList.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/AsyncDocumentTabContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DefaultDocumentTabContentProviderConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/DocumentViewerContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/DocumentViewerContentDataIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/DocumentViewerExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/DocumentViewerListenerConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDecompileNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDecompileNodeCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDecompileNodeContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDecompileSelf.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerCustomDataContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerPostProcessor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerPostProcessorContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerReferenceEnablerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentViewerService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentWriterProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/IDocumentWriterService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/MoveCaretOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/PredefinedDocumentWriterProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ReferenceAndId.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ReferenceInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/TextReference.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ToolTips/ICodeToolTipProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ToolTips/ICodeToolTipWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ToolTips/IDocumentViewerToolTipProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocViewer/ToolTips/IDocumentViewerToolTipProviderContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocumentModifiedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocumentTabContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocumentTabReferenceResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/DocumentTabUIContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IAsyncShowContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IAsyncShowResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDecompilerTabContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDefaultDocumentTabContentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentListListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTab.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTabContentFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTabContentFactoryContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTabService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTabUIContextLocator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IDocumentTabUIContextProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IReferenceDocumentTabContentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IReferenceHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IReferenceHandlerContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/ISaveService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/IShowContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/ITabSaver.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/ITabSaverProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/ShowTabContentEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/Tabs/TabConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/AssemblyDocumentNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/AssemblyReferenceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/BaseTypeFolderNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/BaseTypeNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DerivedTypeNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DerivedTypesFolderNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentFilterType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentNodeWriteOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentTreeNodeActivatedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentTreeNodeData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentTreeNodeFilterResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentTreeNodeGroupType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DocumentTreeViewConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/DsDocumentNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/EventNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/FieldNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/FilterType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeNodeDataContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeNodeDataFinder.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeNodeGroups.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeViewProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDocumentTreeViewSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/IDsDocumentNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/MemberKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/MessageNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/MethodNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/ModuleDocumentNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/ModuleReferenceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/NamespaceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/NodeFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/NodePathName.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/NotifyDocumentTreeViewCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/NotifyDocumentTreeViewCollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/PEDocumentNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/PropertyNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/ReferencesFolderNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/BuiltInResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/Deserializer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/GuessFileType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/IResourceDataProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/IResourceNodeFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/IResourceNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ImageListOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ImageResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ImageResourceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ImageResourceUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceDataType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceElementSetNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/ResourceUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SaveResources.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializationUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializedImageListStreamerResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializedImageListStreamerUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializedImageResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializedImageUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/SerializedResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/UnknownResourceNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/Resources/UnknownSerializedResourceElementNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/ResourcesFolderNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/TypeNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/TypeReferencesFolderNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Documents/TreeView/UnknownDocumentNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ETW/DnSpyEventSource.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Extension/ExtensionEvent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Extension/ExtensionInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Extension/IAutoLoaded.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Extension/IExtension.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Adornments/HexToolTipProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Adornments/HexToolTipProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/DnSpy/HexTextElementCreator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/DnSpy/HexTextElementCreatorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassificationChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassificationContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassificationFormatMapService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassificationSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassifier.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexEditorFormatMapService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Classification/HexViewClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultHexEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultHexViewEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultHexViewHostEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultHexViewHostOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultHexViewOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultWpfHexViewEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/DefaultWpfHexViewOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexAdornmentLayer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexAdornmentLayerDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexAdornmentLayerElement.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexCaret.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexCaretPosition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexColumnLineKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexCursorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexEditorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexEditorFactoryServiceListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexEditorOptionDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexEditorOptionsFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGlyphFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGlyphFactoryProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGlyphMouseProcessorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGlyphTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGroups/HexEditorGroupFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexGroups/LocalGroupOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexImageReferenceTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexIntraTextAdornmentTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexKeyProcessor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexKeyProcessorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexLayerKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexLayerKindAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMarginContextMenuHandlerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMarginContextMenuService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMarginNameAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMarkerServiceZIndexes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMouseHoverAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMouseHoverEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMouseProcessor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexMouseProcessorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexReferenceConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexReferenceHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexReferenceHandlerService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexScrollMap.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexScrollMapFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexSelection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexSpaceReservationAgent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexSpaceReservationManager.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexSpaceReservationManagerDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexStructureInfoAggregator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexStructureInfoAggregatorFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexStructureInfoProviderAndData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexStructureInfoProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexVerticalFractionMap.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewCreatedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewCreationListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewCreatorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewLayoutChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewLineCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewMargin.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewScroller.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/HexViewState.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/OptionsExtensionMethods/DefaultHexViewHostOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/OptionsExtensionMethods/DefaultHexViewOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/OptionsExtensionMethods/DefaultWpfHexViewOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexAdornmentLayers.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexGlyphFactoryProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexMarginNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexReferenceHandlerNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexReferenceHandlerTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexSpaceReservationManagerNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexStructureInfoProviderFactoryNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/PredefinedHexViewRoles.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexViewCreationListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexViewHost.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexViewLineCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexViewMargin.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Editor/WpfHexViewMarginProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BasicData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferField.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferFileHeadersProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferFileHeadersProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferFileOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/BufferFilesEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DnSpy/HexFileImageReferenceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DnSpy/ToolTipCreator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DnSpy/ToolTipCreatorFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DnSpy/ToolTipObjectFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/Bit7EncodedInt32Data.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/Bit7EncodedStringData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/BlobEncodedUInt32Data.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/CodedToken.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/ColumnInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/ColumnSize.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetCor20Data.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetEmbeddedResource.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetHeaders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetHeap.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetHeapKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMetadataHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMetadataHeaders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMethodBodyData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMethodProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMultiFileResourceHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetMultiFileResources.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetResourceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/DotNetStorageStream.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/HeapData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/MDStreamFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/MDTable.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/MDToken.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/MultiResourceDataHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/MultiResourceUnicodeNameAndOffsetData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/PdbStreamHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/PredefinedDotNetDataIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/ResourceTypeCode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/ResourceTypeCodeData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/SimpleData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/StructureData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/Table.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/TableInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/TableRecordData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/TablesHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/TablesHeapType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/TokenData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/DotNet/Utils.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/EnumFieldInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/FlagInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexBufferFile.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexBufferFileService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexBufferFileServiceFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFieldFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFieldFormatterFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFieldFormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFileStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFileStructureInfoProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFileStructureInfoService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexFileStructureInfoServiceFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/HexNumberOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/IBufferFileHeaders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/DataDirectoryData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeDosHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeFileHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeFileLayoutProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeHeaders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeOptionalHeaderData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PeSectionsData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/PredefinedPeDataIds.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PE/SimpleData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PredefinedBufferFileTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PredefinedHexFileStructureInfoProviderFactoryNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/PredefinedStructureProviderFactoryNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/StructureProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/StructureProviderFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/ToolTips/HexToolTipContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/ToolTips/HexToolTipContentCreator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Files/ToolTips/HexToolTipContentCreatorFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/FormattedHexSourceFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexAdornmentElement.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexAndAdornmentCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexAndAdornmentSequencer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexAndAdornmentSequencerFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexFormattedLine.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexFormattedLineSource.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexHtmlBuilderService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexLineTransformSource.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexLineTransformSourceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexSequenceElement.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/HexViewLine.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/NullHexClassifier.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Formatting/WpfHexViewLine.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBuffer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferCreatedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferLine.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferLineFormatter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferLineFormatterFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferLineFormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferPoint.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferSpanEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferSpanSelection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferStream.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBufferStreamFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexBytes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexCachedBufferStream.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexCell.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexCellCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexCellPosition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexChange.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexChangeImpl.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexColumnPosition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexColumnType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexContentChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexContentChangingEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexEdit.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexGroupInformation.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexLinePositionInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexLinePositionInfoType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexLineSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexOffsetFormat.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexPosition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexPositionConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexSimpleBufferStream.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexSpanInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexSpanSelectionFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexValuesDisplayFormat.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexVersion.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/HexVersionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseController.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseControllerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisensePresenter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisensePresenterProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseSession.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseSessionStack.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseSessionStackMapService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexIntellisenseSpaceReservationManagerNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexQuickInfoBroker.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexQuickInfoSession.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexQuickInfoSource.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/HexQuickInfoSourceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/IHexCustomIntellisensePresenter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/IHexInteractiveQuickInfoContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/IHexPopupIntellisensePresenter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Intellisense/PredefinedHexIntellisensePresenterProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/NormalizedHexBufferSpanCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/NormalizedHexChangeCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/NormalizedHexSpanCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Operations/HexEditorOperations.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Operations/HexEditorOperationsFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Operations/HexFindOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Operations/HexSearchService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Operations/HexSearchServiceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/PositionAndData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/PredefinedHexBufferTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexBatchedTagsChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexBufferTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexClassificationTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexMarkerTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexSpaceNegotiatingAdornmentTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTagAggregator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTagSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTagTypeAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTagger.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTaggerContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTaggerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTagsChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexTextTagSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexToolTipStructureSpanTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexViewTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Tagging/HexViewTaggerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Text/HexClassifiedText.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Text/HexClassifiedTextCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Text/HexTextWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/Text/PredefinedClassifiedTextTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Hex/TextAndHexSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/DsImage.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/DsImageStrings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/DsImages.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/DsImagesAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/IDotNetImageService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/IImageService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/IImageSourceInfoProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/ImageOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/ImageReference.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/ImageReferenceConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Images/ImageSourceInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/AcronymSearchHelpers.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/BestMatchSelector.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/Classification/CompletionClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/Classification/CompletionClassifierKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/Classification/CompletionDisplayTextClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/Classification/CompletionSuffixClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/CompletionConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/CompletionExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/CompletionFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/DsCompletion.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/DsCompletionIcon.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/DsCompletionSet.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/DsIntellisenseFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/FilteredCompletionCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/ICompletionFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/ICompletionSetContentTypeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/PredefinedDsCompletionSourceProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/PredefinedDsQuickInfoSourceProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/PredefinedDsSignatureHelpSourceProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/PredefinedIntellisensePresenterProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/PredefinedUIElementProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/SignatureHelpClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Language/Intellisense/SignatureHelpConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/AutomationPeerMemoryLeakWorkaround.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/Converters/FontSizeConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/Converters/NegateBooleanConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/DataFieldVM.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/Dialogs/ProgressDlg.xaml create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/Dialogs/ProgressDlg.xaml.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/Dialogs/ProgressVM.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/EnumVM.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/GridViewColumnSorter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/IGridViewColumnDescsProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/IInitializeDataTemplate.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/InitDataTemplateAP.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/IsDraggableAP.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/ListVM.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/PickDirectory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/PickFilename.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/PickFilenameConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/PickSaveFilename.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/MVVM/RelayCommand.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/CommandTargetMenuItemBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/CreatedMenuItem.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/GuidObject.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/GuidObjectsProviderArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IContextMenuInitializer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IContextMenuProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IGuidObjectsProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenu.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenuItem.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenuItemContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenuItemProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/IMenuService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/MenuConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/MenuItemBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Menus/MenuItemCommand.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Metadata/IModuleIdFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Metadata/IModuleIdFactoryProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Metadata/IModuleIdProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Metadata/IRuntimeAssemblyResolver.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Metadata/ModuleIdFactoryProviderConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Output/ICachedWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Output/IOutputService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Output/IOutputServiceListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Output/IOutputTextPane.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Output/IOutputWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/AssemblyInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.Designer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.cs.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.de.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.es-ES.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.fa.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.fr.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.hu.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.it.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.pt-BR.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.pt-PT.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.ru.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.tr.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.uk.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Properties/dnSpy.Contracts.DnSpy.Resources.zh-CN.resx create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/IOutputWritable.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/IOutputWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/IServiceLocator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/Roslyn/ICachedWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/Roslyn/IPrintOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/Roslyn/IScriptGlobals.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/Roslyn/ITextPrinter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/Roslyn/MemberDisplayFormat.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/ScriptException.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Scripting/UIUtils.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/BodyResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/ChainDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/DocumentSearcherOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/DocumentTreeNodeFilterBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/EntryPointDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/FilterNothingDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/FlagsDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/IDocumentSearcher.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/IDocumentSearcherProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/ISearchComparer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/ISearchResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/NamespaceRef.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/NamespaceSearchResult.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/SameAssemblyDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/SameModuleDocumentTreeNodeFilter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/SearchComparers.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/SearchResultEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/SearchTypeInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/ShowNothingDocumentTreeNodeFilterBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Search/VisibleMembersFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/AppearanceCategory/AppearanceCategoryConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/AppearanceCategory/TextAppearanceCategoryDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/CodeEditor/CodeEditorOptionsDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/CodeEditor/DefaultCodeEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/AppSettingsConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/AppSettingsPage.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/IAppRefreshSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/IAppSettingsModifiedListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/IAppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/IAppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Dialog/IAppSettingsService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Fonts/FontSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Fonts/FontType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Fonts/ThemeFontSettings.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Fonts/ThemeFontSettingsDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Fonts/ThemeFontSettingsService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/FontsAndColors/FontAndColorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/FontsAndColors/FontAndColorOptionsProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/FontsAndColors/FontOption.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/ContentTypeOptionDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/IContentTypeOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/ITextViewOptionsGroup.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/ITextViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/ITextViewOptionsGroupService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/PredefinedTextViewGroupNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Groups/TextViewOptionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexEditor/DefaultHexEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexEditor/HexEditorOptionsDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/HexViewOptionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/HexViewOptionsGroup.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/HexViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/HexViewOptionsGroupService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/PredefinedHexViewGroupNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/TagOptionDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/HexGroups/TagOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/ISettingsSection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/ISettingsSectionProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/ISettingsService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/ISettingsService2.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/ISettingsServiceFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Repl/DefaultReplOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Settings/Repl/ReplOptionsDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabGroup.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabGroupService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/ITabServiceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabContentAttachedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabContentVisibilityEvent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabGroupCollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabGroupSelectedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabGroupServiceOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Tabs/TabSelectedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/CachedTextColorsCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/EditorFormatMapConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ISynchronousClassifier.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ISynchronousClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ISynchronousViewClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextClassifier.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextClassifierAggregator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextClassifierProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextElementFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ITextElementProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/IThemeClassificationTypeService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/IThemeFormatDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/LanguagePriority.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/PredefinedClassificationTypeNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/PredefinedTextClassifierTags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/RoslynClassificationTypeNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/TextBlockFactory.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/TextClassificationTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/TextClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/TextClassifierTextColorWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/TextElementFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ThemeClassificationFormatDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ThemeClassificationTypeNameKeys.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ThemeClassificationTypeNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Classification/ThemeMarkerFormatDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/ColorAndText.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/ContentTypes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/ContentTypesHelper.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/BlockStructureData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/BlockStructureKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/BlockStructureLineKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/CodeEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/CommonTextEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/DefaultDsOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/DefaultDsTextViewOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/DefaultDsWpfViewOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/DefaultReplEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/GlyphTextMarkerServiceZIndexes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IBlockStructureService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IBlockStructureServiceDataProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IBlockStructureServiceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ICodeEditor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ICodeEditorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ICustomLineNumberMargin.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IDsTextEditorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IDsTextView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IDsTextViewLine.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IDsWpfTextView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IDsWpfTextViewHost.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IGlyphTextMarkerHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IGlyphTextMarkerMouseProcessor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IGlyphTextMarkerService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ILineSeparatorTag.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ILogEditor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ILogEditorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IMarginContextMenuHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IMarginContextMenuHandlerProviderService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplCommandHandler.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplCommandInput.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplEditor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplEditorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplaceListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IReplaceListenerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IndentStyle.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/IsOverlayLayerAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/LayerKind.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/LayerKindAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/LogEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/MarginNameAttribute.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/Operations/ITextViewUndoManager.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/Operations/ITextViewUndoManagerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/OptionsExtensionMethods/DefaultDsOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/OptionsExtensionMethods/DefaultDsTextViewOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/OptionsExtensionMethods/DefaultDsWpfViewOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/OptionsExtensionMethods/DefaultReplEditorOptionsExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsAdornmentLayers.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsGlyphFactoryProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsGlyphMouseProcessorProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsGlyphTextMarkerMouseProcessorProviderNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsMarginNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsMouseProcessorProviders.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedDsTextViewRoles.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/PredefinedSpaceReservationManagerNames.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ReplEditorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/ReplEditorUtils.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/TextMarkerServiceZIndexes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/TextViewCreatorOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/TextViewExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Editor/WordWrapStylesConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Formatting/HtmlClipboardFormatWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Formatting/IHtmlBuilderService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/LineConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Operations/IReplEditorOperations.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/SpanDataCollection.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/StringBuilderTextColorOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Tagging/ISynchronousBufferTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Tagging/ISynchronousTagAggregator.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Tagging/ISynchronousTagger.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/Tagging/ISynchronousViewTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/TextEditorPosition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Text/WPF/WpfUnicodeUtils.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/ColorType.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/ExtensionMethods.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/ITheme.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/IThemeColor.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/IThemeService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/ThemeChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Themes/ThemeConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarButton.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarItem.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarItemContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarObject.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/IToolBarToggleButton.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/ToolBarButtonBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/ToolBarButtonCommand.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/ToolBarConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolBars/ToolBarObjectBase.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/App/AppToolWindowConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/App/AppToolWindowLocation.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/App/IDsToolWindowService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/App/IToolWindowContentProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/App/ToolWindowContentInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/IToolWindowGroup.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/IToolWindowGroupService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/IToolWindowService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/IToolWindowServiceProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/Search/SearchColumnCommandParser.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/Search/SearchColumnDefinition.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/Search/SearchMatcher.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/Search/SearchTextClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/Search/SearchTextClassifierProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowContent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowContentVisibilityEvent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowGroupCollectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowGroupSelectedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowGroupServiceOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/ToolWindows/ToolWindowSelectedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/AsyncNodeProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/IMDTokenNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeNode.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeNodeDataProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeNodeGroup.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeView.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeViewListener.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/ITreeViewService.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/Text/ITreeViewNodeTextElementProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/Text/TreeViewContentTypes.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/Text/TreeViewNodeClassifierContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeNodeData.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeNodeDataProviderContext.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewListenerEvent.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewListenerEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewNodeRemovedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/TreeView/TreeViewSelectionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Utilities/DelayedAction.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Utilities/ProfileOptimizationHelper.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Utilities/ToolTipHelper.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/Utilities/UIUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.DnSpy/dnSpy.Contracts.DnSpy.csproj create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/AddressReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/AsyncMethodDebugInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/AsyncStepInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/BamlDecompilerOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/CodeBracesRange.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/CodeBracesRangeFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/CustomAttributesUtils.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilationContext.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilationType.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompileAssemblyInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilePartialType.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompileTypeBase.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompileTypeMethods.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilerConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilerOptionConstants.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilerReferenceFlags.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/DecompilerSettingsBase.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/Extensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/FormatterOptions.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/GenericArgumentResolver.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IBamlDecompiler.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IDecompiler.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IDecompilerCreator.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IDecompilerOption.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IDecompilerOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IDecompilerProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IInstructionBytesReader.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/ILSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/ISimpleILPrinter.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/ISourceVariable.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/IdentifierEscaper.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/InstructionReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/LineSeparator.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MemberComparer.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MetadataTextColorProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodDebugInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodDebugInfoBuilder.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodDebugScope.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodDebugScopeBuilder.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodSourceStatement.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/MethodStatementReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/NamespaceReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/PredefinedCompilerNames.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/PredefinedCustomDataIds.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/PredefinedSpanReferenceIds.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/SimpleXmlParser.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/SourceLocal.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/SourceParameter.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/SourceStatement.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/SpanReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/StringBuilderDecompilerOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/StringBuilderExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TextColorWriterToDecompilerOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TextSpan.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TextSpanData.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TextWriterDecompilerOutput.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TokenReference.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/TypesHierarchyHelpers.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/XmlDoc/XmlDocKeyProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/XmlDoc/XmlDocLoader.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/XmlDoc/XmlDocRenderer.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Decompiler/XmlDoc/XmlDocumentationProvider.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/MVVM/ViewModelBase.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Metadata/ModuleId.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Metadata/ModuleTokenId.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/NRT.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/NRT_Helpers.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/AssemblyInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.Designer.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.cs.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.de.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.es-ES.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.fa.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.fr.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.hu.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.it.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.pt-BR.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.pt-PT.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.ru.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.tr.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.uk.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Properties/dnSpy.Contracts.Logic.Resources.zh-CN.resx create mode 100644 dnSpy/dnSpy.Contracts.Logic/Resources/ResourceHelper.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Text/ITextColorWriter.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Text/ITextColorWriterExtensions.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Text/Indenter.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Text/NameUtilities.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Text/TextColor.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Utilities/GacInfo.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/Utilities/SimpleTypeConverter.cs create mode 100644 dnSpy/dnSpy.Contracts.Logic/dnSpy.Contracts.Logic.csproj create mode 100644 dnSpy/dnSpy.Decompiler/CSharp/CSharpFormatter.cs create mode 100644 dnSpy/dnSpy.Decompiler/DecompilerBase.cs create mode 100644 dnSpy/dnSpy.Decompiler/FilenameUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/FormatterMethodInfo.cs create mode 100644 dnSpy/dnSpy.Decompiler/IL/ILLanguageHelper.cs create mode 100644 dnSpy/dnSpy.Decompiler/IL/InstructionBytesReader.cs create mode 100644 dnSpy/dnSpy.Decompiler/IL/InstructionUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/IL/ModifiedInstructionBytesReader.cs create mode 100644 dnSpy/dnSpy.Decompiler/IL/OriginalInstructionBytesReader.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/AppConfigProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ApplicationIcon.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ApplicationManifest.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/AssemblyInfoProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/BamlResourceProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/BuildAction.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/DecompileContext.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/DefaultNamespaceFinder.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/DotNetUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/FileUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/FilenameCreator.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/IJob.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/IMSBuildProgressListener.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/IMSBuildProjectWriterLogger.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/MSBuildProjectCreator.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/NoMSBuildProjectWriterLogger.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/Project.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ProjectCreatorOptions.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ProjectModuleOptions.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ProjectVersion.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ProjectWriter.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/RawEmbeddedResourceProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ResXProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ResourceNameCreator.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/ResourceProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/SatelliteAssemblyFinder.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/SettingsProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/SettingsTypeProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/SolutionWriter.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/SplashScreenProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/TypeProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/WinFormsProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/MSBuild/XamlTypeProjectFile.cs create mode 100644 dnSpy/dnSpy.Decompiler/Properties/AssemblyInfo.cs create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.Designer.cs create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.cs.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.de.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.es-ES.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.fa.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.fr.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.hu.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.it.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.pt-BR.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.pt-PT.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.ru.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.tr.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.uk.resx create mode 100644 dnSpy/dnSpy.Decompiler/Properties/dnSpy.Decompiler.Resources.zh-CN.resx create mode 100644 dnSpy/dnSpy.Decompiler/Settings/DecompilerOption.cs create mode 100644 dnSpy/dnSpy.Decompiler/TargetFrameworkInfo.cs create mode 100644 dnSpy/dnSpy.Decompiler/TargetFrameworkUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/TypeFormatterUtils.cs create mode 100644 dnSpy/dnSpy.Decompiler/Utils/StateMachineHelpers.cs create mode 100644 dnSpy/dnSpy.Decompiler/VisualBasic/VisualBasicFormatter.cs create mode 100644 dnSpy/dnSpy.Decompiler/dnSpy.Decompiler.csproj create mode 100644 dnSpy/dnSpy/BackgroundImage/BackgroundImageOptionDefinitionService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/BackgroundImageOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/BackgroundImageService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/BackgroundImageSettings.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/BackgroundImageSettingsService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/DefaultRawSettings.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/Dialog/AppSettingsPageImpl.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/HexViewBackgroundImageService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/ImageSourceService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/ImageSourceServiceProvider.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/RawSettings.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/TextViewBackgroundImageService.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/WpfHexViewCreationListenerImpl.cs create mode 100644 dnSpy/dnSpy/BackgroundImage/WpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Bookmarks/BookmarkImageUtilities.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Commands/AppMenuCommands.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Commands/MainMenuOperations.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/BookmarkFormatterService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/BookmarkLocationFormatterProviderImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/BookmarkLocationSerializerImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetBookmarkFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetBookmarkLocationFactory.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetBookmarkLocationFormatter.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetMethodBodyBookmarkLocationImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetReferenceConverter.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/DotNetTokenBookmarkLocationImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/IDotNetBookmarkLocation.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/TextEditor/BookmarkDocumentProviderImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/TextEditor/BookmarkGlyphTextMarkerLocationProviderImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/TextEditor/DeleteBookmarksInRemovedModules.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/TextEditor/TextViewDotNetMethodBodyBookmarkLocationProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/DotNet/TextEditor/TextViewDotNetTokenBookmarkLocationProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarkDisplaySettingsBase.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarkImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarkLocationFormatterService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarkLocationSerializerService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarkSerializerService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarksListSettings.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarksSerializer.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Impl/BookmarksServiceImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Navigator/BookmarkNavigatorImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Navigator/ViewBookmarkProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Settings/BookmarksAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Bookmarks/Settings/BookmarksSettingsImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/BookmarkGlyphTextMarkerHandler.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/BookmarkGlyphTextMarkerLocationProviderService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/BookmarkInfo.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/BookmarkMarker.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/DocViewer/DocumentViewerBookmarksOperations.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/DocViewer/DocumentViewerCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/DocViewer/DocumentViewerCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/DocViewer/DocumentViewerCommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/TextEditor/TextViewBookmarkService.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarkColumnConverter.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarkContext.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarkFormatter.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarkVM.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksContent.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksControl.xaml create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksControl.xaml.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksOperations.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksToolWindowContent.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksVM.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/BookmarksWindowColumnIds.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/Commands.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/SearchTextClassifierProvider.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/TextViewTaggers.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/Bookmarks/ViewBookmarkProviderImpl.cs create mode 100644 dnSpy/dnSpy/Bookmarks/ToolWindows/LazyToolWindowVMHelper.cs create mode 100644 dnSpy/dnSpy/Bookmarks/UI/BulkObservableCollection.cs create mode 100644 dnSpy/dnSpy/Bookmarks/UI/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Bookmarks/UI/FormatterObject.cs create mode 100644 dnSpy/dnSpy/Commands/CommandService.cs create mode 100644 dnSpy/dnSpy/Commands/DefaultCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Commands/KeyShortcutCollection.cs create mode 100644 dnSpy/dnSpy/Commands/ProviderAndCommand.cs create mode 100644 dnSpy/dnSpy/Commands/RegisteredCommandElement.cs create mode 100644 dnSpy/dnSpy/Controls/DpiService.cs create mode 100644 dnSpy/dnSpy/Controls/FastTreeNodeView.cs create mode 100644 dnSpy/dnSpy/Controls/IStackedContentChild.cs create mode 100644 dnSpy/dnSpy/Controls/Screen.cs create mode 100644 dnSpy/dnSpy/Controls/StackedContent.cs create mode 100644 dnSpy/dnSpy/Controls/StackedContentState.cs create mode 100644 dnSpy/dnSpy/Controls/SysMenuButton.cs create mode 100644 dnSpy/dnSpy/Controls/TabButton.cs create mode 100644 dnSpy/dnSpy/Controls/TextElementFactory.cs create mode 100644 dnSpy/dnSpy/Controls/WinSysButton.cs create mode 100644 dnSpy/dnSpy/Controls/WindowDpiChangedEventArgs.cs create mode 100644 dnSpy/dnSpy/Controls/WpfCommandService.cs create mode 100644 dnSpy/dnSpy/Controls/WpfCommands.cs create mode 100644 dnSpy/dnSpy/Controls/WpfFocusService.cs create mode 100644 dnSpy/dnSpy/Controls/ZoomSelector.cs create mode 100644 dnSpy/dnSpy/Culture/Commands.cs create mode 100644 dnSpy/dnSpy/Culture/CultureService.cs create mode 100644 dnSpy/dnSpy/Culture/CultureSettings.cs create mode 100644 dnSpy/dnSpy/Culture/LanguageInfo.cs create mode 100644 dnSpy/dnSpy/Decompiler/DecompilerAppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Decompiler/DecompilerService.cs create mode 100644 dnSpy/dnSpy/Decompiler/DecompilerServiceSettings.cs create mode 100644 dnSpy/dnSpy/Decompiler/DummyDecompiler.cs create mode 100644 dnSpy/dnSpy/Decompiler/MethodDebugService.cs create mode 100644 dnSpy/dnSpy/Disassembly/CodeStyleAppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Disassembly/CodeStyleConstants.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/CachedSymbolResolver.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyContentOutput.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyContentProviderFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyContentSettingsImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyDocumentTabContent.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblySettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyViewerServiceImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/DisassemblyViewerServiceSettingsImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/InternalFormatterOptions.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/SymbolResolverUtils.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/DisassemblyContentGenerator.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/DisassemblyContentProviderFactory.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/DisassemblyContentProviderImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/DocumentViewerToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/MnemonicReference.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/RegisterUtils.cs create mode 100644 dnSpy/dnSpy/Disassembly/Viewer/X86/SymbolKindUtils.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/Block.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/BlockFactory.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/CodeStyleSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/DisasmBooleanSetting.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/DisassemblyCodeStyleAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/DisassemblySettings.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/DisassemblySettingsUtils.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/GasAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/GasDisassemblySettingsImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/MasmAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/MasmDisassemblySettingsImpl.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/NasmAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Disassembly/X86/NasmDisassemblySettingsImpl.cs create mode 100644 dnSpy/dnSpy/Documents/AssemblyResolver.cs create mode 100644 dnSpy/dnSpy/Documents/DefaultDsDocumentLoader.cs create mode 100644 dnSpy/dnSpy/Documents/DefaultDsDocumentProvider.cs create mode 100644 dnSpy/dnSpy/Documents/DotNetPathProvider.cs create mode 100644 dnSpy/dnSpy/Documents/DsDocumentLoader.cs create mode 100644 dnSpy/dnSpy/Documents/DsDocumentService.cs create mode 100644 dnSpy/dnSpy/Documents/DsDocumentServiceAppSettingsModifiedListener.cs create mode 100644 dnSpy/dnSpy/Documents/DsDocumentServiceProvider.cs create mode 100644 dnSpy/dnSpy/Documents/DsDocumentServiceSettings.cs create mode 100644 dnSpy/dnSpy/Documents/FileUtils.cs create mode 100644 dnSpy/dnSpy/Documents/FrameworkPath.cs create mode 100644 dnSpy/dnSpy/Documents/IDsDocumentLoader.cs create mode 100644 dnSpy/dnSpy/Documents/MethodAnnotations.cs create mode 100644 dnSpy/dnSpy/Documents/ReferenceNavigatorServiceImpl.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/AppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/AsyncShowResult.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Commands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/CopyTokenCommand.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DecompilationCache.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DefaultDecompileNode.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DefaultDocumentList.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DefaultDocumentTabContentProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/DocumentListColumnConverter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/DocumentListPrinter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/DocumentListVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/ExportToProjectDlg.xaml create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/ExportToProjectDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/ExportToProjectSettings.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/ExportToProjectVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/GACFileColumnConverter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/GACFileFinder.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/GACFilePrinter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/GACFileVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentListDlg.xaml create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentListDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentListTextClassifier.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentListTextClassifierContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentListVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenDocumentsHelper.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGAC.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGACDlg.xaml create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGACDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGACTextClassifier.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGACTextClassifierContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/OpenFromGACVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabColumnConverter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabPrinter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabsDlg.xaml create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabsDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabsVM.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Dialogs/TabsVMSettings.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocTabReferenceNavigator.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BlockStructureCollection.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BlockStructureDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BlockStructureDocumentViewerListener.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BlockStructureServiceDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BracePairCollection.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BracePairDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/BracePairService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Commands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DebugInfoDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DecompileDocumentTabContent.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DecompileNodeContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DecompilerTabContentClassifierContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DecompilerTabContentContentTypes.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DecompilerTabContentTextElementProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewer.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerCommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerContentFactory.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerControl.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerDotNetSpanMap.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerHighlightReferencesTagger.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerOutput.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentViewerUIElementService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/DocumentWriterService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/GlyphTextMarkerServiceDocumentViewerListener.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/HighlightRelatedKeywordsDocumentViewerReferenceEnabler.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/LazyBlockStructureCollection.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/LineSeparatorCollection.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/LineSeparatorDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/LineSeparatorViewTagger.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/OpCodeReferenceHandler.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/AdvancedAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/AppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/AppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/ContentTypeOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/DocumentViewerOptions.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/DocumentViewerOptionsService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/IDocumentViewerOptions.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/ScrollBarsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/TabsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/Settings/TextViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/SpanDataCollectionUtilities.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/SpanDataReferenceInfoExtensions.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/SpanReferenceDocumentViewerCustomDataProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/CodeToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/CodeToolTipSettings.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/CodeToolTipWriter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/DnlibReferenceDocumentViewerToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/DocumentViewerToolTipService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/NumberDocumentViewerToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/NumberUtils.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/ToolTips/ToolTipProviderContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/WaitAdorner.xaml create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/WaitAdorner.xaml.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/XmlDocumentWriter.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/XmlParser.DocumentViewerToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/XmlParser.XamlAttributeParser.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocViewer/XmlParser.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentList.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentListLoader.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentListService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabContentFactoryContext.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabContentFactoryService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabSerializer.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabServiceLoader.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabServiceSettings.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabUIContextLocator.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTabUIContextLocatorProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DocumentTreeNodeDecompiler.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/DsDocumentInfoSerializer.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/EntryPointCommands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/GoToTokenCommand.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Hex/HexReferenceHandlerImpl.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/IDecompilationCache.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/IDocumentTabUIContextLocatorProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/NavigationCommands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/NodeDecompiler.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/NodeReferenceDocumentTabContentProvider.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/NullObjects.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/RedecompileTabs.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/RefreshResourcesCommand.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/ResourceCommands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/SaveCommands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/SaveService.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/SearchMsdnCommand.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/SerializedTabs.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/Settings/AssemblyExplorerAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/TabCommands.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/TabContentImpl.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/TabHistory.cs create mode 100644 dnSpy/dnSpy/Documents/Tabs/TreeNodeReferenceDocumentTabContentProvider.cs create mode 100644 dnSpy/dnSpy/Documents/TargetFrameworkAttributeInfo.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/AssemblyDocumentNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/AssemblyExplorerMostRecentlyUsedList.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/AssemblyReferenceNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/BaseTypeFolderNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/BaseTypeNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DefaultDsDocumentNodeProvider.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DerivedTypeNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DerivedTypesFinder.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DerivedTypesFolderNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeNodeDataContext.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeNodeGroups.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeView.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeViewAppSettingsConstants.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeViewAppSettingsModifiedListener.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeViewProvider.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/DocumentTreeViewSettings.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/EventNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/FieldNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/MemberReferenceFinder.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/MessageNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/MethodNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/ModuleDocumentNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/ModuleReferenceNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/NamespaceNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/PEDocumentNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/PropertyNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/ReferencesFolderNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/BuiltInResourceElementNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/ImageResourceNode.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/ResourceElementSetNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/ResourceNodeFactory.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/SerializedImageListStreamerResourceElementNode.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/SerializedImageResourceElementNode.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/UnknownResourceNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/Resources/UnknownSerializedResourceElementNode.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/ResourcesFolderNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/RootNode.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/TypeNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/TypeReferencesFolderNodeImpl.cs create mode 100644 dnSpy/dnSpy/Documents/TreeView/UnknownDocumentNodeImpl.cs create mode 100644 dnSpy/dnSpy/Events/WeakEventList.cs create mode 100644 dnSpy/dnSpy/Extension/ExtensionConfig.cs create mode 100644 dnSpy/dnSpy/Extension/ExtensionConfigReader.cs create mode 100644 dnSpy/dnSpy/Extension/ExtensionService.cs create mode 100644 dnSpy/dnSpy/Extension/LoadedExtension.cs create mode 100644 dnSpy/dnSpy/FileLists/DOTNET Framework v3.5 Client.FileList.xml create mode 100644 dnSpy/dnSpy/FileLists/DOTNET Framework v4.0 Client.FileList.xml create mode 100644 dnSpy/dnSpy/Hex/Adornments/HexToolTipProviderFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Adornments/HexToolTipProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/ByteArrayHexBufferStream.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/DnSpy/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/DnSpy/HexTextElementCreatorImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/DnSpy/HexTextElementCreatorProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexBufferClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexClassificationFormatMapServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexClassifierAggregatorServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexEditorFormatMapServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexTextView.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexViewClassificationFormatMap.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexViewClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexViewClassifierAggregatorServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Classification/HexViewEditorFormatMap.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/CommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/CommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToMetadataDlg.xaml create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToMetadataDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToMetadataVM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToPositionDlg.xaml create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToPositionDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/GoToPositionVM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexCommandConstants.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexCommandIds.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexCommandIdsExtensions.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexCommandOperations.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexCommandOperationsFactoryService.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/HexPositionVM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/Integer64VM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/LocalSettingsDlg.xaml create mode 100644 dnSpy/dnSpy/Hex/Commands/LocalSettingsDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/LocalSettingsVM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/SelectDlg.xaml create mode 100644 dnSpy/dnSpy/Hex/Commands/SelectDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/SelectVM.cs create mode 100644 dnSpy/dnSpy/Hex/Commands/SettingsConstants.cs create mode 100644 dnSpy/dnSpy/Hex/ContextMenuCommands/Commands.cs create mode 100644 dnSpy/dnSpy/Hex/ContextMenuCommands/EditFieldCommand.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/ActiveColumnHighlighter.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/BottomControlMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/BottomRightCornerMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/ColumnLineSeparators.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/CopyWpfHexViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/CurrentLineHighlighter.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/CurrentValueHighlighter.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/DefaultHexEditorCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/DefaultHexMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/DefaultHexViewCommandTarget.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/DefaultHexViewMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexAdornmentLayerCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexAdornmentLayerDefinitionService.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexAdornmentLayerDefinitionServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexAdornmentLayerElementImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexAdornmentLayerImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexCaretImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexCaretLayer.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexContextMenuInitializer.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexEditorFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexEditorOptions.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexEditorOptionsFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexGlyphMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexGroups/HexEditorGroupFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexImageReferenceGlyphFactoryProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexIntraTextAdornmentService.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexKeyProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexMarginContextMenuServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexMarkerHelper.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexMarkerService.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexMouseLocation.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexMouseProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexPopupHelper.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexPopupSpaceReservationAgent.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexReferenceHandlerServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexScrollMapFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexScrollMapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSelectionExtensions.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSelectionImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSelectionLayer.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSpaceReservationManagerImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSpaceReservationStack.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSpaceReservationStackImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSpaceReservationStackProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexSpaceReservationStackProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexStructureInfoAggregatorFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexStructureInfoAggregatorImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexToolTipStructureSpanTagger.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexViewExtensions.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexViewLineExtensions.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexViewMouseProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HexViewScrollerImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HorizontalScrollBarContainerMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/HorizontalScrollBarMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/KeyboardWpfHexViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/LeftSelectionMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/MetadataAndOrder.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/MouseWpfHexViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/OffsetCursorProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/RightControlMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/CommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/CommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/DataParser.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/HexDataKind.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/HexMarkerTagger.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/HexSearchServiceFactory.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/HexViewSearchService.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/HexViewSearchServiceProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/SearchControl.xaml create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/SearchControl.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/Search/SearchSettings.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/SelectionUtilities.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/SpacerMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/TextLayer.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/VerticalScrollBarContainerMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/VerticalScrollBarMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewConstants.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewContainerMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewHostImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewImpl.LayoutHelper.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewImpl.MouseHoverHelper.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewLineCollectionImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewMarginProviderCollectionImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/WpfHexViewMarginProviderCollectionProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Editor/ZoomControlMargin.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DefaultHexStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/DefaultHexFileStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/DotNetHexFileImageReferenceProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/DotNetHexFileStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/HexReferenceConverterImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/ImageReferenceUtils.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/ToolTipCreatorImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DnSpy/ToolTipObjectFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/BlobHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetCor20DataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetEmbeddedResourceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetHeadersImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetHeapsReader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetHexFileStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMetadataHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMetadataHeaderReader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMetadataHeadersImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMethodProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMultiFileResourceHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetMultiFileResourcesImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetResourceProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetStorageStreamImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetStructureProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/DotNetTableSizes.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/ExceptionClause.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/ExceptionHandlerTable.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/FatMethodBodyImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/GUIDHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/HotHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/IDotNetHeap.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/InvalidMethodBodyImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/MethodBodyInfo.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/MethodBodyReader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/MethodSection.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/MultiResourceStructureProviderFactory.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/NameUtils.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/PdbHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/PdbStreamHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/StorageStreamHeader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/StringsHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/TableRecordDataFactory.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/TablesHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/TablesHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/TinyMethodBodyImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/USHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/DotNet/UnknownHeapImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexBufferFileImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexBufferFileServiceFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexBufferFileServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexFieldFormatterImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexFileStructureInfoServiceFactoryImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/HexFileStructureInfoServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/NumberFormatter.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/DataDirectoryDataUtils.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/ImageSectionHeader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeDosHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeFileHeaderDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeHeadersImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeHeadersReader.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeHexFileStructureInfoProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeOptionalHeader32DataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeOptionalHeader64DataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeSectionDataImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Files/PE/PeStructureProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Files/SpanDataCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Files/ToolTips/HexToolTipContentCreatorImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/FormattedHexSourceFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexAndAdornmentSequencerFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexAndAdornmentSequencerImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexFormattedLineImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexFormattedLineSourceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexHtmlBuilder.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexHtmlBuilderServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexLinePart.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexLinePartsCollection.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexLinePartsTextSource.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/HexLineTransformProviderService.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/PhysicalLine.cs create mode 100644 dnSpy/dnSpy/Hex/Formatting/PhysicalLineCache.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferLineFormatterFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferLineFormatterImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferLineImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexBufferStreamFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexCachedBufferStreamImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/AdvancedAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/AppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/AppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/HexEditorOptions.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/HexEditorOptionsDefinitions.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/HexEditorOptionsService.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/HexViewOptionsGroupNameProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/MainAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/ScrollBarsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Hex/HexEditor/TagOptionDefinitionProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexGroups/HexViewGroupOption.cs create mode 100644 dnSpy/dnSpy/Hex/HexGroups/HexViewGroupOptionCollection.cs create mode 100644 dnSpy/dnSpy/Hex/HexGroups/HexViewOptionsGroupImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexGroups/HexViewOptionsGroupServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/HexGroups/OptionsStorage.cs create mode 100644 dnSpy/dnSpy/Hex/HexOffsetFormatter.cs create mode 100644 dnSpy/dnSpy/Hex/HexProcessSimpleBufferStream.cs create mode 100644 dnSpy/dnSpy/Hex/HexValueFormatter.cs create mode 100644 dnSpy/dnSpy/Hex/HexVersionImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/DnSpy/QuickInfoCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexIntellisenseControllerService.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexIntellisensePresenterFactoryService.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexIntellisenseSessionStackImpl.CommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexIntellisenseSessionStackImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexIntellisenseSessionStackMapServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoBrokerImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoController.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoControllerProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoPresenter.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoPresenterBase.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoPresenterControl.xaml create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoPresenterControl.xaml.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoPresenterProvider.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexQuickInfoSessionImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexSpaceReservationQuickInfoPresenter.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/HexToolTipService.cs create mode 100644 dnSpy/dnSpy/Hex/Intellisense/SpaceReservationManagerDefinitions.cs create mode 100644 dnSpy/dnSpy/Hex/MEF/Metadata.cs create mode 100644 dnSpy/dnSpy/Hex/NativeMethods.cs create mode 100644 dnSpy/dnSpy/Hex/NormalizedHexBufferSpanCollectionExtensions.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/ByteHexSearchService.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/ClipboardUtils.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/HexEditorOperationsFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/HexEditorOperationsImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/HexSearchServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/HexSearchServiceProviderImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/MDUtils.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/StringHexSearchService.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/Utf16StringHexSearchService.cs create mode 100644 dnSpy/dnSpy/Hex/Operations/Utf8StringHexSearchService.cs create mode 100644 dnSpy/dnSpy/Hex/Settings/AdvancedAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Hex/Settings/CommonEditorOptions.cs create mode 100644 dnSpy/dnSpy/Hex/Settings/GeneralAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Hex/Settings/ScrollBarsAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/DefaultTagger.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/HexBufferTagAggregator.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/HexBufferTagAggregatorFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/HexTaggerFactory.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/HexViewTagAggregator.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/HexViewTagAggregatorFactoryServiceImpl.cs create mode 100644 dnSpy/dnSpy/Hex/Tagging/TagAggregator.cs create mode 100644 dnSpy/dnSpy/Images/DefaultImageSourceInfoProvider.cs create mode 100644 dnSpy/dnSpy/Images/DotNetImageService.cs create mode 100644 dnSpy/dnSpy/Images/DsImageBitmapScalingModeConverter.cs create mode 100644 dnSpy/dnSpy/Images/DsImageConverter.cs create mode 100644 dnSpy/dnSpy/Images/ImageReferenceHelper.cs create mode 100644 dnSpy/dnSpy/Images/ImageService.cs create mode 100644 dnSpy/dnSpy/Images/ThemedImageCreator.cs create mode 100644 dnSpy/dnSpy/Images/dnSpy-x86.ico create mode 100644 dnSpy/dnSpy/Images/dnSpy.ico create mode 100644 dnSpy/dnSpy/Language/Intellisense/CollectionBooleanToVisibilityConverter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionBroker.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionCollectionVM.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionIconVM.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionPresenter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionPresenterControl.xaml create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionPresenterControl.xaml.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionPresenterProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionSession.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionSessionCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionSuffixTextClassifier.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionTextConverter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionTextElementProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionTextElementProviderService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CompletionVM.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/CurrentLineSpaceReservationService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/FilterMatchCompletionClassifierProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/FilterToolTipConverter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/FilterVM.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/ICompletionTextElementProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/ICompletionTextElementProviderService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisenseControllerService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisensePresenterFactoryService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisenseSessionHelper.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisenseSessionStack.CommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisenseSessionStack.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/IntellisenseSessionStackMapService.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/PresenterMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoBroker.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoController.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoControllerProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoPresenter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoPresenterBase.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoPresenterControl.xaml create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoPresenterControl.xaml.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoPresenterProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/QuickInfoSession.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpBroker.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpCurrentParameterTagger.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpPresenter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpPresenterControl.xaml create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpPresenterControl.xaml.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpPresenterProvider.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SignatureHelpSession.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SpaceReservationManagerDefinitions.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/SpaceReservationQuickInfoPresenter.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/TrackingSpanHelpers.cs create mode 100644 dnSpy/dnSpy/Language/Intellisense/WpfUtils.cs create mode 100644 dnSpy/dnSpy/LicenseInfo/ApacheV2.txt create mode 100644 dnSpy/dnSpy/LicenseInfo/CREDITS.txt create mode 100644 dnSpy/dnSpy/LicenseInfo/GPLv3.txt create mode 100644 dnSpy/dnSpy/LicenseInfo/LICENSE.txt create mode 100644 dnSpy/dnSpy/LicenseInfo/OtherLicenses.txt create mode 100644 dnSpy/dnSpy/MVVM/InitializeDataTemplateContextMenu.cs create mode 100644 dnSpy/dnSpy/MainApp/AboutCommands.cs create mode 100644 dnSpy/dnSpy/MainApp/AboutScreen.cs create mode 100644 dnSpy/dnSpy/MainApp/App.xaml create mode 100644 dnSpy/dnSpy/MainApp/App.xaml.cs create mode 100644 dnSpy/dnSpy/MainApp/AppCommandLineArgs.cs create mode 100644 dnSpy/dnSpy/MainApp/AppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy/MainApp/AppSettings.cs create mode 100644 dnSpy/dnSpy/MainApp/AppStatusBar.cs create mode 100644 dnSpy/dnSpy/MainApp/AppToolBar.cs create mode 100644 dnSpy/dnSpy/MainApp/AppWindow.cs create mode 100644 dnSpy/dnSpy/MainApp/AskDlg.xaml create mode 100644 dnSpy/dnSpy/MainApp/AskDlg.xaml.cs create mode 100644 dnSpy/dnSpy/MainApp/AskVM.cs create mode 100644 dnSpy/dnSpy/MainApp/BGJitUtils.cs create mode 100644 dnSpy/dnSpy/MainApp/CachedMefInfo.cs create mode 100644 dnSpy/dnSpy/MainApp/Constants.cs create mode 100644 dnSpy/dnSpy/MainApp/DevBuildWarning.cs create mode 100644 dnSpy/dnSpy/MainApp/DocumentTreeViewWindowContent.cs create mode 100644 dnSpy/dnSpy/MainApp/DotNetAssemblyLoader.cs create mode 100644 dnSpy/dnSpy/MainApp/DsLoaderControl.xaml create mode 100644 dnSpy/dnSpy/MainApp/DsLoaderControl.xaml.cs create mode 100644 dnSpy/dnSpy/MainApp/DsLoaderService.cs create mode 100644 dnSpy/dnSpy/MainApp/DsToolWindowServiceCommands.cs create mode 100644 dnSpy/dnSpy/MainApp/MainWindow.xaml create mode 100644 dnSpy/dnSpy/MainApp/MainWindow.xaml.cs create mode 100644 dnSpy/dnSpy/MainApp/MainWindowControl.cs create mode 100644 dnSpy/dnSpy/MainApp/MessageBoxService.cs create mode 100644 dnSpy/dnSpy/MainApp/MsgBoxDlg.xaml create mode 100644 dnSpy/dnSpy/MainApp/MsgBoxDlg.xaml.cs create mode 100644 dnSpy/dnSpy/MainApp/MsgBoxVM.cs create mode 100644 dnSpy/dnSpy/MainApp/ResourceManagerTokenCacheImpl.cs create mode 100644 dnSpy/dnSpy/MainApp/SavedWindowState.cs create mode 100644 dnSpy/dnSpy/MainApp/Settings/EnvironmentAppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/MainApp/Settings/FontAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/MainApp/Settings/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/MainApp/Settings/WindowsExplorerIntegration.cs create mode 100644 dnSpy/dnSpy/MainApp/StartUpClass.cs create mode 100644 dnSpy/dnSpy/MainApp/ToolBarCommands.cs create mode 100644 dnSpy/dnSpy/MainApp/ViewCommands.cs create mode 100644 dnSpy/dnSpy/Menus/AppMenus.cs create mode 100644 dnSpy/dnSpy/Menus/ContextMenuProvider.cs create mode 100644 dnSpy/dnSpy/Menus/MenuItemContext.cs create mode 100644 dnSpy/dnSpy/Menus/MenuService.cs create mode 100644 dnSpy/dnSpy/Metadata/ModuleIdProvider.cs create mode 100644 dnSpy/dnSpy/Output/CachedWriter.cs create mode 100644 dnSpy/dnSpy/Output/Commands.cs create mode 100644 dnSpy/dnSpy/Output/DefaultOutputOptions.cs create mode 100644 dnSpy/dnSpy/Output/EditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/Output/NotPresentOutputWriter.cs create mode 100644 dnSpy/dnSpy/Output/NullOutputTextPane.cs create mode 100644 dnSpy/dnSpy/Output/OutputBufferVM.cs create mode 100644 dnSpy/dnSpy/Output/OutputCommands.cs create mode 100644 dnSpy/dnSpy/Output/OutputContent.cs create mode 100644 dnSpy/dnSpy/Output/OutputControl.xaml create mode 100644 dnSpy/dnSpy/Output/OutputControl.xaml.cs create mode 100644 dnSpy/dnSpy/Output/OutputService.cs create mode 100644 dnSpy/dnSpy/Output/OutputServiceSettings.cs create mode 100644 dnSpy/dnSpy/Output/OutputToolWindowContent.cs create mode 100644 dnSpy/dnSpy/Output/Settings/AdvancedAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Output/Settings/AppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Output/Settings/AppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Output/Settings/ContentTypeOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy/Output/Settings/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Output/Settings/IOutputWindowOptions.cs create mode 100644 dnSpy/dnSpy/Output/Settings/OptionChangedEventArgs.cs create mode 100644 dnSpy/dnSpy/Output/Settings/OutputWindowOptions.cs create mode 100644 dnSpy/dnSpy/Output/Settings/OutputWindowOptionsService.cs create mode 100644 dnSpy/dnSpy/Output/Settings/ScrollBarsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Output/Settings/TabsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Output/Settings/TextViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy/Output/TextAppearanceCategoryDefinitions.cs create mode 100644 dnSpy/dnSpy/Output/ThemeFontSettingsDefinitions.cs create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.Designer.cs create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.cs.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.de.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.es-ES.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.fa.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.fr.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.hu.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.it.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.pt-BR.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.pt-PT.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.ru.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.tr.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.uk.resx create mode 100644 dnSpy/dnSpy/Properties/dnSpy.Resources.zh-CN.resx create mode 100644 dnSpy/dnSpy/Scripting/ServiceLocator.cs create mode 100644 dnSpy/dnSpy/Search/AppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy/Search/BooleanToThicknessConverter.cs create mode 100644 dnSpy/dnSpy/Search/Commands.cs create mode 100644 dnSpy/dnSpy/Search/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Search/DocumentSearcher.cs create mode 100644 dnSpy/dnSpy/Search/DocumentSearcherProvider.cs create mode 100644 dnSpy/dnSpy/Search/FilterSearcher.cs create mode 100644 dnSpy/dnSpy/Search/FilterSearcherOptions.cs create mode 100644 dnSpy/dnSpy/Search/FrameworkFileUtils.cs create mode 100644 dnSpy/dnSpy/Search/SearchControl.xaml create mode 100644 dnSpy/dnSpy/Search/SearchControl.xaml.cs create mode 100644 dnSpy/dnSpy/Search/SearchControlVM.cs create mode 100644 dnSpy/dnSpy/Search/SearchResult.cs create mode 100644 dnSpy/dnSpy/Search/SearchResultContext.cs create mode 100644 dnSpy/dnSpy/Search/SearchService.cs create mode 100644 dnSpy/dnSpy/Search/SearchSettings.cs create mode 100644 dnSpy/dnSpy/Search/SearchToolWindowContent.cs create mode 100644 dnSpy/dnSpy/Search/SearchType.cs create mode 100644 dnSpy/dnSpy/Search/SearchTypeVM.cs create mode 100644 dnSpy/dnSpy/Settings/AppearanceCategory/FontAndColorOptionsProviderImpl.cs create mode 100644 dnSpy/dnSpy/Settings/AppearanceCategory/ITextAppearanceCategoryService.cs create mode 100644 dnSpy/dnSpy/Settings/AppearanceCategory/TextAppearanceCategory.cs create mode 100644 dnSpy/dnSpy/Settings/AppearanceCategory/TextAppearanceCategoryDefinitions.cs create mode 100644 dnSpy/dnSpy/Settings/AppearanceCategory/TextAppearanceCategoryService.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppRefreshSettings.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsDlg.xaml create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsDlg.xaml.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsPageVM.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsSearchTextClassifier.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsService.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsTextClassifierContext.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsTreeViewNodeClassifierContext.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/AppSettingsTreeViewNodeSearchTextClassifier.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/ContentConverterPresenter.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/ContentConverterProperties.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/IContentConverter.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/PageContext.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/SearchMatcher.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/SettingsAppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/ShowAppSettingsDialog.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/ShowOptionsCommand.cs create mode 100644 dnSpy/dnSpy/Settings/Dialog/UIHelpers.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/DefaultFontInfo.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/FontSettingsImpl.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/ThemeFontSettingsDefinitions.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/ThemeFontSettingsImpl.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/ThemeFontSettingsSerializer.cs create mode 100644 dnSpy/dnSpy/Settings/Fonts/ThemeFontSettingsServiceImpl.cs create mode 100644 dnSpy/dnSpy/Settings/SectionAttributes.cs create mode 100644 dnSpy/dnSpy/Settings/SettingsSection.cs create mode 100644 dnSpy/dnSpy/Settings/SettingsSectionProvider.cs create mode 100644 dnSpy/dnSpy/Settings/SettingsService.cs create mode 100644 dnSpy/dnSpy/Settings/SettingsService2.cs create mode 100644 dnSpy/dnSpy/Settings/SettingsServiceFactory.cs create mode 100644 dnSpy/dnSpy/Settings/XmlSettingsConstants.cs create mode 100644 dnSpy/dnSpy/Settings/XmlSettingsReader.cs create mode 100644 dnSpy/dnSpy/Settings/XmlSettingsWriter.cs create mode 100644 dnSpy/dnSpy/Settings/XmlUtils.cs create mode 100644 dnSpy/dnSpy/Tabs/TabElementZoomer.cs create mode 100644 dnSpy/dnSpy/Tabs/TabGroup.cs create mode 100644 dnSpy/dnSpy/Tabs/TabGroupService.cs create mode 100644 dnSpy/dnSpy/Tabs/TabItemImpl.cs create mode 100644 dnSpy/dnSpy/Tabs/TabService.cs create mode 100644 dnSpy/dnSpy/Tabs/TabServiceProvider.cs create mode 100644 dnSpy/dnSpy/Tabs/TabUtils.cs create mode 100644 dnSpy/dnSpy/Text/Adornments/ToolTipProvider.cs create mode 100644 dnSpy/dnSpy/Text/Adornments/ToolTipProviderFactory.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/CharRope.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/DocumentLine.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/DocumentLineTree.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/ITextSource.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/ImmutableStack.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/LineManager.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/LineNode.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/NewLineFinder.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/Rope.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/RopeNode.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/RopeTextSource.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/SimpleSegment.cs create mode 100644 dnSpy/dnSpy/Text/AvalonEdit/TextDocument.cs create mode 100644 dnSpy/dnSpy/Text/CachedColorsList.cs create mode 100644 dnSpy/dnSpy/Text/CachedColorsListTagger.cs create mode 100644 dnSpy/dnSpy/Text/Classification/CategoryClassificationFormatMap.cs create mode 100644 dnSpy/dnSpy/Text/Classification/CategoryEditorFormatMap.cs create mode 100644 dnSpy/dnSpy/Text/Classification/CategoryEditorFormatMapUpdater.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassificationFontUtils.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassificationFormatMapService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassificationType.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassificationTypeRegistryService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassifierAggregatorBase.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassifierTagger.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ClassifierTaggerProvider.cs create mode 100644 dnSpy/dnSpy/Text/Classification/DefaultTextClassifierProvider.cs create mode 100644 dnSpy/dnSpy/Text/Classification/EditorFormatDefinitionExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Classification/EditorFormatDefinitionService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/EditorFormatMapService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/NullClassifier.cs create mode 100644 dnSpy/dnSpy/Text/Classification/TextClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Text/Classification/TextClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/TextElementProvider.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ThemeClassificationFormatDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ThemeClassificationTypeService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ViewClassificationFormatMap.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ViewClassifierAggregator.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ViewClassifierAggregatorService.cs create mode 100644 dnSpy/dnSpy/Text/Classification/ViewEditorFormatMap.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/AdvancedAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/AppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/AppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/CodeEditorOptions.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/CodeEditorOptionsService.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/ContentTypeOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/ICodeEditorOptions.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/LanguageAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/ScrollBarsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/TabsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/CodeEditor/TextViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy/Text/ColorUtils.cs create mode 100644 dnSpy/dnSpy/Text/ContentType.cs create mode 100644 dnSpy/dnSpy/Text/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/ContentTypeExtensions.cs create mode 100644 dnSpy/dnSpy/Text/ContentTypeRegistryService.cs create mode 100644 dnSpy/dnSpy/Text/ContentTypeRegistryServiceExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/AdornmentLayer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/AdornmentLayerCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/AdornmentLayerDefinitionService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/AdornmentLayerElement.cs create mode 100644 dnSpy/dnSpy/Text/Editor/BlockStructureService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/BottomControlMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/BottomRightCornerMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/BoxSelectionHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CodeEditor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CodeEditorProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CommonGuidObjectsProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ContextMenuInitializer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CopyWpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CurrentLineHighlighter.cs create mode 100644 dnSpy/dnSpy/Text/Editor/CustomLineNumberMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultReplEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultSmartIndent.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultTextEditorCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultTextViewCommandTarget.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultTextViewEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultTextViewMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DefaultWpfViewEditorOptionDefinitions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/DsScrollBar.cs create mode 100644 dnSpy/dnSpy/Text/Editor/EditorOptions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/EditorOptionsFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/EditorPositionState.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextMarkerService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextMarkerServiceMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextViewMarkerClassificationTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextViewMarkerGlyphTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextViewMarkerGlyphTextMarkerTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GlyphTextViewMarkerService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/GoToCommand.cs create mode 100644 dnSpy/dnSpy/Text/Editor/HorizontalScrollBarContainerMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/HorizontalScrollBarMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IAdornmentLayerDefinitionService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IGlyphTextMarkerServiceImpl.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IReplEditor2.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ISpaceReservationStack.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ISpaceReservationStackProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IWpfTextViewConnectionListenerServiceProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IncrementalSearch/IncrementalSearch.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IncrementalSearch/IncrementalSearchFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IndentHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/IntraTextAdornmentService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/KeyProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/KeyboardWpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LeftSelectionMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LineCompressor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LineNumberMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LineNumberMarginBase.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LineSeparatorService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LogEditor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/LogEditorProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MarginContextMenuService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MarkerHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MetadataAndOrder.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MouseLocation.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MouseProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/MouseWpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/NullRegisteredCommandElement.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Operations/TextViewUndoManager.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Operations/TextViewUndoManagerProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Operations/UndoRedoCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Text/Editor/OptionsHelpers.cs create mode 100644 dnSpy/dnSpy/Text/Editor/OutputTextPaneCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/OutputTextPaneCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Text/Editor/OutputTextPaneCommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/OutputTextPaneUtils.cs create mode 100644 dnSpy/dnSpy/Text/Editor/PopupHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/PopupSpaceReservationAgent.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplBufferKind.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplCommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplCommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplCommands.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplEditor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplEditorProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplEditorReplaceListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ReplSubBuffer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ResourceDictionaryUtilities.cs create mode 100644 dnSpy/dnSpy/Text/Editor/RightControlMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ScrollMap.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ScrollMapFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/CommandTargetFilter.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/CommandTargetFilterProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/SearchControl.xaml create mode 100644 dnSpy/dnSpy/Text/Editor/Search/SearchControl.xaml.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/SearchService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/SearchServiceProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/SearchSettings.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/TextMarkerTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/Search/WpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SelectionUtilities.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SmartIndentationService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SpaceReservationManager.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SpaceReservationStack.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SpaceReservationStackProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SpacerMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/SystemTextCaret.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextCaret.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextCaretLayer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextEditorFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextFormattingUtilities.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextLayer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextMarkerService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextReferenceCommandInfoProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextSelection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextSelectionExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextSelectionLayer.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextSnapshotLineExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextViewExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextViewLineExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextViewModel.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextViewMouseProcessorCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/TextViewRoleSet.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriClassificationTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriFinder.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriMouseProcessor.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriQuickInfoSourceProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriTagger.cs create mode 100644 dnSpy/dnSpy/Text/Editor/UriWpfTextViewCreationListener.cs create mode 100644 dnSpy/dnSpy/Text/Editor/VerticalScrollBarContainerMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/VerticalScrollBarMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ViewScroller.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextView.LayoutHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextView.MouseHoverHelper.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextView.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewConnectionListenerService.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewConnectionListenerServiceProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewConstants.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewContainerMargin.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewHost.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewLineCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewMarginProviderCollection.cs create mode 100644 dnSpy/dnSpy/Text/Editor/WpfTextViewMarginProviderCollectionProvider.cs create mode 100644 dnSpy/dnSpy/Text/Editor/ZoomControlMargin.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/FormattedLineSource.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/FormattedTextCache.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/FormattedTextSourceFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/HtmlBuilder.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/HtmlBuilderService.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/ITextFormatterProvider.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/ITextParagraphPropertiesFactoryServiceSelector.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/LinePart.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/LinePartsCollection.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/LinePartsTextSource.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/LineTransformProviderService.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/PhysicalLine.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/PhysicalLineCache.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextAndAdornmentCollection.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextAndAdornmentSequencer.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextAndAdornmentSequencerFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextFormatterProvider.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextFormattingRunPropertiesExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextLineExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextParagraphPropertiesFactoryServiceSelector.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/TextSequenceElement.cs create mode 100644 dnSpy/dnSpy/Text/Formatting/WpfTextViewLine.cs create mode 100644 dnSpy/dnSpy/Text/Groups/OptionsStorage.cs create mode 100644 dnSpy/dnSpy/Text/Groups/TextViewGroupOption.cs create mode 100644 dnSpy/dnSpy/Text/Groups/TextViewGroupOptionCollection.cs create mode 100644 dnSpy/dnSpy/Text/Groups/TextViewOptionsGroup.cs create mode 100644 dnSpy/dnSpy/Text/Groups/TextViewOptionsGroupService.cs create mode 100644 dnSpy/dnSpy/Text/MEF/Metadata.cs create mode 100644 dnSpy/dnSpy/Text/MappingPoint.cs create mode 100644 dnSpy/dnSpy/Text/MappingSpan.cs create mode 100644 dnSpy/dnSpy/Text/NormalizedTextChangeCollection.cs create mode 100644 dnSpy/dnSpy/Text/OffsetAndCachedColors.cs create mode 100644 dnSpy/dnSpy/Text/Operations/AnyTextStructureNavigator.cs create mode 100644 dnSpy/dnSpy/Text/Operations/AnyTextStructureNavigatorProvider.cs create mode 100644 dnSpy/dnSpy/Text/Operations/ChangeInfo.cs create mode 100644 dnSpy/dnSpy/Text/Operations/EditorOperations.cs create mode 100644 dnSpy/dnSpy/Text/Operations/EditorOperationsFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Operations/EditorOptionsExtensions.cs create mode 100644 dnSpy/dnSpy/Text/Operations/ReplEditorOperations.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextBufferUndoManager.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextBufferUndoManagerProvider.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextSearchNavigator.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextSearchNavigatorFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextSearchService.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextStructureNavigator.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextStructureNavigatorSelectorService.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextUndoHistory.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextUndoHistoryRegistry.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextUndoPrimitive.cs create mode 100644 dnSpy/dnSpy/Text/Operations/TextUndoTransaction.cs create mode 100644 dnSpy/dnSpy/Text/Operations/WordParser.cs create mode 100644 dnSpy/dnSpy/Text/Projection/BufferGraph.cs create mode 100644 dnSpy/dnSpy/Text/Projection/BufferGraphFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/ProviderSelector.cs create mode 100644 dnSpy/dnSpy/Text/Repl/AdvancedAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/Repl/AppSettingsPageContainer.cs create mode 100644 dnSpy/dnSpy/Text/Repl/AppSettingsPageProvider.cs create mode 100644 dnSpy/dnSpy/Text/Repl/ContentTypeOptionDefinitionProvider.cs create mode 100644 dnSpy/dnSpy/Text/Repl/GeneralAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/Repl/IReplOptions.cs create mode 100644 dnSpy/dnSpy/Text/Repl/LanguageAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/Repl/ReplOptions.cs create mode 100644 dnSpy/dnSpy/Text/Repl/ReplOptionsService.cs create mode 100644 dnSpy/dnSpy/Text/Repl/ScrollBarsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/Repl/TabsAppSettingsPage.cs create mode 100644 dnSpy/dnSpy/Text/Repl/TextViewOptionsGroupNameProvider.cs create mode 100644 dnSpy/dnSpy/Text/Settings/AdvancedAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Text/Settings/CommonEditorOptions.cs create mode 100644 dnSpy/dnSpy/Text/Settings/GeneralAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Text/Settings/ICommonEditorOptions.cs create mode 100644 dnSpy/dnSpy/Text/Settings/ScrollBarsAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Text/Settings/TabsAppSettingsPageBase.cs create mode 100644 dnSpy/dnSpy/Text/SimpleTextImage.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/BufferTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/ITaggerFactory.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/TagAggregatorBase.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/TaggerFactory.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/TextBufferTagAggregator.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/TextViewTagAggregator.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/ViewTagAggregatorFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/TaggerClassificationTypes.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XamlAttributeValueClassifier.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XamlTagger.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XamlTaggerClassificationTypes.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XmlClassifier.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XmlTagger.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XmlTaggerBase.cs create mode 100644 dnSpy/dnSpy/Text/Tagging/Xml/XmlTaggerClassificationTypes.cs create mode 100644 dnSpy/dnSpy/Text/TextBuffer.cs create mode 100644 dnSpy/dnSpy/Text/TextBufferFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/TextChange.cs create mode 100644 dnSpy/dnSpy/Text/TextDataModel.cs create mode 100644 dnSpy/dnSpy/Text/TextEdit.cs create mode 100644 dnSpy/dnSpy/Text/TextImage.cs create mode 100644 dnSpy/dnSpy/Text/TextImageFactoryService.cs create mode 100644 dnSpy/dnSpy/Text/TextImageUtils.cs create mode 100644 dnSpy/dnSpy/Text/TextImageVersion.cs create mode 100644 dnSpy/dnSpy/Text/TextSnapshot.cs create mode 100644 dnSpy/dnSpy/Text/TextSnapshotLine.cs create mode 100644 dnSpy/dnSpy/Text/TextVersion.cs create mode 100644 dnSpy/dnSpy/Text/TrackingPoint.cs create mode 100644 dnSpy/dnSpy/Text/TrackingSpan.cs create mode 100644 dnSpy/dnSpy/Text/UnicodeUtilities.cs create mode 100644 dnSpy/dnSpy/Text/WPF/BrushComparer.cs create mode 100644 dnSpy/dnSpy/Themes/AppCommandLineArgsHandler.cs create mode 100644 dnSpy/dnSpy/Themes/Color.cs create mode 100644 dnSpy/dnSpy/Themes/ColorInfo.cs create mode 100644 dnSpy/dnSpy/Themes/ColorInfos.cs create mode 100644 dnSpy/dnSpy/Themes/Theme.cs create mode 100644 dnSpy/dnSpy/Themes/ThemeColor.cs create mode 100644 dnSpy/dnSpy/Themes/ThemeHelpers.cs create mode 100644 dnSpy/dnSpy/Themes/ThemeService.cs create mode 100644 dnSpy/dnSpy/Themes/ThemeSettings.cs create mode 100644 dnSpy/dnSpy/Themes/ThemesMenu.cs create mode 100644 dnSpy/dnSpy/Themes/blue.dntheme create mode 100644 dnSpy/dnSpy/Themes/dark.dntheme create mode 100644 dnSpy/dnSpy/Themes/hc.dntheme create mode 100644 dnSpy/dnSpy/Themes/light.dntheme create mode 100644 dnSpy/dnSpy/Themes/wpf.styles.templates.xaml create mode 100644 dnSpy/dnSpy/ToolBars/ToolBarButtonVM.cs create mode 100644 dnSpy/dnSpy/ToolBars/ToolBarItemContext.cs create mode 100644 dnSpy/dnSpy/ToolBars/ToolBarService.cs create mode 100644 dnSpy/dnSpy/ToolWindows/TabContentImpl.cs create mode 100644 dnSpy/dnSpy/ToolWindows/ToolWindowGroup.cs create mode 100644 dnSpy/dnSpy/ToolWindows/ToolWindowGroupService.cs create mode 100644 dnSpy/dnSpy/ToolWindows/ToolWindowService.cs create mode 100644 dnSpy/dnSpy/ToolWindows/ToolWindowServiceProvider.cs create mode 100644 dnSpy/dnSpy/TreeView/DsSharpTreeNode.cs create mode 100644 dnSpy/dnSpy/TreeView/SharpTreeNodeChildrenList.cs create mode 100644 dnSpy/dnSpy/TreeView/Text/ContentTypeDefinitions.cs create mode 100644 dnSpy/dnSpy/TreeView/Text/TreeViewNodeTextElementProvider.cs create mode 100644 dnSpy/dnSpy/TreeView/TreeNodeDataImpl.cs create mode 100644 dnSpy/dnSpy/TreeView/TreeNodeImpl.cs create mode 100644 dnSpy/dnSpy/TreeView/TreeViewImpl.cs create mode 100644 dnSpy/dnSpy/TreeView/TreeViewService.cs create mode 100644 dnSpy/dnSpy/UI/UIDispatcher.cs create mode 100644 dnSpy/dnSpy/app.config create mode 100644 dnSpy/dnSpy/app.manifest create mode 100644 dnSpy/dnSpy/dnSpy.csproj create mode 100644 dnSpy/dnSpy/packages.config create mode 100644 images/debug-animated.gif create mode 100644 images/edit-code-animated.gif diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..63fd71d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,112 @@ +root = true + +[*] +charset = utf-8 +#end_of_line = +indent_size = 4 +indent_style = tab +tab_width = 4 + +[*.json] + +[app.config] + +[*.yml] +indent_size = 2 +indent_style = space + +[*.{proj,csproj,vbproj,props,targets,resx,vsixmanifest}] +indent_size = 2 +indent_style = space + +[app.manifest] +indent_size = 2 +indent_style = space + +[*.xml] + +[*.xaml] +indent_style = space + +[*.{cs,vb}] +insert_final_newline = true + +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:none +dotnet_style_predefined_type_for_member_access = true:none +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_require_accessibility_modifiers = never:info + +[*.cs] +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = flush_left +csharp_indent_switch_labels = false +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = true +csharp_prefer_braces = false +csharp_prefer_simple_default_expression = true:suggestion +#csharp_preferred_modifier_order = +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = +csharp_space_between_square_brackets = false +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_deconstructed_variable_declaration = false:none +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_constructors = true:suggestion +csharp_style_expression_bodied_indexers = true:suggestion +csharp_style_expression_bodied_methods = true:suggestion +csharp_style_expression_bodied_operators = true:suggestion +csharp_style_expression_bodied_properties = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_var_elsewhere = true:suggestion +csharp_style_var_for_built_in_types = false:none +csharp_style_var_when_type_is_apparent = true:suggestion + +[*.vb] +#visual_basic_preferred_modifier_order = diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..46c1a10 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.vs/ +bin/ +obj/ +*.user +_ReSharper*/ +*.ReSharper +*_wpftmp.csproj +launchSettings.json +.idea/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..8f6129e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,21 @@ +[submodule "Plugins/ILSpy.Decompiler/NRefactory"] + path = Extensions/ILSpy.Decompiler/NRefactory + url = https://github.com/dnSpy/nrefactory.git +[submodule "Libraries/ICSharpCode.TreeView"] + path = Libraries/ICSharpCode.TreeView + url = https://github.com/dnSpy/ICSharpCode.TreeView.git +[submodule "Plugins/ILSpy.Decompiler/ICSharpCode.Decompiler"] + path = Extensions/ILSpy.Decompiler/ICSharpCode.Decompiler + url = https://github.com/dnSpy/ILSpy.git +[submodule "dnSpy/dnSpy.Images"] + path = dnSpy/dnSpy.Images + url = https://github.com/dnSpy/dnSpy.Images.git +[submodule "Extensions/dnSpy.Debugger/netcorefiles"] + path = Extensions/dnSpy.Debugger/netcorefiles + url = https://github.com/dnSpy/netcorefiles.git +[submodule "dnSpy/Roslyn/Roslyn.ExpressionCompiler"] + path = dnSpy/Roslyn/Roslyn.ExpressionCompiler + url = https://github.com/dnSpy/Roslyn.ExpressionCompiler.git +[submodule "Extensions/dnSpy.Debugger/Mono.Debugger.Soft"] + path = Extensions/dnSpy.Debugger/Mono.Debugger.Soft + url = https://github.com/dnSpy/Mono.Debugger.Soft.git diff --git a/Build/AppHostPatcher/AppHostPatcher.csproj b/Build/AppHostPatcher/AppHostPatcher.csproj new file mode 100644 index 0000000..95a4764 --- /dev/null +++ b/Build/AppHostPatcher/AppHostPatcher.csproj @@ -0,0 +1,18 @@ + + + + + + $(DnSpyAssemblyCopyright) + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + True + ..\..\dnSpy.snk + enable + + $(DnSpyRuntimeIdentifiers) + Exe + + + diff --git a/Build/AppHostPatcher/Program.cs b/Build/AppHostPatcher/Program.cs new file mode 100644 index 0000000..de4572a --- /dev/null +++ b/Build/AppHostPatcher/Program.cs @@ -0,0 +1,133 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace AppHostPatcher { + class Program { + static void Usage() { + Console.WriteLine("apphostpatcher "); + Console.WriteLine("apphostpatcher "); + Console.WriteLine("apphostpatcher -d "); + Console.WriteLine("example: apphostpatcher my.exe -d bin"); + } + + const int maxPathBytes = 1024; + + static string ChangeExecutableExtension(string apphostExe) => + // Windows apphosts have an .exe extension. Don't call Path.ChangeExtension() unless it's guaranteed + // to have an .exe extension, eg. 'some.file' => 'some.file.dll', not 'some.dll' + apphostExe.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) ? Path.ChangeExtension(apphostExe, ".dll") : apphostExe + ".dll"; + + static string GetPathSeparator(string apphostExe) => + apphostExe.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) ? @"\" : "/"; + + static int Main(string[] args) { + try { + string apphostExe, origPath, newPath; + if (args.Length == 3) { + if (args[1] == "-d") { + apphostExe = args[0]; + origPath = Path.GetFileName(ChangeExecutableExtension(apphostExe)); + newPath = args[2] + GetPathSeparator(apphostExe) + origPath; + } + else { + apphostExe = args[0]; + origPath = args[1]; + newPath = args[2]; + } + } + else if (args.Length == 2) { + apphostExe = args[0]; + origPath = Path.GetFileName(ChangeExecutableExtension(apphostExe)); + newPath = args[1]; + } + else { + Usage(); + return 1; + } + if (!File.Exists(apphostExe)) { + Console.WriteLine($"Apphost '{apphostExe}' does not exist"); + return 1; + } + if (origPath == string.Empty) { + Console.WriteLine("Original path is empty"); + return 1; + } + var origPathBytes = Encoding.UTF8.GetBytes(origPath + "\0"); + Debug.Assert(origPathBytes.Length > 0); + var newPathBytes = Encoding.UTF8.GetBytes(newPath + "\0"); + if (origPathBytes.Length > maxPathBytes) { + Console.WriteLine($"Original path is too long"); + return 1; + } + if (newPathBytes.Length > maxPathBytes) { + Console.WriteLine($"New path is too long"); + return 1; + } + + var apphostExeBytes = File.ReadAllBytes(apphostExe); + int offset = GetOffset(apphostExeBytes, origPathBytes); + if (offset < 0) { + Console.WriteLine($"Could not find original path '{origPath}'"); + return 1; + } + if (offset + newPathBytes.Length > apphostExeBytes.Length) { + Console.WriteLine($"New path is too long: {newPath}"); + return 1; + } + for (int i = 0; i < newPathBytes.Length; i++) + apphostExeBytes[offset + i] = newPathBytes[i]; + File.WriteAllBytes(apphostExe, apphostExeBytes); + return 0; + } + catch (Exception ex) { + Console.WriteLine(ex.ToString()); + return 1; + } + } + + static int GetOffset(byte[] bytes, byte[] pattern) { + int si = 0; + var b = pattern[0]; + while (si < bytes.Length) { + si = Array.IndexOf(bytes, b, si); + if (si < 0) + break; + if (Match(bytes, si, pattern)) + return si; + si++; + } + return -1; + } + + static bool Match(byte[] bytes, int index, byte[] pattern) { + if (index + pattern.Length > bytes.Length) + return false; + for (int i = 0; i < pattern.Length; i++) { + if (bytes[index + i] != pattern[i]) + return false; + } + return true; + } + } +} diff --git a/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.cs b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.cs new file mode 100644 index 0000000..f2bdcf0 --- /dev/null +++ b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.cs @@ -0,0 +1,202 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using dnlib.DotNet; +using dnlib.DotNet.Writer; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace ConvertToNetstandardReferences { + public sealed class ConvertToNetstandardReferences : Task { + // Increment it if something changes so the files are re-created + const string VERSION = "cnsrefs_v1"; + +#pragma warning disable CS8618 // Non-nullable field is uninitialized. + [Required] + public string DestinationDirectory { get; set; } + + [Required] + public ITaskItem[] ReferencePath { get; set; } + + [Output] + public ITaskItem[] OutputReferencePath { get; private set; } +#pragma warning restore CS8618 // Non-nullable field is uninitialized. + + bool ShouldPatchAssembly(string simpleName) { + if (simpleName.StartsWith("Microsoft.VisualStudio.")) + return true; + + return false; + } + + static bool IsPublic(TypeDef type) { + while (type is not null) { + if (!type.IsPublic && !type.IsNestedPublic) + return false; + type = type.DeclaringType; + } + return true; + } + + static bool IsPublic(ExportedType type) { + while (type is not null) { + if (!type.IsPublic && !type.IsNestedPublic) + return false; + type = type.DeclaringType; + } + return true; + } + + public override bool Execute() { + if (string.IsNullOrWhiteSpace(DestinationDirectory)) { + Log.LogMessageFromText(nameof(DestinationDirectory) + " is an empty string", MessageImportance.High); + return false; + } + + using (var assemblyFactory = new AssemblyFactory(ReferencePath.Select(a => a.ItemSpec))) { + AssemblyRef? netstandardAsmRef = null; + AssemblyDef? netstandardAsm = null; + var typeComparer = new TypeEqualityComparer(SigComparerOptions.DontCompareTypeScope); + var netstandardTypes = new HashSet(typeComparer); + OutputReferencePath = new ITaskItem[ReferencePath.Length]; + for (int i = 0; i < ReferencePath.Length; i++) { + var file = ReferencePath[i]; + OutputReferencePath[i] = file; + var filename = file.ItemSpec; + var fileExt = Path.GetExtension(filename); + var asmSimpleName = Path.GetFileNameWithoutExtension(filename); + if (!ShouldPatchAssembly(asmSimpleName)) + continue; + if (!File.Exists(filename)) { + Log.LogMessageFromText($"File does not exist: {filename}", MessageImportance.High); + return false; + } + + var patchDir = DestinationDirectory; + Directory.CreateDirectory(patchDir); + + var fileInfo = new FileInfo(filename); + long filesize = fileInfo.Length; + long writeTime = fileInfo.LastWriteTimeUtc.ToBinary(); + + var extraInfo = $"_{VERSION} {filesize} {writeTime}_"; + var patchedFilename = Path.Combine(patchDir, asmSimpleName + extraInfo + fileExt); + if (StringComparer.OrdinalIgnoreCase.Equals(patchedFilename, filename)) + continue; + + if (!File.Exists(patchedFilename)) { + var asm = assemblyFactory.Resolve(asmSimpleName); + if (asm is null) + throw new Exception($"Couldn't resolve assembly {filename}"); + var mod = (ModuleDefMD)asm.ManifestModule; + if (!ShouldPatchAssembly(mod)) + continue; + + if (netstandardAsm is null) { + netstandardAsm = assemblyFactory.Resolve("netstandard"); + if (netstandardAsm is null) + throw new Exception("Couldn't find a netstandard file"); + netstandardAsmRef = netstandardAsm.ToAssemblyRef(); + foreach (var type in netstandardAsm.ManifestModule.GetTypes()) { + if (type.IsGlobalModuleType) + continue; + if (IsPublic(type)) + netstandardTypes.Add(type); + } + foreach (var type in netstandardAsm.ManifestModule.ExportedTypes) + netstandardTypes.Add(type); + } + + for (uint rid = 1; ; rid++) { + var tr = mod.ResolveTypeRef(rid); + if (tr is null) + break; + if (!netstandardTypes.Contains(tr)) + continue; + if (tr.ResolutionScope is AssemblyRef asmRef && CanReplaceAssemblyRef(asmRef)) + tr.ResolutionScope = netstandardAsmRef; + } + + var options = new ModuleWriterOptions(mod); + mod.Write(patchedFilename, options); + + var xmlDocFile = Path.ChangeExtension(filename, "xml"); + if (File.Exists(xmlDocFile)) { + var newXmlDocFile = Path.ChangeExtension(patchedFilename, "xml"); + if (File.Exists(newXmlDocFile)) + File.Delete(newXmlDocFile); + File.Copy(xmlDocFile, newXmlDocFile); + } + } + + OutputReferencePath[i] = new TaskItem(patchedFilename); + } + + return true; + } + } + + static bool CanReplaceAssemblyRef(AssemblyRef asmRef) => true; + + static bool ShouldPatchAssembly(ModuleDefMD mod) { + foreach (var asmRef in mod.GetAssemblyRefs()) { + string name = asmRef.Name; + if (name == "netstandard") + return false; + } + return true; + } + } + + sealed class AssemblyFactory : IAssemblyResolver, IDisposable { + readonly Dictionary modules; + readonly Dictionary nameToPath; + readonly ModuleContext context; + + public AssemblyFactory(IEnumerable filenames) { + modules = new Dictionary(StringComparer.Ordinal); + nameToPath = filenames.ToDictionary(key => Path.GetFileNameWithoutExtension(key), value => value, StringComparer.Ordinal); + context = new ModuleContext(this, new Resolver(this)); + } + + AssemblyDef? IAssemblyResolver.Resolve(IAssembly assembly, ModuleDef sourceModule) => + Resolve(assembly.Name); + + public AssemblyDef? Resolve(string name) { + if (modules.TryGetValue(name, out var module)) + return module.Assembly; + if (!nameToPath.TryGetValue(name, out var path)) + return null; + var options = new ModuleCreationOptions(context); + options.TryToLoadPdbFromDisk = false; + module = ModuleDefMD.Load(path, options); + modules.Add(name, module); + return module.Assembly ?? throw new InvalidOperationException("It's a netmodule"); + } + + public void Dispose() { + foreach (var module in modules) + module.Value.Dispose(); + } + } +} diff --git a/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.csproj b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.csproj new file mode 100644 index 0000000..1393973 --- /dev/null +++ b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.csproj @@ -0,0 +1,25 @@ + + + + + + + netstandard2.0;$(TargetFrameworks) + $(DnSpyAssemblyCopyright) + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + True + ..\..\dnSpy.snk + true + enable + + + + + + + + + diff --git a/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.tasks b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.tasks new file mode 100644 index 0000000..5d80ad4 --- /dev/null +++ b/Build/ConvertToNetstandardReferences/ConvertToNetstandardReferences.tasks @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/Build/MakeEverythingPublic/IVTPatcher.cs b/Build/MakeEverythingPublic/IVTPatcher.cs new file mode 100644 index 0000000..564e2df --- /dev/null +++ b/Build/MakeEverythingPublic/IVTPatcher.cs @@ -0,0 +1,194 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +// This code patches an assembly's System.Runtime.CompilerServices.InternalsVisibleToAttribute +// so the string passed to the attribute constructor is the name of another assembly. +// If there's no such attribute or if the new string doesn't fit in the old string, this code fails. +// If it happens, use a smaller public key and/or a shorter assembly name and use no spaces +// or don't use PublicKey=xxxx... (since Roslyn C# compiler seems to ignore the public key). +// +// A more generic patcher would rewrite some of the metadata tables but this isn't needed since +// we only use it to patch Roslyn assemblies which contain a ton of IVT attributes. +// +// PERF is the same as copying a file since it just patches the data in memory, nothing is rewritten. + +using System; +using dnlib.DotNet; +using dnlib.DotNet.MD; +using dnlib.IO; + +namespace MakeEverythingPublic { + enum IVTPatcherResult { + OK, + NoCustomAttributes, + NoIVTs, + IVTBlobTooSmall, + } + + struct IVTPatcher { + // Prefer overwriting IVTs with this public key since they're just test assemblies + const string ROSLYN_OPEN_SOURCE_PUBLIC_KEY = "002400000480000094000000060200000024000052534131000400000100010055e0217eb635f69281051f9a823e0c7edd90f28063eb6c7a742a19b4f6139778ee0af438f47aed3b6e9f99838aa8dba689c7a71ddb860c96d923830b57bbd5cd6119406ddb9b002cf1c723bf272d6acbb7129e9d6dd5a5309c94e0ff4b2c884d45a55f475cd7dba59198086f61f5a8c8b5e601c0edbf269733f6f578fc8579c2"; + + readonly byte[] data; + readonly Metadata md; + readonly byte[] ivtBlob; + + public IVTPatcher(byte[] data, Metadata md, byte[] ivtBlob) { + this.data = data; + this.md = md; + this.ivtBlob = ivtBlob; + } + + public IVTPatcherResult Patch() { + var rids = md.GetCustomAttributeRidList(Table.Assembly, 1); + if (rids.Count == 0) + return IVTPatcherResult.NoCustomAttributes; + + if (FindIVT(rids, out var foundIVT, out uint ivtBlobOffset)) { + Array.Copy(ivtBlob, 0, data, ivtBlobOffset, ivtBlob.Length); + return IVTPatcherResult.OK; + } + + if (!foundIVT) + return IVTPatcherResult.NoIVTs; + return IVTPatcherResult.IVTBlobTooSmall; + } + + bool FindIVT(RidList rids, out bool foundIVT, out uint ivtBlobDataOffset) { + ivtBlobDataOffset = 0; + foundIVT = false; + uint otherIVTBlobOffset = uint.MaxValue; + var blobStream = md.BlobStream.CreateReader(); + var tbl = md.TablesStream.CustomAttributeTable; + uint baseOffset = (uint)tbl.StartOffset; + var columnType = tbl.Columns[1]; + var columnValue = tbl.Columns[2]; + for (int i = 0; i < rids.Count; i++) { + uint rid = rids[i]; + uint offset = baseOffset + (rid - 1) * tbl.RowSize; + uint type = ReadColumn(columnType, offset); + if (!IsIVTCtor(type)) + continue; + foundIVT = true; + uint blobOffset = ReadColumn(columnValue, offset); + if (blobOffset + ivtBlob.Length > blobStream.Length) + continue; + blobStream.Position = blobOffset; + if (!blobStream.TryReadCompressedUInt32(out uint len)) + continue; + var compressedSize = blobStream.Position - blobOffset; + if (compressedSize + len < ivtBlob.Length) + continue; + if (!ParseIVTBlob(ref blobStream, blobStream.Position + len, out var publicKeyString)) + continue; + if (StringComparer.OrdinalIgnoreCase.Equals(publicKeyString, ROSLYN_OPEN_SOURCE_PUBLIC_KEY)) { + ivtBlobDataOffset = (uint)md.BlobStream.StartOffset + blobOffset; + return true; + } + else + otherIVTBlobOffset = (uint)md.BlobStream.StartOffset + blobOffset; + } + if (otherIVTBlobOffset != uint.MaxValue) { + ivtBlobDataOffset = otherIVTBlobOffset; + return true; + } + + return false; + } + + static bool ParseIVTBlob(ref DataReader reader, uint end, out string? publicKeyString) { + publicKeyString = null; + if ((ulong)reader.Position + 2 > end) + return false; + if (reader.ReadUInt16() != 1) + return false; + if (!reader.TryReadCompressedUInt32(out uint len) || (ulong)reader.Position + len >= end) + return false; + var s = reader.ReadUtf8String((int)len); + const string PublicKeyPattern = "PublicKey="; + int index = s.IndexOf(PublicKeyPattern, StringComparison.OrdinalIgnoreCase); + if (index >= 0) + publicKeyString = s.Substring(index + PublicKeyPattern.Length).Trim(); + return true; + } + + bool IsIVTCtor(uint codedType) { + if (!CodedToken.CustomAttributeType.Decode(codedType, out MDToken ctor)) + return false; + + switch (ctor.Table) { + case Table.Method: + uint declTypeDefToken = md.GetOwnerTypeOfMethod(ctor.Rid); + return IsIVT_TypeDef(declTypeDefToken); + + case Table.MemberRef: + if (!md.TablesStream.TryReadMemberRefRow(ctor.Rid, out var memberRefRow)) + return false; + if (!CodedToken.MemberRefParent.Decode(memberRefRow.Class, out MDToken parentToken)) + return false; + switch (parentToken.Table) { + case Table.TypeDef: + return IsIVT_TypeDef(parentToken.Rid); + + case Table.TypeRef: + return IsIVT_TypeRef(parentToken.Rid); + + case Table.TypeSpec: + default: + return false; + } + + default: + return false; + } + } + + bool IsIVT_TypeRef(uint typeRefRid) { + if (!md.TablesStream.TryReadTypeRefRow(typeRefRid, out var typeRefRow)) + return false; + if (!CodedToken.ResolutionScope.Decode(typeRefRow.ResolutionScope, out MDToken scope) || scope.Table == Table.TypeRef) + return false; + return IsIVTCtor(typeRefRow.Namespace, typeRefRow.Name); + } + + bool IsIVT_TypeDef(uint typeDefRid) { + if (!md.TablesStream.TryReadTypeDefRow(typeDefRid, out var typeDefRow)) + return false; + if ((typeDefRow.Flags & (uint)TypeAttributes.VisibilityMask) >= (uint)TypeAttributes.NestedPublic) + return false; + return IsIVTCtor(typeDefRow.Namespace, typeDefRow.Name); + } + + bool IsIVTCtor(uint @namespace, uint name) => + md.StringsStream.ReadNoNull(name) == InternalsVisibleToAttribute && + md.StringsStream.ReadNoNull(@namespace) == System_Runtime_CompilerServices; + static readonly UTF8String System_Runtime_CompilerServices = new UTF8String("System.Runtime.CompilerServices"); + static readonly UTF8String InternalsVisibleToAttribute = new UTF8String("InternalsVisibleToAttribute"); + + uint ReadColumn(ColumnInfo column, uint columnOffset) { + columnOffset += (uint)column.Offset; + switch (column.Size) { + case 1: return data[columnOffset]; + case 2: return data[columnOffset++] | ((uint)data[columnOffset] << 8); + case 4: return data[columnOffset++] | ((uint)data[columnOffset++] << 8) | ((uint)data[columnOffset++] << 16) | ((uint)data[columnOffset] << 24); + default: throw new InvalidOperationException(); + } + } + } +} diff --git a/Build/MakeEverythingPublic/MakeEverythingPublic.cs b/Build/MakeEverythingPublic/MakeEverythingPublic.cs new file mode 100644 index 0000000..44b5a54 --- /dev/null +++ b/Build/MakeEverythingPublic/MakeEverythingPublic.cs @@ -0,0 +1,211 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Text; +using dnlib.DotNet.MD; +using dnlib.PE; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace MakeEverythingPublic { + public sealed class MakeEverythingPublic : Task { + // Increment it if something changes so the files are re-created + const string VERSION = "v1"; + +#pragma warning disable CS8618 // Non-nullable field is uninitialized. + [Required] + public string IVTString { get; set; } + + [Required] + public string DestinationDirectory { get; set; } + + [Required] + public string AssembliesToMakePublic { get; set; } + + [Required] + public ITaskItem[] ReferencePath { get; set; } + + [Output] + public ITaskItem[] OutputReferencePath { get; private set; } +#pragma warning restore CS8618 // Non-nullable field is uninitialized. + + public override bool Execute() { + if (string.IsNullOrWhiteSpace(IVTString)) { + Log.LogMessageFromText(nameof(IVTString) + " is an empty string", MessageImportance.High); + return false; + } + + if (string.IsNullOrWhiteSpace(DestinationDirectory)) { + Log.LogMessageFromText(nameof(DestinationDirectory) + " is an empty string", MessageImportance.High); + return false; + } + + var assembliesToFix = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var tmp in AssembliesToMakePublic.Split(';')) { + var asmName = tmp.Trim(); + var asmSimpleName = asmName; + int index = asmSimpleName.IndexOf(','); + if (index >= 0) + asmSimpleName = asmSimpleName.Substring(0, index).Trim(); + if (asmSimpleName.Length == 0) + continue; + assembliesToFix.Add(asmSimpleName); + } + + OutputReferencePath = new ITaskItem[ReferencePath.Length]; + byte[]? ivtBlob = null; + for (int i = 0; i < ReferencePath.Length; i++) { + var file = ReferencePath[i]; + OutputReferencePath[i] = file; + var filename = file.ItemSpec; + var fileExt = Path.GetExtension(filename); + var asmSimpleName = Path.GetFileNameWithoutExtension(filename); + if (!assembliesToFix.Contains(asmSimpleName)) + continue; + if (!File.Exists(filename)) { + Log.LogMessageFromText($"File does not exist: {filename}", MessageImportance.High); + return false; + } + + var patchDir = DestinationDirectory; + Directory.CreateDirectory(patchDir); + + var fileInfo = new FileInfo(filename); + long filesize = fileInfo.Length; + long writeTime = fileInfo.LastWriteTimeUtc.ToBinary(); + + var extraInfo = $"_{VERSION} {filesize} {writeTime}_"; + var patchedFilename = Path.Combine(patchDir, asmSimpleName + extraInfo + fileExt); + if (StringComparer.OrdinalIgnoreCase.Equals(patchedFilename, filename)) + continue; + + if (!File.Exists(patchedFilename)) { + if (ivtBlob is null) + ivtBlob = CreateIVTBlob(IVTString); + var data = File.ReadAllBytes(filename); + try { + using (var peImage = new PEImage(data, filename, ImageLayout.File, verify: true)) { + using (var md = MetadataFactory.CreateMetadata(peImage, verify: true)) { + var result = new IVTPatcher(data, md, ivtBlob).Patch(); + if (result != IVTPatcherResult.OK) { + string errMsg; + switch (result) { + case IVTPatcherResult.NoCustomAttributes: + errMsg = $"Assembly '{asmSimpleName}' has no custom attributes"; + break; + case IVTPatcherResult.NoIVTs: + errMsg = $"Assembly '{asmSimpleName}' has no InternalsVisibleToAttributes"; + break; + case IVTPatcherResult.IVTBlobTooSmall: + errMsg = $"Assembly '{asmSimpleName}' has no InternalsVisibleToAttribute blob that is big enough to store '{IVTString}'. Use a shorter assembly name and/or a shorter public key, or skip PublicKey=xxxx... altogether (if it's a C# assembly)"; + break; + default: + Debug.Fail($"Unknown error result: {result}"); + errMsg = "Unknown error"; + break; + } + Log.LogMessageFromText(errMsg, MessageImportance.High); + return false; + } + try { + File.WriteAllBytes(patchedFilename, data); + } + catch { + try { File.Delete(patchedFilename); } catch { } + throw; + } + } + } + } + catch (Exception ex) when (ex is IOException || ex is BadImageFormatException) { + Log.LogMessageFromText($"File '{filename}' is not a .NET file", MessageImportance.High); + return false; + } + + var xmlDocFile = Path.ChangeExtension(filename, "xml"); + if (File.Exists(xmlDocFile)) { + var newXmlDocFile = Path.ChangeExtension(patchedFilename, "xml"); + if (File.Exists(newXmlDocFile)) + File.Delete(newXmlDocFile); + File.Copy(xmlDocFile, newXmlDocFile); + } + } + + OutputReferencePath[i] = new TaskItem(patchedFilename); + } + + return true; + } + + static byte[] CreateIVTBlob(string newIVTString) { + var caStream = new MemoryStream(); + var caWriter = new BinaryWriter(caStream); + caWriter.Write((ushort)1); + WriteString(caWriter, newIVTString); + caWriter.Write((ushort)0); + var newIVTBlob = caStream.ToArray(); + var compressedSize = GetCompressedUInt32Bytes((uint)newIVTBlob.Length); + var blob = new byte[compressedSize + newIVTBlob.Length]; + var blobStream = new MemoryStream(blob); + var blobWriter = new BinaryWriter(blobStream); + WriteCompressedUInt32(blobWriter, (uint)newIVTBlob.Length); + blobWriter.Write(newIVTBlob); + if (blobWriter.BaseStream.Position != blob.Length) + throw new InvalidOperationException(); + return blob; + } + + static void WriteString(BinaryWriter writer, string s) { + var bytes = Encoding.UTF8.GetBytes(s); + WriteCompressedUInt32(writer, (uint)bytes.Length); + writer.Write(bytes); + } + + static void WriteCompressedUInt32(BinaryWriter writer, uint value) { + if (value <= 0x7F) + writer.Write((byte)value); + else if (value <= 0x3FFF) { + writer.Write((byte)((value >> 8) | 0x80)); + writer.Write((byte)value); + } + else if (value <= 0x1FFFFFFF) { + writer.Write((byte)((value >> 24) | 0xC0)); + writer.Write((byte)(value >> 16)); + writer.Write((byte)(value >> 8)); + writer.Write((byte)value); + } + else + throw new ArgumentOutOfRangeException("UInt32 value can't be compressed"); + } + + static uint GetCompressedUInt32Bytes(uint value) { + if (value <= 0x7F) + return 1; + if (value <= 0x3FFF) + return 2; + else if (value <= 0x1FFFFFFF) + return 4; + throw new ArgumentOutOfRangeException("UInt32 value can't be compressed"); + } + } +} diff --git a/Build/MakeEverythingPublic/MakeEverythingPublic.csproj b/Build/MakeEverythingPublic/MakeEverythingPublic.csproj new file mode 100644 index 0000000..1393973 --- /dev/null +++ b/Build/MakeEverythingPublic/MakeEverythingPublic.csproj @@ -0,0 +1,25 @@ + + + + + + + netstandard2.0;$(TargetFrameworks) + $(DnSpyAssemblyCopyright) + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + True + ..\..\dnSpy.snk + true + enable + + + + + + + + + diff --git a/Build/MakeEverythingPublic/MakeEverythingPublic.tasks b/Build/MakeEverythingPublic/MakeEverythingPublic.tasks new file mode 100644 index 0000000..ab084b1 --- /dev/null +++ b/Build/MakeEverythingPublic/MakeEverythingPublic.tasks @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/Build/compiled/ConvertToNetstandardReferences.dll b/Build/compiled/ConvertToNetstandardReferences.dll new file mode 100644 index 0000000000000000000000000000000000000000..bf524d02155236c84651effb6054038c608254f2 GIT binary patch literal 11776 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 literal 0 HcmV?d00001 diff --git a/Build/compiled/MakeEverythingPublic.dll b/Build/compiled/MakeEverythingPublic.dll new file mode 100644 index 0000000000000000000000000000000000000000..478aef49026532a27f536a69a705177529853da5 GIT binary patch literal 14848 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 U`@7!D-c|8k?EGH*I~jrh2HX2YS^xk5 literal 0 HcmV?d00001 diff --git a/Build/compiled/dnlib.dll b/Build/compiled/dnlib.dll new file mode 100644 index 0000000000000000000000000000000000000000..17c418500455192ab693b58d7f7ded92569a4b14 GIT binary patch literal 1149952 zcmd443!GdeQ)IRj1x{k6ZU{%dsrW#otRWS=L=}`ER-W?*3;Bg4+vsw_A6lzcc@? zmSev&f6Z&puN5z)Oo4>ba zec}<8b!>}cEo?p1ByH`m78Elr3oYxitYvwMaLLVpi-7NkYgw}eww2sOP=58V!?J)M zU(kVkEq@zH`G3RJUQPYXO!_`{#H9(4N%sVrBx#%DwU5?@!uAXy22tvwgL1y7~ z#WcDVQ6vp?->hgTn{6emzdi0*-~XC#rKb>nP2a( z?YN0{7hYuAEBzHj0|0DyV5oJl3i^v`S0L?6>XK}tF6p+rb*5~$CnPPq-K$FyNE0

Lt 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%0Dm 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

F{$-WQzONr}< zZz6s%@e8l^%U*;06VBZ(dBAUwYtmN;cgS|4{=0==B77$1=PKaLQMpbQy<7GpJUDlN zZT<$fc~?*Hpg;E#_XS2vazA+nm}PnEOFhIm_Dvro9ul@bHY{xYWQ6q5zhfK6 z;4w!1Hg81z#;DU6bsCQeqfM|~U|a8a&@uOz2#h)8B2u_tCw+nR zV(CM6t}hd|w(6HQN1f=0cxGd51>I`KvbHTX#L(@$gPi8aSZ(8Zo#-}hCyAjWC(d!u zjiFne(2XCEhJ5}R|9J^`?A!;o8sIk_YGGg`~%w>c7X`M@Ai?wT@5y{ea$;F)lW}2d6R@?z$L08~mE+MqlVjr&^#Ay_ zbC?fIPz_*f2e54y*w!^EZ0iEsx-eF3exLtL%b4^BJ4b`<96cp|+rMDjcChssFxG`< zozuct7oK&_2)F*s-yeQT*7XbdEgsBU;ISI8tkpjo7;}d4(x@Kry^r`j@K~K-({Vq? zcusVy6KwhCiK}G%NB!sz(9Pc^d5jlC$GsOE7sb;5EDt=^wq>GQ+rndQ1-AA<4c5oN zwvVu0W8|?m!Lrt#Rl?SuHNx00cy^3Dll$bEkJJW_EsLC1TU}W8%`#Si&4XpllOzw= zJSkypFXkl3`3)IY?@f8OZNYxAe$pQNvg;h!&hMSV=7(;_b(gTUbNAnQtPO`{u40}Z z@!&Ue-_#;wrttS)=Gc9y=1H+jJ30h_0XJYe&H&C^Rd z*z`Wq!KU{M+x`VxPOy0fNC%rfNIKZ`Az{l2wwz$|43h_J9y>iIC;S40h?!nJYe&H%`-_JuzA4dnIaF^JYe%olLu@buz6<412zxXJhS8h zn+I&3Ir4zb12)e*dBElYn`ePMVDo^@Q!H~7>l zZp=MqWWJ3#+rR#U%z1*2Im|us?>%yj{EX1Gc#V*yaYP)85|#7bL&+|1!~yv44$c>A1#sL-0M3+ob)$ z_)Z*njy%X|*HFEZ$F8CJgzcIXY}ZqxG8e+J`LB`(e!C7T7PdV7!j@-1*z$la4?MOk z>bGSFg>Bg(VOth#%VIxndbPi%=#jD1>cO&>6VEL0-Ho?xlFv+1&BMgFKDFzPanh?O zXOg%_uJ3Go85qQ^XU*#l$tl*mwE&#oP-!EA2IckysdVb`

(wCmZygDpiL|fJeCK2!}8Qoo+RZ-Q699X<$=fYpf6dTcFNO9dAcYM z_J!qv$MT@>S)Ojn(?fZBDG&Ce<$=fYps!kS)M`4GemiY zDG&OO<$=fY;25zyBa~;9@{Ca)^gYW1kL5w1w>;yNXM*xfQXceM%L9+)!Lez1rYO%e z<(Z*8=<}8b9?LUKd1fik9Oap(JUCt~4?LC!$G+9GKzWLnMg6%<_%1oW;JCoCW_jST zJlJ;pHYe^CqpfV*PLbYE`Y`F(*XFO1oHpLhi*Do3w5-?02k2IFjri>ttP{3lFez*` zV_B;i9;+E1s~I`1hLq@5Loe4L`_yWHZZ))v-)iU-wi>#G&(}cx0UoQNTiDjsDdUW7 zZ<*w`bwRgv^@!ir)hlf4>JzqgVOiT=cx+w$!nUq1T2~dV3%adqK>W6@L1A0hkg%-_ z%i6l&v2_g#V_lfHj}R}2-{$>LfY^Do%0DZuvJ0c_VJSeGq3Ds0;b9qozx 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 literal 0 HcmV?d00001 diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..8c119d5 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,2 @@ + + diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..7367bb6 --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DnSpyCommon.props b/DnSpyCommon.props new file mode 100644 index 0000000..e7c7bcd --- /dev/null +++ b/DnSpyCommon.props @@ -0,0 +1,60 @@ + + + + + net48;net5.0-windows + false + false + false + true + false + true + strict;nullablePublicOnly + latest + latest + en + false + + true + + win-x86;win-x64 + cs;de;es;es-ES;fa;fr;hu;it;pt-BR;pt-PT;ru;tr;uk;zh-CN + + + 6.1.8.0 + + v6.1.8 + Copyright (C) 2014-2020 de4dot@gmail.com + + + NU1701;AD0001 + $(NoWarn);CS8767 + + + 1.7.0 + 3.3.2 + 1.9.0 + 16.7.0 + 1.1.142101 + 16.4.11 + 15.5.27130 + 15.5.27130 + 12.0.3 + 3.0.1 + 2.10.0 + 4.6.0 + + + + + + + false + true + $(DefineConstants);HAS_COMREFERENCE + + + diff --git a/Extensions/Examples/Example1.Extension/CodeCtxMenus.cs b/Extensions/Examples/Example1.Extension/CodeCtxMenus.cs new file mode 100644 index 0000000..45a1c6f --- /dev/null +++ b/Extensions/Examples/Example1.Extension/CodeCtxMenus.cs @@ -0,0 +1,155 @@ +using System; +using System.ComponentModel.Composition; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Input; +using dnlib.DotNet; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Documents.Tabs.DocViewer; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Menus; +using Microsoft.VisualStudio.Text; + +// Adds menu items to the text editor context menu +// If you have many similar commands, it's better to create a base class and derive from +// MenuItemBase instead of MenuItemBase, see TreeViewCtxMenus.cs for an example. + +namespace Example1.Extension { + static class Constants { + //TODO: Use your own guids + // The first number is the order of the group, and the guid is the guid of the group, + // see eg. dnSpy.Contracts.Menus.MenuConstants.GROUP_CTX_CODE_HEX etc + public const string GROUP_TEXTEDITOR = "20000,3567EC95-E68E-44CE-932C-98A686FDCACF"; + public const string GROUP_TREEVIEW = "20000,77ACC18E-D8EB-483B-8D93-3581574B8891"; + } + + // This gets loaded by dnSpy and is used to add the Ctrl+Alt+Q command + [ExportAutoLoaded] + sealed class CommandLoader : IAutoLoaded { + static readonly RoutedCommand Option1Command = new RoutedCommand("Option1Command", typeof(CommandLoader)); + + [ImportingConstructor] + CommandLoader(IWpfCommandService wpfCommandService, MySettings mySettings) { + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_DOCUMENTVIEWER_UICONTEXT); + // This command will be added to all text editors + cmds.Add(Option1Command, + (s, e) => mySettings.BoolOption1 = !mySettings.BoolOption1, + (s, e) => e.CanExecute = true, + ModifierKeys.Control | ModifierKeys.Alt, Key.Q); + } + } + + [ExportMenuItem(Header = "Option 1", InputGestureText = "Ctrl+Alt+Q", Group = Constants.GROUP_TEXTEDITOR, Order = 0)] + sealed class TextEditorCommand1 : MenuItemBase { + readonly MySettings mySettings; + + [ImportingConstructor] + TextEditorCommand1(MySettings mySettings) => this.mySettings = mySettings; + + public override bool IsChecked(IMenuItemContext context) => mySettings.BoolOption1; + public override void Execute(IMenuItemContext context) => mySettings.BoolOption1 = !mySettings.BoolOption1; + + // Only show this in the document viewer + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID); + } + + [ExportMenuItem(Header = "Option 2", Group = Constants.GROUP_TEXTEDITOR, Order = 10)] + sealed class TextEditorCommand2 : MenuItemBase { + readonly MySettings mySettings; + + [ImportingConstructor] + TextEditorCommand2(MySettings mySettings) => this.mySettings = mySettings; + + public override bool IsChecked(IMenuItemContext context) => mySettings.BoolOption2; + public override void Execute(IMenuItemContext context) => mySettings.BoolOption2 = !mySettings.BoolOption2; + + // Only show this in the document viewer + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID); + } + + [ExportMenuItem(Group = Constants.GROUP_TEXTEDITOR, Order = 20)] + sealed class TextEditorCommand3 : MenuItemBase { + public override void Execute(IMenuItemContext context) { + var md = GetTokenObj(context); + if (md is not null) { + try { + Clipboard.SetText($"{md.MDToken.Raw:X8}"); + } + catch (ExternalException) { } + } + } + + public override string? GetHeader(IMenuItemContext context) { + var md = GetTokenObj(context); + if (md is null) + return "Copy token"; + return $"Copy token {md.MDToken.Raw:X8}"; + } + + IMDTokenProvider? GetTokenObj(IMenuItemContext context) { + // Only show this in the document viewer + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID)) + return null; + + // All references in the text editor are stored in TextReferences + var textRef = context.Find(); + if (textRef is null) + return null; + + return textRef.Reference as IMDTokenProvider; + } + + // Only show this in the document viewer + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID); + public override bool IsEnabled(IMenuItemContext context) => GetTokenObj(context) is not null; + } + + [ExportMenuItem(Group = Constants.GROUP_TEXTEDITOR, Order = 30)] + sealed class TextEditorCommand4 : MenuItemBase { + public override void Execute(IMenuItemContext context) { + var documentViewer = GetDocumentViewer(context); + if (documentViewer is not null) { + try { + var lineColumn = GetLineColumn(documentViewer.Caret.Position.VirtualBufferPosition); + Clipboard.SetText($"Line,col: {lineColumn.Line + 1},{lineColumn.Column + 1}"); + } + catch (ExternalException) { } + } + } + + public override string? GetHeader(IMenuItemContext context) { + var documentViewer = GetDocumentViewer(context); + if (documentViewer is null) + return "Copy line and column"; + var lineColumn = GetLineColumn(documentViewer.Caret.Position.VirtualBufferPosition); + return $"Copy line,col {lineColumn.Line + 1},{lineColumn.Column + 1}"; + } + + LineColumn GetLineColumn(VirtualSnapshotPoint point) { + var line = point.Position.GetContainingLine(); + int column = point.Position - line.Start + point.VirtualSpaces; + return new LineColumn(line.LineNumber, column); + } + + struct LineColumn { + public int Line { get; } + public int Column { get; } + public LineColumn(int line, int column) { + Line = line; + Column = column; + } + } + + IDocumentViewer? GetDocumentViewer(IMenuItemContext context) { + // Only show this in the document viewer + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID)) + return null; + + return context.Find(); + } + + // Only show this in the document viewer + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID); + public override bool IsEnabled(IMenuItemContext context) => GetDocumentViewer(context) is not null; + } +} diff --git a/Extensions/Examples/Example1.Extension/Example1.Extension.csproj b/Extensions/Examples/Example1.Extension/Example1.Extension.csproj new file mode 100644 index 0000000..baddcf1 --- /dev/null +++ b/Extensions/Examples/Example1.Extension/Example1.Extension.csproj @@ -0,0 +1,20 @@ + + + + + + Example1.Extension.x + enable + true + + + + + + + + + + + + diff --git a/Extensions/Examples/Example1.Extension/MainMenuCommands.cs b/Extensions/Examples/Example1.Extension/MainMenuCommands.cs new file mode 100644 index 0000000..3c4856c --- /dev/null +++ b/Extensions/Examples/Example1.Extension/MainMenuCommands.cs @@ -0,0 +1,49 @@ +using dnSpy.Contracts.App; +using dnSpy.Contracts.Menus; + +// Adds a new "_Extension" menu and several commands. +// Adds a command to the View menu + +namespace Example1.Extension { + static class MainMenuConstants { + //TODO: Use your own guids + public const string APP_MENU_EXTENSION = "4E6829A6-AEA0-4803-9344-D19BF0A74DA1"; + public const string GROUP_EXTENSION_MENU1 = "0,73BEBC37-387A-4004-8076-A1A90A17611B"; + public const string GROUP_EXTENSION_MENU2 = "10,C21B8B99-A2E4-474F-B4BC-4CF348ECBD0A"; + } + + // Create the Extension menu and place it right after the Debug menu + [ExportMenu(OwnerGuid = MenuConstants.APP_MENU_GUID, Guid = MainMenuConstants.APP_MENU_EXTENSION, Order = MenuConstants.ORDER_APP_MENU_DEBUG + 0.1, Header = "_Extension")] + sealed class DebugMenu : IMenu { + } + + [ExportMenuItem(OwnerGuid = MainMenuConstants.APP_MENU_EXTENSION, Header = "Command #1", Group = MainMenuConstants.GROUP_EXTENSION_MENU1, Order = 0)] + sealed class ExtensionCommand1 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("Command #1"); + } + + [ExportMenuItem(OwnerGuid = MainMenuConstants.APP_MENU_EXTENSION, Header = "Command #2", Group = MainMenuConstants.GROUP_EXTENSION_MENU1, Order = 10)] + sealed class ExtensionCommand2 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("Command #2"); + } + + [ExportMenuItem(OwnerGuid = MainMenuConstants.APP_MENU_EXTENSION, Header = "Command #3", Group = MainMenuConstants.GROUP_EXTENSION_MENU2, Order = 0)] + sealed class ExtensionCommand3 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("Command #3"); + } + + [ExportMenuItem(OwnerGuid = MainMenuConstants.APP_MENU_EXTENSION, Header = "Command #4", Group = MainMenuConstants.GROUP_EXTENSION_MENU2, Order = 10)] + sealed class ExtensionCommand4 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("Command #4"); + } + + [ExportMenuItem(OwnerGuid = MainMenuConstants.APP_MENU_EXTENSION, Header = "Command #5", Group = MainMenuConstants.GROUP_EXTENSION_MENU2, Order = 20)] + sealed class ExtensionCommand5 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("Command #5"); + } + + [ExportMenuItem(OwnerGuid = MenuConstants.APP_MENU_VIEW_GUID, Header = "Command #1", Group = MenuConstants.GROUP_APP_MENU_VIEW_WINDOWS, Order = 1000)] + sealed class ViewCommand1 : MenuItemBase { + public override void Execute(IMenuItemContext context) => MsgBox.Instance.Show("View Command #1"); + } +} diff --git a/Extensions/Examples/Example1.Extension/MySettings.cs b/Extensions/Examples/Example1.Extension/MySettings.cs new file mode 100644 index 0000000..6f16830 --- /dev/null +++ b/Extensions/Examples/Example1.Extension/MySettings.cs @@ -0,0 +1,85 @@ +using System; +using System.ComponentModel; +using System.ComponentModel.Composition; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.Settings; + +// Reads and writes the extension settings + +namespace Example1.Extension { + class MySettings : ViewModelBase { + public bool BoolOption1 { + get => boolOption1; + set { + if (boolOption1 != value) { + boolOption1 = value; + OnPropertyChanged(nameof(BoolOption1)); + } + } + } + bool boolOption1 = true; + + public bool BoolOption2 { + get => boolOption2; + set { + if (boolOption2 != value) { + boolOption2 = value; + OnPropertyChanged(nameof(BoolOption2)); + } + } + } + bool boolOption2 = false; + + public string StringOption3 { + get => stringOption3; + set { + if (stringOption3 != value) { + stringOption3 = value; + OnPropertyChanged(nameof(StringOption3)); + } + } + } + string stringOption3 = string.Empty; + + public MySettings Clone() => CopyTo(new MySettings()); + + public MySettings CopyTo(MySettings other) { + other.BoolOption1 = BoolOption1; + other.BoolOption2 = BoolOption2; + other.StringOption3 = StringOption3; + return other; + } + } + + // Export this class so it can be imported by other classes in this extension + [Export(typeof(MySettings))] + sealed class MySettingsImpl : MySettings { + //TODO: Use your own guid + static readonly Guid SETTINGS_GUID = new Guid("A308405D-0DF5-4C56-8B1E-8CE7BA6365E1"); + + readonly ISettingsService settingsService; + + // Tell MEF to pass in the required ISettingsService instance exported by dnSpy + [ImportingConstructor] + MySettingsImpl(ISettingsService settingsService) { + this.settingsService = settingsService; + + // Read the settings from the file or use the default values if our settings haven't + // been saved to it yet. + + var sect = settingsService.GetOrCreateSection(SETTINGS_GUID); + BoolOption1 = sect.Attribute(nameof(BoolOption1)) ?? BoolOption1; + BoolOption2 = sect.Attribute(nameof(BoolOption2)) ?? BoolOption2; + StringOption3 = sect.Attribute(nameof(StringOption3)) ?? StringOption3; + PropertyChanged += MySettingsImpl_PropertyChanged; + } + + void MySettingsImpl_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + // Save the settings + var sect = settingsService.RecreateSection(SETTINGS_GUID); + sect.Attribute(nameof(BoolOption1), BoolOption1); + sect.Attribute(nameof(BoolOption2), BoolOption2); + sect.Attribute(nameof(StringOption3), StringOption3); + } + } +} diff --git a/Extensions/Examples/Example1.Extension/MySettingsControl.xaml b/Extensions/Examples/Example1.Extension/MySettingsControl.xaml new file mode 100644 index 0000000..3dc1e6e --- /dev/null +++ b/Extensions/Examples/Example1.Extension/MySettingsControl.xaml @@ -0,0 +1,8 @@ + + + + + + diff --git a/Extensions/Examples/Example1.Extension/MySettingsControl.xaml.cs b/Extensions/Examples/Example1.Extension/MySettingsControl.xaml.cs new file mode 100644 index 0000000..b3915fd --- /dev/null +++ b/Extensions/Examples/Example1.Extension/MySettingsControl.xaml.cs @@ -0,0 +1,7 @@ +using System.Windows.Controls; + +namespace Example1.Extension { + public partial class MySettingsControl : UserControl { + public MySettingsControl() => InitializeComponent(); + } +} diff --git a/Extensions/Examples/Example1.Extension/MySettingsPage.cs b/Extensions/Examples/Example1.Extension/MySettingsPage.cs new file mode 100644 index 0000000..4f6856a --- /dev/null +++ b/Extensions/Examples/Example1.Extension/MySettingsPage.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Settings.Dialog; + +// Adds an options dialog box page showing settings saved in MySettings + +namespace Example1.Extension { + // This instance gets called by dnSpy to create the page each time the user opens the options dialog + [Export(typeof(IAppSettingsPageProvider))] // Tell MEF we're exporting this instance + sealed class MyAppSettingsPageProvider : IAppSettingsPageProvider { + readonly MySettings mySettings; + + // This constructor gets the single MySettingsImpl instance exported by MySettingsImpl in MySettings.cs + [ImportingConstructor] + MyAppSettingsPageProvider(MySettings mySettings) => this.mySettings = mySettings; + + public IEnumerable Create() { + // We only create one page + yield return new MyAppSettingsPage(mySettings); + } + } + + sealed class MyAppSettingsPage : AppSettingsPage { + //TODO: Use your own GUID + static readonly Guid THE_GUID = new Guid("AE905210-A789-4AE2-B83B-537515D9F435"); + + // Guid of parent page or Guid.Empty if it has none + public override Guid ParentGuid => Guid.Empty; + + // Unique guid of this settings page + public override Guid Guid => THE_GUID; + + // The order of the page, let's place it after the debugger page + public override double Order => AppSettingsConstants.ORDER_DEBUGGER + 0.1; + + public override string Title => "MySettings"; + + // An image that can be shown. You can return ImageReference.None if you don't want an image. + // Let's return an image since no other settings page is currently using images. + public override ImageReference Icon => DsImages.Assembly; + + // This is the content shown in the page. It should be a WPF object (eg. a UserControl) or a + // ViewModel with a DataTemplate defined in a resource dictionary. + public override object? UIObject { + get { + if (uiObject is null) { + uiObject = new MySettingsControl(); + uiObject.DataContext = newSettings; + } + return uiObject; + } + } + MySettingsControl? uiObject; + + readonly MySettings globalSettings; + readonly MySettings newSettings; + + public MyAppSettingsPage(MySettings mySettings) { + globalSettings = mySettings; + newSettings = mySettings.Clone(); + } + + public override void OnApply() => + // OK/Apply was pressed, save the settings + newSettings.CopyTo(globalSettings); + + public override void OnClosed() { + // The dialog box was closed + } + } +} diff --git a/Extensions/Examples/Example1.Extension/README.md b/Extensions/Examples/Example1.Extension/README.md new file mode 100644 index 0000000..5d84a28 --- /dev/null +++ b/Extensions/Examples/Example1.Extension/README.md @@ -0,0 +1,9 @@ + +This extension shows how to do the basic things. It: + +- Reads and writes settings (MySettings.cs) +- Adds a page to the options dialog box showing some of the options (MySettingsPage.cs) +- Adds options to the text editor's context menu and a Ctrl+Alt+Q keyboard shortcut (CodeCtxMenus.cs) +- Adds treeview context menus (TreeViewCtxMenus.cs) +- Adds a "_Extension" menu and menu items and a View menu command (MainMenuCommands.cs) +- Adds a button and a combobox to the toolbar (ToolBarCommands.cs) diff --git a/Extensions/Examples/Example1.Extension/TheExtension.cs b/Extensions/Examples/Example1.Extension/TheExtension.cs new file mode 100644 index 0000000..7290bc9 --- /dev/null +++ b/Extensions/Examples/Example1.Extension/TheExtension.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using dnSpy.Contracts.Extension; + +// Each extension should export one class implementing IExtension + +namespace Example1.Extension { + [ExportExtension] + sealed class TheExtension : IExtension { + public IEnumerable MergedResourceDictionaries { + get { + // We don't have any extra resource dictionaries + yield break; + } + } + + public ExtensionInfo ExtensionInfo => new ExtensionInfo { + ShortDescription = "Example1 extension", + }; + + public void OnEvent(ExtensionEvent @event, object? obj) { + // We don't care about any events + } + } +} diff --git a/Extensions/Examples/Example1.Extension/ToolBarCommands.cs b/Extensions/Examples/Example1.Extension/ToolBarCommands.cs new file mode 100644 index 0000000..436e238 --- /dev/null +++ b/Extensions/Examples/Example1.Extension/ToolBarCommands.cs @@ -0,0 +1,39 @@ +using System.Windows; +using System.Windows.Controls; +using dnSpy.Contracts.App; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.ToolBars; + +// Adds a toolbar button and combobox between the asm editor and debugger toolbar items + +namespace Example1.Extension { + static class TBConstants { + //TODO: Use your own guid + // Place it between the asm editor and debugger, see dnSpy.Contracts.ToolBars.ToolBarConstants: + // GROUP_APP_TB_MAIN_ASMED_UNDO = "4000,6351DBFC-6D8D-4847-B3F2-BC376912B9C2" + // GROUP_APP_TB_MAIN_DEBUG = "5000,A0AFBC69-B6D1-46FE-96C8-EC380DEBE9AA" + public const string GROUP_APP_TB_EXTENSION = "4500,AF461C50-6E91-41B8-9771-0BAE9B77BC69"; + } + + [ExportToolBarButton(Icon = DsImagesAttribute.Assembly, ToolTip = "Click Me", Group = TBConstants.GROUP_APP_TB_EXTENSION, Order = 0)] + sealed class TBCommand1 : ToolBarButtonBase { + public override void Execute(IToolBarItemContext context) => MsgBox.Instance.Show("Command #1"); + } + + [ExportToolBarObject(Group = TBConstants.GROUP_APP_TB_EXTENSION, Order = 10)] + sealed class TBCommand2 : ToolBarObjectBase { + readonly ComboBox comboBox; + + TBCommand2() { + comboBox = new ComboBox(); + comboBox.Width = 100; + comboBox.Items.Add("Item #1"); + comboBox.Items.Add("Item #2"); + comboBox.Items.Add("Item #3"); + comboBox.Items.Add("Item #4"); + comboBox.SelectedIndex = 1; + } + + public override object GetUIObject(IToolBarItemContext context, IInputElement? commandTarget) => comboBox; + } +} diff --git a/Extensions/Examples/Example1.Extension/TreeViewCtxMenus.cs b/Extensions/Examples/Example1.Extension/TreeViewCtxMenus.cs new file mode 100644 index 0000000..bbb787d --- /dev/null +++ b/Extensions/Examples/Example1.Extension/TreeViewCtxMenus.cs @@ -0,0 +1,137 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Windows; +using dnlib.DotNet.Emit; +using dnSpy.Contracts.App; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.TreeView; + +// Adds a couple of commands to the file treeview context menu. +// Since there are several commands using the same state, MenuItemBase is used +// as the base class so the context is created once and shared by all commands. + +namespace Example1.Extension { + sealed class TVContext { + public bool SomeValue { get; } + public DocumentTreeNodeData[] Nodes { get; } + + public TVContext(bool someValue, IEnumerable nodes) { + SomeValue = someValue; + Nodes = nodes.ToArray(); + } + } + + abstract class TVCtxMenuCommand : MenuItemBase { + protected sealed override object CachedContextKey => ContextKey; + static readonly object ContextKey = new object(); + + protected sealed override TVContext? CreateContext(IMenuItemContext context) { + // Make sure it's the file treeview + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_DOCUMENTS_TREEVIEW_GUID)) + return null; + + // Extract the data needed by the context + var nodes = context.Find(); + if (nodes is null) + return null; + var newNodes = nodes.OfType(); + + bool someValue = true; + return new TVContext(someValue, newNodes); + } + } + + [ExportMenuItem(Header = "Command #1", Group = Constants.GROUP_TREEVIEW, Order = 0)] + sealed class TVCommand1 : TVCtxMenuCommand { + public override void Execute(TVContext context) => MsgBox.Instance.Show("Command #1"); + public override bool IsEnabled(TVContext context) => context.Nodes.Length > 1; + } + + [ExportMenuItem(Header = "Command #2", Group = Constants.GROUP_TREEVIEW, Order = 10)] + sealed class TVCommand2 : TVCtxMenuCommand { + public override void Execute(TVContext context) => MsgBox.Instance.Show("Command #2"); + public override bool IsVisible(TVContext context) => context.Nodes.Length > 0; + } + + [ExportMenuItem(Header = "Command #3", Group = Constants.GROUP_TREEVIEW, Order = 20)] + sealed class TVCommand3 : TVCtxMenuCommand { + public override void Execute(TVContext context) { + int secretNum = new Random().Next() % 10; + MsgBox.Instance.Ask("Number", null, "Guess a number", null, s => { + if (string.IsNullOrWhiteSpace(s)) + return "Enter a number"; + if (!int.TryParse(s, out int num)) + return "Not an integer"; + if (num == 42) + return "Nope!"; + if (num != secretNum) + return "WRONG!!!"; + return string.Empty; + }); + } + } + + [ExportMenuItem(Header = "Command #4", Group = Constants.GROUP_TREEVIEW, Order = 30)] + sealed class TVCommand4 : TVCtxMenuCommand { + public override void Execute(TVContext context) => MsgBox.Instance.Show("Command #4"); + public override bool IsEnabled(TVContext context) => context.Nodes.Length == 1 && context.Nodes[0] is ModuleDocumentNode; + } + + [ExportMenuItem(Group = Constants.GROUP_TREEVIEW, Order = 40)] + sealed class TVCommand5 : TVCtxMenuCommand { + public override void Execute(TVContext context) { + var node = GetTokenNode(context); + if (node is not null) { + try { + Clipboard.SetText($"{node.Reference!.MDToken.Raw:X8}"); + } + catch (ExternalException) { } + } + } + + IMDTokenNode? GetTokenNode(TVContext context) { + if (context.Nodes.Length == 0) + return null; + return context.Nodes[0] as IMDTokenNode; + } + + public override string? GetHeader(TVContext context) { + var node = GetTokenNode(context); + if (node is null) + return string.Empty; + return $"Copy token {node.Reference!.MDToken.Raw:X8}"; + } + + public override bool IsVisible(TVContext context) => GetTokenNode(context) is not null; + } + + [ExportMenuItem(Header = "Copy Second Instruction", Group = Constants.GROUP_TREEVIEW, Order = 50)] + sealed class TVCommand6 : TVCtxMenuCommand { + public override void Execute(TVContext context) { + var instr = GetSecondInstruction(context); + if (instr is not null) { + try { + Clipboard.SetText($"Second instruction: {instr}"); + } + catch (ExternalException) { } + } + } + + Instruction? GetSecondInstruction(TVContext context) { + if (context.Nodes.Length == 0) + return null; + var methNode = context.Nodes[0] as MethodNode; + if (methNode is null) + return null; + var body = methNode.MethodDef.Body; + if (body is null || body.Instructions.Count < 2) + return null; + return body.Instructions[1]; + } + + public override bool IsEnabled(TVContext context) => GetSecondInstruction(context) is not null; + } +} diff --git a/Extensions/Examples/Example2.Extension/AssemblyChildNodeTabContent.cs b/Extensions/Examples/Example2.Extension/AssemblyChildNodeTabContent.cs new file mode 100644 index 0000000..c72c7bf --- /dev/null +++ b/Extensions/Examples/Example2.Extension/AssemblyChildNodeTabContent.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; +using dnSpy.Contracts.Documents.Tabs; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.Settings; + +// This file adds custom document tab content when the user clicks on our new AssemblyChildNode tree node. +// This node is created by TreeNodeDataProvider.cs. + +namespace Example2.Extension { + [ExportDocumentTabContentFactory] + sealed class AssemblyChildNodeTabContentFactory : IDocumentTabContentFactory { + // Called to create a new IFileTabContent. If it's our new tree node, create a new IFileTabContent for it + public DocumentTabContent? Create(IDocumentTabContentFactoryContext context) { + if (context.Nodes.Length == 1 && context.Nodes[0] is AssemblyChildNode) + return new AssemblyChildNodeTabContent((AssemblyChildNode)context.Nodes[0]); + return null; + } + + //TODO: Use your own guid + static readonly Guid GUID_SerializedContent = new Guid("FC6D2EC8-6FF8-4071-928E-EB07735A6402"); + + public DocumentTabContent? Deserialize(Guid guid, ISettingsSection section, IDocumentTabContentFactoryContext context) { + if (guid == GUID_SerializedContent) { + // Serialize() doesn't add anything extra to 'section', but if it did, you'd have to + // get that info here and return null if the serialized data wasn't found. + var node = context.Nodes.Length == 1 ? context.Nodes[0] as AssemblyChildNode : null; + if (node is not null) + return new AssemblyChildNodeTabContent(node); + } + return null; + } + + public Guid? Serialize(DocumentTabContent content, ISettingsSection section) { + if (content is AssemblyChildNodeTabContent) { + // There's nothing else we need to serialize it, but if there were, use 'section' + // to write the info needed by Deserialize() above. + return GUID_SerializedContent; + } + return null; + } + } + + sealed class AssemblyChildNodeTabContent : DocumentTabContent { + // Returns all nodes used to generate the content + public override IEnumerable Nodes { + get { yield return node; } + } + + public override string Title => node.ToString(DocumentNodeWriteOptions.Title); + public override object? ToolTip => node.ToString(DocumentNodeWriteOptions.Title | DocumentNodeWriteOptions.ToolTip); + + readonly AssemblyChildNode node; + + public AssemblyChildNodeTabContent(AssemblyChildNode node) => this.node = node; + + // Called when the user opens a new tab. Override CanClone and return false if + // Clone() isn't supported + public override DocumentTabContent Clone() => new AssemblyChildNodeTabContent(node); + + // Gets called to create the UI context. It can be shared by any IFileTabContent in this tab. + // Eg. there's only one text editor per tab, shared by all IFileTabContents that need a text + // editor. + public override DocumentTabUIContext CreateUIContext(IDocumentTabUIContextLocator locator) { + // This custom view object is shared by all nodes of the same type. If we didn't want it + // to be shared, we could use 'node' or 'this' as the key. + var key = node.GetType(); + // var key = node; // uncomment to not share it + + // If the UI object has already been created, use it, else create it. The object is + // stored in a weak reference unless you use the other method override. + return locator.Get(key, () => new AssemblyChildNodeUIContext()); + } + + public override void OnShow(IShowContext ctx) { + // Get the real type, created by CreateUIContext() above. + var uiCtx = (AssemblyChildNodeUIContext)ctx.UIContext; + + // You could initialize some stuff, eg. update its DataContext or whatever + uiCtx.Initialize("some input"); // pretend we need to initialize something + } + } + + sealed class AssemblyChildNodeUIContext : DocumentTabUIContext { + // The element inside UIObject that gets the focus when the tool window should be focused. + // If it's not as easy as calling FocusedElement.Focus() to focus it, you must implement + // dnSpy.Contracts.Controls.IFocusable. + public override IInputElement? FocusedElement => content; + + // The element in UIObject that gets the scale transform. null can be returned to disable scaling. + public override FrameworkElement? ZoomElement => content; + + // The UI object shown in the tab. Should be a WPF control (eg. UserControl) or a .NET object + // with a DataTemplate. + public override object? UIObject => content; + + readonly ContentPresenter content; + readonly AssemblyChildNodeVM vm; + + public AssemblyChildNodeUIContext() { + vm = new AssemblyChildNodeVM(); + // A ContentPresenter + DataTemplate is used to show the VM, but you could of course use + // a UserControl. + content = new ContentPresenter { + Focusable = true, + Content = vm, + }; + } + + sealed class MyUIState { + public string Value1; + public bool Value2; + + public MyUIState(string value1, bool value2) { + Value1 = value1; + Value2 = value2; + } + } + + // Optional: + // Called to create an object that can be passed to RestoreUIState() + public override object? DeserializeUIState(ISettingsSection section) { + var value1 = section.Attribute(nameof(MyUIState.Value1)); + var value2 = section.Attribute(nameof(MyUIState.Value2)); + if (value1 is null || value2 is null) + return null; + + return new MyUIState(value1, value2.Value); + } + + // Optional: + // Saves the object returned by CreateUIState() + public override void SerializeUIState(ISettingsSection section, object? obj) { + var d = obj as MyUIState; + if (d is null) + return; + + section.Attribute(nameof(d.Value1), d.Value1); + section.Attribute(nameof(d.Value2), d.Value2); + } + + // Optional: + // Creates the UI state or returns null. This is an example, so return some random data + public override object? CreateUIState() => new MyUIState("Some string", true); + + // Optional: + // Restores the UI state + public override void RestoreUIState(object? obj) { + var d = obj as MyUIState; + if (d is null) + return; + + // Here's where you'd restore the UI state, eg position etc. + } + + // Called by AssemblyChildNodeTabContent above to initialize it before it's shown again + public void Initialize(string s) { + // here we could initialize something before it's shown again, eg. initialize the DataContext + } + } + + sealed class AssemblyChildNodeVM : ViewModelBase { + public string SomeMessage { + get => someMessage; + set { + if (someMessage != value) { + someMessage = value; + OnPropertyChanged(nameof(SomeMessage)); + } + } + } + string someMessage = "Hello World"; + } +} diff --git a/Extensions/Examples/Example2.Extension/Colorizer.cs b/Extensions/Examples/Example2.Extension/Colorizer.cs new file mode 100644 index 0000000..9bd3bfd --- /dev/null +++ b/Extensions/Examples/Example2.Extension/Colorizer.cs @@ -0,0 +1,146 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Windows.Media; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.Text.Classification; +using Microsoft.VisualStudio.Text; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Text.Tagging; +using Microsoft.VisualStudio.Utilities; + +// Colorizes all text files. +// All "if" words use the Yellow color (default: no background, yellow foreground color) +// All 2 letter words use green background (foreground not changed) +// All 3 letter words use a white foreground and a red background +// All 4 letter words use the Error color (default: no background, red foreground color) + +namespace Example2.Extension { + // Define our classification types. A classification type is converted to a color + static class Constants { + // Use unique names + public const string Color1_ClassificationTypeName = "Example2.Extension.Color1"; + public const string Color2_ClassificationTypeName = "Example2.Extension.Color2"; + + // Disable compiler warnings. The fields aren't referenced, just exported so + // the metadata can be added to some table. The fields will always be null. +#pragma warning disable CS0169 + // Export the classes that define the name, and base types + [Export(typeof(ClassificationTypeDefinition))] + [Name(Color1_ClassificationTypeName)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? Color1ClassificationTypeDefinition; + + [Export(typeof(ClassificationTypeDefinition))] + [Name(Color2_ClassificationTypeName)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? Color2ClassificationTypeDefinition; +#pragma warning restore CS0169 + + // Export the classes that define the colors and order + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = Color1_ClassificationTypeName)] + [Name("My Color #1")] + [UserVisible(true)] + [Order(After = Priority.High)] + sealed class Color1ClassificationFormatDefinition : ClassificationFormatDefinition { + Color1ClassificationFormatDefinition() => BackgroundBrush = Brushes.Green; + } + + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = Color2_ClassificationTypeName)] + [Name("My Color #2")] + [UserVisible(true)] + [Order(After = Priority.High)] + sealed class Color2ClassificationFormatDefinition : ClassificationFormatDefinition { + Color2ClassificationFormatDefinition() { + ForegroundBrush = Brushes.White; + BackgroundBrush = Brushes.Red; + } + } + } + + // Export our tagger provider. Each time a new text editor is created with our supported + // content type (TEXT), this class gets called to create the tagger. + [Export(typeof(ITaggerProvider))] + [TagType(typeof(IClassificationTag))] + [ContentType(ContentTypes.Text)] + sealed class TextTaggerProvider : ITaggerProvider { + readonly IClassificationTypeRegistryService classificationTypeRegistryService; + + [ImportingConstructor] + TextTaggerProvider(IClassificationTypeRegistryService classificationTypeRegistryService) => this.classificationTypeRegistryService = classificationTypeRegistryService; + + public ITagger? CreateTagger(ITextBuffer buffer) where T : ITag => + // All text content types (including C#/VB code) derive from the TEXT content + // type, so our tagger will get called to colorize every text file that's shown + // in a text editor. + new TextTagger(classificationTypeRegistryService) as ITagger; + } + + // This class gets called to colorize supported files + sealed class TextTagger : ITagger { + // We don't raise it, so add empty add/remove methods to prevent compiler warnings. + // This event must be raised when you detect changes to spans in the document. If + // your GetTags() method does async work, you should raise it when the async work + // is completed. + public event EventHandler? TagsChanged { + add { } + remove { } + } + + readonly IClassificationType color1; + readonly IClassificationType color2; + readonly IClassificationType color3; + readonly IClassificationType color4; + + public TextTagger(IClassificationTypeRegistryService classificationTypeRegistryService) { + // Get the classification types we need + color1 = classificationTypeRegistryService.GetClassificationType(Constants.Color1_ClassificationTypeName); + color2 = classificationTypeRegistryService.GetClassificationType(Constants.Color2_ClassificationTypeName); + // Get some classification types created by some other code + color3 = classificationTypeRegistryService.GetClassificationType(ThemeClassificationTypeNames.Yellow); + color4 = classificationTypeRegistryService.GetClassificationType(ThemeClassificationTypeNames.Error); + } + + // Gets called to colorize a range of the file. It's typically called once per visible line + public IEnumerable> GetTags(NormalizedSnapshotSpanCollection spans) { + if (spans.Count == 0) + yield break; + // All spans have the same snapshot since it's a normalized collection (sorted, and no span intersects any other span) + var snapshot = spans[0].Snapshot; + foreach (var span in spans) { + foreach (var word in GetWords(span.GetText())) { + // Create a new span. word.Item2 is the offset within the string, so add span.Start to + // get the offset in the snapshot. + var wordSpan = new SnapshotSpan(snapshot, new Span(span.Span.Start + word.offset, word.word.Length)); + if (word.word == "if") + yield return new TagSpan(wordSpan, new ClassificationTag(color3)); + else if (word.word.Length == 2) + yield return new TagSpan(wordSpan, new ClassificationTag(color1)); + else if (word.word.Length == 3) + yield return new TagSpan(wordSpan, new ClassificationTag(color2)); + else if (word.word.Length == 4) + yield return new TagSpan(wordSpan, new ClassificationTag(color4)); + else { + // Ignore the rest + } + } + } + } + + IEnumerable<(string word, int offset)> GetWords(string s) { + int offset = 0; + for (;;) { + while (offset < s.Length && char.IsWhiteSpace(s[offset])) + offset++; + int wordOffset = offset; + while (offset < s.Length && !char.IsWhiteSpace(s[offset])) + offset++; + if (wordOffset == offset) + break; + yield return (s.Substring(wordOffset, offset - wordOffset), wordOffset); + } + } + } +} diff --git a/Extensions/Examples/Example2.Extension/DocumentViewerToolTipProvider.cs b/Extensions/Examples/Example2.Extension/DocumentViewerToolTipProvider.cs new file mode 100644 index 0000000..2e73be4 --- /dev/null +++ b/Extensions/Examples/Example2.Extension/DocumentViewerToolTipProvider.cs @@ -0,0 +1,26 @@ +using dnSpy.Contracts.Documents.Tabs.DocViewer.ToolTips; +using dnSpy.Contracts.Text; + +namespace Example2.Extension { + // This reference is added to the "decompiled" code by ModuleChildNode.Decompile() + sealed class StringInfoReference { + public string Message { get; } + + public StringInfoReference(string msg) => Message = msg; + } + + // Called by dnSpy to create a tooltip when hovering over a reference in the text editor + [ExportDocumentViewerToolTipProvider] + sealed class DocumentViewerToolTipProvider : IDocumentViewerToolTipProvider { + public object? Create(IDocumentViewerToolTipProviderContext context, object? @ref) { + // This reference is added to the "decompiled" code by ModuleChildNode.Decompile() + if (@ref is StringInfoReference sref) { + var provider = context.Create(); + provider.Output.Write(BoxedTextColor.String, sref.Message); + return provider.Create(); + } + + return null; + } + } +} diff --git a/Extensions/Examples/Example2.Extension/Example2.Extension.csproj b/Extensions/Examples/Example2.Extension/Example2.Extension.csproj new file mode 100644 index 0000000..416531b --- /dev/null +++ b/Extensions/Examples/Example2.Extension/Example2.Extension.csproj @@ -0,0 +1,20 @@ + + + + + + Example2.Extension.x + enable + true + + + + + + + + + + + + diff --git a/Extensions/Examples/Example2.Extension/HexColorizer.cs b/Extensions/Examples/Example2.Extension/HexColorizer.cs new file mode 100644 index 0000000..a35b0ea --- /dev/null +++ b/Extensions/Examples/Example2.Extension/HexColorizer.cs @@ -0,0 +1,125 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Windows.Media; +using dnSpy.Contracts.Hex; +using dnSpy.Contracts.Hex.Tagging; +using dnSpy.Contracts.Text.Classification; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Utilities; + +namespace Example2.Extension { + // Define our classification types. A classification type is converted to a color + static class HexConstants { + // Use unique names + public const string HexColor1_ClassificationTypeName = "Example2.Extension.HexColor1"; + public const string HexColor2_ClassificationTypeName = "Example2.Extension.HexColor2"; + + // Disable compiler warnings. The fields aren't referenced, just exported so + // the metadata can be added to some table. The fields will always be null. +#pragma warning disable CS0169 + // Export the classes that define the name, and base types + [Export(typeof(ClassificationTypeDefinition))] + [Name(HexColor1_ClassificationTypeName)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? HexColor1ClassificationTypeDefinition; + + [Export(typeof(ClassificationTypeDefinition))] + [Name(HexColor2_ClassificationTypeName)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? HexColor2ClassificationTypeDefinition; +#pragma warning restore CS0169 + + // Export the classes that define the colors and order + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = HexColor1_ClassificationTypeName)] + [Name("My Hex Color #1")] + [UserVisible(true)] + [Order(After = Priority.High)] + sealed class Color1ClassificationFormatDefinition : ClassificationFormatDefinition { + Color1ClassificationFormatDefinition() => BackgroundBrush = Brushes.LightGray; + } + + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = HexColor2_ClassificationTypeName)] + [Name("My Hex Color #2")] + [UserVisible(true)] + [Order(After = Priority.High)] + sealed class Color2ClassificationFormatDefinition : ClassificationFormatDefinition { + Color2ClassificationFormatDefinition() { + ForegroundBrush = Brushes.White; + BackgroundBrush = Brushes.Red; + } + } + } + + // Export our tagger provider + [Export(typeof(HexTaggerProvider))] + [HexTagType(typeof(HexClassificationTag))] + sealed class HexTaggerProviderImpl : HexTaggerProvider { + readonly IClassificationTypeRegistryService classificationTypeRegistryService; + + [ImportingConstructor] + HexTaggerProviderImpl(IClassificationTypeRegistryService classificationTypeRegistryService) => this.classificationTypeRegistryService = classificationTypeRegistryService; + + public override IHexTagger? CreateTagger(HexBuffer buffer) => + new HexTaggerImpl(classificationTypeRegistryService) as IHexTagger; + } + + // This class gets called to colorize supported files + sealed class HexTaggerImpl : HexTagger { + // We don't raise it, so add empty add/remove methods to prevent compiler warnings. + // This event must be raised when you detect changes to spans in the document. If + // your GetTags() method does async work, you should raise it when the async work + // is completed. + public override event EventHandler? TagsChanged { + add { } + remove { } + } + + readonly IClassificationType color1; + readonly IClassificationType color2; + readonly IClassificationType color3; + readonly IClassificationType color4; + + public HexTaggerImpl(IClassificationTypeRegistryService classificationTypeRegistryService) { + // Get the classification types we need + color1 = classificationTypeRegistryService.GetClassificationType(HexConstants.HexColor1_ClassificationTypeName); + color2 = classificationTypeRegistryService.GetClassificationType(HexConstants.HexColor2_ClassificationTypeName); + // Get some classification types created by some other code + color3 = classificationTypeRegistryService.GetClassificationType(ThemeClassificationTypeNames.Yellow); + color4 = classificationTypeRegistryService.GetClassificationType(ThemeClassificationTypeNames.Error); + } + + // Called to classify a span of data, it can only classify bytes, not characters on a line + public override IEnumerable> GetTags(NormalizedHexBufferSpanCollection spans) { + if (spans.Count == 0) + yield break; + + var ourSpan = new HexBufferSpan(spans[0].Buffer, 10, 128); + foreach (var span in spans) { + if (!span.IntersectsWith(ourSpan)) + continue; + + // Classify both columns (values and ASCII) + yield return new HexTagSpan(ourSpan, HexSpanSelectionFlags.Selection, new HexClassificationTag(color2)); + } + } + + // Called to classify a view line, any character on the line can be classified + public override IEnumerable> GetTags(HexTaggerContext context) { + // Highlight every 16th line + if (context.Line.LineNumber.ToUInt64() % 16 == 0) + yield return new HexTextTagSpan(context.LineSpan, new HexClassificationTag(color1)); + + // If there are too many zeroes, change the color of the line + int zeroes = 0; + for (int i = 0; i < context.Line.HexBytes.Length; i++) { + if (context.Line.HexBytes.TryReadByte(i) == 0) + zeroes++; + } + if (zeroes >= context.Line.HexBytes.Length / 3) + yield return new HexTextTagSpan(context.LineSpan, new HexClassificationTag(color4)); + } + } +} diff --git a/Extensions/Examples/Example2.Extension/NewDsDocument.cs b/Extensions/Examples/Example2.Extension/NewDsDocument.cs new file mode 100644 index 0000000..ecb5ab7 --- /dev/null +++ b/Extensions/Examples/Example2.Extension/NewDsDocument.cs @@ -0,0 +1,122 @@ +using System; +using System.ComponentModel.Composition; +using System.IO; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Documents.Tabs.DocViewer; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; + +// Adds a new IDsDocument that can be loaded into the document treeview. It gets its own DsDocumentNode. +// Open a .txt/.xml/.cs/.vb (see supportedExtensions) file to trigger this code. + +namespace Example2.Extension { + // All root nodes in the document treeview contain a IDsDocument instance. They don't need to be + // .NET files or even PE files, they can be any file or even non-file (eg. in-memory data). + sealed class MyDsDocument : DsDocument { + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("9058B02C-1FE0-4EC4-93D3-A378D4B6FCE1"); + + // We support serialization, so return a non-null value + public override DsDocumentInfo? SerializedDocument => new DsDocumentInfo(Filename, THE_GUID); + + // Since we open files from disk, we return a FilenameKey. + // If this gets changed, also update MyDsDocumentProvider.CreateKey() + public override IDsDocumentNameKey Key => new FilenameKey(Filename); + + // Used by MyDsDocumentNode.Decompile() to show the file in the text editor + public string Text { + get { + if (text is not null) + return text; + try { + return text = File.ReadAllText(Filename); + } + catch { + return text = $"Couldn't read the file: {Filename}"; + } + } + } + string? text; + + public static MyDsDocument? TryCreate(string filename) { + if (!File.Exists(filename)) + return null; + return new MyDsDocument(filename); + } + + MyDsDocument(string filename) => Filename = filename; + } + + // Gets called by the IDsDocumentService instance to create IDsDocument instances. If it's a .txt file + // or our MyDsDocument.THE_GUID, then create a MyDsDocument instance. + [Export(typeof(IDsDocumentProvider))] + sealed class MyDsDocumentProvider : IDsDocumentProvider { + public double Order => 0; + + public IDsDocument? Create(IDsDocumentService documentService, DsDocumentInfo documentInfo) { + if (documentInfo.Type == MyDsDocument.THE_GUID) + return MyDsDocument.TryCreate(documentInfo.Name); + // Also check for normal files + if (documentInfo.Type == DocumentConstants.DOCUMENTTYPE_FILE && IsSupportedFile(documentInfo.Name)) + return MyDsDocument.TryCreate(documentInfo.Name); + return null; + } + + public IDsDocumentNameKey? CreateKey(IDsDocumentService documentService, DsDocumentInfo documentInfo) { + if (documentInfo.Type == MyDsDocument.THE_GUID) + return new FilenameKey(documentInfo.Name); // Must match the key in MyDsDocument.Key + // Also check for normal files + if (documentInfo.Type == DocumentConstants.DOCUMENTTYPE_FILE && IsSupportedFile(documentInfo.Name)) + return new FilenameKey(documentInfo.Name); // Must match the key in MyDsDocument.Key + return null; + } + + static bool IsSupportedFile(string filename) { + foreach (var ext in supportedExtensions) { + if (filename.EndsWith(ext, StringComparison.OrdinalIgnoreCase)) + return true; + } + return false; + } + static readonly string[] supportedExtensions = new string[] { + ".txt", ".xml", ".cs", ".vb", + }; + } + + // Gets called by dnSpy to create a DsDocumentNode + [ExportDsDocumentNodeProvider] + sealed class MyDsDocumentNodeProvider : IDsDocumentNodeProvider { + public DsDocumentNode? Create(IDocumentTreeView documentTreeView, DsDocumentNode? owner, IDsDocument document) { + if (document is MyDsDocument myDocument) + return new MyDsDocumentNode(myDocument); + return null; + } + } + + // Our MyDsDocument tree node class. It implements IDecompileSelf to "decompile" itself. You could + // also export a IDecompileNode instance to do it, see TreeNodeDataProvider.cs for an example. + // Or you could create a completely new DocumentTabContent for these nodes, see AssemblyChildNodeTabContent.cs + sealed class MyDsDocumentNode : DsDocumentNode, IDecompileSelf { + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("4174A21D-D746-4658-9A44-DB8235EE5186"); + + readonly MyDsDocument document; + + public override Guid Guid => THE_GUID; + + public MyDsDocumentNode(MyDsDocument document) + : base(document) => this.document = document; + + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => DsImages.TextFile; + protected override void WriteCore(ITextColorWriter output, IDecompiler decompiler, DocumentNodeWriteOptions options) => + output.WriteFilename(Path.GetFileName(document.Filename)); + + public bool Decompile(IDecompileNodeContext context) { + context.ContentTypeString = ContentTypes.PlainText; + context.Output.Write(document.Text, BoxedTextColor.Text); + return true; + } + } +} diff --git a/Extensions/Examples/Example2.Extension/OutputTextPane.cs b/Extensions/Examples/Example2.Extension/OutputTextPane.cs new file mode 100644 index 0000000..1488fd2 --- /dev/null +++ b/Extensions/Examples/Example2.Extension/OutputTextPane.cs @@ -0,0 +1,92 @@ +using System; +using System.ComponentModel.Composition; +using System.Diagnostics; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.Output; +using dnSpy.Contracts.Text; + +// Creates an Output window text pane where our log messages will go. +// Adds context menu commands. + +namespace Example2.Extension { + // Holds an instance of our logger text pane + static class MyLogger { + //TODO: Use your own GUID + public static readonly Guid THE_GUID = new Guid("26F2F5B2-9C5A-4F99-A026-4946A068500F"); + + public static IOutputTextPane Instance { + get { + if (_instance is null) + throw new InvalidOperationException("Logger hasn't been initialized yet"); + return _instance; + } + set { + if (_instance is not null) + throw new InvalidOperationException("Can't initialize the logger twice"); + _instance = value ?? throw new ArgumentNullException(nameof(value)); + } + } + static IOutputTextPane? _instance; + + // This class initializes the Logger property. It gets auto loaded by dnSpy + [ExportAutoLoaded(Order = double.MinValue)] + sealed class InitializeLogger : IAutoLoaded { + [ImportingConstructor] + InitializeLogger(IOutputService outputService) { + Instance = outputService.Create(THE_GUID, "My Logger"); + Instance.WriteLine("Logger initialized!"); + } + } + } + + sealed class LogEditorCtxMenuContext { + public readonly IOutputTextPane TextPane; + + public LogEditorCtxMenuContext(IOutputTextPane pane) => TextPane = pane; + } + + abstract class LogEditorCtxMenuCommand : MenuItemBase { + protected sealed override object CachedContextKey => ContextKey; + static readonly object ContextKey = new object(); + + protected sealed override LogEditorCtxMenuContext? CreateContext(IMenuItemContext context) { + // Check if it's the Output window + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_LOG_TEXTEDITORCONTROL_GUID)) + return null; + + // Get the text pane if any + var textPane = context.Find(); + if (textPane is null) + return null; + + // Check if it's our logger text pane + if (textPane.Guid != MyLogger.THE_GUID) + return null; + + Debug.Assert(textPane == MyLogger.Instance); + + return new LogEditorCtxMenuContext(textPane); + } + } + + // GROUP_CTX_OUTPUT_USER_COMMANDS can be used for user commands, like our commands below: + [ExportMenuItem(Header = "Write Hello to the Log", Group = MenuConstants.GROUP_CTX_OUTPUT_USER_COMMANDS, Order = 0)] + sealed class WriteHelloCtxMenuCommand : LogEditorCtxMenuCommand { + public override void Execute(LogEditorCtxMenuContext context) { + context.TextPane.Write(TextColor.Blue, "H"); + context.TextPane.Write(TextColor.Red, "E"); + context.TextPane.Write(TextColor.Green, "L"); + context.TextPane.Write(TextColor.Yellow, "L"); + context.TextPane.Write(TextColor.Cyan, "O"); + context.TextPane.Write(TextColor.Gray, "!"); + context.TextPane.WriteLine(); + } + } + + [ExportMenuItem(Header = "Open the Pod Bay Doors", Group = MenuConstants.GROUP_CTX_OUTPUT_USER_COMMANDS, Order = 10)] + sealed class ShowExceptionMessagesCtxMenuCommand : LogEditorCtxMenuCommand { + public override void Execute(LogEditorCtxMenuContext context) => + context.TextPane.WriteLine(TextColor.Error, "I'm afraid I can't do that."); + } +} diff --git a/Extensions/Examples/Example2.Extension/README.md b/Extensions/Examples/Example2.Extension/README.md new file mode 100644 index 0000000..b7cca4f --- /dev/null +++ b/Extensions/Examples/Example2.Extension/README.md @@ -0,0 +1,12 @@ + +This extension shows how to do more advanced stuff. It: + +- Adds a tool window (ToolWindowContent.cs) +- Adds new tree nodes (TreeNodeDataProvider.cs) +- Adds custom tab content for the new AssemblyChildNode tree node (AssemblyChildNodeTabContent.cs). ModuleChildNode implements IDecompileSelf to decompile itself. +- Shows tooltips when hovering over custom references added to the text editor (DocumentViewerToolTipProvider.cs) +- Adds a new IDsDocument instance and DsDocumentNode node (NewDsDocument.cs). It opens .txt files and shows the output in the text editor. +- Colorizes text in text editors (Colorizer.cs) +- Colorizes text in hex editors (HexColorizer.cs) +- Colorizes Assembly Explorer treeview nodes (TreeViewNodeColorizer.cs) +- Adds a new Output window text pane (OutputTextPane.cs) diff --git a/Extensions/Examples/Example2.Extension/TheExtension.cs b/Extensions/Examples/Example2.Extension/TheExtension.cs new file mode 100644 index 0000000..89bebdc --- /dev/null +++ b/Extensions/Examples/Example2.Extension/TheExtension.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; +using dnSpy.Contracts.Extension; + +// Each extension should export one class implementing IExtension + +namespace Example2.Extension { + [ExportExtension] + sealed class TheExtension : IExtension { + public IEnumerable MergedResourceDictionaries { + get { + yield return "Themes/resourcedict.xaml"; + } + } + + public ExtensionInfo ExtensionInfo => new ExtensionInfo { + ShortDescription = "Example2 extension", + }; + + public void OnEvent(ExtensionEvent @event, object? obj) { + // We don't care about any events + } + } +} diff --git a/Extensions/Examples/Example2.Extension/Themes/resourcedict.xaml b/Extensions/Examples/Example2.Extension/Themes/resourcedict.xaml new file mode 100644 index 0000000..f25205a --- /dev/null +++ b/Extensions/Examples/Example2.Extension/Themes/resourcedict.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/Extensions/Examples/Example2.Extension/ToolWindowContent.cs b/Extensions/Examples/Example2.Extension/ToolWindowContent.cs new file mode 100644 index 0000000..05c198f --- /dev/null +++ b/Extensions/Examples/Example2.Extension/ToolWindowContent.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Windows; +using System.Windows.Input; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.ToolWindows; +using dnSpy.Contracts.ToolWindows.App; + +// Adds a tool window and a command that will show it. The command is added to the View menu and a +// keyboard shortcut is added to the main window. Keyboard shortcut Ctrl+Alt+Z shows the tool window. + +namespace Example2.Extension { + // Adds the 'OpenToolWindow' command to the main window and sets keyboard shortcut to Ctrl+Alt+Z + [ExportAutoLoaded] + sealed class ToolWindowLoader : IAutoLoaded { + public static readonly RoutedCommand OpenToolWindow = new RoutedCommand("OpenToolWindow", typeof(ToolWindowLoader)); + + [ImportingConstructor] + ToolWindowLoader(IWpfCommandService wpfCommandService, IDsToolWindowService toolWindowService) { + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_MAINWINDOW); + cmds.Add(OpenToolWindow, new RelayCommand(a => toolWindowService.Show(ToolWindowContentImpl.THE_GUID))); + cmds.Add(OpenToolWindow, ModifierKeys.Control | ModifierKeys.Alt, Key.Z); + } + } + + // Adds a menu item to the View menu to show the tool window + [ExportMenuItem(OwnerGuid = MenuConstants.APP_MENU_VIEW_GUID, Header = "Extension Tool Window", InputGestureText = "Ctrl+Alt+Z", Group = MenuConstants.GROUP_APP_MENU_VIEW_WINDOWS, Order = 2000)] + sealed class ViewCommand1 : MenuItemCommand { + ViewCommand1() + : base(ToolWindowLoader.OpenToolWindow) { + } + } + + // Dummy dependency "needed" by MainToolWindowContentProvider + [Export] + sealed class DeppDep { + public void Hello() { + } + } + + // Called by dnSpy to create the tool window + [Export(typeof(IToolWindowContentProvider))] + sealed class MainToolWindowContentProvider : IToolWindowContentProvider { + // Caches the created tool window + ToolWindowContentImpl ToolWindowContent => myToolWindowContent ??= new ToolWindowContentImpl(); + ToolWindowContentImpl? myToolWindowContent; + + // Add any deps to the constructor if needed, else remove the constructor + [ImportingConstructor] + MainToolWindowContentProvider(DeppDep deppDep) => deppDep.Hello(); + + // Lets dnSpy know which tool windows it can create and their default locations + public IEnumerable ContentInfos { + get { yield return new ToolWindowContentInfo(ToolWindowContentImpl.THE_GUID, ToolWindowContentImpl.DEFAULT_LOCATION, 0, false); } + } + + // Called by dnSpy. If it's your tool window guid, return the instance. Make sure it's + // cached since it can be called multiple times. + public ToolWindowContent? GetOrCreate(Guid guid) { + if (guid == ToolWindowContentImpl.THE_GUID) + return ToolWindowContent; + return null; + } + } + + sealed class ToolWindowContentImpl : ToolWindowContent { + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("18785447-21A8-41DB-B8AD-0F166AEC0D08"); + public const AppToolWindowLocation DEFAULT_LOCATION = AppToolWindowLocation.DefaultHorizontal; + + public override Guid Guid => THE_GUID; + public override string Title => "Extension Example"; + + // This is the object shown in the UI. Return a WPF object or a .NET object with a DataTemplate + public override object? UIObject => toolWindowControl; + + // The element inside UIObject that gets the focus when the tool window should be focused. + // If it's not as easy as calling FocusedElement.Focus() to focus it, you must implement + // dnSpy.Contracts.Controls.IFocusable. + public override IInputElement? FocusedElement => toolWindowControl.option1TextBox; + + // The element that gets scaled when the user zooms in or out. Return null if zooming isn't + // possible + public override FrameworkElement? ZoomElement => toolWindowControl; + + readonly ToolWindowControl toolWindowControl; + readonly ToolWindowVM toolWindowVM; + + public ToolWindowContentImpl() { + toolWindowControl = new ToolWindowControl(); + toolWindowVM = new ToolWindowVM(); + toolWindowControl.DataContext = toolWindowVM; + } + + // Gets notified when the content gets hidden, visible, etc. Can be used to tell the view + // model to stop doing stuff when it gets hidden in case it does a lot of work. + public override void OnVisibilityChanged(ToolWindowContentVisibilityEvent visEvent) { + switch (visEvent) { + case ToolWindowContentVisibilityEvent.Added: + toolWindowVM.IsEnabled = true; + break; + + case ToolWindowContentVisibilityEvent.Removed: + toolWindowVM.IsEnabled = false; + break; + + case ToolWindowContentVisibilityEvent.Visible: + toolWindowVM.IsVisible = true; + break; + + case ToolWindowContentVisibilityEvent.Hidden: + toolWindowVM.IsVisible = false; + break; + } + } + } + + sealed class ToolWindowVM : ViewModelBase { + public string StringOption1 { + get => stringOption1; + set { + if (stringOption1 != value) { + stringOption1 = value; + OnPropertyChanged(nameof(StringOption1)); + } + } + } + string stringOption1 = string.Empty; + + public string StringOption2 { + get => stringOption2; + set { + if (stringOption2 != value) { + stringOption2 = value; + OnPropertyChanged(nameof(StringOption2)); + } + } + } + string stringOption2 = string.Empty; + + public string StringOption3 { + get => stringOption3; + set { + if (stringOption3 != value) { + stringOption3 = value; + OnPropertyChanged(nameof(StringOption3)); + } + } + } + string stringOption3 = string.Empty; + + public string StringOption4 { + get => stringOption4; + set { + if (stringOption4 != value) { + stringOption4 = value; + OnPropertyChanged(nameof(StringOption4)); + } + } + } + string stringOption4 = string.Empty; + + public bool IsEnabled { get; set; } + public bool IsVisible { get; set; } + } +} diff --git a/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml b/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml new file mode 100644 index 0000000..557e3e2 --- /dev/null +++ b/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + diff --git a/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml.cs b/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml.cs new file mode 100644 index 0000000..cb5a9a5 --- /dev/null +++ b/Extensions/Examples/Example2.Extension/ToolWindowControl.xaml.cs @@ -0,0 +1,7 @@ +using System.Windows.Controls; + +namespace Example2.Extension { + public partial class ToolWindowControl : UserControl { + public ToolWindowControl() => InitializeComponent(); + } +} diff --git a/Extensions/Examples/Example2.Extension/TreeNodeDataProvider.cs b/Extensions/Examples/Example2.Extension/TreeNodeDataProvider.cs new file mode 100644 index 0000000..a87941d --- /dev/null +++ b/Extensions/Examples/Example2.Extension/TreeNodeDataProvider.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.Tabs.DocViewer; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +// This file contains classes that create new child nodes of IAssemblyFileNode and IModuleFileNode + +namespace Example2.Extension { + // This class adds a new child node to all assembly nodes + [ExportTreeNodeDataProvider(Guid = DocumentTreeViewConstants.ASSEMBLY_NODE_GUID)] + sealed class AssemblyTreeNodeDataProvider : ITreeNodeDataProvider { + public IEnumerable Create(TreeNodeDataProviderContext context) { + yield return new AssemblyChildNode(); + } + } + + // This class adds a new child node to all module nodes + [ExportTreeNodeDataProvider(Guid = DocumentTreeViewConstants.MODULE_NODE_GUID)] + sealed class ModuleTreeNodeDataProvider : ITreeNodeDataProvider { + public IEnumerable Create(TreeNodeDataProviderContext context) { + yield return new ModuleChildNode(); + } + } + + sealed class AssemblyChildNode : DocumentTreeNodeData { // All file tree nodes should implement DocumentTreeNodeData or derive from DocumentTreeNodeData + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("6CF91674-16CE-44EA-B9E8-80B68C327D30"); + + public override Guid Guid => THE_GUID; + public override NodePathName NodePathName => new NodePathName(Guid); + + // The image must be in an Images folder (in the resources) and have a .png extension + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => DsImages.EntryPoint; + + protected override void WriteCore(ITextColorWriter output, IDecompiler decompiler, DocumentNodeWriteOptions options) => + output.Write(BoxedTextColor.Text, "Assembly Child"); + + // If you don't want the node to be appended to the children, override this + public override ITreeNodeGroup? TreeNodeGroup => TreeNodeGroupImpl.Instance; + + sealed class TreeNodeGroupImpl : ITreeNodeGroup { + public static readonly TreeNodeGroupImpl Instance = new TreeNodeGroupImpl(1); + + public TreeNodeGroupImpl(double order) => Order = order; + + public double Order { get; } + + public int Compare([AllowNull] TreeNodeData x, [AllowNull] TreeNodeData y) { + if (x == y) + return 0; + var a = x as AssemblyChildNode; + var b = y as AssemblyChildNode; + if (a is null) return -1; + if (b is null) return 1; + // More checks can be added here... + return 0; + } + } + } + + // This class can decompile its own output and implements IDecompileSelf + sealed class ModuleChildNode : DocumentTreeNodeData, IDecompileSelf { // All file tree nodes should implement DocumentTreeNodeData or derive from DocumentTreeNodeData + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("C8892F6C-6A49-4537-AAA0-D0DEF1E87277"); + + public override Guid Guid => THE_GUID; + public override NodePathName NodePathName => new NodePathName(Guid); + + // Initialize() is called after the constructor has been called, and after the TreeNode prop + // has been initialized + public override void Initialize() => + // Set LazyLoading if creating the children could take a while + TreeNode.LazyLoading = true; + + // If TreeNode.LazyLoading is false, CreateChildren() is called after Initialize(), else it's + // called when this node gets expanded. + public override IEnumerable CreateChildren() { + // Add some children in random order. They will be sorted because SomeMessageNode + // overrides the TreeNodeGroup prop. + yield return new SomeMessageNode("ZZZZZZZZZZZZZ"); + yield return new SomeMessageNode("AAAAaaaaaAAAAAAA"); + yield return new SomeMessageNode("SAY"); + } + + // The image must be in an Images folder (in the resources) and have a .png extension + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => DsImages.String; + + protected override void WriteCore(ITextColorWriter output, IDecompiler decompiler, DocumentNodeWriteOptions options) => output.Write(BoxedTextColor.Text, "Module Child"); + + // Gets called by dnSpy if there's only one node to decompile. This method gets called in a + // worker thread. The output is also cached unless you call IDocumentViewerOutput.DisableCaching(). + public bool Decompile(IDecompileNodeContext context) { + // Pretend we actually do something... + Thread.Sleep(2000); + + // If you don't want the output to be cached, call DisableCaching() + bool cacheOutput = true; + if (!cacheOutput) + (context.Output as IDocumentViewerOutput)?.DisableCaching(); + + // Create the output and a few references that other code in this extension will use, eg. + // to show a tooltip when hovering over the reference. + context.ContentTypeString = ContentTypes.CSharp; + context.Output.WriteLine("// Initialize it to the secret key", BoxedTextColor.Comment); + context.Output.Write("int", new StringInfoReference("This is a reference added by the code"), DecompilerReferenceFlags.None, BoxedTextColor.Keyword); + context.Output.Write(" ", BoxedTextColor.Text); + context.Output.Write("secret", new StringInfoReference("The real secret is actually 42 not 1234"), DecompilerReferenceFlags.None, BoxedTextColor.Local); + context.Output.Write(" ", BoxedTextColor.Text); + context.Output.Write("=", BoxedTextColor.Operator); + context.Output.Write(" ", BoxedTextColor.Text); + context.Output.Write("1234", BoxedTextColor.Number); + context.Output.Write(";", BoxedTextColor.Punctuation); + context.Output.WriteLine(); + + // We decompiled ourselves so return true + return true; + } + + // If you don't want the node to be appended to the children, override this + public override ITreeNodeGroup? TreeNodeGroup => TreeNodeGroupImpl.Instance; + + sealed class TreeNodeGroupImpl : ITreeNodeGroup { + // Make sure the order is unique. 0 is already used by the PE node, so use 1 + public static readonly TreeNodeGroupImpl Instance = new TreeNodeGroupImpl(1); + + public TreeNodeGroupImpl(double order) => Order = order; + + public double Order { get; } + + public int Compare([AllowNull] TreeNodeData x, [AllowNull] TreeNodeData y) { + if (x == y) + return 0; + var a = x as ModuleChildNode; + var b = y as ModuleChildNode; + if (a is null) return -1; + if (b is null) return 1; + // More checks can be added here... + return 0; + } + } + } + + sealed class SomeMessageNode : DocumentTreeNodeData { + //TODO: Use your own guid + public static readonly Guid THE_GUID = new Guid("1751CD40-68CE-4F8A-84AF-99371B6FD843"); + + public string Message { get; } + + public SomeMessageNode(string msg) => Message = msg; + + public override Guid Guid => THE_GUID; + public override NodePathName NodePathName => new NodePathName(THE_GUID, Message); + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => DsImages.String; + + protected override void WriteCore(ITextColorWriter output, IDecompiler decompiler, DocumentNodeWriteOptions options) => + output.Write(BoxedTextColor.Comment, Message); + + public override ITreeNodeGroup? TreeNodeGroup => TreeNodeGroupImpl.Instance; + + sealed class TreeNodeGroupImpl : ITreeNodeGroup { + public static readonly TreeNodeGroupImpl Instance = new TreeNodeGroupImpl(0); + + public TreeNodeGroupImpl(double order) => Order = order; + + public double Order { get; } + + public int Compare([AllowNull] TreeNodeData x, [AllowNull] TreeNodeData y) { + if (x == y) + return 0; + var a = x as SomeMessageNode; + var b = y as SomeMessageNode; + if (a is null) return -1; + if (b is null) return 1; + return StringComparer.OrdinalIgnoreCase.Compare(a.Message, b.Message); + } + } + } + + // SomeMessageNode doesn't implement IDecompileSelf, so we add a "decompiler" that can "decompile" + // those nodes. + [ExportDecompileNode] + sealed class SomeMessageNodeDecompiler : IDecompileNode { + public bool Decompile(IDecompileNodeContext context, DocumentTreeNodeData node) { + var msgNode = node as SomeMessageNode; + if (msgNode is null) + return false; + + context.Decompiler.WriteCommentLine(context.Output, "The secret message has been decrypted."); + context.Decompiler.WriteCommentLine(context.Output, $"The message is: {msgNode.Message}"); + context.ContentTypeString = ContentTypes.PlainText; + return true; + } + } +} diff --git a/Extensions/Examples/Example2.Extension/TreeViewNodeColorizer.cs b/Extensions/Examples/Example2.Extension/TreeViewNodeColorizer.cs new file mode 100644 index 0000000..2def6cb --- /dev/null +++ b/Extensions/Examples/Example2.Extension/TreeViewNodeColorizer.cs @@ -0,0 +1,91 @@ +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Windows.Media; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Text.Classification; +using dnSpy.Contracts.TreeView.Text; +using Microsoft.VisualStudio.Text; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Utilities; + +// Adds an underline to Assembly Explorer nodes: Assembly / Method +// Adds light green background in the middle of all text + +namespace Example2.Extension { + static class TreeViewNodeColorizerClassifications { + public const string UnderlineClassificationType = "Example2.Extension.UnderlineClassificationType"; + public const string LightgreenBackgroundClassificationType = "Example2.Extension.LightgreenBackgroundClassificationType"; + + // Disable compiler warnings. The fields aren't referenced, just exported so + // the metadata can be added to some table. The fields will always be null. +#pragma warning disable CS0169 + // Export the classes that define the name, and base types + [Export(typeof(ClassificationTypeDefinition))] + [Name(UnderlineClassificationType)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? UnderlineClassificationTypeDefinition; + + [Export(typeof(ClassificationTypeDefinition))] + [Name(LightgreenBackgroundClassificationType)] + [BaseDefinition(PredefinedClassificationTypeNames.FormalLanguage)] + static ClassificationTypeDefinition? LightgreenBackgroundClassificationTypeDefinition; +#pragma warning restore CS0169 + + // Export the classes that define the colors and order + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = UnderlineClassificationType)] + [Name("Underline")] + [UserVisible(true)] + [Order(After = Priority.Default)] + sealed class UnderlineClassificationFormatDefinition : ClassificationFormatDefinition { + UnderlineClassificationFormatDefinition() => TextDecorations = System.Windows.TextDecorations.Underline; + } + + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = LightgreenBackgroundClassificationType)] + [Name("Lightgreen Background")] + [UserVisible(true)] + [Order(After = Priority.Default)] + sealed class LightGreenBackgroundClassificationFormatDefinition : ClassificationFormatDefinition { + LightGreenBackgroundClassificationFormatDefinition() => BackgroundBrush = Brushes.LightGreen; + } + } + + [Export(typeof(ITextClassifierProvider))] + // You can also add more content types or use the base content type TreeViewContentTypes.TreeViewNode + [ContentType(TreeViewContentTypes.TreeViewNodeAssemblyExplorer)] + sealed class TreeViewNodeColorizerProvider : ITextClassifierProvider { + readonly IClassificationTypeRegistryService classificationTypeRegistryService; + + [ImportingConstructor] + TreeViewNodeColorizerProvider(IClassificationTypeRegistryService classificationTypeRegistryService) => this.classificationTypeRegistryService = classificationTypeRegistryService; + + public ITextClassifier? Create(IContentType contentType) => new TreeViewNodeColorizer(classificationTypeRegistryService); + } + + sealed class TreeViewNodeColorizer : ITextClassifier { + readonly IClassificationTypeRegistryService classificationTypeRegistryService; + + public TreeViewNodeColorizer(IClassificationTypeRegistryService classificationTypeRegistryService) => this.classificationTypeRegistryService = classificationTypeRegistryService; + + public IEnumerable GetTags(TextClassifierContext context) { + var tvContext = context as TreeViewNodeClassifierContext; + if (tvContext is null) + yield break; + + // Don't do a thing if it's a tooltip + if (tvContext.IsToolTip) + yield break; + + // Add the underline + if (tvContext.Node is AssemblyDocumentNode || tvContext.Node is MethodNode) { + yield return new TextClassificationTag(new Span(0, context.Text.Length), + classificationTypeRegistryService.GetClassificationType(TreeViewNodeColorizerClassifications.UnderlineClassificationType)); + } + + // Add light green background in the middle of the text + yield return new TextClassificationTag(new Span(context.Text.Length / 4, context.Text.Length / 2), + classificationTypeRegistryService.GetClassificationType(TreeViewNodeColorizerClassifications.LightgreenBackgroundClassificationType)); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/AssemblyInfoTransform.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/AssemblyInfoTransform.cs new file mode 100644 index 0000000..3be97f1 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/AssemblyInfoTransform.cs @@ -0,0 +1,71 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using ICSharpCode.Decompiler.Ast.Transforms; +using ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + sealed class AssemblyInfoTransform : IAstTransform { + public void Run(AstNode compilationUnit) { + foreach (var attrSect in compilationUnit.Descendants.OfType()) { + var attr = attrSect.Descendants.OfType().FirstOrDefault(); + Debug2.Assert(attr is not null); + if (attr is null) + continue; + bool remove = false; + if (!remove && attr.Annotation() is CustomAttribute ca) { + remove = + Compare(ca.AttributeType, systemRuntimeVersioningString, targetFrameworkAttributeString) || + Compare(ca.AttributeType, systemSecurityString, unverifiableCodeAttributeString) || + Compare(ca.AttributeType, systemRuntimeCompilerServicesyString, compilationRelaxationsAttributeString) || + Compare(ca.AttributeType, systemRuntimeCompilerServicesyString, runtimeCompatibilityAttributeString) || + Compare(ca.AttributeType, systemDiagnosticsString, debuggableAttributeString); + } + if (!remove && attr.Annotation() is SecurityAttribute) + remove = true; + if (remove) + attrSect.Remove(); + } + } + static readonly UTF8String systemRuntimeVersioningString = new UTF8String("System.Runtime.Versioning"); + static readonly UTF8String targetFrameworkAttributeString = new UTF8String("TargetFrameworkAttribute"); + static readonly UTF8String systemSecurityString = new UTF8String("System.Security"); + static readonly UTF8String unverifiableCodeAttributeString = new UTF8String("UnverifiableCodeAttribute"); + static readonly UTF8String systemRuntimeCompilerServicesyString = new UTF8String("System.Runtime.CompilerServices"); + static readonly UTF8String compilationRelaxationsAttributeString = new UTF8String("CompilationRelaxationsAttribute"); + static readonly UTF8String runtimeCompatibilityAttributeString = new UTF8String("RuntimeCompatibilityAttribute"); + static readonly UTF8String systemDiagnosticsString = new UTF8String("System.Diagnostics"); + static readonly UTF8String debuggableAttributeString = new UTF8String("DebuggableAttribute"); + + static bool Compare(ITypeDefOrRef type, UTF8String expNs, UTF8String expName) { + if (type is null) + return false; + + if (type is TypeRef tr) + return tr.Namespace == expNs && tr.Name == expName; + if (type is TypeDef td) + return td.Namespace == expNs && td.Name == expName; + + return false; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderCache.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderCache.cs new file mode 100644 index 0000000..5f42b6e --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderCache.cs @@ -0,0 +1,90 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Text; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.Ast; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + ///

+ /// State for one decompiler thread. There should be at most one of these per CPU. This class + /// is not thread safe and must only be accessed by the owner thread. + /// + sealed class AstBuilderState { + public readonly AstBuilder AstBuilder; + + /// + /// instance used by XML doc code. This is always in a random + /// state (random text) and caller must Clear() it before use. + /// + public readonly StringBuilder XmlDoc_StringBuilder; + + readonly Dictionary hasXmlDocFile; + ModuleDef? lastModule; + bool lastModuleResult; + + public AstBuilderState(int settingsVersion) { + AstBuilder = new AstBuilder(new DecompilerContext(settingsVersion, null, null, true)); + XmlDoc_StringBuilder = new StringBuilder(); + hasXmlDocFile = new Dictionary(); + } + + public bool? HasXmlDocFile(ModuleDef module) { + if (lastModule == module) + return lastModuleResult; + if (hasXmlDocFile.TryGetValue(module, out var res)) { + lastModule = module; + lastModuleResult = res; + return res; + } + return null; + } + + public void SetHasXmlDocFile(ModuleDef module, bool value) { + lastModule = module; + lastModuleResult = value; + hasXmlDocFile.Add(module, value); + } + + /// + /// Called to re-use this instance for another decompilation. Only the fields that need + /// resetting will be reset. + /// + public void Reset() => AstBuilder.Reset(); + } + + /// + /// One instance is created and stored in . It's used by the + /// decompiler threads to get an instance. + /// + sealed class BuilderCache { + readonly ThreadSafeObjectPool astBuilderStatePool; + + public BuilderCache(int settingsVersion) => astBuilderStatePool = new ThreadSafeObjectPool(Environment.ProcessorCount, () => new AstBuilderState(settingsVersion), resetAstBuilderState); + + static readonly Action resetAstBuilderState = abs => abs.Reset(); + + public AstBuilderState AllocateAstBuilderState() => astBuilderStatePool.Allocate(); + public void Free(AstBuilderState state) => astBuilderStatePool.Free(state); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderState.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderState.cs new file mode 100644 index 0000000..30a3065 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/BuilderState.cs @@ -0,0 +1,45 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using dnSpy.Contracts.Decompiler; +using ICSharpCode.Decompiler.Ast; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + /// + /// Gets the from the pool and returns it when + /// gets called. + /// + struct BuilderState : IDisposable { + public AstBuilder AstBuilder => State.AstBuilder; + + public readonly AstBuilderState State; + readonly BuilderCache cache; + + public BuilderState(DecompilationContext ctx, BuilderCache cache, MetadataTextColorProvider metadataTextColorProvider) { + this.cache = cache; + State = cache.AllocateAstBuilderState(); + State.AstBuilder.Context.CalculateILSpans = ctx.CalculateILSpans; + State.AstBuilder.Context.MetadataTextColorProvider = metadataTextColorProvider; + State.AstBuilder.Context.AsyncMethodBodyDecompilation = ctx.AsyncMethodBodyDecompilation; + } + + public void Dispose() => cache.Free(State); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/CSharpDecompiler.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/CSharpDecompiler.cs new file mode 100644 index 0000000..55b949f --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/CSharpDecompiler.cs @@ -0,0 +1,525 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Xml; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Decompiler.XmlDoc; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.ILSpy.Core.Settings; +using dnSpy.Decompiler.ILSpy.Core.Text; +using dnSpy.Decompiler.ILSpy.Core.XmlDoc; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.Ast; +using ICSharpCode.Decompiler.Ast.Transforms; +using ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + sealed class DecompilerProvider : IDecompilerProvider { + readonly DecompilerSettingsService decompilerSettingsService; + + // Keep the default ctor. It's used by dnSpy.Console.exe + public DecompilerProvider() + : this(DecompilerSettingsService.__Instance_DONT_USE) { + } + + public DecompilerProvider(DecompilerSettingsService decompilerSettingsService) { + Debug2.Assert(decompilerSettingsService is not null); + this.decompilerSettingsService = decompilerSettingsService ?? throw new ArgumentNullException(nameof(decompilerSettingsService)); + } + + public IEnumerable Create() { + yield return new CSharpDecompiler(decompilerSettingsService.CSharpVBDecompilerSettings, DecompilerConstants.CSHARP_ILSPY_ORDERUI); +#if DEBUG + foreach (var l in CSharpDecompiler.GetDebugDecompilers(decompilerSettingsService.CSharpVBDecompilerSettings)) + yield return l; +#endif + } + } + + /// + /// Decompiler logic for C#. + /// + sealed class CSharpDecompiler : DecompilerBase { + string uniqueNameUI = "C#"; + Guid uniqueGuid = DecompilerConstants.LANGUAGE_CSHARP_ILSPY; + bool showAllMembers = false; + readonly Func createBuilderCache; + Predicate? transformAbortCondition = null; + + public override DecompilerSettingsBase Settings => langSettings; + readonly CSharpVBDecompilerSettings langSettings; + + public CSharpDecompiler(CSharpVBDecompilerSettings langSettings, double orderUI) { + this.langSettings = langSettings; + createBuilderCache = () => new BuilderCache(this.langSettings.Settings.SettingsVersion); + OrderUI = orderUI; + } + +#if DEBUG + internal static IEnumerable GetDebugDecompilers(CSharpVBDecompilerSettings langSettings) { + DecompilerContext context = new DecompilerContext(0, new ModuleDefUser("dummy"), CSharpMetadataTextColorProvider.Instance); + string lastTransformName = "no transforms"; + double orderUI = DecompilerConstants.CSHARP_ILSPY_DEBUG_ORDERUI; + uint id = 0xBF67AF3F; + foreach (Type _transformType in TransformationPipeline.CreatePipeline(context).Select(v => v.GetType()).Distinct()) { + Type transformType = _transformType; // copy for lambda + yield return new CSharpDecompiler(langSettings, orderUI++) { + transformAbortCondition = v => transformType.IsInstanceOfType(v), + uniqueNameUI = "C# - " + lastTransformName, + uniqueGuid = new Guid($"203F702E-7E87-4F01-84CD-B0E8{id++:X8}"), + showAllMembers = true + }; + lastTransformName = "after " + transformType.Name; + } + yield return new CSharpDecompiler(langSettings, orderUI++) { + uniqueNameUI = "C# - " + lastTransformName, + uniqueGuid = new Guid($"203F702E-7E87-4F01-84CD-B0E8{id++:X8}"), + showAllMembers = true + }; + } +#endif + + public override string ContentTypeString => ContentTypesInternal.CSharpILSpy; + public override string GenericNameUI => DecompilerConstants.GENERIC_NAMEUI_CSHARP; + public override string UniqueNameUI => uniqueNameUI; + public override double OrderUI { get; } + public override Guid GenericGuid => DecompilerConstants.LANGUAGE_CSHARP; + public override Guid UniqueGuid => uniqueGuid; + public override string FileExtension => ".cs"; + public override string? ProjectFileExtension => ".csproj"; + + public override void Decompile(MethodDef method, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, method); + var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: method.DeclaringType, isSingleMember: true); + try { + if (method.IsConstructor && !method.IsStatic && !method.DeclaringType.IsValueType) { + // also fields and other ctors so that the field initializers can be shown as such + AddFieldsAndCtors(state.AstBuilder, method.DeclaringType, method.IsStatic); + RunTransformsAndGenerateCode(ref state, output, ctx, new SelectCtorTransform(method)); + } + else { + state.AstBuilder.AddMethod(method); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + } + finally { + state.Dispose(); + } + } + + class SelectCtorTransform : IAstTransform { + readonly MethodDef ctorDef; + + public SelectCtorTransform(MethodDef ctorDef) => this.ctorDef = ctorDef; + + public void Run(AstNode compilationUnit) { + ConstructorDeclaration? ctorDecl = null; + foreach (var node in compilationUnit.Children) { + if (node is ConstructorDeclaration ctor) { + if (ctor.Annotation() == ctorDef) { + ctorDecl = ctor; + } + else { + // remove other ctors + ctor.Remove(); + } + } + // Remove any fields without initializers + if (node is FieldDeclaration fd && fd.Variables.All(v => v.Initializer.IsNull)) + fd.Remove(); + } + if (ctorDecl?.Initializer.ConstructorInitializerType == ConstructorInitializerType.This) { + // remove all fields + foreach (var node in compilationUnit.Children) + if (node is FieldDeclaration) + node.Remove(); + } + } + } + + public override void Decompile(PropertyDef property, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, property); + var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: property.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddProperty(property); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(FieldDef field, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, field); + var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: field.DeclaringType, isSingleMember: true); + try { + if (field.IsLiteral) { + state.AstBuilder.AddField(field); + } + else { + // also decompile ctors so that the field initializer can be shown + AddFieldsAndCtors(state.AstBuilder, field.DeclaringType, field.IsStatic); + } + RunTransformsAndGenerateCode(ref state, output, ctx, new SelectFieldTransform(field)); + } + finally { + state.Dispose(); + } + } + + /// + /// Removes all top-level members except for the specified fields. + /// + sealed class SelectFieldTransform : IAstTransform { + readonly FieldDef field; + + public SelectFieldTransform(FieldDef field) => this.field = field; + + public void Run(AstNode compilationUnit) { + foreach (var child in compilationUnit.Children) { + if (child is EntityDeclaration) { + if (child.Annotation() != field) + child.Remove(); + } + } + } + } + + void AddFieldsAndCtors(AstBuilder codeDomBuilder, TypeDef declaringType, bool isStatic) { + foreach (var field in declaringType.Fields) { + if (field.IsStatic == isStatic) + codeDomBuilder.AddField(field); + } + foreach (var ctor in declaringType.Methods) { + if (ctor.IsConstructor && ctor.IsStatic == isStatic) + codeDomBuilder.AddMethod(ctor); + } + } + + public override void Decompile(EventDef ev, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, ev); + var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: ev.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddEvent(ev); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(TypeDef type, IDecompilerOutput output, DecompilationContext ctx) { + var state = CreateAstBuilder(ctx, langSettings.Settings, currentType: type); + try { + state.AstBuilder.AddType(type); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + void RunTransformsAndGenerateCode(ref BuilderState state, IDecompilerOutput output, DecompilationContext ctx, IAstTransform? additionalTransform = null) { + var astBuilder = state.AstBuilder; + astBuilder.RunTransformations(transformAbortCondition); + if (additionalTransform is not null) { + additionalTransform.Run(astBuilder.SyntaxTree); + } + AddXmlDocumentation(ref state, langSettings.Settings, astBuilder); + astBuilder.GenerateCode(output); + } + + internal static void AddXmlDocumentation(ref BuilderState state, DecompilerSettings settings, AstBuilder astBuilder) { + if (settings.ShowXmlDocumentation) { + var module = state.AstBuilder.Context.CurrentModule; + var hasXmlDocFileTmp = state.State.HasXmlDocFile(module); + bool hasXmlDocFile; + if (hasXmlDocFileTmp is null) { + hasXmlDocFile = XmlDocLoader.LoadDocumentation(module) is not null; + state.State.SetHasXmlDocFile(module, hasXmlDocFile); + } + else + hasXmlDocFile = hasXmlDocFileTmp.Value; + if (!hasXmlDocFile) + return; + + try { + new AddXmlDocTransform(state.State.XmlDoc_StringBuilder).Run(astBuilder.SyntaxTree); + } + catch (XmlException ex) { + string[] msg = (" Exception while reading XmlDoc: " + ex.ToString()).Split(newLineChars, StringSplitOptions.RemoveEmptyEntries); + var insertionPoint = astBuilder.SyntaxTree.FirstChild; + for (int i = 0; i < msg.Length; i++) + astBuilder.SyntaxTree.InsertChildBefore(insertionPoint, new Comment(msg[i], CommentType.Documentation), Roles.Comment); + } + } + } + static readonly char[] newLineChars = new char[] { '\r', '\n', '\u0085', '\u2028', '\u2029' }; + + public override void Decompile(AssemblyDef asm, IDecompilerOutput output, DecompilationContext ctx) { + WriteAssembly(asm, output, ctx); + + using (ctx.DisableAssemblyLoad()) { + var state = CreateAstBuilder(ctx, langSettings.Settings, currentModule: asm.ManifestModule); + try { + state.AstBuilder.AddAssembly(asm.ManifestModule, true, true, false); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + } + + public override void Decompile(ModuleDef mod, IDecompilerOutput output, DecompilationContext ctx) { + WriteModule(mod, output, ctx); + + using (ctx.DisableAssemblyLoad()) { + var state = CreateAstBuilder(ctx, langSettings.Settings, currentModule: mod); + try { + state.AstBuilder.AddAssembly(mod, true, false, true); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + } + + BuilderState CreateAstBuilder(DecompilationContext ctx, DecompilerSettings settings, ModuleDef? currentModule = null, TypeDef? currentType = null, bool isSingleMember = false) { + if (currentModule is null) + currentModule = currentType?.Module; + if (isSingleMember) { + settings = settings.Clone(); + settings.UsingDeclarations = false; + } + var cache = ctx.GetOrCreate(createBuilderCache); + var state = new BuilderState(ctx, cache, MetadataTextColorProvider); + state.AstBuilder.Context.CurrentModule = currentModule; + state.AstBuilder.Context.CancellationToken = ctx.CancellationToken; + state.AstBuilder.Context.CurrentType = currentType; + state.AstBuilder.Context.Settings = settings; + return state; + } + + protected override void TypeToString(IDecompilerOutput output, ITypeDefOrRef? type, bool includeNamespace, IHasCustomAttribute? typeAttributes = null) { + ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; + if (includeNamespace) + options |= ConvertTypeOptions.IncludeNamespace; + + TypeToString(output, options, type, typeAttributes); + } + + static readonly UTF8String systemRuntimeCompilerServicesString = new UTF8String("System.Runtime.CompilerServices"); + static readonly UTF8String isReadOnlyAttributeString = new UTF8String("IsReadOnlyAttribute"); + bool WriteRefIfByRef(IDecompilerOutput output, TypeSig typeSig, ParamDef? pd) { + if (typeSig.RemovePinnedAndModifiers() is ByRefSig) { + if (pd is not null && (!pd.IsIn && pd.IsOut)) { + output.Write("out", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + } + else if (pd is not null && pd.IsDefined(systemRuntimeCompilerServicesString, isReadOnlyAttributeString)) { + output.Write("in", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + } + else { + output.Write("ref", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + } + return true; + } + return false; + } + + void TypeToString(IDecompilerOutput output, ConvertTypeOptions options, ITypeDefOrRef? type, IHasCustomAttribute? typeAttributes = null) { + if (type is null) + return; + AstType astType = AstBuilder.ConvertType(type, new StringBuilder(), typeAttributes, options); + + if (WriteRefIfByRef(output, type.TryGetByRefSig(), typeAttributes as ParamDef)) { + if (astType is ComposedType && ((ComposedType)astType).PointerRank > 0) + ((ComposedType)astType).PointerRank--; + } + + var ctx = new DecompilerContext(langSettings.Settings.SettingsVersion, type.Module, MetadataTextColorProvider); + astType.AcceptVisitor(new CSharpOutputVisitor(new TextTokenWriter(output, ctx), FormattingOptionsFactory.CreateAllman())); + } + + protected override void FormatPropertyName(IDecompilerOutput output, PropertyDef property, bool? isIndexer) { + if (property is null) + throw new ArgumentNullException(nameof(property)); + + if (!isIndexer.HasValue) { + isIndexer = property.IsIndexer(); + } + if (isIndexer.Value) { + var accessor = property.GetMethod ?? property.SetMethod; + if (accessor is not null && accessor.HasOverrides) { + var methDecl = accessor.Overrides.First().MethodDeclaration; + var declaringType = methDecl is null ? null : methDecl.DeclaringType; + TypeToString(output, declaringType, includeNamespace: true); + output.Write(".", BoxedTextColor.Operator); + } + output.Write("this", BoxedTextColor.Keyword); + output.Write("[", BoxedTextColor.Punctuation); + bool addSeparator = false; + foreach (var p in property.PropertySig.GetParams()) { + if (addSeparator) { + output.Write(",", BoxedTextColor.Punctuation); + output.Write(" ", BoxedTextColor.Text); + } + else + addSeparator = true; + TypeToString(output, p.ToTypeDefOrRef(), includeNamespace: true); + } + output.Write("]", BoxedTextColor.Punctuation); + } + else + WriteIdentifier(output, property.Name, MetadataTextColorProvider.GetColor(property)); + } + + static readonly HashSet isKeyword = new HashSet(StringComparer.Ordinal) { + "abstract", "as", "base", "bool", "break", "byte", "case", "catch", + "char", "checked", "class", "const", "continue", "decimal", "default", "delegate", + "do", "double", "else", "enum", "event", "explicit", "extern", "false", + "finally", "fixed", "float", "for", "foreach", "goto", "if", "implicit", + "in", "int", "interface", "internal", "is", "lock", "long", "namespace", + "new", "null", "object", "operator", "out", "override", "params", "private", + "protected", "public", "readonly", "ref", "return", "sbyte", "sealed", "short", + "sizeof", "stackalloc", "static", "string", "struct", "switch", "this", "throw", + "true", "try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", + "using", "virtual", "void", "volatile", "while", + }; + + static void WriteIdentifier(IDecompilerOutput output, string id, object tokenKind) { + if (isKeyword.Contains(id)) + output.Write("@", tokenKind); + output.Write(IdentifierEscaper.Escape(id), tokenKind); + } + + protected override void FormatTypeName(IDecompilerOutput output, TypeDef type) { + if (type is null) + throw new ArgumentNullException(nameof(type)); + + TypeToString(output, ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions | ConvertTypeOptions.DoNotIncludeEnclosingType, type); + } + + internal static bool ShowMember(IMemberRef member, bool showAllMembers, DecompilerSettings settings) { + if (showAllMembers) + return true; + if (member is MethodDef md && (md.IsGetter || md.IsSetter || md.IsAddOn || md.IsRemoveOn)) + return true; + return !AstBuilder.MemberIsHidden(member, settings); + } + + public override bool ShowMember(IMemberRef member) => ShowMember(member, showAllMembers, langSettings.Settings); + + public override bool CanDecompile(DecompilationType decompilationType) { + switch (decompilationType) { + case DecompilationType.PartialType: + case DecompilationType.AssemblyInfo: + case DecompilationType.TypeMethods: + return true; + } + return base.CanDecompile(decompilationType); + } + + public override void Decompile(DecompilationType decompilationType, object data) { + switch (decompilationType) { + case DecompilationType.PartialType: + DecompilePartial((DecompilePartialType)data); + return; + case DecompilationType.AssemblyInfo: + DecompileAssemblyInfo((DecompileAssemblyInfo)data); + return; + case DecompilationType.TypeMethods: + DecompileTypeMethods((DecompileTypeMethods)data); + return; + } + base.Decompile(decompilationType, data); + } + + void DecompilePartial(DecompilePartialType info) { + var state = CreateAstBuilder(info.Context, CreateDecompilerSettings(langSettings.Settings, info.UseUsingDeclarations), currentType: info.Type); + try { + state.AstBuilder.AddType(info.Type); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, new DecompilePartialTransform(info.Type, info.Definitions, info.ShowDefinitions, info.AddPartialKeyword, info.InterfacesToRemove)); + } + finally { + state.Dispose(); + } + } + + void DecompileAssemblyInfo(DecompileAssemblyInfo info) { + var state = CreateAstBuilder(info.Context, langSettings.Settings, currentModule: info.Module); + try { + state.AstBuilder.AddAssembly(info.Module, true, info.Module.IsManifestModule, true); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, info.KeepAllAttributes ? null : new AssemblyInfoTransform()); + } + finally { + state.Dispose(); + } + } + + void DecompileTypeMethods(DecompileTypeMethods info) { + var state = CreateAstBuilder(info.Context, CreateDecompilerSettings_DecompileTypeMethods(langSettings.Settings, !info.DecompileHidden, info.ShowAll), currentType: info.Type); + try { + state.AstBuilder.GetDecompiledBodyKind = (builder, method) => GetDecompiledBodyKind(info, builder, method); + state.AstBuilder.AddType(info.Type); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, new DecompileTypeMethodsTransform(info.Types, info.Methods, !info.DecompileHidden, info.ShowAll)); + } + finally { + state.Dispose(); + } + } + + internal static DecompilerSettings CreateDecompilerSettings_DecompileTypeMethods(DecompilerSettings settings, bool useUsingDeclarations, bool showAll) { + var s = CreateDecompilerSettings(settings, useUsingDeclarations); + // Make sure the ctor is shown if the user tries to edit an empty ctor/cctor + s.RemoveEmptyDefaultConstructors = false; + if (!showAll) { + // Inline all field initialization code + s.AllowFieldInitializers = false; + } + return s; + } + + internal static DecompilerSettings CreateDecompilerSettings(DecompilerSettings settings, bool useUsingDeclarations) { + var newOne = settings.Clone(); + newOne.UsingDeclarations = useUsingDeclarations; + newOne.FullyQualifyAllTypes = !useUsingDeclarations; + newOne.RemoveNewDelegateClass = useUsingDeclarations; + newOne.ForceShowAllMembers = false; + return newOne; + } + + internal static DecompiledBodyKind GetDecompiledBodyKind(DecompileTypeMethods info, AstBuilder builder, MethodDef method) { + if (info.DecompileHidden) + return DecompiledBodyKind.Empty; + if (info.ShowAll || info.Methods.Contains(method)) + return DecompiledBodyKind.Full; + return DecompiledBodyKind.Empty; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompilePartialTransform.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompilePartialTransform.cs new file mode 100644 index 0000000..ca9e550 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompilePartialTransform.cs @@ -0,0 +1,84 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using ICSharpCode.Decompiler.Ast.Transforms; +using ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + sealed class DecompilePartialTransform : IAstTransform { + readonly TypeDef type; + readonly HashSet definitions; + readonly bool showDefinitions; + readonly bool addPartialKeyword; + readonly HashSet ifacesToRemove; + + public DecompilePartialTransform(TypeDef type, HashSet definitions, bool showDefinitions, bool addPartialKeyword, IEnumerable ifacesToRemove) { + this.type = type; + this.definitions = definitions; + this.showDefinitions = showDefinitions; + this.addPartialKeyword = addPartialKeyword; + this.ifacesToRemove = new HashSet(ifacesToRemove, TypeEqualityComparer.Instance); + } + + public void Run(AstNode compilationUnit) { + foreach (var en in compilationUnit.Descendants.OfType()) { + var def = en.Annotation(); + Debug2.Assert(def is not null); + if (def is null) + continue; + if (def == type) { + var tdecl = en as TypeDeclaration; + Debug2.Assert(tdecl is not null); + if (tdecl is not null) { + if (addPartialKeyword) { + if (tdecl.ClassType != ClassType.Enum) + tdecl.Modifiers |= Modifiers.Partial; + + // Make sure the comments are still shown before the method and its modifiers + var comments = en.GetChildrenByRole(Roles.Comment).Reverse().ToArray(); + foreach (var c in comments) { + c.Remove(); + en.InsertChildAfter(null, c, Roles.Comment); + } + } + foreach (var iface in tdecl.BaseTypes) { + var tdr = iface.Annotation(); + if (tdr is not null && ifacesToRemove.Contains(tdr)) + iface.Remove(); + } + } + } + else { + if (showDefinitions) { + if (!definitions.Contains(def)) + en.Remove(); + } + else { + if (definitions.Contains(def)) + en.Remove(); + } + } + } + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompileTypeMethodsTransform.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompileTypeMethodsTransform.cs new file mode 100644 index 0000000..d7d7a71 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/DecompileTypeMethodsTransform.cs @@ -0,0 +1,137 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using ICSharpCode.Decompiler.Ast.Transforms; +using ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + sealed class DecompileTypeMethodsTransform : IAstTransform { + readonly HashSet defsToShow; + readonly HashSet partialTypes; + readonly bool showDefinitions; + readonly bool showAll; + + public DecompileTypeMethodsTransform(HashSet types, HashSet methods, bool showDefinitions, bool showAll) { + defsToShow = new HashSet(); + partialTypes = new HashSet(); + this.showDefinitions = showDefinitions; + this.showAll = showAll; + + foreach (var method in methods) { + // If it's part of a property or event, include the property or event since there are no partial props/events + var prop = method.DeclaringType.Properties.FirstOrDefault(a => a.GetMethods.Contains(method) || a.SetMethods.Contains(method)); + if (prop is not null) { + defsToShow.Add(prop); + foreach (var m in prop.GetMethods) + defsToShow.Add(m); + foreach (var m in prop.SetMethods) + defsToShow.Add(m); + foreach (var m in prop.OtherMethods) + defsToShow.Add(m); + } + else { + var evt = method.DeclaringType.Events.FirstOrDefault(a => a.AddMethod == method || a.RemoveMethod == method); + if (evt is not null) { + defsToShow.Add(evt); + if (evt.AddMethod is not null) + defsToShow.Add(evt.AddMethod); + if (evt.RemoveMethod is not null) + defsToShow.Add(evt.RemoveMethod); + if (evt.InvokeMethod is not null) + defsToShow.Add(evt.InvokeMethod); + foreach (var m in evt.OtherMethods) + defsToShow.Add(m); + } + else + defsToShow.Add(method); + } + } + foreach (var type in types) { + if (!type.IsEnum) { + defsToShow.Add(type); + partialTypes.Add(type); + } + } + foreach (var def in defsToShow) { + for (var declType = def.DeclaringType; declType is not null; declType = declType.DeclaringType) + partialTypes.Add(declType); + } + foreach (var type in types) { + if (type.IsEnum) { + defsToShow.Add(type); + foreach (var f in type.Fields) + defsToShow.Add(f); + } + } + } + + public void Run(AstNode compilationUnit) { + foreach (var en in compilationUnit.Descendants.OfType()) { + var def = en.Annotation(); + Debug2.Assert(def is not null); + if (def is null) + continue; + + if (partialTypes.Contains(def)) { + var tdecl = en as TypeDeclaration; + Debug2.Assert(tdecl is not null); + if (tdecl is not null) { + if (tdecl.ClassType != ClassType.Enum) + tdecl.Modifiers |= Modifiers.Partial; + if (!showDefinitions) { + tdecl.BaseTypes.Clear(); + tdecl.Attributes.Clear(); + } + + // Make sure the comments are still shown before the method and its modifiers + var comments = en.GetChildrenByRole(Roles.Comment).Reverse().ToArray(); + foreach (var c in comments) { + c.Remove(); + en.InsertChildAfter(null, c, Roles.Comment); + } + } + } + else { + if (showDefinitions) { + if (!showAll && !defsToShow.Contains(def)) + en.Remove(); + } + else { + if (showAll || defsToShow.Contains(def)) + en.Remove(); + else if (en is CustomEventDeclaration ced) { + // Convert this hidden event to an event without accessor bodies. + // AstBuilder doesn't write empty bodies to it if it's a hidden event because + // then it can't be optimized to an auto event. We want real auto events to + // become auto events and custom events to stay custom, but without bodies. + if (!ced.AddAccessor.IsNull) + ced.AddAccessor.Body = new BlockStatement(); + if (!ced.RemoveAccessor.IsNull) + ced.RemoveAccessor.Body = new BlockStatement(); + } + } + } + } + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/ThreadSafeObjectPool.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/ThreadSafeObjectPool.cs new file mode 100644 index 0000000..254d223 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/CSharp/ThreadSafeObjectPool.cs @@ -0,0 +1,57 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; + +namespace dnSpy.Decompiler.ILSpy.Core.CSharp { + sealed class ThreadSafeObjectPool where T : class { + readonly List freeObjs; + readonly Func createObject; + readonly Action resetObject; + readonly object lockObj = new object(); + + public ThreadSafeObjectPool(int size, Func createObject, Action resetObject) { + if (size <= 0) + throw new ArgumentException(); + freeObjs = new List(size); + this.createObject = createObject; + this.resetObject = resetObject; + } + + public T Allocate() { + lock (lockObj) { + if (freeObjs.Count > 0) { + int i = freeObjs.Count - 1; + var o = freeObjs[i]; + freeObjs.RemoveAt(i); + return o; + } + + return createObject(); + } + } + + public void Free(T obj) { + resetObject(obj); + lock (lockObj) + freeObjs.Add(obj); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompiler.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompiler.cs new file mode 100644 index 0000000..8a28c63 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompiler.cs @@ -0,0 +1,200 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Decompiler.XmlDoc; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.IL; +using dnSpy.Decompiler.ILSpy.Core.Settings; +using dnSpy.Decompiler.ILSpy.Core.Text; +using dnSpy.Decompiler.ILSpy.Core.XmlDoc; +using ICSharpCode.Decompiler.Disassembler; + +namespace dnSpy.Decompiler.ILSpy.Core.IL { + sealed class DecompilerProvider : IDecompilerProvider { + readonly DecompilerSettingsService decompilerSettingsService; + + // Keep the default ctor. It's used by dnSpy.Console.exe + public DecompilerProvider() + : this(DecompilerSettingsService.__Instance_DONT_USE) { + } + + public DecompilerProvider(DecompilerSettingsService decompilerSettingsService) { + Debug2.Assert(decompilerSettingsService is not null); + this.decompilerSettingsService = decompilerSettingsService ?? throw new ArgumentNullException(nameof(decompilerSettingsService)); + } + + public IEnumerable Create() { + yield return new ILDecompiler(decompilerSettingsService.ILDecompilerSettings); + } + } + + /// + /// IL language support. + /// + /// + /// Currently comes in two versions: + /// flat IL (detectControlStructure=false) and structured IL (detectControlStructure=true). + /// + sealed class ILDecompiler : DecompilerBase { + readonly bool detectControlStructure; + + public override DecompilerSettingsBase Settings => langSettings; + readonly ILDecompilerSettings langSettings; + + public ILDecompiler(ILDecompilerSettings langSettings) + : this(langSettings, true) { + } + + public ILDecompiler(ILDecompilerSettings langSettings, bool detectControlStructure) { + this.langSettings = langSettings; + this.detectControlStructure = detectControlStructure; + } + + public override double OrderUI => DecompilerConstants.IL_ILSPY_ORDERUI; + public override string ContentTypeString => ContentTypesInternal.ILILSpy; + public override string GenericNameUI => DecompilerConstants.GENERIC_NAMEUI_IL; + public override string UniqueNameUI => "IL"; + public override Guid GenericGuid => DecompilerConstants.LANGUAGE_IL; + public override Guid UniqueGuid => DecompilerConstants.LANGUAGE_IL_ILSPY; + public override string FileExtension => ".il"; + + ReflectionDisassembler CreateReflectionDisassembler(IDecompilerOutput output, DecompilationContext ctx, IMemberDef member) => + CreateReflectionDisassembler(output, ctx, member.Module); + + ReflectionDisassembler CreateReflectionDisassembler(IDecompilerOutput output, DecompilationContext ctx, ModuleDef ownerModule) { + var disOpts = new DisassemblerOptions(langSettings.Settings.SettingsVersion, ctx.CancellationToken, ownerModule); + if (langSettings.Settings.ShowILComments) + disOpts.GetOpCodeDocumentation = ILLanguageHelper.GetOpCodeDocumentation; + var sb = new StringBuilder(); + if (langSettings.Settings.ShowXmlDocumentation) + disOpts.GetXmlDocComments = a => GetXmlDocComments(a, sb); + disOpts.CreateInstructionBytesReader = m => InstructionBytesReader.Create(m, ctx.IsBodyModified is not null && ctx.IsBodyModified(m)); + disOpts.ShowTokenAndRvaComments = langSettings.Settings.ShowTokenAndRvaComments; + disOpts.ShowILBytes = langSettings.Settings.ShowILBytes; + disOpts.SortMembers = langSettings.Settings.SortMembers; + disOpts.ShowPdbInfo = langSettings.Settings.ShowPdbInfo; + disOpts.MaxStringLength = langSettings.Settings.MaxStringLength; + disOpts.HexadecimalNumbers = langSettings.Settings.HexadecimalNumbers; + return new ReflectionDisassembler(output, detectControlStructure, disOpts); + } + + static IEnumerable GetXmlDocComments(IMemberRef mr, StringBuilder sb) { + if (mr is null || mr.Module is null) + yield break; + var xmldoc = XmlDocLoader.LoadDocumentation(mr.Module); + if (xmldoc is null) + yield break; + var doc = xmldoc.GetDocumentation(XmlDocKeyProvider.GetKey(mr, sb)); + if (string2.IsNullOrEmpty(doc)) + yield break; + + foreach (var info in new XmlDocLine(doc)) { + sb.Clear(); + if (info is not null) { + sb.Append(' '); + info.Value.WriteTo(sb); + } + yield return sb.ToString(); + } + } + + public override void Decompile(MethodDef method, IDecompilerOutput output, DecompilationContext ctx) { + var dis = CreateReflectionDisassembler(output, ctx, method); + dis.DisassembleMethod(method, true); + } + + public override void Decompile(FieldDef field, IDecompilerOutput output, DecompilationContext ctx) { + var dis = CreateReflectionDisassembler(output, ctx, field); + dis.DisassembleField(field, false); + } + + public override void Decompile(PropertyDef property, IDecompilerOutput output, DecompilationContext ctx) { + ReflectionDisassembler rd = CreateReflectionDisassembler(output, ctx, property); + rd.DisassembleProperty(property, addLineSep: true); + if (property.GetMethod is not null) { + output.WriteLine(); + rd.DisassembleMethod(property.GetMethod, true); + } + if (property.SetMethod is not null) { + output.WriteLine(); + rd.DisassembleMethod(property.SetMethod, true); + } + foreach (var m in property.OtherMethods) { + output.WriteLine(); + rd.DisassembleMethod(m, true); + } + } + + public override void Decompile(EventDef ev, IDecompilerOutput output, DecompilationContext ctx) { + ReflectionDisassembler rd = CreateReflectionDisassembler(output, ctx, ev); + rd.DisassembleEvent(ev, addLineSep: true); + if (ev.AddMethod is not null) { + output.WriteLine(); + rd.DisassembleMethod(ev.AddMethod, true); + } + if (ev.RemoveMethod is not null) { + output.WriteLine(); + rd.DisassembleMethod(ev.RemoveMethod, true); + } + foreach (var m in ev.OtherMethods) { + output.WriteLine(); + rd.DisassembleMethod(m, true); + } + } + + public override void Decompile(TypeDef type, IDecompilerOutput output, DecompilationContext ctx) { + var dis = CreateReflectionDisassembler(output, ctx, type); + dis.DisassembleType(type, true); + } + + public override void Decompile(AssemblyDef asm, IDecompilerOutput output, DecompilationContext ctx) { + output.WriteLine("// " + asm.ManifestModule.Location, BoxedTextColor.Comment); + PrintEntryPoint(asm.ManifestModule, output); + output.WriteLine(); + + ReflectionDisassembler rd = CreateReflectionDisassembler(output, ctx, asm.ManifestModule); + rd.WriteAssemblyHeader(asm); + } + + public override void Decompile(ModuleDef mod, IDecompilerOutput output, DecompilationContext ctx) { + output.WriteLine("// " + mod.Location, BoxedTextColor.Comment); + PrintEntryPoint(mod, output); + output.WriteLine(); + + ReflectionDisassembler rd = CreateReflectionDisassembler(output, ctx, mod); + output.WriteLine(); + rd.WriteModuleHeader(mod); + } + + protected override void TypeToString(IDecompilerOutput output, ITypeDefOrRef? t, bool includeNamespace, IHasCustomAttribute? attributeProvider = null) => + t.WriteTo(output, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName); + + public override void WriteToolTip(ITextColorWriter output, IMemberRef member, IHasCustomAttribute? typeAttributes) { + if (!(member is ITypeDefOrRef) && ILDecompilerUtils.Write(TextColorWriterToDecompilerOutput.Create(output), member)) + return; + + base.WriteToolTip(output, member, typeAttributes); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompilerUtils.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompilerUtils.cs new file mode 100644 index 0000000..9ecd4bf --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/IL/ILDecompilerUtils.cs @@ -0,0 +1,57 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using ICSharpCode.Decompiler.Disassembler; + +namespace dnSpy.Decompiler.ILSpy.Core.IL { + static class ILDecompilerUtils { + public static bool Write(IDecompilerOutput output, IMemberRef? member) { + if (member is IMethod method && method.IsMethod) { + method.WriteMethodTo(output); + return true; + } + + if (member is IField field && field.IsField) { + field.WriteFieldTo(output); + return true; + } + + if (member is PropertyDef prop) { + var dis = new ReflectionDisassembler(output, false, new DisassemblerOptions(0, new System.Threading.CancellationToken(), null)); + dis.DisassembleProperty(prop, false); + return true; + } + + if (member is EventDef evt) { + var dis = new ReflectionDisassembler(output, false, new DisassemblerOptions(0, new System.Threading.CancellationToken(), null)); + dis.DisassembleEvent(evt, false); + return true; + } + + if (member is ITypeDefOrRef type) { + type.WriteTo(output, ILNameSyntax.TypeName); + return true; + } + + return false; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/ILAst/ILAstDecompiler.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/ILAst/ILAstDecompiler.cs new file mode 100644 index 0000000..66e505c --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/ILAst/ILAstDecompiler.cs @@ -0,0 +1,386 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.ILSpy.Core.Settings; +using dnSpy.Decompiler.ILSpy.Core.Text; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.Disassembler; +using ICSharpCode.Decompiler.ILAst; + +namespace dnSpy.Decompiler.ILSpy.Core.ILAst { + sealed class DecompilerProvider : IDecompilerProvider { + readonly DecompilerSettingsService decompilerSettingsService; + + // Keep the default ctor. It's used by dnSpy.Console.exe + public DecompilerProvider() + : this(DecompilerSettingsService.__Instance_DONT_USE) { + } + + public DecompilerProvider(DecompilerSettingsService decompilerSettingsService) { + Debug2.Assert(decompilerSettingsService is not null); + this.decompilerSettingsService = decompilerSettingsService ?? throw new ArgumentNullException(nameof(decompilerSettingsService)); + } + + public IEnumerable Create() { +#if DEBUG + foreach (var l in ILAstDecompiler.GetDebugDecompilers(decompilerSettingsService)) + yield return l; +#endif + yield break; + } + } + +#if DEBUG + /// + /// Represents the ILAst "language" used for debugging purposes. + /// + sealed class ILAstDecompiler : DecompilerBase { + readonly string uniqueNameUI; + Guid uniqueGuid; + bool inlineVariables = true; + ILAstOptimizationStep? abortBeforeStep; + + public override DecompilerSettingsBase Settings { get; } + const int settingsVersion = 1; + + ILAstDecompiler(ILAstDecompilerSettings langSettings, double orderUI, string uniqueNameUI) { + Settings = langSettings; + OrderUI = orderUI; + this.uniqueNameUI = uniqueNameUI; + } + + public override double OrderUI { get; } + public override string ContentTypeString => ContentTypesInternal.ILAstILSpy; + public override string GenericNameUI => "ILAst"; + public override string UniqueNameUI => uniqueNameUI; + public override Guid GenericGuid => DecompilerConstants.LANGUAGE_ILAST_ILSPY; + public override Guid UniqueGuid => uniqueGuid; + + public override void Decompile(MethodDef method, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentBegin(output, true); + output.Write("Method: ", BoxedTextColor.Comment); + output.Write(IdentifierEscaper.Escape(method.FullName), method, DecompilerReferenceFlags.Definition, BoxedTextColor.Comment); + WriteCommentEnd(output, true); + output.WriteLine(); + + if (!method.HasBody) { + return; + } + + var bodyInfo = StartKeywordBlock(output, ".body", method); + + ILAstBuilder astBuilder = new ILAstBuilder(); + ILBlock ilMethod = new ILBlock(CodeBracesRangeFlags.MethodBraces); + DecompilerContext context = new DecompilerContext(settingsVersion, method.Module, MetadataTextColorProvider) { + CurrentType = method.DeclaringType, + CurrentMethod = method, + CalculateILSpans = ctx.CalculateILSpans, + }; + ilMethod.Body = astBuilder.Build(method, inlineVariables, context); + + var stateMachineKind = StateMachineKind.None; + MethodDef? inlinedMethod = null; + AsyncMethodDebugInfo? asyncInfo = null; + string? compilerName = null; + if (abortBeforeStep is not null) { + var optimizer = new ILAstOptimizer(); + optimizer.Optimize(context, ilMethod, out stateMachineKind, out inlinedMethod, out asyncInfo, abortBeforeStep.Value); + compilerName = optimizer.CompilerName; + } + + if (context.CurrentMethodIsYieldReturn) { + output.Write("yield", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + output.WriteLine("return", BoxedTextColor.Keyword); + } + if (context.CurrentMethodIsAsync) { + output.Write("async", BoxedTextColor.Keyword); + output.Write("/", BoxedTextColor.Punctuation); + output.WriteLine("await", BoxedTextColor.Keyword); + } + + var allVariables = ilMethod.GetSelfAndChildrenRecursive().Select(e => e.Operand as ILVariable) + .Where(v => v is not null && !v.IsParameter).Distinct(); + foreach (var v in allVariables) { + Debug2.Assert(v is not null); + output.Write(IdentifierEscaper.Escape(v.Name), v.GetTextReferenceObject(), DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, v.IsParameter ? BoxedTextColor.Parameter : BoxedTextColor.Local); + if (v.Type is not null) { + output.Write(" ", BoxedTextColor.Text); + output.Write(":", BoxedTextColor.Punctuation); + output.Write(" ", BoxedTextColor.Text); + if (v.IsPinned) { + output.Write("pinned", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + } + v.Type.WriteTo(output, ILNameSyntax.ShortTypeName); + } + if (v.GeneratedByDecompiler) { + output.Write(" ", BoxedTextColor.Text); + var start = output.NextPosition; + output.Write("[", BoxedTextColor.Punctuation); + output.Write("generated", BoxedTextColor.Keyword); + var end = output.NextPosition; + output.Write("]", BoxedTextColor.Punctuation); + output.AddBracePair(new TextSpan(start, 1), new TextSpan(end, 1), CodeBracesRangeFlags.SquareBrackets); + } + output.WriteLine(); + } + + var localVariables = new HashSet(GetVariables(ilMethod)); + var builder = new MethodDebugInfoBuilder(settingsVersion, stateMachineKind, inlinedMethod ?? method, inlinedMethod is not null ? method : null, CreateSourceLocals(localVariables), CreateSourceParameters(localVariables), asyncInfo); + builder.CompilerName = compilerName; + foreach (ILNode node in ilMethod.Body) { + node.WriteTo(output, builder); + if (!node.WritesNewLine) + output.WriteLine(); + } + output.AddDebugInfo(builder.Create()); + EndKeywordBlock(output, bodyInfo, CodeBracesRangeFlags.MethodBraces, addLineSeparator: true); + } + + IEnumerable GetVariables(ILBlock ilMethod) { + foreach (var n in ilMethod.GetSelfAndChildrenRecursive(new List())) { + var expr = n as ILExpression; + if (expr is not null) { + var v = expr.Operand as ILVariable; + if (v is not null) + yield return v; + continue; + } + var cb = n as ILTryCatchBlock.CatchBlockBase; + if (cb is not null && cb.ExceptionVariable is not null) + yield return cb.ExceptionVariable; + } + } + + readonly List sourceLocalsList = new List(); + SourceLocal[] CreateSourceLocals(HashSet variables) { + foreach (var v in variables) { + if (v.IsParameter) + continue; + sourceLocalsList.Add(v.GetSourceLocal()); + } + var array = sourceLocalsList.ToArray(); + sourceLocalsList.Clear(); + return array; + } + + readonly List sourceParametersList = new List(); + SourceParameter[] CreateSourceParameters(HashSet variables) { + foreach (var v in variables) { + if (!v.IsParameter) + continue; + sourceParametersList.Add(v.GetSourceParameter()); + } + var array = sourceParametersList.ToArray(); + sourceParametersList.Clear(); + return array; + } + + struct BraceInfo { + public int Start { get; } + public BraceInfo(int start) => Start = start; + } + + BraceInfo StartKeywordBlock(IDecompilerOutput output, string keyword, IMemberDef member) { + output.Write(keyword, BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + output.Write(IdentifierEscaper.Escape(member.Name), member, DecompilerReferenceFlags.Definition, MetadataTextColorProvider.GetColor(member)); + output.Write(" ", BoxedTextColor.Text); + var start = output.NextPosition; + output.Write("{", BoxedTextColor.Punctuation); + output.WriteLine(); + output.IncreaseIndent(); + return new BraceInfo(start); + } + + void EndKeywordBlock(IDecompilerOutput output, BraceInfo info, CodeBracesRangeFlags flags, bool addLineSeparator = false) { + output.DecreaseIndent(); + var end = output.NextPosition; + output.Write("}", BoxedTextColor.Punctuation); + output.AddBracePair(new TextSpan(info.Start, 1), new TextSpan(end, 1), flags); + if (addLineSeparator) + output.AddLineSeparator(end); + output.WriteLine(); + } + + public override void Decompile(EventDef ev, IDecompilerOutput output, DecompilationContext ctx) { + var eventInfo = StartKeywordBlock(output, ".event", ev); + + if (ev.AddMethod is not null) { + var info = StartKeywordBlock(output, ".add", ev.AddMethod); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + if (ev.InvokeMethod is not null) { + var info = StartKeywordBlock(output, ".invoke", ev.InvokeMethod); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + if (ev.RemoveMethod is not null) { + var info = StartKeywordBlock(output, ".remove", ev.RemoveMethod); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + EndKeywordBlock(output, eventInfo, CodeBracesRangeFlags.EventBraces, addLineSeparator: true); + } + + public override void Decompile(FieldDef field, IDecompilerOutput output, DecompilationContext ctx) { + output.Write(IdentifierEscaper.Escape(field.FieldType.GetFullName()), field.FieldType.ToTypeDefOrRef(), DecompilerReferenceFlags.None, MetadataTextColorProvider.GetColor(field.FieldType)); + output.Write(" ", BoxedTextColor.Text); + output.Write(IdentifierEscaper.Escape(field.Name), field, DecompilerReferenceFlags.Definition, MetadataTextColorProvider.GetColor(field)); + var c = field.Constant; + if (c is not null) { + output.Write(" ", BoxedTextColor.Text); + output.Write("=", BoxedTextColor.Operator); + output.Write(" ", BoxedTextColor.Text); + if (c.Value is null) + output.Write("null", BoxedTextColor.Keyword); + else { + switch (c.Type) { + case ElementType.Boolean: + if (c.Value is bool) + output.Write((bool)c.Value ? "true" : "false", BoxedTextColor.Keyword); + else + goto default; + break; + + case ElementType.Char: + output.Write($"'{c.Value}'", BoxedTextColor.Char); + break; + + case ElementType.I1: + case ElementType.U1: + case ElementType.I2: + case ElementType.U2: + case ElementType.I4: + case ElementType.U4: + case ElementType.I8: + case ElementType.U8: + case ElementType.R4: + case ElementType.R8: + case ElementType.I: + case ElementType.U: + output.Write($"{c.Value}", BoxedTextColor.Number); + break; + + case ElementType.String: + output.Write($"{c.Value}", BoxedTextColor.String); + break; + + default: + output.Write($"{c.Value}", BoxedTextColor.Text); + break; + } + } + } + } + + public override void Decompile(PropertyDef property, IDecompilerOutput output, DecompilationContext ctx) { + var propInfo = StartKeywordBlock(output, ".property", property); + + foreach (var getter in property.GetMethods) { + var info = StartKeywordBlock(output, ".get", getter); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + foreach (var setter in property.SetMethods) { + var info = StartKeywordBlock(output, ".set", setter); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + foreach (var other in property.OtherMethods) { + var info = StartKeywordBlock(output, ".other", other); + EndKeywordBlock(output, info, CodeBracesRangeFlags.AccessorBraces); + } + + EndKeywordBlock(output, propInfo, CodeBracesRangeFlags.PropertyBraces, addLineSeparator: true); + } + + public override void Decompile(TypeDef type, IDecompilerOutput output, DecompilationContext ctx) { + this.WriteCommentLine(output, $"Type: {type.FullName}"); + if (type.BaseType is not null) { + WriteCommentBegin(output, true); + output.Write("Base type: ", BoxedTextColor.Comment); + output.Write(IdentifierEscaper.Escape(type.BaseType.FullName), type.BaseType, DecompilerReferenceFlags.None, BoxedTextColor.Comment); + WriteCommentEnd(output, true); + output.WriteLine(); + } + foreach (var nested in type.NestedTypes) { + Decompile(nested, output, ctx); + output.WriteLine(); + } + + int lastFieldPos = -1; + foreach (var field in type.Fields) { + Decompile(field, output, ctx); + lastFieldPos = output.NextPosition; + output.WriteLine(); + } + if (lastFieldPos >= 0) { + output.AddLineSeparator(lastFieldPos); + output.WriteLine(); + } + + foreach (var property in type.Properties) { + Decompile(property, output, ctx); + output.WriteLine(); + } + + foreach (var @event in type.Events) { + Decompile(@event, output, ctx); + output.WriteLine(); + } + + foreach (var method in type.Methods) { + Decompile(method, output, ctx); + output.WriteLine(); + } + } + + internal static IEnumerable GetDebugDecompilers(DecompilerSettingsService decompilerSettingsService) { + double orderUI = DecompilerConstants.ILAST_ILSPY_DEBUG_ORDERUI; + uint id = 0x64A926A5; + yield return new ILAstDecompiler(decompilerSettingsService.ILAstDecompilerSettings, orderUI++, "ILAst (unoptimized)") { + uniqueGuid = new Guid($"CB470049-6AFB-4BDB-93DC-1BB9{id++:X8}"), + inlineVariables = false + }; + string nextName = "ILAst (variable splitting)"; + foreach (ILAstOptimizationStep step in (ILAstOptimizationStep[])Enum.GetValues(typeof(ILAstOptimizationStep))) { + yield return new ILAstDecompiler(decompilerSettingsService.ILAstDecompilerSettings, orderUI++, nextName) { + uniqueGuid = new Guid($"CB470049-6AFB-4BDB-93DC-1BB9{id++:X8}"), + abortBeforeStep = step + }; + nextName = "ILAst (after " + step + ")"; + } + } + + public override string FileExtension => ".il"; + + protected override void TypeToString(IDecompilerOutput output, ITypeDefOrRef? t, bool includeNamespace, IHasCustomAttribute? attributeProvider = null) => + t.WriteTo(output, includeNamespace ? ILNameSyntax.TypeName : ILNameSyntax.ShortTypeName); + } +#endif +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/AssemblyInfo.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5df10df --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("dnSpy.Decompiler.ILSpy.x, PublicKey=0024000004800000940000000602000000240000525341310004000001000100858d4f2519af95faeca8d359daa2078b20826765450f330daff3c5ec378adf9eb8e168eff8069ba51e15c1992d0d72b73129ed7a014f62863fa80a80dd9b010b8211c4d4c70ed26b9b65370007b0341685c98cc4cd2d16814d9581db82b382fb8ee838e1b8a2bd1c759e43ddda209e35cde530a7ba6a517787c04a3f283ea1b5")] diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.Designer.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.Designer.cs new file mode 100644 index 0000000..fe0b207 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.Designer.cs @@ -0,0 +1,415 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace dnSpy.Decompiler.ILSpy.Core.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class dnSpy_Decompiler_ILSpy_Core_Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal dnSpy_Decompiler_ILSpy_Core_Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("dnSpy.Decompiler.ILSpy.Core.Properties.dnSpy.Decompiler.ILSpy.Core.Resources", typeof(dnSpy_Decompiler_ILSpy_Core_Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Add using declarations. + /// + public static string DecompilerSettings_AddUsingDeclarations { + get { + return ResourceManager.GetString("DecompilerSettings_AddUsingDeclarations", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Allow field initializers. + /// + public static string DecompilerSettings_AllowFieldInitializers { + get { + return ResourceManager.GetString("DecompilerSettings_AllowFieldInitializers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Always generate exception variables in catch blocks unless type is Object. + /// + public static string DecompilerSettings_AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject { + get { + return ResourceManager.GetString("DecompilerSettings_AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObjec" + + "t", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompilation order. + /// + public static string DecompilerSettings_DecompilationOrder { + get { + return ResourceManager.GetString("DecompilerSettings_DecompilationOrder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile anonymous methods/lambdas. + /// + public static string DecompilerSettings_DecompileAnonMethods { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileAnonMethods", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile async methods (async/await). + /// + public static string DecompilerSettings_DecompileAsyncMethods { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileAsyncMethods", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile automatic events. + /// + public static string DecompilerSettings_DecompileAutoEvents { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileAutoEvents", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile automatic properties. + /// + public static string DecompilerSettings_DecompileAutoProps { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileAutoProps", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile enumerators (yield return). + /// + public static string DecompilerSettings_DecompileEnumerators { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileEnumerators", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile expression trees. + /// + public static string DecompilerSettings_DecompileExprTrees { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileExprTrees", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile foreach statements. + /// + public static string DecompilerSettings_DecompileForeachStatements { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileForeachStatements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile lock statements. + /// + public static string DecompilerSettings_DecompileLockStatements { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileLockStatements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile query expressions. + /// + public static string DecompilerSettings_DecompileQueryExpr { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileQueryExpr", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile switch on string. + /// + public static string DecompilerSettings_DecompileSwitchOnString { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileSwitchOnString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile using statements. + /// + public static string DecompilerSettings_DecompileUsingStatements { + get { + return ResourceManager.GetString("DecompilerSettings_DecompileUsingStatements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add namespaces to all types. + /// + public static string DecompilerSettings_FullyQualifyAllTypes { + get { + return ResourceManager.GetString("DecompilerSettings_FullyQualifyAllTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add a namespace to types with the same name. + /// + public static string DecompilerSettings_FullyQualifyAmbiguousTypeNames { + get { + return ResourceManager.GetString("DecompilerSettings_FullyQualifyAmbiguousTypeNames", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hexadecimal numbers. + /// + public static string DecompilerSettings_HexadecimalNumbers { + get { + return ResourceManager.GetString("DecompilerSettings_HexadecimalNumbers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use increment and decrement operators. + /// + public static string DecompilerSettings_IntroduceIncrementAndDecrement { + get { + return ResourceManager.GetString("DecompilerSettings_IntroduceIncrementAndDecrement", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use assignment expressions such as in while ((count = Do()) != 0) ;. + /// + public static string DecompilerSettings_MakeAssignmentExpressions { + get { + return ResourceManager.GetString("DecompilerSettings_MakeAssignmentExpressions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max number of array elements to show. + /// + public static string DecompilerSettings_MaxArrayElements { + get { + return ResourceManager.GetString("DecompilerSettings_MaxArrayElements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max string length. + /// + public static string DecompilerSettings_MaxStringLength { + get { + return ResourceManager.GetString("DecompilerSettings_MaxStringLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add 'private' modifier to type members. + /// + public static string DecompilerSettings_MemberAddPrivateModifier { + get { + return ResourceManager.GetString("DecompilerSettings_MemberAddPrivateModifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decompile object or collection initializers. + /// + public static string DecompilerSettings_ObjectOrCollectionInitializers { + get { + return ResourceManager.GetString("DecompilerSettings_ObjectOrCollectionInitializers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show one custom attribute per line. + /// + public static string DecompilerSettings_OneCustomAttributePerLine { + get { + return ResourceManager.GetString("DecompilerSettings_OneCustomAttributePerLine", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove empty default constructors. + /// + public static string DecompilerSettings_RemoveEmptyDefaultCtors { + get { + return ResourceManager.GetString("DecompilerSettings_RemoveEmptyDefaultCtors", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replace 'new delegate-class(xxx)' with 'xxx'. + /// + public static string DecompilerSettings_RemoveNewDelegateClass { + get { + return ResourceManager.GetString("DecompilerSettings_RemoveNewDelegateClass", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show hidden compiler generated types and methods. + /// + public static string DecompilerSettings_ShowCompilerGeneratedTypes { + get { + return ResourceManager.GetString("DecompilerSettings_ShowCompilerGeneratedTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show IL opcode comments. + /// + public static string DecompilerSettings_ShowILComments { + get { + return ResourceManager.GetString("DecompilerSettings_ShowILComments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show IL instruction bytes. + /// + public static string DecompilerSettings_ShowILInstrBytes { + get { + return ResourceManager.GetString("DecompilerSettings_ShowILInstrBytes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show line numbers and filenames if available. + /// + public static string DecompilerSettings_ShowPdbInfo { + get { + return ResourceManager.GetString("DecompilerSettings_ShowPdbInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show tokens, RVAs and file offsets. + /// + public static string DecompilerSettings_ShowTokensRvasOffsets { + get { + return ResourceManager.GetString("DecompilerSettings_ShowTokensRvasOffsets", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show XML documentation in decompiled code. + /// + public static string DecompilerSettings_ShowXMLDocComments { + get { + return ResourceManager.GetString("DecompilerSettings_ShowXMLDocComments", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sort custom attributes. + /// + public static string DecompilerSettings_SortCustomAttributes { + get { + return ResourceManager.GetString("DecompilerSettings_SortCustomAttributes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sort methods, fields, properties, events and types. + /// + public static string DecompilerSettings_SortMethods { + get { + return ResourceManager.GetString("DecompilerSettings_SortMethods", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Place 'System' directives first when sorting usings. + /// + public static string DecompilerSettings_SortSystemFirst { + get { + return ResourceManager.GetString("DecompilerSettings_SortSystemFirst", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add 'internal' modifier to types. + /// + public static string DecompilerSettings_TypeAddInternalModifier { + get { + return ResourceManager.GetString("DecompilerSettings_TypeAddInternalModifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use variable names from debug symbols, if available. + /// + public static string DecompilerSettings_UseLocalNameFromSyms { + get { + return ResourceManager.GetString("DecompilerSettings_UseLocalNameFromSyms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Order members in source code order. + /// + public static string DecompilerSettings_UseSourceCodeOrder { + get { + return ResourceManager.GetString("DecompilerSettings_UseSourceCodeOrder", resourceCulture); + } + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.cs.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.cs.resx new file mode 100644 index 0000000..1ecd212 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.cs.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Přidat deklaraci using + + + Přidat inicializátory pole + + + Vždy generovat proměnné výjimek v blocích catch, dokud je typ objekt + + + Pořadí dekompilace + + + Dekompilovat anonymní metody/lambda výrazy + + + Dekompilovat asynchronní metody (async/await) + + + Dekompilovat automatické události + + + Dekompilovat automatické vlastnosti + + + Dekompilovat enumerátory (yield return) + + + Dekompilovat stromy výrazů + + + Dekompilovat foreach konstrukce + + + Dekompilovat lock deklarace + + + Dekompilovat query výrazy + + + Dekompilovat spínač na řetězec + + + Dekompilovat prohlášení using + + + Přidat jmenné prostory pro všechny typy + + + Přidat jmenné prostory pro typy se stejným názvem + + + Hexadecimal numbers + + + Použít operátory zvyšování a snižování + + + Použít výrazy přiřazení jako například v: while ((count = Do()) != 0) ; + + + Maximální počet zobrazených prvků pole + + + Maximální délka řetězce + + + Přidat 'private' modifikátor pro členy typu + + + Dekompilovat objekt nebo iniciátory kolekce + + + Zobrazit jeden vlastní atribut na řádek + + + Odstranit prázdné výchozí konstruktory + + + Nahradit 'new delegate-class(xxx)' slovy 'xxx' + + + Zobrazit skryté typy a metody generované kompilátorem + + + Zobrazit komentáře opkódů IL + + + Zobrazit bajty IL instrukce + + + Zobrazit čísla řádku a jména souborů, pokud jsou k dispozici + + + Zobrazit tokeny, RVA a ofsety + + + Zobrazit XML dokumentaci v dekompilovaném kódu + + + Seřadit vlastní atributy + + + Seřadit metody, pole, vlastnosti, události a typy + + + Umístit direktivy 'System' jako první při třídění + + + Přidat na typy modifikátor 'internal' + + + Použít názvy proměnných ze symbolů ladění, pokud jsou k dispozici + + + Uspořádat členy v pořadí zdrojového kódu + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.de.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.de.resx new file mode 100644 index 0000000..30d0301 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.de.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Using Deklarationen hinzufügen + + + Felder initialisieren + + + Immer Variable für Ausnahme im catch-Block generieren außer der Typ ist Object + + + Dekompilierungsreihenfolge + + + Anonyme Methoden/Lambda-Ausdrücke dekompilieren + + + Async-Methoden (async/await) dekompilieren + + + Automatisch implementierte Ereignisse dekompilieren + + + Automatisch implementierte Eigenschaften dekompilieren + + + Enumeratoren (yield return) dekompilieren + + + Ausdrucksbaumstrukturen dekompilieren + + + foreach-Anweisungen dekompilieren + + + lock-Anweisungen dekompilieren + + + Abfrageausdrücke dekompilieren + + + Switch-Anweisungen mit Zeichenfolgen dekompilieren + + + using-Anweisungen dekompilieren + + + Allen Typen einen Namespace hinzufügen + + + Typen mit dem gleichen Namen einen Namespace hinzufügen + + + Hexadezimale Zahlen + + + Inkrement- und Dekrementoperatoren verwenden + + + Verwende Zuweisungsausdrücke wie in while ((count = Do()) != 0); + + + Maximale Anzahl an anzuzeigenden Array-Elementen + + + Maximale Zeichenkettenlänge + + + Modifizierer 'private' zu Typmembern hinzufügen + + + Dekompiliere Objekt oder Auflistung Initialisierungen + + + Ein Attribut pro Zeile anzeigen + + + Leere Standardkonstruktoren entfernen + + + 'new delegate-class(xxx)' durch 'xxx' ersetzen + + + Versteckte Compiler generierte Typen und Methoden anzeigen + + + IL-Opcode Kommentare anzeigen + + + Bytes der IL Instruktion anzeigen + + + Dateinamen und Zeilennummern bei Verfügbarkeit anzeigen + + + Token, RVAs und Datei-Offsets anzeigen + + + XML-Dokumentation in dekompiliertem Code anzeigen + + + Benutzerdefinierte Attribute sortieren + + + Methoden, Felder, Eigenschaften, Ereignisse und Typen sortieren + + + "System"-Direktiven beim Sortieren von using-Direktiven zuerst anordnen + + + Modifizierer 'internal' zu Typen hinzufügen + + + Variablennamen von Debugsymbolen verwenden, falls vorhanden + + + Member wie im Quellcode anordnen + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.es-ES.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.es-ES.resx new file mode 100644 index 0000000..621312b --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.es-ES.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Añadir declaraciones using + + + Permiten a inicializadores de campo + + + Genere siempre variables de excepción en bloques catch a menos que el tipo sea Object + + + Orden de descompilación + + + Descompilar métodos anónimos/lambdas + + + Descompilar métodos asincrónicos (async/await) + + + Descompilar eventos automáticamente + + + Descompilar propiedades automáticamente + + + Descompilar enumeradores (retorno yield) + + + Descompilar árboles de expresión + + + Descompilar declaraciones foreach + + + Descompilar declaraciones de bloqueo + + + Descompilar expresiones de consulta + + + Descompilar interruptor de cadena + + + Descompilar sentencias using + + + Agregar espacios de nombre a todos los tipos + + + Añadir un espacio de nombre a los tipos con el mismo nombre + + + Números hexadecimales + + + Uso de incremento y decremento de operadores + + + Asignación de expresiones tales como while ((Count = Do())! = 0); + + + Número máximo de elementos de matriz para mostrar + + + Longitud máxima de cadena + + + Añadir el modificador 'private' para miembros type + + + Descompilar los inicializadores de objeto o colección + + + Mostrar un atributo personalizado por línea + + + Quitar los constructores predeterminados de vacío + + + Reemplazar 'delegate-class(xxx) nuevo' con 'xxx' + + + Mostrar los tipos y métodos ocultos generados por el compilador + + + Mostrar los comentarios de opcode IL + + + Mostrar las instrucciones bytes IL + + + Mostrar números de línea y nombres de archivos si están disponibles + + + Mostrar fichas, RVAs y compensaciones de archivo + + + Mostrar la documentación XML en código descompilado + + + Ordenar atributos personalizados + + + Ordenar los métodos, campos, propiedades, eventos y tipos + + + Colocar la directiva 'using System' en primer al ordenar los using´s + + + Agregue el modificador 'internal' a tipos + + + Utilice nombres de variables de símbolos de depuración, si está disponible + + + Ordene miembros en orden de código fuente + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fa.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fa.resx new file mode 100644 index 0000000..9063982 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fa.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + اضافه کردن با استفاده از تعاریف + + + اجازه دادن به فیلد آغازگر + + + همیشه متغیرهای exception را در بلاک های catch ایجادکن مگر اینکه نوع Object باشد + + + ترتیب دیکامپایل + + + دیکامپایل method/lambda های ناشناس + + + دیکامپایل متودهای ناهمگام (async/await) + + + دیکامپایل event های خودکار + + + دیکامپایل خواص خودکار + + + دیکامپایل شمارنده ها (بازگشت yield) + + + دیکامپایل درخت های expression + + + دیکامپایل foreach statements + + + دیکامپایل lock statements + + + دیکامپایل query expressions + + + دیکامپایل سوئیچ در رشته + + + دیکامپایل با استفاده از statement ها + + + اضافه کردن فضاهای نام به همه تایپ ها + + + اضافه کردن فضای نام به انواع با نام مشابه + + + اعداد هگز + + + استفاده از اپراتورهای افزایشی و کاهشی + + + استفاده از انتصاب اصطلاحات مانند استفاده در while ها ((count = Do()) != 0) ; + + + حداکثر تعداد عناصر آرایه برای نشان دادن + + + حداکثر طول رشته + + + اضافه کردن اصلاح کننده 'خصوصی'به اعضای تایپ + + + دیکامپایل آبجکت یا مجموعه ی آغازگرها + + + نمایش یک attribute سفارشی شده در هر خط + + + حذف constructor های خالی پیشفرض + + + جایگزینی 'new delegate-class(xxx)' با 'xxx' + + + نمایش متودها و تایپ های مخفی تولید شده توسط دیکامپایلر + + + نمایش توضیحات IL opcode + + + نمایش بایت های دستورات IL + + + نمایش شماره خط و نام فایل در صورت وجود + + + نشان دادن token ها، RVA ها و آفست های فایل + + + نمایش مستندات XML در کد های دیکامپایل شده + + + مرتب کردن attribute های سفارشی + + + مرتب کردن method ها، field ها، propertie ها، event ها و type ها + + + دستورالعمل های 'System' را هنگام مرتب سازی using ها ابتدا قرار بده + + + اضافه کردن اصلاح کننده "داخلى" به تایپ ها + + + استفاده از نام متغیرها از سیمبول های دیباگ، در صورت وجود + + + منظم کردن اعضا در ترتیب سورس کد + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fr.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fr.resx new file mode 100644 index 0000000..e709bd9 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.fr.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ajouter les déclarations "using" + + + Autoriser les "initializers" de champs + + + Toujours générer des variables d’exception dans les blocs "catch" sauf si le type est Object + + + Ordre de décompilation + + + Décompiler les méthodes anonymes/lambda + + + Décompiler des méthodes asynchrones (async/await) + + + Décompiler les events automatiques + + + Décompiler les propriétés automatiques + + + Décompiler les énumérateurs (yield) + + + Décompiler les arbres d'expressions + + + Décompiler les "foreach" + + + Décompiler les "lock" + + + Décompiler les expressions de requêtes + + + Décompiler le switch sur string + + + Décompiler les instructions "using" + + + Ajouter des espaces de noms à tous les types + + + Ajouter un espace de noms aux types portant le même nom + + + Nombres hexadécimaux + + + Utiliser les opérateurs incrémentaux/décrémentaux + + + Utiliser des expressions d’assignation comme dans while((c = Executer()) !=0); + + + Nombre maximal d’éléments de tableau à afficher + + + Longueur de chaîne maximale + + + Ajoutez le modificateur « privé » pour les membres de type + + + Décompiler les initialiseurs d’objets ou de collections + + + Afficher un attribut personnalisé par ligne + + + Supprimer les constructeurs par défaut vides + + + Remplacer « new delegate-class(xxx) » par « xxx » + + + Afficher les types et méthodes générées cachées par le compilateur + + + Afficher les commentaires d'opcode IL + + + Afficher les bytes des instructions de l'IL + + + Afficher les numéros de lignes et noms de fichiers si disponibles + + + Afficher les tokens, RVAs et offsets dans les fichiers + + + Afficher la documentation XML dans le code décompilé + + + Trier les attributs personnalisés + + + Trier les méthodes, champs, propriétés, events et types + + + Priorité donnée aux "system" lors du tri des "using" + + + Ajoutez le modificateur « interne » aux types + + + Utilisez des noms de variables de symboles de débogage, si disponible + + + Membres triés selon l’ordre du code source + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.hu.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.hu.resx new file mode 100644 index 0000000..e363558 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.hu.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + using deklarciók hozzáadása + + + Mező inicializálók engedélyezése + + + Mindig generáljon kivétel változókat az elkapó blokkban, kivéve ha a típus Object + + + Visszafordítási sorrend + + + Anoním metódusok/lambdák visszafordítása + + + Aszinkron metódusok (async/await) visszafordítása + + + Automatikus események visszafordítása + + + Automatikus tulajdonságok visszafordítása + + + Enumerátorok (yield return) visszafordítása + + + Kifejezés fák visszafordítása + + + foreach utasítások visszafordítása + + + lock utasítások visszafordítása + + + Lekérdező kifejezések visszafordítása + + + Karakterláncon végzett switch visszafordítása + + + Using utasítások visszafordítása + + + Névtér hozzáadása minden típushoz + + + Névtér hozzáadása az azonos nevű típusokhoz + + + Hexadecimális számok + + + Növelő és csökkentő operátorok használata + + + Hozzárendelő kifejezések használata, mint pl. while ((count = Do()) != 0) ; + + + Maximum megjelenítendő tömb elemek száma + + + Maximális karakterlánc hossz + + + A 'private' módosító hozzáadása a típus tagokhoz + + + Objektum és gyűjtemény inicializálók visszafordítása + + + Egy egyedi attribútum mutatása soronként + + + Üres alapértelmezett konstrukturok eltávolítása + + + A 'new delegate-class(xxx)' kicserélése 'xxx'-re + + + Mutassa a rejtett, fordító által generált típusokat és metódusokat + + + IL opcode megjegyzések mutatása + + + IL utasítás bájtok mutatása + + + Mutassa a sorszámokat és a fájlneveket, ha elérhetőek + + + Mutassa a token-eket, RVA-kat és a fájl eltolásokat + + + Mutassa az XML dokumentációt a visszafordított kódban + + + Egyéni attribútumok rendezése + + + Rendezze a metódusokat, mezőket, tulajdonságokat, eseményeket és típusokat + + + A 'System' direktívákat vegye előre a using-ok rendezésekor + + + 'internal' módosító hozzáadása a típusokhoz + + + Használja a hibakeresési szimbólumok szerinti változó neveket, ha elérhetőek + + + Tagok rendezése a forráskód szerint + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.it.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.it.resx new file mode 100644 index 0000000..8320f3f --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.it.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aggiungere mediante dichiarazioni + + + Consentire gli inizializzatori di campo + + + Generare sempre le variabili di eccezione in blocchi catch a meno che tipo non sia un oggetto + + + Ordine di decompilazione + + + Decompila metodi/lambda anonimi + + + Decompila metodi async (async/await) + + + Decompila gli eventi automatici + + + Decompila proprietà automatiche + + + Decompila gli enumeratori (yield return) + + + Decompila alberi espressione + + + Decompila istruzioni foreach + + + Decompila istruzioni lock + + + Decompila espressioni query + + + Decompila switch sulla stringa + + + Decompila usando istruzioni + + + Aggiungi spazi dei nomi per tutti i tipi + + + Aggiungi uno spazio dei nomi per i tipi con lo stesso nome + + + Numeri esadecimali + + + Utilizza operatori di incremento e decremento + + + Utilizza le espressioni di assegnazione così come nel while ((count = Do()) != 0) ; + + + Numero massimo di elementi della matrice da mostrare + + + Lunghezza massima della stringa + + + Aggiungi il modificatore 'private' ai membri di tipo + + + Decompila oggetto o inizializzatori di collezione + + + Mostra un attributo personalizzato per riga + + + Rimuovi i costruttori predefiniti vuoti + + + Sostituire 'nuova delegate-class(xxx)' con 'xxx' + + + Visualizza i metodi e i tipi nascosti generati dal compilatore + + + Visualizza il commento sul codice operativo IL + + + Visualizza i byte di instruzione del codie IL + + + Mostra i numeri di linea ed i nomi dei file, se disponibili + + + Visualizza token, RVA e offset del file + + + Visualizza documentazione XML nel codice decompilato + + + Ordina attributi personalizzati + + + Ordina metodi, campi, proprietà, eventi e tipi + + + Porta le direttive 'System' al primo posto quando si usa l'ordinamento + + + Aggiungi il modificatore 'internal' ai tipi + + + Utilizza nomi di variabili da simboli di debug, se disponibili + + + Ordina i membri nell'ordine del codice sorgente + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-BR.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-BR.resx new file mode 100644 index 0000000..4389abe --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-BR.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Adicionar declarações 'using' + + + Permitir inicializadores de campo + + + Sempre gerar variáveis de exceção em blocos catch, a menos que o tipo seja Object + + + Ordem de descompilação + + + Descompilar métodos/lambdas anônimos + + + Descompilar métodos assíncronos (async/await) + + + Descompilar eventos automáticos + + + Descompilar propriedades automáticas + + + Descompilar enumeradores (yield return) + + + Descompilar árvores de expressão + + + Descompilar instruções foreach + + + Descompilar instruções lock + + + Descompilar expressões query + + + Descompilar switch on string + + + Descompilar usando instruções + + + Adicionar namespaces a todos os tipos + + + Adicionar um namespace para tipos com o mesmo nome + + + Números hexadecimais + + + Usar operadores de incremento e decremento + + + Utilize expressões de atribuição, como em while ((count = Do()) != 0) ; + + + Número máximo de elementos do array para mostrar + + + Comprimento máximo do texto + + + Adicionar modificador 'private' aos membros de tipo + + + Descompilar objetos ou inicializadores de coleção + + + Mostrar um atributo personalizado por linha + + + Remover os construtores padrão vazio + + + Substituir 'new delegate-class(xxx)' por 'xxx' + + + Mostrar tipos e métodos escondidos gerados pelo compilador + + + Mostrar comentários IL opcode + + + Mostrar bytes de instruções IL + + + Mostrar números de linhas e nomes de arquivos, se disponível + + + Mostrar tokens, RVAs e arquivos offsets + + + Exibir a documentação XML no código descompilado + + + Classificar atributos personalizados + + + Classificar métodos, campos, propriedades, eventos e tipos + + + Posicionar diretivas do 'Sistema' primeiro ao classificar + + + Adicionar modificador 'interno' aos tipos + + + Utilizar nomes de variáveis de símbolos de depuração, se disponíveis + + + Classificar membros em ordem de código fonte + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-PT.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-PT.resx new file mode 100644 index 0000000..d434f3e --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.pt-PT.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Adicionar usando declarações + + + Permitir inicializadores de campo + + + Sempre gerar variáveis de exceção em blocos catch, a menos que o tipo seja Object + + + Ordem de descompilação + + + Descompilar métodos/lambdas anônimos + + + Descompilar métodos assíncronos (async/await) + + + Descompilar eventos automáticos + + + Descompilar propriedades automáticas + + + Descompilar enumerators (yield return) + + + Descompilar árvores de expressão + + + Descompilar declarações foreach + + + Descompilar instruções lock + + + Descompilar expressões de consulta + + + Descompilar switch on string + + + Descompilar instruções using + + + Adicionar namespaces para todos os tipos + + + Adicionar um namespace para tipos com o mesmo nome + + + Números hexadecimais + + + Usar operadores de incremento e decremento + + + Usar expressões de atribuição, tal como em while ((cont = Do())! = 0); + + + Número máximo de elementos em array para mostrar + + + Comprimento máximo do texto + + + Adicionar o modificador 'private' aos membros de tipo + + + Descompilar objetos ou inicializadores de coleção + + + Mostrar um atributo personalizado por linha + + + Remover construtores padrão vazios + + + Substituir 'new delegate-class(xxx)' por 'xxx' + + + Mostrar tipos e métodos escondidos gerados pelo compilador + + + Mostrar comentários IL opcode + + + Mostrar bytes de instruções IL + + + Mostrar números de linha e nomes de ficheiro se disponíveis + + + Mostrar tokens, RVAs e offsets de ficheiros + + + Mostrar a documentação XML no código descompilado + + + Ordenar atributos personalizados + + + Ordenar métodos, campos, propriedades, eventos e tipos + + + Posicionar diretivas 'Sistema' primeiro ao ordenar usings + + + Adicionar o modificador 'internal' aos tipos + + + Usar nomes de variáveis de símbolos de depuração, se disponível + + + Ordenar membros em ordem de código fonte + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.resx new file mode 100644 index 0000000..b8cef62 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Add using declarations + + + Allow field initializers + + + Always generate exception variables in catch blocks unless type is Object + + + Decompilation order + + + Decompile anonymous methods/lambdas + + + Decompile async methods (async/await) + + + Decompile automatic events + + + Decompile automatic properties + + + Decompile enumerators (yield return) + + + Decompile expression trees + + + Decompile foreach statements + + + Decompile lock statements + + + Decompile query expressions + + + Decompile switch on string + + + Decompile using statements + + + Add namespaces to all types + + + Add a namespace to types with the same name + + + Hexadecimal numbers + + + Use increment and decrement operators + + + Use assignment expressions such as in while ((count = Do()) != 0) ; + + + Max number of array elements to show + + + Max string length + + + Add 'private' modifier to type members + + + Decompile object or collection initializers + + + Show one custom attribute per line + + + Remove empty default constructors + + + Replace 'new delegate-class(xxx)' with 'xxx' + + + Show hidden compiler generated types and methods + + + Show IL opcode comments + + + Show IL instruction bytes + + + Show line numbers and filenames if available + + + Show tokens, RVAs and file offsets + + + Show XML documentation in decompiled code + + + Sort custom attributes + + + Sort methods, fields, properties, events and types + + + Place 'System' directives first when sorting usings + + + Add 'internal' modifier to types + + + Use variable names from debug symbols, if available + + + Order members in source code order + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.ru.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.ru.resx new file mode 100644 index 0000000..31a5dfb --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.ru.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Добавить определения using + + + Разрешить инициализаторы полей + + + Всегда создавать переменные исключения в блоках catch, если тип не Object + + + Порядок декомпиляции + + + Декомпилировать анонимные методы/лямбды + + + Декомпилировать асинхронные методы (async/await) + + + Декомпилировать автоматические события + + + Декомпилировать автоматические свойства + + + Декомпилировать перечислители (yield return) + + + Декомпилировать деревья выражений + + + Декомпилировать операторы foreach + + + Декомпилировать операторы lock + + + Декомпилировать выражения запросов + + + Декомпилировать switch по строкам + + + Декомпилировать операторы using + + + Добавить пространства имен во все типы + + + Добавить пространство имен в типы с таким же именем + + + Шестнадцатеричные цифры + + + Использовать операторы инкремента и декремента + + + Использовать выражения присваивания, такие как в while ((count = Do()) != 0); + + + Максимальное количество отображаемых элементов массива + + + Максимальная длина строки + + + Добавить модификатор 'private' к членам типа + + + Декомпилировать инициализаторы объекта или коллекции + + + Показывать по одному атрибуту на строке + + + Удалить пустые конструкторы по умолчанию + + + Заменить «new delegate-class(xxx)» на «xxx» + + + Показывать скрытые типы и методы, созданные компилятором + + + Показать комментарии к IL-инструкциям + + + Показывать байты IL-инструкций + + + Показать номера строк и имена файлов, если имеются + + + Показывать токены, RVA и смещения в файле + + + Показать документацию XML в декомпилированном коде + + + Сортировать пользовательские атрибуты + + + Сортировать методы, поля, свойства, события и типы + + + Поместить директивы 'System' в начало при сортировке + + + Добавить модификатор 'internal' к типам + + + Использовать имена переменных из отладочных символов, при наличии + + + Сортировать члены как в исходном коде + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.tr.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.tr.resx new file mode 100644 index 0000000..e8ea3cb --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.tr.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Kullanılan bildirimleri ekle + + + Alan başlatıcılara izin ver + + + Tip Object değilken her zaman catch bloklarında her zaman isnisna değişkenler üret + + + Geri derleme sırası + + + Anonim method/lambda ları geri derle + + + Asenkron methodları (async/await) geri derle + + + Otomatik olayları geri derle + + + Otomatik özellikleri geri derle + + + Enumaretörleri (verim getirisi) geri derle + + + İfade ağaçlarını geri derle + + + Her ifade için geri derle + + + Kitli ifadeleri geri derle + + + Sorgu ifadelerini geri derle + + + Dizideki anahtarları geri derle + + + İfadeleri kullanarak geri derle + + + Tüm tipler için isim boşlukları ekle + + + Aynı isimdeki tipler için bir isim boşluğu ekle + + + Onaltılık sayılar + + + Artış ve azalış uygulayıcıları kullan + + + ((count = Do()) != 0); gibi atanmış ifadeleri kullan + + + Gösterilebilecek maksimum dizi elementi sayısı + + + Maksimum metin uzunluğu + + + Tip üyelerine 'gizli' değişimi ekle + + + Başlatıcı derlemesini veya objeyi geri derle + + + Her hat için bir nitelik göster + + + Varsayılan boş kurucuları kaldır + + + 'new delegate-class(xxx)' ı 'xxx' ile değiştir + + + Gizli derleyici tarafından oluşturulan türleri ve yöntemleri göster + + + IL opcode yorumlarını göster + + + IL komut bitlerini göster + + + Mümkünse hat numaralarını ve dosya isimlerini göster + + + Belirteçleri, RVA ları ve dosya denkleştirmelerini göster + + + Geri derlenmiş koddaki XML dökümanlarını göster + + + Özel nitelikleri sınıflandır + + + Metodları, alanları, özellikleri, olayları ve tipleri sınıflandır + + + Kullanılanları sınıflandırırken 'sistem' direktiflerini ilk olarak yerleştir + + + Tiplere 'iç' değiştirici ekle + + + Mümkünse, hata ayıklanmış sembollerden değişken isimler kullan + + + Kaynak kod sırasındaki diğer üyeler + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.uk.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.uk.resx new file mode 100644 index 0000000..584ccb5 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.uk.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Додати за допомогою декларацій + + + Дозволити ініціалізатори поля + + + Завжди генерувати exception змінні в catch-блоках, якщо ти не Object + + + Порядок Декомпіляції + + + Декомпілювати анонімні методи/lambdas + + + Декомпілювати async методи (async/await) + + + Декомпілювати автоматичні події + + + Декомпілювати автоматичні властивості + + + Декомпілювати перечислення (yield return) + + + Декомпілювати дерева виразів + + + Декомпілювати оператори foreach + + + Декомпілювати оператори lock + + + Декомпілювати вирази запитів + + + Декомпілювати switch по стрічках + + + Декомпілювати оператори using + + + Додати простори імен для всіх типів + + + Додати простір імен в типи с таким же ім'ям + + + Шістнадцяткові числа + + + Використати оператори інкременту та декременту + + + Використати вирази присвоєння такі, як у while ((count = Do()) != 0); + + + Показувати максимальну кількість елементів масиву + + + Максимальна довжина стрічки + + + Додати модифікатор 'private' до членів типу + + + Декомпілювати ініціалізатори об'єкта чи колекції + + + Показувати по одному атрибуту на рядку + + + Видаляти пусті конструктори по замовчуванню + + + Замінити «new delegate-class(xxx)» на «xxx» + + + Показати приховані типи і методи, створені компілятором + + + Показати коментарі до IL інструкцій + + + Показати байти інструкцій IL + + + Показати номери рядків та імена файлів + + + Показувати токени, RVA і офсети у файлі + + + Показати XML документацію в декомпільованому коді + + + Сортувати користувацькі атрибути + + + Сортувати методи, поля, властивості, події і типи + + + Помістити 'System'-ні директиви на початок при сортуванні + + + Додати модифікатор 'internal' до типів + + + Використовувати імена змінних із дебаг символів, при наявності + + + Сортувати члени як в джерельному коді + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.zh-CN.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.zh-CN.resx new file mode 100644 index 0000000..d96c4e3 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Properties/dnSpy.Decompiler.ILSpy.Core.Resources.zh-CN.resx @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 添加using声明 + + + 允许字段初始值设定项语法 + + + 在catch块中总是生成异常变量,除非类型为Object + + + 反编译顺序 + + + 反编译匿名方法/lambda方法 + + + 反编译异步方法(async/await) + + + 反编译自动生成的事件 + + + 反编译自动生成的属性 + + + 反编译枚举器(yield return) + + + 反编译表达式树(Expression Trees) + + + 反编译foreach语句 + + + 反编译lock语句 + + + 反编译查询表达式 + + + 反编译string类型的switch语句 + + + 反编译using语句 + + + 将命名空间名添加到所有类型 + + + 将命名空间名添加到具有相同名称的类型 + + + 十六进制数 + + + 使用增量和减量运算符 + + + 在流程控制语句中使用赋值表达式(如while ((count = Do()) != 0) ;) + + + 要显示的数组元素最大数量 + + + 最大字符串长度 + + + 添加private标识符到类成员 + + + 反编译对象或集合的初始值设定项 + + + 每行显示一个自定义特性 + + + 移除空的默认构造函数 + + + 将 “new delegate-class(xxx)” 替换为 “xxx” + + + 显示编译器生成的隐藏类型和方法 + + + 显示IL操作码注释 + + + 显示IL指令字节 + + + 显示行号和文件名(如果可用) + + + 显示标记,RVA和文件偏移 + + + 在反编译的代码中显示 XML 文档 + + + 排序自定义特性 + + + 排序方法、 字段、 属性、 事件和类型 + + + 在排序using时将System系列置于首位 + + + 添加internal标识符到类 + + + 如果可用,使用debug symbols声明的变量名称 + + + 按源代码顺序排序成员 + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/CSharpVBDecompilerSettings.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/CSharpVBDecompilerSettings.cs new file mode 100644 index 0000000..b474ced --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/CSharpVBDecompilerSettings.cs @@ -0,0 +1,281 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.Properties; +using dnSpy.Decompiler.Settings; +using ICSharpCode.Decompiler; + +namespace dnSpy.Decompiler.ILSpy.Core.Settings { + sealed class CSharpVBDecompilerSettings : DecompilerSettingsBase { + public DecompilerSettings Settings => decompilerSettings; + readonly DecompilerSettings decompilerSettings; + + public override int Version => decompilerSettings.SettingsVersion; + public override event EventHandler? VersionChanged; + + public CSharpVBDecompilerSettings(DecompilerSettings? decompilerSettings = null) { + this.decompilerSettings = decompilerSettings ?? new DecompilerSettings(); + options = CreateOptions().ToArray(); + this.decompilerSettings.SettingsVersionChanged += DecompilerSettings_SettingsVersionChanged; + } + + void DecompilerSettings_SettingsVersionChanged(object? sender, EventArgs e) => VersionChanged?.Invoke(this, EventArgs.Empty); + + public override DecompilerSettingsBase Clone() => new CSharpVBDecompilerSettings(decompilerSettings.Clone()); + + public override IEnumerable Options => options; + readonly IDecompilerOption[] options; + + IEnumerable CreateOptions() { + yield return new DecompilerOption(DecompilerOptionConstants.MemberOrder_GUID, + () => GetMemberOrder(), a => SetMemberOrder(a)) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompilationOrder, + Name = DecompilerOptionConstants.MemberOrder_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AnonymousMethods_GUID, + () => decompilerSettings.AnonymousMethods, a => decompilerSettings.AnonymousMethods = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileAnonMethods, + Name = DecompilerOptionConstants.AnonymousMethods_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ExpressionTrees_GUID, + () => decompilerSettings.ExpressionTrees, a => decompilerSettings.ExpressionTrees = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileExprTrees, + Name = DecompilerOptionConstants.ExpressionTrees_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.YieldReturn_GUID, + () => decompilerSettings.YieldReturn, a => decompilerSettings.YieldReturn = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileEnumerators, + Name = DecompilerOptionConstants.YieldReturn_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AsyncAwait_GUID, + () => decompilerSettings.AsyncAwait, a => decompilerSettings.AsyncAwait = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileAsyncMethods, + Name = DecompilerOptionConstants.AsyncAwait_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AutomaticProperties_GUID, + () => decompilerSettings.AutomaticProperties, a => decompilerSettings.AutomaticProperties = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileAutoProps, + Name = DecompilerOptionConstants.AutomaticProperties_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AutomaticEvents_GUID, + () => decompilerSettings.AutomaticEvents, a => decompilerSettings.AutomaticEvents = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileAutoEvents, + Name = DecompilerOptionConstants.AutomaticEvents_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.UsingStatement_GUID, + () => decompilerSettings.UsingStatement, a => decompilerSettings.UsingStatement = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileUsingStatements, + Name = DecompilerOptionConstants.UsingStatement_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ForEachStatement_GUID, + () => decompilerSettings.ForEachStatement, a => decompilerSettings.ForEachStatement = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileForeachStatements, + Name = DecompilerOptionConstants.ForEachStatement_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.LockStatement_GUID, + () => decompilerSettings.LockStatement, a => decompilerSettings.LockStatement = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileLockStatements, + Name = DecompilerOptionConstants.LockStatement_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.SwitchStatementOnString_GUID, + () => decompilerSettings.SwitchStatementOnString, a => decompilerSettings.SwitchStatementOnString = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileSwitchOnString, + Name = DecompilerOptionConstants.SwitchStatementOnString_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.UsingDeclarations_GUID, + () => decompilerSettings.UsingDeclarations, a => decompilerSettings.UsingDeclarations = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_AddUsingDeclarations, + Name = DecompilerOptionConstants.UsingDeclarations_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.QueryExpressions_GUID, + () => decompilerSettings.QueryExpressions, a => decompilerSettings.QueryExpressions = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_DecompileQueryExpr, + Name = DecompilerOptionConstants.QueryExpressions_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.FullyQualifyAmbiguousTypeNames_GUID, + () => decompilerSettings.FullyQualifyAmbiguousTypeNames, a => decompilerSettings.FullyQualifyAmbiguousTypeNames = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_FullyQualifyAmbiguousTypeNames, + Name = DecompilerOptionConstants.FullyQualifyAmbiguousTypeNames_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.FullyQualifyAllTypes_GUID, + () => decompilerSettings.FullyQualifyAllTypes, a => decompilerSettings.FullyQualifyAllTypes = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_FullyQualifyAllTypes, + Name = DecompilerOptionConstants.FullyQualifyAllTypes_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.UseDebugSymbols_GUID, + () => decompilerSettings.UseDebugSymbols, a => decompilerSettings.UseDebugSymbols = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_UseLocalNameFromSyms, + Name = DecompilerOptionConstants.UseDebugSymbols_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ObjectOrCollectionInitializers_GUID, + () => decompilerSettings.ObjectOrCollectionInitializers, a => decompilerSettings.ObjectOrCollectionInitializers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ObjectOrCollectionInitializers, + Name = DecompilerOptionConstants.ObjectOrCollectionInitializers_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowXmlDocumentation_GUID, + () => decompilerSettings.ShowXmlDocumentation, a => decompilerSettings.ShowXmlDocumentation = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowXMLDocComments, + Name = DecompilerOptionConstants.ShowXmlDocumentation_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.RemoveEmptyDefaultConstructors_GUID, + () => decompilerSettings.RemoveEmptyDefaultConstructors, a => decompilerSettings.RemoveEmptyDefaultConstructors = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_RemoveEmptyDefaultCtors, + Name = DecompilerOptionConstants.RemoveEmptyDefaultConstructors_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.IntroduceIncrementAndDecrement_GUID, + () => decompilerSettings.IntroduceIncrementAndDecrement, a => decompilerSettings.IntroduceIncrementAndDecrement = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_IntroduceIncrementAndDecrement, + Name = DecompilerOptionConstants.IntroduceIncrementAndDecrement_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.MakeAssignmentExpressions_GUID, + () => decompilerSettings.MakeAssignmentExpressions, a => decompilerSettings.MakeAssignmentExpressions = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_MakeAssignmentExpressions, + Name = DecompilerOptionConstants.MakeAssignmentExpressions_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject_GUID, + () => decompilerSettings.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject, a => decompilerSettings.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject, + Name = DecompilerOptionConstants.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowTokenAndRvaComments_GUID, + () => decompilerSettings.ShowTokenAndRvaComments, a => decompilerSettings.ShowTokenAndRvaComments = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowTokensRvasOffsets, + Name = DecompilerOptionConstants.ShowTokenAndRvaComments_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.SortMembers_GUID, + () => decompilerSettings.SortMembers, a => decompilerSettings.SortMembers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_SortMethods, + Name = DecompilerOptionConstants.SortMembers_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ForceShowAllMembers_GUID, + () => decompilerSettings.ForceShowAllMembers, a => decompilerSettings.ForceShowAllMembers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowCompilerGeneratedTypes, + Name = DecompilerOptionConstants.ForceShowAllMembers_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.SortSystemUsingStatementsFirst_GUID, + () => decompilerSettings.SortSystemUsingStatementsFirst, a => decompilerSettings.SortSystemUsingStatementsFirst = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_SortSystemFirst, + Name = DecompilerOptionConstants.SortSystemUsingStatementsFirst_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.MaxArrayElements_GUID, + () => decompilerSettings.MaxArrayElements, a => decompilerSettings.MaxArrayElements = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_MaxArrayElements, + Name = DecompilerOptionConstants.MaxArrayElements_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.MaxStringLength_GUID, + () => decompilerSettings.MaxStringLength, a => decompilerSettings.MaxStringLength = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_MaxStringLength, + Name = DecompilerOptionConstants.MaxStringLength_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.SortCustomAttributes_GUID, + () => decompilerSettings.SortCustomAttributes, a => decompilerSettings.SortCustomAttributes = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_SortCustomAttributes, + Name = DecompilerOptionConstants.SortCustomAttributes_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.UseSourceCodeOrder_GUID, + () => decompilerSettings.UseSourceCodeOrder, a => decompilerSettings.UseSourceCodeOrder = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_UseSourceCodeOrder, + Name = DecompilerOptionConstants.UseSourceCodeOrder_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.AllowFieldInitializers_GUID, + () => decompilerSettings.AllowFieldInitializers, a => decompilerSettings.AllowFieldInitializers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_AllowFieldInitializers, + Name = DecompilerOptionConstants.AllowFieldInitializers_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.OneCustomAttributePerLine_GUID, + () => decompilerSettings.OneCustomAttributePerLine, a => decompilerSettings.OneCustomAttributePerLine = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_OneCustomAttributePerLine, + Name = DecompilerOptionConstants.OneCustomAttributePerLine_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.TypeAddInternalModifier_GUID, + () => decompilerSettings.TypeAddInternalModifier, a => decompilerSettings.TypeAddInternalModifier = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_TypeAddInternalModifier, + Name = DecompilerOptionConstants.TypeAddInternalModifier_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.MemberAddPrivateModifier_GUID, + () => decompilerSettings.MemberAddPrivateModifier, a => decompilerSettings.MemberAddPrivateModifier = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_MemberAddPrivateModifier, + Name = DecompilerOptionConstants.MemberAddPrivateModifier_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.RemoveNewDelegateClass_GUID, + () => decompilerSettings.RemoveNewDelegateClass, a => decompilerSettings.RemoveNewDelegateClass = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_RemoveNewDelegateClass, + Name = DecompilerOptionConstants.RemoveNewDelegateClass_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.HexadecimalNumbers_GUID, + () => decompilerSettings.HexadecimalNumbers, a => decompilerSettings.HexadecimalNumbers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_HexadecimalNumbers, + Name = DecompilerOptionConstants.HexadecimalNumbers_NAME, + }; + } + + string GetMemberOrder() => + GetMemberOrderString(decompilerSettings.DecompilationObject0) + + GetMemberOrderString(decompilerSettings.DecompilationObject1) + + GetMemberOrderString(decompilerSettings.DecompilationObject2) + + GetMemberOrderString(decompilerSettings.DecompilationObject3) + + GetMemberOrderString(decompilerSettings.DecompilationObject4); + + static string GetMemberOrderString(DecompilationObject d) { + switch (d) { + case DecompilationObject.NestedTypes: return "t"; + case DecompilationObject.Fields: return "f"; + case DecompilationObject.Events: return "e"; + case DecompilationObject.Properties: return "p"; + case DecompilationObject.Methods: return "m"; + default: + Debug.Fail("Shouldn't be here"); + return "?"; + } + } + + void SetMemberOrder(string s) { + if (s is null || s.Length != 5) + return; + decompilerSettings.DecompilationObject0 = GetDecompilationObject(s[0]) ?? decompilerSettings.DecompilationObject0; + decompilerSettings.DecompilationObject1 = GetDecompilationObject(s[1]) ?? decompilerSettings.DecompilationObject1; + decompilerSettings.DecompilationObject2 = GetDecompilationObject(s[2]) ?? decompilerSettings.DecompilationObject2; + decompilerSettings.DecompilationObject3 = GetDecompilationObject(s[3]) ?? decompilerSettings.DecompilationObject3; + decompilerSettings.DecompilationObject4 = GetDecompilationObject(s[4]) ?? decompilerSettings.DecompilationObject4; + } + + static DecompilationObject? GetDecompilationObject(char c) { + switch (c) { + case 't': return DecompilationObject.NestedTypes; + case 'f': return DecompilationObject.Fields; + case 'e': return DecompilationObject.Events; + case 'p': return DecompilationObject.Properties; + case 'm': return DecompilationObject.Methods; + } + return null; + } + + public override bool Equals(object? obj) { + var other = obj as CSharpVBDecompilerSettings; + return other is not null && decompilerSettings.Equals(other.decompilerSettings); + } + + public override int GetHashCode() => decompilerSettings.GetHashCode(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/DecompilerSettingsService.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/DecompilerSettingsService.cs new file mode 100644 index 0000000..c3bf436 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/DecompilerSettingsService.cs @@ -0,0 +1,48 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Threading; + +namespace dnSpy.Decompiler.ILSpy.Core.Settings { + class DecompilerSettingsService { + /// + /// Should only be used indirectly by dnSpy.Console.exe + /// + public static DecompilerSettingsService __Instance_DONT_USE { + get { + if (__instance_DONT_USE is null) + Interlocked.CompareExchange(ref __instance_DONT_USE, new DecompilerSettingsService(), null); + return __instance_DONT_USE!; + } + } + static DecompilerSettingsService? __instance_DONT_USE; + + protected DecompilerSettingsService() { + CSharpVBDecompilerSettings = new CSharpVBDecompilerSettings(); + ILDecompilerSettings = new ILDecompilerSettings(); + } + + public CSharpVBDecompilerSettings CSharpVBDecompilerSettings { get; protected set; } + public ILDecompilerSettings ILDecompilerSettings { get; protected set; } + +#if DEBUG + public ILAstDecompilerSettings ILAstDecompilerSettings { get; } = new ILAstDecompilerSettings(); +#endif + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILAstDecompilerSettings.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILAstDecompilerSettings.cs new file mode 100644 index 0000000..1469df3 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILAstDecompilerSettings.cs @@ -0,0 +1,46 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +#if DEBUG +using System; +using System.Collections.Generic; +using dnSpy.Contracts.Decompiler; + +namespace dnSpy.Decompiler.ILSpy.Core.Settings { + sealed class ILAstDecompilerSettings : DecompilerSettingsBase { + public override int Version => 0; + public override event EventHandler? VersionChanged { add { } remove { } } + + public ILAstDecompilerSettings() { + } + + ILAstDecompilerSettings(ILAstDecompilerSettings other) { + } + + public override DecompilerSettingsBase Clone() => new ILAstDecompilerSettings(this); + + public override IEnumerable Options { + get { yield break; } + } + + public override bool Equals(object? obj) => obj is ILAstDecompilerSettings; + public override int GetHashCode() => 0; + } +} +#endif diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILDecompilerSettings.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILDecompilerSettings.cs new file mode 100644 index 0000000..585e229 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILDecompilerSettings.cs @@ -0,0 +1,95 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.Properties; +using dnSpy.Decompiler.Settings; + +namespace dnSpy.Decompiler.ILSpy.Core.Settings { + sealed class ILDecompilerSettings : DecompilerSettingsBase { + public ILSettings Settings => ilSettings; + readonly ILSettings ilSettings; + + public override int Version => ilSettings.SettingsVersion; + public override event EventHandler? VersionChanged; + + public ILDecompilerSettings(ILSettings? ilSettings = null) { + this.ilSettings = ilSettings ?? new ILSettings(); + options = CreateOptions().ToArray(); + this.ilSettings.SettingsVersionChanged += ILSettings_SettingsVersionChanged; + } + + void ILSettings_SettingsVersionChanged(object? sender, EventArgs e) => VersionChanged?.Invoke(this, EventArgs.Empty); + + public override DecompilerSettingsBase Clone() => new ILDecompilerSettings(ilSettings.Clone()); + + public override IEnumerable Options => options; + readonly IDecompilerOption[] options; + + IEnumerable CreateOptions() { + yield return new DecompilerOption(DecompilerOptionConstants.ShowILComments_GUID, + () => ilSettings.ShowILComments, a => ilSettings.ShowILComments = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowILComments, + Name = DecompilerOptionConstants.ShowILComments_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowXmlDocumentation_GUID, + () => ilSettings.ShowXmlDocumentation, a => ilSettings.ShowXmlDocumentation = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowXMLDocComments, + Name = DecompilerOptionConstants.ShowXmlDocumentation_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowTokenAndRvaComments_GUID, + () => ilSettings.ShowTokenAndRvaComments, a => ilSettings.ShowTokenAndRvaComments = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowTokensRvasOffsets, + Name = DecompilerOptionConstants.ShowTokenAndRvaComments_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowILBytes_GUID, + () => ilSettings.ShowILBytes, a => ilSettings.ShowILBytes = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowILInstrBytes, + Name = DecompilerOptionConstants.ShowILBytes_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.SortMembers_GUID, + () => ilSettings.SortMembers, a => ilSettings.SortMembers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_SortMethods, + Name = DecompilerOptionConstants.SortMembers_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.ShowPdbInfo_GUID, + () => ilSettings.ShowPdbInfo, a => ilSettings.ShowPdbInfo = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_ShowPdbInfo, + Name = DecompilerOptionConstants.ShowPdbInfo_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.MaxStringLength_GUID, + () => ilSettings.MaxStringLength, a => ilSettings.MaxStringLength = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_MaxStringLength, + Name = DecompilerOptionConstants.MaxStringLength_NAME, + }; + yield return new DecompilerOption(DecompilerOptionConstants.HexadecimalNumbers_GUID, + () => ilSettings.HexadecimalNumbers, a => ilSettings.HexadecimalNumbers = a) { + Description = dnSpy_Decompiler_ILSpy_Core_Resources.DecompilerSettings_HexadecimalNumbers, + Name = DecompilerOptionConstants.HexadecimalNumbers_NAME, + }; + } + + public override bool Equals(object? obj) => + obj is ILDecompilerSettings && ilSettings.Equals(((ILDecompilerSettings)obj).ilSettings); + public override int GetHashCode() => ilSettings.GetHashCode(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILSettings.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILSettings.cs new file mode 100644 index 0000000..1ba430d --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Settings/ILSettings.cs @@ -0,0 +1,175 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Threading; +using dnSpy.Contracts.MVVM; + +namespace dnSpy.Decompiler.ILSpy.Core.Settings { + class ILSettings : ViewModelBase { + protected virtual void OnModified() { } + public event EventHandler? SettingsVersionChanged; + + void OptionsChanged() { + Interlocked.Increment(ref settingsVersion); + OnModified(); + SettingsVersionChanged?.Invoke(this, EventArgs.Empty); + } + + public int SettingsVersion => settingsVersion; + volatile int settingsVersion; + + public bool ShowILComments { + get => showILComments; + set { + if (showILComments != value) { + showILComments = value; + OnPropertyChanged(nameof(ShowILComments)); + OptionsChanged(); + } + } + } + bool showILComments = false; + + public bool ShowXmlDocumentation { + get => showXmlDocumentation; + set { + if (showXmlDocumentation != value) { + showXmlDocumentation = value; + OnPropertyChanged(nameof(ShowXmlDocumentation)); + OptionsChanged(); + } + } + } + bool showXmlDocumentation = true; + + public bool ShowTokenAndRvaComments { + get => showTokenAndRvaComments; + set { + if (showTokenAndRvaComments != value) { + showTokenAndRvaComments = value; + OnPropertyChanged(nameof(ShowTokenAndRvaComments)); + OptionsChanged(); + } + } + } + bool showTokenAndRvaComments = true; + + public bool ShowILBytes { + get => showILBytes; + set { + if (showILBytes != value) { + showILBytes = value; + OnPropertyChanged(nameof(ShowILBytes)); + OptionsChanged(); + } + } + } + bool showILBytes = true; + + public bool SortMembers { + get => sortMembers; + set { + if (sortMembers != value) { + sortMembers = value; + OnPropertyChanged(nameof(SortMembers)); + OptionsChanged(); + } + } + } + bool sortMembers = false; + + public bool ShowPdbInfo { + get => showPdbInfo; + set { + if (showPdbInfo != value) { + showPdbInfo = value; + OnPropertyChanged(nameof(ShowPdbInfo)); + OptionsChanged(); + } + } + } + bool showPdbInfo = true; + + public int MaxStringLength { + get => maxStringLength; + set { + if (maxStringLength != value) { + maxStringLength = value; + OnPropertyChanged(nameof(MaxStringLength)); + OptionsChanged(); + } + } + } + int maxStringLength = ICSharpCode.Decompiler.DecompilerSettings.ConstMaxStringLength; + + public bool HexadecimalNumbers { + get { return hexadecimalNumbers; } + set { + if (hexadecimalNumbers != value) { + hexadecimalNumbers = value; + OnPropertyChanged(nameof(HexadecimalNumbers)); + } + } + } + bool hexadecimalNumbers = false; + + public ILSettings Clone() => CopyTo(new ILSettings()); + + public ILSettings CopyTo(ILSettings other) { + other.ShowILComments = ShowILComments; + other.ShowXmlDocumentation = ShowXmlDocumentation; + other.ShowTokenAndRvaComments = ShowTokenAndRvaComments; + other.ShowILBytes = ShowILBytes; + other.SortMembers = SortMembers; + other.ShowPdbInfo = ShowPdbInfo; + other.MaxStringLength = MaxStringLength; + other.HexadecimalNumbers = HexadecimalNumbers; + return other; + } + + public override bool Equals(object? obj) { + var other = obj as ILSettings; + return other is not null && + ShowILComments == other.ShowILComments && + ShowXmlDocumentation == other.ShowXmlDocumentation && + ShowTokenAndRvaComments == other.ShowTokenAndRvaComments && + ShowILBytes == other.ShowILBytes && + SortMembers == other.SortMembers && + ShowPdbInfo == other.ShowPdbInfo && + MaxStringLength == other.MaxStringLength && + HexadecimalNumbers == other.HexadecimalNumbers; + } + + public override int GetHashCode() { + uint h = 0; + + if (ShowILComments) h ^= 0x80000000; + if (ShowXmlDocumentation) h ^= 0x40000000; + if (ShowTokenAndRvaComments) h ^= 0x20000000; + if (ShowILBytes) h ^= 0x10000000; + if (SortMembers) h ^= 0x08000000; + if (ShowPdbInfo) h ^= 0x04000000; + h ^= (uint)MaxStringLength; + if (HexadecimalNumbers) h ^= 0x02000000; + + return (int)h; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Text/ContentTypesInternal.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Text/ContentTypesInternal.cs new file mode 100644 index 0000000..d4835e1 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/Text/ContentTypesInternal.cs @@ -0,0 +1,28 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +namespace dnSpy.Decompiler.ILSpy.Core.Text { + static class ContentTypesInternal { + public const string DecompilerILSpy = "Decompiler ILSpy"; + public const string CSharpILSpy = "C# ILSpy"; + public const string VisualBasicILSpy = "VB ILSpy"; + public const string ILILSpy = "IL ILSpy"; + public const string ILAstILSpy = "ILAst ILSpy"; + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/ILSpyEnvironmentProvider.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/ILSpyEnvironmentProvider.cs new file mode 100644 index 0000000..54b037f --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/ILSpyEnvironmentProvider.cs @@ -0,0 +1,172 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using ICSharpCode.Decompiler.Ast; +using ICSharpCode.NRefactory.TypeSystem; +using ICSharpCode.NRefactory.VB.Visitors; + +namespace dnSpy.Decompiler.ILSpy.Core.VisualBasic { + sealed class ILSpyEnvironmentProvider : IEnvironmentProvider { + public string RootNamespace => ""; + + readonly StringBuilder sb; + + public ILSpyEnvironmentProvider(StringBuilder? sb = null) => this.sb = sb ?? new StringBuilder(); + + public string GetTypeNameForAttribute(ICSharpCode.NRefactory.CSharp.Attribute attribute) { + var mr = attribute.Type.Annotations + .OfType() + .FirstOrDefault(); + return mr is null ? string.Empty : mr.FullName; + } + + /* +var annotation = type.Annotation(); +if (annotation is null ) + return null; + +IEntity current = null; +if (entity is not null) { + var typeInfo = entity.Annotation(); + current = loader.ReadTypeReference(typeInfo).Resolve(context).GetDefinition(); +} + +return loader.ReadTypeReference(annotation, entity: current).Resolve(context);*/ + public ICSharpCode.NRefactory.TypeSystem.IType ResolveType(ICSharpCode.NRefactory.VB.Ast.AstType type, ICSharpCode.NRefactory.VB.Ast.TypeDeclaration? entity = null) => SpecialType.UnknownType; + + public TypeKind GetTypeKindForAstType(ICSharpCode.NRefactory.CSharp.AstType type) { + var annotation = type.Annotation(); + if (annotation is null) + return TypeKind.Unknown; + + var definition = annotation.ResolveTypeDef(); + if (definition is null) + return TypeKind.Unknown; + if (definition.IsClass) + return TypeKind.Class; + if (definition.IsInterface) + return TypeKind.Interface; + if (definition.IsEnum) + return TypeKind.Enum; + if (definition.IsValueType) + return TypeKind.Struct; + + return TypeKind.Unknown; + } + + public TypeCode ResolveExpression(ICSharpCode.NRefactory.CSharp.Expression expression) { + var annotation = expression.Annotations.OfType().FirstOrDefault(); + + if (annotation is null || annotation.InferredType is null) + return TypeCode.Object; + + var definition = annotation.InferredType.GetScopeTypeDefOrRef().ResolveTypeDef(); + + if (definition is null) + return TypeCode.Object; + + switch (definition.FullName) { + case "System.String": + return TypeCode.String; + default: + break; + } + + return TypeCode.Object; + } + + public bool? IsReferenceType(ICSharpCode.NRefactory.CSharp.Expression expression) { + if (expression is ICSharpCode.NRefactory.CSharp.NullReferenceExpression) + return true; + + var annotation = expression.Annotations.OfType().FirstOrDefault(); + + if (annotation is null || annotation.InferredType is null) + return null; + + var definition = annotation.InferredType.GetScopeTypeDefOrRef().ResolveTypeDef(); + + if (definition is null) + return null; + + return !definition.IsValueType; + } + + public IEnumerable CreateMemberSpecifiersForInterfaces(IEnumerable interfaces) { + foreach (var type in interfaces) { + var def = type.Annotation().ResolveTypeDef(); + if (def is null) + continue; + foreach (var method in def.Methods.Where(m => !m.Name.StartsWith("get_") && !m.Name.StartsWith("set_"))) { + yield return ICSharpCode.NRefactory.VB.Ast.InterfaceMemberSpecifier.CreateWithColor((ICSharpCode.NRefactory.VB.Ast.AstType)type.Clone(), method.Name, VisualBasicMetadataTextColorProvider.Instance.GetColor(method)); + } + + foreach (var property in def.Properties) { + yield return ICSharpCode.NRefactory.VB.Ast.InterfaceMemberSpecifier.CreateWithColor((ICSharpCode.NRefactory.VB.Ast.AstType)type.Clone(), property.Name, VisualBasicMetadataTextColorProvider.Instance.GetColor(property)); + } + } + } + + public bool HasEvent(ICSharpCode.NRefactory.VB.Ast.Expression expression) => expression.Annotation() is not null; + + public bool IsMethodGroup(ICSharpCode.NRefactory.CSharp.Expression expression) { + var annotation = expression.Annotation(); + if (annotation is null) + return false; + return expression.Annotation() is null && expression.Annotation() is null; + } + + public ICSharpCode.NRefactory.CSharp.ParameterDeclaration[] GetParametersForProperty(ICSharpCode.NRefactory.CSharp.PropertyDeclaration property) { + var propInfo = property.Annotation(); + + if (propInfo is null) + return new ICSharpCode.NRefactory.CSharp.ParameterDeclaration[0]; + + sb.Clear(); + var getMethod = propInfo.GetMethod; + if (getMethod is not null) + return getMethod.Parameters.Where(p => p.IsNormalMethodParameter).Select(p => new ICSharpCode.NRefactory.CSharp.ParameterDeclaration(AstBuilder.ConvertType(p.Type, sb), p.Name, GetModifiers(p))).ToArray(); + var setMethod = propInfo.SetMethod; + if (setMethod is not null) { + var ps = setMethod.Parameters.Where(p => p.IsNormalMethodParameter).ToArray(); + if (ps.Length > 1) + return ps.Take(ps.Length - 1).Select(p => new ICSharpCode.NRefactory.CSharp.ParameterDeclaration(AstBuilder.ConvertType(p.Type, sb), p.Name, GetModifiers(p))).ToArray(); + } + + return new ICSharpCode.NRefactory.CSharp.ParameterDeclaration[0]; + } + + ICSharpCode.NRefactory.CSharp.ParameterModifier GetModifiers(Parameter p) { + var pd = p.ParamDef; + if (pd is not null) { + if (pd.IsOut && pd.IsIn) + return ICSharpCode.NRefactory.CSharp.ParameterModifier.Ref; + if (pd.IsOut) + return ICSharpCode.NRefactory.CSharp.ParameterModifier.Out; + } + + return ICSharpCode.NRefactory.CSharp.ParameterModifier.None; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBDecompiler.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBDecompiler.cs new file mode 100644 index 0000000..dda8e7a --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBDecompiler.cs @@ -0,0 +1,333 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.ILSpy.Core.CSharp; +using dnSpy.Decompiler.ILSpy.Core.Settings; +using dnSpy.Decompiler.ILSpy.Core.Text; +using dnSpy.Decompiler.VisualBasic; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.Ast; +using ICSharpCode.Decompiler.Ast.Transforms; +using ICSharpCode.NRefactory.VB; +using ICSharpCode.NRefactory.VB.Visitors; + +namespace dnSpy.Decompiler.ILSpy.Core.VisualBasic { + sealed class DecompilerProvider : IDecompilerProvider { + readonly DecompilerSettingsService decompilerSettingsService; + + // Keep the default ctor. It's used by dnSpy.Console.exe + public DecompilerProvider() + : this(DecompilerSettingsService.__Instance_DONT_USE) { + } + + public DecompilerProvider(DecompilerSettingsService decompilerSettingsService) { + Debug2.Assert(decompilerSettingsService is not null); + this.decompilerSettingsService = decompilerSettingsService ?? throw new ArgumentNullException(nameof(decompilerSettingsService)); + } + + public IEnumerable Create() { + yield return new VBDecompiler(decompilerSettingsService.CSharpVBDecompilerSettings); + } + } + + /// + /// Decompiler logic for VB. + /// + sealed class VBDecompiler : DecompilerBase { + readonly Predicate? transformAbortCondition = null; + readonly bool showAllMembers = false; + readonly Func createBuilderCache; + + public override DecompilerSettingsBase Settings => langSettings; + readonly CSharpVBDecompilerSettings langSettings; + + public override double OrderUI => DecompilerConstants.VISUALBASIC_ILSPY_ORDERUI; + public override MetadataTextColorProvider MetadataTextColorProvider => VisualBasicMetadataTextColorProvider.Instance; + + public VBDecompiler(CSharpVBDecompilerSettings langSettings) { + this.langSettings = langSettings; + createBuilderCache = () => new BuilderCache(this.langSettings.Settings.SettingsVersion); + } + + public override string ContentTypeString => ContentTypesInternal.VisualBasicILSpy; + public override string GenericNameUI => DecompilerConstants.GENERIC_NAMEUI_VISUALBASIC; + public override string UniqueNameUI => "Visual Basic"; + public override Guid GenericGuid => DecompilerConstants.LANGUAGE_VISUALBASIC; + public override Guid UniqueGuid => DecompilerConstants.LANGUAGE_VISUALBASIC_ILSPY; + public override string FileExtension => ".vb"; + public override string? ProjectFileExtension => ".vbproj"; + + public override void WriteCommentBegin(IDecompilerOutput output, bool addSpace) { + if (addSpace) + output.Write("' ", BoxedTextColor.Comment); + else + output.Write("'", BoxedTextColor.Comment); + } + + public override void WriteCommentEnd(IDecompilerOutput output, bool addSpace) { } + + DecompilerSettings GetDecompilerSettings() { + var settings = langSettings.Settings.Clone(); + // Different default access modifiers between C#/VB, so for now ignore the options + settings.TypeAddInternalModifier = true; + settings.MemberAddPrivateModifier = true; + return settings; + } + + public override void Decompile(AssemblyDef asm, IDecompilerOutput output, DecompilationContext ctx) { + WriteAssembly(asm, output, ctx); + + using (ctx.DisableAssemblyLoad()) { + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentModule: asm.ManifestModule); + try { + state.AstBuilder.AddAssembly(asm.ManifestModule, true, true, false); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + } + + public override void Decompile(ModuleDef mod, IDecompilerOutput output, DecompilationContext ctx) { + WriteModule(mod, output, ctx); + + using (ctx.DisableAssemblyLoad()) { + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentModule: mod); + try { + state.AstBuilder.AddAssembly(mod, true, false, true); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + } + + public override void Decompile(MethodDef method, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, method); + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentType: method.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddMethod(method); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(PropertyDef property, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, property); + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentType: property.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddProperty(property); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(FieldDef field, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, field); + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentType: field.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddField(field); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(EventDef ev, IDecompilerOutput output, DecompilationContext ctx) { + WriteCommentLineDeclaringType(output, ev); + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentType: ev.DeclaringType, isSingleMember: true); + try { + state.AstBuilder.AddEvent(ev); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override void Decompile(TypeDef type, IDecompilerOutput output, DecompilationContext ctx) { + var state = CreateAstBuilder(ctx, GetDecompilerSettings(), currentType: type); + try { + state.AstBuilder.AddType(type); + RunTransformsAndGenerateCode(ref state, output, ctx); + } + finally { + state.Dispose(); + } + } + + public override bool ShowMember(IMemberRef member) => CSharpDecompiler.ShowMember(member, showAllMembers, GetDecompilerSettings()); + + VBFormattingOptions CreateVBFormattingOptions(DecompilerSettings settings) => + new VBFormattingOptions() { + NumberFormatter = ICSharpCode.NRefactory.NumberFormatter.GetVBInstance(hex: settings.HexadecimalNumbers, upper: true), + }; + + void RunTransformsAndGenerateCode(ref BuilderState state, IDecompilerOutput output, DecompilationContext ctx, IAstTransform? additionalTransform = null) { + var astBuilder = state.AstBuilder; + astBuilder.RunTransformations(transformAbortCondition); + if (additionalTransform is not null) { + additionalTransform.Run(astBuilder.SyntaxTree); + } + var settings = GetDecompilerSettings(); + CSharpDecompiler.AddXmlDocumentation(ref state, settings, astBuilder); + var csharpUnit = astBuilder.SyntaxTree; + csharpUnit.AcceptVisitor(new ICSharpCode.NRefactory.CSharp.InsertParenthesesVisitor() { InsertParenthesesForReadability = true }); + var unit = csharpUnit.AcceptVisitor(new CSharpToVBConverterVisitor(state.AstBuilder.Context.CurrentModule, new ILSpyEnvironmentProvider(state.State.XmlDoc_StringBuilder)), null); + var outputFormatter = new VBTextOutputFormatter(output, astBuilder.Context); + var formattingPolicy = CreateVBFormattingOptions(settings); + unit.AcceptVisitor(new OutputVisitor(outputFormatter, formattingPolicy), null); + } + + BuilderState CreateAstBuilder(DecompilationContext ctx, DecompilerSettings settings, ModuleDef? currentModule = null, TypeDef? currentType = null, bool isSingleMember = false) { + if (currentModule is null) + currentModule = currentType?.Module; + settings = settings.Clone(); + if (isSingleMember) + settings.UsingDeclarations = false; + settings.IntroduceIncrementAndDecrement = false; + settings.MakeAssignmentExpressions = false; + settings.QueryExpressions = false; + settings.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject = true; + var cache = ctx.GetOrCreate(createBuilderCache); + var state = new BuilderState(ctx, cache, MetadataTextColorProvider); + state.AstBuilder.Context.CurrentModule = currentModule; + state.AstBuilder.Context.CancellationToken = ctx.CancellationToken; + state.AstBuilder.Context.CurrentType = currentType; + state.AstBuilder.Context.Settings = settings; + return state; + } + + protected override void FormatTypeName(IDecompilerOutput output, TypeDef type) { + if (type is null) + throw new ArgumentNullException(nameof(type)); + + TypeToString(output, ConvertTypeOptions.DoNotUsePrimitiveTypeNames | ConvertTypeOptions.IncludeTypeParameterDefinitions | ConvertTypeOptions.DoNotIncludeEnclosingType, type); + } + + protected override void TypeToString(IDecompilerOutput output, ITypeDefOrRef? type, bool includeNamespace, IHasCustomAttribute? typeAttributes = null) { + ConvertTypeOptions options = ConvertTypeOptions.IncludeTypeParameterDefinitions; + if (includeNamespace) + options |= ConvertTypeOptions.IncludeNamespace; + + TypeToString(output, options, type, typeAttributes); + } + + void TypeToString(IDecompilerOutput output, ConvertTypeOptions options, ITypeDefOrRef? type, IHasCustomAttribute? typeAttributes = null) { + if (type is null) + return; + var envProvider = new ILSpyEnvironmentProvider(); + var converter = new CSharpToVBConverterVisitor(type.Module, envProvider); + var astType = AstBuilder.ConvertType(type, new StringBuilder(), typeAttributes, options); + + if (type.TryGetByRefSig() is not null) { + output.Write("ByRef", BoxedTextColor.Keyword); + output.Write(" ", BoxedTextColor.Text); + if (astType is ICSharpCode.NRefactory.CSharp.ComposedType && ((ICSharpCode.NRefactory.CSharp.ComposedType)astType).PointerRank > 0) + ((ICSharpCode.NRefactory.CSharp.ComposedType)astType).PointerRank--; + } + + var vbAstType = astType.AcceptVisitor(converter, null); + var settings = GetDecompilerSettings(); + var ctx = new DecompilerContext(settings.SettingsVersion, type.Module, MetadataTextColorProvider); + vbAstType.AcceptVisitor(new OutputVisitor(new VBTextOutputFormatter(output, ctx), CreateVBFormattingOptions(settings)), null); + } + + public override bool CanDecompile(DecompilationType decompilationType) { + switch (decompilationType) { + case DecompilationType.PartialType: + case DecompilationType.AssemblyInfo: + case DecompilationType.TypeMethods: + return true; + } + return base.CanDecompile(decompilationType); + } + + public override void Decompile(DecompilationType decompilationType, object data) { + switch (decompilationType) { + case DecompilationType.PartialType: + DecompilePartial((DecompilePartialType)data); + return; + case DecompilationType.AssemblyInfo: + DecompileAssemblyInfo((DecompileAssemblyInfo)data); + return; + case DecompilationType.TypeMethods: + DecompileTypeMethods((DecompileTypeMethods)data); + return; + } + base.Decompile(decompilationType, data); + } + + void DecompilePartial(DecompilePartialType info) { + var state = CreateAstBuilder(info.Context, CSharpDecompiler.CreateDecompilerSettings(GetDecompilerSettings(), info.UseUsingDeclarations), currentType: info.Type); + try { + state.AstBuilder.AddType(info.Type); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, new DecompilePartialTransform(info.Type, info.Definitions, info.ShowDefinitions, info.AddPartialKeyword, info.InterfacesToRemove)); + } + finally { + state.Dispose(); + } + } + + void DecompileAssemblyInfo(DecompileAssemblyInfo info) { + var state = CreateAstBuilder(info.Context, GetDecompilerSettings(), currentModule: info.Module); + try { + state.AstBuilder.AddAssembly(info.Module, true, info.Module.IsManifestModule, true); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, info.KeepAllAttributes ? null : new AssemblyInfoTransform()); + } + finally { + state.Dispose(); + } + } + + void DecompileTypeMethods(DecompileTypeMethods info) { + var state = CreateAstBuilder(info.Context, CSharpDecompiler.CreateDecompilerSettings_DecompileTypeMethods(GetDecompilerSettings(), !info.DecompileHidden, info.ShowAll), currentType: info.Type); + try { + state.AstBuilder.GetDecompiledBodyKind = (builder, method) => CSharpDecompiler.GetDecompiledBodyKind(info, builder, method); + state.AstBuilder.AddType(info.Type); + RunTransformsAndGenerateCode(ref state, info.Output, info.Context, new DecompileTypeMethodsTransform(info.Types, info.Methods, !info.DecompileHidden, info.ShowAll)); + } + finally { + state.Dispose(); + } + } + + public override void WriteToolTip(ITextColorWriter output, IMemberRef member, IHasCustomAttribute? typeAttributes) => + new VisualBasicFormatter(output, DefaultFormatterOptions, null).WriteToolTip(member); + public override void WriteToolTip(ITextColorWriter output, ISourceVariable variable) => + new VisualBasicFormatter(output, DefaultFormatterOptions, null).WriteToolTip(variable); + public override void WriteNamespaceToolTip(ITextColorWriter output, string? @namespace) => + new VisualBasicFormatter(output, DefaultFormatterOptions, null).WriteNamespaceToolTip(@namespace); + public override void Write(ITextColorWriter output, IMemberRef member, FormatterOptions flags) => + new VisualBasicFormatter(output, flags, null).Write(member); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBTextOutputFormatter.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBTextOutputFormatter.cs new file mode 100644 index 0000000..bb0d4d3 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/VisualBasic/VBTextOutputFormatter.cs @@ -0,0 +1,374 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; +using ICSharpCode.Decompiler; +using ICSharpCode.Decompiler.ILAst; +using ICSharpCode.NRefactory.VB; +using ICSharpCode.NRefactory.VB.Ast; +using CSharp2 = ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.VisualBasic { + sealed class VBTextOutputFormatter : IOutputFormatter { + readonly IDecompilerOutput output; + readonly DecompilerContext context; + readonly Stack nodeStack = new Stack(); + + public VBTextOutputFormatter(IDecompilerOutput output, DecompilerContext context) { + this.output = output ?? throw new ArgumentNullException(nameof(output)); + this.context = context ?? throw new ArgumentNullException(nameof(context)); + } + + MethodDebugInfoBuilder? currentMethodDebugInfoBuilder; + Stack parentMethodDebugInfoBuilder = new Stack(); + List>>? multiMappings; + + public void StartNode(AstNode node) { + nodeStack.Push(node); + + MethodDebugInfoBuilder mapping = node.Annotation(); + if (mapping is not null) { + parentMethodDebugInfoBuilder.Push(currentMethodDebugInfoBuilder); + currentMethodDebugInfoBuilder = mapping; + } + // For ctor/cctor field initializers + var mms = node.Annotation>>>(); + if (mms is not null) { + Debug2.Assert(multiMappings is null); + multiMappings = mms; + } + } + + public void EndNode(AstNode node) { + if (nodeStack.Pop() != node) + throw new InvalidOperationException(); + + if (node.Annotation() is not null) { + Debug2.Assert(currentMethodDebugInfoBuilder is not null); + if (context.CalculateILSpans) { + foreach (var ns in context.UsingNamespaces) + currentMethodDebugInfoBuilder.Scope.Imports.Add(ImportInfo.CreateNamespace(ns)); + } + output.AddDebugInfo(currentMethodDebugInfoBuilder.Create()); + currentMethodDebugInfoBuilder = parentMethodDebugInfoBuilder.Pop(); + } + var mms = node.Annotation>>>(); + if (mms is not null) { + Debug.Assert(mms == multiMappings); + if (mms == multiMappings) { + foreach (var mm in mms) + output.AddDebugInfo(mm.Item1.Create()); + multiMappings = null; + } + } + } + + public void WriteIdentifier(string identifier, object data, object extraData) { + var definition = GetCurrentDefinition(); + if (definition is not null) { + output.Write(IdentifierEscaper.Escape(identifier), definition, DecompilerReferenceFlags.Definition, data); + return; + } + + var memberRef = GetCurrentMemberReference() ?? (object?)(extraData as NamespaceReference); + if (memberRef is not null) { + output.Write(IdentifierEscaper.Escape(identifier), memberRef, DecompilerReferenceFlags.None, data); + return; + } + + definition = GetCurrentLocalDefinition(); + if (definition is not null) { + output.Write(IdentifierEscaper.Escape(identifier), definition, DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, data); + return; + } + + memberRef = GetCurrentLocalReference(); + if (memberRef is not null) { + output.Write(IdentifierEscaper.Escape(identifier), memberRef, DecompilerReferenceFlags.Local, data); + return; + } + + output.Write(IdentifierEscaper.Escape(identifier), data); + } + + IMemberRef? GetCurrentMemberReference() { + AstNode node = nodeStack.Peek(); + if (node.Annotation() is not null) + return null; + if (node.Role == AstNode.Roles.Type && node.Parent is ObjectCreationExpression) + node = node.Parent; + var memberRef = node.Annotation(); + if (memberRef is null && node is Identifier) { + node = node.Parent ?? node; + memberRef = node.Annotation(); + } + if (memberRef is null && node.Role == AstNode.Roles.TargetExpression && (node.Parent is InvocationExpression || node.Parent is ObjectCreationExpression)) { + memberRef = node.Parent.Annotation(); + } + return memberRef; + } + + object? GetCurrentLocalReference() { + AstNode node = nodeStack.Peek(); + ILVariable variable = node.Annotation(); + if (variable is null && node.Parent is IdentifierExpression) + variable = node.Parent.Annotation(); + if (variable is not null) + return variable.GetTextReferenceObject(); + var lbl = (node.Parent?.Parent as GoToStatement)?.Label ?? (node.Parent?.Parent as LabelDeclarationStatement)?.Label; + if (lbl is not null) { + var method = nodeStack.Select(nd => nd.Annotation()).FirstOrDefault(mr => mr is not null && mr.IsMethod); + if (method is not null) + return method.ToString() + lbl; + } + return null; + } + + object? GetCurrentLocalDefinition() { + AstNode node = nodeStack.Peek(); + if (node is Identifier && node.Parent is CatchBlock) + node = node.Parent; + var parameterDef = node.Annotation(); + if (parameterDef is not null) + return parameterDef; + if (node is ParameterDeclaration) { + node = ((ParameterDeclaration)node).Name; + parameterDef = node.Annotation(); + if (parameterDef is not null) + return parameterDef; + } + + if (node is VariableIdentifier) { + var variable = ((VariableIdentifier)node).Name.Annotation(); + if (variable is not null) + return variable.GetTextReferenceObject(); + node = node.Parent ?? node; + } + if (node is VariableDeclaratorWithTypeAndInitializer || node is VariableInitializer || node is CatchBlock || node is ForEachStatement) { + var variable = node.Annotation(); + if (variable is not null) + return variable.GetTextReferenceObject(); + } + + if (node is LabelDeclarationStatement label) { + var method = nodeStack.Select(nd => nd.Annotation()).FirstOrDefault(mr => mr is not null && mr.IsMethod); + if (method is not null) + return method.ToString() + label.Label; + } + + + return null; + } + + object? GetCurrentDefinition() { + if (nodeStack is null || nodeStack.Count == 0) + return null; + + var node = nodeStack.Peek(); + if (node is ParameterDeclaration) + return null; + if (node is VariableIdentifier) + return ((VariableIdentifier)node).Name.Annotation(); + if (IsDefinition(node)) + return node.Annotation(); + + if (node is Identifier) { + node = node.Parent; + if (IsDefinition(node)) + return node.Annotation(); + } + + return null; + } + + public void WriteKeyword(string keyword) { + var memberRef = GetCurrentMemberReference(); + var node = nodeStack.Peek(); + if (memberRef is not null && (node is PrimitiveType || node is InstanceExpression)) + output.Write(keyword, memberRef, DecompilerReferenceFlags.None, BoxedTextColor.Keyword); + else if (memberRef is not null && (node is ConstructorDeclaration && keyword == "New")) + output.Write(keyword, memberRef, DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, BoxedTextColor.Keyword); + else if (memberRef is not null && (node is Accessor && (keyword == "Get" || keyword == "Set" || keyword == "AddHandler" || keyword == "RemoveHandler" || keyword == "RaiseEvent"))) { + if (canPrintAccessor) + output.Write(keyword, memberRef, DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Definition, BoxedTextColor.Keyword); + else + output.Write(keyword, BoxedTextColor.Keyword); + canPrintAccessor = !canPrintAccessor; + } + else if (memberRef is not null && node is OperatorDeclaration && keyword == "Operator") + output.Write(keyword, memberRef, DecompilerReferenceFlags.Definition, BoxedTextColor.Keyword); + else + output.Write(keyword, BoxedTextColor.Keyword); + } + bool canPrintAccessor = true; + + public void WriteToken(string token, object data, object? reference) { + var memberRef = GetCurrentMemberReference(); + var node = nodeStack.Peek(); + + bool addRef = memberRef is not null && + (node is BinaryOperatorExpression || + node is UnaryOperatorExpression || + node is AssignmentExpression); + + // Add a ref to the method if it's a delegate call + if (!addRef && node is InvocationExpression && memberRef is IMethod) { + var md = Resolve(memberRef as IMethod); + if (md is not null && md.DeclaringType is not null && md.DeclaringType.IsDelegate) + addRef = true; + } + + if (addRef) + output.Write(token, memberRef, DecompilerReferenceFlags.None, data); + else if (reference is not null) + output.Write(token, reference, DecompilerReferenceFlags.Local | DecompilerReferenceFlags.Hidden | DecompilerReferenceFlags.NoFollow, data); + else + output.Write(token, data); + } + + static MethodDef? Resolve(IMethod? method) { + if (method is MethodSpec) + method = ((MethodSpec)method).Method; + if (method is MemberRef) + return ((MemberRef)method).ResolveMethod(); + else + return (MethodDef?)method; + } + + public void Space() => output.Write(" ", BoxedTextColor.Text); + public void Indent() => output.IncreaseIndent(); + public void Unindent() => output.DecreaseIndent(); + public void NewLine() => output.WriteLine(); + + public void WriteComment(bool isDocumentation, string content, CSharp2.CommentReference[] refs) { + if (isDocumentation) { + Debug2.Assert(refs is null); + output.Write("'''", BoxedTextColor.XmlDocCommentDelimiter); + output.WriteXmlDoc(content); + output.WriteLine(); + } + else { + output.Write("'", BoxedTextColor.Comment); + Write(content, refs); + output.WriteLine(); + } + } + + void Write(string content, CSharp2.CommentReference[] refs) + { + if (refs is null) { + output.Write(content, BoxedTextColor.Comment); + return; + } + + int offs = 0; + for (int i = 0; i < refs.Length; i++) { + var @ref = refs[i]; + var s = content.Substring(offs, @ref.Length); + offs += @ref.Length; + if (@ref.Reference is null) + output.Write(s, BoxedTextColor.Comment); + else + output.Write(s, @ref.Reference, @ref.IsLocal ? DecompilerReferenceFlags.Local : DecompilerReferenceFlags.None, BoxedTextColor.Comment); + } + Debug.Assert(offs == content.Length); + } + + static bool IsDefinition(AstNode node) => + node is FieldDeclaration || + node is ConstructorDeclaration || + node is EventDeclaration || + node is DelegateDeclaration || + node is OperatorDeclaration || + node is MemberDeclaration || + node is TypeDeclaration || + node is EnumDeclaration || + node is EnumMemberDeclaration || + node is TypeParameterDeclaration; + + class DebugState { + public List Nodes = new List(); + public List ExtraILSpans = new List(); + public int StartLocation; + } + readonly Stack debugStack = new Stack(); + public void DebugStart(AstNode node) => debugStack.Push(new DebugState { StartLocation = output.NextPosition }); + + public void DebugHidden(object hiddenILSpans) { + if (hiddenILSpans is IList list) { + if (debugStack.Count > 0) + debugStack.Peek().ExtraILSpans.AddRange(list); + } + } + + public void DebugExpression(AstNode node) { + if (debugStack.Count > 0) + debugStack.Peek().Nodes.Add(node); + } + + public void DebugEnd(AstNode node) { + var state = debugStack.Pop(); + if (currentMethodDebugInfoBuilder is not null) { + foreach (var ilSpan in ILSpan.OrderAndCompact(GetILSpans(state))) + currentMethodDebugInfoBuilder.Add(new SourceStatement(ilSpan, new TextSpan(state.StartLocation, output.NextPosition - state.StartLocation))); + } + else if (multiMappings is not null) { + foreach (var mm in multiMappings) { + foreach (var ilSpan in ILSpan.OrderAndCompact(mm.Item2)) + mm.Item1.Add(new SourceStatement(ilSpan, new TextSpan(state.StartLocation, output.NextPosition - state.StartLocation))); + } + } + } + + static IEnumerable GetILSpans(DebugState state) { + foreach (var node in state.Nodes) { + foreach (var ann in node.Annotations) { + var list = ann as IList; + if (list is null) + continue; + foreach (var ilSpan in list) + yield return ilSpan; + } + } + foreach (var ilSpan in state.ExtraILSpans) + yield return ilSpan; + } + + public void AddHighlightedKeywordReference(object reference, int start, int end) { + Debug2.Assert(reference is not null); + if (reference is not null) + output.AddSpanReference(reference, start, end, PredefinedSpanReferenceIds.HighlightRelatedKeywords); + } + + public int NextPosition => output.NextPosition; + + public void AddBracePair(int leftStart, int leftEnd, int rightStart, int rightEnd, CodeBracesRangeFlags flags) => + output.AddBracePair(TextSpan.FromBounds(leftStart, leftEnd), TextSpan.FromBounds(rightStart, rightEnd), flags); + + public void AddBlock(int start, int end, CodeBracesRangeFlags flags) => + output.AddBracePair(new TextSpan(start, 0), new TextSpan(end, 0), flags); + + public void AddLineSeparator(int position) => output.AddLineSeparator(position); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/AddXmlDocTransform.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/AddXmlDocTransform.cs new file mode 100644 index 0000000..9a30b18 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/AddXmlDocTransform.cs @@ -0,0 +1,64 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Text; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler.XmlDoc; +using ICSharpCode.NRefactory.CSharp; + +namespace dnSpy.Decompiler.ILSpy.Core.XmlDoc { + /// + /// Adds XML documentation for member definitions. + /// + struct AddXmlDocTransform { + readonly StringBuilder stringBuilder; + + public AddXmlDocTransform(StringBuilder sb) => stringBuilder = sb; + + public void Run(AstNode node) { + if (node is EntityDeclaration) { + IMemberRef mr = node.Annotation(); + if (mr is not null && mr.Module is not null) { + var xmldoc = XmlDocLoader.LoadDocumentation(mr.Module); + if (xmldoc is not null) { + var doc = xmldoc.GetDocumentation(XmlDocKeyProvider.GetKey(mr, stringBuilder)); + if (!string2.IsNullOrEmpty(doc)) { + InsertXmlDocumentation(node, doc); + } + } + } + if (!(node is TypeDeclaration)) + return; // don't recurse into attributed nodes, except for type definitions + } + foreach (AstNode child in node.Children) + Run(child); + } + + void InsertXmlDocumentation(AstNode node, string doc) { + foreach (var info in new XmlDocLine(doc)) { + stringBuilder.Clear(); + if (info is not null) { + stringBuilder.Append(' '); + info.Value.WriteTo(stringBuilder); + } + node.Parent.InsertChildBefore(node, new Comment(stringBuilder.ToString(), CommentType.Documentation), Roles.Comment); + } + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/StringLineIterator.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/StringLineIterator.cs new file mode 100644 index 0000000..119ac17 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/StringLineIterator.cs @@ -0,0 +1,91 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; + +namespace dnSpy.Decompiler.ILSpy.Core.XmlDoc { + struct SubStringInfo { + public readonly int Index; + public readonly int Length; + + public SubStringInfo(int index, int length) { + Index = index; + Length = length; + } + } + + struct StringLineIterator : IEnumerable, IEnumerator { + readonly string s; + int index; + readonly int end; + SubStringInfo info; + bool finished; + + public StringLineIterator(string s, int index, int length) { + this.s = s; + this.index = index; + end = index + length; + info = default; + finished = false; + } + + public StringLineIterator GetEnumerator() => this; + + IEnumerator IEnumerable.GetEnumerator() { + Debug.Fail("'this' was boxed"); + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() { + Debug.Fail("'this' was boxed"); + return GetEnumerator(); + } + + public SubStringInfo Current => info; + + object IEnumerator.Current { + get { Debug.Fail("'this' was boxed"); return info; } + } + + public void Dispose() { } + + public bool MoveNext() { + int newLineIndex = s.IndexOfAny(newLineChars, index, end - index); + if (newLineIndex < 0) { + if (finished) + return false; + info = new SubStringInfo(index, end - index); + finished = true; + return true; + } + int len = newLineIndex - index; + info = new SubStringInfo(index, len); + if (s[newLineIndex] == '\r' && newLineIndex + 1 < s.Length && s[newLineIndex + 1] == '\n') + newLineIndex++; + index = newLineIndex + 1; + return true; + } + static readonly char[] newLineChars = new char[] { '\r', '\n', '\u0085', '\u2028', '\u2029' }; + + public void Reset() => throw new NotImplementedException(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/SubString.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/SubString.cs new file mode 100644 index 0000000..8376cad --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/SubString.cs @@ -0,0 +1,37 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Text; + +namespace dnSpy.Decompiler.ILSpy.Core.XmlDoc { + struct SubString { + public readonly string String; + public readonly int Index; + public readonly int Length; + + public SubString(string s, int index, int length) { + String = s; + Index = index; + Length = length; + } + + public override string ToString() => String.Substring(Index, Length); + public void WriteTo(StringBuilder sb) => sb.Append(String, Index, Length); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/XmlDocLine.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/XmlDocLine.cs new file mode 100644 index 0000000..638b017 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/XmlDoc/XmlDocLine.cs @@ -0,0 +1,153 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; + +namespace dnSpy.Decompiler.ILSpy.Core.XmlDoc { + struct XmlDocLine : IEnumerable, IEnumerator { + readonly string s; + readonly int end; + SubString? current; + SubStringInfo? indent; + StringLineIterator iter; + int emptyLines; + + public XmlDocLine(string s) + : this(s, 0, s.Length) { + } + + public XmlDocLine(string s, int start, int length) { + this.s = s; + end = start + length; + current = null; + indent = null; + iter = new StringLineIterator(s, start, end - start); + emptyLines = 0; + } + + public XmlDocLine GetEnumerator() => this; + + IEnumerator IEnumerable.GetEnumerator() { + Debug.Fail("'this' was boxed"); + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() { + Debug.Fail("'this' was boxed"); + return GetEnumerator(); + } + + public SubString? Current => current; + + object? IEnumerator.Current { + get { Debug.Fail("'this' was boxed"); return current; } + } + + public void Dispose() { } + + public bool MoveNext() { + if (indent is null) { + for (;;) { + if (!iter.MoveNext()) + return false; + if (!IsWhiteSpace(s, iter.Current)) + break; + } + + indent = GetIndentation(s, iter.Current); + goto start2; + } + + if (emptyLines != 0) + goto start2; +start: + if (!iter.MoveNext()) + return false; +start2: + if (IsWhiteSpace(s, iter.Current)) { + emptyLines++; + goto start; + } + + if (emptyLines != 0) { + if (emptyLines != -1) { + emptyLines--; + if (emptyLines == 0) + emptyLines = -1; + current = null; + return true; + } + emptyLines = 0; + } + + Trim(out int index, out int end); + current = new SubString(s, index, end - index); + return true; + } + + void Trim(out int trimmedIndex, out int trimmedEnd) { + Debug2.Assert(indent is not null); + + int index = iter.Current.Index; + int end = index + iter.Current.Length; + if (indent.Value.Length > iter.Current.Length) { + trimmedIndex = index; + trimmedEnd = end; + return; + } + + int end2 = index + indent.Value.Length; + for (int i = index, j = indent.Value.Index; i < end2; i++, j++) { + if (s[i] != s[j]) { + trimmedIndex = index; + trimmedEnd = end; + return; + } + } + + trimmedIndex = index + indent.Value.Length; + trimmedEnd = end; + Debug.Assert(trimmedIndex <= trimmedEnd); + } + + SubStringInfo GetIndentation(string doc, SubStringInfo info) { + int end = info.Index + info.Length; + int i = info.Index; + for (; i < end; i++) { + if (!char.IsWhiteSpace(doc[i])) + break; + } + return new SubStringInfo(info.Index, i - info.Index); + } + + bool IsWhiteSpace(string doc, SubStringInfo info) { + int end = info.Index + info.Length; + for (int i = info.Index; i < end; i++) { + if (!char.IsWhiteSpace(doc[i])) + return false; + } + return true; + } + + public void Reset() => throw new NotImplementedException(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/dnSpy.Decompiler.ILSpy.Core.csproj b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/dnSpy.Decompiler.ILSpy.Core.csproj new file mode 100644 index 0000000..216eb44 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy.Core/dnSpy.Decompiler.ILSpy.Core.csproj @@ -0,0 +1,39 @@ + + + + + + Copyright 2011-2014 AlphaSierraPapa for the SharpDevelop Team + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + True + ..\..\..\dnSpy.snk + enable + + + + + True + True + dnSpy.Decompiler.ILSpy.Core.Resources.resx + + + + + + PublicResXFileCodeGenerator + dnSpy.Decompiler.ILSpy.Core.Resources.Designer.cs + + + + + + + + + + + + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/CSharp/DecompilerCreator.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/CSharp/DecompilerCreator.cs new file mode 100644 index 0000000..a35e2f5 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/CSharp/DecompilerCreator.cs @@ -0,0 +1,36 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.CSharp; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.CSharp { + [Export(typeof(IDecompilerCreator))] + sealed class MyDecompilerCreator : IDecompilerCreator { + readonly DecompilerSettingsService decompilerSettingsService; + + [ImportingConstructor] + MyDecompilerCreator(DecompilerSettingsService decompilerSettingsService) => this.decompilerSettingsService = decompilerSettingsService; + + public IEnumerable Create() => new DecompilerProvider(decompilerSettingsService).Create(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ContentTypeDefinitions.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ContentTypeDefinitions.cs new file mode 100644 index 0000000..41100b5 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ContentTypeDefinitions.cs @@ -0,0 +1,57 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.ComponentModel.Composition; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.ILSpy.Core.Text; +using Microsoft.VisualStudio.Utilities; + +namespace dnSpy.Decompiler.ILSpy { + static class ContentTypeDefinitions { +#pragma warning disable CS0169 + [Export] + [Name(ContentTypesInternal.DecompilerILSpy)] + [BaseDefinition(ContentTypes.DecompiledCode)] + static readonly ContentTypeDefinition? DecompilerILSpyContentTypeDefinition; + + [Export] + [Name(ContentTypesInternal.CSharpILSpy)] + [BaseDefinition(ContentTypesInternal.DecompilerILSpy)] + [BaseDefinition(ContentTypes.CSharp)] + static readonly ContentTypeDefinition? CSharpILSpyContentTypeDefinition; + + [Export] + [Name(ContentTypesInternal.VisualBasicILSpy)] + [BaseDefinition(ContentTypesInternal.DecompilerILSpy)] + [BaseDefinition(ContentTypes.VisualBasic)] + static readonly ContentTypeDefinition? VisualBasicILSpyContentTypeDefinition; + + [Export] + [Name(ContentTypesInternal.ILILSpy)] + [BaseDefinition(ContentTypesInternal.DecompilerILSpy)] + [BaseDefinition(ContentTypes.IL)] + static readonly ContentTypeDefinition? ILILSpyContentTypeDefinition; + + [Export] + [Name(ContentTypesInternal.ILAstILSpy)] + [BaseDefinition(ContentTypesInternal.DecompilerILSpy)] + static readonly ContentTypeDefinition? ILAstILSpyContentTypeDefinition; +#pragma warning restore CS0169 + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/DecompilerCreator.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/DecompilerCreator.cs new file mode 100644 index 0000000..ea3dbac --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/DecompilerCreator.cs @@ -0,0 +1,36 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.IL; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.IL { + [Export(typeof(IDecompilerCreator))] + sealed class MyDecompilerCreator : IDecompilerCreator { + readonly DecompilerSettingsService decompilerSettingsService; + + [ImportingConstructor] + MyDecompilerCreator(DecompilerSettingsService decompilerSettingsService) => this.decompilerSettingsService = decompilerSettingsService; + + public IEnumerable Create() => new DecompilerProvider(decompilerSettingsService).Create(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/SimpleILPrinter.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/SimpleILPrinter.cs new file mode 100644 index 0000000..543bbc1 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/IL/SimpleILPrinter.cs @@ -0,0 +1,36 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.ComponentModel.Composition; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; +using dnSpy.Decompiler.ILSpy.Core.IL; +using ICSharpCode.Decompiler.Disassembler; + +namespace dnSpy.Decompiler.ILSpy.IL { + [Export(typeof(ISimpleILPrinter))] + sealed class SimpleILPrinter : ISimpleILPrinter { + double ISimpleILPrinter.Order => -100; + + bool ISimpleILPrinter.Write(IDecompilerOutput output, IMemberRef? member) => ILDecompilerUtils.Write(output, member); + void ISimpleILPrinter.Write(IDecompilerOutput output, MethodSig? sig) => output.Write(sig); + void ISimpleILPrinter.Write(IDecompilerOutput output, TypeSig? type) => type.WriteTo(output); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ILAst/DecompilerCreator.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ILAst/DecompilerCreator.cs new file mode 100644 index 0000000..1db75a0 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/ILAst/DecompilerCreator.cs @@ -0,0 +1,36 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.ILAst; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.ILAst { + [Export(typeof(IDecompilerCreator))] + sealed class MyDecompilerCreator : IDecompilerCreator { + readonly DecompilerSettingsService decompilerSettingsService; + + [ImportingConstructor] + MyDecompilerCreator(DecompilerSettingsService decompilerSettingsService) => this.decompilerSettingsService = decompilerSettingsService; + + public IEnumerable Create() => new DecompilerProvider(decompilerSettingsService).Create(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.Designer.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.Designer.cs new file mode 100644 index 0000000..d98ac55 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.Designer.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace dnSpy.Decompiler.ILSpy.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class dnSpy_Decompiler_ILSpy_Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal dnSpy_Decompiler_ILSpy_Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("dnSpy.Decompiler.ILSpy.Properties.dnSpy.Decompiler.ILSpy.Resources", typeof(dnSpy_Decompiler_ILSpy_Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Events. + /// + public static string DecompilationOrder_Events { + get { + return ResourceManager.GetString("DecompilationOrder_Events", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fields. + /// + public static string DecompilationOrder_Fields { + get { + return ResourceManager.GetString("DecompilationOrder_Fields", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Methods. + /// + public static string DecompilationOrder_Methods { + get { + return ResourceManager.GetString("DecompilationOrder_Methods", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nested Types. + /// + public static string DecompilationOrder_NestedTypes { + get { + return ResourceManager.GetString("DecompilationOrder_NestedTypes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Properties. + /// + public static string DecompilationOrder_Properties { + get { + return ResourceManager.GetString("DecompilationOrder_Properties", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ILSpy decompiler. + /// + public static string Plugin_ShortDescription { + get { + return ResourceManager.GetString("Plugin_ShortDescription", resourceCulture); + } + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.cs.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.cs.resx new file mode 100644 index 0000000..ade5e39 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.cs.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Události + + + Pole + + + Metody + + + Vnořené typy + + + Vlastnosti + + + ILSpy dekompilátor + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.de.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.de.resx new file mode 100644 index 0000000..7fa1295 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.de.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ereignisse + + + Felder + + + Methoden + + + Geschachtelte Typen + + + Eigenschaften + + + ILSpy-Dekompilierer + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.es-ES.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.es-ES.resx new file mode 100644 index 0000000..d94a0e5 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.es-ES.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Eventos + + + Campos + + + Métodos + + + Tipos Anidados + + + Propiedades + + + Decompilador ILSpy + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fa.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fa.resx new file mode 100644 index 0000000..be68bd5 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fa.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + رویدادها + + + Fieldها + + + Methodها + + + Nested Types + + + Propertieها + + + ILSpy دیکامپایلر + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fr.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fr.resx new file mode 100644 index 0000000..e40d876 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.fr.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Events + + + Champs + + + Méthodes + + + Types imbriqués + + + Propriétés + + + Décompilateur ILSpy + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.hu.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.hu.resx new file mode 100644 index 0000000..d7dc25b --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.hu.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Események + + + Mezők + + + Metódusok + + + Beágyazott típusok + + + Tulajdonságok + + + ILSpy decompiler + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.it.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.it.resx new file mode 100644 index 0000000..4714c71 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.it.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Eventi + + + Campi + + + Metodi + + + Tipi nidificati + + + Proprietá + + + ILSpy decompilatore + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-BR.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-BR.resx new file mode 100644 index 0000000..7c7ce8a --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-BR.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Eventos + + + Campos + + + Métodos + + + Tipos Aninhados + + + Propriedades + + + Descompilador ILSpy + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-PT.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-PT.resx new file mode 100644 index 0000000..8592c0a --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.pt-PT.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Eventos + + + Campos + + + Métodos + + + Tipos aninhados + + + Propriedades + + + Descompilador ILSpy + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.resx new file mode 100644 index 0000000..69f8afe --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Events + + + Fields + + + Methods + + + Nested Types + + + Properties + + + ILSpy decompiler + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.ru.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.ru.resx new file mode 100644 index 0000000..d2773ec --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + События + + + Поля + + + Методы + + + Вложенные типы + + + Свойства + + + Декомпилятор ILSpy + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.tr.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.tr.resx new file mode 100644 index 0000000..2b701f2 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.tr.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Olaylar + + + Alanlar + + + Metodlar + + + İçiçe Türler + + + Özellikler + + + ILSpy decompiler + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.uk.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.uk.resx new file mode 100644 index 0000000..745c3d9 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.uk.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Події + + + Поля + + + Методи + + + Вкладені Типи + + + Властивості + + + Декомпілятор ILSpy + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.zh-CN.resx b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.zh-CN.resx new file mode 100644 index 0000000..999d4d7 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Properties/dnSpy.Decompiler.ILSpy.Resources.zh-CN.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 事件 + + + 字段 + + + 方法 + + + 嵌套类 + + + 属性 + + + ILSpy 反编译器 + + \ No newline at end of file diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/CSharpDecompilerSettingsPage.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/CSharpDecompilerSettingsPage.cs new file mode 100644 index 0000000..3d648e3 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/CSharpDecompilerSettingsPage.cs @@ -0,0 +1,202 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Diagnostics; +using System.Linq; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.Settings.Dialog; +using dnSpy.Decompiler.ILSpy.Properties; +using ICSharpCode.Decompiler; + +namespace dnSpy.Decompiler.ILSpy.Settings { + sealed class CSharpDecompilerSettingsPage : AppSettingsPage, IAppSettingsPage2 { + readonly DecompilerSettings _global_decompilerSettings; + readonly DecompilerSettings decompilerSettings; + + public override double Order => AppSettingsConstants.ORDER_DECOMPILER_SETTINGS_ILSPY_CSHARP; + public DecompilerSettings Settings => decompilerSettings; + public override Guid ParentGuid => new Guid(AppSettingsConstants.GUID_DECOMPILER); + public override Guid Guid => new Guid("8929CE8E-7E2C-4701-A8BA-42F70363872C"); + public override string Title => "C# / Visual Basic (ILSpy)"; + public override object? UIObject => this; + + public DecompilationObjectVM[] DecompilationObjectsArray => decompilationObjectVMs2; + readonly DecompilationObjectVM[] decompilationObjectVMs; + readonly DecompilationObjectVM[] decompilationObjectVMs2; + + public DecompilationObjectVM DecompilationObject0 { + get => decompilationObjectVMs[0]; + set => SetDecompilationObject(0, value); + } + + public DecompilationObjectVM DecompilationObject1 { + get => decompilationObjectVMs[1]; + set => SetDecompilationObject(1, value); + } + + public DecompilationObjectVM DecompilationObject2 { + get => decompilationObjectVMs[2]; + set => SetDecompilationObject(2, value); + } + + public DecompilationObjectVM DecompilationObject3 { + get => decompilationObjectVMs[3]; + set => SetDecompilationObject(3, value); + } + + public DecompilationObjectVM DecompilationObject4 { + get => decompilationObjectVMs[4]; + set => SetDecompilationObject(4, value); + } + + void SetDecompilationObject(int index, DecompilationObjectVM newValue) { + Debug2.Assert(newValue is not null); + if (newValue is null) + throw new ArgumentNullException(nameof(newValue)); + if (decompilationObjectVMs[index] == newValue) + return; + + int otherIndex = Array.IndexOf(decompilationObjectVMs, newValue); + Debug.Assert(otherIndex >= 0); + if (otherIndex >= 0) { + decompilationObjectVMs[otherIndex] = decompilationObjectVMs[index]; + decompilationObjectVMs[index] = newValue; + + OnPropertyChanged($"DecompilationObject{otherIndex}"); + } + OnPropertyChanged($"DecompilationObject{index}"); + } + + public CSharpDecompilerSettingsPage(DecompilerSettings decompilerSettings) { + _global_decompilerSettings = decompilerSettings; + this.decompilerSettings = decompilerSettings.Clone(); + + var defObjs = typeof(DecompilationObject).GetEnumValues().Cast().ToArray(); + decompilationObjectVMs = new DecompilationObjectVM[defObjs.Length]; + for (int i = 0; i < defObjs.Length; i++) + decompilationObjectVMs[i] = new DecompilationObjectVM(defObjs[i], ToString(defObjs[i])); + decompilationObjectVMs2 = decompilationObjectVMs.ToArray(); + + DecompilationObject0 = decompilationObjectVMs.First(a => a.Object == decompilerSettings.DecompilationObject0); + DecompilationObject1 = decompilationObjectVMs.First(a => a.Object == decompilerSettings.DecompilationObject1); + DecompilationObject2 = decompilationObjectVMs.First(a => a.Object == decompilerSettings.DecompilationObject2); + DecompilationObject3 = decompilationObjectVMs.First(a => a.Object == decompilerSettings.DecompilationObject3); + DecompilationObject4 = decompilationObjectVMs.First(a => a.Object == decompilerSettings.DecompilationObject4); + } + + static string ToString(DecompilationObject o) { + switch (o) { + case DecompilationObject.NestedTypes: return dnSpy_Decompiler_ILSpy_Resources.DecompilationOrder_NestedTypes; + case DecompilationObject.Fields: return dnSpy_Decompiler_ILSpy_Resources.DecompilationOrder_Fields; + case DecompilationObject.Events: return dnSpy_Decompiler_ILSpy_Resources.DecompilationOrder_Events; + case DecompilationObject.Properties: return dnSpy_Decompiler_ILSpy_Resources.DecompilationOrder_Properties; + case DecompilationObject.Methods: return dnSpy_Decompiler_ILSpy_Resources.DecompilationOrder_Methods; + default: + Debug.Fail("Shouldn't be here"); + return "???"; + } + } + + [Flags] + enum RefreshFlags { + ShowMember = 0x00000001, + ILAst = 0x00000002, + CSharp = 0x00000004, + VB = 0x00000008, + DecompileAll = ILAst | CSharp | VB, + } + + public override void OnApply() => throw new InvalidOperationException(); + public void OnApply(IAppRefreshSettings appRefreshSettings) { + RefreshFlags flags = 0; + var g = _global_decompilerSettings; + var d = decompilerSettings; + + d.DecompilationObject0 = DecompilationObject0.Object; + d.DecompilationObject1 = DecompilationObject1.Object; + d.DecompilationObject2 = DecompilationObject2.Object; + d.DecompilationObject3 = DecompilationObject3.Object; + d.DecompilationObject4 = DecompilationObject4.Object; + + if (g.AnonymousMethods != d.AnonymousMethods) flags |= RefreshFlags.ILAst | RefreshFlags.ShowMember; + if (g.ExpressionTrees != d.ExpressionTrees) flags |= RefreshFlags.ILAst; + if (g.YieldReturn != d.YieldReturn) flags |= RefreshFlags.ILAst | RefreshFlags.ShowMember; + if (g.AsyncAwait != d.AsyncAwait) flags |= RefreshFlags.ILAst | RefreshFlags.ShowMember; + if (g.AutomaticProperties != d.AutomaticProperties) flags |= RefreshFlags.CSharp | RefreshFlags.ShowMember; + if (g.AutomaticEvents != d.AutomaticEvents) flags |= RefreshFlags.CSharp | RefreshFlags.ShowMember; + if (g.UsingStatement != d.UsingStatement) flags |= RefreshFlags.CSharp; + if (g.ForEachStatement != d.ForEachStatement) flags |= RefreshFlags.CSharp; + if (g.LockStatement != d.LockStatement) flags |= RefreshFlags.CSharp; + if (g.SwitchStatementOnString != d.SwitchStatementOnString) flags |= RefreshFlags.CSharp | RefreshFlags.ShowMember; + if (g.UsingDeclarations != d.UsingDeclarations) flags |= RefreshFlags.CSharp; + if (g.QueryExpressions != d.QueryExpressions) flags |= RefreshFlags.CSharp; + if (g.FullyQualifyAmbiguousTypeNames != d.FullyQualifyAmbiguousTypeNames) flags |= RefreshFlags.CSharp; + if (g.FullyQualifyAllTypes != d.FullyQualifyAllTypes) flags |= RefreshFlags.CSharp; + if (g.UseDebugSymbols != d.UseDebugSymbols) flags |= RefreshFlags.DecompileAll; + if (g.ObjectOrCollectionInitializers != d.ObjectOrCollectionInitializers) flags |= RefreshFlags.ILAst; + if (g.ShowXmlDocumentation != d.ShowXmlDocumentation) flags |= RefreshFlags.DecompileAll; + if (g.RemoveEmptyDefaultConstructors != d.RemoveEmptyDefaultConstructors) flags |= RefreshFlags.CSharp; + if (g.IntroduceIncrementAndDecrement != d.IntroduceIncrementAndDecrement) flags |= RefreshFlags.ILAst; + if (g.MakeAssignmentExpressions != d.MakeAssignmentExpressions) flags |= RefreshFlags.ILAst; + if (g.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject != d.AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject) flags |= RefreshFlags.ILAst; + if (g.ShowTokenAndRvaComments != d.ShowTokenAndRvaComments) flags |= RefreshFlags.DecompileAll; + if (g.DecompilationObject0 != d.DecompilationObject0) flags |= RefreshFlags.CSharp; + if (g.DecompilationObject1 != d.DecompilationObject1) flags |= RefreshFlags.CSharp; + if (g.DecompilationObject2 != d.DecompilationObject2) flags |= RefreshFlags.CSharp; + if (g.DecompilationObject3 != d.DecompilationObject3) flags |= RefreshFlags.CSharp; + if (g.DecompilationObject4 != d.DecompilationObject4) flags |= RefreshFlags.CSharp; + if (g.SortMembers != d.SortMembers) flags |= RefreshFlags.CSharp; + if (g.ForceShowAllMembers != d.ForceShowAllMembers) flags |= RefreshFlags.CSharp | RefreshFlags.ShowMember; + if (g.SortSystemUsingStatementsFirst != d.SortSystemUsingStatementsFirst) flags |= RefreshFlags.CSharp; + if (g.MaxArrayElements != d.MaxArrayElements) flags |= RefreshFlags.CSharp; + if (g.MaxStringLength != d.MaxStringLength) flags |= RefreshFlags.CSharp; + if (g.SortCustomAttributes != d.SortCustomAttributes) flags |= RefreshFlags.CSharp; + if (g.UseSourceCodeOrder != d.UseSourceCodeOrder) flags |= RefreshFlags.CSharp; + if (g.AllowFieldInitializers != d.AllowFieldInitializers) flags |= RefreshFlags.CSharp; + if (g.OneCustomAttributePerLine != d.OneCustomAttributePerLine) flags |= RefreshFlags.CSharp; + if (g.TypeAddInternalModifier != d.TypeAddInternalModifier) flags |= RefreshFlags.CSharp; + if (g.MemberAddPrivateModifier != d.MemberAddPrivateModifier) flags |= RefreshFlags.CSharp; + if (g.HexadecimalNumbers != d.HexadecimalNumbers) flags |= RefreshFlags.CSharp; + + if ((flags & RefreshFlags.ShowMember) != 0) + appRefreshSettings.Add(AppSettingsConstants.REFRESH_LANGUAGE_SHOWMEMBER); + if ((flags & RefreshFlags.ILAst) != 0) + appRefreshSettings.Add(SettingsConstants.REDECOMPILE_ILAST_ILSPY_CODE); + if ((flags & RefreshFlags.CSharp) != 0) + appRefreshSettings.Add(SettingsConstants.REDECOMPILE_CSHARP_ILSPY_CODE); + if ((flags & RefreshFlags.VB) != 0) + appRefreshSettings.Add(SettingsConstants.REDECOMPILE_VB_ILSPY_CODE); + + decompilerSettings.CopyTo(_global_decompilerSettings); + } + + public override string[]? GetSearchStrings() => DecompilationObjectsArray.Select(a => a.Text).ToArray(); + } + + sealed class DecompilationObjectVM : ViewModelBase { + public DecompilationObject Object { get; } + public string Text { get; } + + public DecompilationObjectVM(DecompilationObject decompilationObject, string text) { + Object = decompilationObject; + Text = text; + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerAppSettingsModifiedListener.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerAppSettingsModifiedListener.cs new file mode 100644 index 0000000..aa2a648 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerAppSettingsModifiedListener.cs @@ -0,0 +1,69 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Linq; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.Tabs; +using dnSpy.Contracts.Settings.Dialog; + +namespace dnSpy.Decompiler.ILSpy.Settings { + [ExportAppSettingsModifiedListener(Order = AppSettingsConstants.ORDER_LISTENER_DECOMPILER)] + sealed class DecompilerAppSettingsModifiedListener : IAppSettingsModifiedListener { + readonly IDocumentTabService documentTabService; + + [ImportingConstructor] + DecompilerAppSettingsModifiedListener(IDocumentTabService documentTabService) => this.documentTabService = documentTabService; + + public void OnSettingsModified(IAppRefreshSettings appRefreshSettings) { + bool refreshIL = appRefreshSettings.Has(SettingsConstants.REDISASSEMBLE_IL_ILSPY_CODE); + bool refreshILAst = appRefreshSettings.Has(SettingsConstants.REDECOMPILE_ILAST_ILSPY_CODE); + bool refreshCSharp = appRefreshSettings.Has(SettingsConstants.REDECOMPILE_CSHARP_ILSPY_CODE); + bool refreshVB = appRefreshSettings.Has(SettingsConstants.REDECOMPILE_VB_ILSPY_CODE); + if (refreshILAst) + refreshCSharp = refreshVB = true; + if (refreshCSharp) + refreshVB = true; + + if (refreshIL) + RefreshCode(); +#if DEBUG + if (refreshILAst) + RefreshCode(); +#endif + if (refreshCSharp) + RefreshCode(); + if (refreshVB) + RefreshCode(); + } + + IEnumerable<(IDocumentTab tab, IDecompiler decompiler)> DecompilerTabs { + get { + foreach (var tab in documentTabService.VisibleFirstTabs) { + var decompiler = (tab.Content as IDecompilerTabContent)?.Decompiler; + if (decompiler is not null) + yield return (tab, decompiler); + } + } + } + + void RefreshCode() => documentTabService.Refresh(DecompilerTabs.Where(t => t.decompiler is T).Select(a => a.tab).ToArray()); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsImpl.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsImpl.cs new file mode 100644 index 0000000..859f3ec --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsImpl.cs @@ -0,0 +1,131 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Settings; +using ICSharpCode.Decompiler; + +namespace dnSpy.Decompiler.ILSpy.Settings { + [Export] + sealed class DecompilerSettingsImpl : DecompilerSettings { + static readonly Guid SETTINGS_GUID = new Guid("6745457F-254B-4B7B-90F1-F948F0721C3B"); + + readonly ISettingsService settingsService; + + [ImportingConstructor] + DecompilerSettingsImpl(ISettingsService settingsService) { + this.settingsService = settingsService; + + disableSave = true; + var sect = settingsService.GetOrCreateSection(SETTINGS_GUID); + // Only read those settings that can be changed in the dialog box + DecompilationObject0 = sect.Attribute(nameof(DecompilationObject0)) ?? DecompilationObject0; + DecompilationObject1 = sect.Attribute(nameof(DecompilationObject1)) ?? DecompilationObject1; + DecompilationObject2 = sect.Attribute(nameof(DecompilationObject2)) ?? DecompilationObject2; + DecompilationObject3 = sect.Attribute(nameof(DecompilationObject3)) ?? DecompilationObject3; + DecompilationObject4 = sect.Attribute(nameof(DecompilationObject4)) ?? DecompilationObject4; + AnonymousMethods = sect.Attribute(nameof(AnonymousMethods)) ?? AnonymousMethods; + ExpressionTrees = sect.Attribute(nameof(ExpressionTrees)) ?? ExpressionTrees; + YieldReturn = sect.Attribute(nameof(YieldReturn)) ?? YieldReturn; + AsyncAwait = sect.Attribute(nameof(AsyncAwait)) ?? AsyncAwait; + //AutomaticProperties = sect.Attribute(nameof(AutomaticProperties)) ?? AutomaticProperties; + //AutomaticEvents = sect.Attribute(nameof(AutomaticEvents)) ?? AutomaticEvents; + //UsingStatement = sect.Attribute(nameof(UsingStatement)) ?? UsingStatement; + //ForEachStatement = sect.Attribute(nameof(ForEachStatement)) ?? ForEachStatement; + //LockStatement = sect.Attribute(nameof(LockStatement)) ?? LockStatement; + //SwitchStatementOnString = sect.Attribute(nameof(SwitchStatementOnString)) ?? SwitchStatementOnString; + //UsingDeclarations = sect.Attribute(nameof(UsingDeclarations)) ?? UsingDeclarations; + QueryExpressions = sect.Attribute(nameof(QueryExpressions)) ?? QueryExpressions; + FullyQualifyAmbiguousTypeNames = sect.Attribute(nameof(FullyQualifyAmbiguousTypeNames)) ?? FullyQualifyAmbiguousTypeNames; + FullyQualifyAllTypes = sect.Attribute(nameof(FullyQualifyAllTypes)) ?? FullyQualifyAllTypes; + UseDebugSymbols = sect.Attribute(nameof(UseDebugSymbols)) ?? UseDebugSymbols; + //ObjectOrCollectionInitializers = sect.Attribute(nameof(ObjectOrCollectionInitializers)) ?? ObjectOrCollectionInitializers; + ShowXmlDocumentation = sect.Attribute(nameof(ShowXmlDocumentation)) ?? ShowXmlDocumentation; + RemoveEmptyDefaultConstructors = sect.Attribute(nameof(RemoveEmptyDefaultConstructors)) ?? RemoveEmptyDefaultConstructors; + //IntroduceIncrementAndDecrement = sect.Attribute(nameof(IntroduceIncrementAndDecrement)) ?? IntroduceIncrementAndDecrement; + //MakeAssignmentExpressions = sect.Attribute(nameof(MakeAssignmentExpressions)) ?? MakeAssignmentExpressions; + //AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject = sect.Attribute(nameof(AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject)) ?? AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject; + ShowTokenAndRvaComments = sect.Attribute(nameof(ShowTokenAndRvaComments)) ?? ShowTokenAndRvaComments; + SortMembers = sect.Attribute(nameof(SortMembers)) ?? SortMembers; + ForceShowAllMembers = sect.Attribute(nameof(ForceShowAllMembers)) ?? ForceShowAllMembers; + SortSystemUsingStatementsFirst = sect.Attribute(nameof(SortSystemUsingStatementsFirst)) ?? SortSystemUsingStatementsFirst; + //MaxArrayElements = sect.Attribute(nameof(MaxArrayElements)) ?? MaxArrayElements; + SortCustomAttributes = sect.Attribute(nameof(SortCustomAttributes)) ?? SortCustomAttributes; + UseSourceCodeOrder = sect.Attribute(nameof(UseSourceCodeOrder)) ?? UseSourceCodeOrder; + AllowFieldInitializers = sect.Attribute(nameof(AllowFieldInitializers)) ?? AllowFieldInitializers; + OneCustomAttributePerLine = sect.Attribute(nameof(OneCustomAttributePerLine)) ?? OneCustomAttributePerLine; + TypeAddInternalModifier = sect.Attribute(nameof(TypeAddInternalModifier)) ?? TypeAddInternalModifier; + MemberAddPrivateModifier = sect.Attribute(nameof(MemberAddPrivateModifier)) ?? MemberAddPrivateModifier; + //RemoveNewDelegateClass = sect.Attribute(nameof(RemoveNewDelegateClass)) ?? RemoveNewDelegateClass; + HexadecimalNumbers = sect.Attribute(nameof(HexadecimalNumbers)) ?? HexadecimalNumbers; + //TODO: CSharpFormattingOptions + disableSave = false; + } + readonly bool disableSave; + + protected override void OnModified() { + if (disableSave) + return; + + var sect = settingsService.RecreateSection(SETTINGS_GUID); + // Only save those settings that can be changed in the dialog box + sect.Attribute(nameof(DecompilationObject0), DecompilationObject0); + sect.Attribute(nameof(DecompilationObject1), DecompilationObject1); + sect.Attribute(nameof(DecompilationObject2), DecompilationObject2); + sect.Attribute(nameof(DecompilationObject3), DecompilationObject3); + sect.Attribute(nameof(DecompilationObject4), DecompilationObject4); + sect.Attribute(nameof(AnonymousMethods), AnonymousMethods); + sect.Attribute(nameof(ExpressionTrees), ExpressionTrees); + sect.Attribute(nameof(YieldReturn), YieldReturn); + sect.Attribute(nameof(AsyncAwait), AsyncAwait); + //sect.Attribute(nameof(AutomaticProperties), AutomaticProperties); + //sect.Attribute(nameof(AutomaticEvents), AutomaticEvents); + //sect.Attribute(nameof(UsingStatement), UsingStatement); + //sect.Attribute(nameof(ForEachStatement), ForEachStatement); + //sect.Attribute(nameof(LockStatement), LockStatement); + //sect.Attribute(nameof(SwitchStatementOnString), SwitchStatementOnString); + //sect.Attribute(nameof(UsingDeclarations), UsingDeclarations); + sect.Attribute(nameof(QueryExpressions), QueryExpressions); + sect.Attribute(nameof(FullyQualifyAmbiguousTypeNames), FullyQualifyAmbiguousTypeNames); + sect.Attribute(nameof(FullyQualifyAllTypes), FullyQualifyAllTypes); + sect.Attribute(nameof(UseDebugSymbols), UseDebugSymbols); + //sect.Attribute(nameof(ObjectOrCollectionInitializers), ObjectOrCollectionInitializers); + sect.Attribute(nameof(ShowXmlDocumentation), ShowXmlDocumentation); + sect.Attribute(nameof(RemoveEmptyDefaultConstructors), RemoveEmptyDefaultConstructors); + //sect.Attribute(nameof(IntroduceIncrementAndDecrement), IntroduceIncrementAndDecrement); + //sect.Attribute(nameof(MakeAssignmentExpressions), MakeAssignmentExpressions); + //sect.Attribute(nameof(AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject), AlwaysGenerateExceptionVariableForCatchBlocksUnlessTypeIsObject); + sect.Attribute(nameof(ShowTokenAndRvaComments), ShowTokenAndRvaComments); + sect.Attribute(nameof(SortMembers), SortMembers); + sect.Attribute(nameof(ForceShowAllMembers), ForceShowAllMembers); + sect.Attribute(nameof(SortSystemUsingStatementsFirst), SortSystemUsingStatementsFirst); + //sect.Attribute(nameof(MaxArrayElements), MaxArrayElements); + sect.Attribute(nameof(SortCustomAttributes), SortCustomAttributes); + sect.Attribute(nameof(UseSourceCodeOrder), UseSourceCodeOrder); + sect.Attribute(nameof(AllowFieldInitializers), AllowFieldInitializers); + sect.Attribute(nameof(OneCustomAttributePerLine), OneCustomAttributePerLine); + sect.Attribute(nameof(TypeAddInternalModifier), TypeAddInternalModifier); + sect.Attribute(nameof(MemberAddPrivateModifier), MemberAddPrivateModifier); + //sect.Attribute(nameof(RemoveNewDelegateClass), RemoveNewDelegateClass); + sect.Attribute(nameof(HexadecimalNumbers), HexadecimalNumbers); + //TODO: CSharpFormattingOptions + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsPageProvider.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsPageProvider.cs new file mode 100644 index 0000000..b618bb8 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsPageProvider.cs @@ -0,0 +1,42 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Settings.Dialog; +using ICSharpCode.Decompiler; + +namespace dnSpy.Decompiler.ILSpy.Settings { + [Export(typeof(IAppSettingsPageProvider))] + sealed class DecompilerSettingsPageProvider : IAppSettingsPageProvider { + readonly DecompilerSettings decompilerSettings; + readonly ILSettingsImpl ilSettings; + + [ImportingConstructor] + DecompilerSettingsPageProvider(DecompilerSettingsImpl decompilerSettings, ILSettingsImpl ilSettings) { + this.decompilerSettings = decompilerSettings; + this.ilSettings = ilSettings; + } + + public IEnumerable Create() { + yield return new CSharpDecompilerSettingsPage(decompilerSettings); + yield return new ILDecompilerSettingsPage(ilSettings); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsServiceImpl.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsServiceImpl.cs new file mode 100644 index 0000000..f18de28 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/DecompilerSettingsServiceImpl.cs @@ -0,0 +1,32 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.ComponentModel.Composition; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.Settings { + [Export(typeof(DecompilerSettingsService))] + sealed class DecompilerSettingsServiceImpl : DecompilerSettingsService { + [ImportingConstructor] + DecompilerSettingsServiceImpl(DecompilerSettingsImpl decompilerSettings, ILSettingsImpl ilSettings) { + CSharpVBDecompilerSettings = new CSharpVBDecompilerSettings(decompilerSettings); + ILDecompilerSettings = new ILDecompilerSettings(ilSettings); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILDecompilerSettingsPage.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILDecompilerSettingsPage.cs new file mode 100644 index 0000000..12bf225 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILDecompilerSettingsPage.cs @@ -0,0 +1,49 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using dnSpy.Contracts.Settings.Dialog; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.Settings { + sealed class ILDecompilerSettingsPage : AppSettingsPage, IAppSettingsPage2 { + readonly ILSettings _global_ilSettings; + readonly ILSettings ilSettings; + + public override double Order => AppSettingsConstants.ORDER_DECOMPILER_SETTINGS_ILSPY_IL; + public ILSettings Settings => ilSettings; + public override Guid ParentGuid => new Guid(AppSettingsConstants.GUID_DECOMPILER); + public override Guid Guid => new Guid("0F8FBD3F-01DA-4AF0-9316-B7B5C8901A74"); + public override string Title => "IL (ILSpy)"; + public override object? UIObject => this; + + public ILDecompilerSettingsPage(ILSettings ilSettings) { + _global_ilSettings = ilSettings; + this.ilSettings = ilSettings.Clone(); + } + + public override void OnApply() => throw new InvalidOperationException(); + public void OnApply(IAppRefreshSettings appRefreshSettings) { + if (!_global_ilSettings.Equals(ilSettings)) + appRefreshSettings.Add(SettingsConstants.REDISASSEMBLE_IL_ILSPY_CODE); + + ilSettings.CopyTo(_global_ilSettings); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILSettingsImpl.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILSettingsImpl.cs new file mode 100644 index 0000000..9956c88 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/ILSettingsImpl.cs @@ -0,0 +1,65 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Settings; +using dnSpy.Decompiler.ILSpy.Core.Settings; + +namespace dnSpy.Decompiler.ILSpy.Settings { + [Export] + sealed class ILSettingsImpl : ILSettings { + static readonly Guid SETTINGS_GUID = new Guid("DD6752B1-5336-4601-A9B2-0879E18AE9F3"); + + readonly ISettingsService settingsService; + + [ImportingConstructor] + ILSettingsImpl(ISettingsService settingsService) { + this.settingsService = settingsService; + + disableSave = true; + var sect = settingsService.GetOrCreateSection(SETTINGS_GUID); + ShowILComments = sect.Attribute(nameof(ShowILComments)) ?? ShowILComments; + ShowXmlDocumentation = sect.Attribute(nameof(ShowXmlDocumentation)) ?? ShowXmlDocumentation; + ShowTokenAndRvaComments = sect.Attribute(nameof(ShowTokenAndRvaComments)) ?? ShowTokenAndRvaComments; + ShowILBytes = sect.Attribute(nameof(ShowILBytes)) ?? ShowILBytes; + SortMembers = sect.Attribute(nameof(SortMembers)) ?? SortMembers; + ShowPdbInfo = sect.Attribute(nameof(ShowPdbInfo)) ?? ShowPdbInfo; + MaxStringLength = sect.Attribute(nameof(MaxStringLength)) ?? MaxStringLength; + HexadecimalNumbers = sect.Attribute(nameof(HexadecimalNumbers)) ?? HexadecimalNumbers; + disableSave = false; + } + readonly bool disableSave; + + protected override void OnModified() { + if (disableSave) + return; + + var sect = settingsService.RecreateSection(SETTINGS_GUID); + sect.Attribute(nameof(ShowILComments), ShowILComments); + sect.Attribute(nameof(ShowXmlDocumentation), ShowXmlDocumentation); + sect.Attribute(nameof(ShowTokenAndRvaComments), ShowTokenAndRvaComments); + sect.Attribute(nameof(ShowILBytes), ShowILBytes); + sect.Attribute(nameof(SortMembers), SortMembers); + sect.Attribute(nameof(ShowPdbInfo), ShowPdbInfo); + sect.Attribute(nameof(MaxStringLength), MaxStringLength); + sect.Attribute(nameof(HexadecimalNumbers), HexadecimalNumbers); + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/SettingsConstants.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/SettingsConstants.cs new file mode 100644 index 0000000..4014cbf --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Settings/SettingsConstants.cs @@ -0,0 +1,44 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; + +namespace dnSpy.Decompiler.ILSpy.Settings { + static class SettingsConstants { + /// + /// Redisassemble IL (ILSpy) code + /// + public static readonly Guid REDISASSEMBLE_IL_ILSPY_CODE = new Guid("9F975119-FB7A-461D-BA17-09B82C7AE258"); + + /// + /// Redecompile ILAst (ILSpy) code + /// + public static readonly Guid REDECOMPILE_ILAST_ILSPY_CODE = new Guid("20D97DB7-EA2D-489D-820F-DCDCE3AB01D3"); + + /// + /// Redecompile C# (ILSpy) code + /// + public static readonly Guid REDECOMPILE_CSHARP_ILSPY_CODE = new Guid("00C8E462-E6E7-4D1F-8CE0-3385B34EA1FB"); + + /// + /// Redecompile VB (ILSpy) code + /// + public static readonly Guid REDECOMPILE_VB_ILSPY_CODE = new Guid("818B8011-851F-4868-9674-3AC3A7B0AEC6"); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/TheExtension.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/TheExtension.cs new file mode 100644 index 0000000..823969b --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/TheExtension.cs @@ -0,0 +1,39 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using dnSpy.Contracts.Extension; +using dnSpy.Decompiler.ILSpy.Properties; + +namespace dnSpy.Decompiler.ILSpy { + [ExportExtension] + sealed class TheExtension : IExtension { + public IEnumerable MergedResourceDictionaries { + get { yield return "Themes/wpf.styles.templates.xaml"; } + } + + public ExtensionInfo ExtensionInfo => new ExtensionInfo { + ShortDescription = dnSpy_Decompiler_ILSpy_Resources.Plugin_ShortDescription, + Copyright = "Copyright 2011-2014 AlphaSierraPapa for the SharpDevelop Team", + }; + + public void OnEvent(ExtensionEvent @event, object? obj) { + } + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Themes/wpf.styles.templates.xaml b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Themes/wpf.styles.templates.xaml new file mode 100644 index 0000000..4e34d64 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/Themes/wpf.styles.templates.xaml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/VisualBasic/DecompilerCreator.cs b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/VisualBasic/DecompilerCreator.cs new file mode 100644 index 0000000..f37c41b --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/VisualBasic/DecompilerCreator.cs @@ -0,0 +1,36 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using System.ComponentModel.Composition; +using dnSpy.Contracts.Decompiler; +using dnSpy.Decompiler.ILSpy.Core.Settings; +using dnSpy.Decompiler.ILSpy.Core.VisualBasic; + +namespace dnSpy.Decompiler.ILSpy.VisualBasic { + [Export(typeof(IDecompilerCreator))] + sealed class MyDecompilerCreator : IDecompilerCreator { + readonly DecompilerSettingsService decompilerSettingsService; + + [ImportingConstructor] + MyDecompilerCreator(DecompilerSettingsService decompilerSettingsService) => this.decompilerSettingsService = decompilerSettingsService; + + public IEnumerable Create() => new DecompilerProvider(decompilerSettingsService).Create(); + } +} diff --git a/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/dnSpy.Decompiler.ILSpy.csproj b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/dnSpy.Decompiler.ILSpy.csproj new file mode 100644 index 0000000..db72cd0 --- /dev/null +++ b/Extensions/ILSpy.Decompiler/dnSpy.Decompiler.ILSpy/dnSpy.Decompiler.ILSpy.csproj @@ -0,0 +1,44 @@ + + + + + + $(DnSpyAssemblyCopyright) + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + dnSpy.Decompiler.ILSpy.x + True + ..\..\..\dnSpy.snk + ..\..\..\dnSpy\dnSpy\bin\$(Configuration)\ + enable + true + + + + + True + True + dnSpy.Decompiler.ILSpy.Resources.resx + + + + + + PublicResXFileCodeGenerator + dnSpy.Decompiler.ILSpy.Resources.Designer.cs + + + + + + + + + + + + + + + diff --git a/Extensions/dnSpy.Analyzer/AnalyzerService.cs b/Extensions/dnSpy.Analyzer/AnalyzerService.cs new file mode 100644 index 0000000..ea108b2 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/AnalyzerService.cs @@ -0,0 +1,376 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.Composition; +using System.Diagnostics; +using System.Linq; +using System.Windows.Input; +using dnlib.DotNet; +using dnSpy.Analyzer.TreeNodes; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Documents.Tabs; +using dnSpy.Contracts.Documents.Tabs.DocViewer; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.TreeView.Text; +using Microsoft.VisualStudio.Text; + +namespace dnSpy.Analyzer { + interface IAnalyzerService { + /// + /// Gets the instance + /// + ITreeView TreeView { get; } + + /// + /// Called when it's been closed + /// + void OnClose(); + + /// + /// Adds if it hasn't been added and gives it focus. + /// + /// Node + void Add(AnalyzerTreeNodeData node); + + /// + /// Called by when its method + /// has been called. + /// + /// Activated node (it's the caller) + void OnActivated(AnalyzerTreeNodeData node); + + /// + /// Follows the reference + /// + /// Node + /// true to show it in a new tab + /// true to show the reference in a method body + void FollowNode(TreeNodeData node, bool newTab, bool? useCodeRef); + + /// + /// Returns true if can execute + /// + /// Node + /// true to show the reference in a method body + /// + bool CanFollowNode(TreeNodeData node, bool useCodeRef); + } + + [Export(typeof(IAnalyzerService))] + sealed class AnalyzerService : IAnalyzerService, ITreeViewListener { + static readonly Guid ANALYZER_TREEVIEW_GUID = new Guid("8981898A-1384-4B67-9577-3CB096195146"); + + public ITreeView TreeView { get; } + + sealed class GuidObjectsProvider : IGuidObjectsProvider { + readonly ITreeView treeView; + + public GuidObjectsProvider(ITreeView treeView) => this.treeView = treeView; + + public IEnumerable GetGuidObjects(GuidObjectsProviderArgs args) { + yield return new GuidObject(MenuConstants.GUIDOBJ_TREEVIEW_NODES_ARRAY_GUID, treeView.TopLevelSelection); + } + } + + readonly AnalyzerTreeNodeDataContext context; + readonly IDocumentTabService documentTabService; + + [ImportingConstructor] + AnalyzerService(IWpfCommandService wpfCommandService, IDocumentTabService documentTabService, ITreeViewService treeViewService, IMenuService menuService, IAnalyzerSettings analyzerSettings, IDotNetImageService dotNetImageService, IDecompilerService decompilerService, ITreeViewNodeTextElementProvider treeViewNodeTextElementProvider) { + this.documentTabService = documentTabService; + + context = new AnalyzerTreeNodeDataContext { + DotNetImageService = dotNetImageService, + Decompiler = decompilerService.Decompiler, + TreeViewNodeTextElementProvider = treeViewNodeTextElementProvider, + DocumentService = documentTabService.DocumentTreeView.DocumentService, + ShowToken = analyzerSettings.ShowToken, + SingleClickExpandsChildren = analyzerSettings.SingleClickExpandsChildren, + SyntaxHighlight = analyzerSettings.SyntaxHighlight, + AnalyzerService = this, + }; + + var options = new TreeViewOptions { + CanDragAndDrop = false, + TreeViewListener = this, + }; + TreeView = treeViewService.Create(ANALYZER_TREEVIEW_GUID, options); + context.TreeView = TreeView; + + documentTabService.DocumentTreeView.DocumentService.CollectionChanged += DocumentService_CollectionChanged; + documentTabService.DocumentModified += DocumentTabService_FileModified; + decompilerService.DecompilerChanged += DecompilerService_DecompilerChanged; + analyzerSettings.PropertyChanged += AnalyzerSettings_PropertyChanged; + + menuService.InitializeContextMenu(TreeView.UIObject, new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID), new GuidObjectsProvider(TreeView)); + wpfCommandService.Add(ControlConstants.GUID_ANALYZER_TREEVIEW, TreeView.UIObject); + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_ANALYZER_TREEVIEW); + var command = new RelayCommand(a => ActivateNode()); + cmds.Add(command, ModifierKeys.Control, Key.Enter); + cmds.Add(command, ModifierKeys.Shift, Key.Enter); + } + + void DocumentTabService_FileModified(object? sender, DocumentModifiedEventArgs e) { + AnalyzerTreeNodeData.HandleModelUpdated(TreeView.Root, e.Documents); + RefreshNodes(); + } + + void ActivateNode() { + var nodes = TreeView.TopLevelSelection; + var node = nodes.Length == 0 ? null : nodes[0] as TreeNodeData; + if (node is not null) + node.Activate(); + } + + void DocumentService_CollectionChanged(object? sender, NotifyDocumentCollectionChangedEventArgs e) { + switch (e.Type) { + case NotifyDocumentCollectionType.Clear: + ClearAll(); + break; + + case NotifyDocumentCollectionType.Add: + AnalyzerTreeNodeData.HandleAssemblyListChanged(TreeView.Root, Array.Empty(), e.Documents); + break; + + case NotifyDocumentCollectionType.Remove: + AnalyzerTreeNodeData.HandleAssemblyListChanged(TreeView.Root, e.Documents, Array.Empty()); + break; + + default: + break; + } + } + + void DecompilerService_DecompilerChanged(object? sender, EventArgs e) { + context.Decompiler = ((IDecompilerService)sender!).Decompiler; + RefreshNodes(); + } + + void AnalyzerSettings_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + var analyzerSettings = (IAnalyzerSettings)sender!; + switch (e.PropertyName) { + case nameof(analyzerSettings.ShowToken): + context.ShowToken = analyzerSettings.ShowToken; + RefreshNodes(); + break; + + case nameof(analyzerSettings.SyntaxHighlight): + context.SyntaxHighlight = analyzerSettings.SyntaxHighlight; + RefreshNodes(); + break; + + case nameof(analyzerSettings.SingleClickExpandsChildren): + context.SingleClickExpandsChildren = analyzerSettings.SingleClickExpandsChildren; + break; + } + } + + void RefreshNodes() => TreeView.RefreshAllNodes(); + + void ITreeViewListener.OnEvent(ITreeView treeView, TreeViewListenerEventArgs e) { + if (e.Event == TreeViewListenerEvent.NodeCreated) { + Debug2.Assert(context is not null); + var node = (ITreeNode)e.Argument; + if (node.Data is AnalyzerTreeNodeData d) + d.Context = context; + return; + } + } + + void Cancel() => AnalyzerTreeNodeData.CancelSelfAndChildren(TreeView.Root.Data); + public void OnClose() => ClearAll(); + + void ClearAll() { + Cancel(); + TreeView.Root.Children.Clear(); + } + + public void Add(AnalyzerTreeNodeData node) { + if (node is EntityNode an) { + var found = TreeView.Root.DataChildren.OfType().FirstOrDefault(n => n.Member == an.Member); + if (found is not null) { + found.TreeNode.IsExpanded = true; + TreeView.SelectItems(new TreeNodeData[] { found }); + TreeView.Focus(); + return; + } + } + TreeView.Root.Children.Add(TreeView.Create(node)); + node.TreeNode.IsExpanded = true; + TreeView.SelectItems(new TreeNodeData[] { node }); + TreeView.Focus(); + } + + public void OnActivated(AnalyzerTreeNodeData node) { + if (node is null) + throw new ArgumentNullException(nameof(node)); + bool newTab = Keyboard.Modifiers == ModifierKeys.Control || Keyboard.Modifiers == ModifierKeys.Shift; + FollowNode(node, newTab, null); + } + + public void FollowNode(TreeNodeData node, bool newTab, bool? useCodeRef) { + var tokNode = node as IMDTokenNode; + var @ref = tokNode?.Reference; + + var entityNode = node as EntityNode; + var srcRef = entityNode?.SourceRef; + + bool code = useCodeRef ?? srcRef is not null; + if (code) { + if (srcRef is null) + return; + if (srcRef.Value.ILOffset is not null) { + documentTabService.FollowReference(srcRef.Value.Method, newTab, true, a => { + if (!a.HasMovedCaret && a.Success && srcRef is not null) + a.HasMovedCaret = GoTo(a.Tab, srcRef.Value.Method, srcRef.Value.ILOffset, srcRef.Value.Reference); + }); + } + else + documentTabService.FollowReference(srcRef.Value.Method, newTab); + } + else { + if (@ref is null) + return; + documentTabService.FollowReference(@ref, newTab); + } + } + + public bool CanFollowNode(TreeNodeData node, bool useCodeRef) { + var tokNode = node as IMDTokenNode; + var @ref = tokNode?.Reference; + + var entityNode = node as EntityNode; + var srcRef = entityNode?.SourceRef; + + if (useCodeRef) + return srcRef is not null; + return @ref is not null; + } + + bool GoTo(IDocumentTab tab, MethodDef method, uint? ilOffset, object? @ref) { + if (method is null || ilOffset is null) + return false; + var documentViewer = tab.TryGetDocumentViewer(); + if (documentViewer is null) + return false; + var methodDebugService = documentViewer.GetMethodDebugService(); + var methodStatement = methodDebugService.FindByCodeOffset(method, ilOffset.Value); + if (methodStatement is null) + return false; + + var textSpan = methodStatement.Value.Statement.TextSpan; + var loc = FindLocation(documentViewer.Content.ReferenceCollection.FindFrom(textSpan.Start), documentViewer.TextView.TextSnapshot, methodStatement.Value.Statement.TextSpan.End, @ref); + if (loc is null) + loc = textSpan.Start; + + documentViewer.MoveCaretToPosition(loc.Value); + return true; + } + + static int GetLineNumber(ITextSnapshot snapshot, int position) { + Debug.Assert((uint)position <= (uint)snapshot.Length); + if ((uint)position > (uint)snapshot.Length) + return int.MaxValue; + return snapshot.GetLineFromPosition(position).LineNumber; + } + + int? FindLocation(IEnumerable> refs, ITextSnapshot snapshot, int endPos, object? @ref) { + int lb = GetLineNumber(snapshot, endPos); + foreach (var info in refs) { + var la = GetLineNumber(snapshot, info.Span.Start); + int c = Compare(la, info.Span.Start, lb, endPos); + if (c > 0) + break; + if (RefEquals(@ref, info.Data.Reference)) + return info.Span.Start; + } + return null; + } + + static int Compare(int la, int ca, int lb, int cb) { + if (la > lb) + return 1; + if (la == lb) + return ca - cb; + return -1; + } + + static bool RefEquals(object? a, object? b) { + if (Equals(a, b)) + return true; + if (a is null || b is null) + return false; + + { + if (b is PropertyDef) { + var tmp = a; + a = b; + b = tmp; + } + if (b is EventDef) { + var tmp = a; + a = b; + b = tmp; + } + } + + const SigComparerOptions flags = SigComparerOptions.CompareDeclaringTypes | SigComparerOptions.PrivateScopeIsComparable; + + if (a is IType type) + return new SigComparer().Equals(type, b as IType); + + if (a is IMethod method && method.IsMethod) + return new SigComparer(flags).Equals(method, b as IMethod); + + if (a is IField field && field.IsField) + return new SigComparer(flags).Equals(field, b as IField); + + if (a is PropertyDef prop) { + if (new SigComparer(flags).Equals(prop, b as PropertyDef)) + return true; + var bm = b as IMethod; + return bm is not null && + (new SigComparer(flags).Equals(prop.GetMethod, bm) || + new SigComparer(flags).Equals(prop.SetMethod, bm)); + } + + if (a is EventDef evt) { + if (new SigComparer(flags).Equals(evt, b as EventDef)) + return true; + var bm = b as IMethod; + return bm is not null && + (new SigComparer(flags).Equals(evt.AddMethod, bm) || + new SigComparer(flags).Equals(evt.InvokeMethod, bm) || + new SigComparer(flags).Equals(evt.RemoveMethod, bm)); + } + + Debug.Fail("Shouldn't be here"); + return false; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/AnalyzerSettings.cs b/Extensions/dnSpy.Analyzer/AnalyzerSettings.cs new file mode 100644 index 0000000..db972ab --- /dev/null +++ b/Extensions/dnSpy.Analyzer/AnalyzerSettings.cs @@ -0,0 +1,101 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.ComponentModel; +using System.ComponentModel.Composition; +using dnSpy.Contracts.MVVM; +using dnSpy.Contracts.Settings; + +namespace dnSpy.Analyzer { + interface IAnalyzerSettings : INotifyPropertyChanged { + bool SyntaxHighlight { get; } + bool ShowToken { get; } + bool SingleClickExpandsChildren { get; } + } + + class AnalyzerSettings : ViewModelBase, IAnalyzerSettings { + public bool SyntaxHighlight { + get => syntaxHighlight; + set { + if (syntaxHighlight != value) { + syntaxHighlight = value; + OnPropertyChanged(nameof(SyntaxHighlight)); + } + } + } + bool syntaxHighlight = true; + + public bool ShowToken { + get => showToken; + set { + if (showToken != value) { + showToken = value; + OnPropertyChanged(nameof(ShowToken)); + } + } + } + bool showToken = true; + + public bool SingleClickExpandsChildren { + get => singleClickExpandsChildren; + set { + if (singleClickExpandsChildren != value) { + singleClickExpandsChildren = value; + OnPropertyChanged(nameof(SingleClickExpandsChildren)); + } + } + } + bool singleClickExpandsChildren = true; + + public AnalyzerSettings Clone() => CopyTo(new AnalyzerSettings()); + + public AnalyzerSettings CopyTo(AnalyzerSettings other) { + other.SyntaxHighlight = SyntaxHighlight; + other.ShowToken = ShowToken; + other.SingleClickExpandsChildren = SingleClickExpandsChildren; + return other; + } + } + + [Export, Export(typeof(IAnalyzerSettings))] + sealed class AnalyzerSettingsImpl : AnalyzerSettings { + static readonly Guid SETTINGS_GUID = new Guid("0A9208EC-CFAB-41C2-82C6-FCDA44A8E684"); + + readonly ISettingsService settingsService; + + [ImportingConstructor] + AnalyzerSettingsImpl(ISettingsService settingsService) { + this.settingsService = settingsService; + + var sect = settingsService.GetOrCreateSection(SETTINGS_GUID); + SyntaxHighlight = sect.Attribute(nameof(SyntaxHighlight)) ?? SyntaxHighlight; + ShowToken = sect.Attribute(nameof(ShowToken)) ?? ShowToken; + SingleClickExpandsChildren = sect.Attribute(nameof(SingleClickExpandsChildren)) ?? SingleClickExpandsChildren; + PropertyChanged += AnalyzerSettingsImpl_PropertyChanged; + } + + void AnalyzerSettingsImpl_PropertyChanged(object? sender, PropertyChangedEventArgs e) { + var sect = settingsService.RecreateSection(SETTINGS_GUID); + sect.Attribute(nameof(SyntaxHighlight), SyntaxHighlight); + sect.Attribute(nameof(ShowToken), ShowToken); + sect.Attribute(nameof(SingleClickExpandsChildren), SingleClickExpandsChildren); + } + } +} diff --git a/Extensions/dnSpy.Analyzer/AnalyzerToolWindowContent.cs b/Extensions/dnSpy.Analyzer/AnalyzerToolWindowContent.cs new file mode 100644 index 0000000..caeedf5 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/AnalyzerToolWindowContent.cs @@ -0,0 +1,69 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Windows; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.ToolWindows; +using dnSpy.Contracts.ToolWindows.App; + +namespace dnSpy.Analyzer { + [Export(typeof(IToolWindowContentProvider))] + sealed class AnalyzerToolWindowContentProvider : IToolWindowContentProvider { + readonly Lazy analyzerService; + + public AnalyzerToolWindowContent DocumentTreeViewWindowContent => analyzerToolWindowContent ??= new AnalyzerToolWindowContent(analyzerService); + AnalyzerToolWindowContent? analyzerToolWindowContent; + + [ImportingConstructor] + AnalyzerToolWindowContentProvider(Lazy analyzerService) => this.analyzerService = analyzerService; + + public IEnumerable ContentInfos { + get { yield return new ToolWindowContentInfo(AnalyzerToolWindowContent.THE_GUID, AnalyzerToolWindowContent.DEFAULT_LOCATION, AppToolWindowConstants.DEFAULT_CONTENT_ORDER_BOTTOM_ANALYZER, false); } + } + + public ToolWindowContent? GetOrCreate(Guid guid) => guid == AnalyzerToolWindowContent.THE_GUID ? DocumentTreeViewWindowContent : null; + } + + sealed class AnalyzerToolWindowContent : ToolWindowContent, IFocusable { + public static readonly Guid THE_GUID = new Guid("5827D693-A5DF-4D65-B1F8-ACF249508A96"); + public const AppToolWindowLocation DEFAULT_LOCATION = AppToolWindowLocation.DefaultHorizontal; + + public override IInputElement? FocusedElement => null; + public override FrameworkElement? ZoomElement => analyzerService.Value.TreeView.UIObject; + public override Guid Guid => THE_GUID; + public override string Title => dnSpy_Analyzer_Resources.AnalyzerWindowTitle; + public override object? UIObject => analyzerService.Value.TreeView.UIObject; + public bool CanFocus => true; + + readonly Lazy analyzerService; + + public AnalyzerToolWindowContent(Lazy analyzerService) => this.analyzerService = analyzerService; + + public override void OnVisibilityChanged(ToolWindowContentVisibilityEvent visEvent) { + if (visEvent == ToolWindowContentVisibilityEvent.Removed) + analyzerService.Value.OnClose(); + } + + public void Focus() => analyzerService.Value.TreeView.Focus(); + } +} diff --git a/Extensions/dnSpy.Analyzer/AnalyzerTreeNodeDataContext.cs b/Extensions/dnSpy.Analyzer/AnalyzerTreeNodeDataContext.cs new file mode 100644 index 0000000..52f964c --- /dev/null +++ b/Extensions/dnSpy.Analyzer/AnalyzerTreeNodeDataContext.cs @@ -0,0 +1,41 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using dnSpy.Analyzer.TreeNodes; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.TreeView.Text; + +namespace dnSpy.Analyzer { + sealed class AnalyzerTreeNodeDataContext : IAnalyzerTreeNodeDataContext { +#pragma warning disable CS8618 // Non-nullable field is uninitialized. + public IDotNetImageService DotNetImageService { get; set; } + public ITreeView TreeView { get; set; } + public IDecompiler Decompiler { get; set; } + public ITreeViewNodeTextElementProvider TreeViewNodeTextElementProvider { get; set; } + public IDsDocumentService DocumentService { get; set; } + public IAnalyzerService AnalyzerService { get; set; } + public bool ShowToken { get; set; } + public bool SingleClickExpandsChildren { get; set; } + public bool SyntaxHighlight { get; set; } +#pragma warning restore CS8618 // Non-nullable field is uninitialized. + } +} diff --git a/Extensions/dnSpy.Analyzer/Commands.cs b/Extensions/dnSpy.Analyzer/Commands.cs new file mode 100644 index 0000000..2e78ee9 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Commands.cs @@ -0,0 +1,210 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows; +using System.Windows.Input; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer { + abstract class OpenReferenceCtxMenuCommandBase : MenuItemBase { + readonly Lazy analyzerService; + readonly bool newTab; + readonly bool useCodeRef; + + protected OpenReferenceCtxMenuCommandBase(Lazy analyzerService, bool newTab, bool useCodeRef) { + this.analyzerService = analyzerService; + this.newTab = newTab; + this.useCodeRef = useCodeRef; + } + + public override void Execute(IMenuItemContext context) { + var @ref = GetReference(context); + if (@ref is null) + return; + analyzerService.Value.FollowNode(@ref, newTab, useCodeRef); + } + + public override bool IsVisible(IMenuItemContext context) => GetReference(context) is not null; + + TreeNodeData? GetReference(IMenuItemContext context) { + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID)) + return null; + + var nodes = context.Find(); + if (nodes is null || nodes.Length != 1) + return null; + + if (nodes[0] is IMDTokenNode tokenNode && tokenNode.Reference is not null) { + if (!analyzerService.Value.CanFollowNode(nodes[0], useCodeRef)) + return null; + return nodes[0]; + } + + return null; + } + } + + [ExportMenuItem(Header = "res:GoToReferenceInCodeCommand", InputGestureText = "res:DoubleClick", Group = MenuConstants.GROUP_CTX_ANALYZER_TABS, Order = 0)] + sealed class OpenReferenceInCodeCtxMenuCommand : OpenReferenceCtxMenuCommandBase { + [ImportingConstructor] + OpenReferenceInCodeCtxMenuCommand(Lazy analyzerService) + : base(analyzerService, false, true) { + } + } + + [ExportMenuItem(Header = "res:GoToReferenceInCodeNewTabCommand", InputGestureText = "res:ShiftDoubleClick", Group = MenuConstants.GROUP_CTX_ANALYZER_TABS, Order = 10)] + sealed class OpenReferenceInCodeNewTabCtxMenuCommand : OpenReferenceCtxMenuCommandBase { + [ImportingConstructor] + OpenReferenceInCodeNewTabCtxMenuCommand(Lazy analyzerService) + : base(analyzerService, true, true) { + } + } + + [ExportMenuItem(Header = "res:GoToReferenceCommand", Group = MenuConstants.GROUP_CTX_ANALYZER_TABS, Order = 20)] + sealed class OpenReferenceCtxMenuCommand : OpenReferenceCtxMenuCommandBase { + [ImportingConstructor] + OpenReferenceCtxMenuCommand(Lazy analyzerService) + : base(analyzerService, false, false) { + } + } + + [ExportMenuItem(Header = "res:GoToReferenceNewTabCommand", Group = MenuConstants.GROUP_CTX_ANALYZER_TABS, Order = 30)] + sealed class OpenReferenceNewTabCtxMenuCommand : OpenReferenceCtxMenuCommandBase { + [ImportingConstructor] + OpenReferenceNewTabCtxMenuCommand(Lazy analyzerService) + : base(analyzerService, true, false) { + } + } + + [ExportAutoLoaded] + sealed class BreakpointsContentCommandLoader : IAutoLoaded { + [ImportingConstructor] + BreakpointsContentCommandLoader(IWpfCommandService wpfCommandService, Lazy analyzerService) { + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_ANALYZER_TREEVIEW); + cmds.Add(ApplicationCommands.Copy, + (s, e) => CopyCtxMenuCommand.ExecuteInternal(analyzerService), + (s, e) => e.CanExecute = CopyCtxMenuCommand.CanExecuteInternal(analyzerService)); + } + } + + [ExportMenuItem(Header = "res:CopyCommand", InputGestureText = "res:ShortCutKeyCtrlC", Icon = DsImagesAttribute.Copy, Group = MenuConstants.GROUP_CTX_ANALYZER_TOKENS, Order = -1)] + sealed class CopyCtxMenuCommand : MenuItemBase { + readonly Lazy analyzerService; + + [ImportingConstructor] + CopyCtxMenuCommand(Lazy analyzerService) => this.analyzerService = analyzerService; + + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID); + public override bool IsEnabled(IMenuItemContext context) => CanExecuteInternal(analyzerService); + public override void Execute(IMenuItemContext context) => ExecuteInternal(analyzerService); + public static bool CanExecuteInternal(Lazy analyzerService) => analyzerService.Value.TreeView.SelectedItems.Length > 0; + + public static void ExecuteInternal(Lazy analyzerService) { + var items = analyzerService.Value.TreeView.SelectedItems; + var sb = new StringBuilder(); + int count = 0; + foreach (var t in GetNodes(analyzerService.Value.TreeView, items)) { + if (count > 0) + sb.Append(Environment.NewLine); + sb.Append(new string('\t', t.level)); + sb.Append(t.node.ToString()); + count++; + } + if (count > 1) + sb.Append(Environment.NewLine); + if (sb.Length > 0) { + try { + Clipboard.SetText(sb.ToString()); + } + catch (ExternalException) { } + } + } + + sealed class State { + public readonly int Level; + public int Index; + public readonly IList Nodes; + public State(ITreeNode node, int level) { + Level = level; + Nodes = node.Children; + } + } + + static IEnumerable<(int level, TreeNodeData node)> GetNodes(ITreeView treeView, IEnumerable nodes) { + var hash = new HashSet(nodes); + var stack = new Stack(); + stack.Push(new State(treeView.Root, 0)); + while (stack.Count > 0) { + var state = stack.Pop(); + if (state.Index >= state.Nodes.Count) + continue; + var child = state.Nodes[state.Index++]; + if (hash.Contains(child.Data)) + yield return (state.Level, child.Data); + stack.Push(state); + stack.Push(new State(child, state.Level + 1)); + } + } + } + + [ExportMenuItem(Header = "res:ShowMetadataTokensCommand", Group = MenuConstants.GROUP_CTX_ANALYZER_OPTIONS, Order = 0)] + sealed class ShowTokensCtxMenuCommand : MenuItemBase { + readonly AnalyzerSettingsImpl analyzerSettings; + + [ImportingConstructor] + ShowTokensCtxMenuCommand(AnalyzerSettingsImpl analyzerSettings) => this.analyzerSettings = analyzerSettings; + + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID); + public override bool IsChecked(IMenuItemContext context) => analyzerSettings.ShowToken; + public override void Execute(IMenuItemContext context) => analyzerSettings.ShowToken = !analyzerSettings.ShowToken; + } + + [ExportMenuItem(Header = "res:SyntaxHighlightCommand", Group = MenuConstants.GROUP_CTX_ANALYZER_OPTIONS, Order = 10)] + sealed class SyntaxHighlightCtxMenuCommand : MenuItemBase { + readonly AnalyzerSettingsImpl analyzerSettings; + + [ImportingConstructor] + SyntaxHighlightCtxMenuCommand(AnalyzerSettingsImpl analyzerSettings) => this.analyzerSettings = analyzerSettings; + + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID); + public override bool IsChecked(IMenuItemContext context) => analyzerSettings.SyntaxHighlight; + public override void Execute(IMenuItemContext context) => analyzerSettings.SyntaxHighlight = !analyzerSettings.SyntaxHighlight; + } + + [ExportMenuItem(Header = "res:SingleClickExpandNodes", Group = MenuConstants.GROUP_CTX_ANALYZER_OPTIONS, Order = 20)] + sealed class SingleClickExpandNodesCtxMenuCommand : MenuItemBase { + readonly AnalyzerSettingsImpl analyzerSettings; + + [ImportingConstructor] + SingleClickExpandNodesCtxMenuCommand(AnalyzerSettingsImpl analyzerSettings) => this.analyzerSettings = analyzerSettings; + + public override bool IsVisible(IMenuItemContext context) => context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID); + public override bool IsChecked(IMenuItemContext context) => analyzerSettings.SingleClickExpandsChildren; + public override void Execute(IMenuItemContext context) => analyzerSettings.SingleClickExpandsChildren = !analyzerSettings.SingleClickExpandsChildren; + } +} diff --git a/Extensions/dnSpy.Analyzer/ContentTypeDefinitions.cs b/Extensions/dnSpy.Analyzer/ContentTypeDefinitions.cs new file mode 100644 index 0000000..2e2cd12 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/ContentTypeDefinitions.cs @@ -0,0 +1,33 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.ComponentModel.Composition; +using dnSpy.Contracts.TreeView.Text; +using Microsoft.VisualStudio.Utilities; + +namespace dnSpy.Analyzer { + static class ContentTypeDefinitions { +#pragma warning disable CS0169 + [Export] + [Name(TreeViewContentTypes.TreeViewNodeAnalyzer)] + [BaseDefinition(TreeViewContentTypes.TreeViewNode)] + static readonly ContentTypeDefinition? TreeViewNodeAnalyzer; +#pragma warning restore CS0169 + } +} diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.Designer.cs b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.Designer.cs new file mode 100644 index 0000000..a0f3a10 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.Designer.cs @@ -0,0 +1,342 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace dnSpy.Analyzer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class dnSpy_Analyzer_Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal dnSpy_Analyzer_Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("dnSpy.Analyzer.Properties.dnSpy.Analyzer.Resources", typeof(dnSpy_Analyzer_Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Analy_ze. + /// + public static string AnalyzeCommand { + get { + return ResourceManager.GetString("AnalyzeCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Analyzer. + /// + public static string AnalyzerWindowTitle { + get { + return ResourceManager.GetString("AnalyzerWindowTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Applied To. + /// + public static string AppliedToTreeNode { + get { + return ResourceManager.GetString("AppliedToTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Assigned By. + /// + public static string AssignedByTreeNode { + get { + return ResourceManager.GetString("AssignedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cop_y. + /// + public static string CopyCommand { + get { + return ResourceManager.GetString("CopyCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dbl Click. + /// + public static string DoubleClick { + get { + return ResourceManager.GetString("DoubleClick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exposed By. + /// + public static string ExposedByTreeNode { + get { + return ResourceManager.GetString("ExposedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extension Methods. + /// + public static string ExtensionMethodsTreeNode { + get { + return ResourceManager.GetString("ExtensionMethodsTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Go to Reference. + /// + public static string GoToReferenceCommand { + get { + return ResourceManager.GetString("GoToReferenceCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Reference in Method. + /// + public static string GoToReferenceInCodeCommand { + get { + return ResourceManager.GetString("GoToReferenceInCodeCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Reference in Method (New _Tab). + /// + public static string GoToReferenceInCodeNewTabCommand { + get { + return ResourceManager.GetString("GoToReferenceInCodeNewTabCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Go to Reference (New Ta_b). + /// + public static string GoToReferenceNewTabCommand { + get { + return ResourceManager.GetString("GoToReferenceNewTabCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to hides. + /// + public static string HidesParent { + get { + return ResourceManager.GetString("HidesParent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Implemented By. + /// + public static string ImplementedByTreeNode { + get { + return ResourceManager.GetString("ImplementedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Instantiated By. + /// + public static string InstantiatedByTreeNode { + get { + return ResourceManager.GetString("InstantiatedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Overridden By. + /// + public static string OverriddenByTreeNode { + get { + return ResourceManager.GetString("OverriddenByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Overrides. + /// + public static string OverridesTreeNode { + get { + return ResourceManager.GetString("OverridesTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Analyzes assemblies. + /// + public static string Plugin_ShortDescription { + get { + return ResourceManager.GetString("Plugin_ShortDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Raised By. + /// + public static string RaisedByTreeNode { + get { + return ResourceManager.GetString("RaisedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Read By. + /// + public static string ReadByTreeNode { + get { + return ResourceManager.GetString("ReadByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to _Remove. + /// + public static string RemoveCommand { + get { + return ResourceManager.GetString("RemoveCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Searching.... + /// + public static string Searching { + get { + return ResourceManager.GetString("Searching", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shift+Dbl Click. + /// + public static string ShiftDoubleClick { + get { + return ResourceManager.GetString("ShiftDoubleClick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ctrl+C. + /// + public static string ShortCutKeyCtrlC { + get { + return ResourceManager.GetString("ShortCutKeyCtrlC", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ctrl+Shift+R. + /// + public static string ShortCutKeyCtrlShiftR { + get { + return ResourceManager.GetString("ShortCutKeyCtrlShiftR", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Del. + /// + public static string ShortCutKeyDelete { + get { + return ResourceManager.GetString("ShortCutKeyDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Tokens. + /// + public static string ShowMetadataTokensCommand { + get { + return ResourceManager.GetString("ShowMetadataTokensCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Single-click expands nodes. + /// + public static string SingleClickExpandNodes { + get { + return ResourceManager.GetString("SingleClickExpandNodes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Syntax Highlight. + /// + public static string SyntaxHighlightCommand { + get { + return ResourceManager.GetString("SyntaxHighlightCommand", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Used By. + /// + public static string UsedByTreeNode { + get { + return ResourceManager.GetString("UsedByTreeNode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Uses. + /// + public static string UsesTreeNode { + get { + return ResourceManager.GetString("UsesTreeNode", resourceCulture); + } + } + } +} diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.cs.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.cs.resx new file mode 100644 index 0000000..1649a2d --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.cs.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analyzovat + + + Analyzér + + + Aplikováno na + + + Přiděleno + + + Kopírovat + + + Dvojklik + + + Vystavil + + + Rozšiřující metody + + + Přejít na odkaz + + + Ukázat odkaz v metodě + + + Ukázat odkaz v metodě (Nové okno) + + + Přejít na odkaz (Nové okno) + + + skrývá + + + Implementováno + + + Instanci vytvořil + + + Přepsal + + + Přepíše + + + Analyzuje sestavení + + + Zvednuto + + + Přečteno + + + Odstranit + + + Hledání... + + + Shift + dvojklepnutí + + + Ctrl + C + + + Ctrl+Shift+R + + + Del + + + Zobrazit tokeny + + + Jedno klepnutí rozbalí uzly + + + Zvýraznění syntaxe + + + Používáno + + + Používá + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.de.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.de.resx new file mode 100644 index 0000000..754f7c5 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.de.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analy_sieren + + + Analysierer + + + Angewandt auf + + + Zugewiesen von + + + _Kopieren + + + Doppelklick + + + Sichtbar durch + + + Erweiterungsmethoden + + + Gehe zu Verweis + + + Verweis in Methode zeigen + + + Verweis in Methode zeigen (neuer _Tab) + + + Gehe zu Verweis (neuer Ta_b) + + + versteckt + + + Implementiert von + + + Instanziiert von + + + Überschrieben von + + + Überschreibt + + + Analysiert Assemblies + + + Ausgelöst durch + + + Gelesen von + + + _Entfernen + + + Suchen... + + + Umschalt+Doppelklick + + + Strg+C + + + Strg+Umschalt+R + + + Entf + + + Tokens anzeigen + + + Knoten durch einfachen Klick öffnen + + + Syntax hervorheben + + + Verwendet von + + + Benutzt + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.es-ES.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.es-ES.resx new file mode 100644 index 0000000..dc78f2f --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.es-ES.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analizar Comando + + + Analizador + + + Aplicado a + + + Asignado por + + + Copi_a + + + Doble Click + + + Expuesto por + + + Métodos de extensión + + + Ir a la referencia + + + Ver Referencia en Método + + + Ver Referencia en Método (Nueva Pestaña) + + + Ir a referencia (Nueva Pestaña) + + + oculto + + + Implementado por + + + Instanciado por + + + Sobrescrito por + + + Sobrescrituras + + + Analiza ensamblados + + + Levantado por + + + Leído por + + + _Eliminar + + + Buscando... + + + Mayu+Doble Click + + + Ctrl+C + + + Ctrl+Shift+R + + + Eliminar + + + Mostrar Tokens + + + Expandir nodos con un solo click + + + Resaltar sintaxis + + + Utilizado por + + + Usos + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fa.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fa.resx new file mode 100644 index 0000000..17ce23c --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fa.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + آنالیز + + + تحلیل گر + + + اعمال به + + + تخصیص یافته توسط + + + کپی + + + دابل کلیک + + + در معرض + + + توابع اضافی + + + برو به مرجع + + + نمایش مرجع در تابع + + + نمایش مرجع در تابع (سربرگ_جدید) + + + برو به مرجع (سربرگ_جدید) + + + پنهان کردن + + + پیاده سازی شده توسط + + + کشف شده توسط + + + رونویسی شده توسط + + + رونویس ها + + + تجزیه و تحلیل assemblis + + + شروع شده توسط + + + خوانده شده توسط + + + حذف + + + در حال جستجو... + + + Shit + Double Click + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + نمایش توکن ها(Tokens) + + + تک کلیک برای گسترش گره ها + + + قالب برجسته + + + استفاده شده توسط + + + استفاده شده + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fr.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fr.resx new file mode 100644 index 0000000..ac02539 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.fr.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analyser + + + Analyser + + + Appliqué à + + + Assigné par + + + Copier + + + Double clique + + + Exposé par + + + Méthodes d'extension + + + Aller à la référence + + + Voir la référence à la méthode + + + Montrer les références dans les méthodes(Nouvelle page) + + + Aller à la référence(Nouvelle page) + + + masqué + + + Mis en œuvre par + + + Instancié par + + + Substitué par + + + Surcharge + + + Analyser les Assembly + + + Déclenché par + + + Lu par + + + _Supprimer + + + Recherche en cours... + + + Shit + Double clique + + + Ctrl + C + + + Ctrl + Maj + R + + + Effacer + + + Montrer les tokens + + + Un clic simple ouvre les noeuds + + + Coloration syntaxique + + + Utilisé par + + + Utilise + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.hu.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.hu.resx new file mode 100644 index 0000000..082ee8d --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.hu.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _Analizál + + + Analizáló / Elemző + + + Alkalmazva: + + + Hozzárendelve: + + + _Másolás + + + Dupla kattintás + + + kiajánlja + + + Kiterjesztés metódusok + + + Ugrás a referenciához + + + Referencia mutatása a metódusban + + + Referencia megjelenítése a metódusban (Új _lap) + + + Ugrás a referenciára (új _lap) + + + elrejti + + + implementál + + + példányosít + + + felülbírál + + + Felülbírál + + + Szerelvények analizálása + + + kiváltó + + + olvasva + + + _Eltávolít + + + Keresés... + + + Shift+dupla katt + + + Ctrl + C + + + Ctrl + Shift + R + + + Del + + + Token-ek mutatása + + + Egy kattintás kinyitja a csomópontot + + + Szintaxis kiemelése + + + Felhasznált + + + Használja + + diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.it.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.it.resx new file mode 100644 index 0000000..0a565b0 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.it.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + _Analizza + + + Analizzatore + + + Applicato a + + + Assegnato da + + + _Copia + + + Doppio Click + + + Esposto da + + + Metodi di estensione + + + Vai al riferimento + + + Visualizza riferimento nel metodo + + + Visualizza riferimento nel metodo (Nuovo Tab) + + + Vai al riferimento (Nuovo Tab) + + + nascondi + + + Implementato da + + + Instanziato da + + + Ereditato da + + + Sostituzioni + + + Analizza gli assembly + + + Generato da + + + Letto da + + + _Rimuovi + + + Cerco... + + + Shift+Dbl Click + + + Ctrl+C + + + Ctrl+Shift+R + + + Canc + + + Mostra Tokens + + + Il singolo click espande i nodi + + + Evidenzia la sintassi + + + Utilizzato da + + + Utilizza + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-BR.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-BR.resx new file mode 100644 index 0000000..84dfa77 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-BR.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analisar + + + Analisador + + + Aplicado a + + + Atribuído por + + + Copiar + + + Duplo Clique + + + Exposto por + + + Métodos de extensão + + + Ir para Referência + + + Mostrar referência no Método + + + Mostrar Referência no Metodo (Nova _Guia) + + + Ir para Referência (Nova Guia) + + + ocultar + + + Implementado por + + + Instanciado por + + + Sobrescrito por + + + Sobrescrever + + + Analisa assemblies + + + Causado por + + + Lido por + + + _Remover + + + Pesquisando... + + + Shift + Clique Duplo + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + Mostrar Tokens + + + Clique único expande nós + + + Realçar Sintaxe + + + Usado por + + + Usa + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-PT.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-PT.resx new file mode 100644 index 0000000..ce31afc --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.pt-PT.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analisar + + + Analisador + + + Aplicado a + + + Atribuído Por + + + Copiar + + + Duplo Clique + + + Exposto Por + + + Métodos de Extensão + + + Ir para Referência + + + Mostrar referência em método + + + Mostrar Referência em Método (Novo Guia) + + + Ir para Referência (Novo Guia) + + + hides + + + Implementado Por + + + Instanciado Por + + + Overridden Por + + + Overrides + + + Analisa os assemblies + + + Raised Por + + + Lido por + + + Remover + + + Procurando... + + + Shift + Duplo Clique + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + Mostrar Tokens + + + Clique único expande nós + + + Realce de sintaxe + + + Utilizado Por + + + Utiliza + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.resx new file mode 100644 index 0000000..b621766 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Analy_ze + + + Analyzer + + + Applied To + + + Assigned By + + + Cop_y + + + Dbl Click + + + Exposed By + + + Extension Methods + + + Go to Reference + + + Show Reference in Method + + + Show Reference in Method (New _Tab) + + + Go to Reference (New Ta_b) + + + hides + + + Implemented By + + + Instantiated By + + + Overridden By + + + Overrides + + + Analyzes assemblies + + + Raised By + + + Read By + + + _Remove + + + Searching... + + + Shift+Dbl Click + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + Show Tokens + + + Single-click expands nodes + + + Syntax Highlight + + + Used By + + + Uses + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.ru.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.ru.resx new file mode 100644 index 0000000..1dd2728 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.ru.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Анали_зировать + + + Анализатор + + + Применяется к + + + Назначается в + + + Коп_ировать + + + Двойнок клик + + + Представлено в + + + Методы-расширения + + + Перейти по ссылке + + + Показать ссылку на метод + + + Показать ссылку в методе (новая _вкладка) + + + Перейти к ссылке (Новая вкла_дка) + + + hides + + + Реализовано в + + + Вызвано в + + + Перегружено в + + + Переопределения + + + Анализирует сборки + + + Вызывается в + + + Читается в + + + _Убрать + + + Поиск... + + + Shift+Dbl Click + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + Показать токены + + + Разворачивать узлы одиночным щелчком + + + Подсветка синтаксиса + + + Используется в + + + Использует + + diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.tr.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.tr.resx new file mode 100644 index 0000000..edfc5c5 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.tr.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Anali_z + + + Çözümleyici + + + Uygulanan + + + Atayan + + + Kop_yala + + + Çift tıklayın + + + Etkilendiren + + + Genişletme yöntemleri + + + Referansı izle + + + Metod içerisinde Referansı Göster + + + Method içerisinde Referansı Göster(Yeni _Sekme) + + + Referansa Git(Yeni _Sekme) + + + gizle + + + Uyarlayan + + + Tarafından örneği + + + Üzerine Yazan + + + Geçersiz Kıl + + + Derlemeleri analiz et + + + Tarafından yetiştirildi + + + Tarafından okundu + + + _Kaldır + + + Aranıyor... + + + Shift+Çift Tıklama + + + Ctrl + C + + + Ctrl+Shift+R + + + Del + + + Token'ları Göster + + + Tek tıklama düğümleri genişletir + + + Sözdizimi Renklendirme + + + Tarafından kullanılan + + + Kullanma + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.uk.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.uk.resx new file mode 100644 index 0000000..1ff8a16 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.uk.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Аналі_зувати + + + Аналізатор + + + Застосовано до + + + Ким Призначено + + + Копіюв_ати + + + Подвійний клік + + + Представлено в + + + Методи-розширення + + + Перейти до посилання + + + Показати посилання на методі + + + Показати посилання в методі (Нова _Вкладка) + + + Перейти до посилання (Нова Вкла_дка) + + + ховає + + + Реалізований + + + Ким створено примірник + + + Ким перевантажено + + + Перекриває + + + Аналізує збірки + + + Ким викликано + + + Ким читається + + + _Видалити + + + Пошук... + + + Shift+Подвійний клік + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + Показати токени + + + Одноразове натискання розгортає вузли + + + Підсвітка синтаксису + + + Використовується + + + Використовує + + diff --git a/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.zh-CN.resx b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.zh-CN.resx new file mode 100644 index 0000000..f65b555 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/Properties/dnSpy.Analyzer.Resources.zh-CN.resx @@ -0,0 +1,213 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 分析(_Z) + + + 分析器 + + + 已应用到 + + + 赋值于 + + + 复制(_Y) + + + 双击 + + + 被公开于 + + + 扩展方法 + + + 转到引用 + + + 显示方法内的引用 + + + 显示方法内的引用(新标签页)(_T) + + + 转到引用(新标签页)(_B) + + + 隐藏 + + + 实现于 + + + 实例化于 + + + 重写于 + + + 重写 + + + 分析程序集 + + + 被触发于 + + + 读取于 + + + 移除(_R) + + + 搜索中… + + + Shift+双击 + + + Ctrl+C + + + Ctrl+Shift+R + + + Del + + + 显示标记 + + + 单击展开节点 + + + 语法高亮 + + + 被使用 + + + 使用 + + \ No newline at end of file diff --git a/Extensions/dnSpy.Analyzer/TheExtension.cs b/Extensions/dnSpy.Analyzer/TheExtension.cs new file mode 100644 index 0000000..51c3b52 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TheExtension.cs @@ -0,0 +1,38 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System.Collections.Generic; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Extension; + +namespace dnSpy.Analyzer { + [ExportExtension] + sealed class TheExtension : IExtension { + public IEnumerable MergedResourceDictionaries { + get { yield break; } + } + + public ExtensionInfo ExtensionInfo => new ExtensionInfo { + ShortDescription = dnSpy_Analyzer_Resources.Plugin_ShortDescription, + }; + + public void OnEvent(ExtensionEvent @event, object? obj) { + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/AnalyzerTreeNodeData.cs b/Extensions/dnSpy.Analyzer/TreeNodes/AnalyzerTreeNodeData.cs new file mode 100644 index 0000000..30303f9 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/AnalyzerTreeNodeData.cs @@ -0,0 +1,145 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.Text.Classification; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.TreeView.Text; + +namespace dnSpy.Analyzer.TreeNodes { + abstract class AnalyzerTreeNodeData : TreeNodeData { + public override Guid Guid => Guid.Empty; + public sealed override bool SingleClickExpandsChildren => Context.SingleClickExpandsChildren; +#pragma warning disable CS8618 // Non-nullable field is uninitialized. + public IAnalyzerTreeNodeDataContext Context { get; set; } +#pragma warning restore CS8618 // Non-nullable field is uninitialized. + protected abstract ImageReference GetIcon(IDotNetImageService dnImgMgr); + protected virtual ImageReference? GetExpandedIcon(IDotNetImageService dnImgMgr) => null; + public sealed override ImageReference Icon => GetIcon(Context.DotNetImageService); + public sealed override ImageReference? ExpandedIcon => GetExpandedIcon(Context.DotNetImageService); + + static class Cache { + static readonly TextClassifierTextColorWriter writer = new TextClassifierTextColorWriter(); + public static TextClassifierTextColorWriter GetWriter() => writer; + public static void FreeWriter(TextClassifierTextColorWriter writer) => writer.Clear(); + } + + public sealed override object? Text { + get { + if (cachedText?.Target is object cached) + return cached; + + var writer = Cache.GetWriter(); + try { + Write(writer, Context.Decompiler); + var classifierContext = new TreeViewNodeClassifierContext(writer.Text, Context.TreeView, this, isToolTip: false, colorize: Context.SyntaxHighlight, colors: writer.Colors); + var elem = Context.TreeViewNodeTextElementProvider.CreateTextElement(classifierContext, TreeViewContentTypes.TreeViewNodeAnalyzer, TextElementFlags.FilterOutNewLines); + cachedText = new WeakReference(elem); + return elem; + } + finally { + Cache.FreeWriter(writer); + } + } + } + WeakReference? cachedText; + + protected abstract void Write(ITextColorWriter output, IDecompiler decompiler); + public sealed override object? ToolTip => null; + public sealed override string ToString() => ToString(Context.Decompiler); + + public string ToString(IDecompiler decompiler) { + var output = new StringBuilderTextColorOutput(); + Write(output, decompiler); + return output.ToString(); + } + + public sealed override void OnRefreshUI() => cachedText = null; + public abstract bool HandleAssemblyListChanged(IDsDocument[] removedAssemblies, IDsDocument[] addedAssemblies); + public abstract bool HandleModelUpdated(IDsDocument[] documents); + + public static void CancelSelfAndChildren(TreeNodeData node) { + foreach (var c in node.DescendantsAndSelf()) { + if (c is IAsyncCancellable id) + id.Cancel(); + } + } + + public static void HandleAssemblyListChanged(ITreeNode node, IDsDocument[] removedAssemblies, IDsDocument[] addedAssemblies) { + var children = node.DataChildren.ToArray(); + for (int i = children.Length - 1; i >= 0; i--) { + var c = children[i]; + var n = c as AnalyzerTreeNodeData; + if (n is null || !n.HandleAssemblyListChanged(removedAssemblies, addedAssemblies)) { + AnalyzerTreeNodeData.CancelSelfAndChildren(c); + node.Children.RemoveAt(i); + } + } + } + + public static void HandleModelUpdated(ITreeNode node, IDsDocument[] documents) { + var children = node.DataChildren.ToArray(); + for (int i = children.Length - 1; i >= 0; i--) { + var c = children[i]; + var n = c as AnalyzerTreeNodeData; + if (n is null || !n.HandleModelUpdated(documents)) { + AnalyzerTreeNodeData.CancelSelfAndChildren(c); + node.Children.RemoveAt(i); + } + } + } + + protected IMemberRef GetOriginalCodeLocation(IMemberRef member) { + // Emulate the original code. Only the C# override returned something other than the input + if (Context.Decompiler.UniqueGuid != DecompilerConstants.LANGUAGE_CSHARP_ILSPY) + return member; + if (!Context.Decompiler.Settings.GetBoolean(DecompilerOptionConstants.AnonymousMethods_GUID)) + return member; + return Helpers.GetOriginalCodeLocation(member); + } + + sealed class TheTreeNodeGroup : ITreeNodeGroup { + public static ITreeNodeGroup Instance = new TheTreeNodeGroup(); + + TheTreeNodeGroup() { + } + + public double Order => 100; + + public int Compare([AllowNull] TreeNodeData x, [AllowNull] TreeNodeData y) { + if (x == y) + return 0; + var a = x as AnalyzerTreeNodeData; + var b = y as AnalyzerTreeNodeData; + if (a is null) return -1; + if (b is null) return 1; + return StringComparer.OrdinalIgnoreCase.Compare(a.ToString(), b.ToString()); + } + } + + public override ITreeNodeGroup? TreeNodeGroup => TheTreeNodeGroup.Instance; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/AssemblyNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/AssemblyNode.cs new file mode 100644 index 0000000..07518bd --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/AssemblyNode.cs @@ -0,0 +1,35 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class AssemblyNode : EntityNode { + readonly AssemblyDef analyzedAssembly; + + public AssemblyNode(AssemblyDef analyzedAssembly) => this.analyzedAssembly = analyzedAssembly; + + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedAssembly); + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => output.Write(analyzedAssembly); + public override IMemberRef? Member => null; + public override IMDTokenProvider? Reference => analyzedAssembly; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/AsyncFetchChildrenHelper.cs b/Extensions/dnSpy.Analyzer/TreeNodes/AsyncFetchChildrenHelper.cs new file mode 100644 index 0000000..728646a --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/AsyncFetchChildrenHelper.cs @@ -0,0 +1,97 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Diagnostics.CodeAnalysis; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.Text.Classification; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.TreeView.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class AsyncFetchChildrenHelper : AsyncNodeProvider { + readonly SearchNode node; + readonly Action completed; + + public AsyncFetchChildrenHelper(SearchNode node, Action completed) + : base(node) { + this.node = node; + this.completed = completed; + Start(); + } + + sealed class MessageNodeTreeNodeGroup : ITreeNodeGroup { + public double Order { get; } + + public int Compare([AllowNull] TreeNodeData x, [AllowNull] TreeNodeData y) { + if (x == y) + return 0; + var a = x as MessageNode; + var b = y as MessageNode; + if (a is null) return -1; + if (b is null) return 1; + return 0; + } + } + + sealed class MessageNode : TreeNodeData { + public override Guid Guid => Guid.Empty; + public override ImageReference Icon => DsImages.Search; + public override object? ToolTip => null; + public override void OnRefreshUI() { } + public override ITreeNodeGroup? TreeNodeGroup => treeNodeGroup; + readonly ITreeNodeGroup treeNodeGroup = new MessageNodeTreeNodeGroup(); + + readonly IAnalyzerTreeNodeDataContext context; + + public MessageNode(IAnalyzerTreeNodeDataContext context) => this.context = context; + + static class Cache { + static readonly TextClassifierTextColorWriter writer = new TextClassifierTextColorWriter(); + public static TextClassifierTextColorWriter GetWriter() => writer; + public static void FreeWriter(TextClassifierTextColorWriter writer) => writer.Clear(); + } + + public override object? Text { + get { + var writer = Cache.GetWriter(); + try { + writer.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.Searching); + var classifierContext = new TreeViewNodeClassifierContext(writer.Text, context.TreeView, this, isToolTip: false, colorize: context.SyntaxHighlight, colors: writer.Colors); + var elem = context.TreeViewNodeTextElementProvider.CreateTextElement(classifierContext, TreeViewContentTypes.TreeViewNodeAnalyzer, TextElementFlags.FilterOutNewLines); + return elem; + } + finally { + Cache.FreeWriter(writer); + } + } + } + } + + protected override void ThreadMethod() { + AddMessageNode(() => new MessageNode(node.Context)); + foreach (var child in node.FetchChildrenInternal(cancellationToken)) + AddNode(child); + } + + protected override void OnCompleted() => completed(); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/AttributeAppliedToNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/AttributeAppliedToNode.cs new file mode 100644 index 0000000..6023c20 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/AttributeAppliedToNode.cs @@ -0,0 +1,310 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class AttributeAppliedToNode : SearchNode { + readonly TypeDef analyzedType; + readonly List analyzedTypes; + readonly bool includeAllModules; + + readonly AttributeTargets usage; + ConcurrentDictionary? foundMethods; + + public static bool CanShow(TypeDef type) => type.IsClass && IsCustomAttribute(type); + + static bool IsCustomAttribute(TypeDef type) { + while (type is not null) { + var bt = type.BaseType.ResolveTypeDef(); + if (bt is null) + return false; + if (bt.FullName == "System.Attribute") + return true; + type = bt; + } + return false; + } + + public AttributeAppliedToNode(TypeDef analyzedType) { + this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + analyzedTypes = new List { analyzedType }; + includeAllModules = CustomAttributesUtils.IsPseudoCustomAttributeType(analyzedType); + var ca = analyzedType.CustomAttributes.Find("System.AttributeUsageAttribute"); + if (ca is not null && ca.ConstructorArguments.Count == 1 && ca.ConstructorArguments[0].Value is int) + usage = (AttributeTargets)ca.ConstructorArguments[0].Value; + else + usage = AttributeTargets.All; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.AppliedToTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + foundMethods = new ConcurrentDictionary(); + + AddTypeEquivalentTypes(Context.DocumentService, analyzedType, analyzedTypes); + IEnumerable<(ModuleDef module, ITypeDefOrRef type)> modules; + if (includeAllModules) + modules = GetAllModules(analyzedType.Module, ct); + else if (TIAHelper.IsTypeDefEquivalent(analyzedType)) + modules = GetTypeEquivalentModulesAndTypes(analyzedTypes); + else if (IsPublic(analyzedType)) + modules = GetReferencingModules(analyzedType.Module, ct); + else + modules = GetModuleAndAnyFriends(analyzedType.Module, ct); + + var results = modules.AsParallel().WithCancellation(ct).SelectMany(a => FindReferencesInModule(new[] { a.Item1 }, a.Item2, ct)); + + foreach (var result in results) + yield return result; + + foundMethods = null; + } + + static bool IsPublic(TypeDef type) { + for (;;) { + if (type.DeclaringType is TypeDef declType) { + if (!(type.IsNestedFamily || type.IsNestedFamilyOrAssembly || type.IsNestedPublic)) + return false; + type = declType; + } + else + return type.IsPublic; + } + } + + IEnumerable FindReferencesInModule(IEnumerable modules, ITypeDefOrRef tr, CancellationToken ct) { + var trScopeType = tr.GetScopeType(); + var checkedAsms = new HashSet(); + foreach (var module in modules) { + if ((usage & AttributeTargets.Assembly) != 0) { + AssemblyDef asm = module.Assembly; + if (asm is not null && checkedAsms.Add(asm)) { + foreach (var attribute in asm.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), trScopeType)) { + yield return new AssemblyNode(asm) { Context = Context }; + break; + } + } + } + } + + ct.ThrowIfCancellationRequested(); + + if ((usage & AttributeTargets.Module) != 0) { + foreach (var attribute in module.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), trScopeType)) { + yield return new ModuleNode(module) { Context = Context }; + break; + } + } + } + + ct.ThrowIfCancellationRequested(); + + if ((usage & (AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.GenericParameter | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.ReturnValue | AttributeTargets.Parameter)) != 0) { + foreach (TypeDef type in TreeTraversal.PreOrder(module.Types, t => t.NestedTypes)) { + ct.ThrowIfCancellationRequested(); + foreach (var result in FindReferencesWithinInType(type, tr)) { + ct.ThrowIfCancellationRequested(); + yield return result; + } + } + } + } + } + + IEnumerable FindReferencesWithinInType(TypeDef type, ITypeDefOrRef attrTypeRef) { + var attrTypeRefScopeType = attrTypeRef.GetScopeType(); + bool searchRequired = (type.IsClass && usage.HasFlag(AttributeTargets.Class)) + || (type.IsEnum && usage.HasFlag(AttributeTargets.Enum)) + || (type.IsInterface && usage.HasFlag(AttributeTargets.Interface)) + || (type.IsValueType && usage.HasFlag(AttributeTargets.Struct)); + if (searchRequired) { + foreach (var attribute in type.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + yield return new TypeNode(type) { Context = Context }; + break; + } + } + } + + if ((usage & AttributeTargets.GenericParameter) != 0 && type.HasGenericParameters) { + foreach (var parameter in type.GenericParameters) { + foreach (var attribute in parameter.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + yield return new TypeNode(type) { Context = Context }; + break; + } + } + } + } + + if ((usage & AttributeTargets.Field) != 0 && type.HasFields) { + foreach (var field in type.Fields) { + foreach (var attribute in field.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + yield return new FieldNode(field) { Context = Context }; + break; + } + } + } + } + + if (((usage & AttributeTargets.Property) != 0) && type.HasProperties) { + foreach (var property in type.Properties) { + foreach (var attribute in property.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + yield return new PropertyNode(property) { Context = Context }; + break; + } + } + } + } + if (((usage & AttributeTargets.Event) != 0) && type.HasEvents) { + foreach (var @event in type.Events) { + foreach (var attribute in @event.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + yield return new EventNode(@event) { Context = Context }; + break; + } + } + } + } + + if ((usage & (AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.ReturnValue | AttributeTargets.Parameter)) != 0 && type.HasMethods) { + foreach (var method in type.Methods) { + bool found = false; + if ((usage & (AttributeTargets.Method | AttributeTargets.Constructor)) != 0) { + foreach (var attribute in method.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + found = true; + break; + } + } + } + if (!found && + ((usage & AttributeTargets.ReturnValue) != 0) && + method.Parameters.ReturnParameter.ParamDef is ParamDef retParamDef) { + foreach (var attribute in retParamDef.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + found = true; + break; + } + } + } + + if (!found && + ((usage & AttributeTargets.Parameter) != 0) && + method.Parameters.Count > 0) { + foreach (var parameter in method.Parameters.Where(param => param.HasParamDef)) { + if (parameter.IsHiddenThisParameter) + continue; + foreach (var attribute in parameter.ParamDef.GetCustomAttributes()) { + if (new SigComparer().Equals(attribute.AttributeType?.GetScopeType(), attrTypeRefScopeType)) { + found = true; + break; + } + } + } + } + + if (found) { + if (GetOriginalCodeLocation(method) is MethodDef codeLocation && !HasAlreadyBeenFound(codeLocation)) { + yield return new MethodNode(codeLocation) { Context = Context }; + } + } + } + } + } + + bool HasAlreadyBeenFound(MethodDef method) => !foundMethods!.TryAdd(method, 0); + + IEnumerable<(ModuleDef module, ITypeDefOrRef type)> GetAllModules(ModuleDef mod, CancellationToken ct) { + foreach (var doc in Context.DocumentService.GetDocuments()) { + if (!(doc.ModuleDef is ModuleDef module)) + continue; + var typeRef = GetScopeTypeRefInModule(module) ?? module.Import(analyzedType); + yield return (module, typeRef); + } + } + + IEnumerable<(ModuleDef module, ITypeDefOrRef type)> GetReferencingModules(ModuleDef mod, CancellationToken ct) { + var asm = mod.Assembly; + if (asm is null) { + yield return (mod, analyzedType); + yield break; + } + + foreach (var m in asm.Modules) + yield return (m, analyzedType); + + var modules = Context.DocumentService.GetDocuments().Where(a => SearchNode.CanIncludeModule(mod, a.ModuleDef)); + + foreach (var module in modules) { + Debug2.Assert(module.ModuleDef is not null); + ct.ThrowIfCancellationRequested(); + var typeref = GetScopeTypeRefInModule(module.ModuleDef); + if (typeref is not null) + yield return (module.ModuleDef, typeref); + } + } + + IEnumerable<(ModuleDef module, ITypeDefOrRef type)> GetModuleAndAnyFriends(ModuleDef mod, CancellationToken ct) { + var asm = mod.Assembly; + if (asm is null) { + yield return (mod, analyzedType); + yield break; + } + + foreach (var m in asm.Modules) + yield return (m, analyzedType); + + var friendAssemblies = GetFriendAssemblies(Context.DocumentService, mod, out var modules); + if (friendAssemblies.Count > 0) { + foreach (var module in modules) { + Debug2.Assert(module.ModuleDef is not null); + ct.ThrowIfCancellationRequested(); + if (module.AssemblyDef is null || friendAssemblies.Contains(module.AssemblyDef.Name)) { + var typeref = GetScopeTypeRefInModule(module.ModuleDef); + if (typeref is not null) + yield return (module.ModuleDef, typeref); + } + } + } + } + + ITypeDefOrRef? GetScopeTypeRefInModule(ModuleDef mod) { + foreach (var typeref in mod.GetTypeRefs()) { + if (new SigComparer().Equals(analyzedType, typeref)) + return typeref; + } + return null; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/ComUtils.cs b/Extensions/dnSpy.Analyzer/TreeNodes/ComUtils.cs new file mode 100644 index 0000000..1457e71 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/ComUtils.cs @@ -0,0 +1,143 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using dnlib.DotNet; + +namespace dnSpy.Analyzer.TreeNodes { + static class ComUtils { + public static bool IsComType(TypeDef type, out Guid guid) { + guid = default; + + // type.IsImport (== ComImportAttribute) isn't checked since the CLR doesn't require + // it to be set. If it has a GuidAttribute, it's probably a COM type. + + if (!type.IsInterface) + return false; + + var ca = type.CustomAttributes.Find("System.Runtime.InteropServices.GuidAttribute"); + if (ca is null || ca.ConstructorArguments.Count != 1) + return false; + if (!(ca.ConstructorArguments[0].Value is UTF8String guidStr) || !Guid.TryParse(guidStr, out guid)) + return false; + + return true; + } + + public static bool ComEquals(TypeDef type, ref Guid guid) { + // type.IsImport (== ComImportAttribute) isn't checked since the CLR doesn't require + // it to be set. If it has a GuidAttribute, it's probably a COM type. + + if (!type.IsInterface) + return false; + + var ca = type.CustomAttributes.Find("System.Runtime.InteropServices.GuidAttribute"); + if (ca is null || ca.ConstructorArguments.Count != 1) + return false; + if (!(ca.ConstructorArguments[0].Value is UTF8String guidStr) || !Guid.TryParse(guidStr, out var g)) + return false; + + return g == guid; + } + + static bool IsVtblGap(MethodDef method) => IsVtblGap(method, out _); + + public static bool IsVtblGap(MethodDef method, out int count) { + count = 0; + if (!(method.IsVirtual || method.IsAbstract)) + return false; + if (!method.IsRuntimeSpecialName) + return false; + string name = method.Name; + const string vtblGapPrefix = "_VtblGap"; + if (name is null || !name.StartsWith(vtblGapPrefix)) + return false; + int i = vtblGapPrefix.Length; + while (i < name.Length) { + var c = name[i]; + if (!('0' <= c && c <= '9')) + break; + i++; + } + if (i == name.Length) + count = 1; + else { + if (name[i++] != '_') + return false; + if (i == name.Length) + return false; + while (i < name.Length) { + var c = name[i]; + if (!('0' <= c && c <= '9')) + break; + count = (ushort)((uint)count * 10 + c - '0'); + i++; + } + if (i != name.Length) + return false; + } + return true; + } + + static int GetVtblIndex(MethodDef method) { + int vtblIndex = 0; + var methods = method.DeclaringType.Methods; + for (int i = 0; i < methods.Count; i++) { + var m = methods[i]; + if (!(m.IsVirtual || m.IsAbstract)) + continue; + if (m == method) + return vtblIndex; + if (IsVtblGap(m, out var count)) + vtblIndex += count; + else + vtblIndex++; + } + return -1; + } + + public static void GetMemberInfo(MethodDef method, out bool isComType, out Guid comGuid, out int vtblIndex) { + comGuid = default; + isComType = (method.IsVirtual || method.IsAbstract) && !IsVtblGap(method) && IsComType(method.DeclaringType, out comGuid); + if (isComType) + vtblIndex = GetVtblIndex(method); + else + vtblIndex = -1; + } + + public static MethodDef? GetMethod(TypeDef type, int vtblIndex) { + int currentVtblIndex = 0; + var methods = type.Methods; + for (int i = 0; i < methods.Count; i++) { + var method = methods[i]; + if (!(method.IsVirtual || method.IsAbstract)) + continue; + if (!IsVtblGap(method, out int count)) { + if (currentVtblIndex == vtblIndex) + return method; + count = 1; + } + currentVtblIndex += count; + if (currentVtblIndex > vtblIndex) + break; + } + return null; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/Commands.cs b/Extensions/dnSpy.Analyzer/TreeNodes/Commands.cs new file mode 100644 index 0000000..0b7dce0 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/Commands.cs @@ -0,0 +1,326 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Linq; +using System.Windows.Controls; +using System.Windows.Input; +using dnlib.DotNet; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.Tabs; +using dnSpy.Contracts.Documents.Tabs.DocViewer; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.Search; +using dnSpy.Contracts.ToolWindows.App; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + [ExportAutoLoaded] + sealed class AnalyzeCommandLoader : IAutoLoaded { + public static readonly RoutedCommand AnalyzeRoutedCommand = new RoutedCommand("AnalyzeRoutedCommand", typeof(AnalyzeCommandLoader)); + readonly IDsToolWindowService toolWindowService; + readonly IDocumentTabService documentTabService; + readonly Lazy analyzerService; + readonly IDecompilerService decompilerService; + + [ImportingConstructor] + AnalyzeCommandLoader(IDsToolWindowService toolWindowService, IWpfCommandService wpfCommandService, IDocumentTabService documentTabService, Lazy analyzerService, IDecompilerService decompilerService) { + this.toolWindowService = toolWindowService; + this.documentTabService = documentTabService; + this.analyzerService = analyzerService; + this.decompilerService = decompilerService; + + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_DOCUMENTVIEWER_UICONTEXT); + cmds.Add(AnalyzeRoutedCommand, TextEditor_Executed, TextEditor_CanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + cmds.Add(AnalyzeRoutedCommand, ShowAnalyzerExecuted, ShowAnalyzerCanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + + cmds = wpfCommandService.GetCommands(ControlConstants.GUID_DOCUMENT_TREEVIEW); + cmds.Add(AnalyzeRoutedCommand, DocumentTreeView_Executed, DocumentTreeView_CanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + cmds.Add(AnalyzeRoutedCommand, ShowAnalyzerExecuted, ShowAnalyzerCanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + + cmds = wpfCommandService.GetCommands(ControlConstants.GUID_ANALYZER_TREEVIEW); + cmds.Add(AnalyzeRoutedCommand, AnalyzerTreeView_Executed, AnalyzerTreeView_CanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + cmds.Add(AnalyzeRoutedCommand, ShowAnalyzerExecuted, ShowAnalyzerCanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + + cmds = wpfCommandService.GetCommands(ControlConstants.GUID_SEARCH_LISTBOX); + cmds.Add(AnalyzeRoutedCommand, SearchListBox_Executed, SearchListBox_CanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + cmds.Add(AnalyzeRoutedCommand, ShowAnalyzerExecuted, ShowAnalyzerCanExecute, ModifierKeys.Control | ModifierKeys.Shift, Key.R); + } + + void ShowAnalyzerCanExecute(object? sender, CanExecuteRoutedEventArgs e) => + e.CanExecute = toolWindowService.IsShown(AnalyzerToolWindowContent.THE_GUID); + void ShowAnalyzerExecuted(object? sender, ExecutedRoutedEventArgs e) => + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + void TextEditor_CanExecute(object? sender, CanExecuteRoutedEventArgs e) => + e.CanExecute = AnalyzeCommand.CanAnalyze(TextEditor_GetMemberRef(), decompilerService.Decompiler); + void TextEditor_Executed(object? sender, ExecutedRoutedEventArgs e) => + AnalyzeCommand.Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, TextEditor_GetMemberRef()); + IMemberRef? TextEditor_GetMemberRef() => + (documentTabService.ActiveTab?.UIContext as IDocumentViewer)?.SelectedReference?.Data.Reference as IMemberRef; + void DocumentTreeView_CanExecute(object? sender, CanExecuteRoutedEventArgs e) => + e.CanExecute = AnalyzeCommand.CanAnalyze(DocumentTreeView_GetMemberRef(), decompilerService.Decompiler); + void DocumentTreeView_Executed(object? sender, ExecutedRoutedEventArgs e) => + AnalyzeCommand.Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, DocumentTreeView_GetMemberRef()); + + IMemberRef? DocumentTreeView_GetMemberRef() { + var nodes = documentTabService.DocumentTreeView.TreeView.TopLevelSelection; + var node = nodes.Length == 0 ? null : nodes[0] as IMDTokenNode; + return node?.Reference as IMemberRef; + } + + void AnalyzerTreeView_CanExecute(object? sender, CanExecuteRoutedEventArgs e) => + e.CanExecute = AnalyzeCommand.CanAnalyze(AnalyzerTreeView_GetMemberRef(), decompilerService.Decompiler); + void AnalyzerTreeView_Executed(object? sender, ExecutedRoutedEventArgs e) => + AnalyzeCommand.Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, AnalyzerTreeView_GetMemberRef()); + + IMemberRef? AnalyzerTreeView_GetMemberRef() { + var nodes = analyzerService.Value.TreeView.TopLevelSelection; + var node = nodes.Length == 0 ? null : nodes[0] as IMDTokenNode; + return node?.Reference as IMemberRef; + } + + void SearchListBox_CanExecute(object? sender, CanExecuteRoutedEventArgs e) => + e.CanExecute = AnalyzeCommand.CanAnalyze(SearchListBox_GetMemberRef(e.Source as ListBox), decompilerService.Decompiler); + void SearchListBox_Executed(object? sender, ExecutedRoutedEventArgs e) => + AnalyzeCommand.Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, SearchListBox_GetMemberRef(e.Source as ListBox)); + IMemberRef? SearchListBox_GetMemberRef(ListBox? listBox) => + (listBox?.SelectedItem as ISearchResultReferenceProvider)?.Reference as IMemberRef; + } + + static class AnalyzeCommand { + [ExportMenuItem(Header = "res:AnalyzeCommand", Icon = DsImagesAttribute.Search, InputGestureText = "res:ShortCutKeyCtrlShiftR", Group = MenuConstants.GROUP_CTX_DOCUMENTS_OTHER, Order = 0)] + sealed class FilesCommand : MenuItemBase { + readonly IDsToolWindowService toolWindowService; + readonly IDecompilerService decompilerService; + readonly Lazy analyzerService; + + [ImportingConstructor] + FilesCommand(IDsToolWindowService toolWindowService, IDecompilerService decompilerService, Lazy analyzerService) { + this.toolWindowService = toolWindowService; + this.decompilerService = decompilerService; + this.analyzerService = analyzerService; + } + + public override bool IsVisible(IMenuItemContext context) => GetMemberRefs(context).Any(); + IEnumerable GetMemberRefs(IMenuItemContext context) => + GetMemberRefs(context, MenuConstants.GUIDOBJ_DOCUMENTS_TREEVIEW_GUID, false, decompilerService); + + internal static IEnumerable GetMemberRefs(IMenuItemContext context, string guid, bool checkRoot, IDecompilerService decompilerService) { + if (context.CreatorObject.Guid != new Guid(guid)) + yield break; + var nodes = context.Find(); + if (nodes is null) + yield break; + + if (checkRoot && nodes.All(a => a.TreeNode.Parent is not null && a.TreeNode.Parent.Parent is null)) + yield break; + + foreach (var node in nodes) { + if (node is IMDTokenNode mr && CanAnalyze(mr.Reference as IMemberRef, decompilerService.Decompiler)) + yield return mr.Reference as IMemberRef; + } + } + + public override void Execute(IMenuItemContext context) => + Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, GetMemberRefs(context)); + } + + [ExportMenuItem(Header = "res:AnalyzeCommand", Icon = DsImagesAttribute.Search, InputGestureText = "res:ShortCutKeyCtrlShiftR", Group = MenuConstants.GROUP_CTX_ANALYZER_OTHER, Order = 0)] + sealed class AnalyzerCommand : MenuItemBase { + readonly IDsToolWindowService toolWindowService; + readonly IDecompilerService decompilerService; + readonly Lazy analyzerService; + + [ImportingConstructor] + AnalyzerCommand(IDsToolWindowService toolWindowService, IDecompilerService decompilerService, Lazy analyzerService) { + this.toolWindowService = toolWindowService; + this.decompilerService = decompilerService; + this.analyzerService = analyzerService; + } + + public override bool IsVisible(IMenuItemContext context) => GetMemberRefs(context).Any(); + IEnumerable GetMemberRefs(IMenuItemContext context) => + FilesCommand.GetMemberRefs(context, MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID, true, decompilerService); + public override void Execute(IMenuItemContext context) => + Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, GetMemberRefs(context)); + } + + [ExportMenuItem(Header = "res:AnalyzeCommand", Icon = DsImagesAttribute.Search, InputGestureText = "res:ShortCutKeyCtrlShiftR", Group = MenuConstants.GROUP_CTX_DOCVIEWER_OTHER, Order = 0)] + sealed class CodeCommand : MenuItemBase { + readonly IDsToolWindowService toolWindowService; + readonly IDecompilerService decompilerService; + readonly Lazy analyzerService; + + [ImportingConstructor] + CodeCommand(IDsToolWindowService toolWindowService, IDecompilerService decompilerService, Lazy analyzerService) { + this.toolWindowService = toolWindowService; + this.decompilerService = decompilerService; + this.analyzerService = analyzerService; + } + + public override bool IsVisible(IMenuItemContext context) => GetMemberRefs(context).Any(); + static IEnumerable GetMemberRefs(IMenuItemContext context) => + GetMemberRefs(context, MenuConstants.GUIDOBJ_DOCUMENTVIEWERCONTROL_GUID); + + internal static IEnumerable GetMemberRefs(IMenuItemContext context, string guid) { + if (context.CreatorObject.Guid != new Guid(guid)) + yield break; + + var @ref = context.Find(); + if (@ref is not null) { + if (@ref.Reference is IMemberRef mr) + yield return mr; + } + } + + public override void Execute(IMenuItemContext context) => + Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, GetMemberRefs(context)); + } + + [ExportMenuItem(Header = "res:AnalyzeCommand", Icon = DsImagesAttribute.Search, InputGestureText = "res:ShortCutKeyCtrlShiftR", Group = MenuConstants.GROUP_CTX_SEARCH_OTHER, Order = 0)] + sealed class SearchCommand : MenuItemBase { + readonly IDsToolWindowService toolWindowService; + readonly IDecompilerService decompilerService; + readonly Lazy analyzerService; + + [ImportingConstructor] + SearchCommand(IDsToolWindowService toolWindowService, IDecompilerService decompilerService, Lazy analyzerService) { + this.toolWindowService = toolWindowService; + this.decompilerService = decompilerService; + this.analyzerService = analyzerService; + } + + static IEnumerable GetMemberRefs(IMenuItemContext context) => + CodeCommand.GetMemberRefs(context, MenuConstants.GUIDOBJ_SEARCH_GUID); + public override bool IsVisible(IMenuItemContext context) => GetMemberRefs(context).Any(); + public override void Execute(IMenuItemContext context) => + Analyze(toolWindowService, analyzerService, decompilerService.Decompiler, GetMemberRefs(context)); + } + + public static bool CanAnalyze(IMemberRef? member, IDecompiler decompiler) { + member = ResolveReference(member); + return member is TypeDef || + member is FieldDef || + member is MethodDef || + PropertyNode.CanShow(member, decompiler) || + EventNode.CanShow(member, decompiler); + } + + static void Analyze(IDsToolWindowService toolWindowService, Lazy analyzerService, IDecompiler decompiler, IEnumerable mrs) { + foreach (var mr in mrs) + Analyze(toolWindowService, analyzerService, decompiler, mr); + } + + public static void Analyze(IDsToolWindowService toolWindowService, Lazy analyzerService, IDecompiler decompiler, IMemberRef? member) { + var memberDef = ResolveReference(member); + + if (memberDef is TypeDef type) { + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + analyzerService.Value.Add(new TypeNode(type)); + } + + if (memberDef is FieldDef field) { + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + analyzerService.Value.Add(new FieldNode(field)); + } + + if (memberDef is MethodDef method) { + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + analyzerService.Value.Add(new MethodNode(method)); + } + + var propertyAnalyzer = PropertyNode.TryCreateAnalyzer(member, decompiler); + if (propertyAnalyzer is not null) { + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + analyzerService.Value.Add(propertyAnalyzer); + } + + var eventAnalyzer = EventNode.TryCreateAnalyzer(member, decompiler); + if (eventAnalyzer is not null) { + toolWindowService.Show(AnalyzerToolWindowContent.THE_GUID); + analyzerService.Value.Add(eventAnalyzer); + } + } + + static IMemberDef? ResolveReference(object? reference) { + if (reference is ITypeDefOrRef) + return ((ITypeDefOrRef)reference).ResolveTypeDef(); + else if (reference is IMethod && ((IMethod)reference).MethodSig is not null) + return ((IMethod)reference).ResolveMethodDef(); + else if (reference is IField) + return ((IField)reference).ResolveFieldDef(); + else if (reference is PropertyDef) + return (PropertyDef)reference; + else if (reference is EventDef) + return (EventDef)reference; + return null; + } + } + + [ExportAutoLoaded] + sealed class RemoveAnalyzeCommand : IAutoLoaded { + readonly Lazy analyzerService; + + [ImportingConstructor] + RemoveAnalyzeCommand(IWpfCommandService wpfCommandService, Lazy analyzerService) { + this.analyzerService = analyzerService; + var cmds = wpfCommandService.GetCommands(ControlConstants.GUID_ANALYZER_TREEVIEW); + cmds.Add(ApplicationCommands.Delete, (s, e) => DeleteNodes(), (s, e) => e.CanExecute = CanDeleteNodes, ModifierKeys.None, Key.Delete); + } + + bool CanDeleteNodes => GetNodes() is not null; + void DeleteNodes() => DeleteNodes(GetNodes()); + TreeNodeData[]? GetNodes() => GetNodes(analyzerService.Value.TreeView.TopLevelSelection); + + internal static TreeNodeData[]? GetNodes(TreeNodeData[] nodes) { + if (nodes is null) + return null; + if (nodes.Length == 0 || !nodes.All(a => a.TreeNode.Parent is not null && a.TreeNode.Parent.Parent is null)) + return null; + return nodes; + } + + internal static void DeleteNodes(TreeNodeData[]? nodes) { + if (nodes is not null) { + foreach (var node in nodes) { + AnalyzerTreeNodeData.CancelSelfAndChildren(node); + node.TreeNode.Parent!.Children.Remove(node.TreeNode); + } + } + } + } + + [ExportMenuItem(Header = "res:RemoveCommand", Icon = DsImagesAttribute.Cancel, InputGestureText = "res:ShortCutKeyDelete", Group = MenuConstants.GROUP_CTX_ANALYZER_OTHER, Order = 10)] + sealed class RemoveAnalyzeCtxMenuCommand : MenuItemBase { + public override bool IsVisible(IMenuItemContext context) => GetNodes(context) is not null; + + static TreeNodeData[]? GetNodes(IMenuItemContext context) { + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_ANALYZER_TREEVIEW_GUID)) + return null; + return RemoveAnalyzeCommand.GetNodes(context.Find()); + } + + public override void Execute(IMenuItemContext context) => RemoveAnalyzeCommand.DeleteNodes(GetNodes(context)); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EntityNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EntityNode.cs new file mode 100644 index 0000000..26abb9c --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EntityNode.cs @@ -0,0 +1,53 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using dnlib.DotNet; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + abstract class EntityNode : AnalyzerTreeNodeData, IMDTokenNode { + public abstract IMemberRef? Member { get; } + public abstract IMDTokenProvider? Reference { get; } + public SourceRef? SourceRef { get; set; } + + public override bool Activate() { + Context.AnalyzerService.OnActivated(this); + return true; + } + + public override bool HandleAssemblyListChanged(IDsDocument[] removedAssemblies, IDsDocument[] addedAssemblies) { + foreach (var asm in removedAssemblies) { + if (Member?.Module == asm.ModuleDef) + return false; // remove this node + } + HandleAssemblyListChanged(TreeNode, removedAssemblies, addedAssemblies); + return true; + } + + public override bool HandleModelUpdated(IDsDocument[] documents) { + if (Member?.Module is null) + return false; // remove this node + if ((Member is IField || Member is IMethod || Member is PropertyDef || Member is EventDef) && + Member.DeclaringType is null) + return false; + HandleModelUpdated(TreeNode, documents); + return true; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EventAccessorNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EventAccessorNode.cs new file mode 100644 index 0000000..b580111 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EventAccessorNode.cs @@ -0,0 +1,37 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class EventAccessorNode : MethodNode { + readonly string? name; + + public EventAccessorNode(MethodDef analyzedMethod, string? name) + : base(analyzedMethod) => this.name = name; + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + if (name is not null) + output.Write(BoxedTextColor.Keyword, name); + else + base.Write(output, decompiler); + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EventFiredByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EventFiredByNode.cs new file mode 100644 index 0000000..4c44373 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EventFiredByNode.cs @@ -0,0 +1,122 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class EventFiredByNode : SearchNode { + readonly List analyzedTypes; + readonly FieldDef? eventBackingField; + readonly MethodDef? eventFiringMethod; + + ConcurrentDictionary? foundMethods; + + public EventFiredByNode(EventDef analyzedEvent) { + if (analyzedEvent is null) + throw new ArgumentNullException(nameof(analyzedEvent)); + analyzedTypes = new List { analyzedEvent.DeclaringType }; + + eventBackingField = GetBackingField(analyzedEvent); + var eventType = analyzedEvent.EventType.ResolveTypeDef(); + if (eventType is not null) + eventFiringMethod = eventType.Methods.First(md => md.Name == "Invoke"); + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.RaisedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + foundMethods = new ConcurrentDictionary(); + + AddTypeEquivalentTypes(Context.DocumentService, analyzedTypes[0], analyzedTypes); + foreach (var declType in analyzedTypes) { + foreach (var child in FindReferencesInType(declType)) + yield return child; + } + + foundMethods = null; + } + + IEnumerable FindReferencesInType(TypeDef type) { + // HACK: in lieu of proper flow analysis, I'm going to use a simple heuristic + // If the method accesses the event's backing field, and calls invoke on a delegate + // with the same signature, then it is (most likely) raise the given event. + + foreach (MethodDef method in type.Methods) { + bool readBackingField = false; + if (!method.HasBody) + continue; + Instruction? foundInstr = null; + foreach (Instruction instr in method.Body.Instructions) { + Code code = instr.OpCode.Code; + if ((code == Code.Ldfld || code == Code.Ldflda || code == Code.Ldtoken) && instr.Operand is IField fr && fr.IsField) { + if (CheckEquals(fr.ResolveFieldDef(), eventBackingField)) { + readBackingField = true; + } + } + if (readBackingField && (code == Code.Callvirt || code == Code.Call)) { + if (instr.Operand is IMethod mr && eventFiringMethod is not null && mr.Name == eventFiringMethod.Name && CheckEquals(mr.ResolveMethodDef(), eventFiringMethod)) { + foundInstr = instr; + break; + } + } + } + + if (foundInstr is not null) { + if (GetOriginalCodeLocation(method) is MethodDef codeLocation && !HasAlreadyBeenFound(codeLocation)) { + var node = new MethodNode(codeLocation) { Context = Context }; + if (codeLocation == method) + node.SourceRef = new SourceRef(method, foundInstr.Offset, foundInstr.Operand as IMDTokenProvider); + yield return node; + } + } + } + } + + bool HasAlreadyBeenFound(MethodDef method) => !foundMethods!.TryAdd(method, 0); + + // HACK: we should probably examine add/remove methods to determine this + static FieldDef? GetBackingField(EventDef ev) { + var fieldName = ev.Name; + var vbStyleFieldName = fieldName + "Event"; + var fieldType = ev.EventType; + if (fieldType is null) + return null; + + foreach (var fd in ev.DeclaringType.Fields) { + if (fd.Name == fieldName || fd.Name == vbStyleFieldName) + if (new SigComparer().Equals(fd.FieldType, fieldType)) + return fd; + } + + return null; + } + + + public static bool CanShow(EventDef ev) => GetBackingField(ev) is not null; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EventNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EventNode.cs new file mode 100644 index 0000000..f366a0f --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EventNode.cs @@ -0,0 +1,91 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class EventNode : EntityNode { + readonly EventDef analyzedEvent; + readonly bool hidesParent; + + public EventNode(EventDef analyzedEvent, bool hidesParent = false) { + this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent)); + this.hidesParent = hidesParent; + } + + public override void Initialize() => TreeNode.LazyLoading = true; + public override IMemberRef? Member => analyzedEvent; + public override IMDTokenProvider? Reference => analyzedEvent; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedEvent); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + if (hidesParent) { + output.Write(BoxedTextColor.Punctuation, "("); + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.HidesParent); + output.Write(BoxedTextColor.Punctuation, ")"); + output.WriteSpace(); + } + decompiler.WriteType(output, analyzedEvent.DeclaringType, true); + output.Write(BoxedTextColor.Operator, "."); + new NodeFormatter().Write(output, decompiler, analyzedEvent, Context.ShowToken); + } + + public override IEnumerable CreateChildren() { + if (analyzedEvent.AddMethod is not null) + yield return new EventAccessorNode(analyzedEvent.AddMethod, "add"); + + if (analyzedEvent.RemoveMethod is not null) + yield return new EventAccessorNode(analyzedEvent.RemoveMethod, "remove"); + + if (analyzedEvent.InvokeMethod is not null) + yield return new EventAccessorNode(analyzedEvent.InvokeMethod, "raise"); + + foreach (var accessor in analyzedEvent.OtherMethods) + yield return new EventAccessorNode(accessor, null); + + if (EventFiredByNode.CanShow(analyzedEvent)) + yield return new EventFiredByNode(analyzedEvent); + + if (EventOverriddenNode.CanShow(analyzedEvent)) + yield return new EventOverriddenNode(analyzedEvent); + + if (EventOverridesNode.CanShow(analyzedEvent)) + yield return new EventOverridesNode(analyzedEvent); + + if (InterfaceEventImplementedByNode.CanShow(analyzedEvent)) + yield return new InterfaceEventImplementedByNode(analyzedEvent); + } + + public static AnalyzerTreeNodeData? TryCreateAnalyzer(IMemberRef? member, IDecompiler decompiler) { + if (CanShow(member, decompiler)) + return new EventNode((EventDef)member!); + else + return null; + } + + public static bool CanShow(IMemberRef? member, IDecompiler decompiler) => member is EventDef; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EventOverriddenNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EventOverriddenNode.cs new file mode 100644 index 0000000..add3e73 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EventOverriddenNode.cs @@ -0,0 +1,87 @@ +/* + Copyright (C) 2017 HoLLy + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class EventOverriddenNode : SearchNode { + readonly EventDef analyzedEvent; + readonly List analyzedTypes; + + public EventOverriddenNode(EventDef analyzedEvent) { + this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent)); + analyzedTypes = new List { analyzedEvent.DeclaringType }; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverridesTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + AddTypeEquivalentTypes(Context.DocumentService, analyzedTypes[0], analyzedTypes); + foreach (var declType in analyzedTypes) { + var analyzedAccessor = GetVirtualAccessor(analyzedEvent.AddMethod) ?? GetVirtualAccessor(analyzedEvent.RemoveMethod) ?? GetVirtualAccessor(analyzedEvent.InvokeMethod); + if (analyzedAccessor?.Overrides is IList overrides && overrides.Count > 0) { + bool matched = false; + foreach (var o in overrides) { + if (o.MethodDeclaration.ResolveMethodDef() is MethodDef method && (method.IsVirtual || method.IsAbstract)) { + if (method.DeclaringType.Events.FirstOrDefault(a => (object?)a.AddMethod == method || (object?)a.RemoveMethod == method || (object?)a.InvokeMethod == method) is EventDef eventDef) { + matched = true; + yield return new EventNode(eventDef) { Context = Context }; + } + } + } + if (matched) + yield break; + } + + foreach (var eventDef in TypesHierarchyHelpers.FindBaseEvents(analyzedEvent, declType)) { + var anyAccessor = GetVirtualAccessor(eventDef.AddMethod) ?? GetVirtualAccessor(eventDef.RemoveMethod) ?? GetVirtualAccessor(eventDef.InvokeMethod); + if (anyAccessor is null || !(anyAccessor.IsVirtual || anyAccessor.IsAbstract)) + continue; + yield return new EventNode(eventDef) { Context = Context }; + yield break; + } + } + } + + public static bool CanShow(EventDef @event) => + (GetAccessor(@event.AddMethod) ?? GetAccessor(@event.RemoveMethod) ?? GetAccessor(@event.InvokeMethod)) is not null; + + static MethodDef? GetAccessor(MethodDef? accessor) { + if (accessor is not null && + accessor.DeclaringType.BaseType is not null && + (accessor.IsVirtual || accessor.IsAbstract) && accessor.IsReuseSlot) + return accessor; + return null; + } + + static MethodDef? GetVirtualAccessor(MethodDef? accessor) { + if (accessor is not null && (accessor.IsVirtual || accessor.IsAbstract)) + return accessor; + return null; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/EventOverridesNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/EventOverridesNode.cs new file mode 100644 index 0000000..a43fa92 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/EventOverridesNode.cs @@ -0,0 +1,61 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class EventOverridesNode : SearchNode { + readonly EventDef analyzedEvent; + + public EventOverridesNode(EventDef analyzedEvent) => this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverriddenByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedEvent, FindReferencesInType); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (!TypesHierarchyHelpers.IsBaseType(analyzedEvent.DeclaringType, type, resolveTypeArguments: false)) + yield break; + + foreach (EventDef eventDef in type.Events) { + if (TypesHierarchyHelpers.IsBaseEvent(analyzedEvent, eventDef)) { + MethodDef anyAccessor = eventDef.AddMethod ?? eventDef.RemoveMethod ?? eventDef.InvokeMethod; + if (anyAccessor is null) + continue; + bool hidesParent = !anyAccessor.IsVirtual ^ anyAccessor.IsNewSlot; + yield return new EventNode(eventDef, hidesParent) { Context = Context }; + } + } + } + + public static bool CanShow(EventDef @event) { + var accessor = @event.AddMethod ?? @event.RemoveMethod ?? @event.InvokeMethod; + return accessor is not null && accessor.IsVirtual && !accessor.IsFinal && !accessor.DeclaringType.IsInterface; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/FieldAccessNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/FieldAccessNode.cs new file mode 100644 index 0000000..67c92b4 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/FieldAccessNode.cs @@ -0,0 +1,209 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class FieldAccessNode : SearchNode { + readonly bool showWrites; // true: show writes; false: show read access + readonly FieldDef analyzedField; + Lazy? foundMethods; + readonly object hashLock = new object(); + + public FieldAccessNode(FieldDef analyzedField, bool showWrites) { + this.analyzedField = analyzedField ?? throw new ArgumentNullException(nameof(analyzedField)); + this.showWrites = showWrites; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, showWrites ? dnSpy_Analyzer_Resources.AssignedByTreeNode : dnSpy_Analyzer_Resources.ReadByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + foundMethods = new Lazy(LazyThreadSafetyMode.ExecutionAndPublication); + + var includeAllModules = showWrites && CustomAttributesUtils.IsPseudoCustomAttributeType(analyzedField.DeclaringType); + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedField, FindReferencesInType, options); + foreach (var child in analyzer.PerformAnalysis(ct)) { + yield return child; + } + + foundMethods = null; + + if (showWrites) { + var hash = new HashSet(); + foreach (var module in analyzer.AllModules) { + if (module.Assembly is AssemblyDef asm && hash.Add(asm)) { + foreach (var node in CheckCustomAttributeNamedArgumentWrite(Context, asm, analyzedField)) + yield return node; + } + foreach (var node in CheckCustomAttributeNamedArgumentWrite(Context, module, analyzedField)) + yield return node; + } + } + } + + IEnumerable FindReferencesInType(TypeDef type) { + foreach (MethodDef method in type.Methods) { + Instruction? foundInstr = null; + if (method.HasBody) { + foreach (Instruction instr in method.Body.Instructions) { + if (CanBeReference(instr.OpCode.Code)) { + IField? fr = instr.Operand as IField; + if (CheckEquals(fr.ResolveFieldDef(), analyzedField) && + Helpers.IsReferencedBy(analyzedField.DeclaringType, fr!.DeclaringType)) { + foundInstr = instr; + break; + } + } + } + } + + if (foundInstr is not null) { + if (GetOriginalCodeLocation(method) is MethodDef codeLocation && !HasAlreadyBeenFound(codeLocation)) { + var node = new MethodNode(codeLocation) { Context = Context }; + if (codeLocation == method) + node.SourceRef = new SourceRef(method, foundInstr.Offset, foundInstr.Operand as IMDTokenProvider); + yield return node; + } + } + } + + if (showWrites) { + foreach (var node in CheckCustomAttributeNamedArgumentWrite(Context, type, analyzedField)) { + if (node is MethodNode methodNode && methodNode.Member is MethodDef method && HasAlreadyBeenFound(method)) + continue; + yield return node; + } + } + } + + internal static IEnumerable CheckCustomAttributeNamedArgumentWrite(IAnalyzerTreeNodeDataContext context, AssemblyDef asm, IMemberRef member) { + if (TryGetCAWrite(asm, member, member.IsField, out var ca)) + yield return new AssemblyNode(asm) { Context = context }; + } + + internal static IEnumerable CheckCustomAttributeNamedArgumentWrite(IAnalyzerTreeNodeDataContext context, ModuleDef module, IMemberRef member) { + if (HasWrite(module, member, member.IsField)) + yield return new ModuleNode(module) { Context = context }; + } + + internal static IEnumerable CheckCustomAttributeNamedArgumentWrite(IAnalyzerTreeNodeDataContext context, TypeDef type, IMemberRef member) { + bool isField = member.IsField; + if (HasWrite(type, member, isField)) + yield return new TypeNode(type) { Context = context }; + foreach (var method in type.Methods) { + if (HasWrite(method, member, isField)) + yield return new MethodNode(method) { Context = context }; + foreach (var pd in method.ParamDefs) { + if (HasWrite(pd, member, isField)) + yield return new MethodNode(method) { Context = context }; + } + } + foreach (var field in type.Fields) { + if (HasWrite(field, member, isField)) + yield return new FieldNode(field) { Context = context }; + } + foreach (var property in type.Properties) { + if (HasWrite(property, member, isField)) + yield return new PropertyNode(property) { Context = context }; + } + foreach (var @event in type.Events) { + if (HasWrite(@event, member, isField)) + yield return new EventNode(@event) { Context = context }; + } + } + + static bool HasWrite(IHasCustomAttribute hca, IMemberRef member, bool isField) => + TryGetCAWrite(hca, member, isField, out _); + + static bool TryGetCAWrite(IHasCustomAttribute hca, IMemberRef member, bool isField, [NotNullWhen(true)] out CustomAttribute? customAttribute) { + customAttribute = null; + TypeSig? memberType; + if (isField) + memberType = ((IField)member).FieldSig?.GetFieldType(); + else { + var property = (PropertyDef)member; + var propSig = property.PropertySig; + if (propSig is null || propSig.Params.Count != 0) + return false; + memberType = propSig?.GetRetType(); + } + foreach (var ca in hca.GetCustomAttributes()) { + if (!new SigComparer().Equals(ca.AttributeType.GetScopeType(), member.DeclaringType)) + continue; + var namedArgs = ca.NamedArguments; + for (int i = 0; i < namedArgs.Count; i++) { + var namedArg = namedArgs[i]; + if (namedArg.IsField != isField) + continue; + if (namedArg.Name != member.Name) + continue; + if (!new SigComparer().Equals(namedArg.Type, memberType)) + continue; + + customAttribute = ca; + return true; + } + } + + return false; + } + + bool CanBeReference(Code code) { + switch (code) { + case Code.Ldfld: + case Code.Ldsfld: + return !showWrites; + case Code.Stfld: + case Code.Stsfld: + return showWrites; + case Code.Ldflda: + case Code.Ldsflda: + case Code.Ldtoken: + return true; // always show address-loading + default: + return false; + } + } + + bool HasAlreadyBeenFound(MethodDef method) { + Hashtable hashtable = foundMethods!.Value; + lock (hashLock) { + if (hashtable.Contains(method)) { + return true; + } + else { + hashtable.Add(method, null); + return false; + } + } + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/FieldNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/FieldNode.cs new file mode 100644 index 0000000..84d6530 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/FieldNode.cs @@ -0,0 +1,52 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class FieldNode : EntityNode { + readonly FieldDef analyzedField; + + public FieldNode(FieldDef analyzedField) => this.analyzedField = analyzedField ?? throw new ArgumentNullException(nameof(analyzedField)); + + public override void Initialize() => TreeNode.LazyLoading = true; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedField); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + decompiler.WriteType(output, analyzedField.DeclaringType, true); + output.Write(BoxedTextColor.Operator, "."); + new NodeFormatter().Write(output, decompiler, analyzedField, Context.ShowToken); + } + + public override IEnumerable CreateChildren() { + yield return new FieldAccessNode(analyzedField, false); + if (!analyzedField.IsLiteral) + yield return new FieldAccessNode(analyzedField, true); + } + + public override IMemberRef? Member => analyzedField; + public override IMDTokenProvider? Reference => analyzedField; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/Helpers.cs b/Extensions/dnSpy.Analyzer/TreeNodes/Helpers.cs new file mode 100644 index 0000000..2a00b5f --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/Helpers.cs @@ -0,0 +1,118 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System.Linq; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Contracts.Decompiler; + +namespace dnSpy.Analyzer.TreeNodes { + static class Helpers { + public static bool IsReferencedBy(TypeDef? type, ITypeDefOrRef? typeRef) => new SigComparer().Equals(type, typeRef.GetScopeType()); + + public static IMemberRef GetOriginalCodeLocation(IMemberRef member) { + if (member is MethodDef) + return GetOriginalCodeLocation((MethodDef)member); + return member; + } + + static MethodDef GetOriginalCodeLocation(MethodDef method) { + if (IsCompilerGenerated(method)) { + return FindMethodUsageInType(method.DeclaringType, method) ?? method; + } + + var typeUsage = GetOriginalCodeLocation(method.DeclaringType); + + return typeUsage ?? method; + } + + /// + /// Given a compiler-generated type, returns the method where that type is used. + /// Used to detect the 'parent method' for a lambda/iterator/async state machine. + /// + static MethodDef? GetOriginalCodeLocation(TypeDef type) { + if (type is not null && type.DeclaringType is not null && IsCompilerGenerated(type)) { + if (type.IsValueType) { + // Value types might not have any constructor; but they must be stored in a local var + // because 'initobj' (or 'call .ctor') expects a managed ref. + return FindVariableOfTypeUsageInType(type.DeclaringType, type); + } + else { + var constructor = GetTypeConstructor(type); + if (constructor is null) + return null; + return FindMethodUsageInType(type.DeclaringType, constructor); + } + } + return null; + } + + static MethodDef? GetTypeConstructor(TypeDef type) => type.FindConstructors().FirstOrDefault(); + + static MethodDef? FindMethodUsageInType(TypeDef type, MethodDef analyzedMethod) { + string name = analyzedMethod.Name; + foreach (MethodDef method in type.Methods) { + bool found = false; + if (!method.HasBody) + continue; + foreach (Instruction instr in method.Body.Instructions) { + if (instr.Operand is IMethod mr && !mr.IsField && mr.Name == name && + IsReferencedBy(analyzedMethod.DeclaringType, mr.DeclaringType) && + CheckEquals(mr.ResolveMethodDef(), analyzedMethod)) { + found = true; + break; + } + } + + if (found) + return method; + } + return null; + } + + internal static bool CheckEquals(IMemberRef? mr1, IMemberRef? mr2) => + new SigComparer(SigComparerOptions.CompareDeclaringTypes | SigComparerOptions.PrivateScopeIsComparable).Equals(mr1, mr2); + + static MethodDef? FindVariableOfTypeUsageInType(TypeDef type, TypeDef variableType) { + foreach (MethodDef method in type.Methods) { + bool found = false; + if (!method.HasBody) + continue; + foreach (var v in method.Body.Variables) { + if (ResolveWithinSameModule(v.Type.ToTypeDefOrRef()) == variableType) { + found = true; + break; + } + } + + if (found) + return method; + } + return null; + } + + static TypeDef? ResolveWithinSameModule(ITypeDefOrRef type) { + if (type is not null && type.Scope == type.Module) + return type.ResolveTypeDef(); + return null; + } + + static bool IsCompilerGenerated(this IHasCustomAttribute hca) => + hca is not null && hca.CustomAttributes.IsDefined("System.Runtime.CompilerServices.CompilerGeneratedAttribute"); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/IAnalyzerTreeNodeDataContext.cs b/Extensions/dnSpy.Analyzer/TreeNodes/IAnalyzerTreeNodeDataContext.cs new file mode 100644 index 0000000..b402098 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/IAnalyzerTreeNodeDataContext.cs @@ -0,0 +1,38 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.TreeView.Text; + +namespace dnSpy.Analyzer.TreeNodes { + interface IAnalyzerTreeNodeDataContext { + bool SingleClickExpandsChildren { get; } + bool SyntaxHighlight { get; } + bool ShowToken { get; } + ITreeView TreeView { get; } + IDecompiler Decompiler { get; } + ITreeViewNodeTextElementProvider TreeViewNodeTextElementProvider { get; } + IDotNetImageService DotNetImageService { get; } + IDsDocumentService DocumentService { get; } + IAnalyzerService AnalyzerService { get; } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/IAsyncCancellable.cs b/Extensions/dnSpy.Analyzer/TreeNodes/IAsyncCancellable.cs new file mode 100644 index 0000000..1b06d88 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/IAsyncCancellable.cs @@ -0,0 +1,24 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +namespace dnSpy.Analyzer.TreeNodes { + interface IAsyncCancellable { + void Cancel(); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceEventImplementedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceEventImplementedByNode.cs new file mode 100644 index 0000000..8ac4844 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceEventImplementedByNode.cs @@ -0,0 +1,111 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class InterfaceEventImplementedByNode : SearchNode { + readonly EventDef analyzedEvent; + readonly MethodDef? analyzedMethod; + readonly AccessorKind accessorKind; + + enum AccessorKind { + Adder, + Remover, + Invoker, + } + + public InterfaceEventImplementedByNode(EventDef analyzedEvent) { + this.analyzedEvent = analyzedEvent ?? throw new ArgumentNullException(nameof(analyzedEvent)); + if (this.analyzedEvent.AddMethod is not null) { + analyzedMethod = this.analyzedEvent.AddMethod; + accessorKind = AccessorKind.Adder; + } + else if (this.analyzedEvent.RemoveMethod is not null) { + analyzedMethod = this.analyzedEvent.RemoveMethod; + accessorKind = AccessorKind.Remover; + } + else { + analyzedMethod = this.analyzedEvent.InvokeMethod; + accessorKind = AccessorKind.Invoker; + } + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.ImplementedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + if (analyzedMethod is null) + yield break; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType); + foreach (var child in analyzer.PerformAnalysis(ct)) { + yield return child; + } + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (analyzedMethod is null) + yield break; + if (type.IsInterface) + yield break; + var implementedInterfaceRef = InterfaceMethodImplementedByNode.GetInterface(type, analyzedMethod.DeclaringType); + if (implementedInterfaceRef is null) + yield break; + + foreach (EventDef ev in type.Events.Where(e => e.Name.EndsWith(analyzedEvent.Name))) { + var accessor = GetAccessor(ev); + // Don't include abstract accessors, they don't implement anything + if (accessor is null || !accessor.IsVirtual || accessor.IsAbstract) + continue; + if (accessor.HasOverrides && accessor.Overrides.Any(m => CheckEquals(m.MethodDeclaration.ResolveMethodDef(), analyzedMethod))) { + yield return new EventNode(ev) { Context = Context }; + yield break; + } + } + + foreach (EventDef ev in type.Events.Where(e => e.Name == analyzedEvent.Name)) { + var accessor = GetAccessor(ev); + // Don't include abstract accessors, they don't implement anything + if (accessor is null || !accessor.IsVirtual || accessor.IsAbstract) + continue; + if (TypesHierarchyHelpers.MatchInterfaceMethod(accessor, analyzedMethod, implementedInterfaceRef)) { + yield return new EventNode(ev) { Context = Context }; + yield break; + } + } + } + + MethodDef? GetAccessor(EventDef ev) { + switch (accessorKind) { + case AccessorKind.Adder: return ev.AddMethod; + case AccessorKind.Remover: return ev.RemoveMethod; + case AccessorKind.Invoker: return ev.InvokeMethod; + default: return null; + } + } + + public static bool CanShow(EventDef ev) => ev.DeclaringType.IsInterface && (ev.AddMethod ?? ev.RemoveMethod ?? ev.InvokeMethod) is MethodDef accessor && (accessor.IsVirtual || accessor.IsAbstract); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceMethodImplementedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceMethodImplementedByNode.cs new file mode 100644 index 0000000..f255c15 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/InterfaceMethodImplementedByNode.cs @@ -0,0 +1,138 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class InterfaceMethodImplementedByNode : SearchNode { + readonly MethodDef analyzedMethod; + Guid comGuid; + bool isComType; + int vtblIndex; + + public InterfaceMethodImplementedByNode(MethodDef analyzedMethod) => this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.ImplementedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + ComUtils.GetMemberInfo(analyzedMethod, out isComType, out comGuid, out vtblIndex); + bool includeAllModules = isComType; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (isComType) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType, options); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (type.IsInterface) + yield break; + var implementedInterfaceRef = GetInterface(type, analyzedMethod.DeclaringType); + var comIface = isComType ? GetComInterface(type, ref comGuid) : null; + + foreach (var method in type.Methods) { + // Don't include abstract methods, they don't implement anything + if (!method.IsVirtual || method.IsAbstract) + continue; + if (method.HasOverrides && method.Overrides.Any(m => CheckOverride(m))) { + yield return new MethodNode(method) { Context = Context }; + yield break; + } + } + + if (comIface is not null && ComUtils.GetMethod(comIface, vtblIndex) is MethodDef comIfaceMethod) { + foreach (var method in type.Methods) { + // Don't include abstract methods, they don't implement anything + if (!method.IsVirtual || method.IsAbstract) + continue; + if (TypesHierarchyHelpers.MatchInterfaceMethod(method, comIfaceMethod, comIface)) { + yield return new MethodNode(method) { Context = Context }; + yield break; + } + } + } + + if (implementedInterfaceRef is not null) { + foreach (var method in type.Methods) { + // Don't include abstract methods, they don't implement anything + if (!method.IsVirtual || method.IsAbstract) + continue; + if (method.Name != analyzedMethod.Name) + continue; + if (TypesHierarchyHelpers.MatchInterfaceMethod(method, analyzedMethod, implementedInterfaceRef)) { + yield return new MethodNode(method) { Context = Context }; + yield break; + } + } + } + } + + bool CheckOverride(MethodOverride m) { + if (!(m.MethodDeclaration.ResolveMethodDef() is MethodDef method)) + return false; + if (isComType) { + ComUtils.GetMemberInfo(method, out bool otherIsComType, out var otherComGuid, out int otherVtblIndex); + if (otherIsComType && otherComGuid == comGuid && otherVtblIndex == vtblIndex) + return true; + } + return CheckEquals(method, analyzedMethod); + } + + internal static ITypeDefOrRef? GetInterface(TypeDef type, TypeDef interfaceType) { + foreach (var t in TypesHierarchyHelpers.GetTypeAndBaseTypes(type)) { + var td = t.Resolve(); + if (td is null) + break; + foreach (var ii in td.Interfaces) { + var genericArgs = t is GenericInstSig ? ((GenericInstSig)t).GenericArguments : null; + var iface = GenericArgumentResolver.Resolve(ii.Interface.ToTypeSig(), genericArgs, null); + if (iface is null) + continue; + if (new SigComparer().Equals(ii.Interface.GetScopeType(), interfaceType)) + return iface.ToTypeDefOrRef(); + } + } + return null; + } + + static TypeDef? GetComInterface(TypeDef type, ref Guid comGuid) { + foreach (var t in TypesHierarchyHelpers.GetTypeAndBaseTypes(type)) { + var td = t.Resolve(); + if (td is null) + break; + foreach (var ii in td.Interfaces) { + if (ii.Interface.GetScopeType().ResolveTypeDef() is TypeDef iface && ComUtils.ComEquals(iface, ref comGuid)) + return iface; + } + } + return null; + } + + public static bool CanShow(MethodDef method) => method.DeclaringType.IsInterface && (method.IsVirtual || method.IsAbstract); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/InterfacePropertyImplementedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/InterfacePropertyImplementedByNode.cs new file mode 100644 index 0000000..0948962 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/InterfacePropertyImplementedByNode.cs @@ -0,0 +1,90 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class InterfacePropertyImplementedByNode : SearchNode { + readonly PropertyDef analyzedProperty; + readonly MethodDef? analyzedMethod; + readonly bool isGetter; + + public InterfacePropertyImplementedByNode(PropertyDef analyzedProperty) { + this.analyzedProperty = analyzedProperty ?? throw new ArgumentNullException(nameof(analyzedProperty)); + if (this.analyzedProperty.GetMethod is not null) { + analyzedMethod = this.analyzedProperty.GetMethod; + isGetter = true; + } + else { + analyzedMethod = this.analyzedProperty.SetMethod; + isGetter = false; + } + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.ImplementedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + if (analyzedMethod is null) + return new List(); + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (analyzedMethod is null) + yield break; + if (type.IsInterface) + yield break; + var implementedInterfaceRef = InterfaceMethodImplementedByNode.GetInterface(type, analyzedMethod.DeclaringType); + if (implementedInterfaceRef is null) + yield break; + + foreach (PropertyDef property in type.Properties.Where(e => e.Name.EndsWith(analyzedProperty.Name))) { + MethodDef accessor = isGetter ? property.GetMethod : property.SetMethod; + // Don't include abstract accessors, they don't implement anything + if (accessor is null || !accessor.IsVirtual || accessor.IsAbstract) + continue; + if (accessor.HasOverrides && accessor.Overrides.Any(m => CheckEquals(m.MethodDeclaration.ResolveMethodDef(), analyzedMethod))) { + yield return new PropertyNode(property) { Context = Context }; + yield break; + } + } + + foreach (PropertyDef property in type.Properties.Where(e => e.Name == analyzedProperty.Name)) { + MethodDef accessor = isGetter ? property.GetMethod : property.SetMethod; + // Don't include abstract accessors, they don't implement anything + if (accessor is null || !accessor.IsVirtual || accessor.IsAbstract) + continue; + if (TypesHierarchyHelpers.MatchInterfaceMethod(accessor, analyzedMethod, implementedInterfaceRef)) { + yield return new PropertyNode(property) { Context = Context }; + yield break; + } + } + } + + public static bool CanShow(PropertyDef property) => property.DeclaringType.IsInterface && (property.GetMethod ?? property.SetMethod) is MethodDef accessor && (accessor.IsVirtual || accessor.IsAbstract); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/MethodNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/MethodNode.cs new file mode 100644 index 0000000..f71c1cc --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/MethodNode.cs @@ -0,0 +1,78 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + class MethodNode : EntityNode { + readonly MethodDef analyzedMethod; + readonly bool hidesParent; + readonly bool isSetter; + + public MethodNode(MethodDef analyzedMethod, bool hidesParent = false, bool isSetter = false) { + this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + this.hidesParent = hidesParent; + this.isSetter = isSetter; + } + + public override void Initialize() => TreeNode.LazyLoading = true; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedMethod); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + if (hidesParent) { + output.Write(BoxedTextColor.Punctuation, "("); + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.HidesParent); + output.Write(BoxedTextColor.Punctuation, ")"); + output.WriteSpace(); + } + decompiler.WriteType(output, analyzedMethod.DeclaringType, true); + output.Write(BoxedTextColor.Operator, "."); + new NodeFormatter().Write(output, decompiler, analyzedMethod, Context.ShowToken); + } + + public override IEnumerable CreateChildren() { + if (analyzedMethod.HasBody) + yield return new MethodUsesNode(analyzedMethod); + + if ((analyzedMethod.IsVirtual || analyzedMethod.IsAbstract) && !(analyzedMethod.IsNewSlot && analyzedMethod.IsFinal)) + yield return new VirtualMethodUsedByNode(analyzedMethod, isSetter); + else + yield return new MethodUsedByNode(analyzedMethod, isSetter); + + if (MethodOverriddenNode.CanShow(analyzedMethod)) + yield return new MethodOverriddenNode(analyzedMethod); + + if (MethodOverridesNode.CanShow(analyzedMethod)) + yield return new MethodOverridesNode(analyzedMethod); + + if (InterfaceMethodImplementedByNode.CanShow(analyzedMethod)) + yield return new InterfaceMethodImplementedByNode(analyzedMethod); + } + + public override IMemberRef? Member => analyzedMethod; + public override IMDTokenProvider? Reference => analyzedMethod; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverriddenNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverriddenNode.cs new file mode 100644 index 0000000..c833dbf --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverriddenNode.cs @@ -0,0 +1,72 @@ +/* + Copyright (C) 2017 HoLLy + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + /// + /// Searches methods that are overridden by the analyzed method. + /// + sealed class MethodOverriddenNode : SearchNode { + readonly MethodDef analyzedMethod; + readonly List analyzedTypes; + + public MethodOverriddenNode(MethodDef analyzedMethod) { + this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + analyzedTypes = new List { analyzedMethod.DeclaringType }; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverridesTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + AddTypeEquivalentTypes(Context.DocumentService, analyzedTypes[0], analyzedTypes); + var overrides = analyzedMethod.Overrides; + foreach (var declType in analyzedTypes) { + if (overrides.Count > 0) { + bool matched = false; + foreach (var o in overrides) { + if (o.MethodDeclaration.ResolveMethodDef() is MethodDef method && (method.IsVirtual || method.IsAbstract)) { + matched = true; + yield return new MethodNode(method) { Context = Context }; + } + } + if (matched) + yield break; + } + foreach (var method in TypesHierarchyHelpers.FindBaseMethods(analyzedMethod, declType)) { + if (!(method.IsVirtual || method.IsAbstract)) + continue; + yield return new MethodNode(method) { Context = Context }; + yield break; + } + } + } + + public static bool CanShow(MethodDef method) => + method.DeclaringType.BaseType is not null && + (method.IsVirtual || method.IsAbstract) && method.IsReuseSlot; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverridesNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverridesNode.cs new file mode 100644 index 0000000..ce8a454 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/MethodOverridesNode.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + /// + /// Searches for overrides of the analyzed method. + /// + sealed class MethodOverridesNode : SearchNode { + readonly MethodDef analyzedMethod; + + public MethodOverridesNode(MethodDef analyzedMethod) => this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverriddenByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (!TypesHierarchyHelpers.IsBaseType(analyzedMethod.DeclaringType, type, resolveTypeArguments: false)) + yield break; + foreach (var method in type.Methods) { + if (TypesHierarchyHelpers.IsBaseMethod(analyzedMethod, method)) { + bool hidesParent = !method.IsVirtual ^ method.IsNewSlot; + yield return new MethodNode(method, hidesParent) { Context = Context }; + yield break; + } + } + } + + public static bool CanShow(MethodDef method) => + method.IsVirtual && + !method.IsFinal && + !method.DeclaringType.IsSealed && + !method.DeclaringType.IsInterface; // interface methods are definitions not implementations - cannot be overridden + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsedByNode.cs new file mode 100644 index 0000000..03a16ba --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsedByNode.cs @@ -0,0 +1,161 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class MethodUsedByNode : SearchNode { + readonly MethodDef analyzedMethod; + readonly bool isSetter; + readonly UTF8String? implMapName; + readonly string? implMapModule; + PropertyDef? property; + ConcurrentDictionary? foundMethods; + + public MethodUsedByNode(MethodDef analyzedMethod, bool isSetter) { + this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + this.isSetter = isSetter; + if (analyzedMethod.ImplMap is ImplMap implMap) { + implMapName = GetDllImportMethodName(analyzedMethod, implMap); + implMapModule = NormalizeModuleName(implMap.Module?.Name); + } + } + + static UTF8String GetDllImportMethodName(MethodDef method, ImplMap implMap) { + if (!UTF8String.IsNullOrEmpty(implMap.Name)) + return implMap.Name; + return method.Name; + } + + static string NormalizeModuleName(string name) { + if (string.IsNullOrEmpty(name)) + return string.Empty; + if (name.EndsWith(".dll", StringComparison.OrdinalIgnoreCase)) + name = name.Substring(0, name.Length - 4); + else { + if (name.StartsWith("lib", StringComparison.Ordinal)) + name = name.Substring(3); + + if (name.EndsWith(".so", StringComparison.Ordinal)) + name = name.Substring(0, name.Length - 3); + else if (name.EndsWith(".dylib", StringComparison.OrdinalIgnoreCase)) + name = name.Substring(0, name.Length - 6); + else if (name.EndsWith(".a", StringComparison.Ordinal)) + name = name.Substring(0, name.Length - 2); + else if (name.EndsWith(".sl", StringComparison.Ordinal)) + name = name.Substring(0, name.Length - 3); + } + return name; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.UsedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + foundMethods = new ConcurrentDictionary(); + + if (isSetter) + property = analyzedMethod.DeclaringType.Properties.FirstOrDefault(a => a.SetMethod == analyzedMethod); + + var includeAllModules = (property is not null && CustomAttributesUtils.IsPseudoCustomAttributeType(analyzedMethod.DeclaringType)) || implMapName is not null; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (implMapName is not null) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType, options); + foreach (var child in analyzer.PerformAnalysis(ct)) { + yield return child; + } + + if (property is not null) { + var hash = new HashSet(); + foreach (var module in analyzer.AllModules) { + if (module.Assembly is AssemblyDef asm && hash.Add(asm)) { + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, asm, property)) + yield return node; + } + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, module, property)) + yield return node; + } + } + + foundMethods = null; + } + + IEnumerable FindReferencesInType(TypeDef type) { + string name = analyzedMethod.Name; + foreach (MethodDef method in type.Methods) { + if (!method.HasBody) + continue; + Instruction? foundInstr = null; + if (implMapName is not null) { + foreach (var instr in method.Body.Instructions) { + if (instr.Operand is IMethod mr && !mr.IsField && + mr.ResolveMethodDef() is MethodDef md && + // DllImport methods are the same if module + func name are identical + md?.ImplMap is ImplMap otherImplMap && + implMapName == GetDllImportMethodName(md, otherImplMap) && + StringComparer.OrdinalIgnoreCase.Equals(implMapModule, NormalizeModuleName(otherImplMap.Module?.Name))) { + foundInstr = instr; + break; + } + } + } + else { + foreach (var instr in method.Body.Instructions) { + if (instr.Operand is IMethod mr && !mr.IsField && mr.Name == name && + Helpers.IsReferencedBy(analyzedMethod.DeclaringType, mr.DeclaringType) && + CheckEquals(mr.ResolveMethodDef(), analyzedMethod)) { + foundInstr = instr; + break; + } + } + } + + if (foundInstr is not null) { + if (GetOriginalCodeLocation(method) is MethodDef codeLocation && !HasAlreadyBeenFound(codeLocation)) { + var node = new MethodNode(codeLocation) { Context = Context }; + if (codeLocation == method) + node.SourceRef = new SourceRef(method, foundInstr.Offset, foundInstr.Operand as IMDTokenProvider); + yield return node; + } + } + } + + if (property is not null) { + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, type, property)) { + if (node is MethodNode methodNode && methodNode.Member is MethodDef method && HasAlreadyBeenFound(method)) + continue; + yield return node; + } + } + } + + bool HasAlreadyBeenFound(MethodDef method) => !foundMethods!.TryAdd(method, 0); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsesNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsesNode.cs new file mode 100644 index 0000000..840061f --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/MethodUsesNode.cs @@ -0,0 +1,79 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + /// + /// Shows the methods that are used by this method. + /// + sealed class MethodUsesNode : SearchNode { + readonly MethodDef analyzedMethod; + + public MethodUsesNode(MethodDef analyzedMethod) => this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.UsesTreeNode); + + readonly struct DefRef where T : IDnlibDef { + public readonly T Def; + public readonly SourceRef SourceRef; + public DefRef(T def, SourceRef sourceRef) { + Def = def; + SourceRef = sourceRef; + } + } + + protected override IEnumerable FetchChildren(CancellationToken ct) { + foreach (var f in GetUsedFields().Distinct()) { + yield return new FieldNode(f.Def) { Context = Context, SourceRef = f.SourceRef }; + } + foreach (var m in GetUsedMethods().Distinct()) { + yield return new MethodNode(m.Def) { Context = Context, SourceRef = m.SourceRef }; + } + } + + IEnumerable> GetUsedMethods() { + foreach (Instruction instr in analyzedMethod.Body.Instructions) { + if (instr.Operand is IMethod mr && !mr.IsField) { + MethodDef def = mr.ResolveMethodDef(); + if (def is not null) + yield return new DefRef(def, new SourceRef(analyzedMethod, instr.Offset, instr.Operand as IMDTokenProvider)); + } + } + } + + IEnumerable> GetUsedFields() { + foreach (Instruction instr in analyzedMethod.Body.Instructions) { + if (instr.Operand is IField fr && !fr.IsMethod) { + FieldDef def = fr.ResolveFieldDef(); + if (def is not null) + yield return new DefRef(def, new SourceRef(analyzedMethod, instr.Offset, instr.Operand as IMDTokenProvider)); + } + } + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/ModuleNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/ModuleNode.cs new file mode 100644 index 0000000..2459855 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/ModuleNode.cs @@ -0,0 +1,38 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class ModuleNode : EntityNode { + readonly ModuleDef module; + + public override IMemberRef? Member => null; + public override IMDTokenProvider? Reference => module; + + public ModuleNode(ModuleDef module) => this.module = module; + + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(module); + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.AssemblyModule, NameUtilities.CleanIdentifier(module.Name)); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/PropertyAccessorNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyAccessorNode.cs new file mode 100644 index 0000000..5f71466 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyAccessorNode.cs @@ -0,0 +1,37 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class PropertyAccessorNode : MethodNode { + readonly string? name; + + public PropertyAccessorNode(MethodDef analyzedMethod, string? name, bool isSetter) + : base(analyzedMethod, isSetter: isSetter) => this.name = name; + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + if (name is not null) + output.Write(BoxedTextColor.Keyword, name); + else + base.Write(output, decompiler); + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/PropertyNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyNode.cs new file mode 100644 index 0000000..380d693 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyNode.cs @@ -0,0 +1,89 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class PropertyNode : EntityNode { + readonly PropertyDef analyzedProperty; + readonly bool isIndexer; + readonly bool hidesParent; + + public PropertyNode(PropertyDef analyzedProperty, bool hidesParent = false) { + if (analyzedProperty is null) + throw new ArgumentNullException(nameof(analyzedProperty)); + isIndexer = analyzedProperty.IsIndexer(); + this.analyzedProperty = analyzedProperty; + this.hidesParent = hidesParent; + } + + public override void Initialize() => TreeNode.LazyLoading = true; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedProperty); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) { + if (hidesParent) { + output.Write(BoxedTextColor.Punctuation, "("); + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.HidesParent); + output.Write(BoxedTextColor.Punctuation, ")"); + output.WriteSpace(); + } + decompiler.WriteType(output, analyzedProperty.DeclaringType, true); + output.Write(BoxedTextColor.Operator, "."); + new NodeFormatter().Write(output, decompiler, analyzedProperty, Context.ShowToken, null); + } + + public override IEnumerable CreateChildren() { + if (analyzedProperty.GetMethod is not null) + yield return new PropertyAccessorNode(analyzedProperty.GetMethod, "get", isSetter: false); + + if (analyzedProperty.SetMethod is not null) + yield return new PropertyAccessorNode(analyzedProperty.SetMethod, "set", isSetter: true); + + foreach (var accessor in analyzedProperty.OtherMethods) + yield return new PropertyAccessorNode(accessor, null, isSetter: false); + + if (PropertyOverriddenNode.CanShow(analyzedProperty)) + yield return new PropertyOverriddenNode(analyzedProperty); + + if (PropertyOverridesNode.CanShow(analyzedProperty)) + yield return new PropertyOverridesNode(analyzedProperty); + + if (InterfacePropertyImplementedByNode.CanShow(analyzedProperty)) + yield return new InterfacePropertyImplementedByNode(analyzedProperty); + } + + public static AnalyzerTreeNodeData? TryCreateAnalyzer(IMemberRef? member, IDecompiler decompiler) { + if (CanShow(member, decompiler)) + return new PropertyNode((PropertyDef)member!); + else + return null; + } + + public static bool CanShow(IMemberRef? member, IDecompiler decompiler) => member is PropertyDef; + public override IMemberRef? Member => analyzedProperty; + public override IMDTokenProvider? Reference => analyzedProperty; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverriddenNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverriddenNode.cs new file mode 100644 index 0000000..ff1d227 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverriddenNode.cs @@ -0,0 +1,87 @@ +/* + Copyright (C) 2017 HoLLy + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class PropertyOverriddenNode : SearchNode { + readonly List analyzedTypes; + readonly PropertyDef analyzedProperty; + + public PropertyOverriddenNode(PropertyDef analyzedProperty) { + this.analyzedProperty = analyzedProperty ?? throw new ArgumentNullException(nameof(analyzedProperty)); + analyzedTypes = new List { analyzedProperty.DeclaringType }; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverridesTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + AddTypeEquivalentTypes(Context.DocumentService, analyzedTypes[0], analyzedTypes); + foreach (var declType in analyzedTypes) { + var analyzedAccessor = GetVirtualAccessor(analyzedProperty.GetMethod) ?? GetVirtualAccessor(analyzedProperty.SetMethod); + if (analyzedAccessor?.Overrides is IList overrides && overrides.Count > 0) { + bool matched = false; + foreach (var o in overrides) { + if (o.MethodDeclaration.ResolveMethodDef() is MethodDef method && (method.IsVirtual || method.IsAbstract)) { + if (method.DeclaringType.Properties.FirstOrDefault(a => (object?)a.GetMethod == method || (object?)a.SetMethod == method) is PropertyDef property) { + matched = true; + yield return new PropertyNode(property) { Context = Context }; + } + } + } + if (matched) + yield break; + } + + foreach (var property in TypesHierarchyHelpers.FindBaseProperties(analyzedProperty, declType)) { + var anyAccessor = GetVirtualAccessor(property.GetMethod) ?? GetVirtualAccessor(property.SetMethod); + if (anyAccessor is null || !(anyAccessor.IsVirtual || anyAccessor.IsAbstract)) + continue; + yield return new PropertyNode(property) { Context = Context }; + yield break; + } + } + } + + public static bool CanShow(PropertyDef property) => + (GetAccessor(property.GetMethod) ?? GetAccessor(property.SetMethod)) is not null; + + static MethodDef? GetAccessor(MethodDef? accessor) { + if (accessor is not null && + accessor.DeclaringType.BaseType is not null && + (accessor.IsVirtual || accessor.IsAbstract) && accessor.IsReuseSlot) + return accessor; + return null; + } + + static MethodDef? GetVirtualAccessor(MethodDef? accessor) { + if (accessor is not null && (accessor.IsVirtual || accessor.IsAbstract)) + return accessor; + return null; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverridesNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverridesNode.cs new file mode 100644 index 0000000..f2593eb --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/PropertyOverridesNode.cs @@ -0,0 +1,62 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class PropertyOverridesNode : SearchNode { + readonly PropertyDef analyzedProperty; + + public PropertyOverridesNode(PropertyDef analyzedProperty) => this.analyzedProperty = analyzedProperty ?? throw new ArgumentNullException(nameof(analyzedProperty)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.OverriddenByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedProperty, FindReferencesInType); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (!TypesHierarchyHelpers.IsBaseType(analyzedProperty.DeclaringType, type, resolveTypeArguments: false)) + yield break; + + foreach (PropertyDef property in type.Properties) { + + if (TypesHierarchyHelpers.IsBaseProperty(analyzedProperty, property)) { + MethodDef anyAccessor = property.GetMethod ?? property.SetMethod; + if (anyAccessor is null) + continue; + bool hidesParent = !anyAccessor.IsVirtual ^ anyAccessor.IsNewSlot; + yield return new PropertyNode(property, hidesParent) { Context = Context }; + } + } + } + + public static bool CanShow(PropertyDef property) { + var accessor = property.GetMethod ?? property.SetMethod; + return accessor is not null && accessor.IsVirtual && !accessor.IsFinal && !accessor.DeclaringType.IsInterface; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/ScopedWhereUsedAnalyzer.cs b/Extensions/dnSpy.Analyzer/TreeNodes/ScopedWhereUsedAnalyzer.cs new file mode 100644 index 0000000..99ec90b --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/ScopedWhereUsedAnalyzer.cs @@ -0,0 +1,341 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Contracts.Documents; + +namespace dnSpy.Analyzer.TreeNodes { + [Flags] + enum ScopedWhereUsedAnalyzerOptions { + None = 0, + + /// + /// Search all modules, eg. used if it's a type opted in to type equivalence, or DllImport methods, or COM types/members. + /// + IncludeAllModules = 0x00000001, + + /// + /// Force accessibility to public, eg. used by DllImport methods since DllImport methods with + /// the same name and module are considered to be the same method. + /// + ForcePublic = 0x00000002, + } + + /// + /// Determines the accessibility domain of a member for where-used analysis. + /// + sealed class ScopedWhereUsedAnalyzer { + readonly IDsDocumentService documentService; + readonly TypeDef analyzedType; + readonly List allModules; + readonly ScopedWhereUsedAnalyzerOptions options; + TypeDef typeScope; + + internal List AllModules => allModules; + + readonly Accessibility memberAccessibility = Accessibility.Public; + Accessibility typeAccessibility = Accessibility.Public; + readonly Func> typeAnalysisFunction; + + public ScopedWhereUsedAnalyzer(IDsDocumentService documentService, TypeDef analyzedType, Func> typeAnalysisFunction, ScopedWhereUsedAnalyzerOptions options = ScopedWhereUsedAnalyzerOptions.None) { + this.analyzedType = analyzedType; + typeScope = analyzedType; + this.typeAnalysisFunction = typeAnalysisFunction; + this.documentService = documentService; + allModules = new List(); + this.options = options; + } + + public ScopedWhereUsedAnalyzer(IDsDocumentService documentService, MethodDef method, Func> typeAnalysisFunction, ScopedWhereUsedAnalyzerOptions options = ScopedWhereUsedAnalyzerOptions.None) + : this(documentService, method.DeclaringType, typeAnalysisFunction, options) => memberAccessibility = GetMethodAccessibility(method, options); + + public ScopedWhereUsedAnalyzer(IDsDocumentService documentService, PropertyDef property, Func> typeAnalysisFunction, ScopedWhereUsedAnalyzerOptions options = ScopedWhereUsedAnalyzerOptions.None) + : this(documentService, property.DeclaringType, typeAnalysisFunction, options) { + var getterAccessibility = property.GetMethod is null ? Accessibility.Private : GetMethodAccessibility(property.GetMethod, options); + var setterAccessibility = property.SetMethod is null ? Accessibility.Private : GetMethodAccessibility(property.SetMethod, options); + memberAccessibility = (Accessibility)Math.Max((int)getterAccessibility, (int)setterAccessibility); + } + + public ScopedWhereUsedAnalyzer(IDsDocumentService documentService, EventDef eventDef, Func> typeAnalysisFunction, ScopedWhereUsedAnalyzerOptions options = ScopedWhereUsedAnalyzerOptions.None) + : this(documentService, eventDef.DeclaringType, typeAnalysisFunction, options) { + var adderAccessibility = eventDef.AddMethod is null ? Accessibility.Private : GetMethodAccessibility(eventDef.AddMethod, options); + var removerAccessibility = eventDef.RemoveMethod is null ? Accessibility.Private : GetMethodAccessibility(eventDef.RemoveMethod, options); + var invokerAccessibility = eventDef.InvokeMethod is null ? Accessibility.Private : GetMethodAccessibility(eventDef.InvokeMethod, options); + memberAccessibility = (Accessibility)Math.Max(Math.Max((int)adderAccessibility, (int)removerAccessibility), (int)invokerAccessibility); + } + + public ScopedWhereUsedAnalyzer(IDsDocumentService documentService, FieldDef field, Func> typeAnalysisFunction, ScopedWhereUsedAnalyzerOptions options = ScopedWhereUsedAnalyzerOptions.None) + : this(documentService, field.DeclaringType, typeAnalysisFunction, options) { + switch ((options & ScopedWhereUsedAnalyzerOptions.ForcePublic) != 0 ? FieldAttributes.Public : field.Attributes & FieldAttributes.FieldAccessMask) { + case FieldAttributes.Private: + default: + memberAccessibility = Accessibility.Private; + break; + case FieldAttributes.FamANDAssem: + memberAccessibility = Accessibility.FamilyAndInternal; + break; + case FieldAttributes.Assembly: + memberAccessibility = Accessibility.Internal; + break; + case FieldAttributes.PrivateScope: + case FieldAttributes.Family: + memberAccessibility = Accessibility.Family; + break; + case FieldAttributes.FamORAssem: + memberAccessibility = Accessibility.FamilyOrInternal; + break; + case FieldAttributes.Public: + memberAccessibility = Accessibility.Public; + break; + } + } + + Accessibility GetMethodAccessibility(MethodDef method, ScopedWhereUsedAnalyzerOptions options) { + if (method is null) + return 0; + if ((options & ScopedWhereUsedAnalyzerOptions.ForcePublic) != 0) + return Accessibility.Public; + Accessibility accessibility; + switch (method.Attributes & MethodAttributes.MemberAccessMask) { + case MethodAttributes.Private: + default: + accessibility = Accessibility.Private; + break; + case MethodAttributes.FamANDAssem: + accessibility = Accessibility.FamilyAndInternal; + break; + case MethodAttributes.PrivateScope: + case MethodAttributes.Family: + accessibility = Accessibility.Family; + break; + case MethodAttributes.Assembly: + accessibility = Accessibility.Internal; + break; + case MethodAttributes.FamORAssem: + accessibility = Accessibility.FamilyOrInternal; + break; + case MethodAttributes.Public: + accessibility = Accessibility.Public; + break; + } + return accessibility; + } + + public IEnumerable PerformAnalysis(CancellationToken ct) { + if (memberAccessibility == Accessibility.Private) { + return FindReferencesInTypeScope(ct); + } + + DetermineTypeAccessibility(); + + if (typeAccessibility == Accessibility.Private) { + return FindReferencesInEnclosingTypeScope(ct); + } + + if (memberAccessibility == Accessibility.Internal || + memberAccessibility == Accessibility.FamilyAndInternal || + typeAccessibility == Accessibility.Internal || + typeAccessibility == Accessibility.FamilyAndInternal) + return FindReferencesInAssemblyAndFriends(ct); + + return FindReferencesGlobal(ct); + } + + void DetermineTypeAccessibility() { + while (typeScope.IsNested) { + Accessibility accessibility = GetNestedTypeAccessibility(typeScope); + if ((int)typeAccessibility > (int)accessibility) { + typeAccessibility = accessibility; + if (typeAccessibility == Accessibility.Private) + return; + } + typeScope = typeScope.DeclaringType; + } + + if (GetTypeAccessibility(typeScope) == Accessibility.Internal && + ((int)typeAccessibility > (int)Accessibility.Internal)) { + typeAccessibility = Accessibility.Internal; + } + } + + Accessibility GetTypeAccessibility(TypeDef type) { + if ((options & ScopedWhereUsedAnalyzerOptions.ForcePublic) != 0) + return Accessibility.Public; + return type.IsNotPublic ? Accessibility.Internal : Accessibility.Public; + } + + Accessibility GetNestedTypeAccessibility(TypeDef type) { + if ((options & ScopedWhereUsedAnalyzerOptions.ForcePublic) != 0) + return Accessibility.Public; + Accessibility result; + switch (type.Attributes & TypeAttributes.VisibilityMask) { + case TypeAttributes.NestedPublic: + result = Accessibility.Public; + break; + case TypeAttributes.NestedPrivate: + result = Accessibility.Private; + break; + case TypeAttributes.NestedFamily: + result = Accessibility.Family; + break; + case TypeAttributes.NestedAssembly: + result = Accessibility.Internal; + break; + case TypeAttributes.NestedFamANDAssem: + result = Accessibility.FamilyAndInternal; + break; + case TypeAttributes.NestedFamORAssem: + result = Accessibility.FamilyOrInternal; + break; + default: + throw new InvalidOperationException(); + } + return result; + } + + /// + /// The effective accessibility of a member + /// + enum Accessibility { + Private, + FamilyAndInternal, + Internal, + Family, + FamilyOrInternal, + Public + } + + IEnumerable FindReferencesInAssemblyAndFriends(CancellationToken ct) { + IEnumerable modules; + if ((options & ScopedWhereUsedAnalyzerOptions.IncludeAllModules) != 0) + modules = documentService.GetDocuments().Select(a => a.ModuleDef).OfType(); + else if (TIAHelper.IsTypeDefEquivalent(analyzedType)) { + var analyzedTypes = new List { analyzedType }; + SearchNode.AddTypeEquivalentTypes(documentService, analyzedType, analyzedTypes); + modules = SearchNode.GetTypeEquivalentModules(analyzedTypes); + } + else + modules = GetModuleAndAnyFriends(analyzedType.Module, ct); + allModules.AddRange(modules); + return allModules.AsParallel().WithCancellation(ct).SelectMany(a => FindReferencesInModule(a, ct)); + } + + IEnumerable FindReferencesGlobal(CancellationToken ct) { + IEnumerable modules; + if ((options & ScopedWhereUsedAnalyzerOptions.IncludeAllModules) != 0) + modules = documentService.GetDocuments().Select(a => a.ModuleDef).OfType(); + else if (TIAHelper.IsTypeDefEquivalent(analyzedType)) { + var analyzedTypes = new List { analyzedType }; + SearchNode.AddTypeEquivalentTypes(documentService, analyzedType, analyzedTypes); + modules = SearchNode.GetTypeEquivalentModules(analyzedTypes); + } + else + modules = GetReferencingModules(analyzedType.Module, ct); + allModules.AddRange(modules); + return allModules.AsParallel().WithCancellation(ct).SelectMany(a => FindReferencesInModule(a, ct)); + } + + IEnumerable FindReferencesInModule(ModuleDef mod, CancellationToken ct) { + foreach (TypeDef type in TreeTraversal.PreOrder(mod.Types, t => t.NestedTypes)) { + ct.ThrowIfCancellationRequested(); + foreach (var result in typeAnalysisFunction(type)) { + ct.ThrowIfCancellationRequested(); + yield return result; + } + } + } + + IEnumerable FindReferencesInTypeScope(CancellationToken ct) { + foreach (TypeDef type in TreeTraversal.PreOrder(typeScope, t => t.NestedTypes)) { + ct.ThrowIfCancellationRequested(); + foreach (var result in typeAnalysisFunction(type)) { + ct.ThrowIfCancellationRequested(); + yield return result; + } + } + } + + IEnumerable FindReferencesInEnclosingTypeScope(CancellationToken ct) { + foreach (TypeDef type in TreeTraversal.PreOrder(typeScope.DeclaringType, t => t.NestedTypes)) { + ct.ThrowIfCancellationRequested(); + foreach (var result in typeAnalysisFunction(type)) { + ct.ThrowIfCancellationRequested(); + yield return result; + } + } + } + + IEnumerable GetReferencingModules(ModuleDef mod, CancellationToken ct) { + var asm = mod.Assembly; + if (asm is null) { + yield return mod; + yield break; + } + foreach (var m in mod.Assembly.Modules) + yield return m; + + var modules = documentService.GetDocuments().Where(a => SearchNode.CanIncludeModule(mod, a.ModuleDef)); + + foreach (var module in modules) { + Debug2.Assert(module.ModuleDef is not null); + ct.ThrowIfCancellationRequested(); + if (ModuleReferencesScopeType(module.ModuleDef)) + yield return module.ModuleDef; + } + } + + IEnumerable GetModuleAndAnyFriends(ModuleDef mod, CancellationToken ct) { + var asm = mod.Assembly; + if (asm is null) { + yield return mod; + yield break; + } + foreach (var m in mod.Assembly.Modules) + yield return m; + + var friendAssemblies = SearchNode.GetFriendAssemblies(documentService, mod, out var modules); + if (friendAssemblies.Count > 0) { + foreach (var module in modules) { + Debug2.Assert(module.ModuleDef is not null); + ct.ThrowIfCancellationRequested(); + if ((module.AssemblyDef is null || friendAssemblies.Contains(module.AssemblyDef.Name)) && ModuleReferencesScopeType(module.ModuleDef)) + yield return module.ModuleDef; + } + } + } + + bool ModuleReferencesScopeType(ModuleDef mod) { + foreach (var typeRef in mod.GetTypeRefs()) { + if (new SigComparer().Equals(typeScope, typeRef)) + return true; + } + foreach (var exportedType in mod.ExportedTypes) { + if (!exportedType.MovedToAnotherAssembly) + continue; + if (new SigComparer().Equals(typeScope, exportedType)) + return true; + } + return false; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/SearchNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/SearchNode.cs new file mode 100644 index 0000000..279b7a0 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/SearchNode.cs @@ -0,0 +1,182 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + /// + /// Base class for analyzer nodes that perform a search. + /// + abstract class SearchNode : AnalyzerTreeNodeData, IAsyncCancellable { + protected SearchNode() { + } + + public override void Initialize() => TreeNode.LazyLoading = true; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => DsImages.Search; + + public override IEnumerable CreateChildren() { + Debug2.Assert(asyncFetchChildrenHelper is null); + asyncFetchChildrenHelper = new AsyncFetchChildrenHelper(this, () => asyncFetchChildrenHelper = null); + yield break; + } + AsyncFetchChildrenHelper? asyncFetchChildrenHelper; + + protected abstract IEnumerable FetchChildren(CancellationToken ct); + internal IEnumerable FetchChildrenInternal(CancellationToken token) => FetchChildren(token); + + public override void OnIsVisibleChanged() { + if (!TreeNode.IsVisible && asyncFetchChildrenHelper is not null && !asyncFetchChildrenHelper.CompletedSuccessfully) { + CancelAndClearChildren(); + TreeNode.LazyLoading = true; + } + } + + public override void OnIsExpandedChanged(bool isExpanded) { + if (!isExpanded && asyncFetchChildrenHelper is not null && !asyncFetchChildrenHelper.CompletedSuccessfully) { + CancelAndClearChildren(); + TreeNode.LazyLoading = true; + } + } + + public override bool HandleAssemblyListChanged(IDsDocument[] removedAssemblies, IDsDocument[] addedAssemblies) { + // only cancel a running analysis if user has manually added/removed assemblies + bool manualAdd = false; + foreach (var asm in addedAssemblies) { + if (!asm.IsAutoLoaded) + manualAdd = true; + } + if (removedAssemblies.Length > 0 || manualAdd) { + CancelAndClearChildren(); + } + return true; + } + + public override bool HandleModelUpdated(IDsDocument[] documents) { + CancelAndClearChildren(); + return true; + } + + void CancelAndClearChildren() { + AnalyzerTreeNodeData.CancelSelfAndChildren(this); + TreeNode.Children.Clear(); + TreeNode.LazyLoading = true; + } + + public void Cancel() { + asyncFetchChildrenHelper?.Cancel(); + asyncFetchChildrenHelper = null; + } + + internal static bool CanIncludeModule(ModuleDef targetModule, ModuleDef? module) { + if (module is null) + return false; + if (targetModule == module) + return false; + if (targetModule.Assembly is not null && targetModule.Assembly == module.Assembly) + return false; + return true; + } + + internal static HashSet GetFriendAssemblies(IDsDocumentService documentService, ModuleDef mod, out IDsDocument[] modules) { + var asm = mod.Assembly; + Debug2.Assert(asm is not null); + var friendAssemblies = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (var attribute in asm.CustomAttributes.FindAll("System.Runtime.CompilerServices.InternalsVisibleToAttribute")) { + if (attribute.ConstructorArguments.Count == 0) + continue; + string assemblyName = attribute.ConstructorArguments[0].Value as UTF8String; + if (assemblyName is null) + continue; + assemblyName = new AssemblyNameInfo(assemblyName).Name; + friendAssemblies.Add(assemblyName); + } + modules = documentService.GetDocuments().Where(a => CanIncludeModule(mod, a.ModuleDef)).ToArray(); + foreach (var module in modules) { + Debug2.Assert(module.ModuleDef is not null); + var asm2 = module.AssemblyDef; + if (asm2 is null) + continue; + foreach (var attribute in asm2.CustomAttributes.FindAll("System.Runtime.CompilerServices.IgnoresAccessChecksToAttribute")) { + string assemblyName = attribute.ConstructorArguments[0].Value as UTF8String; + if (assemblyName is null) + continue; + assemblyName = new AssemblyNameInfo(assemblyName).Name; + if (StringComparer.OrdinalIgnoreCase.Equals(asm.Name.String, assemblyName)) + friendAssemblies.Add(asm2.Name); + } + } + return friendAssemblies; + } + + internal static void AddTypeEquivalentTypes(IDsDocumentService documentService, TypeDef analyzedType, List analyzedTypes) { + Debug.Assert(analyzedTypes.Count == 1 && analyzedTypes[0] == analyzedType); + if (!TIAHelper.IsTypeDefEquivalent(analyzedType)) + return; + foreach (var document in documentService.GetDocuments().Where(a => a.ModuleDef is not null)) { + foreach (var type in GetTypeEquivalentTypes(document.AssemblyDef, document.ModuleDef, analyzedType)) { + if (type != analyzedType) + analyzedTypes.Add(type); + } + } + } + + static IEnumerable GetTypeEquivalentTypes(AssemblyDef? assembly, ModuleDef? module, TypeDef type) { + Debug.Assert(TIAHelper.IsTypeDefEquivalent(type)); + var typeRef = new ModuleDefUser("dummy").Import(type); + foreach (var mod in GetModules(assembly, module)) { + var otherType = mod.Find(typeRef); + if (otherType != type && TIAHelper.IsTypeDefEquivalent(otherType) && + new SigComparer().Equals(otherType, type) && + !new SigComparer(SigComparerOptions.DontCheckTypeEquivalence).Equals(otherType, type)) { + yield return otherType; + } + } + } + + static IEnumerable GetModules(AssemblyDef? assembly, ModuleDef? module) { + if (assembly is not null) { + foreach (var mod in assembly.Modules) + yield return mod; + } + else { + if (module is not null) + yield return module; + } + } + + protected static IEnumerable<(ModuleDef module, ITypeDefOrRef type)> GetTypeEquivalentModulesAndTypes(List analyzedTypes) { + foreach (var type in analyzedTypes) + yield return (type.Module, type); + } + + internal static IEnumerable GetTypeEquivalentModules(List analyzedTypes) { + foreach (var type in analyzedTypes) + yield return type.Module; + } + + protected static bool CheckEquals(IMemberRef? mr1, IMemberRef? mr2) => Helpers.CheckEquals(mr1, mr2); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/SourceRef.cs b/Extensions/dnSpy.Analyzer/TreeNodes/SourceRef.cs new file mode 100644 index 0000000..75aa8fa --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/SourceRef.cs @@ -0,0 +1,33 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using dnlib.DotNet; + +namespace dnSpy.Analyzer.TreeNodes { + readonly struct SourceRef { + public MethodDef Method { get; } + public uint? ILOffset { get; } + public IMDTokenProvider? Reference { get; } + public SourceRef(MethodDef method, uint? offset, IMDTokenProvider? reference) { + Method = method; + ILOffset = offset; + Reference = reference; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TIAHelper.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TIAHelper.cs new file mode 100644 index 0000000..6f51083 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TIAHelper.cs @@ -0,0 +1,221 @@ +// dnlib: See LICENSE.txt for more info + +// See coreclr/src/vm/siginfo.cpp + +using System; +using System.Diagnostics; + +namespace dnlib.DotNet { + /// + /// System.Runtime.InteropServices.TypeIdentifierAttribute helper code used by + /// + static class TIAHelper { + readonly struct Info : IEquatable { + public readonly UTF8String? Scope; + public readonly UTF8String? Identifier; + + public Info(UTF8String? scope, UTF8String? identifier) { + Scope = scope; + Identifier = identifier; + } + + public bool Equals(Info other) => stricmp(Scope, other.Scope) && UTF8String.Equals(Identifier, other.Identifier); + + static bool stricmp(UTF8String? a, UTF8String? b) { + var da = a?.Data; + var db = b?.Data; + if (da == db) + return true; + if (da == null || db == null) + return false; + if (da.Length != db.Length) + return false; + for (int i = 0; i < da.Length; i++) { + byte ba = da[i], bb = db[i]; + if ((byte)'A' <= ba && ba <= (byte)'Z') + ba = (byte)(ba - 'A' + 'a'); + if ((byte)'A' <= bb && bb <= (byte)'Z') + bb = (byte)(bb - 'A' + 'a'); + if (ba != bb) + return false; + } + return true; + } + } + + static Info? GetInfo(TypeDef td) { + if (td == null) + return null; + if (td.IsWindowsRuntime) + return null; + + UTF8String? scope = null, identifier = null; + var tia = td.CustomAttributes.Find("System.Runtime.InteropServices.TypeIdentifierAttribute"); + if (tia != null) { + if (tia.ConstructorArguments.Count >= 2) { + if (tia.ConstructorArguments[0].Type.GetElementType() != ElementType.String) + return null; + if (tia.ConstructorArguments[1].Type.GetElementType() != ElementType.String) + return null; + scope = tia.ConstructorArguments[0].Value as UTF8String ?? tia.ConstructorArguments[0].Value as string; + identifier = tia.ConstructorArguments[1].Value as UTF8String ?? tia.ConstructorArguments[1].Value as string; + } + } + else { + var asm = td.Module?.Assembly; + if (asm == null) + return null; + bool isTypeLib = asm.CustomAttributes.IsDefined("System.Runtime.InteropServices.ImportedFromTypeLibAttribute") || + asm.CustomAttributes.IsDefined("System.Runtime.InteropServices.PrimaryInteropAssemblyAttribute"); + if (!isTypeLib) + return null; + } + + if (UTF8String.IsNull(identifier)) { + CustomAttribute gca; + if (td.IsInterface && td.IsImport) + gca = td.CustomAttributes.Find("System.Runtime.InteropServices.GuidAttribute"); + else { + var asm = td.Module?.Assembly; + if (asm == null) + return null; + gca = asm.CustomAttributes.Find("System.Runtime.InteropServices.GuidAttribute"); + } + if (gca == null) + return null; + if (gca.ConstructorArguments.Count < 1) + return null; + if (gca.ConstructorArguments[0].Type.GetElementType() != ElementType.String) + return null; + scope = gca.ConstructorArguments[0].Value as UTF8String ?? gca.ConstructorArguments[0].Value as string; + var ns = td.Namespace; + var name = td.Name; + if (UTF8String.IsNullOrEmpty(ns)) + identifier = name; + else if (UTF8String.IsNullOrEmpty(name)) + identifier = new UTF8String(Concat(ns.Data, (byte)'.', Array.Empty())); + else + identifier = new UTF8String(Concat(ns.Data, (byte)'.', name.Data)); + } + return new Info(scope, identifier); + } + + static byte[] Concat(byte[] a, byte b, byte[] c) { + var data = new byte[a.Length + 1 + c.Length]; + for (int i = 0; i < a.Length; i++) + data[i] = a[i]; + data[a.Length] = b; + for (int i = 0, j = a.Length + 1; i < c.Length; i++, j++) + data[j] = c[i]; + return data; + } + + internal static bool IsTypeDefEquivalent(TypeDef td) => GetInfo(td) != null && CheckEquivalent(td); + + static bool CheckEquivalent(TypeDef td) { + Debug2.Assert(td != null); + + for (int i = 0; td != null && i < 1000; i++) { + if (i != 0) { + var info = GetInfo(td); + if (info == null) + return false; + } + + bool f; + if (td.IsInterface) + f = td.IsImport || td.CustomAttributes.IsDefined("System.Runtime.InteropServices.ComEventInterfaceAttribute"); + else + f = td.IsValueType || td.IsDelegate; + if (!f) + return false; + if (td.GenericParameters.Count > 0) + return false; + + var declType = td.DeclaringType; + if (declType == null) + return td.IsPublic; + + if (!td.IsNestedPublic) + return false; + td = declType; + } + + return false; + } + + public static bool Equivalent(TypeDef td1, TypeDef td2) { + var info1 = GetInfo(td1); + if (info1 == null) + return false; + var info2 = GetInfo(td2); + if (info2 == null) + return false; + if (!CheckEquivalent(td1) || !CheckEquivalent(td2)) + return false; + if (!info1.Value.Equals(info2.Value)) + return false; + + // Caller has already compared names of the types and any declaring types + + for (int i = 0; i < 1000; i++) { + if (td1.IsInterface) { + if (!td2.IsInterface) + return false; + } + else { + var bt1 = td1.BaseType; + var bt2 = td2.BaseType; + if (bt1 == null || bt2 == null) + return false; + if (td1.IsDelegate) { + if (!td2.IsDelegate) + return false; + if (!DelegateEquals(td1, td2)) + return false; + } + else if (td1.IsValueType) { + if (td1.IsEnum != td2.IsEnum) + return false; + if (!td2.IsValueType) + return false; + if (!ValueTypeEquals(td1, td2, td1.IsEnum)) + return false; + } + else + return false; + } + + td1 = td1.DeclaringType; + td2 = td2.DeclaringType; + if (td1 == null && td2 == null) + break; + if (td1 == null || td2 == null) + return false; + } + + return true; + } + + static bool DelegateEquals(TypeDef td1, TypeDef td2) { + var invoke1 = td1.FindMethod(InvokeString); + var invoke2 = td2.FindMethod(InvokeString); + if (invoke1 == null || invoke2 == null) + return false; + + //TODO: Compare method signatures. Prevent infinite recursion... + + return true; + } + static readonly UTF8String InvokeString = new UTF8String("Invoke"); + + static bool ValueTypeEquals(TypeDef td1, TypeDef td2, bool isEnum) { + if (td1.Methods.Count != 0 || td2.Methods.Count != 0) + return false; + + //TODO: Compare the fields. Prevent infinite recursion... + + return true; + } + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TypeExposedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TypeExposedByNode.cs new file mode 100644 index 0000000..5705918 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TypeExposedByNode.cs @@ -0,0 +1,233 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class TypeExposedByNode : SearchNode { + readonly TypeDef analyzedType; + Guid comGuid; + bool isComType; + + public TypeExposedByNode(TypeDef analyzedType) => this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.ExposedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + bool includeAllModules; + isComType = ComUtils.IsComType(analyzedType, out comGuid); + includeAllModules = isComType; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (isComType) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedType, FindReferencesInType, options); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (analyzedType.IsEnum && new SigComparer().Equals(type, analyzedType)) + yield break; + + foreach (FieldDef field in type.Fields) { + if (TypeIsExposedBy(field)) { + yield return new FieldNode(field) { Context = Context }; + } + } + + foreach (PropertyDef property in type.Properties) { + if (TypeIsExposedBy(property)) { + yield return new PropertyNode(property) { Context = Context }; + } + } + + foreach (EventDef eventDef in type.Events) { + if (TypeIsExposedBy(eventDef)) { + yield return new EventNode(eventDef) { Context = Context }; + } + } + + foreach (MethodDef method in type.Methods) { + if (TypeIsExposedBy(method)) { + yield return new MethodNode(method) { Context = Context }; + } + } + } + + bool CheckType(IType? type) => CheckType(type, 0); + + const int maxRecursion = 20; + bool CheckType(IType? type, int recursionCounter) { + if (recursionCounter > maxRecursion) + return false; + if (type is TypeSig ts) + return CheckType(ts, recursionCounter + 1); + if (type is TypeSpec typeSpec) + return CheckType(typeSpec.TypeSig, recursionCounter + 1); + if (isComType && type.Resolve() is TypeDef td && ComUtils.ComEquals(td, ref comGuid)) + return true; + return new SigComparer().Equals(analyzedType, type); + } + + bool CheckType(TypeSig? sig, int recursionCounter) { + if (recursionCounter > maxRecursion) + return false; + if (sig is null) + return false; + switch (sig.ElementType) { + case ElementType.Void: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Void); + case ElementType.Boolean: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Boolean); + case ElementType.Char: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Char); + case ElementType.I1: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.SByte); + case ElementType.U1: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Byte); + case ElementType.I2: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Int16); + case ElementType.U2: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.UInt16); + case ElementType.I4: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Int32); + case ElementType.U4: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.UInt32); + case ElementType.I8: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Int64); + case ElementType.U8: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.UInt64); + case ElementType.R4: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Single); + case ElementType.R8: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Double); + case ElementType.String: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.String); + case ElementType.TypedByRef:return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.TypedReference); + case ElementType.I: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.IntPtr); + case ElementType.U: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.UIntPtr); + case ElementType.Object: return new SigComparer().Equals(analyzedType, analyzedType.Module.CorLibTypes.Object); + + case ElementType.Ptr: + case ElementType.ByRef: + case ElementType.Array: + case ElementType.SZArray: + case ElementType.ValueArray: + case ElementType.Module: + case ElementType.Pinned: + return CheckType(sig.Next, recursionCounter + 1); + + case ElementType.CModReqd: + case ElementType.CModOpt: + return CheckType(((ModifierSig)sig).Modifier, recursionCounter + 1) || CheckType(sig.Next, recursionCounter + 1); + + case ElementType.ValueType: + case ElementType.Class: + return CheckType(((TypeDefOrRefSig)sig).TypeDefOrRef, recursionCounter + 1); + + case ElementType.GenericInst: + if (CheckType(((GenericInstSig)sig).GenericType?.TypeDefOrRef, recursionCounter + 1)) + return true; + foreach (var genericArg in ((GenericInstSig)sig).GenericArguments) { + if (CheckType(genericArg, recursionCounter + 1)) + return true; + } + return false; + + case ElementType.FnPtr: + return TypeIsExposedBy(((FnPtrSig)sig).MethodSig, recursionCounter + 1); + + case ElementType.End: + case ElementType.Var: + case ElementType.R: + case ElementType.MVar: + case ElementType.Internal: + case ElementType.Sentinel: + default: + return false; + } + } + + bool TypeIsExposedBy(FieldDef field) { + if (field.IsPrivate) + return false; + + return CheckType(field.FieldType); + } + + bool TypeIsExposedBy(PropertyDef property) { + if (IsPrivate(property)) + return false; + + return TypeIsExposedBy(property.PropertySig); + } + + bool TypeIsExposedBy(EventDef eventDef) { + if (IsPrivate(eventDef)) + return false; + + return CheckType(eventDef.EventType); + } + + bool TypeIsExposedBy(MethodDef method) { + // if the method has overrides, it is probably an explicit interface member + // and should be considered part of the public API even though it is marked private. + if (method.IsPrivate) { + if (!method.HasOverrides) + return false; + var methDecl = method.Overrides[0].MethodDeclaration; + var typeDef = methDecl?.DeclaringType?.ResolveTypeDef(); + if (typeDef is not null && !typeDef.IsInterface) + return false; + } + + // exclude methods with 'semantics'. for example, property getters & setters. + // HACK: this is a potentially fragile implementation, as the MethodSemantics may be extended to other uses at a later date. + if (method.SemanticsAttributes != MethodSemanticsAttributes.None) + return false; + + return TypeIsExposedBy(method.MethodSig); + } + + bool TypeIsExposedBy(MethodBaseSig? methodSig) => TypeIsExposedBy(methodSig, 0); + + bool TypeIsExposedBy(MethodBaseSig? methodSig, int recursionCounter) { + if (recursionCounter > maxRecursion) + return false; + if (methodSig is null) + return false; + + if (CheckType(methodSig.RetType)) + return true; + foreach (var type in methodSig.Params) { + if (CheckType(type)) + return true; + } + return false; + } + + static bool IsPrivate(PropertyDef property) { + bool isGetterPublic = (property.GetMethod is not null && !property.GetMethod.IsPrivate); + bool isSetterPublic = (property.SetMethod is not null && !property.SetMethod.IsPrivate); + return !(isGetterPublic || isSetterPublic); + } + + static bool IsPrivate(EventDef eventDef) { + bool isAdderPublic = (eventDef.AddMethod is not null && !eventDef.AddMethod.IsPrivate); + bool isRemoverPublic = (eventDef.RemoveMethod is not null && !eventDef.RemoveMethod.IsPrivate); + bool isInvokerPublic = (eventDef.InvokeMethod is not null && !eventDef.InvokeMethod.IsPrivate); + return !(isAdderPublic || isRemoverPublic || isInvokerPublic); + } + + public static bool CanShow(TypeDef type) => !(type.IsAbstract && type.IsSealed); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TypeExtensionMethodsNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TypeExtensionMethodsNode.cs new file mode 100644 index 0000000..0778945 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TypeExtensionMethodsNode.cs @@ -0,0 +1,81 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class TypeExtensionMethodsNode : SearchNode { + readonly TypeDef analyzedType; + Guid comGuid; + bool isComType; + + public TypeExtensionMethodsNode(TypeDef analyzedType) => this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.ExtensionMethodsTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + bool includeAllModules; + isComType = ComUtils.IsComType(analyzedType, out comGuid); + includeAllModules = isComType; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (isComType) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedType, FindReferencesInType, options); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + if (!HasExtensionAttribute(type)) + yield break; + foreach (MethodDef method in type.Methods) { + if (method.IsStatic && HasExtensionAttribute(method)) { + int skip = GetParametersSkip(method.Parameters); + if (method.Parameters.Count <= skip) + continue; + var paramType = method.Parameters[skip].Type?.GetScopeType(); + if (new SigComparer().Equals(analyzedType, paramType) || + (isComType && paramType.Resolve() is TypeDef td && ComUtils.ComEquals(td, ref comGuid))) { + yield return new MethodNode(method) { Context = Context }; + } + } + } + } + + static int GetParametersSkip(IList parameters) { + if (parameters is null || parameters.Count == 0) + return 0; + if (parameters[0].IsHiddenThisParameter) + return 1; + return 0; + } + + bool HasExtensionAttribute(IHasCustomAttribute p) => p.CustomAttributes.Find("System.Runtime.CompilerServices.ExtensionAttribute") is not null; + + // show on all types except static classes + public static bool CanShow(TypeDef type) => !(type.IsAbstract && type.IsSealed); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TypeInstantiationsNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TypeInstantiationsNode.cs new file mode 100644 index 0000000..f43fb2b --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TypeInstantiationsNode.cs @@ -0,0 +1,74 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class TypeInstantiationsNode : SearchNode { + readonly TypeDef analyzedType; + readonly bool isSystemObject; + + public TypeInstantiationsNode(TypeDef analyzedType) { + this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + isSystemObject = analyzedType.DefinitionAssembly.IsCorLib() && analyzedType.FullName == "System.Object"; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.InstantiatedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedType, FindReferencesInType); + return analyzer.PerformAnalysis(ct); + } + + IEnumerable FindReferencesInType(TypeDef type) { + foreach (MethodDef method in type.Methods) { + if (!method.HasBody) + continue; + + // ignore chained constructors + // (since object is the root of everything, we can short circuit the test in this case) + if (method.Name == ".ctor" && + (isSystemObject || new SigComparer().Equals(analyzedType, type) || TypesHierarchyHelpers.IsBaseType(analyzedType, type, false))) + continue; + + Instruction? foundInstr = null; + foreach (Instruction instr in method.Body.Instructions) { + if (instr.Operand is IMethod mr && !mr.IsField && mr.Name == ".ctor") { + if (Helpers.IsReferencedBy(analyzedType, mr.DeclaringType)) { + foundInstr = instr; + break; + } + } + } + + if (foundInstr is not null) + yield return new MethodNode(method) { Context = Context, SourceRef = new SourceRef(method, foundInstr.Offset, foundInstr.Operand as IMDTokenProvider) }; + } + } + + public static bool CanShow(TypeDef type) => type.IsClass && !type.IsAbstract && !type.IsEnum; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TypeNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TypeNode.cs new file mode 100644 index 0000000..51d0f96 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TypeNode.cs @@ -0,0 +1,59 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using dnlib.DotNet; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Text; +using dnSpy.Contracts.TreeView; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class TypeNode : EntityNode { + readonly TypeDef analyzedType; + + public TypeNode(TypeDef analyzedType) => this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + + public override void Initialize() => TreeNode.LazyLoading = true; + protected override ImageReference GetIcon(IDotNetImageService dnImgMgr) => dnImgMgr.GetImageReference(analyzedType); + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + new NodeFormatter().Write(output, decompiler, analyzedType, Context.ShowToken); + + public override IEnumerable CreateChildren() { + if (AttributeAppliedToNode.CanShow(analyzedType)) + yield return new AttributeAppliedToNode(analyzedType); + + if (TypeInstantiationsNode.CanShow(analyzedType)) + yield return new TypeInstantiationsNode(analyzedType); + + if (TypeUsedByNode.CanShow(analyzedType)) + yield return new TypeUsedByNode(analyzedType); + + if (TypeExposedByNode.CanShow(analyzedType)) + yield return new TypeExposedByNode(analyzedType); + + if (TypeExtensionMethodsNode.CanShow(analyzedType)) + yield return new TypeExtensionMethodsNode(analyzedType); + } + + public override IMemberRef? Member => analyzedType; + public override IMDTokenProvider? Reference => analyzedType; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/TypeUsedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/TypeUsedByNode.cs new file mode 100644 index 0000000..4bb5b0c --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/TypeUsedByNode.cs @@ -0,0 +1,361 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class TypeUsedByNode : SearchNode { + readonly TypeDef analyzedType; + Guid comGuid; + bool isComType; + HashSet? allTypes; + + public TypeUsedByNode(TypeDef analyzedType) => + this.analyzedType = analyzedType ?? throw new ArgumentNullException(nameof(analyzedType)); + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.UsedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + allTypes = new HashSet(); + allTypes.Add(analyzedType); + + bool includeAllModules = CustomAttributesUtils.IsPseudoCustomAttributeType(analyzedType) || + CustomAttributesUtils.IsPseudoCustomAttributeOtherType(analyzedType); + isComType = ComUtils.IsComType(analyzedType, out comGuid); + includeAllModules |= isComType; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (isComType) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedType, FindTypeUsage, options); + var result = analyzer.PerformAnalysis(ct) + .Cast() + .Where(n => !allTypes.Contains(n.Member!.DeclaringType)) + .Distinct(AnalyzerEntityTreeNodeComparer.Instance) + .Concat(FindGlobalUsage(analyzer.AllModules)); + foreach (var n in result) + yield return n; + + allTypes = null; + } + + IEnumerable FindGlobalUsage(List allModules) { + var analyzedAssemblies = new HashSet(); + foreach (var module in allModules) { + bool analyzedTypeIsExported = false; + foreach (var et in module.ExportedTypes) { + if (et.MovedToAnotherAssembly && et.Name == analyzedType.Name && et.Namespace == analyzedType.Namespace && et.Resolve() == analyzedType) { + analyzedTypeIsExported = true; + break; + } + } + if (module.Assembly is AssemblyDef asm && analyzedAssemblies.Add(asm)) { + if (analyzedTypeIsExported || IsUsedInCustomAttributes(asm)) + yield return new AssemblyNode(asm) { Context = Context }; + } + if (IsUsedInCustomAttributes(module)) + yield return new ModuleNode(module) { Context = Context }; + } + } + + IEnumerable FindTypeUsage(TypeDef? type) { + if (type is null) + yield break; + if (new SigComparer().Equals(type, analyzedType)) + yield break; + if (isComType && ComUtils.ComEquals(type, ref comGuid)) { + Debug2.Assert(allTypes is not null); + lock (allTypes) + allTypes.Add(type); + yield break; + } + + if (IsUsedInTypeDef(type)) + yield return new TypeNode(type) { Context = Context }; + + foreach (var field in type.Fields.Where(IsUsedInFieldDef)) + yield return new FieldNode(field) { Context = Context }; + + foreach (var method in type.Methods) { + SourceRef? sourceRef = null; + if (IsUsedInMethodDef(method, ref sourceRef)) + yield return HandleSpecialMethodNode(method, sourceRef); + } + + foreach (var property in type.Properties) { + if (IsUsedInCustomAttributes(property)) + yield return new PropertyNode(property) { Context = Context }; + } + + foreach (var @event in type.Events) { + if (IsUsedInCustomAttributes(@event)) + yield return new EventNode(@event) { Context = Context }; + } + } + + EntityNode HandleSpecialMethodNode(MethodDef method, SourceRef? sourceRef) { + var property = method.DeclaringType.Properties.FirstOrDefault(p => (object?)p.GetMethod == method || (object?)p.SetMethod == method); + if (property is not null) + return new PropertyNode(property) { Context = Context, SourceRef = sourceRef }; + + var @event = method.DeclaringType.Events.FirstOrDefault(p => (object?)p.AddMethod == method || (object?)p.RemoveMethod == method || (object?)p.InvokeMethod == method); + if (@event is not null) + return new EventNode(@event) { Context = Context, SourceRef = sourceRef }; + + return new MethodNode(method) { Context = Context, SourceRef = sourceRef }; + } + + bool IsUsedInTypeRefs(IEnumerable types) => types.Any(IsUsedInTypeRef); + + bool IsUsedInTypeRef(ITypeDefOrRef? type) { + if (type is null) + return false; + + return TypeMatches(type.DeclaringType) + || TypeMatches(type); + } + + bool IsUsedInTypeDef(TypeDef? type) { + if (type is null) + return false; + + return IsUsedInTypeRef(type) + || TypeMatches(type.BaseType) + || IsUsedInTypeRefs(type.Interfaces.Select(ii => ii.Interface)) + || IsUsedInCustomAttributes(type); + } + + bool IsUsedInCustomAttributes(IHasCustomAttribute? hca) { + if (hca is null) + return false; + foreach (var ca in hca.GetCustomAttributes()) { + if (IsUsedInMethodRef(ca.Constructor)) + return true; + foreach (var arg in ca.ConstructorArguments) { + if (IsUsed(arg, 0)) + return true; + } + foreach (var arg in ca.NamedArguments) { + if (IsUsed(arg.Argument, 0)) + return true; + if (TypeMatches(arg.Type)) + return true; + } + } + return false; + } + + const int maxRecursion = 20; + bool IsUsed(CAArgument arg, int recursionCounter) { + if (recursionCounter > maxRecursion) + return false; + if (TypeMatches(arg.Type)) + return true; + return ValueMatches(arg.Value, recursionCounter + 1); + } + + bool ValueMatches(object? value, int recursionCounter) { + if (recursionCounter > maxRecursion) + return false; + if (value is null) + return false; + if (value is TypeSig ts) + return TypeMatches(ts); + if (value is CAArgument arg) + return IsUsed(arg, recursionCounter + 1); + if (value is IList args) { + for (int i = 0; i < args.Count; i++) { + if (IsUsed(args[i], recursionCounter + 1)) + return true; + } + return false; + } + return false; + } + + bool IsUsedInFieldDef(FieldDef field) => + IsUsedInFieldRef(field) || IsUsedInCustomAttributes(field); + + bool IsUsedInFieldRef(IField? field) { + if (field is null || !field.IsField) + return false; + + return TypeMatches(field.DeclaringType) + || TypeMatches(field.FieldSig.GetFieldType()); + } + + bool IsUsedInMethodRef(IMethod? method) { + if (method is null || !method.IsMethod) + return false; + + if (method is MethodSpec ms && ms.Instantiation is GenericInstMethodSig gims) { + foreach (var ga in gims.GenericArguments) { + if (TypeMatches(ga)) + return true; + } + } + + return TypeMatches(method.DeclaringType) + || TypeMatches(method.MethodSig.GetRetType()) + || IsUsedInMethodParameters(method.GetParameters()); + } + + bool IsUsedInMethodDef(MethodDef method, ref SourceRef? sourceRef) { + if (IsUsedInMethodRef(method) || IsUsedInMethodBody(method, ref sourceRef) || IsUsedInCustomAttributes(method)) + return true; + foreach (var pd in method.ParamDefs) { + if (IsUsedInCustomAttributes(pd)) + return true; + } + return false; + } + + bool IsUsedInMethodBody(MethodDef? method, ref SourceRef? sourceRef) { + if (method is null) + return false; + if (method.Body is null) + return false; + + foreach (var instruction in method.Body.Instructions) { + ITypeDefOrRef? tr = instruction.Operand as ITypeDefOrRef; + if (IsUsedInTypeRef(tr)) { + sourceRef = new SourceRef(method, instruction.Offset, instruction.Operand as IMDTokenProvider); + return true; + } + IField? fr = instruction.Operand as IField; + if (IsUsedInFieldRef(fr)) { + sourceRef = new SourceRef(method, instruction.Offset, instruction.Operand as IMDTokenProvider); + return true; + } + IMethod? mr = instruction.Operand as IMethod; + if (IsUsedInMethodRef(mr)) { + sourceRef = new SourceRef(method, instruction.Offset, instruction.Operand as IMDTokenProvider); + return true; + } + } + foreach (var local in method.Body.Variables) { + if (TypeMatches(local.Type)) { + sourceRef = new SourceRef(method, null, null); + return true; + } + } + foreach (var eh in method.Body.ExceptionHandlers) { + if (TypeMatches(eh.CatchType)) { + sourceRef = new SourceRef(method, null, null); + return true; + } + } + + return false; + } + + bool IsUsedInMethodParameters(IEnumerable parameters) => parameters.Any(IsUsedInMethodParameter); + bool IsUsedInMethodParameter(Parameter parameter) => !parameter.IsHiddenThisParameter && TypeMatches(parameter.Type); + + bool TypeMatches(IType? tref) => TypeMatches(tref, 0); + bool TypeMatches(IType? tref, int level) { + if (level >= 100) + return false; + if (isComType && tref.Resolve() is TypeDef td && ComUtils.ComEquals(td, ref comGuid)) + return true; + if (tref is not null) { + if (new SigComparer().Equals(analyzedType, tref.GetScopeType())) + return true; + if (tref is TypeSig ts) { + switch (ts) { + case TypeDefOrRefSig tdr: + if (TypeMatches(tdr.TypeDefOrRef, level + 1)) + return true; + break; + case FnPtrSig fnptr: + if (fnptr.MethodSig is MethodSig msig) { + if (TypeMatches(msig.RetType, level + 1)) + return true; + foreach (var p in msig.Params) { + if (TypeMatches(p, level + 1)) + return true; + } + if (msig.ParamsAfterSentinel is not null) { + foreach (var p in msig.ParamsAfterSentinel) { + if (TypeMatches(p, level + 1)) + return true; + } + } + } + break; + case GenericInstSig gis: + if (TypeMatches(gis.GenericType, level + 1)) + return true; + foreach (var ga in gis.GenericArguments) { + if (TypeMatches(ga, level + 1)) + return true; + } + break; + case PtrSig ps: + if (TypeMatches(ps.Next, level + 1)) + return true; + break; + case ByRefSig brs: + if (TypeMatches(brs.Next, level + 1)) + return true; + break; + case ArraySigBase asb: + if (TypeMatches(asb.Next, level + 1)) + return true; + break; + case ModifierSig ms: + if (TypeMatches(ms.Modifier, level + 1)) + return true; + if (TypeMatches(ms.Next, level + 1)) + return true; + break; + case PinnedSig ps: + if (TypeMatches(ps.Next, level + 1)) + return true; + break; + } + } + else if (tref is TypeSpec typeSpec) { + if (TypeMatches(typeSpec.TypeSig, level + 1)) + return true; + } + } + return false; + } + + public static bool CanShow(TypeDef? type) => type is not null; + } + + sealed class AnalyzerEntityTreeNodeComparer : IEqualityComparer { + public static readonly AnalyzerEntityTreeNodeComparer Instance = new AnalyzerEntityTreeNodeComparer(); + AnalyzerEntityTreeNodeComparer() { } + public bool Equals([AllowNull] EntityNode x, [AllowNull] EntityNode y) => (object?)x?.Member == y?.Member; + public int GetHashCode([DisallowNull] EntityNode node) => node.Member?.GetHashCode() ?? 0; + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeNodes/VirtualMethodUsedByNode.cs b/Extensions/dnSpy.Analyzer/TreeNodes/VirtualMethodUsedByNode.cs new file mode 100644 index 0000000..e3ff623 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeNodes/VirtualMethodUsedByNode.cs @@ -0,0 +1,164 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using dnlib.DotNet; +using dnlib.DotNet.Emit; +using dnSpy.Analyzer.Properties; +using dnSpy.Contracts.Decompiler; +using dnSpy.Contracts.Text; + +namespace dnSpy.Analyzer.TreeNodes { + sealed class VirtualMethodUsedByNode : SearchNode { + readonly MethodDef analyzedMethod; + readonly bool isSetter; + PropertyDef? property; + ConcurrentDictionary? foundMethods; + MethodDef? baseMethod; + Guid comGuid; + bool isComType; + int vtblIndex; + + public VirtualMethodUsedByNode(MethodDef analyzedMethod, bool isSetter) { + this.analyzedMethod = analyzedMethod ?? throw new ArgumentNullException(nameof(analyzedMethod)); + this.isSetter = isSetter; + } + + protected override void Write(ITextColorWriter output, IDecompiler decompiler) => + output.Write(BoxedTextColor.Text, dnSpy_Analyzer_Resources.UsedByTreeNode); + + protected override IEnumerable FetchChildren(CancellationToken ct) { + InitializeAnalyzer(); + + if (isSetter) + property = analyzedMethod.DeclaringType.Properties.FirstOrDefault(a => a.SetMethod == analyzedMethod); + + var includeAllModules = property is not null && CustomAttributesUtils.IsPseudoCustomAttributeType(analyzedMethod.DeclaringType); + ComUtils.GetMemberInfo(analyzedMethod, out isComType, out comGuid, out vtblIndex); + includeAllModules |= isComType; + var options = ScopedWhereUsedAnalyzerOptions.None; + if (includeAllModules) + options |= ScopedWhereUsedAnalyzerOptions.IncludeAllModules; + if (isComType) + options |= ScopedWhereUsedAnalyzerOptions.ForcePublic; + var analyzer = new ScopedWhereUsedAnalyzer(Context.DocumentService, analyzedMethod, FindReferencesInType, options); + foreach (var child in analyzer.PerformAnalysis(ct)) { + yield return child; + } + + if (property is not null) { + var hash = new HashSet(); + foreach (var module in analyzer.AllModules) { + if (module.Assembly is AssemblyDef asm && hash.Add(module.Assembly)) { + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, asm, property)) + yield return node; + } + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, module, property)) + yield return node; + } + } + + ReleaseAnalyzer(); + } + + void InitializeAnalyzer() { + foundMethods = new ConcurrentDictionary(); + + var baseMethods = TypesHierarchyHelpers.FindBaseMethods(analyzedMethod).ToArray(); + if (baseMethods.Length > 0) { + baseMethod = baseMethods[baseMethods.Length - 1]; + } + else + baseMethod = analyzedMethod; + } + + void ReleaseAnalyzer() { + foundMethods = null; + baseMethod = null; + } + + IEnumerable FindReferencesInType(TypeDef type) { + string name = analyzedMethod.Name; + foreach (MethodDef method in type.Methods) { + if (!method.HasBody) + continue; + Instruction? foundInstr = null; + foreach (Instruction instr in method.Body.Instructions) { + if (!(instr.Operand is IMethod mr) || mr.IsField) + continue; + MethodDef? md = null; + + if (isComType) { + md ??= mr.ResolveMethodDef(); + if (md is not null) { + ComUtils.GetMemberInfo(md, out bool otherIsComType, out var otherComGuid, out int otherVtblIndex); + if (otherIsComType && comGuid == otherComGuid && vtblIndex == otherVtblIndex) { + foundInstr = instr; + break; + } + } + } + + if (mr.Name == name) { + // explicit call to the requested method + if (Helpers.IsReferencedBy(analyzedMethod.DeclaringType, mr.DeclaringType) + && CheckEquals(md ??= mr.ResolveMethodDef(), analyzedMethod)) { + foundInstr = instr; + break; + } + // virtual call to base method + if (instr.OpCode.Code == Code.Callvirt || instr.OpCode.Code == Code.Ldvirtftn) { + md ??= mr.ResolveMethodDef(); + if (md is null) { + // cannot resolve the operand, so ignore this method + break; + } + if (CheckEquals(md, baseMethod)) { + foundInstr = instr; + break; + } + } + } + } + + if (foundInstr is not null) { + if (GetOriginalCodeLocation(method) is MethodDef codeLocation && !HasAlreadyBeenFound(codeLocation)) { + var node = new MethodNode(codeLocation) { Context = Context }; + if (codeLocation == method) + node.SourceRef = new SourceRef(method, foundInstr.Offset, foundInstr.Operand as IMDTokenProvider); + yield return node; + } + } + } + + if (property is not null) { + foreach (var node in FieldAccessNode.CheckCustomAttributeNamedArgumentWrite(Context, type, property)) { + if (node is MethodNode methodNode && methodNode.Member is MethodDef method && HasAlreadyBeenFound(method)) + continue; + yield return node; + } + } + } + + bool HasAlreadyBeenFound(MethodDef method) => !foundMethods!.TryAdd(method, 0); + } +} diff --git a/Extensions/dnSpy.Analyzer/TreeTraversal.cs b/Extensions/dnSpy.Analyzer/TreeTraversal.cs new file mode 100644 index 0000000..ea8bf07 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/TreeTraversal.cs @@ -0,0 +1,105 @@ +// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.Collections.Generic; + +namespace dnSpy.Analyzer { + /// + /// Static helper methods for traversing trees. + /// + static class TreeTraversal { + /// + /// Converts a tree data structure into a flat list by traversing it in pre-order. + /// + /// The root element of the tree. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in pre-order. + public static IEnumerable PreOrder(T root, Func> recursion) => PreOrder(new T[] { root }, recursion); + + /// + /// Converts a tree data structure into a flat list by traversing it in pre-order. + /// + /// The root elements of the forest. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in pre-order. + public static IEnumerable PreOrder(IEnumerable input, Func> recursion) { + Stack> stack = new Stack>(); + try { + stack.Push(input.GetEnumerator()); + while (stack.Count > 0) { + while (stack.Peek().MoveNext()) { + T element = stack.Peek().Current; + yield return element; + IEnumerable children = recursion(element); + if (children is not null) { + stack.Push(children.GetEnumerator()); + } + } + stack.Pop().Dispose(); + } + } + finally { + while (stack.Count > 0) { + stack.Pop().Dispose(); + } + } + } + + /// + /// Converts a tree data structure into a flat list by traversing it in post-order. + /// + /// The root element of the tree. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in post-order. + public static IEnumerable PostOrder(T root, Func> recursion) => PostOrder(new T[] { root }, recursion); + + /// + /// Converts a tree data structure into a flat list by traversing it in post-order. + /// + /// The root elements of the forest. + /// The function that gets the children of an element. + /// Iterator that enumerates the tree structure in post-order. + public static IEnumerable PostOrder(IEnumerable input, Func> recursion) { + Stack> stack = new Stack>(); + try { + stack.Push(input.GetEnumerator()); + while (stack.Count > 0) { + while (stack.Peek().MoveNext()) { + T element = stack.Peek().Current; + IEnumerable children = recursion(element); + if (children is not null) { + stack.Push(children.GetEnumerator()); + } + else { + yield return element; + } + } + stack.Pop().Dispose(); + if (stack.Count > 0) + yield return stack.Peek().Current; + } + } + finally { + while (stack.Count > 0) { + stack.Pop().Dispose(); + } + } + } + } +} diff --git a/Extensions/dnSpy.Analyzer/dnSpy.Analyzer.csproj b/Extensions/dnSpy.Analyzer/dnSpy.Analyzer.csproj new file mode 100644 index 0000000..fc4ab26 --- /dev/null +++ b/Extensions/dnSpy.Analyzer/dnSpy.Analyzer.csproj @@ -0,0 +1,42 @@ + + + + + + Copyright 2011-2014 AlphaSierraPapa for the SharpDevelop Team + $(DnSpyAssemblyVersion) + $(DnSpyAssemblyInformationalVersion) + + dnSpy.Analyzer.x + True + ..\..\dnSpy.snk + ..\..\dnSpy\dnSpy\bin\$(Configuration)\ + enable + true + + + + + True + True + dnSpy.Analyzer.Resources.resx + + + + + + PublicResXFileCodeGenerator + dnSpy.Analyzer.Resources.Designer.cs + + + + + + + + + + + + + diff --git a/Extensions/dnSpy.AsmEditor/Assembly/AssemblyCommands.cs b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyCommands.cs new file mode 100644 index 0000000..1e458dc --- /dev/null +++ b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyCommands.cs @@ -0,0 +1,441 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Diagnostics; +using System.Linq; +using dnlib.DotNet; +using dnlib.PE; +using dnSpy.AsmEditor.Commands; +using dnSpy.AsmEditor.Properties; +using dnSpy.AsmEditor.SaveModule; +using dnSpy.AsmEditor.UndoRedo; +using dnSpy.Contracts.Controls; +using dnSpy.Contracts.Documents; +using dnSpy.Contracts.Documents.Tabs; +using dnSpy.Contracts.Documents.TreeView; +using dnSpy.Contracts.Extension; +using dnSpy.Contracts.Images; +using dnSpy.Contracts.Menus; +using dnSpy.Contracts.TreeView; +using dnSpy.Contracts.Utilities; + +namespace dnSpy.AsmEditor.Assembly { + [ExportAutoLoaded] + sealed class CommandLoader : IAutoLoaded { + [ImportingConstructor] + CommandLoader(IWpfCommandService wpfCommandService, IDocumentTabService documentTabService, RemoveAssemblyCommand.EditMenuCommand removeCmd, AssemblySettingsCommand.EditMenuCommand settingsCmd) { + wpfCommandService.AddRemoveCommand(removeCmd); + wpfCommandService.AddSettingsCommand(documentTabService, settingsCmd, null); + } + } + + [ExportMenuItem(Header = "res:DisableMMapIOCommand", Group = MenuConstants.GROUP_CTX_DOCUMENTS_OTHER, Order = 50)] + sealed class DisableMemoryMappedIOCommand : MenuItemBase { + public override bool IsVisible(IMenuItemContext context) => + context.CreatorObject.Guid == new Guid(MenuConstants.GUIDOBJ_DOCUMENTS_TREEVIEW_GUID) && + (context.Find() ?? Array.Empty()).Any(a => GetDocument(a) is not null); + + static IDsDocument? GetDocument(TreeNodeData node) { + var fileNode = node as DsDocumentNode; + if (fileNode is null) + return null; + + var peImage = fileNode.Document.PEImage; + if (peImage is null) + peImage = (fileNode.Document.ModuleDef as ModuleDefMD)?.Metadata?.PEImage; + + return (peImage as IInternalPEImage)?.IsMemoryMappedIO == true ? fileNode.Document : null; + } + + public override void Execute(IMenuItemContext context) { + if (context.CreatorObject.Guid != new Guid(MenuConstants.GUIDOBJ_DOCUMENTS_TREEVIEW_GUID)) + return; + var asms = new List(); + foreach (var node in (context.Find() ?? Array.Empty())) { + var file = GetDocument(node); + if (file is not null) + asms.Add(file); + } + foreach (var asm in asms) + (asm.PEImage as IInternalPEImage)?.UnsafeDisableMemoryMappedIO(); + } + } + + [DebuggerDisplay("{Description}")] + sealed class RemoveAssemblyCommand : IUndoCommand { + [ExportMenuItem(Header = "res:RemoveAssemblyCommand", Icon = DsImagesAttribute.Cancel, InputGestureText = "res:DeleteCommandKey", Group = MenuConstants.GROUP_CTX_DOCUMENTS_ASMED_DELETE, Order = 0)] + sealed class DocumentsCommand : DocumentsContextMenuHandler { + readonly Lazy undoCommandService; + readonly Lazy documentSaver; + readonly IAppService appService; + + [ImportingConstructor] + DocumentsCommand(Lazy undoCommandService, Lazy documentSaver, IAppService appService) { + this.undoCommandService = undoCommandService; + this.documentSaver = documentSaver; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => RemoveAssemblyCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => RemoveAssemblyCommand.Execute(undoCommandService, documentSaver, appService, context.Nodes); + public override string? GetHeader(AsmEditorContext context) => RemoveAssemblyCommand.GetHeader(context.Nodes); + } + + [Export, ExportMenuItem(OwnerGuid = MenuConstants.APP_MENU_EDIT_GUID, Header = "res:RemoveAssemblyCommand", Icon = DsImagesAttribute.Cancel, InputGestureText = "res:DeleteCommandKey", Group = MenuConstants.GROUP_APP_MENU_EDIT_ASMED_DELETE, Order = 0)] + internal sealed class EditMenuCommand : EditMenuHandler { + readonly Lazy undoCommandService; + readonly Lazy documentSaver; + readonly IAppService appService; + + [ImportingConstructor] + EditMenuCommand(Lazy undoCommandService, Lazy documentSaver, IAppService appService) + : base(appService.DocumentTreeView) { + this.undoCommandService = undoCommandService; + this.documentSaver = documentSaver; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => RemoveAssemblyCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => RemoveAssemblyCommand.Execute(undoCommandService, documentSaver, appService, context.Nodes); + public override string? GetHeader(AsmEditorContext context) => RemoveAssemblyCommand.GetHeader(context.Nodes); + } + + static string GetHeader(TreeNodeData[] nodes) { + if (nodes.Length == 1) + return string.Format(dnSpy_AsmEditor_Resources.RemoveCommand, UIUtilities.EscapeMenuItemHeader(nodes[0].ToString()!)); + return string.Format(dnSpy_AsmEditor_Resources.RemoveAssembliesCommand, nodes.Length); + } + + static bool CanExecute(DocumentTreeNodeData[] nodes) => + nodes.Length > 0 && + nodes.All(n => n is DsDocumentNode && n.TreeNode.Parent == n.Context.DocumentTreeView.TreeView.Root); + + internal static void Execute(Lazy undoCommandService, Lazy documentSaver, IAppService appService, DocumentTreeNodeData[] nodes) { + if (!CanExecute(nodes)) + return; + + var asmNodes = nodes.Cast().ToArray(); + var files = asmNodes.SelectMany(a => a.Document.GetAllChildrenAndSelf()); + if (!documentSaver.Value.AskUserToSaveIfModified(files)) + return; + + var keepNodes = new List(); + var freeNodes = new List(); + var onlyInRedoHistory = new List(); + foreach (var info in GetUndoRedoInfo(undoCommandService.Value, asmNodes)) { + if (!info.IsInUndo && !info.IsInRedo) { + // This asm is safe to remove + freeNodes.Add(info.Node); + } + else if (!info.IsInUndo && info.IsInRedo) { + // If we add a RemoveAssemblyCommand, the redo history will be cleared, so this + // assembly will be cleared from the history and don't need to be kept. + onlyInRedoHistory.Add(info.Node); + } + else { + // The asm is in the undo history, and maybe in the redo history. We must keep it. + keepNodes.Add(info.Node); + } + } + + if (keepNodes.Count > 0 || onlyInRedoHistory.Count > 0) { + // We can't free the asm since older commands might reference it so we must record + // it in the history. The user can click Clear History to free everything. + foreach (var node in keepNodes) { + foreach (var f in node.Document.GetAllChildrenAndSelf()) + MemoryMappedIOHelper.DisableMemoryMappedIO(f); + } + if (keepNodes.Count != 0) + undoCommandService.Value.Add(new RemoveAssemblyCommand(appService.DocumentTreeView, keepNodes.ToArray())); + else + undoCommandService.Value.ClearRedo(); + // Redo history was cleared + FreeAssemblies(onlyInRedoHistory); + } + + FreeAssemblies(freeNodes); + } + + static void FreeAssemblies(IList nodes) { + if (nodes.Count == 0) + return; + var docTreeView = nodes[0].Context.DocumentTreeView; + if (nodes.Count == docTreeView.TreeView.Root.Children.Count) { + var hash1 = new HashSet(docTreeView.TreeView.Root.Children.Select(a => (DsDocumentNode)a.Data)); + var hash2 = new HashSet(nodes); + if (hash1.Count == hash2.Count && hash1.Count == nodes.Count) { + docTreeView.TreeView.SelectItems(Array.Empty()); + docTreeView.DocumentService.Clear(); + return; + } + } + docTreeView.Remove(nodes); + } + + readonly struct UndoRedoInfo { + public readonly bool IsInUndo; + public readonly bool IsInRedo; + public readonly DsDocumentNode Node; + + public UndoRedoInfo(DsDocumentNode node, bool isInUndo, bool isInRedo) { + IsInUndo = isInUndo; + IsInRedo = isInRedo; + Node = node; + } + } + + static IEnumerable GetUndoRedoInfo(IUndoCommandService undoCommandService, IEnumerable nodes) { + var modifiedUndoAsms = new HashSet(undoCommandService.UndoObjects); + var modifiedRedoAsms = new HashSet(undoCommandService.RedoObjects); + foreach (var node in nodes) { + var uo = undoCommandService.GetUndoObject(node.Document); + bool isInUndo = modifiedUndoAsms.Contains(uo!); + bool isInRedo = modifiedRedoAsms.Contains(uo!); + yield return new UndoRedoInfo(node, isInUndo, isInRedo); + } + } + + RootDocumentNodeCreator[] savedStates; + + RemoveAssemblyCommand(IDocumentTreeView documentTreeView, DsDocumentNode[] asmNodes) { + savedStates = new RootDocumentNodeCreator[asmNodes.Length]; + for (int i = 0; i < savedStates.Length; i++) + savedStates[i] = new RootDocumentNodeCreator(documentTreeView, asmNodes[i]); + } + + public string Description => dnSpy_AsmEditor_Resources.RemoveAssemblyCommand; + + public void Execute() { + for (int i = 0; i < savedStates.Length; i++) + savedStates[i].Remove(); + } + + public void Undo() { + for (int i = savedStates.Length - 1; i >= 0; i--) + savedStates[i].Add(); + } + + public IEnumerable ModifiedObjects { + get { + foreach (var savedState in savedStates) + yield return savedState.DocumentNode; + } + } + } + + [DebuggerDisplay("{Description}")] + sealed class AssemblySettingsCommand : IUndoCommand { + [ExportMenuItem(Header = "res:EditAssemblyCommand", Icon = DsImagesAttribute.Settings, InputGestureText = "res:ShortcutKeyAltEnter", Group = MenuConstants.GROUP_CTX_DOCUMENTS_ASMED_SETTINGS, Order = 0)] + sealed class DocumentsCommand : DocumentsContextMenuHandler { + readonly Lazy undoCommandService; + readonly IAppService appService; + + [ImportingConstructor] + DocumentsCommand(Lazy undoCommandService, IAppService appService) { + this.undoCommandService = undoCommandService; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => AssemblySettingsCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => AssemblySettingsCommand.Execute(undoCommandService, appService, context.Nodes); + } + + [Export, ExportMenuItem(OwnerGuid = MenuConstants.APP_MENU_EDIT_GUID, Header = "res:EditAssemblyCommand", Icon = DsImagesAttribute.Settings, InputGestureText = "res:ShortcutKeyAltEnter", Group = MenuConstants.GROUP_APP_MENU_EDIT_ASMED_SETTINGS, Order = 0)] + internal sealed class EditMenuCommand : EditMenuHandler { + readonly Lazy undoCommandService; + readonly IAppService appService; + + [ImportingConstructor] + EditMenuCommand(Lazy undoCommandService, IAppService appService) + : base(appService.DocumentTreeView) { + this.undoCommandService = undoCommandService; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => AssemblySettingsCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => AssemblySettingsCommand.Execute(undoCommandService, appService, context.Nodes); + } + + static bool CanExecute(DocumentTreeNodeData[] nodes) => + nodes is not null && + nodes.Length == 1 && + nodes[0] is AssemblyDocumentNode; + + static void Execute(Lazy undoCommandService, IAppService appService, DocumentTreeNodeData[] nodes) { + if (!CanExecute(nodes)) + return; + + var asmNode = (AssemblyDocumentNode)nodes[0]; + var module = asmNode.Document.ModuleDef!; + + var data = new AssemblyOptionsVM(new AssemblyOptions(asmNode.Document.AssemblyDef!), module, appService.DecompilerService); + var win = new AssemblyOptionsDlg(); + win.DataContext = data; + win.Owner = appService.MainWindow; + if (win.ShowDialog() != true) + return; + + undoCommandService.Value.Add(new AssemblySettingsCommand(asmNode, data.CreateAssemblyOptions())); + } + + readonly AssemblyDocumentNode asmNode; + readonly AssemblyOptions newOptions; + readonly AssemblyOptions origOptions; + readonly AssemblyRefInfo[]? assemblyRefInfos; + + readonly struct AssemblyRefInfo { + public readonly AssemblyRef AssemblyRef; + public readonly UTF8String OrigName; + public readonly PublicKeyBase OrigPublicKeyOrToken; + + public AssemblyRefInfo(AssemblyRef asmRef) { + AssemblyRef = asmRef; + OrigName = asmRef.Name; + OrigPublicKeyOrToken = asmRef.PublicKeyOrToken; + } + } + + AssemblySettingsCommand(AssemblyDocumentNode asmNode, AssemblyOptions newOptions) { + this.asmNode = asmNode; + this.newOptions = newOptions; + origOptions = new AssemblyOptions(asmNode.Document.AssemblyDef!); + + if (newOptions.Name != origOptions.Name) + assemblyRefInfos = RefFinder.FindAssemblyRefsToThisModule(asmNode.Document.ModuleDef!).Where(a => AssemblyNameComparer.NameAndPublicKeyTokenOnly.Equals(a, asmNode.Document.AssemblyDef)).Select(a => new AssemblyRefInfo(a)).ToArray(); + } + + public string Description => dnSpy_AsmEditor_Resources.EditAssemblyCommand2; + + public void Execute() { + newOptions.CopyTo(asmNode.Document.AssemblyDef!); + if (assemblyRefInfos is not null) { + var pkt = newOptions.PublicKey.Token; + foreach (var info in assemblyRefInfos) { + info.AssemblyRef.Name = newOptions.Name; + if (info.AssemblyRef.PublicKeyOrToken is PublicKeyToken) + info.AssemblyRef.PublicKeyOrToken = pkt; + else + info.AssemblyRef.PublicKeyOrToken = newOptions.PublicKey; + } + } + asmNode.TreeNode.RefreshUI(); + } + + public void Undo() { + origOptions.CopyTo(asmNode.Document.AssemblyDef!); + if (assemblyRefInfos is not null) { + foreach (var info in assemblyRefInfos) { + info.AssemblyRef.Name = info.OrigName; + info.AssemblyRef.PublicKeyOrToken = info.OrigPublicKeyOrToken; + } + } + asmNode.TreeNode.TreeView.SelectItems(new[] { asmNode }); + asmNode.TreeNode.RefreshUI(); + } + + public IEnumerable ModifiedObjects { + get { yield return asmNode; } + } + } + + [DebuggerDisplay("{Description}")] + sealed class CreateAssemblyCommand : IUndoCommand { + [ExportMenuItem(Header = "res:CreateAssemblyCommand", Group = MenuConstants.GROUP_CTX_DOCUMENTS_ASMED_NEW, Order = 0)] + sealed class DocumentsCommand : DocumentsContextMenuHandler { + readonly Lazy undoCommandService; + readonly IAppService appService; + + [ImportingConstructor] + DocumentsCommand(Lazy undoCommandService, IAppService appService) { + this.undoCommandService = undoCommandService; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => CreateAssemblyCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => CreateAssemblyCommand.Execute(undoCommandService, appService, context.Nodes); + } + + [ExportMenuItem(OwnerGuid = MenuConstants.APP_MENU_EDIT_GUID, Header = "res:CreateAssemblyCommand", Group = MenuConstants.GROUP_APP_MENU_EDIT_ASMED_NEW, Order = 0)] + sealed class EditMenuCommand : EditMenuHandler { + readonly Lazy undoCommandService; + readonly IAppService appService; + + [ImportingConstructor] + EditMenuCommand(Lazy undoCommandService, IAppService appService) + : base(appService.DocumentTreeView) { + this.undoCommandService = undoCommandService; + this.appService = appService; + } + + public override bool IsVisible(AsmEditorContext context) => CreateAssemblyCommand.CanExecute(context.Nodes); + public override void Execute(AsmEditorContext context) => CreateAssemblyCommand.Execute(undoCommandService, appService, context.Nodes); + } + + static bool CanExecute(DocumentTreeNodeData[] nodes) => + nodes is not null && + (nodes.Length == 0 || nodes[0] is DsDocumentNode); + + static void Execute(Lazy undoCommandService, IAppService appService, DocumentTreeNodeData[] nodes) { + if (!CanExecute(nodes)) + return; + + var newModule = new ModuleDefUser(); + + var data = new AssemblyOptionsVM(AssemblyOptions.Create("MyAssembly"), newModule, appService.DecompilerService); + data.CanShowClrVersion = true; + var win = new AssemblyOptionsDlg(); + win.Title = dnSpy_AsmEditor_Resources.CreateAssemblyCommand2; + win.DataContext = data; + win.Owner = appService.MainWindow; + if (win.ShowDialog() != true) + return; + + var cmd = new CreateAssemblyCommand(undoCommandService.Value, appService.DocumentTreeView, newModule, data.CreateAssemblyOptions()); + undoCommandService.Value.Add(cmd); + appService.DocumentTabService.FollowReference(cmd.fileNodeCreator.DocumentNode); + } + + readonly RootDocumentNodeCreator fileNodeCreator; + readonly IUndoCommandService undoCommandService; + + CreateAssemblyCommand(IUndoCommandService undoCommandService, IDocumentTreeView documentTreeView, ModuleDef newModule, AssemblyOptions options) { + this.undoCommandService = undoCommandService; + var module = Module.ModuleUtils.CreateModule(options.Name, Guid.NewGuid(), options.ClrVersion, ModuleKind.Dll, newModule); + options.CreateAssemblyDef(module).Modules.Add(module); + var file = DsDotNetDocument.CreateAssembly(DsDocumentInfo.CreateDocument(string.Empty), module, true); + fileNodeCreator = RootDocumentNodeCreator.CreateAssembly(documentTreeView, file); + } + + public string Description => dnSpy_AsmEditor_Resources.CreateAssemblyCommand2; + + public void Execute() { + fileNodeCreator.Add(); + undoCommandService.MarkAsModified(undoCommandService.GetUndoObject(fileNodeCreator.DocumentNode.Document)!); + } + + public void Undo() => fileNodeCreator.Remove(); + + public IEnumerable ModifiedObjects { + get { yield return fileNodeCreator.DocumentNode; } + } + } +} diff --git a/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptions.cs b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptions.cs new file mode 100644 index 0000000..703145f --- /dev/null +++ b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptions.cs @@ -0,0 +1,79 @@ +/* + Copyright (C) 2014-2019 de4dot@gmail.com + + This file is part of dnSpy + + dnSpy is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + dnSpy is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with dnSpy. If not, see . +*/ + +using System; +using System.Collections.Generic; +using dnlib.DotNet; + +namespace dnSpy.AsmEditor.Assembly { + sealed class AssemblyOptions { + public AssemblyHashAlgorithm HashAlgorithm; + public Version Version; + public AssemblyAttributes Attributes; + public PublicKey PublicKey; + public UTF8String? Name; + public string? Culture; + public Module.ClrVersion ClrVersion; + public List CustomAttributes = new List(); + public List DeclSecurities = new List(); + + public AssemblyOptions() { + Version = null!; + PublicKey = null!; + } + + public AssemblyOptions(AssemblyDef asm) { + HashAlgorithm = asm.HashAlgorithm; + Version = asm.Version; + Attributes = asm.Attributes; + PublicKey = asm.PublicKey; + Name = asm.Name; + Culture = asm.Culture; + ClrVersion = Module.ClrVersion.DefaultVersion; + CustomAttributes.AddRange(asm.CustomAttributes); + DeclSecurities.AddRange(asm.DeclSecurities); + } + + public AssemblyDef CopyTo(AssemblyDef asm) { + asm.HashAlgorithm = HashAlgorithm; + asm.Version = Version; + asm.Attributes = Attributes; + asm.PublicKey = PublicKey; + asm.Name = Name ?? UTF8String.Empty; + asm.Culture = Culture; + asm.CustomAttributes.Clear(); + asm.CustomAttributes.AddRange(CustomAttributes); + asm.DeclSecurities.Clear(); + asm.DeclSecurities.AddRange(DeclSecurities); + return asm; + } + + public AssemblyDef CreateAssemblyDef(ModuleDef ownerModule) => ownerModule.UpdateRowId(CopyTo(new AssemblyDefUser())); + + public static AssemblyOptions Create(string name) => new AssemblyOptions { + HashAlgorithm = AssemblyHashAlgorithm.SHA1, + Version = new Version(0, 0, 0, 0), + Attributes = AssemblyAttributes.None, + PublicKey = new PublicKey(Array.Empty()), + Name = name, + Culture = string.Empty, + ClrVersion = Module.ClrVersion.DefaultVersion, + }; + } +} diff --git a/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsDlg.xaml b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsDlg.xaml new file mode 100644 index 0000000..2c4e100 --- /dev/null +++ b/Extensions/dnSpy.AsmEditor/Assembly/AssemblyOptionsDlg.xaml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +