Search in sources :

Example 36 with JCTree

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

the class JavacAST method buildTry.

private JavacNode buildTry(JCTry tryNode) {
    if (setAndGetAsHandled(tryNode))
        return null;
    List<JavacNode> childNodes = new ArrayList<JavacNode>();
    for (JCTree varDecl : getResourcesForTryNode(tryNode)) {
        if (varDecl instanceof JCVariableDecl) {
            addIfNotNull(childNodes, buildLocalVar((JCVariableDecl) varDecl, Kind.LOCAL));
        }
    }
    addIfNotNull(childNodes, buildStatement(tryNode.body));
    for (JCCatch jcc : tryNode.catchers) addIfNotNull(childNodes, buildTree(jcc, Kind.STATEMENT));
    addIfNotNull(childNodes, buildStatement(tryNode.finalizer));
    return putInMap(new JavacNode(this, tryNode, childNodes, Kind.STATEMENT));
}
Also used : ArrayList(java.util.ArrayList) JCTree(com.sun.tools.javac.tree.JCTree) JCCatch(com.sun.tools.javac.tree.JCTree.JCCatch) JCVariableDecl(com.sun.tools.javac.tree.JCTree.JCVariableDecl)

Example 37 with JCTree

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

the class JavacImportList method applyNameToStarImports.

@Override
public Collection<String> applyNameToStarImports(String startsWith, String name) {
    ArrayList<String> out = new ArrayList<String>();
    if (pkgStr != null && topLevelName(pkgStr).equals(startsWith))
        out.add(pkgStr + "." + name);
    for (JCTree def : defs) {
        if (!(def instanceof JCImport))
            continue;
        if (((JCImport) def).staticImport)
            continue;
        JCTree qual = ((JCImport) def).qualid;
        if (!(qual instanceof JCFieldAccess))
            continue;
        String simpleName = ((JCFieldAccess) qual).name.toString();
        if (!"*".equals(simpleName))
            continue;
        String topLevelName = topLevelName(qual);
        if (topLevelName.equals(startsWith)) {
            out.add(((JCFieldAccess) qual).selected.toString() + "." + name);
        }
    }
    return out;
}
Also used : JCImport(com.sun.tools.javac.tree.JCTree.JCImport) JCFieldAccess(com.sun.tools.javac.tree.JCTree.JCFieldAccess) ArrayList(java.util.ArrayList) JCTree(com.sun.tools.javac.tree.JCTree)

Example 38 with JCTree

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

the class JavacResolution method resolveMethodMember.

public Map<JCTree, JCTree> resolveMethodMember(JavacNode node) {
    ArrayDeque<JCTree> stack = new ArrayDeque<JCTree>();
    {
        JavacNode n = node;
        while (n != null) {
            stack.push(n.get());
            n = n.up();
        }
    }
    messageSuppressor.disableLoggers();
    try {
        EnvFinder finder = new EnvFinder(node.getContext());
        while (!stack.isEmpty()) stack.pop().accept(finder);
        TreeMirrorMaker mirrorMaker = new TreeMirrorMaker(node.getTreeMaker(), node.getContext());
        JCTree copy = mirrorMaker.copy(finder.copyAt());
        memberEnterAndAttribute(copy, finder.get(), node.getContext());
        return mirrorMaker.getOriginalToCopyMap();
    } finally {
        messageSuppressor.enableLoggers();
    }
}
Also used : JCTree(com.sun.tools.javac.tree.JCTree) ArrayDeque(java.util.ArrayDeque)

Example 39 with JCTree

use of com.sun.tools.javac.tree.JCTree in project ceylon-compiler by ceylon.

the class Lower method visitEnumDef.

/** Translate an enum class. */
private void visitEnumDef(JCClassDecl tree) {
    make_at(tree.pos());
    // add the supertype, if needed
    if (tree.extending == null)
        tree.extending = make.Type(types.supertype(tree.type));
    // classOfType adds a cache field to tree.defs unless
    // target.hasClassLiterals().
    JCExpression e_class = classOfType(tree.sym.type, tree.pos()).setType(types.erasure(syms.classType));
    // process each enumeration constant, adding implicit constructor parameters
    int nextOrdinal = 0;
    ListBuffer<JCExpression> values = new ListBuffer<JCExpression>();
    ListBuffer<JCTree> enumDefs = new ListBuffer<JCTree>();
    ListBuffer<JCTree> otherDefs = new ListBuffer<JCTree>();
    for (List<JCTree> defs = tree.defs; defs.nonEmpty(); defs = defs.tail) {
        if (defs.head.getTag() == JCTree.VARDEF && (((JCVariableDecl) defs.head).mods.flags & ENUM) != 0) {
            JCVariableDecl var = (JCVariableDecl) defs.head;
            visitEnumConstantDef(var, nextOrdinal++);
            values.append(make.QualIdent(var.sym));
            enumDefs.append(var);
        } else {
            otherDefs.append(defs.head);
        }
    }
    // private static final T[] #VALUES = { a, b, c };
    Name valuesName = names.fromString(target.syntheticNameChar() + "VALUES");
    while (// avoid name clash
    tree.sym.members().lookup(valuesName).scope != null) valuesName = names.fromString(valuesName + "" + target.syntheticNameChar());
    Type arrayType = new ArrayType(types.erasure(tree.type), syms.arrayClass);
    VarSymbol valuesVar = new VarSymbol(PRIVATE | FINAL | STATIC | SYNTHETIC, valuesName, arrayType, tree.type.tsym);
    JCNewArray newArray = make.NewArray(make.Type(types.erasure(tree.type)), List.<JCExpression>nil(), values.toList());
    newArray.type = arrayType;
    enumDefs.append(make.VarDef(valuesVar, newArray));
    tree.sym.members().enter(valuesVar);
    Symbol valuesSym = lookupMethod(tree.pos(), names.values, tree.type, List.<Type>nil());
    List<JCStatement> valuesBody;
    if (useClone()) {
        // return (T[]) $VALUES.clone();
        JCTypeCast valuesResult = make.TypeCast(valuesSym.type.getReturnType(), make.App(make.Select(make.Ident(valuesVar), syms.arrayCloneMethod)));
        valuesBody = List.<JCStatement>of(make.Return(valuesResult));
    } else {
        // template: T[] $result = new T[$values.length];
        Name resultName = names.fromString(target.syntheticNameChar() + "result");
        while (// avoid name clash
        tree.sym.members().lookup(resultName).scope != null) resultName = names.fromString(resultName + "" + target.syntheticNameChar());
        VarSymbol resultVar = new VarSymbol(FINAL | SYNTHETIC, resultName, arrayType, valuesSym);
        JCNewArray resultArray = make.NewArray(make.Type(types.erasure(tree.type)), List.of(make.Select(make.Ident(valuesVar), syms.lengthVar)), null);
        resultArray.type = arrayType;
        JCVariableDecl decl = make.VarDef(resultVar, resultArray);
        // template: System.arraycopy($VALUES, 0, $result, 0, $VALUES.length);
        if (systemArraycopyMethod == null) {
            systemArraycopyMethod = new MethodSymbol(PUBLIC | STATIC, names.fromString("arraycopy"), new MethodType(List.<Type>of(syms.objectType, syms.intType, syms.objectType, syms.intType, syms.intType), syms.voidType, List.<Type>nil(), syms.methodClass), syms.systemType.tsym);
        }
        JCStatement copy = make.Exec(make.App(make.Select(make.Ident(syms.systemType.tsym), systemArraycopyMethod), List.of(make.Ident(valuesVar), make.Literal(0), make.Ident(resultVar), make.Literal(0), make.Select(make.Ident(valuesVar), syms.lengthVar))));
        // template: return $result;
        JCStatement ret = make.Return(make.Ident(resultVar));
        valuesBody = List.<JCStatement>of(decl, copy, ret);
    }
    JCMethodDecl valuesDef = make.MethodDef((MethodSymbol) valuesSym, make.Block(0, valuesBody));
    enumDefs.append(valuesDef);
    if (debugLower)
        System.err.println(tree.sym + ".valuesDef = " + valuesDef);
    /** The template for the following code is:
         *
         *     public static E valueOf(String name) {
         *         return (E)Enum.valueOf(E.class, name);
         *     }
         *
         *  where E is tree.sym
         */
    MethodSymbol valueOfSym = lookupMethod(tree.pos(), names.valueOf, tree.sym.type, List.of(syms.stringType));
    Assert.check((valueOfSym.flags() & STATIC) != 0);
    VarSymbol nameArgSym = valueOfSym.params.head;
    JCIdent nameVal = make.Ident(nameArgSym);
    JCStatement enum_ValueOf = make.Return(make.TypeCast(tree.sym.type, makeCall(make.Ident(syms.enumSym), names.valueOf, List.of(e_class, nameVal))));
    JCMethodDecl valueOf = make.MethodDef(valueOfSym, make.Block(0, List.of(enum_ValueOf)));
    nameVal.sym = valueOf.params.head.sym;
    if (debugLower)
        System.err.println(tree.sym + ".valueOf = " + valueOf);
    enumDefs.append(valueOf);
    enumDefs.appendList(otherDefs.toList());
    tree.defs = enumDefs.toList();
    // Add the necessary members for the EnumCompatibleMode
    if (target.compilerBootstrap(tree.sym)) {
        addEnumCompatibleMembers(tree);
    }
}
Also used : Symbol(com.sun.tools.javac.code.Symbol) JCTree(com.sun.tools.javac.tree.JCTree) Type(com.sun.tools.javac.code.Type)

Example 40 with JCTree

use of com.sun.tools.javac.tree.JCTree in project ceylon-compiler by ceylon.

the class Lower method visitClassDef.

public void visitClassDef(JCClassDecl tree) {
    ClassSymbol currentClassPrev = currentClass;
    MethodSymbol currentMethodSymPrev = currentMethodSym;
    currentClass = tree.sym;
    currentMethodSym = null;
    classdefs.put(currentClass, tree);
    proxies = proxies.dup(currentClass);
    List<VarSymbol> prevOuterThisStack = outerThisStack;
    // If this is an enum definition
    if ((tree.mods.flags & ENUM) != 0 && (types.supertype(currentClass.type).tsym.flags() & ENUM) == 0)
        visitEnumDef(tree);
    // If this is a nested class, define a this$n field for
    // it and add to proxies.
    JCVariableDecl otdef = null;
    if (currentClass.hasOuterInstance())
        otdef = outerThisDef(tree.pos, currentClass);
    // If this is a local class, define proxies for all its free variables.
    List<JCVariableDecl> fvdefs = freevarDefs(tree.pos, freevars(currentClass), currentClass);
    // Recursively translate superclass, interfaces.
    tree.extending = translate(tree.extending);
    tree.implementing = translate(tree.implementing);
    // Recursively translate members, taking into account that new members
    // might be created during the translation and prepended to the member
    // list `tree.defs'.
    List<JCTree> seen = List.nil();
    while (tree.defs != seen) {
        List<JCTree> unseen = tree.defs;
        for (List<JCTree> l = unseen; l.nonEmpty() && l != seen; l = l.tail) {
            JCTree outermostMemberDefPrev = outermostMemberDef;
            if (outermostMemberDefPrev == null)
                outermostMemberDef = l.head;
            l.head = translate(l.head);
            outermostMemberDef = outermostMemberDefPrev;
        }
        seen = unseen;
    }
    // Convert a protected modifier to public, mask static modifier.
    if ((tree.mods.flags & PROTECTED) != 0)
        tree.mods.flags |= PUBLIC;
    tree.mods.flags &= ClassFlags;
    // Convert name to flat representation, replacing '.' by '$'.
    tree.name = Convert.shortName(currentClass.flatName());
    // Add this$n and free variables proxy definitions to class.
    for (List<JCVariableDecl> l = fvdefs; l.nonEmpty(); l = l.tail) {
        tree.defs = tree.defs.prepend(l.head);
        enterSynthetic(tree.pos(), l.head.sym, currentClass.members());
    }
    if (currentClass.hasOuterInstance()) {
        tree.defs = tree.defs.prepend(otdef);
        enterSynthetic(tree.pos(), otdef.sym, currentClass.members());
    }
    proxies = proxies.leave();
    outerThisStack = prevOuterThisStack;
    // Append translated tree to `translated' queue.
    translated.append(tree);
    currentClass = currentClassPrev;
    currentMethodSym = currentMethodSymPrev;
    // Return empty block {} as a placeholder for an inner class.
    result = make_at(tree.pos()).Block(0, List.<JCStatement>nil());
}
Also used : JCTree(com.sun.tools.javac.tree.JCTree)

Aggregations

JCTree (com.sun.tools.javac.tree.JCTree)183 JCExpression (com.sun.tools.javac.tree.JCTree.JCExpression)28 Symbol (com.sun.tools.javac.code.Symbol)22 JCVariableDecl (com.sun.tools.javac.tree.JCTree.JCVariableDecl)22 Type (com.sun.tools.javac.code.Type)19 Tree (com.redhat.ceylon.compiler.typechecker.tree.Tree)17 Tree (com.sun.source.tree.Tree)15 ExpressionTree (com.sun.source.tree.ExpressionTree)14 JCFieldAccess (com.sun.tools.javac.tree.JCTree.JCFieldAccess)14 SuggestedFix (com.google.errorprone.fixes.SuggestedFix)11 JCClassDecl (com.sun.tools.javac.tree.JCTree.JCClassDecl)11 JCStatement (com.sun.tools.javac.tree.JCTree.JCStatement)10 ArrayList (java.util.ArrayList)10 MethodInvocationTree (com.sun.source.tree.MethodInvocationTree)9 JCMethodDecl (com.sun.tools.javac.tree.JCTree.JCMethodDecl)9 JCNewClass (com.sun.tools.javac.tree.JCTree.JCNewClass)8 ListBuffer (com.sun.tools.javac.util.ListBuffer)8 Type (com.redhat.ceylon.model.typechecker.model.Type)7 ClassTree (com.sun.source.tree.ClassTree)7 MemberSelectTree (com.sun.source.tree.MemberSelectTree)7