Search in sources :

Example 1 with ClassMirror

use of com.redhat.ceylon.model.loader.mirror.ClassMirror in project ceylon-compiler by ceylon.

the class CeylonModelLoader method lookupNewClassMirror.

@Override
public ClassMirror lookupNewClassMirror(Module module, String name) {
    synchronized (getLock()) {
        ClassMirror classMirror = lookupNewClassMirror(name);
        if (classMirror == null)
            return null;
        Module classMirrorModule = findModuleForClassMirror(classMirror);
        if (classMirrorModule == null) {
            logVerbose("Found a class mirror with no module");
            return null;
        }
        // make sure it's imported
        if (isImported(module, classMirrorModule)) {
            return classMirror;
        }
        logVerbose("Found a class mirror that is not imported: " + name);
        return null;
    }
}
Also used : Module(com.redhat.ceylon.model.typechecker.model.Module) ClassMirror(com.redhat.ceylon.model.loader.mirror.ClassMirror)

Example 2 with ClassMirror

use of com.redhat.ceylon.model.loader.mirror.ClassMirror in project ceylon-compiler by ceylon.

the class CeylonModelLoader method loadPackage.

@Override
public boolean loadPackage(Module module, String packageName, boolean loadDeclarations) {
    synchronized (getLock()) {
        // abort if we already loaded it, but only record that we loaded it if we want
        // to load the declarations, because merely calling complete() on the package
        // is OK
        packageName = Util.quoteJavaKeywords(packageName);
        String cacheKey = cacheKeyByModule(module, packageName);
        if (loadDeclarations) {
            if (!loadedPackages.add(cacheKey)) {
                return true;
            }
        } else {
            Boolean exists = packageExistence.get(cacheKey);
            if (exists != null)
                return exists.booleanValue();
        }
        PackageSymbol ceylonPkg = packageName.equals("") ? syms().unnamedPackage : reader.enterPackage(names.fromString(packageName));
        if (loadDeclarations) {
            logVerbose("load package " + packageName + " full");
            ceylonPkg.complete();
            /*
                 * Eventually this will go away as we get a hook from the typechecker to load on demand, but
                 * for now the typechecker requires at least ceylon.language to be loaded 
                 */
            for (Symbol m : ceylonPkg.members().getElements()) {
                // skip things that are not classes (perhaps package-info?)
                if (!(m instanceof ClassSymbol))
                    continue;
                ClassSymbol enclosingClass = getEnclosing((ClassSymbol) m);
                if (enclosingClass == m && !Util.isLoadedFromSource(enclosingClass)) {
                    m.complete();
                    // avoid anonymous and local classes
                    if (isAnonymousOrLocal((ClassSymbol) m))
                        continue;
                    // avoid member classes
                    if (((ClassSymbol) m).getNestingKind() != NestingKind.TOP_LEVEL)
                        continue;
                    // skip module and package descriptors
                    if (isModuleOrPackageDescriptorName(m.name.toString()))
                        continue;
                    ClassMirror classMirror = lookupClassMirror(module, m.getQualifiedName().toString());
                    // So ATM we just avoid it, presumably we don't support what it does anyways
                    if (classMirror != null)
                        convertToDeclaration(module, classMirror, DeclarationType.VALUE);
                }
            }
            if (module.getNameAsString().equals(JAVA_BASE_MODULE_NAME) && packageName.equals("java.lang"))
                loadJavaBaseArrays();
            // might be too late
            return ceylonPkg.members().getElements().iterator().hasNext();
        } else {
            logVerbose("load package " + packageName + " light");
            try {
                // it is cheaper to verify that we have a class file somewhere than to complete the whole package
                // just to check for its existence
                Iterable<JavaFileObject> list = fileManager.list(PLATFORM_CLASS_PATH, packageName, EnumSet.of(JavaFileObject.Kind.CLASS), false);
                if (list.iterator().hasNext()) {
                    packageExistence.put(cacheKey, Boolean.TRUE);
                    return true;
                }
                list = fileManager.list(CLASS_PATH, packageName, EnumSet.of(JavaFileObject.Kind.CLASS), false);
                if (list.iterator().hasNext()) {
                    packageExistence.put(cacheKey, Boolean.TRUE);
                    return true;
                } else {
                    packageExistence.put(cacheKey, Boolean.FALSE);
                    return false;
                }
            } catch (IOException e) {
                return false;
            }
        }
    }
}
Also used : PackageSymbol(com.sun.tools.javac.code.Symbol.PackageSymbol) JavaFileObject(javax.tools.JavaFileObject) MethodSymbol(com.sun.tools.javac.code.Symbol.MethodSymbol) ClassSymbol(com.sun.tools.javac.code.Symbol.ClassSymbol) TypeSymbol(com.sun.tools.javac.code.Symbol.TypeSymbol) Symbol(com.sun.tools.javac.code.Symbol) PackageSymbol(com.sun.tools.javac.code.Symbol.PackageSymbol) ClassSymbol(com.sun.tools.javac.code.Symbol.ClassSymbol) IOException(java.io.IOException) ClassMirror(com.redhat.ceylon.model.loader.mirror.ClassMirror)

Example 3 with ClassMirror

use of com.redhat.ceylon.model.loader.mirror.ClassMirror in project ceylon-compiler by ceylon.

the class AnnotationLoader method setPrimaryFromAnnotationInvocationAnnotation.

private void setPrimaryFromAnnotationInvocationAnnotation(AnnotationMirror annotationInvocationAnnotation, AnnotationInvocation ai) {
    TypeMirror annotationType = (TypeMirror) annotationInvocationAnnotation.getValue(AbstractModelLoader.CEYLON_ANNOTATION_INSTANTIATION_ANNOTATION_MEMBER);
    ClassMirror annotationClassMirror = annotationType.getDeclaredClass();
    Module module = modelLoader.findModuleForClassMirror(annotationClassMirror);
    if (annotationClassMirror.getAnnotation(AbstractModelLoader.CEYLON_METHOD_ANNOTATION) != null) {
        ai.setPrimary((Function) modelLoader.convertToDeclaration(module, annotationClassMirror, DeclarationType.VALUE));
    } else {
        ai.setPrimary((Class) modelLoader.convertToDeclaration(module, annotationClassMirror, DeclarationType.TYPE));
    }
}
Also used : TypeMirror(com.redhat.ceylon.model.loader.mirror.TypeMirror) Module(com.redhat.ceylon.model.typechecker.model.Module) ClassMirror(com.redhat.ceylon.model.loader.mirror.ClassMirror)

Aggregations

ClassMirror (com.redhat.ceylon.model.loader.mirror.ClassMirror)3 Module (com.redhat.ceylon.model.typechecker.model.Module)2 TypeMirror (com.redhat.ceylon.model.loader.mirror.TypeMirror)1 Symbol (com.sun.tools.javac.code.Symbol)1 ClassSymbol (com.sun.tools.javac.code.Symbol.ClassSymbol)1 MethodSymbol (com.sun.tools.javac.code.Symbol.MethodSymbol)1 PackageSymbol (com.sun.tools.javac.code.Symbol.PackageSymbol)1 TypeSymbol (com.sun.tools.javac.code.Symbol.TypeSymbol)1 IOException (java.io.IOException)1 JavaFileObject (javax.tools.JavaFileObject)1