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 @@ -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)));
WriteTypeParameters(output, module, genericContext, typeDefinition.GetGenericParameters());
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType);
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && isInType, isDefinition: isInType);
output.WriteLine();
EntityHandle baseType = typeDefinition.GetBaseTypeOrNil();
@ -1796,7 +1796,7 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -1796,7 +1796,7 @@ namespace ICSharpCode.Decompiler.Disassembler
void OpenBlock(bool defaultCollapsed)
{
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed);
output.MarkFoldStart(defaultCollapsed: !ExpandMemberDefinitions && defaultCollapsed, isDefinition: true);
output.WriteLine();
output.WriteLine("{");
output.Indent();

2
ICSharpCode.Decompiler/Output/ITextOutput.cs

@ -39,7 +39,7 @@ namespace ICSharpCode.Decompiler @@ -39,7 +39,7 @@ namespace ICSharpCode.Decompiler
void WriteReference(IMember member, string text, 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();
}

4
ICSharpCode.Decompiler/Output/PlainTextOutput.cs

@ -143,7 +143,7 @@ namespace ICSharpCode.Decompiler @@ -143,7 +143,7 @@ namespace ICSharpCode.Decompiler
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 @@ -190,7 +190,7 @@ namespace ICSharpCode.Decompiler
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));
}

2
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -255,7 +255,7 @@ namespace ICSharpCode.Decompiler @@ -255,7 +255,7 @@ namespace ICSharpCode.Decompiler
braceLevelWithinType++;
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("{");
break;

5
ILSpy/TextView/AvalonEditTextOutput.cs

@ -312,14 +312,15 @@ namespace ICSharpCode.ILSpy.TextView @@ -312,14 +312,15 @@ namespace ICSharpCode.ILSpy.TextView
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();
openFoldings.Push((
new NewFolding {
StartOffset = this.TextLength,
Name = collapsedText,
DefaultClosed = defaultCollapsed
DefaultClosed = defaultCollapsed,
IsDefinition = isDefinition,
}, lineNumber));
}

29
ILSpy/TextView/DecompilerTextView.cs

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