From: <ipe...@us...> - 2010-05-28 20:15:01
|
Revision: 14321 http://x10.svn.sourceforge.net/x10/?rev=14321&view=rev Author: ipeshansky Date: 2010-05-28 20:14:54 +0000 (Fri, 28 May 2010) Log Message: ----------- Fix XTENLANG-1368. The parser goal no longer fails if the file does not parse - it now produces a dummy AST that allows the compilation of other files to proceed. There is a check after the first barrier (TypesInitializedForCommandLine) for errors in the queue that prevents further compilation of that file. Modified Paths: -------------- trunk/x10.compiler/src/x10/ExtensionInfo.java trunk/x10.compiler/src/x10c/ExtensionInfo.java Modified: trunk/x10.compiler/src/x10/ExtensionInfo.java =================================================================== --- trunk/x10.compiler/src/x10/ExtensionInfo.java 2010-05-28 19:28:06 UTC (rev 14320) +++ trunk/x10.compiler/src/x10/ExtensionInfo.java 2010-05-28 20:14:54 UTC (rev 14321) @@ -31,7 +31,11 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; +import polyglot.ast.ClassMember; import polyglot.ast.NodeFactory; +import polyglot.ast.SourceFile; +import polyglot.ast.TopLevelDecl; +import polyglot.ast.TypeNode; import polyglot.frontend.AbstractGoal_c; import polyglot.frontend.AllBarrierGoal; import polyglot.frontend.BarrierGoal; @@ -44,12 +48,14 @@ import polyglot.frontend.Job; import polyglot.frontend.OutputGoal; import polyglot.frontend.Parser; +import polyglot.frontend.ParserGoal; import polyglot.frontend.Scheduler; import polyglot.frontend.SourceGoal_c; import polyglot.frontend.TargetFactory; import polyglot.frontend.VisitorGoal; import polyglot.main.Options; import polyglot.main.Report; +import polyglot.types.Flags; import polyglot.types.MemberClassResolver; import polyglot.types.MethodDef; import polyglot.types.QName; @@ -350,6 +356,7 @@ goals.add(PreTypeCheck(job)); goals.add(TypesInitializedForCommandLine()); + goals.add(EnsureNoErrors(job)); goals.add(TypeChecked(job)); goals.add(ReassembleAST(job)); @@ -394,7 +401,50 @@ return goals; } + + public Goal EnsureNoErrors(Job job) { + return new SourceGoal_c("EnsureNoErrors", job) { + public boolean runTask() { + return !job.reportedErrors(); + } + }.intern(this); + } + public Goal Parsed(Job job) { + return new X10ParserGoal(extInfo.compiler(), job).intern(this); + } + + /** + * This goal never fails. Instead, if the parser does not create an AST, this + * creates a dummy AST with a single class with the expected name, and succeeds. + * The {@link #EnsureNoErrors(Job)} goal should be used to check before proceeding + * to typecheck the job. + * @author igor + */ + static class X10ParserGoal extends ParserGoal { + public X10ParserGoal(Compiler compiler, Job job) { + super(compiler, job); + } + private SourceFile createDummyAST() { + NodeFactory nf = job().extensionInfo().nodeFactory(); + String fName = job.source().name(); + Position pos = new Position(job.source().name(), fName); + String name = fName.substring(fName.lastIndexOf(File.separatorChar)+1, fName.lastIndexOf('.')); + TopLevelDecl decl = nf.ClassDecl(pos, nf.FlagsNode(pos, Flags.PUBLIC), + nf.Id(pos, name), null, Collections.<TypeNode>emptyList(), + nf.ClassBody(pos, Collections.<ClassMember>emptyList())); + SourceFile ast = nf.SourceFile(pos, Collections.singletonList(decl)).source(job.source()); + return ast; + } + public boolean runTask() { + boolean result = super.runTask(); + if (job().ast() == null) { + job().ast(createDummyAST()); + } + return true; + } + } + Goal PrintWeakCallsCount; @Override protected Goal EndAll() { @@ -477,14 +527,14 @@ // @Override // public Goal ImportTableInitialized(Job job) { -// TypeSystem ts = job.extensionInfo().typeSystem(); -// NodeFactory nf = job.extensionInfo().nodeFactory(); -// Goal g = new VisitorGoal("ImportTableInitialized", job, new X10InitImportsVisitor(job, ts, nf)); -// Goal g2 = g.intern(this); -// if (g == g2) { -// g.addPrereq(TypesInitializedForCommandLine()); -// } -// return g2; +// TypeSystem ts = job.extensionInfo().typeSystem(); +// NodeFactory nf = job.extensionInfo().nodeFactory(); +// Goal g = new VisitorGoal("ImportTableInitialized", job, new X10InitImportsVisitor(job, ts, nf)); +// Goal g2 = g.intern(this); +// if (g == g2) { +// g.addPrereq(TypesInitializedForCommandLine()); +// } +// return g2; // } public Goal LoadPlugins() { Modified: trunk/x10.compiler/src/x10c/ExtensionInfo.java =================================================================== --- trunk/x10.compiler/src/x10c/ExtensionInfo.java 2010-05-28 19:28:06 UTC (rev 14320) +++ trunk/x10.compiler/src/x10c/ExtensionInfo.java 2010-05-28 20:14:54 UTC (rev 14321) @@ -37,8 +37,10 @@ @Override public List<Goal> goals(Job job) { List<Goal> goals = super.goals(job); + CastsRemoved(job).addPrereq(Desugarer(job)); + SharedBoxed(job).addPrereq(CastsRemoved(job)); CodeGenerated(job).addPrereq(Desugarer(job)); - CodeGenerated(job).addPrereq(CastRemoved(job)); + CodeGenerated(job).addPrereq(CastsRemoved(job)); CodeGenerated(job).addPrereq(SharedBoxed(job)); return goals; } @@ -46,13 +48,13 @@ private Goal SharedBoxed(Job job) { TypeSystem ts = extInfo.typeSystem(); NodeFactory nf = extInfo.nodeFactory(); - return new VisitorGoal("sharedBoxer", job, new SharedBoxer(job, ts, nf)).intern(this); + return new VisitorGoal("SharedBoxed", job, new SharedBoxer(job, ts, nf)).intern(this); } - private Goal CastRemoved(Job job) { + private Goal CastsRemoved(Job job) { TypeSystem ts = extInfo.typeSystem(); NodeFactory nf = extInfo.nodeFactory(); - return new VisitorGoal("castRemover", job, new CastRemover(job, ts, nf)).intern(this); + return new VisitorGoal("CastsRemoved", job, new CastRemover(job, ts, nf)).intern(this); } @Override This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |