package org.netbeans.freemarker.parser; import java.io.Reader; import java.io.StringReader; import java.util.ArrayList; import java.util.List; import javax.swing.event.ChangeListener; import freemarker.core.FMParser; import freemarker.core.ParseException; import freemarker.template.Template; import java.io.IOException; import org.netbeans.modules.csl.api.Error; import org.netbeans.modules.csl.spi.ParserResult; import org.netbeans.modules.parsing.api.Snapshot; import org.netbeans.modules.parsing.api.Task; import org.netbeans.modules.parsing.spi.Parser; import org.netbeans.modules.parsing.spi.Parser.Result; import org.netbeans.modules.parsing.spi.SourceModificationEvent; public class FTLParser extends Parser { private Snapshot snapshot; private FMParser freemarkerParser; private final List<ParseException> errors = new ArrayList<ParseException>(); @Override public void parse (Snapshot snapshot, Task task, SourceModificationEvent event) { this.snapshot = snapshot; errors.clear(); Reader reader = new StringReader(snapshot.getText().toString()); try { Template tpl = new Template(snapshot.getSource().getFileObject().getNameExt(), reader); freemarkerParser = new FMParser(tpl, reader, false, false); freemarkerParser.Root(); } catch (ParseException ex) { errors.add(ex); //ex.printStackTrace(); } catch (IOException ex) { //ex.printStackTrace(); } } @Override public Result getResult (Task task) { return new FTLParserResult (snapshot, errors); } @Override public void addChangeListener (ChangeListener changeListener) { } @Override public void removeChangeListener (ChangeListener changeListener) { } public static class FTLParserResult extends ParserResult { private final List<ParseException> errors; private boolean valid = true; FTLParserResult (Snapshot snapshot, List<ParseException> errors) { super (snapshot); this.errors = errors; valid = errors.isEmpty(); } public List<ParseException> getErrors() { return errors; } @Override protected void invalidate() { valid = false; } @Override public List<? extends Error> getDiagnostics() { return new ArrayList<Error>(); } } }