package org.sugarj.driver.declprovider; import java.util.ArrayList; import java.util.List; import org.spoofax.interpreter.terms.IStrategoTerm; import org.spoofax.jsglr.client.imploder.IToken; import org.spoofax.jsglr.client.imploder.ImploderAttachment; import org.sugarj.common.ATermCommands; /** * @author jp * @author seba */ public class TermToplevelDeclarationProvider implements ToplevelDeclarationProvider { private List<IStrategoTerm> terms; int index; private final int hash; public TermToplevelDeclarationProvider(IStrategoTerm source) { IStrategoTerm packageDecOption = ATermCommands.getApplicationSubterm(source, "CompilationUnit", 0); IStrategoTerm importDecs = ATermCommands.getApplicationSubterm(source, "CompilationUnit", 1); IStrategoTerm bodyDecs = ATermCommands.getApplicationSubterm(source, "CompilationUnit", 2); index = 0; terms = new ArrayList<IStrategoTerm>(); if (ATermCommands.isApplication(packageDecOption, "Some")) terms.add(ATermCommands.getApplicationSubterm(packageDecOption, "Some", 0)); terms.addAll(ATermCommands.getList(importDecs)); terms.addAll(ATermCommands.getList(bodyDecs)); hash = ATermCommands.atermToString(source).hashCode(); } @Override public IStrategoTerm getNextToplevelDecl(boolean recovery, boolean lookahead) { return terms.get(index++); } @Override public boolean hasNextToplevelDecl() { return index < terms.size(); } @Override public void retract(IStrategoTerm term) { if (index <= 0) throw new IllegalStateException(); if (terms.get(index - 1).equals(term)) index--; else throw new IllegalArgumentException(); } @Override public int getSourceHashCode() { return hash; } @Override public IToken getStartToken() { if (!terms.isEmpty()) return ImploderAttachment.getLeftToken(terms.get(0)); return null; } }