X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Fcompilation%2FSCLCompiler.java;h=29136b60935662d0e57bf91534959dfa4b9e7bf7;hb=refs%2Fchanges%2F88%2F288%2F1;hp=b5bd4ef312c997038e5856164d2ef34dfbe69cb7;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java index b5bd4ef31..29136b609 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/SCLCompiler.java @@ -18,8 +18,8 @@ import org.simantics.scl.compiler.top.SCLCompilerConfiguration; import org.simantics.scl.compiler.top.StandardModuleInitializer; public class SCLCompiler { - ErrorLog errorLog = new ErrorLog(); - DeclarationClassification declarations = new DeclarationClassification(errorLog); + CompilationContext compilationContext = new CompilationContext(); + DeclarationClassification declarations = new DeclarationClassification(compilationContext); // publishable results Map classes; @@ -42,9 +42,9 @@ public class SCLCompiler { for(DeclarationAst declaration : (ArrayList)parser.parseModule()) declarations.handle(declaration); } catch(SCLSyntaxErrorException e) { - errorLog.log(e.location, e.getMessage()); + compilationContext.errorLog.log(e.location, e.getMessage()); } catch(Exception e) { - errorLog.log(e); + compilationContext.errorLog.log(e); } finally { try { sourceReader.close(); @@ -55,13 +55,17 @@ public class SCLCompiler { if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("Parsing"); } + private boolean hasErrors() { + return !compilationContext.errorLog.hasNoErrors(); + } + public void compile( EnvironmentFactory localEnvironmentFactory, String moduleName, JavaReferenceValidator javaReferenceValidator) { try { - if(!errorLog.isEmpty()) return; - Elaboration elaboration = new Elaboration(errorLog, + if(hasErrors()) return; + Elaboration elaboration = new Elaboration(compilationContext, timer, localEnvironmentFactory, moduleName, @@ -72,24 +76,24 @@ public class SCLCompiler { if(options.computeCoverage) elaboration.addCoverageBranchPoints(); // Elaboration - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.addTypesToEnvironment( declarations.dataTypesAst, declarations.typeAliasesAst, declarations.effectsAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processTypeAliases(declarations.typeAliasesAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processDataTypes(declarations.dataTypesAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processTypeClasses(declarations.typeClassesAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processDerivingInstances(declarations.derivingInstancesAst, declarations.instancesAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processInstances(declarations.instancesAst); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.processJavaMethods(declarations.javaMethodDeclarations); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; elaboration.addDataTypesToEnvironment(); elaboration.addTypeClassesToEnvironment(); elaboration.preprocessValueDefinitions(declarations.typeAnnotationsAst); @@ -101,9 +105,9 @@ public class SCLCompiler { if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("Elaboration"); // Type checking - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; //new TypeChecking(errorLog, elaboration.environment, elaboration.module).typeCheck(); - new TypeChecking(errorLog, elaboration.environment, elaboration.module).typeCheck(); + new TypeChecking(compilationContext, elaboration.module).typeCheck(); if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("Type checking"); @@ -125,53 +129,52 @@ public class SCLCompiler { this.declarations = null; // Code generation - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; CodeGeneration codeGeneration = new CodeGeneration( - errorLog, - elaboration.environment, - elaboration.namingPolicy, - elaboration.javaTypeTranslator, + compilationContext, elaboration.javaReferenceValidator, elaboration.module); codeGeneration.simplifyValues(); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.convertToSSA(); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.optimizeSSA(); if(SCLCompilerConfiguration.ENABLE_TIMING) phaseFinished("SSA conversion and optimization"); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.generateCode(); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.generateDataTypes(elaboration.dataTypes); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.generateTypeClasses(); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; codeGeneration.generateTypeClassInstances(); - if(!errorLog.isEmpty()) return; + if(hasErrors()) return; classes = codeGeneration.classes; module = codeGeneration.module; moduleInitializer = StandardModuleInitializer.create( - codeGeneration.namingPolicy.getModuleClassName(), + compilationContext.namingPolicy.getModuleClassName(), codeGeneration.externalConstants); module.setClasses(classes); module.setModuleInitializer(moduleInitializer); module.setBranchPoints(elaboration.branchPoints); + if(compilationContext.errorLog.hasErrorsOrWarnings()) + module.setWarnings(compilationContext.errorLog.getErrors()); if(SCLCompilerConfiguration.ENABLE_TIMING) { phaseFinished("Code generation"); reportTiming(moduleName); } } catch(Exception e) { - errorLog.log(e); + compilationContext.errorLog.log(e); } } public ErrorLog getErrorLog() { - return errorLog; + return compilationContext.errorLog; } public Map getClasses() {