]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/TextualModuleSource.java
SCL compiler generates line numbers to bytecode
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / source / TextualModuleSource.java
index 9df29e95815e7b892fdbc6ebfd91b6a5d1de2a09..7d0e5335281684aac58ea296d1f51bf71875576c 100644 (file)
@@ -2,6 +2,7 @@ package org.simantics.scl.compiler.source;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.StringReader;
 import java.util.Arrays;
 
 import org.simantics.scl.compiler.compilation.SCLCompiler;
@@ -11,14 +12,19 @@ import org.simantics.scl.compiler.errors.Failable;
 import org.simantics.scl.compiler.errors.Failure;
 import org.simantics.scl.compiler.errors.Success;
 import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidator;
+import org.simantics.scl.compiler.internal.codegen.types.JavaReferenceValidatorFactory;
 import org.simantics.scl.compiler.internal.codegen.types.RuntimeJavaReferenceValidator;
 import org.simantics.scl.compiler.module.ImportDeclaration;
 import org.simantics.scl.compiler.module.Module;
 import org.simantics.scl.compiler.module.options.ModuleCompilationOptions;
 import org.simantics.scl.compiler.module.repository.ModuleRepository;
 import org.simantics.scl.compiler.module.repository.UpdateListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public abstract class TextualModuleSource implements ModuleSource {
+    private static final Logger LOGGER = LoggerFactory.getLogger(TextualModuleSource.class);
+    
     public static final ImportDeclaration[] DEFAULT_IMPORTS = new ImportDeclaration[] {
         new ImportDeclaration("Builtin", ""),
         new ImportDeclaration("Prelude", "")
@@ -41,14 +47,17 @@ public abstract class TextualModuleSource implements ModuleSource {
         return getClass().getClassLoader();
     }
 
-    protected abstract Reader getSourceReader(UpdateListener listener) throws IOException;
+    protected Reader getSourceReader(UpdateListener listener) throws IOException {
+        return new StringReader(getSourceText(listener));
+    }
+    
     protected JavaReferenceValidator<?, ?, ?, ?> getJavaReferenceValidator() {
         return new RuntimeJavaReferenceValidator(getClassLoader());
     }
     
     public String getSourceText(UpdateListener listener) throws IOException {
         Reader reader = getSourceReader(listener);
-        char[] buffer = new char[65536];
+        char[] buffer = new char[4096];
         int pos = 0;
         try {
             while(true) {
@@ -64,7 +73,7 @@ public abstract class TextualModuleSource implements ModuleSource {
         }
     }
     
-    protected ImportDeclaration[] getBuiltinImports(UpdateListener listener) {
+    public ImportDeclaration[] getBuiltinImports(UpdateListener listener) {
         return DEFAULT_IMPORTS;
     }
     
@@ -76,28 +85,46 @@ public abstract class TextualModuleSource implements ModuleSource {
     @SuppressWarnings("unchecked")
     @Override
     public Failable<Module> compileModule(final ModuleRepository environment, final UpdateListener listener, ModuleCompilationOptions options) {
-        SCLCompiler compiler = new SCLCompiler(options);
+        SCLCompiler compiler = new SCLCompiler(options, getJavaReferenceValidatorFactory());
         try {
-            compiler.addSource(getSourceReader(listener));
+            String source = getSourceText(listener);
+            compiler.addSource(source);
             compiler.compile(
                     new EnvironmentFactoryImpl(
                             environment, 
                             getBuiltinImports(listener),
                             listener),
-                    moduleName,
-                    getJavaReferenceValidator());
-            if(compiler.getErrorLog().isEmpty())
+                    moduleName);
+            if(compiler.getErrorLog().hasNoErrors())
                 return new Success<Module>(compiler.getModule());
             else {
-                System.err.println("While compiling " + getModuleName() + ":");
-                System.err.println(CompilationErrorFormatter.toString(getSourceReader(null), compiler.getErrorLog().getErrors()));
+                if(options == null || !options.silent)
+                    LOGGER.error("While compiling " + getModuleName() + ":\n    " +
+                            CompilationErrorFormatter.toString(getSourceReader(null), compiler.getErrorLog().getErrors()).replaceAll("\n", "\n    "));
                 return new Failure(compiler.getErrorLog().getErrors());
             }
         } catch (IOException e) {
+            if(options == null || !options.silent)
+                LOGGER.error("Compilation of module " + moduleName + " failed.", e);
             return new Failure(e);
         }
     }
     
+    public JavaReferenceValidatorFactory getJavaReferenceValidatorFactory() {
+        return new JavaReferenceValidatorFactory() {
+            
+            @Override
+            public JavaReferenceValidator<Object, Object, Object, Object> getJavaReferenceValidator(String context) {
+                return (JavaReferenceValidator<Object, Object, Object, Object>)TextualModuleSource.this.getJavaReferenceValidator();
+            }
+            
+            @Override
+            public JavaReferenceValidator<Object, Object, Object, Object> getDefaultJavaReferenceValidator() {
+                return (JavaReferenceValidator<Object, Object, Object, Object>)TextualModuleSource.this.getJavaReferenceValidator();
+            }
+        };
+    }
+
     @Override
     public double getPriority() {
         return priority;