use of org.eclipse.ceylon.langtools.tools.javac.code.Symbol.PackageSymbol 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.PackageSymbol in project ceylon by eclipse.
the class CeylonModelLoader method lookupNewClassMirror.
private ClassMirror lookupNewClassMirror(String name) {
ClassSymbol classSymbol = null;
String outerName = name;
/*
* This madness here tries to look for a class, and if it fails, tries to resolve it
* from its parent class. This is required because a.b.C.D (where D is an inner class
* of C) is not found in symtab.classes but in C's ClassSymbol.enclosedElements.
*/
// make sure we load the class file, since we no longer complete packages unless we absolutely must
loadClass(outerName);
do {
// we must first try with no postfix, because we can have a valid class foo.bar in Java,
// when in Ceylon it would be foo.bar_
classSymbol = symtab.classes.get(names.fromString(Util.quoteJavaKeywords(outerName)));
// try again with a postfix "_"
if (classSymbol == null && lastPartHasLowerInitial(outerName) && !outerName.endsWith("_")) {
classSymbol = symtab.classes.get(names.fromString(Util.quoteJavaKeywords(outerName + "_")));
}
if (classSymbol != null) {
// if we got a source symbol for something non-Java it's a slipery slope
if (Util.isLoadedFromSource(classSymbol) && !Util.isJavaSource(classSymbol))
return null;
if (outerName.length() != name.length()) {
try {
classSymbol = lookupInnerClass(classSymbol, name.substring(outerName.length() + 1).split("\\."));
} catch (CompletionFailure x) {
// something wrong, we will report it properly elsewhere
classSymbol = null;
}
}
if (classSymbol != null && classSymbol.classfile == null && classSymbol.sourcefile == null) {
// try to complete it if that changes anything
try {
classSymbol.complete();
} catch (CompletionFailure x) {
// if we can't complete it it doesn't exist, its classfile will remain null
}
if (classSymbol.classfile == null) {
PackageSymbol pkg = classSymbol.packge();
// do not log an error for missing oracle jdk stuff
if (pkg == null || !jdkProvider.isImplementationSpecificJDKPackage(pkg.getQualifiedName().toString())) {
// do not log an error because it will be logged elsewhere
logVerbose("Unable to find required class file for " + name);
}
return null;
}
}
return classSymbol != null ? new JavacClass(classSymbol) : null;
}
int lastDot = outerName.lastIndexOf(".");
if (lastDot == -1 || lastDot == 0)
return null;
outerName = outerName.substring(0, lastDot);
} while (classSymbol == null);
return null;
}
Aggregations