package polyglot.ext.jl; import java.io.Reader; import java.util.ArrayList; import java.util.List; import polyglot.ast.NodeFactory; import polyglot.ext.jl.ast.NodeFactory_c; import polyglot.ext.jl.parse.Grm; import polyglot.ext.jl.parse.Lexer_c; import polyglot.ext.jl.types.TypeSystem_c; import polyglot.frontend.*; import polyglot.types.*; import polyglot.util.ErrorQueue; import polyglot.util.InternalCompilerError; import polyglot.visit.*; import polyglot.main.Options; /** * This is the default <code>ExtensionInfo</code> for the Java language. * * Compilation passes and visitors: * <ol> * <li> parse </li> * <li> build-types (TypeBuilder) </li> * <hr> * <center>GLOBAL BARRIER</center> * <hr> * <li> clean-super (AmbiguityRemover) </li> * <hr> * <center>BARRIER</center> * <hr> * <li> clean-sigs (AmbiguityRemover) </li> * <li> add-members (AddMemberVisitor) </li> * <hr> * <center>BARRIER</center> * <hr> * <li> disambiguate (AmbiguityRemover) </li> * <hr> * <center>BARRIER</center> * <hr> * <li> type checking (TypeChecker) </li> * <li> reachable checking (ReachChecker) </li> * <li> exception checking (ExceptionChecker) * <li> exit checking (ExitChecker) * <li> initialization checking (InitChecker) * <li> circular constructor call checking (ConstructorCallChecker) * <hr> * <center>PRE_OUTPUT MARKER</center> * <hr> * <li> serialization (ClassSerializer), optional </li> * <li> translation (Translator) </li> * <hr> * </ol> */ public class ExtensionInfo extends polyglot.frontend.AbstractExtensionInfo { protected void initTypeSystem() { try { LoadedClassResolver lr; lr = new SourceClassResolver(compiler, this, getOptions().constructFullClasspath(), compiler.loader(), true); ts.initialize(lr, this); } catch (SemanticException e) { throw new InternalCompilerError( "Unable to initialize type system: " + e.getMessage()); } } public String defaultFileExtension() { return "jl"; } public String compilerName() { return "jlc"; } public polyglot.main.Version version() { return new Version(); } /** Create the type system for this extension. */ protected TypeSystem createTypeSystem() { return new TypeSystem_c(); } /** Create the node factory for this extension. */ protected NodeFactory createNodeFactory() { return new NodeFactory_c(); } public JobExt jobExt() { return null; } public Parser parser(Reader reader, FileSource source, ErrorQueue eq) { polyglot.lex.Lexer lexer = new Lexer_c(reader, source.name(), eq); polyglot.parse.BaseParser parser = new Grm(lexer, ts, nf, eq); return new CupParser(parser, source, eq); } public List passes(Job job) { ArrayList l = new ArrayList(15); l.add(new ParserPass(Pass.PARSE, compiler, job)); l.add(new VisitorPass(Pass.BUILD_TYPES, job, new TypeBuilder(job, ts, nf))); l.add(new GlobalBarrierPass(Pass.BUILD_TYPES_ALL, job)); l.add(new VisitorPass(Pass.CLEAN_SUPER, job, new AmbiguityRemover(job, ts, nf, AmbiguityRemover.SUPER))); l.add(new BarrierPass(Pass.CLEAN_SUPER_ALL, job)); l.add(new VisitorPass(Pass.CLEAN_SIGS, job, new AmbiguityRemover(job, ts, nf, AmbiguityRemover.SIGNATURES))); l.add(new VisitorPass(Pass.ADD_MEMBERS, job, new AddMemberVisitor(job, ts, nf))); l.add(new GlobalBarrierPass(Pass.ADD_MEMBERS_ALL, job)); l.add(new VisitorPass(Pass.DISAM, job, new AmbiguityRemover(job, ts, nf, AmbiguityRemover.ALL))); l.add(new BarrierPass(Pass.DISAM_ALL, job)); l.add(new VisitorPass(Pass.TYPE_CHECK, job, new TypeChecker(job, ts, nf))); l.add(new VisitorPass(Pass.REACH_CHECK, job, new ReachChecker(job, ts, nf))); l.add(new VisitorPass(Pass.EXC_CHECK, job, new ExceptionChecker(job, ts, nf))); l.add(new VisitorPass(Pass.EXIT_CHECK, job, new ExitChecker(job, ts, nf))); l.add(new VisitorPass(Pass.INIT_CHECK, job, new InitChecker(job, ts, nf))); l.add(new VisitorPass(Pass.CONSTRUCTOR_CHECK, job, new ConstructorCallChecker(job, ts, nf))); l.add(new VisitorPass(Pass.FWD_REF_CHECK, job, new FwdReferenceChecker(job, ts, nf))); l.add(new EmptyPass(Pass.PRE_OUTPUT_ALL)); if (compiler.serializeClassInfo()) { l.add(new VisitorPass(Pass.SERIALIZE, job, new ClassSerializer(ts, nf, job.source().lastModified(), compiler.errorQueue(), version()))); } l.add(new OutputPass(Pass.OUTPUT, job, new Translator(job, ts, nf, targetFactory()))); return l; } static { Topics t = new Topics(); } }