|
|
|
|
@ -1,6 +1,6 @@
@@ -1,6 +1,6 @@
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// RedundantNamespaceUsageInspector.cs
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// Author:
|
|
|
|
|
// Mike Krüger <mkrueger@xamarin.com>
|
|
|
|
|
//
|
|
|
|
|
@ -37,10 +37,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
@@ -37,10 +37,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
|
|
|
|
|
/// Finds redundant namespace usages.
|
|
|
|
|
/// </summary>
|
|
|
|
|
[IssueDescription("Remove redundant namespace usages", |
|
|
|
|
Description = "Removes namespace usages that are obsolete.", |
|
|
|
|
Category = IssueCategories.Redundancies, |
|
|
|
|
Severity = Severity.Hint, |
|
|
|
|
IssueMarker = IssueMarker.GrayOut)] |
|
|
|
|
Description = "Removes namespace usages that are obsolete.", |
|
|
|
|
Category = IssueCategories.Redundancies, |
|
|
|
|
Severity = Severity.Hint, |
|
|
|
|
IssueMarker = IssueMarker.GrayOut)] |
|
|
|
|
public class RedundantNamespaceUsageIssue : ICodeIssueProvider |
|
|
|
|
{ |
|
|
|
|
public IEnumerable<CodeIssue> GetIssues (BaseRefactoringContext context) |
|
|
|
|
@ -62,24 +62,40 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
@@ -62,24 +62,40 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
|
|
|
|
|
public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression) |
|
|
|
|
{ |
|
|
|
|
base.VisitMemberReferenceExpression(memberReferenceExpression); |
|
|
|
|
|
|
|
|
|
var result = ctx.Resolve(memberReferenceExpression.Target); |
|
|
|
|
HandleMemberReference( |
|
|
|
|
memberReferenceExpression, memberReferenceExpression.Target, memberReferenceExpression.MemberNameToken, memberReferenceExpression.TypeArguments, SimpleNameLookupMode.Expression, |
|
|
|
|
script => { |
|
|
|
|
script.Replace(memberReferenceExpression, RefactoringAstHelper.RemoveTarget(memberReferenceExpression)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public override void VisitMemberType(MemberType memberType) |
|
|
|
|
{ |
|
|
|
|
base.VisitMemberType(memberType); |
|
|
|
|
HandleMemberReference( |
|
|
|
|
memberType, memberType.Target, memberType.MemberNameToken, memberType.TypeArguments, SimpleNameLookupMode.Type, |
|
|
|
|
script => { |
|
|
|
|
script.Replace(memberType, RefactoringAstHelper.RemoveTarget(memberType)); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void HandleMemberReference(AstNode wholeNode, AstNode targetNode, Identifier memberName, IEnumerable<AstType> typeArguments, SimpleNameLookupMode mode, Action<Script> action) |
|
|
|
|
{ |
|
|
|
|
var result = ctx.Resolve(targetNode); |
|
|
|
|
if (!(result is NamespaceResolveResult)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
var wholeResult = ctx.Resolve(memberReferenceExpression); |
|
|
|
|
var wholeResult = ctx.Resolve(wholeNode); |
|
|
|
|
if (!(wholeResult is TypeResolveResult)) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var state = ctx.GetResolverStateBefore(memberReferenceExpression); |
|
|
|
|
var lookupName = state.LookupSimpleNameOrTypeName(memberReferenceExpression.MemberName, new List<IType> (), SimpleNameLookupMode.Expression); |
|
|
|
|
var state = ctx.GetResolverStateBefore(wholeNode); |
|
|
|
|
var resolvedTypeArguments = typeArguments.Select(ctx.ResolveType).ToList(); |
|
|
|
|
var lookupName = state.LookupSimpleNameOrTypeName(memberName.Name, resolvedTypeArguments, mode); |
|
|
|
|
|
|
|
|
|
if (lookupName is TypeResolveResult && !lookupName.IsError && wholeResult.Type.Equals(lookupName.Type)) { |
|
|
|
|
AddIssue(memberReferenceExpression.StartLocation, memberReferenceExpression.MemberNameToken.StartLocation, ctx.TranslateString("Remove redundant namespace usage"), script => { |
|
|
|
|
script.Replace(memberReferenceExpression, RefactoringAstHelper.RemoveTarget(memberReferenceExpression)); |
|
|
|
|
} |
|
|
|
|
); |
|
|
|
|
AddIssue(wholeNode.StartLocation, memberName.StartLocation, ctx.TranslateString("Remove redundant namespace usage"), action); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|