package org.simantics.scl.compiler.completions.parsing; import java.io.Reader; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.simantics.scl.compiler.compilation.CompilationContext; import org.simantics.scl.compiler.compilation.DeclarationClassification; import org.simantics.scl.compiler.internal.parsing.declarations.DeclarationAst; import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl; import org.simantics.scl.compiler.internal.parsing.parser.SCLParserOptions; public class RobustModuleParser { private static List parseSegment(CompilationContext context, AtomicBoolean firstToken, Reader reader) { SCLParserImpl parser = new SCLParserImpl(reader); parser.getLexer().isFirstToken = firstToken.get(); parser.setCompilationContext(context); parser.setParserOptions(SCLParserOptions.MODULE_DEFAULT); List result = (List)parser.parseModule(); firstToken.set(parser.getLexer().isFirstToken); return result; } public static DeclarationClassification parse(CompilationContext context, String sourceText) { DeclarationClassification declarations = new DeclarationClassification(context); AtomicBoolean firstToken = new AtomicBoolean(false); for(ModuleSegment segment : RobustModuleSplitter.split(sourceText)) { //System.out.println("----------------------------------------------------------"); //System.out.println(sourceText.substring(segment.begin, segment.end)); if(segment.hasErrors) { System.out.println(" has errors"); // TODO we could try some special parsing here } else { Reader reader = new SubstringReader(sourceText, segment.begin, segment.end); try { for(DeclarationAst declaration : parseSegment(context, firstToken, reader)) declarations.handle(declaration); } catch(Exception e) { // This is normal //e.printStackTrace(System.out); } } } return declarations; } }