]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.compiler.completions.parsing;
2
3 import java.io.Reader;
4 import java.util.List;
5 import java.util.concurrent.atomic.AtomicBoolean;
6
7 import org.simantics.scl.compiler.compilation.CompilationContext;
8 import org.simantics.scl.compiler.compilation.DeclarationClassification;
9 import org.simantics.scl.compiler.internal.parsing.declarations.DeclarationAst;
10 import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl;
11 import org.simantics.scl.compiler.internal.parsing.parser.SCLParserOptions;
12
13 public class RobustModuleParser {
14     
15     private static List<DeclarationAst> parseSegment(CompilationContext context, AtomicBoolean firstToken, Reader reader) {
16         SCLParserImpl parser = new SCLParserImpl(reader);
17         parser.getLexer().isFirstToken = firstToken.get();
18         parser.setCompilationContext(context);
19         parser.setParserOptions(SCLParserOptions.MODULE_DEFAULT);
20         List<DeclarationAst> result = (List<DeclarationAst>)parser.parseModule();
21         firstToken.set(parser.getLexer().isFirstToken);
22         return result;
23     }
24
25     public static DeclarationClassification parse(CompilationContext context, String sourceText) {
26         DeclarationClassification declarations = new DeclarationClassification(context);
27         AtomicBoolean firstToken = new AtomicBoolean(false);
28         for(ModuleSegment segment : RobustModuleSplitter.split(sourceText)) {
29             //System.out.println("----------------------------------------------------------");
30             //System.out.println(sourceText.substring(segment.begin, segment.end));
31
32             if(segment.hasErrors) {
33                 System.out.println("    has errors");
34                 // TODO we could try some special parsing here
35             }
36             else {
37                 Reader reader = new SubstringReader(sourceText, segment.begin, segment.end);
38                 try {
39                     for(DeclarationAst declaration : parseSegment(context, firstToken, reader))
40                         declarations.handle(declaration);
41                 } catch(Exception e) {
42                     // This is normal
43                     //e.printStackTrace(System.out);
44                 }
45             }
46         }
47         return declarations;
48     }
49 }