diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java index a6ccf08..5dfb49f 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java @@ -37,6 +37,7 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.LambdaExpression; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; +import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.ReturnStatement; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; @@ -108,7 +109,55 @@ public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix { return true; } } + + private static final class ThisExpressionFinder extends ASTVisitor { + private final ArrayList fNodes= new ArrayList(); + + public static ArrayList perform(ASTNode node) { + ThisExpressionFinder finder= new ThisExpressionFinder(); + node.accept(finder); + return finder.fNodes; + } + + @Override + public boolean visit(ThisExpression node) { + fNodes.add(node); + return true; + } + } + private static final class SuperFieldAccessFinder extends ASTVisitor { + private final ArrayList fNodes= new ArrayList(); + + public static ArrayList perform(ASTNode node) { + SuperFieldAccessFinder finder= new SuperFieldAccessFinder(); + node.accept(finder); + return finder.fNodes; + } + + @Override + public boolean visit(SuperFieldAccess node) { + fNodes.add(node); + return true; + } + } + + private static final class SuperMethodInvocationFinder extends ASTVisitor { + private final ArrayList fNodes= new ArrayList(); + + public static ArrayList perform(ASTNode node) { + SuperMethodInvocationFinder finder= new SuperMethodInvocationFinder(); + node.accept(finder); + return finder.fNodes; + } + + @Override + public boolean visit(SuperMethodInvocation node) { + fNodes.add(node); + return true; + } + } + private static class AbortSearchException extends RuntimeException { private static final long serialVersionUID= 1L; } @@ -379,6 +428,18 @@ public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix { MethodDeclaration methodDeclaration= StubUtility2.createImplementationStub(cuRewrite.getCu(), rewrite, importRewrite, importContext, methodBinding, parameterNames, lambdaTypeBinding.getName(), settings, false); + // Qualify reference to this or super + ITypeBinding typeBinding = lambdaExpression.resolveMethodBinding().getDeclaringClass(); + for (ThisExpression thisExpression : ThisExpressionFinder.perform(lambdaExpression)) { + addClassScopeToThisExpression(thisExpression, rewrite.getAST().newSimpleName(typeBinding.getName()), rewrite); + } + for (SuperFieldAccess superFieldAccess : SuperFieldAccessFinder.perform(lambdaExpression)) { + addClassScopeToSuperFieldAccess(superFieldAccess, rewrite.getAST().newSimpleName(typeBinding.getName()), rewrite); + } + for (SuperMethodInvocation superMethodInvocation : SuperMethodInvocationFinder.perform(lambdaExpression)) { + addClassScopeToSuperMethodInvocation(superMethodInvocation, rewrite.getAST().newSimpleName(typeBinding.getName()), rewrite); + } + Block block; ASTNode lambdaBody= lambdaExpression.getBody(); if (lambdaBody instanceof Block) { @@ -550,4 +611,23 @@ public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix { || locationInParent == CastExpression.EXPRESSION_PROPERTY; */ } + + private static void addClassScopeToThisExpression(ThisExpression thisExpression, Name declaringClass, ASTRewrite rewrite) { + ThisExpression newThisExpression = (ThisExpression) ASTNode.copySubtree(rewrite.getAST(), thisExpression); + newThisExpression.setQualifier(declaringClass); + rewrite.replace(thisExpression, newThisExpression, null); + } + + private static void addClassScopeToSuperFieldAccess(SuperFieldAccess superFieldAccess, Name declaringClass, ASTRewrite rewrite) { + SuperFieldAccess newSuperFieldAccess = (SuperFieldAccess) ASTNode.copySubtree(rewrite.getAST(), superFieldAccess); + newSuperFieldAccess.setQualifier(declaringClass); + rewrite.replace(superFieldAccess, newSuperFieldAccess, null); + } + + private static void addClassScopeToSuperMethodInvocation(SuperMethodInvocation superMethodInvocation, Name declaringClass, ASTRewrite rewrite) { + SuperMethodInvocation newSuperMethodInvocation = (SuperMethodInvocation) ASTNode.copySubtree(rewrite.getAST(), superMethodInvocation); + newSuperMethodInvocation.setQualifier(declaringClass); + rewrite.replace(superMethodInvocation, newSuperMethodInvocation, null); + } + }