package x10doc;
import java.util.ArrayList;
import java.util.List;
import polyglot.frontend.AllBarrierGoal;
import polyglot.frontend.Goal;
import polyglot.frontend.Job;
import polyglot.frontend.Scheduler;
import x10.X10CompilerOptions;
import x10doc.doc.X10ClassDoc;
import x10doc.doc.X10RootDoc;
import x10doc.goals.ASTTraversalGoal;
import x10doc.visit.X10DocGenerator;
import com.sun.javadoc.ClassDoc;
import com.sun.javadoc.RootDoc;
import com.sun.tools.doclets.standard.Standard;
public class ExtensionInfo extends x10.ExtensionInfo {
public RootDoc root;
public void setRoot(RootDoc root) {
this.root = root;
}
protected X10DocOptions createOptions() {
return new X10DocOptions(this);
}
public X10DocOptions getOptions() {
return (X10DocOptions) super.getOptions();
}
@Override
protected Scheduler createScheduler() {
System.setErr(System.out);
return new X10DocScheduler(this);
}
public static class X10DocScheduler extends X10Scheduler {
public X10DocScheduler(ExtensionInfo extInfo) {
super(extInfo);
}
@Override
public ExtensionInfo extensionInfo() {
return (ExtensionInfo) this.extInfo;
}
@Override
public List<Goal> goals(Job job) {
List<Goal> goals = new ArrayList<Goal>(typecheckSourceGoals(job));
Goal endGoal = goals.remove(goals.size()-1);
goals.add(EnsureNoErrors(job));
goals.add(X10DocGenerated(job));
goals.add(endGoal);
// the barrier will handle prereqs on its own
X10DocGenerated(job).addPrereq(TypeCheckBarrier());
return goals;
}
public Goal X10DocGenerated(Job job) {
// TypeSystem ts = extInfo.typeSystem();
// NodeFactory nf = extInfo.nodeFactory();
return new ASTTraversalGoal("X10DocGenerated", job, new X10DocGenerator(job)).intern(this);
}
public Goal EndAll() {
return new AllBarrierGoal("DocletInvoked", this) {
@Override
public boolean runTask() {
// for all specified classes, add comments displaying constraints
for (ClassDoc c: X10RootDoc.getRootDoc().specifiedClasses()) {
X10ClassDoc cd = (X10ClassDoc) c;
cd.addDeclTag(cd.declString());
cd.addDeclsToMemberComments();
}
Standard.start(((X10DocScheduler) scheduler).extensionInfo().root);
return true;
}
@Override
public Goal prereqForJob(Job job) {
if (((X10DocScheduler) scheduler).commandLineJobs().contains(job))
return scheduler.End(job);
return null;
}
}.intern(this);
}
}
}