Browse Source

Fix #1013, #1034: Option to show code unfolded (expanded) by default

pull/1040/head
Siegfried Pammer 7 years ago
parent
commit
8af973ef35
  1. 12
      ICSharpCode.Decompiler/DecompilerSettings.cs
  2. 6
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  3. 3
      ICSharpCode.Decompiler/Output/TextTokenWriter.cs
  4. 2
      ILSpy/Languages/CSharpLanguage.cs
  5. 3
      ILSpy/Languages/ILLanguage.cs
  6. 1
      ILSpy/Options/DecompilerSettingsPanel.xaml
  7. 5
      ILSpy/Options/DecompilerSettingsPanel.xaml.cs
  8. 9
      ILSpy/Options/DisplaySettings.cs
  9. 2
      ILSpy/Options/DisplaySettingsPanel.xaml.cs

12
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 #region Options to aid VB decompilation
bool introduceIncrementAndDecrement = true; bool introduceIncrementAndDecrement = true;

6
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -45,6 +45,8 @@ namespace ICSharpCode.Decompiler.Disassembler
set => methodBodyDisassembler.ShowSequencePoints = value; set => methodBodyDisassembler.ShowSequencePoints = value;
} }
public bool ExpandMemberDefinitions { get; set; } = false;
public ReflectionDisassembler(ITextOutput output, CancellationToken cancellationToken) public ReflectionDisassembler(ITextOutput output, CancellationToken cancellationToken)
: this(output, new MethodBodyDisassembler(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)); output.Write(DisassemblerHelpers.Escape(type.DeclaringType != null ? type.Name : type.FullName));
WriteTypeParameters(output, type); WriteTypeParameters(output, type);
output.MarkFoldStart(defaultCollapsed: isInType); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType);
output.WriteLine(); output.WriteLine();
if (type.BaseType != null) { if (type.BaseType != null) {
@ -1003,7 +1005,7 @@ namespace ICSharpCode.Decompiler.Disassembler
void OpenBlock(bool defaultCollapsed) void OpenBlock(bool defaultCollapsed)
{ {
output.MarkFoldStart(defaultCollapsed: defaultCollapsed); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed);
output.WriteLine(); output.WriteLine();
output.WriteLine("{"); output.WriteLine("{");
output.Indent(); output.Indent();

3
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -40,6 +40,7 @@ namespace ICSharpCode.Decompiler
bool lastUsingDeclaration; bool lastUsingDeclaration;
public bool FoldBraces = false; public bool FoldBraces = false;
public bool ExpandMemberDefinitions = false;
public TextTokenWriter(ITextOutput output, DecompilerSettings settings, IDecompilerTypeSystem typeSystem) public TextTokenWriter(ITextOutput output, DecompilerSettings settings, IDecompilerTypeSystem typeSystem)
{ {
@ -216,7 +217,7 @@ namespace ICSharpCode.Decompiler
if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration) if (braceLevelWithinType >= 0 || nodeStack.Peek() is TypeDeclaration)
braceLevelWithinType++; braceLevelWithinType++;
if (nodeStack.OfType<BlockStatement>().Count() <= 1 || FoldBraces) { if (nodeStack.OfType<BlockStatement>().Count() <= 1 || FoldBraces) {
output.MarkFoldStart(defaultCollapsed: braceLevelWithinType == 1); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && braceLevelWithinType == 1);
} }
output.Write("{"); output.Write("{");
break; break;

2
ILSpy/Languages/CSharpLanguage.cs

@ -98,7 +98,7 @@ namespace ICSharpCode.ILSpy
void WriteCode(ITextOutput output, DecompilerSettings settings, SyntaxTree syntaxTree, IDecompilerTypeSystem typeSystem) void WriteCode(ITextOutput output, DecompilerSettings settings, SyntaxTree syntaxTree, IDecompilerTypeSystem typeSystem)
{ {
syntaxTree.AcceptVisitor(new InsertParenthesesVisitor { InsertParenthesesForReadability = true }); 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) { if (output is ISmartTextOutput highlightingOutput) {
tokenWriter = new CSharpHighlightingTokenWriter(tokenWriter, highlightingOutput); tokenWriter = new CSharpHighlightingTokenWriter(tokenWriter, highlightingOutput);
} }

3
ILSpy/Languages/ILLanguage.cs

@ -48,7 +48,8 @@ namespace ICSharpCode.ILSpy
{ {
return new ReflectionDisassembler(output, options.CancellationToken) { return new ReflectionDisassembler(output, options.CancellationToken) {
DetectControlStructure = detectControlStructure, DetectControlStructure = detectControlStructure,
ShowSequencePoints = options.DecompilerSettings.ShowDebugInfo ShowSequencePoints = options.DecompilerSettings.ShowDebugInfo,
ExpandMemberDefinitions = options.DecompilerSettings.ExpandMemberDefinitions
}; };
} }

1
ILSpy/Options/DecompilerSettingsPanel.xaml

@ -18,5 +18,6 @@
<CheckBox IsChecked="{Binding UsingDeclarations}">Insert using declarations</CheckBox> <CheckBox IsChecked="{Binding UsingDeclarations}">Insert using declarations</CheckBox>
<CheckBox IsChecked="{Binding FullyQualifyAmbiguousTypeNames}">Fully qualify ambiguous type names</CheckBox> <CheckBox IsChecked="{Binding FullyQualifyAmbiguousTypeNames}">Fully qualify ambiguous type names</CheckBox>
<CheckBox IsChecked="{Binding AlwaysUseBraces}">Always use braces</CheckBox> <CheckBox IsChecked="{Binding AlwaysUseBraces}">Always use braces</CheckBox>
<CheckBox IsChecked="{Binding ExpandMemberDefinitions}">Expand member definitions after decompilation</CheckBox>
</StackPanel> </StackPanel>
</UserControl> </UserControl>

5
ILSpy/Options/DecompilerSettingsPanel.xaml.cs

@ -61,6 +61,8 @@ namespace ICSharpCode.ILSpy.Options
s.ShowDebugInfo = (bool?)e.Attribute("showDebugInfo") ?? s.ShowDebugInfo; s.ShowDebugInfo = (bool?)e.Attribute("showDebugInfo") ?? s.ShowDebugInfo;
s.ShowXmlDocumentation = (bool?)e.Attribute("xmlDoc") ?? s.ShowXmlDocumentation; s.ShowXmlDocumentation = (bool?)e.Attribute("xmlDoc") ?? s.ShowXmlDocumentation;
s.FoldBraces = (bool?)e.Attribute("foldBraces") ?? s.FoldBraces; 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.UsingDeclarations = (bool?)e.Attribute("usingDeclarations") ?? s.UsingDeclarations;
s.FullyQualifyAmbiguousTypeNames = (bool?)e.Attribute("fullyQualifyAmbiguousTypeNames") ?? s.FullyQualifyAmbiguousTypeNames; s.FullyQualifyAmbiguousTypeNames = (bool?)e.Attribute("fullyQualifyAmbiguousTypeNames") ?? s.FullyQualifyAmbiguousTypeNames;
s.AlwaysUseBraces = (bool?)e.Attribute("alwaysUseBraces") ?? s.AlwaysUseBraces; s.AlwaysUseBraces = (bool?)e.Attribute("alwaysUseBraces") ?? s.AlwaysUseBraces;
@ -82,7 +84,8 @@ namespace ICSharpCode.ILSpy.Options
section.SetAttributeValue("showDebugInfo", s.ShowDebugInfo); section.SetAttributeValue("showDebugInfo", s.ShowDebugInfo);
section.SetAttributeValue("xmlDoc", s.ShowXmlDocumentation); section.SetAttributeValue("xmlDoc", s.ShowXmlDocumentation);
section.SetAttributeValue("foldBraces", s.FoldBraces); 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("usingDeclarations", s.UsingDeclarations);
section.SetAttributeValue("fullyQualifyAmbiguousTypeNames", s.FullyQualifyAmbiguousTypeNames); section.SetAttributeValue("fullyQualifyAmbiguousTypeNames", s.FullyQualifyAmbiguousTypeNames);
section.SetAttributeValue("alwaysUseBraces", s.AlwaysUseBraces); section.SetAttributeValue("alwaysUseBraces", s.AlwaysUseBraces);

9
ILSpy/Options/DisplaySettings.cs

@ -110,13 +110,10 @@ namespace ICSharpCode.ILSpy.Options
bool sortResults = true; bool sortResults = true;
public bool SortResults public bool SortResults {
{
get { return sortResults; } get { return sortResults; }
set set {
{ if (sortResults != value) {
if (sortResults != value)
{
sortResults = value; sortResults = value;
OnPropertyChanged(); OnPropertyChanged();
} }

2
ILSpy/Options/DisplaySettingsPanel.xaml.cs

@ -102,7 +102,7 @@ namespace ICSharpCode.ILSpy.Options
s.ShowLineNumbers = (bool?)e.Attribute("ShowLineNumbers") ?? false; s.ShowLineNumbers = (bool?)e.Attribute("ShowLineNumbers") ?? false;
s.ShowMetadataTokens = (bool?) e.Attribute("ShowMetadataTokens") ?? false; s.ShowMetadataTokens = (bool?) e.Attribute("ShowMetadataTokens") ?? false;
s.EnableWordWrap = (bool?)e.Attribute("EnableWordWrap") ?? false; s.EnableWordWrap = (bool?)e.Attribute("EnableWordWrap") ?? false;
s.SortResults = (bool?)e.Attribute("SortResults") ?? false; s.SortResults = (bool?)e.Attribute("SortResults") ?? true;
return s; return s;
} }

Loading…
Cancel
Save