public override void VisitMemberType(MemberType memberType)
 {
     base.VisitMemberType(memberType);
     HandleMemberReference(
         memberType, memberType.Target, memberType.MemberNameToken, memberType.TypeArguments, memberType.GetNameLookupMode(),
         script => {
         script.Replace(memberType, RefactoringAstHelper.RemoveTarget(memberType));
     });
 }
 public override void VisitMemberReferenceExpression(MemberReferenceExpression memberReferenceExpression)
 {
     base.VisitMemberReferenceExpression(memberReferenceExpression);
     HandleMemberReference(
         memberReferenceExpression, memberReferenceExpression.Target, memberReferenceExpression.MemberNameToken, memberReferenceExpression.TypeArguments, NameLookupMode.Expression,
         script => {
         script.Replace(memberReferenceExpression, RefactoringAstHelper.RemoveTarget(memberReferenceExpression));
     });
 }
            void AnalyzeThisReferenceExpression(ThisReferenceExpression thisReferenceExpression)
            {
                var memberReference = thisReferenceExpression.Parent as MemberReferenceExpression;

                if (memberReference == null)
                {
                    return;
                }

                var state       = ctx.GetResolverStateAfter(thisReferenceExpression);
                var wholeResult = ctx.Resolve(memberReference);

                IMember member = GetMember(wholeResult);

                if (member == null)
                {
                    return;
                }

                var localDeclarationSpace = declarationsSpaceVisitor.GetDeclarationSpace(thisReferenceExpression);

                if (localDeclarationSpace == null || localDeclarationSpace.IsNameUsed(member.Name))
                {
                    return;
                }

                var result       = state.LookupSimpleNameOrTypeName(memberReference.MemberName, EmptyList <IType> .Instance, NameLookupMode.Expression);
                var parentResult = ctx.Resolve(memberReference.Parent) as AlInvocationResolveResult;

                bool isRedundant;

                if (result is MemberResolveResult)
                {
                    isRedundant = ((MemberResolveResult)result).Member.Region.Equals(member.Region);
                }
                else if (parentResult != null && parentResult.IsExtensionMethodInvocation)
                {
                    // 'this.' is required for extension method invocation
                    isRedundant = false;
                }
                else if (result is MethodGroupResolveResult)
                {
                    isRedundant = ((MethodGroupResolveResult)result).Methods.Any(m => m.Region.Equals(member.Region));
                }
                else
                {
                    return;
                }

                if (isRedundant)
                {
                    var issueDescription  = ctx.TranslateString("'this.' is redundant and can be removed safely.");
                    var actionDescription = ctx.TranslateString("Remove 'this.'");
                    AddIssue(new CodeIssue(thisReferenceExpression.StartLocation, memberReference.MemberNameToken.StartLocation, issueDescription, actionDescription, script => {
                        script.Replace(memberReference, RefactoringAstHelper.RemoveTarget(memberReference));
                    })
                    {
                        IssueMarker = IssueMarker.GrayOut
                    });
                }
            }