diff --git a/ICSharpCode.NRefactory.CSharp/Ast/AstType.cs b/ICSharpCode.NRefactory.CSharp/Ast/AstType.cs index cf58d1cd3f..ef6a52a9a1 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/AstType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/AstType.cs @@ -127,6 +127,7 @@ namespace ICSharpCode.NRefactory.CSharp /// /// Create an ITypeReference for this AstType. + /// Uses the context (ancestors of this node) to determine the correct . /// /// /// The resulting type reference will read the context information from the @@ -135,7 +136,42 @@ namespace ICSharpCode.NRefactory.CSharp /// For resolving simple names, the current namespace and usings from the CurrentUsingScope /// (on CSharpTypeResolveContext only) is used. /// - public abstract ITypeReference ToTypeReference(NameLookupMode lookupMode = NameLookupMode.Type, InterningProvider interningProvider = null); + public ITypeReference ToTypeReference(InterningProvider interningProvider = null) + { + return ToTypeReference(GetNameLookupMode(), interningProvider); + } + + /// + /// Create an ITypeReference for this AstType. + /// + /// + /// The resulting type reference will read the context information from the + /// : + /// For resolving type parameters, the CurrentTypeDefinition/CurrentMember is used. + /// For resolving simple names, the current namespace and usings from the CurrentUsingScope + /// (on CSharpTypeResolveContext only) is used. + /// + public abstract ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null); + + /// + /// Gets the name lookup mode from the context (looking at the ancestors of this ). + /// + public NameLookupMode GetNameLookupMode() + { + AstType outermostType = this; + while (outermostType.Parent is AstType) + outermostType = (AstType)outermostType.Parent; + + if (outermostType.Parent is UsingDeclaration || outermostType.Parent is UsingAliasDeclaration) { + return NameLookupMode.TypeInUsingDeclaration; + } else if (outermostType.Role == Roles.BaseType) { + // Use BaseTypeReference for a type's base type, and for a constraint on a type. + // Do not use it for a constraint on a method. + if (outermostType.Parent is TypeDeclaration || (outermostType.Parent is Constraint && outermostType.Parent.Parent is TypeDeclaration)) + return NameLookupMode.BaseTypeReference; + } + return NameLookupMode.Type; + } /// /// Creates a pointer type from this type by nesting it in a . diff --git a/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs b/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs index 5fd82eb6b8..859b2cbb2d 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/ComposedType.cs @@ -126,7 +126,7 @@ namespace ICSharpCode.NRefactory.CSharp return this; } - public override ITypeReference ToTypeReference(NameLookupMode lookupMode = NameLookupMode.Type, InterningProvider interningProvider = null) + public override ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null) { if (interningProvider == null) interningProvider = InterningProvider.Dummy; diff --git a/ICSharpCode.NRefactory.CSharp/Ast/MemberType.cs b/ICSharpCode.NRefactory.CSharp/Ast/MemberType.cs index a3ff86af1b..bb5bef6ee6 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/MemberType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/MemberType.cs @@ -135,7 +135,7 @@ namespace ICSharpCode.NRefactory.CSharp return b.ToString(); } - public override ITypeReference ToTypeReference(NameLookupMode lookupMode = NameLookupMode.Type, InterningProvider interningProvider = null) + public override ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null) { if (interningProvider == null) interningProvider = InterningProvider.Dummy; diff --git a/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs b/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs index 87df2983f8..c21df9b313 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/PrimitiveType.cs @@ -103,7 +103,7 @@ namespace ICSharpCode.NRefactory.CSharp return Keyword; } - public override ITypeReference ToTypeReference(NameLookupMode lookupMode = NameLookupMode.Type, InterningProvider interningProvider = null) + public override ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null) { KnownTypeCode typeCode = GetTypeCodeForPrimitiveType(this.Keyword); if (typeCode == KnownTypeCode.None) diff --git a/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs b/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs index e34437b74f..5eb2832224 100644 --- a/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs +++ b/ICSharpCode.NRefactory.CSharp/Ast/SimpleType.cs @@ -158,7 +158,7 @@ namespace ICSharpCode.NRefactory.CSharp return b.ToString(); } - public override ITypeReference ToTypeReference(NameLookupMode lookupMode = NameLookupMode.Type, InterningProvider interningProvider = null) + public override ITypeReference ToTypeReference(NameLookupMode lookupMode, InterningProvider interningProvider = null) { if (interningProvider == null) interningProvider = InterningProvider.Dummy; diff --git a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantNamespaceUsageIssue.cs b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantNamespaceUsageIssue.cs index ce063af684..84d69449be 100644 --- a/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantNamespaceUsageIssue.cs +++ b/ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/RedundantNamespaceUsageIssue.cs @@ -71,7 +71,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring { base.VisitMemberType(memberType); HandleMemberReference( - memberType, memberType.Target, memberType.MemberNameToken, memberType.TypeArguments, NameLookupMode.Type, + memberType, memberType.Target, memberType.MemberNameToken, memberType.TypeArguments, memberType.GetNameLookupMode(), script => { script.Replace(memberType, RefactoringAstHelper.RemoveTarget(memberType)); }); diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs index d9a3438a25..2a3ce9f8eb 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/ResolveVisitor.cs @@ -3268,7 +3268,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver } // Figure out the correct lookup mode: - NameLookupMode lookupMode = GetNameLookupMode(simpleType); + NameLookupMode lookupMode = simpleType.GetNameLookupMode(); var typeArguments = ResolveTypeArguments(simpleType.TypeArguments); Identifier identifier = simpleType.IdentifierToken; @@ -3283,23 +3283,6 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver return rr; } - NameLookupMode GetNameLookupMode(AstType type) - { - AstType outermostType = type; - while (outermostType.Parent is AstType) - outermostType = (AstType)outermostType.Parent; - - if (outermostType.Parent is UsingDeclaration || outermostType.Parent is UsingAliasDeclaration) { - return NameLookupMode.TypeInUsingDeclaration; - } else if (outermostType.Role == Roles.BaseType) { - // Use BaseTypeReference for a type's base type, and for a constraint on a type. - // Do not use it for a constraint on a method. - if (outermostType.Parent is TypeDeclaration || (outermostType.Parent is Constraint && outermostType.Parent.Parent is TypeDeclaration)) - return NameLookupMode.BaseTypeReference; - } - return NameLookupMode.Type; - } - ResolveResult IAstVisitor.VisitMemberType(MemberType memberType) { ResolveResult target; @@ -3316,7 +3299,7 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver target = Resolve(memberType.Target); } - NameLookupMode lookupMode = GetNameLookupMode(memberType); + NameLookupMode lookupMode = memberType.GetNameLookupMode(); var typeArguments = ResolveTypeArguments(memberType.TypeArguments); Identifier identifier = memberType.MemberNameToken; ResolveResult rr = resolver.ResolveMemberAccess(target, identifier.Name, typeArguments, lookupMode); diff --git a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantNamespaceUsageInspectorTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantNamespaceUsageInspectorTests.cs index 2296a5b763..6c3a0d2466 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantNamespaceUsageInspectorTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/CodeIssues/RedundantNamespaceUsageInspectorTests.cs @@ -81,5 +81,15 @@ class Foo } }"); } + + [Test] + public void UsingAlias() + { + var input = @"using IEnumerable = System.Collections.IEnumerable;"; + + TestRefactoringContext context; + var issues = GetIssues (new RedundantNamespaceUsageIssue (), input, out context); + Assert.AreEqual (0, issues.Count); + } } }