private JCCompilationUnit ceylonParse(JavaFileObject filename, CharSequence readSource) { if (ceylonEnter.hasRun()) throw new RuntimeException( "Trying to load new source file after CeylonEnter has been called: " + filename); try { String source = readSource.toString(); ANTLRStringStream input = new ANTLRStringStream(source); CeylonLexer lexer = new CeylonLexer(input); CommonTokenStream tokens = new CommonTokenStream(lexer); CeylonParser parser = new CeylonParser(tokens); CompilationUnit cu = parser.compilationUnit(); char[] chars = source.toCharArray(); LineMap map = Position.makeLineMap(chars, chars.length, false); java.util.List<LexError> lexerErrors = lexer.getErrors(); for (LexError le : lexerErrors) { printError(le, le.getMessage(), "ceylon.lexer", map); } java.util.List<ParseError> parserErrors = parser.getErrors(); for (ParseError pe : parserErrors) { printError(pe, pe.getMessage(), "ceylon.parser", map); } if (lexer.getNumberOfSyntaxErrors() != 0) { log.error("ceylon.lexer.failed"); } else if (parser.getNumberOfSyntaxErrors() != 0) { log.error("ceylon.parser.failed"); } else { ModuleManager moduleManager = phasedUnits.getModuleManager(); File sourceFile = new File(filename.toString()); // FIXME: temporary solution VirtualFile file = vfs.getFromFile(sourceFile); VirtualFile srcDir = vfs.getFromFile(getSrcDir(sourceFile)); // FIXME: this is bad in many ways String pkgName = getPackage(filename); // make a Package with no module yet, we will resolve them later com.redhat.ceylon.compiler.typechecker.model.Package p = modelLoader.findOrCreatePackage(null, pkgName == null ? "" : pkgName); PhasedUnit phasedUnit = new CeylonPhasedUnit(file, srcDir, cu, p, moduleManager, ceylonContext, filename, map); phasedUnits.addPhasedUnit(file, phasedUnit); gen.setMap(map); return gen.makeJCCompilationUnitPlaceholder(cu, filename, pkgName, phasedUnit); } } catch (Exception e) { log.error("ceylon", e.getMessage()); } JCCompilationUnit result = make.TopLevel(List.<JCAnnotation>nil(), null, List.<JCTree>of(make.Erroneous())); result.sourcefile = filename; return result; }
private void loadCompiledModules( List<JCCompilationUnit> trees, LinkedList<JCCompilationUnit> moduleTrees) { phasedUnits.visitModules(); Modules modules = ceylonContext.getModules(); // now make sure the phase units have their modules and packages set correctly for (PhasedUnit pu : phasedUnits.getPhasedUnits()) { Package pkg = pu.getPackage(); loadModuleFromSource(pkg, modules, moduleTrees); } // also make sure we have packages and modules set up for every Java file we compile for (JCCompilationUnit cu : trees) { // skip Ceylon CUs if (cu instanceof CeylonCompilationUnit) continue; String packageName = ""; if (cu.pid != null) packageName = TreeInfo.fullName(cu.pid).toString(); Package pkg = modelLoader.findOrCreatePackage(null, packageName); loadModuleFromSource(pkg, modules, moduleTrees); } }