diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index 709dcc84bf..df64724f10 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -107,6 +107,7 @@ public String mapResourceName(int classFileFormatVersion, String resourceName) { patchEcjTransformers(sm); patchExtensionMethod(sm); patchRenameField(sm); + patchInline(sm); patchNullCheck(sm); patchForTests(sm); @@ -218,6 +219,15 @@ private static void patchExtractInterfaceAndPullUp(ScriptManager sm) { .build()); } + private static void patchInline(ScriptManager sm) { + sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.wrapReturnValue() + .target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider", "getCodeBlocks", "java.lang.String[]", "org.eclipse.jdt.internal.corext.refactoring.code.CallContext", "org.eclipse.jdt.core.dom.rewrite.ImportRewrite")) + .wrapMethod(new Hook("lombok.launch.PatchFixesHider$PatchFixes", "getRealCodeBlocks", "java.lang.String[]", "java.lang.String[]", "org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider", "org.eclipse.jdt.internal.corext.refactoring.code.CallContext")) + .request(StackRequest.RETURN_VALUE, StackRequest.THIS, StackRequest.PARAM1) + .transplant() + .build()); + } + private static void patchAboutDialog(ScriptManager sm) { /* * Add a line about lombok (+ version info) to eclipse's about dialog. @@ -1023,7 +1033,7 @@ private static void patchASTNodeSearchUtil(ScriptManager sm) { } private static void patchForTests(ScriptManager sm) { - sm.addScriptIfWitness(new String[] {"lombok/eclipse/EclipseTests"}, ScriptBuilder.wrapReturnValue() + sm.addScriptIfWitness(new String[] {"lombok/eclipse/EclipseRunner"}, ScriptBuilder.wrapReturnValue() .target(new MethodTarget("org.osgi.framework.FrameworkUtil", "getBundle", "org.osgi.framework.Bundle", "java.lang.Class")) .request(StackRequest.RETURN_VALUE, StackRequest.PARAM1) .wrapMethod(new Hook("lombok.launch.PatchFixesHider$Tests", "getBundle", "java.lang.Object", "java.lang.Object", "java.lang.Class")) diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java index 00c333a416..dcbcff235b 100755 --- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java +++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java @@ -43,7 +43,11 @@ import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTNode; +import org.eclipse.jdt.core.dom.MethodDeclaration; 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; import org.eclipse.jdt.core.dom.Type; @@ -61,6 +65,8 @@ import org.eclipse.jdt.internal.core.dom.rewrite.RewriteEvent; import org.eclipse.jdt.internal.core.dom.rewrite.TokenScanner; import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup; +import org.eclipse.jdt.internal.corext.refactoring.code.CallContext; +import org.eclipse.jdt.internal.corext.refactoring.code.SourceProvider; import org.eclipse.jdt.internal.corext.refactoring.structure.MemberVisibilityAdjustor.IncomingMemberVisibilityAdjustment; import lombok.permit.Permit; @@ -902,6 +908,42 @@ public static java.lang.String getRealNodeSource(java.lang.String original, org. public static boolean skipRewriteVisibility(IncomingMemberVisibilityAdjustment adjustment) { return isGenerated(adjustment.getMember()); } + + public static String[] getRealCodeBlocks(String[] blocks, SourceProvider sourceProvider, CallContext callContext) { + MethodDeclaration methodDeclaration = sourceProvider.getDeclaration(); + if (!isGenerated(methodDeclaration)) { + return blocks; + } + + try { + // Replace parameter references with actual argument + AST ast = methodDeclaration.getAST(); + List parameters = methodDeclaration.parameters(); + for (int i = 0; i < parameters.size(); i++) { + SingleVariableDeclaration param = (SingleVariableDeclaration) parameters.get(i); + Object data = param.getProperty("org.eclipse.jdt.internal.corext.refactoring.code.ParameterData"); + List names = Permit.get(Permit.permissiveGetField(data.getClass(), "fReferences"), data); + + for (SimpleName simpleName : names) { + ASTNode copy = ASTNode.copySubtree(ast, callContext.arguments[i]); + simpleName.getParent().setStructuralProperty(simpleName.getLocationInParent(), copy); + } + } + // Convert AST to source + StringBuilder sb = new StringBuilder(); + for (Object statement : methodDeclaration.getBody().statements()) { + if (callContext.callMode != ASTNode.RETURN_STATEMENT && statement instanceof ReturnStatement) { + ReturnStatement returnStatement = (ReturnStatement) statement; + sb.append(returnStatement.getExpression()); + } else { + sb.append(statement); + } + } + return new String[] {sb.toString().trim()}; + } catch (Throwable e) { + return blocks; + } + } } public static class Tests { diff --git a/test/eclipse/resource/inline/getter/after/InlineGetter.java b/test/eclipse/resource/inline/getter/after/InlineGetter.java new file mode 100644 index 0000000000..136a889443 --- /dev/null +++ b/test/eclipse/resource/inline/getter/after/InlineGetter.java @@ -0,0 +1,16 @@ +package pkg; + +import lombok.Getter; + +@Getter +public class InlineGetter { + private String string; + + public String asReturn() { + return this.string; + } + + public void asAssignment() { + String a = this.string; + } +} \ No newline at end of file diff --git a/test/eclipse/resource/inline/getter/before/InlineGetter.java b/test/eclipse/resource/inline/getter/before/InlineGetter.java new file mode 100644 index 0000000000..17759bbe18 --- /dev/null +++ b/test/eclipse/resource/inline/getter/before/InlineGetter.java @@ -0,0 +1,16 @@ +package pkg; + +import lombok.Getter; + +@Getter +public class InlineGetter { + private String string; + + public String asReturn() { + return getString(); + } + + public void asAssignment() { + String a = getString(); + } +} \ No newline at end of file diff --git a/test/eclipse/resource/inline/setter/after/InlineSetter.java b/test/eclipse/resource/inline/setter/after/InlineSetter.java new file mode 100644 index 0000000000..e1074101c5 --- /dev/null +++ b/test/eclipse/resource/inline/setter/after/InlineSetter.java @@ -0,0 +1,12 @@ +package pkg; + +import lombok.Setter; + +@Setter +public class InlineSetter { + private String string; + + public void test() { + this.string="test"; + } +} \ No newline at end of file diff --git a/test/eclipse/resource/inline/setter/before/InlineSetter.java b/test/eclipse/resource/inline/setter/before/InlineSetter.java new file mode 100644 index 0000000000..45d9fe27b6 --- /dev/null +++ b/test/eclipse/resource/inline/setter/before/InlineSetter.java @@ -0,0 +1,12 @@ +package pkg; + +import lombok.Setter; + +@Setter +public class InlineSetter { + private String string; + + public void test() { + setString("test"); + } +} \ No newline at end of file diff --git a/test/eclipse/src/lombok/eclipse/EclipseTests.java b/test/eclipse/src/lombok/eclipse/EclipseTests.java index b293b8aeab..5fba99039f 100644 --- a/test/eclipse/src/lombok/eclipse/EclipseTests.java +++ b/test/eclipse/src/lombok/eclipse/EclipseTests.java @@ -7,11 +7,12 @@ import lombok.eclipse.cleanup.CleanupTest; import lombok.eclipse.edit.SelectTest; import lombok.eclipse.refactoring.ExtractInterfaceTest; +import lombok.eclipse.refactoring.InlineTest; import lombok.eclipse.refactoring.RenameTest; import lombok.eclipse.references.FindReferencesTest; @RunWith(Suite.class) -@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class, FindReferencesTest.class}) +@SuiteClasses({ExtractInterfaceTest.class, RenameTest.class, SelectTest.class, CleanupTest.class, FindReferencesTest.class, InlineTest.class}) public class EclipseTests { } diff --git a/test/eclipse/src/lombok/eclipse/refactoring/InlineTest.java b/test/eclipse/src/lombok/eclipse/refactoring/InlineTest.java new file mode 100644 index 0000000000..1a3315b76d --- /dev/null +++ b/test/eclipse/src/lombok/eclipse/refactoring/InlineTest.java @@ -0,0 +1,41 @@ +package lombok.eclipse.refactoring; + +import static lombok.eclipse.RefactoringUtils.performRefactoring; + +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.internal.corext.refactoring.code.InlineMethodRefactoring; +import org.eclipse.jdt.internal.corext.refactoring.util.RefactoringASTParser; +import org.eclipse.jdt.internal.ui.javaeditor.ASTProvider; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import lombok.eclipse.EclipseRunner; +import lombok.eclipse.SetupBeforeAfterTest; + +@RunWith(EclipseRunner.class) +public class InlineTest { + + @Rule + public SetupBeforeAfterTest setup = new SetupBeforeAfterTest(); + + @Test + public void getter() throws Exception { + ICompilationUnit cu = setup.getPackageFragment().getCompilationUnit("InlineGetter.java"); + + CompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true); + + performRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 139, 0)); + performRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 200, 0)); + } + + @Test + public void setter() throws Exception { + ICompilationUnit cu = setup.getPackageFragment().getCompilationUnit("InlineSetter.java"); + + CompilationUnit compilationUnit = new RefactoringASTParser(ASTProvider.SHARED_AST_LEVEL).parse(cu, true); + + performRefactoring(InlineMethodRefactoring.create(cu, compilationUnit, 126, 0)); + } +}