diff options
Diffstat (limited to 'src')
6 files changed, 91 insertions, 63 deletions
diff --git a/src/core/lombok/eclipse/EcjAugments.java b/src/core/lombok/eclipse/EcjAugments.java index 965c4fb6..cd7173a8 100644 --- a/src/core/lombok/eclipse/EcjAugments.java +++ b/src/core/lombok/eclipse/EcjAugments.java @@ -28,6 +28,7 @@ import java.util.concurrent.ConcurrentMap; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.Annotation; import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; +import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.core.CompilationUnit; import org.eclipse.jdt.internal.core.SourceMethod; @@ -42,13 +43,13 @@ public final class EcjAugments { public static final FieldAugment<ASTNode, Boolean> ASTNode_handled = FieldAugment.augment(ASTNode.class, boolean.class, "lombok$handled"); public static final FieldAugment<ASTNode, ASTNode> ASTNode_generatedBy = FieldAugment.augment(ASTNode.class, ASTNode.class, "$generatedBy"); public static final FieldAugment<Annotation, Boolean> Annotation_applied = FieldAugment.augment(Annotation.class, boolean.class, "lombok$applied"); + public static final FieldAugment<ICompilationUnit, Map<String, String>> CompilationUnit_javadoc = FieldAugment.augment(ICompilationUnit.class, Map.class, "$javadoc"); public static final class EclipseAugments { private EclipseAugments() { // Prevent instantiation } - public static final FieldAugment<CompilationUnit, Map<String, String>> CompilationUnit_javadoc = FieldAugment.augment(CompilationUnit.class, Map.class, "$javadoc"); public static final FieldAugment<CompilationUnit, ConcurrentMap<String, List<SourceMethod>>> CompilationUnit_delegateMethods = FieldAugment.augment(CompilationUnit.class, ConcurrentMap.class, "$delegateMethods"); } } diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java index 5da7abfd..a7afd996 100644 --- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java +++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java @@ -39,7 +39,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import org.eclipse.jdt.core.Signature; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.ast.ASTNode; import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; @@ -106,7 +105,6 @@ import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeConstants; import org.eclipse.jdt.internal.compiler.lookup.TypeIds; import org.eclipse.jdt.internal.compiler.lookup.WildcardBinding; -import org.eclipse.jdt.internal.core.CompilationUnit; import lombok.AccessLevel; import lombok.ConfigurationKeys; @@ -125,6 +123,7 @@ import lombok.core.configuration.TypeName; import lombok.core.debug.ProblemReporter; import lombok.core.handlers.HandlerUtil; import lombok.core.handlers.HandlerUtil.FieldAccess; +import lombok.eclipse.EcjAugments; import lombok.eclipse.Eclipse; import lombok.eclipse.EclipseAST; import lombok.eclipse.EclipseNode; @@ -2641,42 +2640,19 @@ public class EclipseHandlerUtil { return null; } - private static class EclipseOnlyUtil { - public static void setDocComment(CompilationUnitDeclaration cud, TypeDeclaration type, ASTNode node, String doc) { - if (cud.compilationResult.compilationUnit instanceof CompilationUnit) { - CompilationUnit compilationUnit = (CompilationUnit) cud.compilationResult.compilationUnit; - Map<String, String> docs = EclipseAugments.CompilationUnit_javadoc.setIfAbsent(compilationUnit, new HashMap<String, String>()); - - if (node instanceof AbstractMethodDeclaration) { - AbstractMethodDeclaration methodDeclaration = (AbstractMethodDeclaration) node; - String signature = getSignature(type, methodDeclaration); - /* Add javadoc start marker, add leading asterisks to each line, add javadoc end marker */ - docs.put(signature, String.format("/**%n%s%n */", doc.replaceAll("(?m)^", " * "))); - } - } - } - } - - private static Boolean eclipseMode; - private static boolean eclipseMode() { - if (eclipseMode != null) return eclipseMode.booleanValue(); - try { - Class.forName("org.eclipse.jdt.internal.core.CompilationUnit"); - eclipseMode = true; - } catch (Throwable t) { - eclipseMode = false; - } - return eclipseMode; - } - public static void setDocComment(CompilationUnitDeclaration cud, EclipseNode eclipseNode, String doc) { - if (!eclipseMode()) return; setDocComment(cud, (TypeDeclaration) upToTypeNode(eclipseNode).get(), eclipseNode.get(), doc); } public static void setDocComment(CompilationUnitDeclaration cud, TypeDeclaration type, ASTNode node, String doc) { - if (!eclipseMode()) return; - EclipseOnlyUtil.setDocComment(cud, type, node, doc); + Map<String, String> docs = EcjAugments.CompilationUnit_javadoc.setIfAbsent(cud.compilationResult.compilationUnit, new HashMap<String, String>()); + + if (node instanceof AbstractMethodDeclaration) { + AbstractMethodDeclaration methodDeclaration = (AbstractMethodDeclaration) node; + String signature = getSignature(type, methodDeclaration); + /* Add javadoc start marker, remove trailing line break, add leading asterisks to each line, add javadoc end marker */ + docs.put(signature, String.format("/**%n%s%n */", doc.replaceAll("$\\r?\\n", "").replaceAll("(?m)^", " * "))); + } } public static String getSignature(TypeDeclaration type, AbstractMethodDeclaration methodDeclaration) { @@ -2688,8 +2664,7 @@ public class EclipseHandlerUtil { Argument[] arguments = methodDeclaration.arguments; if (arguments != null) { for (Argument argument : arguments) { - String signature = Signature.createTypeSignature(argument.type.getLastToken(), false); - sb.append(signature); + sb.append(String.valueOf(argument.type)); } } sb.append(")"); diff --git a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java index d5077b86..171fa8a9 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java +++ b/src/eclipseAgent/lombok/eclipse/agent/EclipsePatcher.java @@ -916,7 +916,7 @@ public class EclipsePatcher implements AgentLauncher.AgentLaunchable { .requestExtra(StackRequest.PARAM1) .build()); - sm.addScriptIfWitness(OSGI_TYPES, ScriptBuilder.replaceMethodCall() + sm.addScript(ScriptBuilder.replaceMethodCall() .target(new MethodTarget("org.eclipse.jdt.internal.compiler.ast.TypeDeclaration", "printBody", "java.lang.StringBuffer", "int", "java.lang.StringBuffer")) .methodToReplace(new Hook("org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration", "print", "java.lang.StringBuffer", "int", "java.lang.StringBuffer")) .replacementMethod(new Hook("lombok.launch.PatchFixesHider$Javadoc", "printMethod", "java.lang.StringBuffer", "org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration", "int", "java.lang.StringBuffer", "org.eclipse.jdt.internal.compiler.ast.TypeDeclaration")) diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java b/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java index f5678154..5b34917e 100644 --- a/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java +++ b/src/eclipseAgent/lombok/eclipse/agent/PatchJavadoc.java @@ -21,7 +21,7 @@ */ package lombok.eclipse.agent; -import static lombok.eclipse.EcjAugments.EclipseAugments.CompilationUnit_javadoc; +import static lombok.eclipse.EcjAugments.CompilationUnit_javadoc; import java.lang.reflect.Method; import java.util.Map; @@ -41,7 +41,7 @@ import lombok.permit.Permit; public class PatchJavadoc { - public static String getHTMLContentFromSource(String original, IJavaElement member) { + public static String getHTMLContentFromSource(String original, Object member) { if (original != null) { return original; } @@ -51,15 +51,14 @@ public class PatchJavadoc { ICompilationUnit iCompilationUnit = sourceMethod.getCompilationUnit(); if (iCompilationUnit instanceof CompilationUnit) { CompilationUnit compilationUnit = (CompilationUnit) iCompilationUnit; - Map<String, String> docs = CompilationUnit_javadoc.get(compilationUnit); if (docs == null) return null; - String signature = getSignature(sourceMethod); + String signature = Signature.getSignature(sourceMethod); String rawJavadoc = docs.get(signature); if (rawJavadoc == null) return null; - return Reflection.javadoc2HTML((IMember) member, member, rawJavadoc); + return Reflection.javadoc2HTML((IMember) member, (IJavaElement) member, rawJavadoc); } } @@ -67,33 +66,33 @@ public class PatchJavadoc { } public static StringBuffer printMethod(AbstractMethodDeclaration methodDeclaration, Integer tab, StringBuffer output, TypeDeclaration type) { - if (methodDeclaration.compilationResult.compilationUnit instanceof CompilationUnit) { - Map<String, String> docs = CompilationUnit_javadoc.get((CompilationUnit) methodDeclaration.compilationResult.compilationUnit); - if (docs != null) { - String signature = EclipseHandlerUtil.getSignature(type, methodDeclaration); - String rawJavadoc = docs.get(signature); - if (rawJavadoc != null) { - for (String line : rawJavadoc.split("\r?\n")) { - ASTNode.printIndent(tab, output).append(line).append("\n"); - } + Map<String, String> docs = CompilationUnit_javadoc.get(methodDeclaration.compilationResult.compilationUnit); + if (docs != null) { + String signature = EclipseHandlerUtil.getSignature(type, methodDeclaration); + String rawJavadoc = docs.get(signature); + if (rawJavadoc != null) { + for (String line : rawJavadoc.split("\r?\n")) { + ASTNode.printIndent(tab, output).append(line).append("\n"); } } } return methodDeclaration.print(tab, output); } - private static String getSignature(SourceMethod sourceMethod) { - StringBuilder sb = new StringBuilder(); - sb.append(sourceMethod.getParent().getElementName()); - sb.append("."); - sb.append(sourceMethod.getElementName()); - sb.append("("); - for (String type : sourceMethod.getParameterTypes()) { - sb.append(type); + private static class Signature { + static final String getSignature(SourceMethod sourceMethod) { + StringBuilder sb = new StringBuilder(); + sb.append(sourceMethod.getParent().getElementName()); + sb.append("."); + sb.append(sourceMethod.getElementName()); + sb.append("("); + for (String type : sourceMethod.getParameterTypes()) { + sb.append(org.eclipse.jdt.core.Signature.toString(type)); + } + sb.append(")"); + + return sb.toString(); } - sb.append(")"); - - return sb.toString(); } /** diff --git a/src/eclipseAgent/lombok/launch/PatchFixesHider.java b/src/eclipseAgent/lombok/launch/PatchFixesHider.java index 503b2b4a..e2d266c5 100755 --- a/src/eclipseAgent/lombok/launch/PatchFixesHider.java +++ b/src/eclipseAgent/lombok/launch/PatchFixesHider.java @@ -332,7 +332,7 @@ final class PatchFixesHider { static { Class<?> shadowed = Util.shadowLoadClass("lombok.eclipse.agent.PatchJavadoc"); - GET_HTML = Util.findMethod(shadowed, "getHTMLContentFromSource", String.class, IJavaElement.class); + GET_HTML = Util.findMethod(shadowed, "getHTMLContentFromSource", String.class, Object.class); PRINT_METHOD = Util.findMethod(shadowed, "printMethod", AbstractMethodDeclaration.class, Integer.class, StringBuffer.class, TypeDeclaration.class); } diff --git a/src/utils/lombok/core/FieldAugment.java b/src/utils/lombok/core/FieldAugment.java index 4a32ad04..0982bcb5 100644 --- a/src/utils/lombok/core/FieldAugment.java +++ b/src/utils/lombok/core/FieldAugment.java @@ -24,6 +24,7 @@ package lombok.core; import java.lang.ref.WeakReference; import java.lang.reflect.Field; import java.lang.reflect.Modifier; +import java.util.HashMap; import java.util.Map; import java.util.WeakHashMap; @@ -69,6 +70,10 @@ public abstract class FieldAugment<T, F> { checkNotNull(fieldType, "fieldType"); checkNotNull(name, "name"); + if (type.isInterface()) { + return new InterfaceFieldAugment<T, F>(name, fieldType); + } + @SuppressWarnings("unchecked") F defaultValue = (F) getDefaultValue(fieldType); FieldAugment<T, F> ret = tryCreateReflectionAugment(type, fieldType, name, defaultValue); @@ -175,6 +180,54 @@ public abstract class FieldAugment<T, F> { */ public abstract F compareAndSet(T object, F expected, F value); + private static final class InterfaceFieldAugment<T, F> extends FieldAugment<T, F> { + private final String name; + private final Class<? super F> fieldType; + + private Map<Class<T>, FieldAugment<T, F>> map = new HashMap<Class<T>, FieldAugment<T,F>>(); + + private InterfaceFieldAugment(String name, Class<? super F> fieldType) { + this.name = name; + this.fieldType = fieldType; + } + + private synchronized FieldAugment<T, F> getDelegate(T object) { + @SuppressWarnings("unchecked") + Class<T> c = (Class<T>) object.getClass(); + + FieldAugment<T,F> fieldAugment = map.get(c); + if (fieldAugment == null) { + fieldAugment = augment(c, fieldType, name); + map.put(c, fieldAugment); + } + return fieldAugment; + } + + @Override public F get(T object) { + return getDelegate(object).get(object); + } + + @Override public F getAndSet(T object, F value) { + return getDelegate(object).getAndSet(object, value); + } + + @Override public F clear(T object) { + return getDelegate(object).clear(object); + } + + @Override public F compareAndClear(T object, F expected) { + return getDelegate(object).compareAndClear(object, expected); + } + + @Override public F setIfAbsent(T object, F value) { + return getDelegate(object).setIfAbsent(object, value); + } + + @Override public F compareAndSet(T object, F expected, F value) { + return getDelegate(object).compareAndSet(object, expected, value); + } + } + private static class ReflectionFieldAugment<T, F> extends FieldAugment<T, F> { private final Object lock = new Object(); private final Field field; |