Skip to content

Commit c9e3790

Browse files
Remove UnresolvedUsingScope
1 parent d2d9281 commit c9e3790

File tree

11 files changed

+130
-395
lines changed

11 files changed

+130
-395
lines changed

ICSharpCode.Decompiler/CSharp/CSharpDecompiler.cs

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
using System;
2020
using System.Collections.Generic;
21+
using System.Collections.Immutable;
2122
using System.Diagnostics;
2223
using System.IO;
2324
using System.Linq;
@@ -30,6 +31,7 @@
3031
using ICSharpCode.Decompiler.CSharp.Resolver;
3132
using ICSharpCode.Decompiler.CSharp.Syntax;
3233
using ICSharpCode.Decompiler.CSharp.Transforms;
34+
using ICSharpCode.Decompiler.CSharp.TypeSystem;
3335
using ICSharpCode.Decompiler.DebugInfo;
3436
using ICSharpCode.Decompiler.Disassembler;
3537
using ICSharpCode.Decompiler.Documentation;
@@ -518,11 +520,28 @@ IDocumentationProvider CreateDefaultDocumentationProvider()
518520
}
519521
}
520522

521-
DecompileRun CreateDecompileRun()
523+
DecompileRun CreateDecompileRun(HashSet<string> namespaces)
522524
{
523-
return new DecompileRun(settings) {
525+
List<INamespace> resolvedNamespaces = new List<INamespace>();
526+
foreach (var ns in namespaces)
527+
{
528+
var resolvedNamespace = typeSystem.GetNamespaceByFullName(ns);
529+
if (resolvedNamespace != null)
530+
{
531+
resolvedNamespaces.Add(resolvedNamespace);
532+
}
533+
}
534+
535+
ResolvedUsingScope usingScope = new ResolvedUsingScope(
536+
new CSharpTypeResolveContext(typeSystem.MainModule),
537+
typeSystem.RootNamespace,
538+
resolvedNamespaces.ToImmutableArray()
539+
);
540+
541+
return new DecompileRun(settings, usingScope) {
524542
DocumentationProvider = DocumentationProvider ?? CreateDefaultDocumentationProvider(),
525-
CancellationToken = CancellationToken
543+
CancellationToken = CancellationToken,
544+
Namespaces = namespaces
526545
};
527546
}
528547

@@ -554,9 +573,10 @@ string SyntaxTreeToString(SyntaxTree syntaxTree)
554573
public SyntaxTree DecompileModuleAndAssemblyAttributes()
555574
{
556575
var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainModule);
557-
DecompileRun decompileRun = CreateDecompileRun();
576+
var namespaces = new HashSet<string>();
558577
syntaxTree = new SyntaxTree();
559-
RequiredNamespaceCollector.CollectAttributeNamespaces(module, decompileRun.Namespaces);
578+
RequiredNamespaceCollector.CollectAttributeNamespaces(module, namespaces);
579+
DecompileRun decompileRun = CreateDecompileRun(namespaces);
560580
DoDecompileModuleAndAssemblyAttributes(decompileRun, decompilationContext, syntaxTree);
561581
RunTransforms(syntaxTree, decompileRun, decompilationContext);
562582
return syntaxTree;
@@ -640,9 +660,10 @@ public SyntaxTree DecompileWholeModuleAsSingleFile()
640660
public SyntaxTree DecompileWholeModuleAsSingleFile(bool sortTypes)
641661
{
642662
var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainModule);
643-
var decompileRun = CreateDecompileRun();
644663
syntaxTree = new SyntaxTree();
645-
RequiredNamespaceCollector.CollectNamespaces(module, decompileRun.Namespaces);
664+
var namespaces = new HashSet<string>();
665+
RequiredNamespaceCollector.CollectNamespaces(module, namespaces);
666+
var decompileRun = CreateDecompileRun(namespaces);
646667
DoDecompileModuleAndAssemblyAttributes(decompileRun, decompilationContext, syntaxTree);
647668
var typeDefs = metadata.GetTopLevelTypeDefinitions();
648669
if (sortTypes)
@@ -662,8 +683,9 @@ public SyntaxTree DecompileWholeModuleAsSingleFile(bool sortTypes)
662683
/// </summary>
663684
public ILTransformContext CreateILTransformContext(ILFunction function)
664685
{
665-
var decompileRun = CreateDecompileRun();
666-
RequiredNamespaceCollector.CollectNamespaces(function.Method, module, decompileRun.Namespaces);
686+
var namespaces = new HashSet<string>();
687+
RequiredNamespaceCollector.CollectNamespaces(function.Method, module, namespaces);
688+
var decompileRun = CreateDecompileRun(namespaces);
667689
return new ILTransformContext(function, typeSystem, DebugInfoProvider, settings) {
668690
CancellationToken = CancellationToken,
669691
DecompileRun = decompileRun
@@ -907,17 +929,17 @@ public SyntaxTree DecompileTypes(IEnumerable<TypeDefinitionHandle> types)
907929
if (types == null)
908930
throw new ArgumentNullException(nameof(types));
909931
var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainModule);
910-
var decompileRun = CreateDecompileRun();
911932
syntaxTree = new SyntaxTree();
912-
933+
var namespaces = new HashSet<string>();
913934
foreach (var type in types)
914935
{
915936
CancellationToken.ThrowIfCancellationRequested();
916937
if (type.IsNil)
917938
throw new ArgumentException("types contains null element");
918-
RequiredNamespaceCollector.CollectNamespaces(type, module, decompileRun.Namespaces);
939+
RequiredNamespaceCollector.CollectNamespaces(type, module, namespaces);
919940
}
920941

942+
var decompileRun = CreateDecompileRun(namespaces);
921943
DoDecompileTypes(types, decompileRun, decompilationContext, syntaxTree);
922944
RunTransforms(syntaxTree, decompileRun, decompilationContext);
923945
return syntaxTree;
@@ -949,9 +971,10 @@ public SyntaxTree DecompileType(FullTypeName fullTypeName)
949971
if (type.ParentModule != typeSystem.MainModule)
950972
throw new NotSupportedException($"Type {fullTypeName} was not found in the module being decompiled, but only in {type.ParentModule.Name}");
951973
var decompilationContext = new SimpleTypeResolveContext(typeSystem.MainModule);
952-
var decompileRun = CreateDecompileRun();
974+
var namespaces = new HashSet<string>();
953975
syntaxTree = new SyntaxTree();
954-
RequiredNamespaceCollector.CollectNamespaces(type.MetadataToken, module, decompileRun.Namespaces);
976+
RequiredNamespaceCollector.CollectNamespaces(type.MetadataToken, module, namespaces);
977+
var decompileRun = CreateDecompileRun(namespaces);
955978
DoDecompileTypes(new[] { (TypeDefinitionHandle)type.MetadataToken }, decompileRun, decompilationContext, syntaxTree);
956979
RunTransforms(syntaxTree, decompileRun, decompilationContext);
957980
return syntaxTree;
@@ -984,13 +1007,14 @@ public SyntaxTree Decompile(IEnumerable<EntityHandle> definitions)
9841007
if (definitions == null)
9851008
throw new ArgumentNullException(nameof(definitions));
9861009
syntaxTree = new SyntaxTree();
987-
var decompileRun = CreateDecompileRun();
1010+
var namespaces = new HashSet<string>();
9881011
foreach (var entity in definitions)
9891012
{
9901013
if (entity.IsNil)
9911014
throw new ArgumentException("definitions contains null element");
992-
RequiredNamespaceCollector.CollectNamespaces(entity, module, decompileRun.Namespaces);
1015+
RequiredNamespaceCollector.CollectNamespaces(entity, module, namespaces);
9931016
}
1017+
var decompileRun = CreateDecompileRun(namespaces);
9941018

9951019
bool first = true;
9961020
ITypeDefinition parentTypeDef = null;

ICSharpCode.Decompiler/CSharp/CallBuilder.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,6 @@ bool IsUnambiguousMethodReference(ExpectedTargetDetails expectedTargetDetails, I
20512051

20522052
if (isExtensionMethodReference)
20532053
{
2054-
var resolver = this.resolver.WithCurrentUsingScope(this.expressionBuilder.statementBuilder.decompileRun.UsingScope.Resolve(this.resolver.Compilation));
20552054
result = resolver.ResolveMemberAccess(target, method.Name, typeArguments, NameLookupMode.InvocationTarget) as MethodGroupResolveResult;
20562055
if (result == null)
20572056
return false;

ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public ExpressionBuilder(StatementBuilder statementBuilder, IDecompilerTypeSyste
9797
this.compilation = decompilationContext.Compilation;
9898
this.resolver = new CSharpResolver(new CSharpTypeResolveContext(
9999
compilation.MainModule,
100-
decompileRun.UsingScope.Resolve(compilation),
100+
decompileRun.UsingScope,
101101
decompilationContext.CurrentTypeDefinition,
102102
decompilationContext.CurrentMember
103103
));

ICSharpCode.Decompiler/CSharp/Transforms/IntroduceExtensionMethods.cs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,63 +42,53 @@ public void Run(AstNode rootNode, TransformContext context)
4242
{
4343
this.context = context;
4444
this.conversions = CSharpConversions.Get(context.TypeSystem);
45-
InitializeContext(rootNode.Annotation<UsingScope>());
45+
InitializeContext(rootNode.Annotation<ResolvedUsingScope>());
4646
rootNode.AcceptVisitor(this);
4747
}
4848

49-
Stack<CSharpTypeResolveContext> resolveContextStack = new Stack<CSharpTypeResolveContext>();
50-
51-
void InitializeContext(UsingScope usingScope)
49+
void InitializeContext(ResolvedUsingScope usingScope)
5250
{
53-
this.resolveContextStack = new Stack<CSharpTypeResolveContext>();
5451
if (!string.IsNullOrEmpty(context.CurrentTypeDefinition?.Namespace))
5552
{
5653
foreach (string ns in context.CurrentTypeDefinition.Namespace.Split('.'))
5754
{
58-
usingScope = new UsingScope(usingScope, ns);
55+
usingScope = usingScope.WithNestedNamespace(ns);
5956
}
6057
}
61-
var currentContext = new CSharpTypeResolveContext(context.TypeSystem.MainModule, usingScope.Resolve(context.TypeSystem), context.CurrentTypeDefinition);
62-
this.resolveContextStack.Push(currentContext);
58+
var currentContext = new CSharpTypeResolveContext(context.TypeSystem.MainModule, usingScope, context.CurrentTypeDefinition);
6359
this.resolver = new CSharpResolver(currentContext);
6460
}
6561

6662
public override void VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration)
6763
{
68-
var previousContext = resolveContextStack.Peek();
69-
var usingScope = previousContext.CurrentUsingScope.UnresolvedUsingScope;
64+
var usingScope = resolver.CurrentUsingScope;
7065
foreach (string ident in namespaceDeclaration.Identifiers)
7166
{
72-
usingScope = new UsingScope(usingScope, ident);
67+
usingScope = usingScope.WithNestedNamespace(ident);
7368
}
74-
var currentContext = new CSharpTypeResolveContext(previousContext.CurrentModule, usingScope.Resolve(previousContext.Compilation));
75-
resolveContextStack.Push(currentContext);
69+
var previousResolver = this.resolver;
7670
try
7771
{
78-
this.resolver = new CSharpResolver(currentContext);
72+
this.resolver = this.resolver.WithCurrentUsingScope(usingScope);
7973
base.VisitNamespaceDeclaration(namespaceDeclaration);
8074
}
8175
finally
8276
{
83-
this.resolver = new CSharpResolver(previousContext);
84-
resolveContextStack.Pop();
77+
this.resolver = previousResolver;
8578
}
8679
}
8780

8881
public override void VisitTypeDeclaration(TypeDeclaration typeDeclaration)
8982
{
90-
var previousContext = resolveContextStack.Peek();
91-
var currentContext = previousContext.WithCurrentTypeDefinition(typeDeclaration.GetSymbol() as ITypeDefinition);
92-
resolveContextStack.Push(currentContext);
83+
var previousResolver = this.resolver;
84+
this.resolver = resolver.WithCurrentTypeDefinition(typeDeclaration.GetSymbol() as ITypeDefinition);
9385
try
9486
{
95-
this.resolver = new CSharpResolver(currentContext);
9687
base.VisitTypeDeclaration(typeDeclaration);
9788
}
9889
finally
9990
{
100-
this.resolver = new CSharpResolver(previousContext);
101-
resolveContextStack.Pop();
91+
this.resolver = previousResolver;
10292
}
10393
}
10494

0 commit comments

Comments
 (0)