mirror of
https://github.com/tiennm99/lombok.git
synced 2026-09-09 00:20:40 +00:00
Merge branch 'jvanderhel-Issue_86_Extract_Interface'
This commit is contained in:
@@ -92,6 +92,7 @@ public class EclipsePatcher extends Agent {
|
||||
patchListRewriteHandleGeneratedMethods(sm);
|
||||
patchSyntaxAndOccurrencesHighlighting(sm);
|
||||
patchSortMembersOperation(sm);
|
||||
patchExtractInterface(sm);
|
||||
} else {
|
||||
patchPostCompileHookEcj(sm);
|
||||
}
|
||||
@@ -103,6 +104,51 @@ public class EclipsePatcher extends Agent {
|
||||
if (reloadExistingClasses) sm.reloadClasses(instrumentation);
|
||||
}
|
||||
|
||||
private static void patchExtractInterface(ScriptManager sm) {
|
||||
/* Fix sourceEnding for generated nodes to avoid null pointer */
|
||||
sm.addScript(ScriptBuilder.wrapMethodCall()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.compiler.SourceElementNotifier", "notifySourceElementRequestor", "void", "org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration", "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", "org.eclipse.jdt.internal.compiler.ast.ImportReference"))
|
||||
.methodToWrap(new Hook("org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt", "get", "int", "java.lang.Object"))
|
||||
.wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "getSourceEndFixed", "int", "int", "org.eclipse.jdt.internal.compiler.ast.ASTNode"))
|
||||
.requestExtra(StackRequest.PARAM1)
|
||||
.transplant().build());
|
||||
|
||||
/* Make sure the generated source element is found instead of the annotation */
|
||||
sm.addScript(ScriptBuilder.wrapMethodCall()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor", "createMethodDeclaration", "void",
|
||||
"org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite",
|
||||
"org.eclipse.jdt.core.dom.rewrite.ASTRewrite",
|
||||
"org.eclipse.jdt.core.dom.AbstractTypeDeclaration",
|
||||
"org.eclipse.jdt.core.dom.MethodDeclaration"
|
||||
))
|
||||
.methodToWrap(new Hook("org.eclipse.jface.text.IDocument", "get", "java.lang.String", "int", "int"))
|
||||
.wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "getRealMethodDeclarationSource", "java.lang.String", "java.lang.String", "org.eclipse.jdt.core.dom.MethodDeclaration"))
|
||||
.requestExtra(StackRequest.PARAM4)
|
||||
.build());
|
||||
|
||||
/* get real generated node in stead of a random one generated by the annotation */
|
||||
sm.addScript(ScriptBuilder.replaceMethodCall()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor", "createMemberDeclarations"))
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor", "createMethodComments"))
|
||||
.methodToReplace(new Hook("org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil", "getMethodDeclarationNode", "org.eclipse.jdt.core.dom.MethodDeclaration", "org.eclipse.jdt.core.IMethod", "org.eclipse.jdt.core.dom.CompilationUnit"))
|
||||
.replacementMethod(new Hook("lombok.eclipse.agent.PatchFixes", "getRealMethodDeclarationNode", "org.eclipse.jdt.core.dom.MethodDeclaration", "org.eclipse.jdt.core.IMethod", "org.eclipse.jdt.core.dom.CompilationUnit"))
|
||||
.build());
|
||||
|
||||
/* Do not add @Override's for generated methods */
|
||||
sm.addScript(ScriptBuilder.exitEarly()
|
||||
.target(new MethodTarget("org.eclipse.jdt.core.dom.rewrite.ListRewrite", "insertFirst"))
|
||||
.decisionMethod(new Hook("lombok.eclipse.agent.PatchFixes", "isListRewriteOnGeneratedNode", "boolean", "org.eclipse.jdt.core.dom.rewrite.ListRewrite"))
|
||||
.request(StackRequest.THIS)
|
||||
.build());
|
||||
|
||||
/* Do not add comments for generated methods */
|
||||
sm.addScript(ScriptBuilder.exitEarly()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor", "createMethodComment"))
|
||||
.decisionMethod(new Hook("lombok.eclipse.agent.PatchFixes", "isGenerated", "boolean", "org.eclipse.jdt.core.dom.ASTNode"))
|
||||
.request(StackRequest.PARAM2)
|
||||
.build());
|
||||
}
|
||||
|
||||
private static void patchSyntaxAndOccurrencesHighlighting(ScriptManager sm) {
|
||||
/*
|
||||
* Skip generated nodes for "visual effects" (syntax highlighting && highlight occurrences)
|
||||
@@ -233,25 +279,6 @@ public class EclipsePatcher extends Agent {
|
||||
}
|
||||
|
||||
private static void patchHideGeneratedNodes(ScriptManager sm) {
|
||||
sm.addScript(ScriptBuilder.wrapMethodCall()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.compiler.SourceElementNotifier", "notifySourceElementRequestor", "void", "org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration", "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", "org.eclipse.jdt.internal.compiler.ast.ImportReference"))
|
||||
.methodToWrap(new Hook("org.eclipse.jdt.internal.compiler.util.HashtableOfObjectToInt", "get", "int", "java.lang.Object"))
|
||||
.wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "getSourceEndFixed", "int", "int", "org.eclipse.jdt.internal.compiler.ast.ASTNode"))
|
||||
.requestExtra(StackRequest.PARAM1)
|
||||
.transplant().build());
|
||||
|
||||
sm.addScript(ScriptBuilder.wrapMethodCall()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.refactoring.structure.ExtractInterfaceProcessor", "createMethodDeclaration", "void",
|
||||
"org.eclipse.jdt.internal.corext.refactoring.structure.CompilationUnitRewrite",
|
||||
"org.eclipse.jdt.core.dom.rewrite.ASTRewrite",
|
||||
"org.eclipse.jdt.core.dom.AbstractTypeDeclaration",
|
||||
"org.eclipse.jdt.core.dom.MethodDeclaration"
|
||||
))
|
||||
.methodToWrap(new Hook("org.eclipse.jface.text.IDocument", "get", "java.lang.String", "int", "int"))
|
||||
.wrapMethod(new Hook("lombok.eclipse.agent.PatchFixes", "getRealMethodDeclarationSource", "java.lang.String", "java.lang.String", "org.eclipse.jdt.core.dom.MethodDeclaration"))
|
||||
.requestExtra(StackRequest.PARAM4)
|
||||
.build());
|
||||
|
||||
sm.addScript(ScriptBuilder.wrapReturnValue()
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder", "findByNode"))
|
||||
.target(new MethodTarget("org.eclipse.jdt.internal.corext.dom.LinkedNodeFinder", "findByBinding"))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Project Lombok Authors.
|
||||
* Copyright (C) 2010-2012 The Project Lombok Authors.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -28,6 +28,7 @@ import java.io.OutputStream;
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
import lombok.core.DiagnosticsReceiver;
|
||||
import lombok.core.PostCompiler;
|
||||
@@ -36,11 +37,15 @@ import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.jdt.core.IAnnotatable;
|
||||
import org.eclipse.jdt.core.IAnnotation;
|
||||
import org.eclipse.jdt.core.IMethod;
|
||||
import org.eclipse.jdt.core.IType;
|
||||
import org.eclipse.jdt.core.JavaModelException;
|
||||
import org.eclipse.jdt.core.dom.MethodDeclaration;
|
||||
import org.eclipse.jdt.core.dom.SimpleName;
|
||||
import org.eclipse.jdt.internal.compiler.ast.Annotation;
|
||||
import org.eclipse.jdt.internal.core.dom.rewrite.NodeRewriteEvent;
|
||||
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.structure.ASTNodeSearchUtil;
|
||||
|
||||
public class PatchFixes {
|
||||
public static boolean isGenerated(org.eclipse.jdt.core.dom.ASTNode node) {
|
||||
@@ -55,6 +60,10 @@ public class PatchFixes {
|
||||
return result;
|
||||
}
|
||||
|
||||
public static boolean isListRewriteOnGeneratedNode(org.eclipse.jdt.core.dom.rewrite.ListRewrite rewrite) {
|
||||
return isGenerated(rewrite.getParent());
|
||||
}
|
||||
|
||||
public static boolean returnFalse(java.lang.Object object) {
|
||||
return false;
|
||||
}
|
||||
@@ -75,16 +84,76 @@ public class PatchFixes {
|
||||
|
||||
/* Very practical implementation, but works for getter and setter even with type parameters */
|
||||
public static java.lang.String getRealMethodDeclarationSource(java.lang.String original, org.eclipse.jdt.core.dom.MethodDeclaration declaration) {
|
||||
if(isGenerated(declaration)) {
|
||||
String returnType = declaration.getReturnType2().toString();
|
||||
String params = "";
|
||||
for (Object object : declaration.parameters()) {
|
||||
org.eclipse.jdt.core.dom.ASTNode parameter = ((org.eclipse.jdt.core.dom.ASTNode)object);
|
||||
params += ","+parameter.toString();
|
||||
}
|
||||
return returnType + " "+declaration.getName().getFullyQualifiedName()+"("+(params.isEmpty() ? "" : params.substring(1))+");";
|
||||
if (!isGenerated(declaration)) return original;
|
||||
|
||||
StringBuilder signature = new StringBuilder();
|
||||
|
||||
// We should get these from the refactor action
|
||||
boolean needsPublic = true, needsAbstract = true;
|
||||
|
||||
if (needsPublic) signature.append("public ");
|
||||
if (needsAbstract) signature.append("abstract ");
|
||||
|
||||
signature
|
||||
.append(declaration.getReturnType2().toString())
|
||||
.append(" ").append(declaration.getName().getFullyQualifiedName())
|
||||
.append("(");
|
||||
|
||||
boolean first = true;
|
||||
for (Object parameter : declaration.parameters()) {
|
||||
if (!first) signature.append(", ");
|
||||
first = false;
|
||||
// The annotations are still missing
|
||||
// Note: what happens to imports for the annotations?
|
||||
// I assume they have been taken care of by the default extraction system
|
||||
signature.append(parameter);
|
||||
}
|
||||
return original;
|
||||
|
||||
signature.append(");");
|
||||
return signature.toString();
|
||||
}
|
||||
|
||||
|
||||
public static org.eclipse.jdt.core.dom.MethodDeclaration getRealMethodDeclarationNode(org.eclipse.jdt.core.IMethod sourceMethod, org.eclipse.jdt.core.dom.CompilationUnit cuUnit) throws JavaModelException {
|
||||
MethodDeclaration methodDeclarationNode = ASTNodeSearchUtil.getMethodDeclarationNode(sourceMethod, cuUnit);
|
||||
if (isGenerated(methodDeclarationNode)) {
|
||||
IType declaringType = sourceMethod.getDeclaringType();
|
||||
Stack<IType> typeStack = new Stack<IType>();
|
||||
while (declaringType != null) {
|
||||
typeStack.push(declaringType);
|
||||
declaringType = declaringType.getDeclaringType();
|
||||
}
|
||||
|
||||
IType rootType = typeStack.pop();
|
||||
org.eclipse.jdt.core.dom.AbstractTypeDeclaration typeDeclaration = findTypeDeclaration(rootType, cuUnit.types());
|
||||
while (!typeStack.isEmpty() && typeDeclaration != null) {
|
||||
typeDeclaration = findTypeDeclaration(typeStack.pop(), typeDeclaration.bodyDeclarations());
|
||||
}
|
||||
|
||||
if (typeStack.isEmpty() && typeDeclaration != null) {
|
||||
String methodName = sourceMethod.getElementName();
|
||||
for (Object declaration : typeDeclaration.bodyDeclarations()) {
|
||||
if (declaration instanceof org.eclipse.jdt.core.dom.MethodDeclaration) {
|
||||
org.eclipse.jdt.core.dom.MethodDeclaration methodDeclaration = (org.eclipse.jdt.core.dom.MethodDeclaration) declaration;
|
||||
if (methodDeclaration.getName().toString().equals(methodName)) {
|
||||
return methodDeclaration;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return methodDeclarationNode;
|
||||
}
|
||||
|
||||
private static org.eclipse.jdt.core.dom.AbstractTypeDeclaration findTypeDeclaration(IType searchType, List<?> nodes) {
|
||||
for (Object object : nodes) {
|
||||
if (object instanceof org.eclipse.jdt.core.dom.AbstractTypeDeclaration) {
|
||||
org.eclipse.jdt.core.dom.AbstractTypeDeclaration typeDeclaration = (org.eclipse.jdt.core.dom.AbstractTypeDeclaration) object;
|
||||
if (typeDeclaration.getName().toString().equals(searchType.getElementName()))
|
||||
return typeDeclaration;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static int getSourceEndFixed(int sourceEnd, org.eclipse.jdt.internal.compiler.ast.ASTNode node) throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user