diff options
author | peichhorn <peichhor@web.de> | 2011-11-13 09:02:55 +0100 |
---|---|---|
committer | peichhorn <peichhor@web.de> | 2011-11-13 09:06:57 +0100 |
commit | 0d75d56fcef943d1a35f1169386830066371c12d (patch) | |
tree | e274449da3344e8ba1e09da5878b5e4a2a51d5db /src/core/lombok | |
parent | fb4d2a45d21ed33405f8c2eddb05da6040ee3159 (diff) | |
download | lombok-0d75d56fcef943d1a35f1169386830066371c12d.tar.gz lombok-0d75d56fcef943d1a35f1169386830066371c12d.tar.bz2 lombok-0d75d56fcef943d1a35f1169386830066371c12d.zip |
Eclipse/JavacHandlerUtil.injectField(...) inserts the new fields after the enum constants.
Also the new fields are ordered in the same way the method injectField() gets invoked.
Diffstat (limited to 'src/core/lombok')
-rw-r--r-- | src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java | 18 | ||||
-rw-r--r-- | src/core/lombok/javac/handlers/JavacHandlerUtil.java | 26 |
2 files changed, 40 insertions, 4 deletions
diff --git a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java index 7f144c17..96dea22d 100644 --- a/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java +++ b/src/core/lombok/eclipse/handlers/EclipseHandlerUtil.java @@ -1013,9 +1013,17 @@ public class EclipseHandlerUtil { parent.fields = new FieldDeclaration[1]; parent.fields[0] = field; } else { - FieldDeclaration[] newArray = new FieldDeclaration[parent.fields.length + 1]; - System.arraycopy(parent.fields, 0, newArray, 1, parent.fields.length); - newArray[0] = field; + int size = parent.fields.length; + FieldDeclaration[] newArray = new FieldDeclaration[size + 1]; + System.arraycopy(parent.fields, 0, newArray, 0, size); + int index = 0; + for (; index < size; index++) { + FieldDeclaration f = newArray[index]; + if (isEnumConstant(f) || isGenerated(f)) continue; + break; + } + System.arraycopy(newArray, index, newArray, index + 1, size - index); + newArray[index] = field; parent.fields = newArray; } @@ -1028,6 +1036,10 @@ public class EclipseHandlerUtil { type.add(field, Kind.FIELD); } + private static boolean isEnumConstant(final FieldDeclaration field) { + return ((field.initialization instanceof AllocationExpression) && (((AllocationExpression) field.initialization).enumConstant == field)); + } + /** * Inserts a method into an existing type. The type must represent a {@code TypeDeclaration}. */ diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 00090be9..fc9435d8 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -532,11 +532,35 @@ public class JavacHandlerUtil { JCClassDecl type = (JCClassDecl) typeNode.get(); if (addSuppressWarnings) addSuppressWarningsAll(field.mods, typeNode, field.pos, getGeneratedBy(field)); - type.defs = type.defs.append(field); + + List<JCTree> insertAfter = null; + List<JCTree> insertBefore = type.defs; + while (insertBefore.tail != null) { + if (insertBefore.head instanceof JCVariableDecl) { + JCVariableDecl f = (JCVariableDecl) insertBefore.head; + if (isEnumConstant(f) || isGenerated(f)) { + insertAfter = insertBefore; + insertBefore = insertBefore.tail; + continue; + } + } + break; + } + List<JCTree> fieldEntry = List.<JCTree>of(field); + fieldEntry.tail = insertBefore; + if (insertAfter == null) { + type.defs = fieldEntry; + } else { + insertAfter.tail = fieldEntry; + } typeNode.add(field, Kind.FIELD); } + private static boolean isEnumConstant(final JCVariableDecl field) { + return (field.mods.flags & Flags.ENUM) != 0; + } + /** * Adds the given new method declaration to the provided type AST Node. * Can also inject constructors. |