]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/completions/parsing/RobustModuleParser.java
New SCL completion implementation
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / completions / parsing / RobustModuleParser.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/completions/parsing/RobustModuleParser.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/completions/parsing/RobustModuleParser.java
new file mode 100644 (file)
index 0000000..e9f2ffb
--- /dev/null
@@ -0,0 +1,49 @@
+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<DeclarationAst> 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<DeclarationAst> result = (List<DeclarationAst>)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;
+    }
+}