diff --git a/ICSharpCode.Decompiler/DecompilerSettings.cs b/ICSharpCode.Decompiler/DecompilerSettings.cs index 77e7f9e4d..c352a871c 100644 --- a/ICSharpCode.Decompiler/DecompilerSettings.cs +++ b/ICSharpCode.Decompiler/DecompilerSettings.cs @@ -345,6 +345,18 @@ namespace ICSharpCode.Decompiler } } + bool expandMemberDefinitions = false; + + public bool ExpandMemberDefinitions { + get { return expandMemberDefinitions; } + set { + if (expandMemberDefinitions != value) { + expandMemberDefinitions = value; + OnPropertyChanged(); + } + } + } + #region Options to aid VB decompilation bool introduceIncrementAndDecrement = true; diff --git a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs index 851c47842..8455c34c0 100644 --- a/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs +++ b/ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs @@ -45,6 +45,8 @@ namespace ICSharpCode.Decompiler.Disassembler set => methodBodyDisassembler.ShowSequencePoints = value; } + public bool ExpandMemberDefinitions { get; set; } = false; + public ReflectionDisassembler(ITextOutput output, CancellationToken cancellationToken) : this(output, new MethodBodyDisassembler(output, cancellationToken), cancellationToken) { @@ -846,7 +848,7 @@ namespace ICSharpCode.Decompiler.Disassembler output.Write(DisassemblerHelpers.Escape(type.DeclaringType != null ? type.Name : type.FullName)); WriteTypeParameters(output, type); - output.MarkFoldStart(defaultCollapsed: isInType); + output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType); output.WriteLine(); if (type.BaseType != null) { @@ -1003,7 +1005,7 @@ namespace ICSharpCode.Decompiler.Disassembler void OpenBlock(bool defaultCollapsed) { - output.MarkFoldStart(defaultCollapsed: defaultCollapsed); + output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed); output.WriteLine(); output.WriteLine("{"); output.Indent(); diff --git a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs index 5ce584f1d..4273562db 100644 --- a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs +++ b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs @@ -40,6 +40,7 @@ namespace ICSharpCode.Decompiler bool lastUsingDeclaration; public bool FoldBraces = false; + public bool ExpandMemberDefinitions = false; public TextTokenWriter(ITextOutput output, DecompilerSettings settings, IDecompilerTypeSystem typeSystem) { @@ -216,7 +217,7 @@ namespace ICSharpCode.Decompiler if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration) braceLevelWithinType++; if (nodeStack.OfType().Count() <= 1 || FoldBraces) { - output.MarkFoldStart(defaultCollapsed: braceLevelWithinType == 1); + output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && braceLevelWithinType == 1); } output.Write("{"); break; diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 0a71362d0..e76746b53 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -98,7 +98,7 @@ namespace ICSharpCode.ILSpy void WriteCode(ITextOutput output, DecompilerSettings settings, SyntaxTree syntaxTree, IDecompilerTypeSystem typeSystem) { syntaxTree.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true }); - TokenWriter tokenWriter = new TextTokenWriter(output, settings, typeSystem) { FoldBraces = settings.FoldBraces }; + TokenWriter tokenWriter = new TextTokenWriter(output, settings, typeSystem) { FoldBraces = settings.FoldBraces, ExpandMemberDefinitions = settings.ExpandMemberDefinitions }; if (output is ISmartTextOutput highlightingOutput) { tokenWriter = new CSharpHighlightingTokenWriter(tokenWriter, highlightingOutput); } diff --git a/ILSpy/Languages/ILLanguage.cs b/ILSpy/Languages/ILLanguage.cs index 36b58402d..04b30ec0d 100644 --- a/ILSpy/Languages/ILLanguage.cs +++ b/ILSpy/Languages/ILLanguage.cs @@ -48,7 +48,8 @@ namespace ICSharpCode.ILSpy { return new ReflectionDisassembler(output, options.CancellationToken) { DetectControlStructure = detectControlStructure, - ShowSequencePoints = options.DecompilerSettings.ShowDebugInfo + ShowSequencePoints = options.DecompilerSettings.ShowDebugInfo, + ExpandMemberDefinitions = options.DecompilerSettings.ExpandMemberDefinitions }; } diff --git a/ILSpy/Options/DecompilerSettingsPanel.xaml b/ILSpy/Options/DecompilerSettingsPanel.xaml index ec976b7b2..a7143f461 100644 --- a/ILSpy/Options/DecompilerSettingsPanel.xaml +++ b/ILSpy/Options/DecompilerSettingsPanel.xaml @@ -18,5 +18,6 @@ Insert using declarations Fully qualify ambiguous type names Always use braces + Expand member definitions after decompilation \ No newline at end of file diff --git a/ILSpy/Options/DecompilerSettingsPanel.xaml.cs b/ILSpy/Options/DecompilerSettingsPanel.xaml.cs index b261faa38..22577878f 100644 --- a/ILSpy/Options/DecompilerSettingsPanel.xaml.cs +++ b/ILSpy/Options/DecompilerSettingsPanel.xaml.cs @@ -61,6 +61,8 @@ namespace ICSharpCode.ILSpy.Options s.ShowDebugInfo = (bool?)e.Attribute("showDebugInfo") ?? s.ShowDebugInfo; s.ShowXmlDocumentation = (bool?)e.Attribute("xmlDoc") ?? s.ShowXmlDocumentation; s.FoldBraces = (bool?)e.Attribute("foldBraces") ?? s.FoldBraces; + s.ExpandMemberDefinitions = (bool?)e.Attribute("expandMemberDefinitions") ?? s.ExpandMemberDefinitions; + s.RemoveDeadCode = (bool?)e.Attribute("removeDeadCode") ?? s.RemoveDeadCode; s.UsingDeclarations = (bool?)e.Attribute("usingDeclarations") ?? s.UsingDeclarations; s.FullyQualifyAmbiguousTypeNames = (bool?)e.Attribute("fullyQualifyAmbiguousTypeNames") ?? s.FullyQualifyAmbiguousTypeNames; s.AlwaysUseBraces = (bool?)e.Attribute("alwaysUseBraces") ?? s.AlwaysUseBraces; @@ -82,7 +84,8 @@ namespace ICSharpCode.ILSpy.Options section.SetAttributeValue("showDebugInfo", s.ShowDebugInfo); section.SetAttributeValue("xmlDoc", s.ShowXmlDocumentation); section.SetAttributeValue("foldBraces", s.FoldBraces); - section.SetAttributeValue("foldBraces", s.RemoveDeadCode); + section.SetAttributeValue("expandMemberDefinitions", s.ExpandMemberDefinitions); + section.SetAttributeValue("removeDeadCode", s.RemoveDeadCode); section.SetAttributeValue("usingDeclarations", s.UsingDeclarations); section.SetAttributeValue("fullyQualifyAmbiguousTypeNames", s.FullyQualifyAmbiguousTypeNames); section.SetAttributeValue("alwaysUseBraces", s.AlwaysUseBraces); diff --git a/ILSpy/Options/DisplaySettings.cs b/ILSpy/Options/DisplaySettings.cs index 5b048c0db..a023428bd 100644 --- a/ILSpy/Options/DisplaySettings.cs +++ b/ILSpy/Options/DisplaySettings.cs @@ -110,13 +110,10 @@ namespace ICSharpCode.ILSpy.Options bool sortResults = true; - public bool SortResults - { + public bool SortResults { get { return sortResults; } - set - { - if (sortResults != value) - { + set { + if (sortResults != value) { sortResults = value; OnPropertyChanged(); } diff --git a/ILSpy/Options/DisplaySettingsPanel.xaml b/ILSpy/Options/DisplaySettingsPanel.xaml index 5a56bafbd..9cd20de05 100644 --- a/ILSpy/Options/DisplaySettingsPanel.xaml +++ b/ILSpy/Options/DisplaySettingsPanel.xaml @@ -61,7 +61,7 @@ Show line numbers Show metadata tokens - Enable word wrap + Enable word wrap Sort results by fitness diff --git a/ILSpy/Options/DisplaySettingsPanel.xaml.cs b/ILSpy/Options/DisplaySettingsPanel.xaml.cs index d4b1ee547..e9afecf1f 100644 --- a/ILSpy/Options/DisplaySettingsPanel.xaml.cs +++ b/ILSpy/Options/DisplaySettingsPanel.xaml.cs @@ -102,8 +102,8 @@ namespace ICSharpCode.ILSpy.Options s.ShowLineNumbers = (bool?)e.Attribute("ShowLineNumbers") ?? false; s.ShowMetadataTokens = (bool?) e.Attribute("ShowMetadataTokens") ?? false; s.EnableWordWrap = (bool?)e.Attribute("EnableWordWrap") ?? false; - s.SortResults = (bool?)e.Attribute("SortResults") ?? false; - + s.SortResults = (bool?)e.Attribute("SortResults") ?? true; + return s; } @@ -118,7 +118,7 @@ namespace ICSharpCode.ILSpy.Options section.SetAttributeValue("ShowMetadataTokens", s.ShowMetadataTokens); section.SetAttributeValue("EnableWordWrap", s.EnableWordWrap); section.SetAttributeValue("SortResults", s.SortResults); - + XElement existingElement = root.Element("DisplaySettings"); if (existingElement != null) existingElement.ReplaceWith(section);