package org.textmapper.lapg.ui.structure;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.textmapper.lapg.api.Grammar;
import org.textmapper.lapg.common.ui.editor.ISourceStructure;
import org.textmapper.lapg.common.ui.editor.colorer.ISemanticHighlighter;
import org.textmapper.lapg.ui.LapgUIActivator;
import org.textmapper.tool.parser.TMTree;
import org.textmapper.tool.parser.TMTree.TMProblem;
import org.textmapper.tool.parser.ast.TmaVisitor;
import org.textmapper.tool.parser.ast.TmaInput;
public class LapgSourceStructure implements ISourceStructure {
private final IFile file; // can be null
private final TMTree<TmaInput> ast;
private final Grammar grammar;
public LapgSourceStructure(Grammar grammar, TMTree<TmaInput> ast, IFile file) {
this.grammar = grammar;
this.ast = ast;
this.file = file;
}
public IFile getFile() {
return file;
}
public TMTree<TmaInput> getAst() {
return ast;
}
public Grammar getGrammar() {
return grammar;
}
public List<TMProblem> getProblems() {
return ast.getErrors();
}
public IStatus getStatus() {
List<IStatus> errors = new ArrayList<IStatus>(ast.getErrors().size());
for (TMProblem p : ast.getErrors()) {
switch (p.getKind()) {
case TMTree.KIND_FATAL:
case TMTree.KIND_ERROR:
errors.add(new Status(IStatus.ERROR, LapgUIActivator.PLUGIN_ID, 0, p.getMessage(), null));
break;
}
}
if (errors.size() > 0) {
return new MultiStatus(LapgUIActivator.PLUGIN_ID, 0, errors.toArray(new IStatus[errors.size()]),
"Problems in text", null);
}
return Status.OK_STATUS;
}
public boolean hasAst() {
return getAst().getRoot() != null;
}
public void accept(ISemanticHighlighter fHighlighter) {
getAst().getRoot().accept((TmaVisitor) fHighlighter);
}
}