package com.redhat.ceylon.eclipse.util; import java.util.List; import org.antlr.runtime.ANTLRStringStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.RecognitionException; import com.redhat.ceylon.compiler.typechecker.util.NewlineFixingStringStream; import com.redhat.ceylon.compiler.typechecker.TypeChecker; import com.redhat.ceylon.model.typechecker.util.ModuleManager; import com.redhat.ceylon.compiler.typechecker.context.PhasedUnit; import com.redhat.ceylon.compiler.typechecker.io.VirtualFile; import com.redhat.ceylon.model.typechecker.model.Package; import com.redhat.ceylon.compiler.typechecker.parser.CeylonLexer; import com.redhat.ceylon.compiler.typechecker.parser.CeylonParser; import com.redhat.ceylon.compiler.typechecker.parser.LexError; import com.redhat.ceylon.compiler.typechecker.parser.ParseError; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.compiler.typechecker.tree.Tree.CompilationUnit; public abstract class CeylonSourceParser<ResultPhasedUnit extends PhasedUnit> { public final ResultPhasedUnit parseFileToPhasedUnit(final ModuleManager moduleManager, final TypeChecker typeChecker, final VirtualFile file, final VirtualFile srcDir, final Package pkg) { ANTLRStringStream input; try { input = NewlineFixingStringStream.fromStream(file.getInputStream(), getCharset()); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } CeylonLexer lexer = new CeylonLexer(input); CommonTokenStream tokenStream = new CommonTokenStream(lexer); CeylonParser parser = new CeylonParser(tokenStream); Tree.CompilationUnit cu; try { cu = parser.compilationUnit(); } catch (RecognitionException e) { throw new RuntimeException(e); } List<LexError> lexerErrors = lexer.getErrors(); for (LexError le : lexerErrors) { cu.addLexError(le); } lexerErrors.clear(); List<ParseError> parserErrors = parser.getErrors(); for (ParseError pe : parserErrors) { cu.addParseError(pe); } parserErrors.clear(); return createPhasedUnit(cu, pkg, tokenStream); } abstract protected ResultPhasedUnit createPhasedUnit(CompilationUnit cu, Package pkg, CommonTokenStream tokenStream); abstract protected String getCharset(); }