X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fsource%2FTextualModuleSource.java;h=7d0e5335281684aac58ea296d1f51bf71875576c;hb=refs%2Fchanges%2F34%2F1534%2F3;hp=9df29e95815e7b892fdbc6ebfd91b6a5d1de2a09;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/TextualModuleSource.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/TextualModuleSource.java index 9df29e958..7d0e53352 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/TextualModuleSource.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/TextualModuleSource.java @@ -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 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(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 getJavaReferenceValidator(String context) { + return (JavaReferenceValidator)TextualModuleSource.this.getJavaReferenceValidator(); + } + + @Override + public JavaReferenceValidator getDefaultJavaReferenceValidator() { + return (JavaReferenceValidator)TextualModuleSource.this.getJavaReferenceValidator(); + } + }; + } + @Override public double getPriority() { return priority;