Search in sources :

Example 76 with JCVariableDecl

use of com.sun.tools.javac.tree.JCTree.JCVariableDecl in project lombok by rzwitserloot.

the class PrettyPrinter method visitForLoop.

@Override
public void visitForLoop(JCForLoop tree) {
    aPrint("for (");
    if (tree.init.nonEmpty()) {
        // ForInit is either a StatementExpressionList or a LocalVariableDeclaration
        if (tree.init.head instanceof JCVariableDecl) {
            boolean first = true;
            int dims = 0;
            for (JCStatement i : tree.init) {
                JCVariableDecl vd = (JCVariableDecl) i;
                if (first) {
                    printVarDefInline(vd);
                    dims = dims(vd.vartype);
                } else {
                    print(", ");
                    print(vd.name);
                    int dimDiff = dims(vd.vartype) - dims;
                    for (int j = 0; j < dimDiff; j++) print("[]");
                    if (vd.init != null) {
                        print(" = ");
                        print(vd.init);
                    }
                }
                first = false;
            }
        } else {
            boolean first = true;
            for (JCStatement exprStatement : tree.init) {
                if (!first)
                    print(", ");
                first = false;
                print(((JCExpressionStatement) exprStatement).expr);
            }
        }
    }
    print("; ");
    if (tree.cond != null)
        print(tree.cond);
    print("; ");
    boolean first = true;
    for (JCExpressionStatement exprStatement : tree.step) {
        if (!first)
            print(", ");
        first = false;
        print(exprStatement.expr);
    }
    print(") ");
    print(tree.body);
}
Also used : JCStatement(com.sun.tools.javac.tree.JCTree.JCStatement) JCExpressionStatement(com.sun.tools.javac.tree.JCTree.JCExpressionStatement) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl)

Example 77 with JCVariableDecl

use of com.sun.tools.javac.tree.JCTree.JCVariableDecl in project lombok by rzwitserloot.

the class JavacHandlerUtil method generateNullCheck.

/**
	 * Generates a new statement that checks if the given variable is null, and if so, throws a specified exception with the
	 * variable name as message.
	 * 
	 * @param exName The name of the exception to throw; normally {@code java.lang.NullPointerException}.
	 */
public static JCStatement generateNullCheck(JavacTreeMaker maker, JavacNode variable, JavacNode source) {
    NullCheckExceptionType exceptionType = source.getAst().readConfiguration(ConfigurationKeys.NON_NULL_EXCEPTION_TYPE);
    if (exceptionType == null)
        exceptionType = NullCheckExceptionType.NULL_POINTER_EXCEPTION;
    JCVariableDecl varDecl = (JCVariableDecl) variable.get();
    if (isPrimitive(varDecl.vartype))
        return null;
    Name fieldName = varDecl.name;
    JCExpression exType = genTypeRef(variable, exceptionType.getExceptionType());
    JCExpression exception = maker.NewClass(null, List.<JCExpression>nil(), exType, List.<JCExpression>of(maker.Literal(exceptionType.toExceptionMessage(fieldName.toString()))), null);
    JCStatement throwStatement = maker.Throw(exception);
    JCBlock throwBlock = maker.Block(0, List.of(throwStatement));
    return maker.If(maker.Binary(CTC_EQUAL, maker.Ident(fieldName), maker.Literal(CTC_BOT, null)), throwBlock, null);
}
Also used : JCBlock(com.sun.tools.javac.tree.JCTree.JCBlock) JCExpression(com.sun.tools.javac.tree.JCTree.JCExpression) NullCheckExceptionType(lombok.core.configuration.NullCheckExceptionType) JCStatement(com.sun.tools.javac.tree.JCTree.JCStatement) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl) Name(com.sun.tools.javac.util.Name)

Example 78 with JCVariableDecl

use of com.sun.tools.javac.tree.JCTree.JCVariableDecl in project lombok by rzwitserloot.

the class JavacNode method traverse.

/**
	 * Visits this node and all child nodes depth-first, calling the provided visitor's visit methods.
	 */
public void traverse(JavacASTVisitor visitor) {
    switch(this.getKind()) {
        case COMPILATION_UNIT:
            visitor.visitCompilationUnit(this, (JCCompilationUnit) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitCompilationUnit(this, (JCCompilationUnit) get());
            break;
        case TYPE:
            visitor.visitType(this, (JCClassDecl) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitType(this, (JCClassDecl) get());
            break;
        case FIELD:
            visitor.visitField(this, (JCVariableDecl) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitField(this, (JCVariableDecl) get());
            break;
        case METHOD:
            visitor.visitMethod(this, (JCMethodDecl) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitMethod(this, (JCMethodDecl) get());
            break;
        case INITIALIZER:
            visitor.visitInitializer(this, (JCBlock) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitInitializer(this, (JCBlock) get());
            break;
        case ARGUMENT:
            JCMethodDecl parentMethod = (JCMethodDecl) up().get();
            visitor.visitMethodArgument(this, (JCVariableDecl) get(), parentMethod);
            ast.traverseChildren(visitor, this);
            visitor.endVisitMethodArgument(this, (JCVariableDecl) get(), parentMethod);
            break;
        case LOCAL:
            visitor.visitLocal(this, (JCVariableDecl) get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitLocal(this, (JCVariableDecl) get());
            break;
        case STATEMENT:
            visitor.visitStatement(this, get());
            ast.traverseChildren(visitor, this);
            visitor.endVisitStatement(this, get());
            break;
        case ANNOTATION:
            switch(up().getKind()) {
                case TYPE:
                    visitor.visitAnnotationOnType((JCClassDecl) up().get(), this, (JCAnnotation) get());
                    break;
                case FIELD:
                    visitor.visitAnnotationOnField((JCVariableDecl) up().get(), this, (JCAnnotation) get());
                    break;
                case METHOD:
                    visitor.visitAnnotationOnMethod((JCMethodDecl) up().get(), this, (JCAnnotation) get());
                    break;
                case ARGUMENT:
                    JCVariableDecl argument = (JCVariableDecl) up().get();
                    JCMethodDecl method = (JCMethodDecl) up().up().get();
                    visitor.visitAnnotationOnMethodArgument(argument, method, this, (JCAnnotation) get());
                    break;
                case LOCAL:
                    visitor.visitAnnotationOnLocal((JCVariableDecl) up().get(), this, (JCAnnotation) get());
                    break;
                default:
                    throw new AssertionError("Annotion not expected as child of a " + up().getKind());
            }
            break;
        default:
            throw new AssertionError("Unexpected kind during node traversal: " + getKind());
    }
}
Also used : JCMethodDecl(com.sun.tools.javac.tree.JCTree.JCMethodDecl) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl)

Example 79 with JCVariableDecl

use of com.sun.tools.javac.tree.JCTree.JCVariableDecl in project lombok by rzwitserloot.

the class HandleUtilityClass method changeModifiersAndGenerateConstructor.

private void changeModifiersAndGenerateConstructor(JavacNode typeNode, JavacNode errorNode) {
    JCClassDecl classDecl = (JCClassDecl) typeNode.get();
    boolean makeConstructor = true;
    classDecl.mods.flags |= Flags.FINAL;
    boolean markStatic = true;
    if (typeNode.up().getKind() == Kind.COMPILATION_UNIT)
        markStatic = false;
    if (markStatic && typeNode.up().getKind() == Kind.TYPE) {
        JCClassDecl typeDecl = (JCClassDecl) typeNode.up().get();
        if ((typeDecl.mods.flags & Flags.INTERFACE) != 0)
            markStatic = false;
    }
    if (markStatic)
        classDecl.mods.flags |= Flags.STATIC;
    for (JavacNode element : typeNode.down()) {
        if (element.getKind() == Kind.FIELD) {
            JCVariableDecl fieldDecl = (JCVariableDecl) element.get();
            fieldDecl.mods.flags |= Flags.STATIC;
        } else if (element.getKind() == Kind.METHOD) {
            JCMethodDecl methodDecl = (JCMethodDecl) element.get();
            if (methodDecl.name.contentEquals("<init>")) {
                if (getGeneratedBy(methodDecl) == null && (methodDecl.mods.flags & Flags.GENERATEDCONSTR) == 0) {
                    element.addError("@UtilityClasses cannot have declared constructors.");
                    makeConstructor = false;
                    continue;
                }
            }
            methodDecl.mods.flags |= Flags.STATIC;
        } else if (element.getKind() == Kind.TYPE) {
            JCClassDecl innerClassDecl = (JCClassDecl) element.get();
            innerClassDecl.mods.flags |= Flags.STATIC;
        }
    }
    if (makeConstructor)
        createPrivateDefaultConstructor(typeNode);
}
Also used : JCClassDecl(com.sun.tools.javac.tree.JCTree.JCClassDecl) JCMethodDecl(com.sun.tools.javac.tree.JCTree.JCMethodDecl) JavacNode(lombok.javac.JavacNode) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl)

Example 80 with JCVariableDecl

use of com.sun.tools.javac.tree.JCTree.JCVariableDecl in project lombok by rzwitserloot.

the class HandleWither method generateWitherForType.

public void generateWitherForType(JavacNode typeNode, JavacNode errorNode, AccessLevel level, boolean checkForTypeLevelWither) {
    if (checkForTypeLevelWither) {
        if (hasAnnotation(Wither.class, typeNode)) {
            //The annotation will make it happen, so we can skip it.
            return;
        }
    }
    JCClassDecl typeDecl = null;
    if (typeNode.get() instanceof JCClassDecl)
        typeDecl = (JCClassDecl) typeNode.get();
    long modifiers = typeDecl == null ? 0 : typeDecl.mods.flags;
    boolean notAClass = (modifiers & (Flags.INTERFACE | Flags.ANNOTATION | Flags.ENUM)) != 0;
    if (typeDecl == null || notAClass) {
        errorNode.addError("@Wither is only supported on a class or a field.");
        return;
    }
    for (JavacNode field : typeNode.down()) {
        if (field.getKind() != Kind.FIELD)
            continue;
        JCVariableDecl fieldDecl = (JCVariableDecl) field.get();
        //Skip fields that start with $
        if (fieldDecl.name.toString().startsWith("$"))
            continue;
        //Skip static fields.
        if ((fieldDecl.mods.flags & Flags.STATIC) != 0)
            continue;
        //Skip final initialized fields.
        if ((fieldDecl.mods.flags & Flags.FINAL) != 0 && fieldDecl.init != null)
            continue;
        generateWitherForField(field, errorNode.get(), level);
    }
}
Also used : JCClassDecl(com.sun.tools.javac.tree.JCTree.JCClassDecl) JavacNode(lombok.javac.JavacNode) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl)

Aggregations

JCVariableDecl (com.sun.tools.javac.tree.JCTree.JCVariableDecl)98 JCExpression (com.sun.tools.javac.tree.JCTree.JCExpression)56 JCStatement (com.sun.tools.javac.tree.JCTree.JCStatement)36 JCTree (com.sun.tools.javac.tree.JCTree)31 JCMethodDecl (com.sun.tools.javac.tree.JCTree.JCMethodDecl)31 Name (com.sun.tools.javac.util.Name)31 JCBlock (com.sun.tools.javac.tree.JCTree.JCBlock)27 JavacNode (lombok.javac.JavacNode)27 ListBuffer (com.sun.tools.javac.util.ListBuffer)25 JCTypeParameter (com.sun.tools.javac.tree.JCTree.JCTypeParameter)24 JCClassDecl (com.sun.tools.javac.tree.JCTree.JCClassDecl)22 JCModifiers (com.sun.tools.javac.tree.JCTree.JCModifiers)18 JavacTreeMaker (lombok.javac.JavacTreeMaker)18 Tree (com.redhat.ceylon.compiler.typechecker.tree.Tree)13 JCAnnotation (com.sun.tools.javac.tree.JCTree.JCAnnotation)12 Type (com.redhat.ceylon.model.typechecker.model.Type)11 SyntheticName (com.redhat.ceylon.compiler.java.codegen.Naming.SyntheticName)9 JCMethodInvocation (com.sun.tools.javac.tree.JCTree.JCMethodInvocation)9 JCPrimitiveTypeTree (com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree)8 Type (com.sun.tools.javac.code.Type)7