aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2012-08-06 20:37:21 +0200
committerReinier Zwitserloot <reinier@zwitserloot.com>2012-08-06 20:37:21 +0200
commit87f763a94c87b03da269d110c44e7e750ddf5211 (patch)
tree05d59604320510e4bb7d5014917ba275e9061e5a
parenteb4cbcd8bbd7bf7784aa229e9b6c5fe0670fa7a5 (diff)
parent34055fcdff786c9b809ce1a08c1c9218968ebc7d (diff)
downloadlombok-87f763a94c87b03da269d110c44e7e750ddf5211.tar.gz
lombok-87f763a94c87b03da269d110c44e7e750ddf5211.tar.bz2
lombok-87f763a94c87b03da269d110c44e7e750ddf5211.zip
Merge branch 'master' into wither
Conflicts: src/core/lombok/javac/handlers/JavacHandlerUtil.java
-rw-r--r--doc/changelog.markdown2
-rw-r--r--src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java11
-rw-r--r--src/core/lombok/eclipse/handlers/HandleConstructor.java15
-rw-r--r--src/core/lombok/javac/JavacResolution.java6
-rw-r--r--src/core/lombok/javac/handlers/HandleConstructor.java28
-rw-r--r--src/core/lombok/javac/handlers/HandleExtensionMethod.java6
-rw-r--r--src/core/lombok/javac/handlers/HandleSynchronized.java8
-rw-r--r--src/core/lombok/javac/handlers/JavacHandlerUtil.java102
-rw-r--r--src/delombok/lombok/delombok/Delombok.java1
-rw-r--r--src/delombok/lombok/delombok/PrettyCommentsPrinter.java11
-rw-r--r--test/core/src/lombok/AbstractRunTests.java31
-rw-r--r--test/transform/resource/after-delombok/ConflictingStaticConstructorNames.java29
-rw-r--r--test/transform/resource/after-delombok/Constructors.java14
-rw-r--r--test/transform/resource/after-delombok/DataPlain.java1
-rw-r--r--test/transform/resource/after-delombok/ExtensionMethodPlain.java17
-rw-r--r--test/transform/resource/after-delombok/SneakyThrowsPlain.java1
-rw-r--r--test/transform/resource/after-delombok/SynchronizedName.java11
-rw-r--r--test/transform/resource/after-delombok/SynchronizedNameNoSuchField.java7
-rw-r--r--test/transform/resource/after-delombok/SynchronizedNameStaticToInstanceRef.java9
-rw-r--r--test/transform/resource/after-ecj/Accessors.java60
-rw-r--r--test/transform/resource/after-ecj/ClassNamedAfterGetter.java6
-rw-r--r--test/transform/resource/after-ecj/CommentsInterspersed.java6
-rw-r--r--test/transform/resource/after-ecj/ConflictingStaticConstructorNames.java25
-rw-r--r--test/transform/resource/after-ecj/Constructors.java11
-rw-r--r--test/transform/resource/after-ecj/DataExtended.java6
-rw-r--r--test/transform/resource/after-ecj/DataIgnore.java8
-rw-r--r--test/transform/resource/after-ecj/DataOnEnum.java10
-rw-r--r--test/transform/resource/after-ecj/DataOnLocalClass.java30
-rw-r--r--test/transform/resource/after-ecj/DataPlain.java44
-rw-r--r--test/transform/resource/after-ecj/DataWithGetter.java10
-rw-r--r--test/transform/resource/after-ecj/DataWithGetterNone.java10
-rw-r--r--test/transform/resource/after-ecj/DelegateOnGetter.java8
-rw-r--r--test/transform/resource/after-ecj/DelegateOnGetterNone.java8
-rw-r--r--test/transform/resource/after-ecj/DelegateOnMethods.java8
-rw-r--r--test/transform/resource/after-ecj/DelegateRecursion.java14
-rw-r--r--test/transform/resource/after-ecj/DelegateTypesAndExcludes.java8
-rw-r--r--test/transform/resource/after-ecj/DelegateWithDeprecated.java8
-rw-r--r--test/transform/resource/after-ecj/EqualsAndHashCode.java24
-rw-r--r--test/transform/resource/after-ecj/ExtensionMethodPlain.java25
-rw-r--r--test/transform/resource/after-ecj/GetterAccessLevel.java6
-rw-r--r--test/transform/resource/after-ecj/GetterAlreadyExists.java60
-rw-r--r--test/transform/resource/after-ecj/GetterBoolean.java14
-rw-r--r--test/transform/resource/after-ecj/GetterDeprecated.java6
-rw-r--r--test/transform/resource/after-ecj/GetterEnum.java12
-rw-r--r--test/transform/resource/after-ecj/GetterLazy.java6
-rw-r--r--test/transform/resource/after-ecj/GetterLazyBoolean.java12
-rw-r--r--test/transform/resource/after-ecj/GetterLazyEahcToString.java8
-rw-r--r--test/transform/resource/after-ecj/GetterLazyInvalid.java8
-rw-r--r--test/transform/resource/after-ecj/GetterLazyNative.java8
-rw-r--r--test/transform/resource/after-ecj/GetterNone.java8
-rw-r--r--test/transform/resource/after-ecj/GetterOnClass.java39
-rw-r--r--test/transform/resource/after-ecj/GetterOnStatic.java6
-rw-r--r--test/transform/resource/after-ecj/GetterPlain.java8
-rw-r--r--test/transform/resource/after-ecj/GetterWithDollar.java12
-rw-r--r--test/transform/resource/after-ecj/MultiFieldGetter.java14
-rw-r--r--test/transform/resource/after-ecj/SetterAccessLevel.java6
-rw-r--r--test/transform/resource/after-ecj/SetterAlreadyExists.java14
-rw-r--r--test/transform/resource/after-ecj/SetterDeprecated.java6
-rw-r--r--test/transform/resource/after-ecj/SetterOnClass.java36
-rw-r--r--test/transform/resource/after-ecj/SetterOnStatic.java6
-rw-r--r--test/transform/resource/after-ecj/SetterPlain.java8
-rw-r--r--test/transform/resource/after-ecj/SetterWithDollar.java12
-rw-r--r--test/transform/resource/after-ecj/SimpleTypeResolution.java4
-rw-r--r--test/transform/resource/after-ecj/SynchronizedName.java11
-rw-r--r--test/transform/resource/after-ecj/SynchronizedNameNoSuchField.java12
-rw-r--r--test/transform/resource/after-ecj/SynchronizedNameStaticToInstanceRef.java15
-rw-r--r--test/transform/resource/after-ecj/ToStringInner.java24
-rw-r--r--test/transform/resource/after-ecj/ToStringPlain.java12
-rw-r--r--test/transform/resource/after-ecj/TrickyTypeResolution.java8
-rw-r--r--test/transform/resource/before/ConflictingStaticConstructorNames.java4
-rw-r--r--test/transform/resource/before/Constructors.java4
-rw-r--r--test/transform/resource/before/ExtensionMethodPlain.java23
-rw-r--r--test/transform/resource/before/SynchronizedName.java6
-rw-r--r--test/transform/resource/before/SynchronizedNameNoSuchField.java8
-rw-r--r--test/transform/resource/before/SynchronizedNameStaticToInstanceRef.java8
-rw-r--r--test/transform/resource/messages-delombok/ConflictingStaticConstructorNames.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/SynchronizedName.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/SynchronizedNameNoSuchField.java.messages1
-rw-r--r--test/transform/resource/messages-delombok/SynchronizedNameStaticToInstanceRef.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/ConflictingStaticConstructorNames.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/SynchronizedName.java.messages3
-rw-r--r--test/transform/resource/messages-ecj/SynchronizedNameNoSuchField.java.messages1
-rw-r--r--test/transform/resource/messages-ecj/SynchronizedNameStaticToInstanceRef.java.messages1
-rw-r--r--test/transform/resource/messages-idempotent/SynchronizedNameStaticToInstanceRef.java.messages1
-rw-r--r--test/transform/resource/messages-idempotent/ValErrors.java.messages7
85 files changed, 729 insertions, 382 deletions
diff --git a/doc/changelog.markdown b/doc/changelog.markdown
index cb515cae..bbda9dfe 100644
--- a/doc/changelog.markdown
+++ b/doc/changelog.markdown
@@ -5,6 +5,8 @@ Lombok Changelog
* BUGFIX: Eclipse would throw an OOME if using `@ExtensionMethod`. [Issue #390](http://code.google.com/p/projectlombok/issues/detail?id=390)
* BUGFIX: {Netbeans} `@Cleanup` and `@Synchronized` cause far fewer issues in the netbeans editor. [Issue #393](http://code.google.com/p/projectlombok/issues/detail?id=393)
* BUGFIX: {Installer} Erroneous messages about the installer complaining about needing root access when installing or removing lombok from eclipse installs has been fixed. The installer edge of this problem was actually already fixed in v0.11.2. [Issue #363](http://code.google.com/p/projectlombok/issues/detail?id=363)
+* BUGFIX: `@ExtensionMethod` had all sorts of issues in javac. [Issue #399](http://code.google.com/p/projectlombok/issues/detail?id=399)
+* BUGFIX: Generating static constructors with javac when you have fields with generics, i.e. `Class<T>`, caused errors. [Issue #396](http://code.google.com/p/projectlombok/issues/detail?id=396)
### v0.11.2 "Dashing Kakapo" (July 3rd, 2012)
* FEATURE: {Experimental} `@ExtensionMethod` is now available to add extensions to
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
index 8b330816..ed18dd45 100644
--- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
+++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java
@@ -798,18 +798,19 @@ public class EclipseHandlerUtil {
}
}
- private static final Map<FieldDeclaration, GetterMethod> generatedLazyGetters = new WeakHashMap<FieldDeclaration, GetterMethod>();
+ private static final Map<FieldDeclaration, Object> generatedLazyGettersWithPrimitiveBoolean = new WeakHashMap<FieldDeclaration, Object>();
+ private static final Object MARKER = new Object();
static void registerCreatedLazyGetter(FieldDeclaration field, char[] methodName, TypeReference returnType) {
- generatedLazyGetters.put(field, new GetterMethod(methodName, returnType));
+ if (!nameEquals(returnType.getTypeName(), "boolean") || returnType.dimensions() > 0) return;
+ generatedLazyGettersWithPrimitiveBoolean.put(field, MARKER);
}
private static GetterMethod findGetter(EclipseNode field) {
FieldDeclaration fieldDeclaration = (FieldDeclaration) field.get();
- GetterMethod gm = generatedLazyGetters.get(fieldDeclaration);
- if (gm != null) return gm;
+ boolean forceBool = generatedLazyGettersWithPrimitiveBoolean.containsKey(fieldDeclaration);
TypeReference fieldType = fieldDeclaration.type;
- boolean isBoolean = nameEquals(fieldType.getTypeName(), "boolean") && fieldType.dimensions() == 0;
+ boolean isBoolean = forceBool || (nameEquals(fieldType.getTypeName(), "boolean") && fieldType.dimensions() == 0);
EclipseNode typeNode = field.up();
for (String potentialGetterName : toAllGetterNames(field, isBoolean)) {
diff --git a/src/core/lombok/eclipse/handlers/HandleConstructor.java b/src/core/lombok/eclipse/handlers/HandleConstructor.java
index eec41577..25d47870 100644
--- a/src/core/lombok/eclipse/handlers/HandleConstructor.java
+++ b/src/core/lombok/eclipse/handlers/HandleConstructor.java
@@ -156,20 +156,29 @@ public class HandleConstructor {
}
public void generateConstructor(EclipseNode typeNode, AccessLevel level, List<EclipseNode> fields, String staticName, boolean skipIfConstructorExists, boolean suppressConstructorProperties, ASTNode source) {
+ boolean staticConstrRequired = staticName != null && !staticName.equals("");
+
if (skipIfConstructorExists && constructorExists(typeNode) != MemberExistsResult.NOT_EXISTS) return;
if (skipIfConstructorExists) {
for (EclipseNode child : typeNode.down()) {
if (child.getKind() == Kind.ANNOTATION) {
if (annotationTypeMatches(NoArgsConstructor.class, child) ||
annotationTypeMatches(AllArgsConstructor.class, child) ||
- annotationTypeMatches(RequiredArgsConstructor.class, child))
+ annotationTypeMatches(RequiredArgsConstructor.class, child)) {
+
+ if (staticConstrRequired) {
+ // @Data has asked us to generate a constructor, but we're going to skip this instruction, as an explicit 'make a constructor' annotation
+ // will take care of it. However, @Data also wants a specific static name; this will be ignored; the appropriate way to do this is to use
+ // the 'staticName' parameter of the @XArgsConstructor you've stuck on your type.
+ // We should warn that we're ignoring @Data's 'staticConstructor' param.
+ typeNode.addWarning("Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.", source.sourceStart, source.sourceEnd);
+ }
return;
+ }
}
}
}
- boolean staticConstrRequired = staticName != null && !staticName.equals("");
-
ConstructorDeclaration constr = createConstructor(staticConstrRequired ? AccessLevel.PRIVATE : level, typeNode, fields, suppressConstructorProperties, source);
injectMethod(typeNode, constr);
if (staticConstrRequired) {
diff --git a/src/core/lombok/javac/JavacResolution.java b/src/core/lombok/javac/JavacResolution.java
index 6da60907..73bb38b0 100644
--- a/src/core/lombok/javac/JavacResolution.java
+++ b/src/core/lombok/javac/JavacResolution.java
@@ -456,12 +456,18 @@ public class JavacResolution {
if (upper == null || upper.toString().equals("java.lang.Object")) {
return maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
}
+ if (upper.getTypeArguments().contains(type)) {
+ return maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
+ }
return maker.Wildcard(maker.TypeBoundKind(BoundKind.EXTENDS), typeToJCTree(upper, ast, false, false));
} else {
return maker.Wildcard(maker.TypeBoundKind(BoundKind.SUPER), typeToJCTree(lower, ast, false, false));
}
}
if (upper != null) {
+ if (upper.getTypeArguments().contains(type)) {
+ return maker.Wildcard(maker.TypeBoundKind(BoundKind.UNBOUND), null);
+ }
return typeToJCTree(upper, ast, allowCompound, allowVoid);
}
diff --git a/src/core/lombok/javac/handlers/HandleConstructor.java b/src/core/lombok/javac/handlers/HandleConstructor.java
index a2463728..d701b41e 100644
--- a/src/core/lombok/javac/handlers/HandleConstructor.java
+++ b/src/core/lombok/javac/handlers/HandleConstructor.java
@@ -43,12 +43,10 @@ import com.sun.tools.javac.tree.JCTree.JCBlock;
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
-import com.sun.tools.javac.tree.JCTree.JCIdent;
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
import com.sun.tools.javac.tree.JCTree.JCModifiers;
import com.sun.tools.javac.tree.JCTree.JCReturn;
import com.sun.tools.javac.tree.JCTree.JCStatement;
-import com.sun.tools.javac.tree.JCTree.JCTypeApply;
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
import com.sun.tools.javac.util.List;
@@ -154,20 +152,29 @@ public class HandleConstructor {
}
public void generateConstructor(JavacNode typeNode, AccessLevel level, List<JavacNode> fields, String staticName, boolean skipIfConstructorExists, boolean suppressConstructorProperties, JavacNode source) {
+ boolean staticConstrRequired = staticName != null && !staticName.equals("");
+
if (skipIfConstructorExists && constructorExists(typeNode) != MemberExistsResult.NOT_EXISTS) return;
if (skipIfConstructorExists) {
for (JavacNode child : typeNode.down()) {
if (child.getKind() == Kind.ANNOTATION) {
if (annotationTypeMatches(NoArgsConstructor.class, child) ||
annotationTypeMatches(AllArgsConstructor.class, child) ||
- annotationTypeMatches(RequiredArgsConstructor.class, child))
+ annotationTypeMatches(RequiredArgsConstructor.class, child)) {
+
+ if (staticConstrRequired) {
+ // @Data has asked us to generate a constructor, but we're going to skip this instruction, as an explicit 'make a constructor' annotation
+ // will take care of it. However, @Data also wants a specific static name; this will be ignored; the appropriate way to do this is to use
+ // the 'staticName' parameter of the @XArgsConstructor you've stuck on your type.
+ // We should warn that we're ignoring @Data's 'staticConstructor' param.
+ source.addWarning("Ignoring static constructor name: explicit @XxxArgsConstructor annotation present; its `staticName` parameter will be used.");
+ }
return;
+ }
}
}
}
- boolean staticConstrRequired = staticName != null && !staticName.equals("");
-
JCMethodDecl constr = createConstructor(staticConstrRequired ? AccessLevel.PRIVATE : level, typeNode, fields, suppressConstructorProperties, source.get());
injectMethod(typeNode, constr);
if (staticConstrRequired) {
@@ -259,16 +266,7 @@ public class HandleConstructor {
for (JavacNode fieldNode : fields) {
JCVariableDecl field = (JCVariableDecl) fieldNode.get();
- JCExpression pType;
- if (field.vartype instanceof JCIdent) pType = maker.Ident(((JCIdent)field.vartype).name);
- else if (field.vartype instanceof JCTypeApply) {
- JCTypeApply typeApply = (JCTypeApply) field.vartype;
- ListBuffer<JCExpression> tArgs = ListBuffer.lb();
- for (JCExpression arg : typeApply.arguments) tArgs.append(arg);
- pType = maker.TypeApply(typeApply.clazz, tArgs.toList());
- } else {
- pType = field.vartype;
- }
+ JCExpression pType = cloneType(maker, field.vartype, source);
List<JCAnnotation> nonNulls = findAnnotations(fieldNode, TransformationsUtil.NON_NULL_PATTERN);
List<JCAnnotation> nullables = findAnnotations(fieldNode, TransformationsUtil.NULLABLE_PATTERN);
JCVariableDecl param = maker.VarDef(maker.Modifiers(Flags.FINAL, nonNulls.appendList(nullables)), field.name, pType, null);
diff --git a/src/core/lombok/javac/handlers/HandleExtensionMethod.java b/src/core/lombok/javac/handlers/HandleExtensionMethod.java
index 2df6be45..92d7c0e4 100644
--- a/src/core/lombok/javac/handlers/HandleExtensionMethod.java
+++ b/src/core/lombok/javac/handlers/HandleExtensionMethod.java
@@ -55,7 +55,6 @@ import com.sun.tools.javac.tree.JCTree.JCExpression;
import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
import com.sun.tools.javac.tree.JCTree.JCIdent;
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
-import com.sun.tools.javac.tree.TreeMaker;
/**
* Handles the {@link ExtensionMethod} annotation for javac.
@@ -180,10 +179,7 @@ public class HandleExtensionMethod extends JavacAnnotationHandler<ExtensionMetho
Type firstArgType = types.erasure(extensionMethodType.asMethodType().argtypes.get(0));
if (!types.isAssignable(receiverType, firstArgType)) continue;
methodCall.args = methodCall.args.prepend(receiver);
-
- TreeMaker maker = annotationNode.getTreeMaker();
- JCIdent extensionClassIdent = maker.Ident(annotationNode.toName(extensionProvider.toString()));
- methodCall.meth = maker.Select(extensionClassIdent, annotationNode.toName(methodName));
+ methodCall.meth = chainDotsString(annotationNode, extensionProvider.toString() + "." + methodName);
return;
}
}
diff --git a/src/core/lombok/javac/handlers/HandleSynchronized.java b/src/core/lombok/javac/handlers/HandleSynchronized.java
index 04668317..1ba8d131 100644
--- a/src/core/lombok/javac/handlers/HandleSynchronized.java
+++ b/src/core/lombok/javac/handlers/HandleSynchronized.java
@@ -78,16 +7