Browse Source

Fix disambiguation of type names.

pull/728/head
Daniel Grunwald 10 years ago
parent
commit
d4d871631c
  1. 21
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUsingDeclarations.cs
  2. 2
      NRefactory

21
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceUsingDeclarations.cs

@ -140,8 +140,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
public override void VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration) public override void VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration)
{ {
var previousContext = context.Peek(); var previousContext = context.Peek();
var currentUsingScope = new UsingScope(previousContext.CurrentUsingScope.UnresolvedUsingScope, namespaceDeclaration.Identifiers.Last()); var usingScope = previousContext.CurrentUsingScope.UnresolvedUsingScope;
var currentContext = new CSharpTypeResolveContext(previousContext.CurrentAssembly, currentUsingScope.Resolve(previousContext.Compilation)); foreach (string ident in namespaceDeclaration.Identifiers) {
usingScope = new UsingScope(usingScope, ident);
}
var currentContext = new CSharpTypeResolveContext(previousContext.CurrentAssembly, usingScope.Resolve(previousContext.Compilation));
context.Push(currentContext); context.Push(currentContext);
try { try {
astBuilder = CreateAstBuilder(currentContext); astBuilder = CreateAstBuilder(currentContext);
@ -166,7 +169,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
public override void VisitSimpleType(SimpleType simpleType) public override void VisitSimpleType(SimpleType simpleType)
{ {
TypeResolveResult rr; TypeResolveResult rr;
if (simpleType.Ancestors.OfType<UsingDeclaration>().Any() || (rr = simpleType.Annotation<TypeResolveResult>()) == null) { if ((rr = simpleType.Annotation<TypeResolveResult>()) == null) {
base.VisitSimpleType(simpleType); base.VisitSimpleType(simpleType);
return; return;
} }
@ -175,6 +178,18 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
base.VisitSimpleType(simpleType); base.VisitSimpleType(simpleType);
return; return;
} }
astBuilder.NameLookupMode = simpleType.GetNameLookupMode();
if (astBuilder.NameLookupMode == NameLookupMode.Type) {
AstType outermostType = simpleType;
while (outermostType.Parent is AstType)
outermostType = (AstType)outermostType.Parent;
if (outermostType.Parent is TypeReferenceExpression) {
// ILSpy uses TypeReferenceExpression in expression context even when the C# parser
// wouldn't know that it's a type reference.
// Fall back to expression-mode lookup in these cases:
astBuilder.NameLookupMode = NameLookupMode.Expression;
}
}
simpleType.ReplaceWith(astBuilder.ConvertType(rr.Type)); simpleType.ReplaceWith(astBuilder.ConvertType(rr.Type));
} }
} }

2
NRefactory

@ -1 +1 @@
Subproject commit 8369bc77d14701792c05fa6bb50f7d299072041b Subproject commit f89093760da14a6f1c42161d0428c990434d1ecd
Loading…
Cancel
Save