mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-13 18:15:55 +00:00
experiment: Can we wrap TreeMaker and remove a heck of a lot of opportunity to program handlers that are not cross javac6-8 compatible?
This commit is contained in:
1 parent
1b4d8669c4
commit
e2af5ed0c7
18 files changed
+830
-323
No files matched your search
@@ -66,7 +66,7 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
|
||||
private final Messager messager;
|
||||
private final JavacElements elements;
|
||||
private final TreeMaker treeMaker;
|
||||
private final JavacTreeMaker treeMaker;
|
||||
private final Symtab symtab;
|
||||
private final JavacTypes javacTypes;
|
||||
private final Log log;
|
||||
@@ -86,7 +86,7 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
|
||||
this.messager = messager;
|
||||
this.log = Log.instance(context);
|
||||
this.elements = JavacElements.instance(context);
|
||||
this.treeMaker = TreeMaker.instance(context);
|
||||
this.treeMaker = new JavacTreeMaker(TreeMaker.instance(context));
|
||||
this.symtab = Symtab.instance(context);
|
||||
this.javacTypes = JavacTypes.instance(context);
|
||||
clearChanged();
|
||||
@@ -135,7 +135,7 @@ public class JavacAST extends AST<JavacAST, JavacNode, JCTree> {
|
||||
}
|
||||
|
||||
/** @return A TreeMaker instance that you can use to create new AST nodes. */
|
||||
public TreeMaker getTreeMaker() {
|
||||
public JavacTreeMaker getTreeMaker() {
|
||||
treeMaker.at(-1);
|
||||
return treeMaker;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ import lombok.core.AST.Kind;
|
||||
import com.sun.tools.javac.code.Symtab;
|
||||
import com.sun.tools.javac.model.JavacTypes;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBlock;
|
||||
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
|
||||
@@ -165,7 +164,7 @@ public class JavacNode extends lombok.core.LombokNode<JavacAST, JavacNode, JCTre
|
||||
*
|
||||
* @see JavacAST#getTreeMaker()
|
||||
*/
|
||||
public TreeMaker getTreeMaker() {
|
||||
public JavacTreeMaker getTreeMaker() {
|
||||
return ast.getTreeMaker();
|
||||
}
|
||||
|
||||
|
||||
@@ -418,7 +418,7 @@ public class JavacResolution {
|
||||
|
||||
TreeMaker maker = ast.getTreeMaker();
|
||||
|
||||
if (Javac.compareCTC(type.tag, CTC_BOT)) return createJavaLangObject(ast);
|
||||
if (Javac.compareCTC(type.tag, CTC_BOT)) return createJavaLangObject(ast);
|
||||
if (Javac.compareCTC(type.tag, CTC_VOID)) return allowVoid ? primitiveToJCTree(type.getKind(), maker) : createJavaLangObject(ast);
|
||||
if (type.isPrimitive()) return primitiveToJCTree(type.getKind(), maker);
|
||||
if (type.isErroneous()) throw new TypeNotConvertibleException("Type cannot be resolved");
|
||||
|
||||
@@ -53,10 +53,11 @@ import lombok.core.HandlerPriority;
|
||||
import lombok.core.TransformationsUtil;
|
||||
import lombok.experimental.Builder;
|
||||
import lombok.experimental.NonFinal;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.HandleConstructor.SkipIfConstructorExists;
|
||||
import static lombok.javac.Javac.*;
|
||||
import static lombok.core.handlers.HandlerUtil.*;
|
||||
import static lombok.javac.handlers.JavacHandlerUtil.*;
|
||||
|
||||
@@ -218,7 +219,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuildMethod(String name, Name staticName, JCExpression returnType, java.util.List<Name> fieldNames, JavacNode type, List<JCExpression> thrownExceptions) {
|
||||
TreeMaker maker = type.getTreeMaker();
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
JCExpression call;
|
||||
JCStatement statement;
|
||||
@@ -239,7 +240,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
JCExpression fn = maker.Select(maker.Ident(((JCClassDecl) type.up().get()).name), staticName);
|
||||
call = maker.Apply(typeParams.toList(), fn, args.toList());
|
||||
if (returnType instanceof JCPrimitiveTypeTree && compareCTC(getTypeTag((JCPrimitiveTypeTree) returnType), CTC_VOID)) {
|
||||
if (returnType instanceof JCPrimitiveTypeTree && compareCTC(Javac.getTypeTag((JCPrimitiveTypeTree) returnType), CTC_VOID)) {
|
||||
statement = maker.Exec(call);
|
||||
} else {
|
||||
statement = maker.Return(call);
|
||||
@@ -252,7 +253,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
private JCMethodDecl generateBuilderMethod(String builderMethodName, String builderClassName, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
TreeMaker maker = type.getTreeMaker();
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> typeArgs = ListBuffer.lb();
|
||||
for (JCTypeParameter typeParam : typeParams) {
|
||||
@@ -285,7 +286,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
continue top;
|
||||
}
|
||||
}
|
||||
TreeMaker maker = builderType.getTreeMaker();
|
||||
JavacTreeMaker maker = builderType.getTreeMaker();
|
||||
JCModifiers mods = maker.Modifiers(Flags.PRIVATE);
|
||||
JCVariableDecl newField = maker.VarDef(mods, name, cloneType(maker, typesOfParameters.get(i), source), null);
|
||||
out.add(injectField(builderType, newField));
|
||||
@@ -308,7 +309,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
boolean isBoolean = isBoolean(fieldNode);
|
||||
String setterName = fluent ? fieldNode.getName() : TransformationsUtil.toSetterName(null, fieldNode.getName(), isBoolean);
|
||||
|
||||
TreeMaker maker = builderType.getTreeMaker();
|
||||
JavacTreeMaker maker = builderType.getTreeMaker();
|
||||
return HandleSetter.createSetter(Flags.PUBLIC, fieldNode, maker, setterName, chain, source, List.<JCAnnotation>nil(), List.<JCAnnotation>nil());
|
||||
}
|
||||
|
||||
@@ -322,9 +323,9 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
|
||||
private JavacNode makeBuilderClass(JavacNode tdParent, String builderClassName, List<JCTypeParameter> typeParams, JCAnnotation ast) {
|
||||
TreeMaker maker = tdParent.getTreeMaker();
|
||||
JavacTreeMaker maker = tdParent.getTreeMaker();
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC | Flags.STATIC);
|
||||
JCClassDecl builder = ClassDef(maker, mods, tdParent.toName(builderClassName), copyTypeParams(maker, typeParams), null, List.<JCExpression>nil(), List.<JCTree>nil());
|
||||
JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderClassName), copyTypeParams(maker, typeParams), null, List.<JCExpression>nil(), List.<JCTree>nil());
|
||||
return injectType(tdParent, builder);
|
||||
}
|
||||
}
|
||||
@@ -26,9 +26,9 @@ import static lombok.javac.Javac.*;
|
||||
import lombok.Cleanup;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
@@ -49,7 +49,6 @@ import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeCast;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
import com.sun.tools.javac.util.Name;
|
||||
@@ -114,13 +113,13 @@ public class HandleCleanup extends JavacAnnotationHandler<Cleanup> {
|
||||
}
|
||||
doAssignmentCheck(annotationNode, tryBlock.toList(), decl.name);
|
||||
|
||||
TreeMaker maker = annotationNode.getTreeMaker();
|
||||
JavacTreeMaker maker = annotationNode.getTreeMaker();
|
||||
JCFieldAccess cleanupMethod = maker.Select(maker.Ident(decl.name), annotationNode.toName(cleanupName));
|
||||
List<JCStatement> cleanupCall = List.<JCStatement>of(maker.Exec(
|
||||
maker.Apply(List.<JCExpression>nil(), cleanupMethod, List.<JCExpression>nil())));
|
||||
|
||||
JCMethodInvocation preventNullAnalysis = preventNullAnalysis(maker, annotationNode, maker.Ident(decl.name));
|
||||
JCBinary isNull = Javac.makeBinary(maker, CTC_NOT_EQUAL, preventNullAnalysis, Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCBinary isNull = maker.Binary(CTC_NOT_EQUAL, preventNullAnalysis, maker.Literal(CTC_BOT, null));
|
||||
|
||||
JCIf ifNotNullCleanup = maker.If(isNull, maker.Block(0, cleanupCall), null);
|
||||
|
||||
@@ -139,9 +138,9 @@ public class HandleCleanup extends JavacAnnotationHandler<Cleanup> {
|
||||
ancestor.rebuild();
|
||||
}
|
||||
|
||||
private JCMethodInvocation preventNullAnalysis(TreeMaker maker, JavacNode node, JCExpression expression) {
|
||||
private JCMethodInvocation preventNullAnalysis(JavacTreeMaker maker, JavacNode node, JCExpression expression) {
|
||||
JCMethodInvocation singletonList = maker.Apply(List.<JCExpression>nil(), chainDotsString(node, "java.util.Collections.singletonList"), List.of(expression));
|
||||
JCMethodInvocation cleanedExpr = maker.Apply(List.<JCExpression>nil(), maker.Select(singletonList, node.toName("get")) , List.<JCExpression>of(Javac.makeLiteral(maker, CTC_INT, 0)));
|
||||
JCMethodInvocation cleanedExpr = maker.Apply(List.<JCExpression>nil(), maker.Select(singletonList, node.toName("get")) , List.<JCExpression>of(maker.Literal(CTC_INT, 0)));
|
||||
return cleanedExpr;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,12 +32,12 @@ import lombok.core.AST.Kind;
|
||||
import lombok.experimental.Builder;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import com.sun.tools.javac.code.Flags;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAssign;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBlock;
|
||||
@@ -206,7 +206,7 @@ public class HandleConstructor {
|
||||
|
||||
private static void addConstructorProperties(JCModifiers mods, JavacNode node, List<JavacNode> fields) {
|
||||
if (fields.isEmpty()) return;
|
||||
TreeMaker maker = node.getTreeMaker();
|
||||
JavacTreeMaker maker = node.getTreeMaker();
|
||||
JCExpression constructorPropertiesType = chainDots(node, "java", "beans", "ConstructorProperties");
|
||||
ListBuffer<JCExpression> fieldNames = ListBuffer.lb();
|
||||
for (JavacNode field : fields) {
|
||||
@@ -218,7 +218,7 @@ public class HandleConstructor {
|
||||
}
|
||||
|
||||
static JCMethodDecl createConstructor(AccessLevel level, List<JCAnnotation> onConstructor, JavacNode typeNode, List<JavacNode> fields, boolean suppressConstructorProperties, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
boolean isEnum = (((JCClassDecl) typeNode.get()).mods.flags & Flags.ENUM) != 0;
|
||||
if (isEnum) level = AccessLevel.PRIVATE;
|
||||
@@ -261,7 +261,7 @@ public class HandleConstructor {
|
||||
}
|
||||
|
||||
private JCMethodDecl createStaticConstructor(String name, AccessLevel level, JavacNode typeNode, List<JavacNode> fields, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
JCClassDecl type = (JCClassDecl) typeNode.get();
|
||||
|
||||
JCModifiers mods = maker.Modifiers(Flags.STATIC | toJavacModifier(level));
|
||||
|
||||
@@ -48,6 +48,7 @@ import lombok.javac.FindTypeVarScanner;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacResolution;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.ResolutionResetNeeded;
|
||||
import lombok.javac.JavacResolution.TypeNotConvertibleException;
|
||||
|
||||
@@ -71,7 +72,6 @@ import com.sun.tools.javac.tree.JCTree.JCModifiers;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
import com.sun.tools.javac.util.Name;
|
||||
|
||||
@@ -266,7 +266,7 @@ public class HandleDelegate extends JavacAnnotationHandler<Delegate> {
|
||||
|
||||
checkConflictOfTypeVarNames(sig, annotation);
|
||||
|
||||
TreeMaker maker = annotation.getTreeMaker();
|
||||
JavacTreeMaker maker = annotation.getTreeMaker();
|
||||
|
||||
com.sun.tools.javac.util.List<JCAnnotation> annotations;
|
||||
if (sig.isDeprecated) {
|
||||
@@ -394,13 +394,13 @@ public class HandleDelegate extends JavacAnnotationHandler<Delegate> {
|
||||
METHOD {
|
||||
public JCExpression get(final JavacNode node, final Name name) {
|
||||
com.sun.tools.javac.util.List<JCExpression> nilExprs = com.sun.tools.javac.util.List.nil();
|
||||
final TreeMaker maker = node.getTreeMaker();
|
||||
final JavacTreeMaker maker = node.getTreeMaker();
|
||||
return maker.Apply(nilExprs, maker.Select(maker.Ident(node.toName("this")), name), nilExprs);
|
||||
}
|
||||
},
|
||||
FIELD {
|
||||
public JCExpression get(final JavacNode node, final Name name) {
|
||||
final TreeMaker maker = node.getTreeMaker();
|
||||
final JavacTreeMaker maker = node.getTreeMaker();
|
||||
return maker.Select(maker.Ident(node.toName("this")), name);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -34,6 +34,7 @@ import lombok.core.AnnotationValues;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.FieldAccess;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;
|
||||
|
||||
@@ -57,7 +58,6 @@ import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCUnary;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
import com.sun.tools.javac.util.Name;
|
||||
@@ -219,11 +219,11 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
}
|
||||
|
||||
private JCMethodDecl createHashCode(JavacNode typeNode, List<JavacNode> fields, boolean callSuper, FieldAccess fieldAccess, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(chainDots(typeNode, "java", "lang", "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
JCExpression returnType = Javac.makeTypeIdent(maker, CTC_INT);
|
||||
JCExpression returnType = maker.TypeIdent(CTC_INT);
|
||||
ListBuffer<JCStatement> statements = ListBuffer.lb();
|
||||
|
||||
Name primeName = typeNode.toName(PRIME_NAME);
|
||||
@@ -231,12 +231,12 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
/* final int PRIME = 31; */ {
|
||||
if (!fields.isEmpty() || callSuper) {
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL),
|
||||
primeName, Javac.makeTypeIdent(maker, CTC_INT), maker.Literal(31)));
|
||||
primeName, maker.TypeIdent(CTC_INT), maker.Literal(31)));
|
||||
}
|
||||
}
|
||||
|
||||
/* int result = 1; */ {
|
||||
statements.append(maker.VarDef(maker.Modifiers(0), resultName, Javac.makeTypeIdent(maker, CTC_INT), maker.Literal(1)));
|
||||
statements.append(maker.VarDef(maker.Modifiers(0), resultName, maker.TypeIdent(CTC_INT), maker.Literal(1)));
|
||||
}
|
||||
|
||||
if (callSuper) {
|
||||
@@ -258,7 +258,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
break;
|
||||
case LONG: {
|
||||
Name dollarFieldName = dollar.append(((JCVariableDecl)fieldNode.get()).name);
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), dollarFieldName, Javac.makeTypeIdent(maker, CTC_LONG), fieldAccessor));
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), dollarFieldName, maker.TypeIdent(CTC_LONG), fieldAccessor));
|
||||
statements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));
|
||||
}
|
||||
break;
|
||||
@@ -276,7 +276,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
List.<JCExpression>nil(),
|
||||
chainDots(typeNode, "java", "lang", "Double", "doubleToLongBits"),
|
||||
List.of(fieldAccessor));
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), dollarFieldName, Javac.makeTypeIdent(maker, CTC_LONG), init));
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), dollarFieldName, maker.TypeIdent(CTC_LONG), init));
|
||||
statements.append(createResultCalculation(typeNode, longToIntForHashCode(maker, maker.Ident(dollarFieldName), maker.Ident(dollarFieldName))));
|
||||
}
|
||||
break;
|
||||
@@ -306,7 +306,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
|
||||
JCExpression hcCall = maker.Apply(List.<JCExpression>nil(), maker.Select(maker.Ident(dollarFieldName), typeNode.toName("hashCode")),
|
||||
List.<JCExpression>nil());
|
||||
JCExpression thisEqualsNull = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(dollarFieldName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(dollarFieldName), maker.Literal(CTC_BOT, null));
|
||||
statements.append(createResultCalculation(typeNode, maker.Conditional(thisEqualsNull, maker.Literal(0), hcCall)));
|
||||
}
|
||||
}
|
||||
@@ -322,19 +322,19 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
|
||||
private JCExpressionStatement createResultCalculation(JavacNode typeNode, JCExpression expr) {
|
||||
/* result = result * PRIME + (expr); */
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
Name resultName = typeNode.toName(RESULT_NAME);
|
||||
JCExpression mult = Javac.makeBinary(maker, CTC_MUL, maker.Ident(resultName), maker.Ident(typeNode.toName(PRIME_NAME)));
|
||||
JCExpression add = Javac.makeBinary(maker, CTC_PLUS, mult, expr);
|
||||
JCExpression mult = maker.Binary(CTC_MUL, maker.Ident(resultName), maker.Ident(typeNode.toName(PRIME_NAME)));
|
||||
JCExpression add = maker.Binary(CTC_PLUS, mult, expr);
|
||||
return maker.Exec(maker.Assign(maker.Ident(resultName), add));
|
||||
}
|
||||
|
||||
/** The 2 references must be clones of each other. */
|
||||
private JCExpression longToIntForHashCode(TreeMaker maker, JCExpression ref1, JCExpression ref2) {
|
||||
private JCExpression longToIntForHashCode(JavacTreeMaker maker, JCExpression ref1, JCExpression ref2) {
|
||||
/* (int)(ref >>> 32 ^ ref) */
|
||||
JCExpression shift = Javac.makeBinary(maker, CTC_UNSIGNED_SHIFT_RIGHT, ref1, maker.Literal(32));
|
||||
JCExpression xorBits = Javac.makeBinary(maker, CTC_BITXOR, shift, ref2);
|
||||
return maker.TypeCast(Javac.makeTypeIdent(maker, CTC_INT), xorBits);
|
||||
JCExpression shift = maker.Binary(CTC_UNSIGNED_SHIFT_RIGHT, ref1, maker.Literal(32));
|
||||
JCExpression xorBits = maker.Binary(CTC_BITXOR, shift, ref2);
|
||||
return maker.TypeCast(maker.TypeIdent(CTC_INT), xorBits);
|
||||
}
|
||||
|
||||
private JCExpression createTypeReference(JavacNode type) {
|
||||
@@ -347,7 +347,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
}
|
||||
Collections.reverse(list);
|
||||
|
||||
TreeMaker maker = type.getTreeMaker();
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
JCExpression chain = maker.Ident(type.toName(list.get(0)));
|
||||
|
||||
for (int i = 1; i < list.size(); i++) {
|
||||
@@ -358,7 +358,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
}
|
||||
|
||||
private JCMethodDecl createEquals(JavacNode typeNode, List<JavacNode> fields, boolean callSuper, FieldAccess fieldAccess, boolean needsCanEqual, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
JCClassDecl type = (JCClassDecl) typeNode.get();
|
||||
|
||||
Name oName = typeNode.toName("o");
|
||||
@@ -368,19 +368,19 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(chainDots(typeNode, "java", "lang", "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
JCExpression objectType = chainDots(typeNode, "java", "lang", "Object");
|
||||
JCExpression returnType = Javac.makeTypeIdent(maker, CTC_BOOLEAN);
|
||||
JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);
|
||||
|
||||
ListBuffer<JCStatement> statements = ListBuffer.lb();
|
||||
final List<JCVariableDecl> params = List.of(maker.VarDef(maker.Modifiers(Flags.FINAL), oName, objectType, null));
|
||||
|
||||
/* if (o == this) return true; */ {
|
||||
statements.append(maker.If(Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(oName),
|
||||
statements.append(maker.If(maker.Binary(CTC_EQUAL, maker.Ident(oName),
|
||||
maker.Ident(thisName)), returnBool(maker, true), null));
|
||||
}
|
||||
|
||||
/* if (!(o instanceof Outer.Inner.MyType) return false; */ {
|
||||
|
||||
JCUnary notInstanceOf = Javac.makeUnary(maker, CTC_NOT, maker.TypeTest(maker.Ident(oName), createTypeReference(typeNode)));
|
||||
JCUnary notInstanceOf = maker.Unary(CTC_NOT, maker.TypeTest(maker.Ident(oName), createTypeReference(typeNode)));
|
||||
statements.append(maker.If(notInstanceOf, returnBool(maker, false), null));
|
||||
}
|
||||
|
||||
@@ -415,7 +415,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
JCExpression equalityCheck = maker.Apply(exprNil,
|
||||
maker.Select(maker.Ident(otherName), typeNode.toName("canEqual")),
|
||||
List.of(castThisRef));
|
||||
statements.append(maker.If(Javac.makeUnary(maker, CTC_NOT, equalityCheck), returnBool(maker, false), null));
|
||||
statements.append(maker.If(maker.Unary(CTC_NOT, equalityCheck), returnBool(maker, false), null));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,7 +424,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
JCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),
|
||||
maker.Select(maker.Ident(typeNode.toName("super")), typeNode.toName("equals")),
|
||||
List.<JCExpression>of(maker.Ident(oName)));
|
||||
JCUnary superNotEqual = Javac.makeUnary(maker, CTC_NOT, callToSuper);
|
||||
JCUnary superNotEqual = maker.Unary(CTC_NOT, callToSuper);
|
||||
statements.append(maker.If(superNotEqual, returnBool(maker, false), null));
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
default:
|
||||
/* if (this.fieldName != other.fieldName) return false; */
|
||||
statements.append(
|
||||
maker.If(Javac.makeBinary(maker, CTC_NOT_EQUAL, thisFieldAccessor, otherFieldAccessor), returnBool(maker, false), null));
|
||||
maker.If(maker.Binary(CTC_NOT_EQUAL, thisFieldAccessor, otherFieldAccessor), returnBool(maker, false), null));
|
||||
break;
|
||||
}
|
||||
} else if (fType instanceof JCArrayTypeTree) {
|
||||
@@ -458,7 +458,7 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
|
||||
JCExpression eqMethod = chainDots(typeNode, "java", "util", "Arrays", useDeepEquals ? "deepEquals" : "equals");
|
||||
List<JCExpression> args = List.of(thisFieldAccessor, otherFieldAccessor);
|
||||
statements.append(maker.If(Javac.makeUnary(maker, CTC_NOT,
|
||||
statements.append(maker.If(maker.Unary(CTC_NOT,
|
||||
maker.Apply(List.<JCExpression>nil(), eqMethod, args)), returnBool(maker, false), null));
|
||||
} else /* objects */ {
|
||||
/* final java.lang.Object this$fieldName = this.fieldName; */
|
||||
@@ -471,12 +471,12 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), thisDollarFieldName, chainDots(typeNode, "java", "lang", "Object"), thisFieldAccessor));
|
||||
statements.append(maker.VarDef(maker.Modifiers(Flags.FINAL), otherDollarFieldName, chainDots(typeNode, "java", "lang", "Object"), otherFieldAccessor));
|
||||
|
||||
JCExpression thisEqualsNull = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(thisDollarFieldName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCExpression otherNotEqualsNull = Javac.makeBinary(maker, CTC_NOT_EQUAL, maker.Ident(otherDollarFieldName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCExpression thisEqualsNull = maker.Binary(CTC_EQUAL, maker.Ident(thisDollarFieldName), maker.Literal(CTC_BOT, null));
|
||||
JCExpression otherNotEqualsNull = maker.Binary(CTC_NOT_EQUAL, maker.Ident(otherDollarFieldName), maker.Literal(CTC_BOT, null));
|
||||
JCExpression thisEqualsThat = maker.Apply(List.<JCExpression>nil(),
|
||||
maker.Select(maker.Ident(thisDollarFieldName), typeNode.toName("equals")),
|
||||
List.<JCExpression>of(maker.Ident(otherDollarFieldName)));
|
||||
JCExpression fieldsAreNotEqual = maker.Conditional(thisEqualsNull, otherNotEqualsNull, Javac.makeUnary(maker, CTC_NOT, thisEqualsThat));
|
||||
JCExpression fieldsAreNotEqual = maker.Conditional(thisEqualsNull, otherNotEqualsNull, maker.Unary(CTC_NOT, thisEqualsThat));
|
||||
statements.append(maker.If(fieldsAreNotEqual, returnBool(maker, false), null));
|
||||
}
|
||||
}
|
||||
@@ -494,10 +494,10 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
* return other instanceof Outer.Inner.MyType;
|
||||
* }
|
||||
*/
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.<JCAnnotation>nil());
|
||||
JCExpression returnType = Javac.makeTypeIdent(maker, CTC_BOOLEAN);
|
||||
JCExpression returnType = maker.TypeIdent(CTC_BOOLEAN);
|
||||
Name canEqualName = typeNode.toName("canEqual");
|
||||
JCExpression objectType = chainDots(typeNode, "java", "lang", "Object");
|
||||
Name otherName = typeNode.toName("other");
|
||||
@@ -510,16 +510,16 @@ public class HandleEqualsAndHashCode extends JavacAnnotationHandler<EqualsAndHas
|
||||
}
|
||||
|
||||
private JCStatement generateCompareFloatOrDouble(JCExpression thisDotField, JCExpression otherDotField,
|
||||
TreeMaker maker, JavacNode node, boolean isDouble) {
|
||||
JavacTreeMaker maker, JavacNode node, boolean isDouble) {
|
||||
/* if (Float.compare(fieldName, other.fieldName) != 0) return false; */
|
||||
JCExpression clazz = chainDots(node, "java", "lang", isDouble ? "Double" : "Float");
|
||||
List<JCExpression> args = List.of(thisDotField, otherDotField);
|
||||
JCBinary compareCallEquals0 = Javac.makeBinary(maker, CTC_NOT_EQUAL, maker.Apply(
|
||||
JCBinary compareCallEquals0 = maker.Binary(CTC_NOT_EQUAL, maker.Apply(
|
||||
List.<JCExpression>nil(), maker.Select(clazz, node.toName("compare")), args), maker.Literal(0));
|
||||
return maker.If(compareCallEquals0, returnBool(maker, false), null);
|
||||
}
|
||||
|
||||
private JCStatement returnBool(TreeMaker maker, boolean bool) {
|
||||
return maker.Return(Javac.makeLiteral(maker, CTC_BOOLEAN, bool ? 1 : 0));
|
||||
private JCStatement returnBool(JavacTreeMaker maker, boolean bool) {
|
||||
return maker.Return(maker.Literal(CTC_BOOLEAN, bool ? 1 : 0));
|
||||
}
|
||||
}
|
||||
@@ -38,6 +38,7 @@ import lombok.core.TransformationsUtil;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.FieldAccess;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
@@ -58,7 +59,6 @@ import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCSynchronized;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
@@ -214,7 +214,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
injectMethod(fieldNode.up(), createGetter(access, fieldNode, fieldNode.getTreeMaker(), source.get(), lazy, onMethod));
|
||||
}
|
||||
|
||||
private JCMethodDecl createGetter(long access, JavacNode field, TreeMaker treeMaker, JCTree source, boolean lazy, List<JCAnnotation> onMethod) {
|
||||
private JCMethodDecl createGetter(long access, JavacNode field, JavacTreeMaker treeMaker, JCTree source, boolean lazy, List<JCAnnotation> onMethod) {
|
||||
JCVariableDecl fieldNode = (JCVariableDecl) field.get();
|
||||
|
||||
// Remember the type; lazy will change it
|
||||
@@ -281,7 +281,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
return delegates;
|
||||
}
|
||||
|
||||
private List<JCStatement> createSimpleGetterBody(TreeMaker treeMaker, JavacNode field) {
|
||||
private List<JCStatement> createSimpleGetterBody(JavacTreeMaker treeMaker, JavacNode field) {
|
||||
return List.<JCStatement>of(treeMaker.Return(createFieldAccessor(treeMaker, field, FieldAccess.ALWAYS_FIELD)));
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
TYPE_MAP = Collections.unmodifiableMap(m);
|
||||
}
|
||||
|
||||
private List<JCStatement> createLazyGetterBody(TreeMaker maker, JavacNode fieldNode, JCTree source) {
|
||||
private List<JCStatement> createLazyGetterBody(JavacTreeMaker maker, JavacNode fieldNode, JCTree source) {
|
||||
/*
|
||||
java.lang.Object value = this.fieldName.get();
|
||||
if (value == null) {
|
||||
@@ -374,7 +374,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
}
|
||||
/* [ELSE] value = actualValue == null ? this.fieldName : actualValue; */ {
|
||||
if (!isPrimitive) {
|
||||
JCExpression actualValueIsNull = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(actualValueName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCExpression actualValueIsNull = maker.Binary(CTC_EQUAL, maker.Ident(actualValueName), maker.Literal(CTC_BOT, null));
|
||||
JCExpression thisDotFieldName = createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD);
|
||||
JCExpression ternary = maker.Conditional(actualValueIsNull, thisDotFieldName, maker.Ident(actualValueName));
|
||||
JCStatement statement = maker.Exec(maker.Assign(maker.Ident(valueName), ternary));
|
||||
@@ -386,7 +386,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
innerIfStatements.append(statement);
|
||||
}
|
||||
|
||||
JCBinary isNull = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(valueName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCBinary isNull = maker.Binary(CTC_EQUAL, maker.Ident(valueName), maker.Literal(CTC_BOT, null));
|
||||
JCIf ifStatement = maker.If(isNull, maker.Block(0, innerIfStatements.toList()), null);
|
||||
synchronizedStatements.append(ifStatement);
|
||||
}
|
||||
@@ -394,7 +394,7 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
synchronizedStatement = maker.Synchronized(createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD), maker.Block(0, synchronizedStatements.toList()));
|
||||
}
|
||||
|
||||
JCBinary isNull = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(valueName), Javac.makeLiteral(maker, CTC_BOT, null));
|
||||
JCBinary isNull = maker.Binary(CTC_EQUAL, maker.Ident(valueName), maker.Literal(CTC_BOT, null));
|
||||
JCIf ifStatement = maker.If(isNull, maker.Block(0, List.<JCStatement>of(synchronizedStatement)), null);
|
||||
statements.append(ifStatement);
|
||||
}
|
||||
@@ -405,8 +405,8 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
}
|
||||
/* [ELSE] return (BoxedValueType) (value == this.fieldName ? null : value); */ {
|
||||
if (!isPrimitive) {
|
||||
JCExpression valueEqualsSelf = Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(valueName), createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD));
|
||||
JCExpression ternary = maker.Conditional(valueEqualsSelf, Javac.makeLiteral(maker, CTC_BOT, null), maker.Ident(valueName));
|
||||
JCExpression valueEqualsSelf = maker.Binary(CTC_EQUAL, maker.Ident(valueName), createFieldAccessor(maker, fieldNode, FieldAccess.ALWAYS_FIELD));
|
||||
JCExpression ternary = maker.Conditional(valueEqualsSelf, maker.Literal(CTC_BOT, null), maker.Ident(valueName));
|
||||
JCExpression typeCast = maker.TypeCast(copyOfBoxedFieldType, maker.Parens(ternary));
|
||||
statements.append(maker.Return(typeCast));
|
||||
}
|
||||
@@ -424,16 +424,16 @@ public class HandleGetter extends JavacAnnotationHandler<Getter> {
|
||||
}
|
||||
|
||||
private JCMethodInvocation callGet(JavacNode source, JCExpression receiver) {
|
||||
TreeMaker maker = source.getTreeMaker();
|
||||
JavacTreeMaker maker = source.getTreeMaker();
|
||||
return maker.Apply(NIL_EXPRESSION, maker.Select(receiver, source.toName("get")), NIL_EXPRESSION);
|
||||
}
|
||||
|
||||
private JCStatement callSet(JavacNode source, JCExpression receiver, JCExpression value) {
|
||||
TreeMaker maker = source.getTreeMaker();
|
||||
JavacTreeMaker maker = source.getTreeMaker();
|
||||
return maker.Exec(maker.Apply(NIL_EXPRESSION, maker.Select(receiver, source.toName("set")), List.<JCExpression>of(value)));
|
||||
}
|
||||
|
||||
private JCExpression copyType(TreeMaker treeMaker, JCVariableDecl fieldNode) {
|
||||
private JCExpression copyType(JavacTreeMaker treeMaker, JCVariableDecl fieldNode) {
|
||||
return fieldNode.type != null ? treeMaker.Type(fieldNode.type) : fieldNode.vartype;
|
||||
}
|
||||
}
|
||||
@@ -28,12 +28,12 @@ import java.lang.annotation.Annotation;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import com.sun.tools.javac.code.Flags;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCExpression;
|
||||
@@ -74,13 +74,13 @@ public class HandleLog {
|
||||
}
|
||||
|
||||
private static JCFieldAccess selfType(JavacNode typeNode) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
Name name = ((JCClassDecl) typeNode.get()).name;
|
||||
return maker.Select(maker.Ident(name), typeNode.toName("class"));
|
||||
}
|
||||
|
||||
private static boolean createField(LoggingFramework framework, JavacNode typeNode, JCFieldAccess loggingType, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
// private static final <loggerType> log = <factoryMethod>(<parameter>);
|
||||
JCExpression loggerType = chainDotsString(typeNode, framework.getLoggerTypeName());
|
||||
@@ -164,7 +164,7 @@ public class HandleLog {
|
||||
// private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(TargetType.class.getName());
|
||||
JUL(lombok.extern.java.Log.class, "java.util.logging.Logger", "java.util.logging.Logger.getLogger") {
|
||||
@Override public JCExpression createFactoryParameter(JavacNode typeNode, JCFieldAccess loggingType) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
JCExpression method = maker.Select(loggingType, typeNode.toName("getName"));
|
||||
return maker.Apply(List.<JCExpression>nil(), method, List.<JCExpression>nil());
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import lombok.core.TransformationsUtil;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.FieldAccess;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
@@ -50,7 +51,6 @@ import com.sun.tools.javac.tree.JCTree.JCReturn;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
@@ -190,13 +190,13 @@ public class HandleSetter extends JavacAnnotationHandler<Setter> {
|
||||
injectMethod(fieldNode.up(), createdSetter);
|
||||
}
|
||||
|
||||
static JCMethodDecl createSetter(long access, JavacNode field, TreeMaker treeMaker, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
static JCMethodDecl createSetter(long access, JavacNode field, JavacTreeMaker treeMaker, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
String setterName = toSetterName(field);
|
||||
boolean returnThis = shouldReturnThis(field);
|
||||
return createSetter(access, field, treeMaker, setterName, returnThis, source, onMethod, onParam);
|
||||
}
|
||||
|
||||
static JCMethodDecl createSetter(long access, JavacNode field, TreeMaker treeMaker, String setterName, boolean shouldReturnThis, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
static JCMethodDecl createSetter(long access, JavacNode field, JavacTreeMaker treeMaker, String setterName, boolean shouldReturnThis, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
if (setterName == null) return null;
|
||||
|
||||
JCVariableDecl fieldDecl = (JCVariableDecl) field.get();
|
||||
|
||||
@@ -29,15 +29,14 @@ import java.util.Collections;
|
||||
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import com.sun.tools.javac.code.Flags;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBlock;
|
||||
import com.sun.tools.javac.tree.JCTree.JCExpression;
|
||||
@@ -114,7 +113,7 @@ public class HandleSneakyThrows extends JavacAnnotationHandler<SneakyThrows> {
|
||||
}
|
||||
|
||||
private JCStatement buildTryCatchBlock(JavacNode node, List<JCStatement> contents, String exception, JCTree source) {
|
||||
TreeMaker maker = node.getTreeMaker();
|
||||
JavacTreeMaker maker = node.getTreeMaker();
|
||||
|
||||
JCBlock tryBlock = setGeneratedBy(maker.Block(0, contents), source);
|
||||
|
||||
@@ -122,7 +121,7 @@ public class HandleSneakyThrows extends JavacAnnotationHandler<SneakyThrows> {
|
||||
|
||||
JCVariableDecl catchParam = maker.VarDef(maker.Modifiers(Flags.FINAL), node.toName("$ex"), varType, null);
|
||||
JCExpression lombokLombokSneakyThrowNameRef = chainDots(node, "lombok", "Lombok", "sneakyThrow");
|
||||
JCBlock catchBody = maker.Block(0, List.<JCStatement>of(Javac.makeThrow(maker, maker.Apply(
|
||||
JCBlock catchBody = maker.Block(0, List.<JCStatement>of(maker.Throw(maker.Apply(
|
||||
List.<JCExpression>nil(), lombokLombokSneakyThrowNameRef,
|
||||
List.<JCExpression>of(maker.Ident(node.toName("$ex")))))));
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2012 The Project Lombok Authors.
|
||||
* Copyright (C) 2009-2013 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
|
||||
@@ -26,9 +26,9 @@ import static lombok.javac.handlers.JavacHandlerUtil.*;
|
||||
import lombok.Synchronized;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.MemberExistsResult;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
@@ -40,7 +40,6 @@ import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCNewArray;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.List;
|
||||
|
||||
/**
|
||||
@@ -78,7 +77,7 @@ public class HandleSynchronized extends JavacAnnotationHandler<Synchronized> {
|
||||
lockName = isStatic ? STATIC_LOCK_NAME : INSTANCE_LOCK_NAME;
|
||||
}
|
||||
|
||||
TreeMaker maker = methodNode.getTreeMaker().at(ast.pos);
|
||||
JavacTreeMaker maker = methodNode.getTreeMaker().at(ast.pos);
|
||||
|
||||
if (fieldExists(lockName, methodNode) == MemberExistsResult.NOT_EXISTS) {
|
||||
if (!autoMake) {
|
||||
@@ -88,7 +87,7 @@ public class HandleSynchronized extends JavacAnnotationHandler<Synchronized> {
|
||||
JCExpression objectType = chainDots(methodNode, ast.pos, "java", "lang", "Object");
|
||||
//We use 'new Object[0];' because unlike 'new Object();', empty arrays *ARE* serializable!
|
||||
JCNewArray newObjectArray = maker.NewArray(chainDots(methodNode, ast.pos, "java", "lang", "Object"),
|
||||
List.<JCExpression>of(Javac.makeLiteral(maker, CTC_INT, 0)), null);
|
||||
List.<JCExpression>of(maker.Literal(CTC_INT, 0)), null);
|
||||
JCVariableDecl fieldDecl = recursiveSetGeneratedBy(maker.VarDef(
|
||||
maker.Modifiers(Flags.PRIVATE | Flags.FINAL | (isStatic ? Flags.STATIC : 0)),
|
||||
methodNode.toName(lockName), objectType, newObjectArray), ast);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2009-2012 The Project Lombok Authors.
|
||||
* Copyright (C) 2009-2013 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
|
||||
@@ -29,15 +29,14 @@ import java.util.Collection;
|
||||
import lombok.ToString;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.AST.Kind;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import org.mangosdk.spi.ProviderFor;
|
||||
|
||||
import com.sun.tools.javac.code.Flags;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBlock;
|
||||
@@ -168,7 +167,7 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
|
||||
}
|
||||
|
||||
static JCMethodDecl createToString(JavacNode typeNode, Collection<JavacNode> fields, boolean includeFieldNames, boolean callSuper, FieldAccess fieldAccess, JCTree source) {
|
||||
TreeMaker maker = typeNode.getTreeMaker();
|
||||
JavacTreeMaker maker = typeNode.getTreeMaker();
|
||||
|
||||
JCAnnotation overrideAnnotation = maker.Annotation(chainDots(typeNode, "java", "lang", "Override"), List.<JCExpression>nil());
|
||||
JCModifiers mods = maker.Modifiers(Flags.PUBLIC, List.of(overrideAnnotation));
|
||||
@@ -196,7 +195,7 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
|
||||
JCMethodInvocation callToSuper = maker.Apply(List.<JCExpression>nil(),
|
||||
maker.Select(maker.Ident(typeNode.toName("super")), typeNode.toName("toString")),
|
||||
List.<JCExpression>nil());
|
||||
current = Javac.makeBinary(maker, CTC_PLUS, current, callToSuper);
|
||||
current = maker.Binary(CTC_PLUS, current, callToSuper);
|
||||
first = false;
|
||||
}
|
||||
|
||||
@@ -220,21 +219,21 @@ public class HandleToString extends JavacAnnotationHandler<ToString> {
|
||||
} else expr = fieldAccessor;
|
||||
|
||||
if (first) {
|
||||
current = Javac.makeBinary(maker, CTC_PLUS, current, expr);
|
||||
current = maker.Binary(CTC_PLUS, current, expr);
|
||||
first = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (includeFieldNames) {
|
||||
current = Javac.makeBinary(maker, CTC_PLUS, current, maker.Literal(infix + fieldNode.getName() + "="));
|
||||
current = maker.Binary(CTC_PLUS, current, maker.Literal(infix + fieldNode.getName() + "="));
|
||||
} else {
|
||||
current = Javac.makeBinary(maker, CTC_PLUS, current, maker.Literal(infix));
|
||||
current = maker.Binary(CTC_PLUS, current, maker.Literal(infix));
|
||||
}
|
||||
|
||||
current = Javac.makeBinary(maker, CTC_PLUS, current, expr);
|
||||
current = maker.Binary(CTC_PLUS, current, expr);
|
||||
}
|
||||
|
||||
if (!first) current = Javac.makeBinary(maker, CTC_PLUS, current, maker.Literal(suffix));
|
||||
if (!first) current = maker.Binary(CTC_PLUS, current, maker.Literal(suffix));
|
||||
|
||||
JCStatement returnStatement = maker.Return(current);
|
||||
|
||||
|
||||
@@ -31,9 +31,9 @@ import lombok.core.AST.Kind;
|
||||
import lombok.core.AnnotationValues;
|
||||
import lombok.core.TransformationsUtil;
|
||||
import lombok.experimental.Wither;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacAnnotationHandler;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.CopyJavadoc;
|
||||
import lombok.javac.handlers.JavacHandlerUtil.FieldAccess;
|
||||
|
||||
@@ -52,7 +52,6 @@ import com.sun.tools.javac.tree.JCTree.JCReturn;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.ListBuffer;
|
||||
@@ -202,7 +201,7 @@ public class HandleWither extends JavacAnnotationHandler<Wither> {
|
||||
injectMethod(fieldNode.up(), createdWither);
|
||||
}
|
||||
|
||||
private JCMethodDecl createWither(long access, JavacNode field, TreeMaker treeMaker, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
private JCMethodDecl createWither(long access, JavacNode field, JavacTreeMaker maker, JCTree source, List<JCAnnotation> onMethod, List<JCAnnotation> onParam) {
|
||||
String witherName = toWitherName(field);
|
||||
if (witherName == null) return null;
|
||||
|
||||
@@ -215,13 +214,11 @@ public class HandleWither extends JavacAnnotationHandler<Wither> {
|
||||
Name methodName = field.toName(witherName);
|
||||
List<JCAnnotation> annsOnParam = copyAnnotations(onParam).appendList(nonNulls).appendList(nullables);
|
||||
|
||||
JCVariableDecl param = treeMaker.VarDef(treeMaker.Modifiers(Flags.FINAL, annsOnParam), fieldDecl.name, fieldDecl.vartype, null);
|
||||
JCVariableDecl param = maker.VarDef(maker.Modifiers(Flags.FINAL, annsOnParam), fieldDecl.name, fieldDecl.vartype, null);
|
||||
|
||||
JCExpression selfType = cloneSelfType(field);
|
||||
if (selfType == null) return null;
|
||||
|
||||
TreeMaker maker = field.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> args = ListBuffer.lb();
|
||||
for (JavacNode child : field.up().down()) {
|
||||
if (child.getKind() != Kind.FIELD) continue;
|
||||
@@ -241,21 +238,21 @@ public class HandleWither extends JavacAnnotationHandler<Wither> {
|
||||
}
|
||||
|
||||
JCNewClass newClass = maker.NewClass(null, List.<JCExpression>nil(), selfType, args.toList(), null);
|
||||
JCExpression identityCheck = Javac.makeBinary(maker, CTC_EQUAL, createFieldAccessor(maker, field, FieldAccess.ALWAYS_FIELD), maker.Ident(fieldDecl.name));
|
||||
JCExpression identityCheck = maker.Binary(CTC_EQUAL, createFieldAccessor(maker, field, FieldAccess.ALWAYS_FIELD), maker.Ident(fieldDecl.name));
|
||||
JCConditional conditional = maker.Conditional(identityCheck, maker.Ident(field.toName("this")), newClass);
|
||||
JCReturn returnStatement = maker.Return(conditional);
|
||||
|
||||
if (nonNulls.isEmpty()) {
|
||||
statements.append(returnStatement);
|
||||
} else {
|
||||
JCStatement nullCheck = generateNullCheck(treeMaker, field);
|
||||
JCStatement nullCheck = generateNullCheck(maker, field);
|
||||
if (nullCheck != null) statements.append(nullCheck);
|
||||
statements.append(returnStatement);
|
||||
}
|
||||
|
||||
JCExpression returnType = cloneSelfType(field);
|
||||
|
||||
JCBlock methodBody = treeMaker.Block(0, statements.toList());
|
||||
JCBlock methodBody = maker.Block(0, statements.toList());
|
||||
List<JCTypeParameter> methodGenericParams = List.nil();
|
||||
List<JCVariableDecl> parameters = List.of(param);
|
||||
List<JCExpression> throwsClauses = List.nil();
|
||||
@@ -264,9 +261,9 @@ public class HandleWither extends JavacAnnotationHandler<Wither> {
|
||||
List<JCAnnotation> annsOnMethod = copyAnnotations(onMethod);
|
||||
|
||||
if (isFieldDeprecated(field)) {
|
||||
annsOnMethod = annsOnMethod.prepend(treeMaker.Annotation(chainDots(field, "java", "lang", "Deprecated"), List.<JCExpression>nil()));
|
||||
annsOnMethod = annsOnMethod.prepend(maker.Annotation(chainDots(field, "java", "lang", "Deprecated"), List.<JCExpression>nil()));
|
||||
}
|
||||
JCMethodDecl decl = recursiveSetGeneratedBy(treeMaker.MethodDef(treeMaker.Modifiers(access, annsOnMethod), methodName, returnType,
|
||||
JCMethodDecl decl = recursiveSetGeneratedBy(maker.MethodDef(maker.Modifiers(access, annsOnMethod), methodName, returnType,
|
||||
methodGenericParams, parameters, throwsClauses, methodBody, annotationMethodDefaultValue), source);
|
||||
copyJavadoc(field, decl, CopyJavadoc.WITHER);
|
||||
return decl;
|
||||
|
||||
@@ -44,8 +44,8 @@ import lombok.core.AnnotationValues.AnnotationValue;
|
||||
import lombok.core.TransformationsUtil;
|
||||
import lombok.core.TypeResolver;
|
||||
import lombok.experimental.Accessors;
|
||||
import lombok.javac.Javac;
|
||||
import lombok.javac.JavacNode;
|
||||
import lombok.javac.JavacTreeMaker;
|
||||
|
||||
import com.sun.tools.javac.code.BoundKind;
|
||||
import com.sun.tools.javac.code.Flags;
|
||||
@@ -73,7 +73,6 @@ import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCWildcard;
|
||||
import com.sun.tools.javac.tree.JCTree.TypeBoundKind;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.TreeScanner;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
import com.sun.tools.javac.util.List;
|
||||
@@ -430,7 +429,7 @@ public class JavacHandlerUtil {
|
||||
|
||||
public static JCExpression cloneSelfType(JavacNode field) {
|
||||
JavacNode typeNode = field;
|
||||
TreeMaker maker = field.getTreeMaker();
|
||||
JavacTreeMaker maker = field.getTreeMaker();
|
||||
while (typeNode != null && typeNode.getKind() != Kind.TYPE) typeNode = typeNode.up();
|
||||
if (typeNode != null && typeNode.get() instanceof JCClassDecl) {
|
||||
JCClassDecl type = (JCClassDecl) typeNode.get();
|
||||
@@ -708,11 +707,11 @@ public class JavacHandlerUtil {
|
||||
/**
|
||||
* Creates an expression that reads the field. Will either be {@code this.field} or {@code this.getField()} depending on whether or not there's a getter.
|
||||
*/
|
||||
static JCExpression createFieldAccessor(TreeMaker maker, JavacNode field, FieldAccess fieldAccess) {
|
||||
static JCExpression createFieldAccessor(JavacTreeMaker maker, JavacNode field, FieldAccess fieldAccess) {
|
||||
return createFieldAccessor(maker, field, fieldAccess, null);
|
||||
}
|
||||
|
||||
static JCExpression createFieldAccessor(TreeMaker maker, JavacNode field, FieldAccess fieldAccess, JCExpression receiver) {
|
||||
static JCExpression createFieldAccessor(JavacTreeMaker maker, JavacNode field, FieldAccess fieldAccess, JCExpression receiver) {
|
||||
boolean lookForGetter = lookForGetter(field, fieldAccess);
|
||||
|
||||
GetterMethod getter = lookForGetter ? findGetter(field) : null;
|
||||
@@ -840,7 +839,7 @@ public class JavacHandlerUtil {
|
||||
}
|
||||
|
||||
private static void addSuppressWarningsAll(JCModifiers mods, JavacNode node, int pos, JCTree source) {
|
||||
TreeMaker maker = node.getTreeMaker();
|
||||
JavacTreeMaker maker = node.getTreeMaker();
|
||||
JCExpression suppressWarningsType = chainDots(node, "java", "lang", "SuppressWarnings");
|
||||
JCLiteral allLiteral = maker.Literal("all");
|
||||
suppressWarningsType.pos = pos;
|
||||
@@ -891,7 +890,7 @@ public class JavacHandlerUtil {
|
||||
assert elems != null;
|
||||
assert elems.length > 0;
|
||||
|
||||
TreeMaker maker = node.getTreeMaker();
|
||||
JavacTreeMaker maker = node.getTreeMaker();
|
||||
if (pos != -1) maker = maker.at(pos);
|
||||
JCExpression e = maker.Ident(node.toName(elems[0]));
|
||||
for (int i = 1 ; i < elems.length ; i++) {
|
||||
@@ -941,15 +940,15 @@ public class JavacHandlerUtil {
|
||||
* Generates a new statement that checks if the given variable is null, and if so, throws a {@code NullPointerException} with the
|
||||
* variable name as message.
|
||||
*/
|
||||
public static JCStatement generateNullCheck(TreeMaker maker, JavacNode variable) {
|
||||
public static JCStatement generateNullCheck(JavacTreeMaker maker, JavacNode variable) {
|
||||
JCVariableDecl varDecl = (JCVariableDecl) variable.get();
|
||||
if (isPrimitive(varDecl.vartype)) return null;
|
||||
Name fieldName = varDecl.name;
|
||||
JCExpression npe = chainDots(variable, "java", "lang", "NullPointerException");
|
||||
JCExpression exception = maker.NewClass(null, List.<JCExpression>nil(), npe, List.<JCExpression>of(maker.Literal(fieldName.toString())), null);
|
||||
JCStatement throwStatement = Javac.makeThrow(maker, exception);
|
||||
JCStatement throwStatement = maker.Throw(exception);
|
||||
JCBlock throwBlock = maker.Block(0, List.of(throwStatement));
|
||||
return maker.If(Javac.makeBinary(maker, CTC_EQUAL, maker.Ident(fieldName), Javac.makeLiteral(maker, CTC_BOT, null)), throwBlock, null);
|
||||
return maker.If(maker.Binary(CTC_EQUAL, maker.Ident(fieldName), maker.Literal(CTC_BOT, null)), throwBlock, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1050,14 +1049,14 @@ public class JavacHandlerUtil {
|
||||
return result.toList();
|
||||
}
|
||||
|
||||
public static List<JCTypeParameter> copyTypeParams(TreeMaker maker, List<JCTypeParameter> params) {
|
||||
public static List<JCTypeParameter> copyTypeParams(JavacTreeMaker maker, List<JCTypeParameter> params) {
|
||||
if (params == null || params.isEmpty()) return params;
|
||||
ListBuffer<JCTypeParameter> out = ListBuffer.lb();
|
||||
for (JCTypeParameter tp : params) out.append(maker.TypeParameter(tp.name, tp.bounds));
|
||||
return out.toList();
|
||||
}
|
||||
|
||||
public static JCExpression namePlusTypeParamsToTypeReference(TreeMaker maker, Name typeName, List<JCTypeParameter> params) {
|
||||
public static JCExpression namePlusTypeParamsToTypeReference(JavacTreeMaker maker, Name typeName, List<JCTypeParameter> params) {
|
||||
ListBuffer<JCExpression> typeArgs = ListBuffer.lb();
|
||||
|
||||
if (!params.isEmpty()) {
|
||||
@@ -1136,13 +1135,13 @@ public class JavacHandlerUtil {
|
||||
* the class's own parameter, but as its a static method, the static method's notion of {@code T} is different from the class notion of {@code T}. If you're duplicating
|
||||
* a type used in the class context, you need to use this method.
|
||||
*/
|
||||
public static JCExpression cloneType(TreeMaker maker, JCExpression in, JCTree source) {
|
||||
public static JCExpression cloneType(JavacTreeMaker maker, JCExpression in, JCTree source) {
|
||||
JCExpression out = cloneType0(maker, in);
|
||||
if (out != null) recursiveSetGeneratedBy(out, source);
|
||||
return out;
|
||||
}
|
||||
|
||||
private static JCExpression cloneType0(TreeMaker maker, JCTree in) {
|
||||
private static JCExpression cloneType0(JavacTreeMaker maker, JCTree in) {
|
||||
if (in == null) return null;
|
||||
|
||||
if (in instanceof JCPrimitiveTypeTree) return (JCExpression) in;
|
||||
@@ -1278,17 +1277,17 @@ public class JavacHandlerUtil {
|
||||
*/
|
||||
public static void copyJavadoc(JavacNode from, JCTree to, CopyJavadoc copyMode) {
|
||||
if (copyMode == null) copyMode = CopyJavadoc.VERBATIM;
|
||||
try {
|
||||
JCCompilationUnit cu = ((JCCompilationUnit) from.top().get());
|
||||
if (cu.docComments != null) {
|
||||
String javadoc = cu.docComments.get(from.get());
|
||||
|
||||
if (javadoc != null) {
|
||||
String[] filtered = copyMode.split(javadoc);
|
||||
cu.docComments.put(to, filtered[0]);
|
||||
cu.docComments.put(from.get(), filtered[1]);
|
||||
}
|
||||
}
|
||||
} catch (Exception ignore) {}
|
||||
// try {
|
||||
// JCCompilationUnit cu = ((JCCompilationUnit) from.top().get());
|
||||
// if (cu.docComments != null) {
|
||||
// String javadoc = cu.docComments.get(from.get());
|
||||
//
|
||||
// if (javadoc != null) {
|
||||
// String[] filtered = copyMode.split(javadoc);
|
||||
// cu.docComments.put(to, filtered[0]);
|
||||
// cu.docComments.put(from.get(), filtered[1]);
|
||||
// }
|
||||
// }
|
||||
// } catch (Exception ignore) {}
|
||||
}
|
||||
}
|
||||
@@ -21,12 +21,12 @@
|
||||
*/
|
||||
package lombok.javac;
|
||||
|
||||
import static lombok.javac.JavacTreeMaker.TreeTag.treeTag;
|
||||
import static lombok.javac.JavacTreeMaker.TypeTag.typeTag;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
@@ -35,25 +35,20 @@ import javax.lang.model.type.NoType;
|
||||
import javax.lang.model.type.TypeKind;
|
||||
import javax.lang.model.type.TypeVisitor;
|
||||
|
||||
import lombok.javac.JavacTreeMaker.TreeTag;
|
||||
import lombok.javac.JavacTreeMaker.TypeTag;
|
||||
|
||||
import com.sun.tools.javac.code.Type;
|
||||
import com.sun.tools.javac.main.JavaCompiler;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBinary;
|
||||
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
|
||||
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.JCLiteral;
|
||||
import com.sun.tools.javac.tree.JCTree.JCModifiers;
|
||||
import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCUnary;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.Name;
|
||||
|
||||
/**
|
||||
* Container for static utility methods relevant to lombok's operation on javac.
|
||||
@@ -63,9 +58,6 @@ public class Javac {
|
||||
// prevent instantiation
|
||||
}
|
||||
|
||||
private static final ConcurrentMap<String, Object> TYPE_TAG_CACHE = new ConcurrentHashMap<String, Object>();
|
||||
private static final ConcurrentMap<String, Object> TREE_TAG_CACHE = new ConcurrentHashMap<String, Object>();
|
||||
|
||||
/** Matches any of the 8 primitive names, such as {@code boolean}. */
|
||||
private static final Pattern PRIMITIVE_TYPE_NAME_PATTERN = Pattern.compile("^(boolean|byte|short|int|long|float|double|char)$");
|
||||
|
||||
@@ -127,69 +119,39 @@ public class Javac {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static final Object CTC_BOOLEAN = getTypeTag("BOOLEAN");
|
||||
public static final Object CTC_INT = getTypeTag("INT");
|
||||
public static final Object CTC_DOUBLE = getTypeTag("DOUBLE");
|
||||
public static final Object CTC_FLOAT = getTypeTag("FLOAT");
|
||||
public static final Object CTC_SHORT = getTypeTag("SHORT");
|
||||
public static final Object CTC_BYTE = getTypeTag("BYTE");
|
||||
public static final Object CTC_LONG = getTypeTag("LONG");
|
||||
public static final Object CTC_CHAR = getTypeTag("CHAR");
|
||||
public static final Object CTC_VOID = getTypeTag("VOID");
|
||||
public static final Object CTC_NONE = getTypeTag("NONE");
|
||||
public static final Object CTC_BOT = getTypeTag("BOT");
|
||||
public static final Object CTC_CLASS = getTypeTag("CLASS");
|
||||
public static final TypeTag CTC_BOOLEAN = typeTag("BOOLEAN");
|
||||
public static final TypeTag CTC_INT = typeTag("INT");
|
||||
public static final TypeTag CTC_DOUBLE = typeTag("DOUBLE");
|
||||
public static final TypeTag CTC_FLOAT = typeTag("FLOAT");
|
||||
public static final TypeTag CTC_SHORT = typeTag("SHORT");
|
||||
public static final TypeTag CTC_BYTE = typeTag("BYTE");
|
||||
public static final TypeTag CTC_LONG = typeTag("LONG");
|
||||
public static final TypeTag CTC_CHAR = typeTag("CHAR");
|
||||
public static final TypeTag CTC_VOID = typeTag("VOID");
|
||||
public static final TypeTag CTC_NONE = typeTag("NONE");
|
||||
public static final TypeTag CTC_BOT = typeTag("BOT");
|
||||
public static final TypeTag CTC_CLASS = typeTag("CLASS");
|
||||
|
||||
public static final Object CTC_NOT_EQUAL = getTreeTag("NE");
|
||||
public static final Object CTC_NOT = getTreeTag("NOT");
|
||||
public static final Object CTC_BITXOR = getTreeTag("BITXOR");
|
||||
public static final Object CTC_UNSIGNED_SHIFT_RIGHT = getTreeTag("USR");
|
||||
public static final Object CTC_MUL = getTreeTag("MUL");
|
||||
public static final Object CTC_PLUS = getTreeTag("PLUS");
|
||||
public static final Object CTC_EQUAL = getTreeTag("EQ");
|
||||
public static final TreeTag CTC_NOT_EQUAL = treeTag("NE");
|
||||
public static final TreeTag CTC_NOT = treeTag("NOT");
|
||||
public static final TreeTag CTC_BITXOR = treeTag("BITXOR");
|
||||
public static final TreeTag CTC_UNSIGNED_SHIFT_RIGHT = treeTag("USR");
|
||||
public static final TreeTag CTC_MUL = treeTag("MUL");
|
||||
public static final TreeTag CTC_PLUS = treeTag("PLUS");
|
||||
public static final TreeTag CTC_EQUAL = treeTag("EQ");
|
||||
|
||||
public static boolean compareCTC(Object ctc1, Object ctc2) {
|
||||
return ctc1 == null ? ctc2 == null : ctc1.equals(ctc2);
|
||||
public static boolean compareCTC(TreeTag ctc1, TreeTag ctc2) {
|
||||
boolean ctc1IsNull = ctc1 == null || ctc1.value == null;
|
||||
boolean ctc2IsNull = ctc2 == null || ctc2.value == null;
|
||||
if (ctc1IsNull || ctc2IsNull) return ctc1IsNull && ctc2IsNull;
|
||||
return ctc1.value.equals(ctc2.value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the provided TypeTag value, in a compiler version independent manner.
|
||||
*
|
||||
* The actual type object differs depending on the Compiler version:
|
||||
* <ul>
|
||||
* <li>For JDK 8 this is an enum value of type <code>com.sun.tools.javac.code.TypeTag</code>
|
||||
* <li>for JDK 7 and lower, this is the value of the constant within <code>com.sun.tools.javac.code.TypeTags</code>
|
||||
* </ul>
|
||||
* Solves the problem of compile time constant inlining, resulting in lombok
|
||||
* having the wrong value (javac compiler changes private api constants from
|
||||
* time to time).
|
||||
*
|
||||
* @param identifier Identifier to turn into a TypeTag.
|
||||
* @return the value of the typetag constant (either enum instance or an Integer object).
|
||||
*/
|
||||
public static Object getTypeTag(String identifier) {
|
||||
return getFieldCached(TYPE_TAG_CACHE, getJavaCompilerVersion() < 8 ? "com.sun.tools.javac.code.TypeTags" : "com.sun.tools.javac.code.TypeTag", identifier);
|
||||
}
|
||||
|
||||
public static Object getTreeTag(String identifier) {
|
||||
return getFieldCached(TREE_TAG_CACHE, getJavaCompilerVersion() < 8 ? "com.sun.tools.javac.tree.JCTree" : "com.sun.tools.javac.tree.JCTree$Tag", identifier);
|
||||
}
|
||||
|
||||
private static Object getFieldCached(ConcurrentMap<String, Object> cache, String className, String fieldName) {
|
||||
Object value = cache.get(fieldName);
|
||||
if (value != null) return value;
|
||||
try {
|
||||
value = Class.forName(className).getField(fieldName).get(null);
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw sneakyThrow(e);
|
||||
}
|
||||
|
||||
cache.putIfAbsent(fieldName, value);
|
||||
return value;
|
||||
public static boolean compareCTC(TypeTag ctc1, TypeTag ctc2) {
|
||||
boolean ctc1IsNull = ctc1 == null || ctc1.value == null;
|
||||
boolean ctc2IsNull = ctc2 == null || ctc2.value == null;
|
||||
if (ctc1IsNull || ctc2IsNull) return ctc1IsNull && ctc2IsNull;
|
||||
return ctc1.value.equals(ctc2.value);
|
||||
}
|
||||
|
||||
public static Object getTreeTypeTag(JCPrimitiveTypeTree tree) {
|
||||
@@ -200,44 +162,9 @@ public class Javac {
|
||||
return tree.typetag;
|
||||
}
|
||||
|
||||
private static final Method createIdent, createLiteral, createUnary, createBinary, createThrow, getExtendsClause, getEndPosition;
|
||||
private static final Method getExtendsClause, getEndPosition;
|
||||
|
||||
static {
|
||||
if (getJavaCompilerVersion() < 8) {
|
||||
createIdent = getMethod(TreeMaker.class, "TypeIdent", int.class);
|
||||
} else {
|
||||
createIdent = getMethod(TreeMaker.class, "TypeIdent", "com.sun.tools.javac.code.TypeTag");
|
||||
}
|
||||
createIdent.setAccessible(true);
|
||||
|
||||
if (getJavaCompilerVersion() < 8) {
|
||||
createLiteral = getMethod(TreeMaker.class, "Literal", int.class, Object.class);
|
||||
} else {
|
||||
createLiteral = getMethod(TreeMaker.class, "Literal", "com.sun.tools.javac.code.TypeTag", "java.lang.Object");
|
||||
}
|
||||
createLiteral.setAccessible(true);
|
||||
|
||||
if (getJavaCompilerVersion() < 8) {
|
||||
createUnary = getMethod(TreeMaker.class, "Unary", int.class, JCExpression.class);
|
||||
} else {
|
||||
createUnary = getMethod(TreeMaker.class, "Unary", "com.sun.tools.javac.tree.JCTree$Tag", JCExpression.class.getName());
|
||||
}
|
||||
createUnary.setAccessible(true);
|
||||
|
||||
if (getJavaCompilerVersion() < 8) {
|
||||
createBinary = getMethod(TreeMaker.class, "Binary", Integer.TYPE, JCExpression.class, JCExpression.class);
|
||||
} else {
|
||||
createBinary = getMethod(TreeMaker.class, "Binary", "com.sun.tools.javac.tree.JCTree$Tag", JCExpression.class.getName(), JCExpression.class.getName());
|
||||
}
|
||||
createBinary.setAccessible(true);
|
||||
|
||||
if (getJavaCompilerVersion() < 8) {
|
||||
createThrow = getMethod(TreeMaker.class, "Throw", JCTree.class);
|
||||
} else {
|
||||
createThrow = getMethod(TreeMaker.class, "Throw", JCExpression.class);
|
||||
}
|
||||
createBinary.setAccessible(true);
|
||||
|
||||
getExtendsClause = getMethod(JCClassDecl.class, "getExtendsClause", new Class<?>[0]);
|
||||
getExtendsClause.setAccessible(true);
|
||||
|
||||
@@ -269,56 +196,6 @@ public class Javac {
|
||||
}
|
||||
}
|
||||
|
||||
public static JCExpression makeTypeIdent(TreeMaker maker, Object ctc) {
|
||||
try {
|
||||
return (JCExpression) createIdent.invoke(maker, ctc);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static JCLiteral makeLiteral(TreeMaker maker, Object ctc, Object argument) {
|
||||
try {
|
||||
return (JCLiteral) createLiteral.invoke(maker, ctc, argument);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static JCUnary makeUnary(TreeMaker maker, Object ctc, JCExpression argument) {
|
||||
try {
|
||||
return (JCUnary) createUnary.invoke(maker, ctc, argument);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static JCBinary makeBinary(TreeMaker maker, Object ctc, JCExpression lhsArgument, JCExpression rhsArgument) {
|
||||
try {
|
||||
return (JCBinary) createBinary.invoke(maker, ctc, lhsArgument, rhsArgument);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static JCStatement makeThrow(TreeMaker maker, JCExpression expression) {
|
||||
try {
|
||||
return (JCStatement) createThrow.invoke(maker, expression);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
public static JCTree getExtendsClause(JCClassDecl decl) {
|
||||
try {
|
||||
return (JCTree) getExtendsClause.invoke(decl);
|
||||
@@ -363,9 +240,9 @@ public class Javac {
|
||||
JC_NO_TYPE = c;
|
||||
}
|
||||
|
||||
public static Type createVoidType(TreeMaker maker, Object tag) {
|
||||
public static Type createVoidType(JavacTreeMaker maker, TypeTag tag) {
|
||||
if (Javac.getJavaCompilerVersion() < 8) {
|
||||
return new JCNoType(((Integer) tag).intValue());
|
||||
return new JCNoType(((Integer) tag.value).intValue());
|
||||
} else {
|
||||
try {
|
||||
if (compareCTC(tag, CTC_VOID)) {
|
||||
@@ -388,8 +265,8 @@ public class Javac {
|
||||
|
||||
@Override
|
||||
public TypeKind getKind() {
|
||||
if (Javac.compareCTC(tag, CTC_VOID)) return TypeKind.VOID;
|
||||
if (Javac.compareCTC(tag, CTC_NONE)) return TypeKind.NONE;
|
||||
if (tag == ((Integer) CTC_VOID.value).intValue()) return TypeKind.VOID;
|
||||
if (tag == ((Integer) CTC_NONE.value).intValue()) return TypeKind.NONE;
|
||||
throw new AssertionError("Unexpected tag: " + tag);
|
||||
}
|
||||
|
||||
@@ -468,30 +345,6 @@ public class Javac {
|
||||
}
|
||||
}
|
||||
|
||||
private static Method classDef;
|
||||
|
||||
public static JCClassDecl ClassDef(TreeMaker maker, JCModifiers mods, Name name, List<JCTypeParameter> typarams, JCExpression extending, List<JCExpression> implementing, List<JCTree> defs) {
|
||||
if (classDef == null) try {
|
||||
classDef = TreeMaker.class.getDeclaredMethod("ClassDef", JCModifiers.class, Name.class, List.class, JCExpression.class, List.class, List.class);
|
||||
} catch (NoSuchMethodException ignore) {}
|
||||
if (classDef == null) try {
|
||||
classDef = TreeMaker.class.getDeclaredMethod("ClassDef", JCModifiers.class, Name.class, List.class, JCTree.class, List.class, List.class);
|
||||
} catch (NoSuchMethodException ignore) {}
|
||||
|
||||
if (classDef == null) throw new IllegalStateException("Lombok bug #20130617-1310: ClassDef doesn't look like anything we thought it would look like.");
|
||||
if (!Modifier.isPublic(classDef.getModifiers()) && !classDef.isAccessible()) {
|
||||
classDef.setAccessible(true);
|
||||
}
|
||||
|
||||
try {
|
||||
return (JCClassDecl) classDef.invoke(maker, mods, name, typarams, extending, implementing, defs);
|
||||
} catch (InvocationTargetException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
} catch (IllegalAccessException e) {
|
||||
throw sneakyThrow(e.getCause());
|
||||
}
|
||||
}
|
||||
|
||||
static RuntimeException sneakyThrow(Throwable t) {
|
||||
if (t == null) throw new NullPointerException("t");
|
||||
Javac.<RuntimeException>sneakyThrow0(t);
|
||||
|
||||
@@ -0,0 +1,662 @@
|
||||
/*
|
||||
* Copyright (C) 2013 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
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
package lombok.javac;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import com.sun.tools.javac.code.Attribute;
|
||||
import com.sun.tools.javac.code.BoundKind;
|
||||
import com.sun.tools.javac.code.Symbol;
|
||||
import com.sun.tools.javac.tree.JCTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAnnotation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCArrayAccess;
|
||||
import com.sun.tools.javac.tree.JCTree.JCArrayTypeTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAssert;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAssign;
|
||||
import com.sun.tools.javac.tree.JCTree.JCAssignOp;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBinary;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBlock;
|
||||
import com.sun.tools.javac.tree.JCTree.JCBreak;
|
||||
import com.sun.tools.javac.tree.JCTree.JCCase;
|
||||
import com.sun.tools.javac.tree.JCTree.JCCatch;
|
||||
import com.sun.tools.javac.tree.JCTree.JCClassDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
|
||||
import com.sun.tools.javac.tree.JCTree.JCConditional;
|
||||
import com.sun.tools.javac.tree.JCTree.JCContinue;
|
||||
import com.sun.tools.javac.tree.JCTree.JCDoWhileLoop;
|
||||
import com.sun.tools.javac.tree.JCTree.JCEnhancedForLoop;
|
||||
import com.sun.tools.javac.tree.JCTree.JCErroneous;
|
||||
import com.sun.tools.javac.tree.JCTree.JCExpression;
|
||||
import com.sun.tools.javac.tree.JCTree.JCExpressionStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
|
||||
import com.sun.tools.javac.tree.JCTree.JCForLoop;
|
||||
import com.sun.tools.javac.tree.JCTree.JCIdent;
|
||||
import com.sun.tools.javac.tree.JCTree.JCIf;
|
||||
import com.sun.tools.javac.tree.JCTree.JCImport;
|
||||
import com.sun.tools.javac.tree.JCTree.JCInstanceOf;
|
||||
import com.sun.tools.javac.tree.JCTree.JCLabeledStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCLiteral;
|
||||
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCMethodInvocation;
|
||||
import com.sun.tools.javac.tree.JCTree.JCModifiers;
|
||||
import com.sun.tools.javac.tree.JCTree.JCNewArray;
|
||||
import com.sun.tools.javac.tree.JCTree.JCNewClass;
|
||||
import com.sun.tools.javac.tree.JCTree.JCParens;
|
||||
import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree;
|
||||
import com.sun.tools.javac.tree.JCTree.JCReturn;
|
||||
import com.sun.tools.javac.tree.JCTree.JCSkip;
|
||||
import com.sun.tools.javac.tree.JCTree.JCStatement;
|
||||
import com.sun.tools.javac.tree.JCTree.JCSwitch;
|
||||
import com.sun.tools.javac.tree.JCTree.JCSynchronized;
|
||||
import com.sun.tools.javac.tree.JCTree.JCThrow;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTry;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeApply;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeCast;
|
||||
import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCUnary;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCWhileLoop;
|
||||
import com.sun.tools.javac.tree.JCTree.JCWildcard;
|
||||
import com.sun.tools.javac.tree.JCTree.LetExpr;
|
||||
import com.sun.tools.javac.tree.JCTree.TypeBoundKind;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.util.List;
|
||||
import com.sun.tools.javac.util.Name;
|
||||
|
||||
public class JavacTreeMaker {
|
||||
private final TreeMaker tm;
|
||||
|
||||
public JavacTreeMaker(TreeMaker tm) {
|
||||
this.tm = tm;
|
||||
}
|
||||
|
||||
public JavacTreeMaker at(int pos) {
|
||||
tm.at(pos);
|
||||
return this;
|
||||
}
|
||||
|
||||
private static class MethodId<J> {
|
||||
private final String name;
|
||||
private final Class<J> returnType;
|
||||
private final Class<?>[] paramTypes;
|
||||
|
||||
MethodId(String name, Class<J> returnType, Class<?>... types) {
|
||||
this.name = name;
|
||||
this.paramTypes = types;
|
||||
this.returnType = returnType;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static Object getFieldCached(ConcurrentMap<String, Object> cache, String className, String fieldName) {
|
||||
Object value = cache.get(fieldName);
|
||||
if (value != null) return value;
|
||||
try {
|
||||
value = Class.forName(className).getField(fieldName).get(null);
|
||||
} catch (NoSuchFieldException e) {
|
||||
throw Javac.sneakyThrow(e);
|
||||
} catch (IllegalAccessException e) {
|
||||
throw Javac.sneakyThrow(e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
throw Javac.sneakyThrow(e);
|
||||
}
|
||||
|
||||
cache.putIfAbsent(fieldName, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
private static interface SchroedingerType {}
|
||||
|
||||
public static class TypeTag implements SchroedingerType {
|
||||
private static final ConcurrentMap<String, Object> TYPE_TAG_CACHE = new ConcurrentHashMap<String, Object>();
|
||||
public final Object value;
|
||||
|
||||
private TypeTag(Object value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static TypeTag typeTag(String identifier) {
|
||||
return new TypeTag(getFieldCached(TYPE_TAG_CACHE, Javac.getJavaCompilerVersion() < 8 ? "com.sun.tools.javac.code.TypeTags" : "com.sun.tools.javac.code.TypeTag", identifier));
|
||||
}
|
||||
}
|
||||
|
||||
public static class TreeTag implements SchroedingerType {
|
||||
private static final ConcurrentMap<String, Object> TREE_TAG_CACHE = new ConcurrentHashMap<String, Object>();
|
||||
public final Object value;
|
||||
|
||||
private TreeTag(Object value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public static TreeTag treeTag(String identifier) {
|
||||
return new TreeTag(getFieldCached(TREE_TAG_CACHE, Javac.getJavaCompilerVersion() < 8 ? "com.sun.tools.javac.tree.JCTree" : "com.sun.tools.javac.tree.JCTree$Tag", identifier));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new method ID based on the name of the method to invoke, the return type of that method, and the types of the parameters.
|
||||
*
|
||||
* A method matches if the return type matches, and for each parameter the following holds:
|
||||
*
|
||||
* Either (A) the type listed here is the same as, or a subtype of, the type of the method in javac's TreeMaker, or
|
||||
* (B) the type listed here is a subtype of SchroedingerType.
|
||||
*/
|
||||
static <J extends JCTree> MethodId<J> MethodId(String name, Class<J> returnType, Class<?>... types) {
|
||||
return new MethodId<J>(name, returnType, types);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new method ID based on the name of a method in this class, assuming the name of the method to invoke in TreeMaker has the same name,
|
||||
* the same return type, and the same parameters (under the same rules as the other MethodId method).
|
||||
*/
|
||||
static <J> MethodId<J> MethodId(String name) {
|
||||
for (Method m : JavacTreeMaker.class.getDeclaredMethods()) {
|
||||
if (m.getName().equals(name)) {
|
||||
@SuppressWarnings("unchecked") Class<J> r = (Class<J>) m.getReturnType();
|
||||
Class<?>[] p = m.getParameterTypes();
|
||||
return new MethodId<J>(name, r, p);
|
||||
}
|
||||
}
|
||||
|
||||
throw new InternalError("Not found: " + name);
|
||||
}
|
||||
|
||||
private static final ConcurrentHashMap<MethodId<?>, Method> METHOD_CACHE = new ConcurrentHashMap<MethodId<?>, Method>();
|
||||
private <J> J invoke(MethodId<J> m, Object... args) {
|
||||
Method method = METHOD_CACHE.get(m);
|
||||
if (method == null) method = addToCache(m);
|
||||
try {
|
||||
return m.returnType.cast(method.invoke(tm, args));
|
||||
} catch (InvocationTargetException e) {
|
||||
throw Javac.sneakyThrow(e.getCause());
|
||||
} catch (IllegalAccessException e) {
|
||||
throw Javac.sneakyThrow(e);
|
||||
}
|
||||
}
|
||||
|
||||
private static Method addToCache(MethodId<?> m) {
|
||||
Method found = null;
|
||||
|
||||
outer:
|
||||
for (Method method : TreeMaker.class.getDeclaredMethods()) {
|
||||
if (!m.name.equals(method.getName())) continue;
|
||||
Class<?>[] t = method.getParameterTypes();
|
||||
if (t.length != m.paramTypes.length) continue;
|
||||
for (int i = 0; i < t.length; i++) {
|
||||
if (Symbol.class.isAssignableFrom(t[i])) continue outer;
|
||||
if (!SchroedingerType.class.isAssignableFrom(m.paramTypes[i])) {
|
||||
if (t[i].isPrimitive()) {
|
||||
if (t[i] != m.paramTypes[i]) continue outer;
|
||||
} else {
|
||||
if (t[i].isAssignableFrom(m.paramTypes[i])) continue outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (found == null) found = method;
|
||||
else throw new IllegalStateException("Lombok TreeMaker frontend issue: multiple matches when looking for method: " + m);
|
||||
}
|
||||
if (found == null) throw new IllegalStateException("Lombok TreeMaker frontedn issue: no match when looking for method: " + m);
|
||||
found.setAccessible(true);
|
||||
Object marker = METHOD_CACHE.putIfAbsent(m, found);
|
||||
if (marker == null) return found;
|
||||
return METHOD_CACHE.get(m);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCCompilationUnit> TopLevel = MethodId("TopLevel");
|
||||
public JCCompilationUnit TopLevel(List<JCAnnotation> packageAnnotations, JCExpression pid, List<JCTree> defs) {
|
||||
return invoke(TopLevel, packageAnnotations, pid, defs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCImport> Import = MethodId("Import");
|
||||
public JCImport Import(JCTree qualid, boolean staticImport) {
|
||||
return invoke(Import, qualid, staticImport);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCClassDecl> ClassDef = MethodId("ClassDef");
|
||||
public JCClassDecl ClassDef(JCModifiers mods, Name name, List<JCTypeParameter> typarams, JCExpression extending, List<JCExpression> implementing, List<JCTree> defs) {
|
||||
return invoke(ClassDef, mods, name, typarams, extending, implementing, defs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCMethodDecl> MethodDef = MethodId("MethodDef", JCMethodDecl.class, JCModifiers.class, Name.class, JCExpression.class, List.class, List.class, List.class, JCBlock.class, JCExpression.class);
|
||||
public JCMethodDecl MethodDef(JCModifiers mods, Name name, JCExpression resType, List<JCTypeParameter> typarams, List<JCVariableDecl> params, List<JCExpression> thrown, JCBlock body, JCExpression defaultValue) {
|
||||
return invoke(MethodDef, mods, name, resType, typarams, params, thrown, body, defaultValue);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
private static final MethodId<JCMethodDecl> MethodDefWithRecvParam = MethodId("MethodDef", JCMethodDecl.class, JCModifiers.class, Name.class, JCExpression.class, List.class, JCVariableDecl.class, List.class, List.class, JCBlock.class, JCExpression.class);
|
||||
public JCMethodDecl MethodDef(JCModifiers mods, Name name, JCExpression resType, List<JCTypeParameter> typarams, JCVariableDecl recvparam, List<JCVariableDecl> params, List<JCExpression> thrown, JCBlock body, JCExpression defaultValue) {
|
||||
return invoke(MethodDefWithRecvParam, mods, name, resType, recvparam, typarams, params, thrown, body, defaultValue);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCVariableDecl> VarDef = MethodId("VarDef");
|
||||
public JCVariableDecl VarDef(JCModifiers mods, Name name, JCExpression vartype, JCExpression init) {
|
||||
return invoke(VarDef, mods, name, vartype, init);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
private static final MethodId<JCVariableDecl> ReceiverVarDef = MethodId("ReceiverVarDef");
|
||||
public JCVariableDecl ReceiverVarDef(JCModifiers mods, JCExpression name, JCExpression vartype) {
|
||||
return invoke(ReceiverVarDef, mods, name, vartype);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCSkip> Skip = MethodId("Skip");
|
||||
public JCSkip Skip() {
|
||||
return invoke(Skip);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCBlock> Block = MethodId("Block");
|
||||
public JCBlock Block(long flags, List<JCStatement> stats) {
|
||||
return invoke(Block, flags, stats);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCDoWhileLoop> DoLoop = MethodId("DoLoop");
|
||||
public JCDoWhileLoop DoLoop(JCStatement body, JCExpression cond) {
|
||||
return invoke(DoLoop, body, cond);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCWhileLoop> WhileLoop = MethodId("WhileLoop");
|
||||
public JCWhileLoop WhileLoop(JCExpression cond, JCStatement body) {
|
||||
return invoke(WhileLoop, cond, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCForLoop> ForLoop = MethodId("ForLoop");
|
||||
public JCForLoop ForLoop(List<JCStatement> init, JCExpression cond, List<JCExpressionStatement> step, JCStatement body) {
|
||||
return invoke(ForLoop, init, cond, step, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCEnhancedForLoop> ForeachLoop = MethodId("ForeachLoop");
|
||||
public JCEnhancedForLoop ForeachLoop(JCVariableDecl var, JCExpression expr, JCStatement body) {
|
||||
return invoke(ForeachLoop, var, expr, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCLabeledStatement> Labelled = MethodId("Labelled");
|
||||
public JCLabeledStatement Labelled(Name label, JCStatement body) {
|
||||
return invoke(Labelled, label, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCSwitch> Switch = MethodId("Switch");
|
||||
public JCSwitch Switch(JCExpression selector, List<JCCase> cases) {
|
||||
return invoke(Switch, selector, cases);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCCase> Case = MethodId("Case");
|
||||
public JCCase Case(JCExpression pat, List<JCStatement> stats) {
|
||||
return invoke(Case, pat, stats);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCSynchronized> Synchronized = MethodId("Synchronized");
|
||||
public JCSynchronized Synchronized(JCExpression lock, JCBlock body) {
|
||||
return invoke(Synchronized, lock, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCTry> Try = MethodId("Try", JCTry.class, JCBlock.class, List.class, JCBlock.class);
|
||||
public JCTry Try(JCBlock body, List<JCCatch> catchers, JCBlock finalizer) {
|
||||
return invoke(Try, body, catchers, finalizer);
|
||||
}
|
||||
|
||||
//javac versions: 7-8
|
||||
private static final MethodId<JCTry> TryWithResources = MethodId("Try", JCTry.class, List.class, JCBlock.class, List.class, JCBlock.class);
|
||||
public JCTry Try(List<JCTree> resources, JCBlock body, List<JCCatch> catchers, JCBlock finalizer) {
|
||||
return invoke(TryWithResources, resources, body, catchers, finalizer);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCCatch> Catch = MethodId("Catch");
|
||||
public JCCatch Catch(JCVariableDecl param, JCBlock body) {
|
||||
return invoke(Catch, param, body);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCConditional> Conditional = MethodId("Conditional");
|
||||
public JCConditional Conditional(JCExpression cond, JCExpression thenpart, JCExpression elsepart) {
|
||||
return invoke(Conditional, cond, thenpart, elsepart);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCIf> If = MethodId("If");
|
||||
public JCIf If(JCExpression cond, JCStatement thenpart, JCStatement elsepart) {
|
||||
return invoke(If, cond, thenpart, elsepart);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCExpressionStatement> Exec = MethodId("Exec");
|
||||
public JCExpressionStatement Exec(JCExpression expr) {
|
||||
return invoke(Exec, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCBreak> Break = MethodId("Break");
|
||||
public JCBreak Break(Name label) {
|
||||
return invoke(Break, label);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCContinue> Continue = MethodId("Continue");
|
||||
public JCContinue Continue(Name label) {
|
||||
return invoke(Continue, label);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCReturn> Return = MethodId("Return");
|
||||
public JCReturn Return(JCExpression expr) {
|
||||
return invoke(Return, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCThrow> Throw = MethodId("Throw");
|
||||
public JCThrow Throw(JCTree expr) {
|
||||
return invoke(Throw, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCAssert> Assert = MethodId("Assert");
|
||||
public JCAssert Assert(JCExpression cond, JCExpression detail) {
|
||||
return invoke(Assert, cond, detail);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCMethodInvocation> Apply = MethodId("Apply");
|
||||
public JCMethodInvocation Apply(List<JCExpression> typeargs, JCExpression fn, List<JCExpression> args) {
|
||||
return invoke(Apply, typeargs, fn, args);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCNewClass> NewClass = MethodId("NewClass");
|
||||
public JCNewClass NewClass(JCExpression encl, List<JCExpression> typeargs, JCExpression clazz, List<JCExpression> args, JCClassDecl def) {
|
||||
return invoke(NewClass, encl, typeargs, clazz, args, def);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCNewArray> NewArray = MethodId("NewArray");
|
||||
public JCNewArray NewArray(JCExpression elemtype, List<JCExpression> dims, List<JCExpression> elems) {
|
||||
return invoke(NewArray, elemtype, dims, elems);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
// private static final MethodId<JCLambda> Lambda = MethodId("Lambda");
|
||||
// public JCLambda Lambda(List<JCVariableDecl> params, JCTree body) {
|
||||
// return invoke(Lambda, params, body);
|
||||
// }
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCParens> Parens = MethodId("Parens");
|
||||
public JCParens Parens(JCExpression expr) {
|
||||
return invoke(Parens, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCAssign> Assign = MethodId("Assign");
|
||||
public JCAssign Assign(JCExpression lhs, JCExpression rhs) {
|
||||
return invoke(Assign, lhs, rhs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
//opcode = [6-7] int [8] JCTree.Tag
|
||||
private static final MethodId<JCAssignOp> Assignop = MethodId("Assignop");
|
||||
public JCAssignOp Assignop(TreeTag opcode, JCTree lhs, JCTree rhs) {
|
||||
return invoke(Assignop, opcode.value, lhs, rhs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
//opcode = [6-7] int [8] JCTree.Tag
|
||||
private static final MethodId<JCUnary> Unary = MethodId("Unary");
|
||||
public JCUnary Unary(TreeTag opcode, JCExpression arg) {
|
||||
return invoke(Unary, opcode.value, arg);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
//opcode = [6-7] int [8] JCTree.Tag
|
||||
private static final MethodId<JCBinary> Binary = MethodId("Binary");
|
||||
public JCBinary Binary(TreeTag opcode, JCExpression lhs, JCExpression rhs) {
|
||||
return invoke(Binary, opcode.value, lhs, rhs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCTypeCast> TypeCast = MethodId("TypeCast");
|
||||
public JCTypeCast TypeCast(JCTree expr, JCExpression type) {
|
||||
return invoke(TypeCast, expr, type);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCInstanceOf> TypeTest = MethodId("TypeTest");
|
||||
public JCInstanceOf TypeTest(JCExpression expr, JCTree clazz) {
|
||||
return invoke(TypeTest, expr, clazz);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCArrayAccess> Indexed = MethodId("Indexed");
|
||||
public JCArrayAccess Indexed(JCExpression indexed, JCExpression index) {
|
||||
return invoke(Indexed, indexed, index);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCFieldAccess> Select = MethodId("Select");
|
||||
public JCFieldAccess Select(JCExpression selected, Name selector) {
|
||||
return invoke(Select, selected, selector);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
// private static final MethodId<JCMemberReference> Reference = MethodId("Reference");
|
||||
// public JCMemberReference Reference(JCMemberReference.ReferenceMode mode, Name name, JCExpression expr, List<JCExpression> typeargs) {
|
||||
// return invoke(Reference, mode, name, expr, typeargs);
|
||||
// }
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCIdent> Ident = MethodId("Ident", JCIdent.class, Name.class);
|
||||
public JCIdent Ident(Name idname) {
|
||||
return invoke(Ident, idname);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
//tag = [6-7] int [8] TypeTag
|
||||
private static final MethodId<JCLiteral> Literal = MethodId("Literal", JCLiteral.class, TypeTag.class, Object.class);
|
||||
public JCLiteral Literal(TypeTag tag, Object value) {
|
||||
return invoke(Literal, tag.value, value);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
//typetag = [6-7] int [8] TypeTag
|
||||
private static final MethodId<JCPrimitiveTypeTree> TypeIdent = MethodId("TypeIdent");
|
||||
public JCPrimitiveTypeTree TypeIdent(TypeTag typetag) {
|
||||
return invoke(TypeIdent, typetag.value);
|
||||
}
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCArrayTypeTree> TypeArray = MethodId("TypeArray");
|
||||
public JCArrayTypeTree TypeArray(JCExpression elemtype) {
|
||||
return invoke(TypeArray, elemtype);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCTypeApply> TypeApply = MethodId("TypeApply");
|
||||
public JCTypeApply TypeApply(JCExpression clazz, List<JCExpression> arguments) {
|
||||
return invoke(TypeApply, clazz, arguments);
|
||||
}
|
||||
|
||||
//javac versions: 7-8
|
||||
// private static final MethodId<JCTypeUnion> TypeUnion = MethodId("TypeUnion");
|
||||
// public JCTypeUnion TypeUnion(List<JCExpression> components) {
|
||||
// return invoke(TypeUnion, compoonents);
|
||||
// }
|
||||
|
||||
//javac versions: 8
|
||||
// private static final MethodId<JCTypeIntersection> TypeIntersection = MethodId("TypeIntersection");
|
||||
// public JCTypeIntersection TypeIntersection(List<JCExpression> components) {
|
||||
// return invoke(TypeIntersection, components);
|
||||
// }
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCTypeParameter> TypeParameter = MethodId("TypeParameter", JCTypeParameter.class, Name.class, List.class);
|
||||
public JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds) {
|
||||
return invoke(TypeParameter, name, bounds);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
private static final MethodId<JCTypeParameter> TypeParameterWithAnnos = MethodId("TypeParameter", JCTypeParameter.class, Name.class, List.class, List.class);
|
||||
public JCTypeParameter TypeParameter(Name name, List<JCExpression> bounds, List<JCAnnotation> annos) {
|
||||
return invoke(TypeParameterWithAnnos, name, bounds, annos);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCWildcard> Wildcard = MethodId("Wildcard");
|
||||
public JCWildcard Wildcard(TypeBoundKind kind, JCTree type) {
|
||||
return invoke(Wildcard, kind, type);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<TypeBoundKind> TypeBoundKind = MethodId("TypeBoundKind");
|
||||
public TypeBoundKind TypeBoundKind(BoundKind kind) {
|
||||
return invoke(TypeBoundKind, kind);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCAnnotation> Annotation = MethodId("Annotation", JCAnnotation.class, JCTree.class, List.class);
|
||||
public JCAnnotation Annotation(JCTree annotationType, List<JCExpression> args) {
|
||||
return invoke(Annotation, annotationType, args);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
private static final MethodId<JCAnnotation> TypeAnnotation = MethodId("TypeAnnotation", JCAnnotation.class, JCTree.class, List.class);
|
||||
public JCAnnotation TypeAnnotation(JCTree annotationType, List<JCExpression> args) {
|
||||
return invoke(TypeAnnotation, annotationType, args);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCModifiers> ModifiersWithAnnotations = MethodId("Modifiers", JCModifiers.class, long.class, List.class);
|
||||
public JCModifiers Modifiers(long flags, List<JCAnnotation> annotations) {
|
||||
return invoke(ModifiersWithAnnotations, flags, annotations);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCModifiers> Modifiers = MethodId("Modifiers", JCModifiers.class, long.class);
|
||||
public JCModifiers Modifiers(long flags) {
|
||||
return invoke(Modifiers, flags);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
// private static final MethodId<JCAnnotatedType> AnnotatedType = MethodId("AnnotatedType");
|
||||
// public JCAnnotatedType AnnotatedType(List<JCAnnotation> annotations, JCExpression underlyingType) {
|
||||
// return invoke(AnnotatedType, annotations, underlyingType);
|
||||
// }
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCErroneous> Erroneous = MethodId("Erroneous", JCErroneous.class);
|
||||
public JCErroneous Erroneous() {
|
||||
return invoke(Erroneous);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCErroneous> ErroneousWithErrs = MethodId("Erroneous", JCErroneous.class, List.class);
|
||||
public JCErroneous Erroneous(List<? extends JCTree> errs) {
|
||||
return invoke(ErroneousWithErrs, errs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<LetExpr> LetExpr = MethodId("LetExpr", LetExpr.class, List.class, JCTree.class);
|
||||
public LetExpr LetExpr(List<JCVariableDecl> defs, JCTree expr) {
|
||||
return invoke(LetExpr, defs, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCClassDecl> AnonymousClassDef = MethodId("AnonymousClassDef");
|
||||
public JCClassDecl AnonymousClassDef(JCModifiers mods, List<JCTree> defs) {
|
||||
return invoke(AnonymousClassDef, mods, defs);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<LetExpr> LetExprSingle = MethodId("LetExpr", LetExpr.class, JCVariableDecl.class, JCTree.class);
|
||||
public LetExpr LetExpr(JCVariableDecl def, JCTree expr) {
|
||||
return invoke(LetExprSingle, def, expr);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCIdent> IdentVarDecl = MethodId("Ident", JCIdent.class, JCVariableDecl.class);
|
||||
public JCExpression Ident(JCVariableDecl param) {
|
||||
return invoke(IdentVarDecl, param);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<List<JCExpression>> Idents = MethodId("Idents");
|
||||
public List<JCExpression> Idents(List<JCVariableDecl> params) {
|
||||
return invoke(Idents, params);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCMethodInvocation> App2 = MethodId("App", JCMethodInvocation.class, JCExpression.class, List.class);
|
||||
public JCMethodInvocation App(JCExpression meth, List<JCExpression> args) {
|
||||
return invoke(App2, meth, args);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCMethodInvocation> App1 = MethodId("App", JCMethodInvocation.class, JCExpression.class);
|
||||
public JCMethodInvocation App(JCExpression meth) {
|
||||
return invoke(App1, meth);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<List<JCAnnotation>> Annotations = MethodId("Annotations");
|
||||
public List<JCAnnotation> Annotations(List<Attribute.Compound> attributes) {
|
||||
return invoke(Annotations, attributes);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCLiteral> LiteralWithValue = MethodId("Literal", JCLiteral.class, Object.class);
|
||||
public JCLiteral Literal(Object value) {
|
||||
return invoke(LiteralWithValue, value);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCAnnotation> AnnotationWithAttributeOnly = MethodId("Annotation", JCAnnotation.class, Attribute.class);
|
||||
public JCAnnotation Annotation(Attribute a) {
|
||||
return invoke(AnnotationWithAttributeOnly, a);
|
||||
}
|
||||
|
||||
//javac versions: 8
|
||||
private static final MethodId<JCAnnotation> TypeAnnotationWithAttributeOnly = MethodId("TypeAnnotation", JCAnnotation.class, Attribute.class);
|
||||
public JCAnnotation TypeAnnotation(Attribute a) {
|
||||
return invoke(TypeAnnotationWithAttributeOnly, a);
|
||||
}
|
||||
|
||||
//javac versions: 6-8
|
||||
private static final MethodId<JCStatement> Call = MethodId("Call");
|
||||
public JCStatement Call(JCExpression apply) {
|
||||
return invoke(Call, apply);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user