Java源码示例:org.codehaus.groovy.ast.CompileUnit

示例1
private void makeInterfaceTypes(CompileUnit cu, ClassNode classNode, Class<?> clazz) {
    Type[] interfaceTypes = clazz.getGenericInterfaces();
    if (interfaceTypes.length == 0) {
        classNode.setInterfaces(ClassNode.EMPTY_ARRAY);
    } else {
        ClassNode[] ret = new ClassNode[interfaceTypes.length];
        for (int i = 0; i < interfaceTypes.length; i++) {
            Type type = interfaceTypes[i];
            while (!(type instanceof Class)) {
                ParameterizedType pt = (ParameterizedType) type;
                Type t2 = pt.getRawType();
                if (t2==type) {
                    throw new GroovyBugError("Cannot transform generic signature of "+clazz+
                            " with generic interface "+interfaceTypes[i]+" to a class.");
                }
                type = t2;
            }
            ret[i] = makeClassNode(cu, interfaceTypes[i], (Class<?>) type);
        }
        classNode.setInterfaces(ret);
    }
}
 
示例2
protected ClassVisitor createClassVisitor() {
    CompilerConfiguration config = getConfiguration();
    int computeMaxStackAndFrames = ClassWriter.COMPUTE_MAXS;
    if (CompilerConfiguration.isPostJDK7(config.getTargetBytecode()) || config.isIndyEnabled()) {
        computeMaxStackAndFrames += ClassWriter.COMPUTE_FRAMES;
    }
    return new ClassWriter(computeMaxStackAndFrames) {
        private ClassNode getClassNode(String name) {
            // try classes under compilation
            CompileUnit cu = getAST();
            ClassNode cn = cu.getClass(name);
            if (cn != null) return cn;
            // try inner classes
            cn = cu.getGeneratedInnerClass(name);
            if (cn != null) return cn;
            ClassNodeResolver.LookupResult lookupResult = getClassNodeResolver().resolveName(name, CompilationUnit.this);
            return lookupResult == null ? null : lookupResult.getClassNode();
        }
        private ClassNode getCommonSuperClassNode(ClassNode c, ClassNode d) {
            // adapted from ClassWriter code
            if (c.isDerivedFrom(d)) return d;
            if (d.isDerivedFrom(c)) return c;
            if (c.isInterface() || d.isInterface()) return ClassHelper.OBJECT_TYPE;
            do {
                c = c.getSuperClass();
            } while (c != null && !d.isDerivedFrom(c));
            if (c == null) return ClassHelper.OBJECT_TYPE;
            return c;
        }
        @Override
        protected String getCommonSuperClass(String arg1, String arg2) {
            ClassNode a = getClassNode(arg1.replace('/', '.'));
            ClassNode b = getClassNode(arg2.replace('/', '.'));
            return getCommonSuperClassNode(a,b).getName().replace('.','/');
        }
    };
}
 
示例3
private ConstructedOuterNestedClassNode tryToConstructOuterNestedClassNodeViaStaticImport(final CompileUnit compileUnit, final ImportNode importNode, final String typeName, final BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener) {
    String importClassName = importNode.getClassName();
    ClassNode outerClassNode = compileUnit.getClass(importClassName);

    if (null == outerClassNode) return null;

    String outerNestedClassName = importClassName + "$" + typeName.replace('.', '$');
    ConstructedOuterNestedClassNode constructedOuterNestedClassNode = new ConstructedOuterNestedClassNode(outerClassNode, outerNestedClassName);
    constructedOuterNestedClassNode.addSetRedirectListener(setRedirectListener);
    return constructedOuterNestedClassNode;
}
 
示例4
private ConstructedOuterNestedClassNode tryToConstructOuterNestedClassNodeForBaseType(final CompileUnit compileUnit, final String typeName, final ClassNode cn, final BiConsumer<ConstructedOuterNestedClassNode, ClassNode> setRedirectListener) {
    if (!compileUnit.getClassesToCompile().containsValue(cn)) return null;

    String outerNestedClassName = cn.getName() + "$" + typeName;
    ConstructedOuterNestedClassNode constructedOuterNestedClassNode = new ConstructedOuterNestedClassNode(cn, outerNestedClassName);
    constructedOuterNestedClassNode.addSetRedirectListener(setRedirectListener);
    return constructedOuterNestedClassNode;
}
 
示例5
protected boolean resolveFromCompileUnit(final ClassNode type) {
    // look into the compile unit if there is a class with that name
    CompileUnit compileUnit = currentClass.getCompileUnit();
    if (compileUnit == null) return false;
    ClassNode cuClass = compileUnit.getClass(type.getName());
    if (cuClass != null) {
        if (type != cuClass) type.setRedirect(cuClass);
        return true;
    }
    return false;
}
 
示例6
protected CompileUnit getCompileUnit() {
    CompileUnit answer = classNode.getCompileUnit();
    if (answer == null) {
        answer = context.getCompileUnit();
    }
    return answer;
}
 
示例7
protected Parameter[] processParameters(CompileUnit compileUnit, Method m) {
    java.lang.reflect.Parameter[] parameters = m.getParameters();
    Type[] types = m.getGenericParameterTypes();
    Parameter[] params = Parameter.EMPTY_ARRAY;
    if (types.length > 0) {
        params = new Parameter[types.length];
        for (int i = 0; i < params.length; i++) {
            java.lang.reflect.Parameter p = parameters[i];
            String name = p.isNamePresent() ? p.getName() : "param" + i;
            params[i] = makeParameter(compileUnit, types[i], m.getParameterTypes()[i], m.getParameterAnnotations()[i], name);
        }
    }
    return params;
}
 
示例8
private ClassNode[] makeClassNodes(CompileUnit cu, Type[] types, Class<?>[] cls) {
    ClassNode[] nodes = new ClassNode[types.length];
    for (int i = 0; i < nodes.length; i++) {
        nodes[i] = makeClassNode(cu, types[i], cls[i]);
    }
    return nodes;
}
 
示例9
private ClassNode makeClassNode(CompileUnit cu, Type t, Class<?> c) {
    ClassNode back = null;
    if (cu != null) back = cu.getClass(c.getName());
    if (back == null) back = ClassHelper.make(c);
    if (!(t instanceof Class)) {
        ClassNode front = configureType(t);
        front.setRedirect(back);
        return front;
    }
    return back.getPlainNodeReference();
}
 
示例10
/**
 * Returns the CompileUnit that roots our AST.
 */
public CompileUnit getAST() {
    return this.ast;
}
 
示例11
public GeneratorContext(CompileUnit compileUnit) {
    this.compileUnit = compileUnit;
}
 
示例12
public GeneratorContext(CompileUnit compileUnit, int innerClassOffset) {
    this.compileUnit = compileUnit;
    this.innerClassIdx = innerClassOffset;
}
 
示例13
public CompileUnit getCompileUnit() {
    return compileUnit;
}
 
示例14
protected Parameter makeParameter(CompileUnit cu, Type type, Class<?> cl, Annotation[] annotations, String name) {
    ClassNode cn = makeClassNode(cu, type, cl);
    Parameter parameter = new Parameter(cn, name);
    setAnnotationMetaData(annotations, parameter);
    return parameter;
}
 
示例15
/**
 * Initializes the CompilationUnit with a CodeSource for controlling
 * security stuff, a class loader for loading classes, and a class
 * loader for loading AST transformations.
 * <p>
 * <b>Note</b>: The transform loader must be able to load compiler classes.
 * That means {@link #classLoader} must be at last a parent to {@code transformLoader}.
 * The other loader has no such constraint.
 *
 * @param transformLoader - the loader for transforms
 * @param loader          - loader used to resolve classes against during compilation
 * @param codeSource      - security setting for the compilation
 * @param configuration   - compilation configuration
 */
public CompilationUnit(final CompilerConfiguration configuration, final CodeSource codeSource,
                       final GroovyClassLoader loader, final GroovyClassLoader transformLoader) {
    super(configuration, loader, null);

    this.astTransformationsContext = new ASTTransformationsContext(this, transformLoader);
    this.ast = new CompileUnit(getClassLoader(), codeSource, getConfiguration());

    addPhaseOperations();
    applyCompilationCustomizers();
}
 
示例16
/**
 * Returns true if the two classes share the same compilation unit.
 * @param a class a
 * @param b class b
 * @return true if both classes share the same compilation unit
 */
public static boolean isSameCompilationUnit(ClassNode a, ClassNode b) {
    CompileUnit cu1 = a.getCompileUnit();
    CompileUnit cu2 = b.getCompileUnit();
    return cu1 != null && cu1 == cu2;
}
 
示例17
void configureClassNode(CompileUnit compileUnit, ClassNode classNode);