use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.ClassSymbol in project ceylon by eclipse.
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"))
loadJavaBaseExtras();
// 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;
}
}
}
}
use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.ClassSymbol in project ceylon by eclipse.
the class CeylonModelLoader method getEnclosing.
private ClassSymbol getEnclosing(ClassSymbol c) {
Symbol owner = c.owner;
org.eclipse.ceylon.langtools.tools.javac.util.List<Name> enclosing = Convert.enclosingCandidates(Convert.shortName(c.name));
if (enclosing.isEmpty())
return c;
Name name = enclosing.head;
Symbol encl = owner.members().lookup(name).sym;
if (encl == null || !(encl instanceof ClassSymbol))
encl = symtab.classes.get(TypeSymbol.formFlatName(name, owner));
if (encl != null)
return (ClassSymbol) encl;
return c;
}
use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.ClassSymbol in project ceylon by eclipse.
the class JavacClass method getEnclosingClass.
@Override
public ClassMirror getEnclosingClass() {
if (!enclosingClassSet) {
Symbol encl = classSymbol.getEnclosingElement();
if (encl != null && encl instanceof ClassSymbol) {
enclosingClass = new JavacClass((ClassSymbol) encl);
}
enclosingClassSet = true;
}
return enclosingClass;
}
use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.ClassSymbol in project ceylon by eclipse.
the class JavacClass method getEnclosingMethod.
@Override
public MethodMirror getEnclosingMethod() {
if (!enclosingMethodSet) {
Symbol encl = classSymbol.getEnclosingElement();
if (encl != null && encl instanceof MethodSymbol) {
// it's a method, it must be in a Class
ClassSymbol enclosingClass = (ClassSymbol) encl.getEnclosingElement();
JavacClass enclosingClassMirror = new JavacClass(enclosingClass);
enclosingMethod = new JavacMethod(enclosingClassMirror, (MethodSymbol) encl);
}
enclosingMethodSet = true;
}
return enclosingMethod;
}
use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.ClassSymbol in project ceylon by eclipse.
the class CeylonEnter method resetClassSymbol.
/**
* This resets a ClassSymbol recursively, for bootstrap
*/
private void resetClassSymbol(ClassSymbol classSymbol) {
// look for inner classes
if (classSymbol.members_field != null) {
for (Symbol member : classSymbol.getEnclosedElements()) {
if (member instanceof ClassSymbol) {
resetClassSymbol((ClassSymbol) member);
}
}
}
// reset its type, we need to keep it
org.eclipse.ceylon.langtools.tools.javac.code.Type.ClassType classType = (ClassType) classSymbol.type;
classType.all_interfaces_field = null;
classType.interfaces_field = null;
classType.supertype_field = null;
classType.typarams_field = null;
// make sure we give erroneous types a second chance
if (classType.getTag() == TypeTag.ERROR) {
// This is how ClassSymbol's constructor builds them, so make'em brand new
classSymbol.type = new ClassType(org.eclipse.ceylon.langtools.tools.javac.code.Type.noType, null, null);
classSymbol.type.tsym = classSymbol;
}
// reset its members and completer
classSymbol.members_field = null;
classSymbol.completer = null;
// make sure we revert the class symbol kind to a new state by removing ERR kinds
classSymbol.kind = Kinds.TYP;
classSymbol.flags_field = 0;
}
Aggregations