]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / compilation / SCLCompiler.java
index 27583ea53b30e25df56ff6e3b73caf7cf1901b65..5e713f1f483c0150083ee4a19cdf7970d1f0828e 100644 (file)
@@ -1,16 +1,17 @@
 package org.simantics.scl.compiler.compilation;
 
-import java.io.IOException;
-import java.io.Reader;
+import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Map;
 
 import org.simantics.scl.compiler.environment.EnvironmentFactory;
 import org.simantics.scl.compiler.errors.ErrorLog;
-import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator;
+import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidatorFactory;
 import org.simantics.scl.compiler.internal.parsing.declarations.DeclarationAst;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
 import org.simantics.scl.compiler.internal.parsing.parser.SCLParserImpl;
+import org.simantics.scl.compiler.internal.parsing.parser.SCLParserOptions;
+import org.simantics.scl.compiler.internal.parsing.utils.LineLocators;
 import org.simantics.scl.compiler.module.ConcreteModule;
 import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;
 import org.simantics.scl.compiler.top.ModuleInitializer;
@@ -29,15 +30,21 @@ public class SCLCompiler {
     private CompilationTimer timer;
     private ModuleCompilationOptions options;
     
-    public SCLCompiler(ModuleCompilationOptions options) {
+    JavaReferenceValidatorFactory jrvFactory;
+    
+    public SCLCompiler(ModuleCompilationOptions options, JavaReferenceValidatorFactory jrvFactory) {
         this.options = options == null ? ModuleCompilationOptions.STANDARD_OPTIONS : options;
+        this.jrvFactory = jrvFactory;
     }
 
     @SuppressWarnings("unchecked")
-    public void addSource(Reader sourceReader) {
+    public void addSource(String source) {
         if(SCLCompilerConfiguration.ENABLE_TIMING) initializeTiming();
         try {
-            SCLParserImpl parser = new SCLParserImpl(sourceReader);
+            compilationContext.lineLocator = LineLocators.createLineLocator(source);
+            SCLParserImpl parser = new SCLParserImpl(new StringReader(source));
+            parser.setParserOptions(SCLParserOptions.MODULE_DEFAULT);
+            parser.setCompilationContext(compilationContext);
             if(!parser.isEmpty())
             for(DeclarationAst declaration : (ArrayList<DeclarationAst>)parser.parseModule())
                 declarations.handle(declaration);
@@ -45,42 +52,41 @@ public class SCLCompiler {
             compilationContext.errorLog.log(e.location, e.getMessage());
         } catch(Exception e) {
             compilationContext.errorLog.log(e);
-        } finally {
-            try {
-                sourceReader.close();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
         }
         if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("Parsing");
     }
     
     private boolean hasErrors() {
-        return !compilationContext.errorLog.isEmpty();
+        return !compilationContext.errorLog.hasNoErrors();
     }
     
     public void compile(
             EnvironmentFactory localEnvironmentFactory,
-            String moduleName,
-            JavaReferenceValidator<?, ?, ?, ?> javaReferenceValidator) {
+            String moduleName) {
         try {
             if(hasErrors()) return;
             Elaboration elaboration = new Elaboration(compilationContext,
                     timer,
                     localEnvironmentFactory,
                     moduleName,
+                    compilationContext.header,
                     declarations.importsAst,
-                    javaReferenceValidator,
+                    jrvFactory,
                     declarations.valueDefinitionsAst,
                     declarations.relationDefinitionsAst);
             if(options.computeCoverage)
                 elaboration.addCoverageBranchPoints();
+            if(options.collectDebugInfo)
+                elaboration.collectDebugInfo();
             // Elaboration
             if(hasErrors()) return;
+            elaboration.prepareExports();
+            if(hasErrors()) return;
             elaboration.addTypesToEnvironment(
                     declarations.dataTypesAst,
                     declarations.typeAliasesAst,
-                    declarations.effectsAst);
+                    declarations.effectsAst,
+                    declarations.rulesetsAst);
             if(hasErrors()) return;
             elaboration.processTypeAliases(declarations.typeAliasesAst);
             if(hasErrors()) return;
@@ -94,6 +100,8 @@ public class SCLCompiler {
             if(hasErrors()) return;
             elaboration.processJavaMethods(declarations.javaMethodDeclarations);
             if(hasErrors()) return;
+            elaboration.processRulesets(declarations.rulesetsAst);
+            if(hasErrors()) return;
             elaboration.addDataTypesToEnvironment();
             elaboration.addTypeClassesToEnvironment();
             elaboration.preprocessValueDefinitions(declarations.typeAnnotationsAst);
@@ -102,6 +110,7 @@ public class SCLCompiler {
             elaboration.addValueDefinitionsToEnvironment(declarations.typeAnnotationsAst);
             elaboration.processRules(declarations.rulesAst);
             elaboration.addSupplementedTypeAnnotationsToEnvironment();
+            elaboration.checkExports();
             if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("Elaboration");
             
             // Type checking
@@ -159,8 +168,11 @@ public class SCLCompiler {
                     codeGeneration.externalConstants);
             
             module.setClasses(classes);
+            module.setParentClassLoader(elaboration.javaReferenceValidator.getClassLoader());
             module.setModuleInitializer(moduleInitializer);
             module.setBranchPoints(elaboration.branchPoints);
+            if(compilationContext.errorLog.hasErrorsOrWarnings())
+                module.setWarnings(compilationContext.errorLog.getErrors());
             
             if(SCLCompilerConfiguration.ENABLE_TIMING) {
                 phaseFinished("Code generation");