Browse Source

Fix #2632: Make sure that changing the setting "ExpandMemberDefinitions" has an effect when refreshing a decompiled view.

pull/2679/head
Siegfried Pammer 3 years ago
parent
commit
13da4c48d4
  1. 4
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 2
      ICSharpCode.Decompiler/Output/ITextOutput.cs
  3. 4
      ICSharpCode.Decompiler/Output/PlainTextOutput.cs
  4. 2
      ICSharpCode.Decompiler/Output/TextTokenWriter.cs
  5. 5
      ILSpy/TextView/AvalonEditTextOutput.cs
  6. 29
      ILSpy/TextView/DecompilerTextView.cs

4
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -1682,7 +1682,7 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(typeDefinition.GetDeclaringType().IsNil ? typeDefinition.GetFullTypeName(module.Metadata).ToILNameString() : DisassemblerHelpers.Escape(module.Metadata.GetString(typeDefinition.Name))); output.Write(typeDefinition.GetDeclaringType().IsNil ? typeDefinition.GetFullTypeName(module.Metadata).ToILNameString() : DisassemblerHelpers.Escape(module.Metadata.GetString(typeDefinition.Name)));
WriteTypeParameters(output, module, genericContext, typeDefinition.GetGenericParameters()); WriteTypeParameters(output, module, genericContext, typeDefinition.GetGenericParameters());
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType, isDefinition: isInType);
output.WriteLine(); output.WriteLine();
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil(); EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
@ -1796,7 +1796,7 @@ namespace ICSharpCode.Decompiler.Disassembler
void OpenBlock(bool defaultCollapsed) void OpenBlock(bool defaultCollapsed)
{ {
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed); output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed, isDefinition: true);
output.WriteLine(); output.WriteLine();
output.WriteLine("{"); output.WriteLine("{");
output.Indent(); output.Indent();

2
ICSharpCode.Decompiler/Output/ITextOutput.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.Decompiler
void WriteReference(IMember member, string text, bool isDefinition = false); void WriteReference(IMember member, string text, bool isDefinition = false);
void WriteLocalReference(string text, object reference, bool isDefinition = false); void WriteLocalReference(string text, object reference, bool isDefinition = false);
void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false); void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false, bool isDefinition = false);
void MarkFoldEnd(); void MarkFoldEnd();
} }

4
ICSharpCode.Decompiler/Output/PlainTextOutput.cs

@ -143,7 +143,7 @@ namespace ICSharpCode.Decompiler
Write(text); Write(text);
} }
void ITextOutput.MarkFoldStart(string collapsedText, bool defaultCollapsed) void ITextOutput.MarkFoldStart(string collapsedText, bool defaultCollapsed, bool isDefinition)
{ {
} }
@ -190,7 +190,7 @@ namespace ICSharpCode.Decompiler
actions.Add(target => target.MarkFoldEnd()); actions.Add(target => target.MarkFoldEnd());
} }
public void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false) public void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false, bool isDefinition = false)
{ {
actions.Add(target => target.MarkFoldStart(collapsedText, defaultCollapsed)); actions.Add(target => target.MarkFoldStart(collapsedText, defaultCollapsed));
} }

2
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -255,7 +255,7 @@ namespace ICSharpCode.Decompiler
braceLevelWithinType++; braceLevelWithinType++;
if (nodeStack.OfType<BlockStatement>().Count() <= 1 || settings.FoldBraces) if (nodeStack.OfType<BlockStatement>().Count() <= 1 || settings.FoldBraces)
{ {
output.MarkFoldStart(defaultCollapsed: !settings.ExpandMemberDefinitions && braceLevelWithinType == 1); output.MarkFoldStart(defaultCollapsed: !settings.ExpandMemberDefinitions && braceLevelWithinType == 1, isDefinition: braceLevelWithinType == 1);
} }
output.Write("{"); output.Write("{");
break; break;

5
ILSpy/TextView/AvalonEditTextOutput.cs

@ -312,14 +312,15 @@ namespace ICSharpCode.ILSpy.TextView
references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference, IsLocal = true, IsDefinition = isDefinition }); references.Add(new ReferenceSegment { StartOffset = start, EndOffset = end, Reference = reference, IsLocal = true, IsDefinition = isDefinition });
} }
public void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false) public void MarkFoldStart(string collapsedText = "...", bool defaultCollapsed = false, bool isDefinition = false)
{ {
WriteIndent(); WriteIndent();
openFoldings.Push(( openFoldings.Push((
new NewFolding { new NewFolding {
StartOffset = this.TextLength, StartOffset = this.TextLength,
Name = collapsedText, Name = collapsedText,
DefaultClosed = defaultCollapsed DefaultClosed = defaultCollapsed,
IsDefinition = isDefinition,
}, lineNumber)); }, lineNumber));
} }

29
ILSpy/TextView/DecompilerTextView.cs

@ -81,6 +81,7 @@ namespace ICSharpCode.ILSpy.TextView
ILSpyTreeNode[]? decompiledNodes; ILSpyTreeNode[]? decompiledNodes;
Uri? currentAddress; Uri? currentAddress;
string? currentTitle; string? currentTitle;
bool expandMemberDefinitions;
DefinitionLookup? definitionLookup; DefinitionLookup? definitionLookup;
TextSegmentCollection<ReferenceSegment>? references; TextSegmentCollection<ReferenceSegment>? references;
@ -728,7 +729,7 @@ namespace ICSharpCode.ILSpy.TextView
{ {
if (state != null) if (state != null)
{ {
state.RestoreFoldings(textOutput.Foldings); state.RestoreFoldings(textOutput.Foldings, DisplaySettingsPanel.CurrentDisplaySettings.ExpandMemberDefinitions);
textEditor.ScrollToVerticalOffset(state.VerticalOffset); textEditor.ScrollToVerticalOffset(state.VerticalOffset);
textEditor.ScrollToHorizontalOffset(state.HorizontalOffset); textEditor.ScrollToHorizontalOffset(state.HorizontalOffset);
} }
@ -752,6 +753,7 @@ namespace ICSharpCode.ILSpy.TextView
} }
currentAddress = textOutput.Address; currentAddress = textOutput.Address;
currentTitle = textOutput.Title; currentTitle = textOutput.Title;
expandMemberDefinitions = DisplaySettingsPanel.CurrentDisplaySettings.ExpandMemberDefinitions;
} }
#endregion #endregion
@ -1189,6 +1191,7 @@ namespace ICSharpCode.ILSpy.TextView
state.SaveFoldingsState(foldingManager.AllFoldings); state.SaveFoldingsState(foldingManager.AllFoldings);
state.VerticalOffset = textEditor.VerticalOffset; state.VerticalOffset = textEditor.VerticalOffset;
state.HorizontalOffset = textEditor.HorizontalOffset; state.HorizontalOffset = textEditor.HorizontalOffset;
state.ExpandMemberDefinitions = expandMemberDefinitions;
state.DecompiledNodes = decompiledNodes == null ? null : new HashSet<ILSpyTreeNode>(decompiledNodes); state.DecompiledNodes = decompiledNodes == null ? null : new HashSet<ILSpyTreeNode>(decompiledNodes);
state.ViewedUri = currentAddress; state.ViewedUri = currentAddress;
return state; return state;
@ -1271,6 +1274,7 @@ namespace ICSharpCode.ILSpy.TextView
{ {
private List<(int StartOffset, int EndOffset)>? ExpandedFoldings; private List<(int StartOffset, int EndOffset)>? ExpandedFoldings;
private int FoldingsChecksum; private int FoldingsChecksum;
public bool ExpandMemberDefinitions;
public double VerticalOffset; public double VerticalOffset;
public double HorizontalOffset; public double HorizontalOffset;
@ -1283,7 +1287,7 @@ namespace ICSharpCode.ILSpy.TextView
.Aggregate((a, b) => a + b)); .Aggregate((a, b) => a + b));
} }
internal void RestoreFoldings(List<NewFolding> list) internal void RestoreFoldings(List<NewFolding> list, bool expandMemberDefinitions)
{ {
if (ExpandedFoldings == null) if (ExpandedFoldings == null)
return; return;
@ -1294,10 +1298,29 @@ namespace ICSharpCode.ILSpy.TextView
{ {
foreach (var folding in list) foreach (var folding in list)
{ {
folding.DefaultClosed = !ExpandedFoldings.Any( bool wasExpanded = ExpandedFoldings.Any(
f => f.StartOffset == folding.StartOffset f => f.StartOffset == folding.StartOffset
&& f.EndOffset == folding.EndOffset && f.EndOffset == folding.EndOffset
); );
bool isExpanded = !folding.DefaultClosed;
// State of the folding was changed
if (wasExpanded != isExpanded)
{
// The "ExpandMemberDefinitions" setting was not changed
if (expandMemberDefinitions == ExpandMemberDefinitions)
{
// restore fold state
folding.DefaultClosed = !wasExpanded;
}
else
{
// only restore fold state if fold was not a definition
if (!folding.IsDefinition)
{
folding.DefaultClosed = !wasExpanded;
}
}
}
} }
} }
} }

Loading…
Cancel
Save