]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/compilation/Elaboration.java
Added module header feature to SCL language.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / compilation / Elaboration.java
index 0971641e8b4470b2938f2cc8ac9660dc58a7d316..5461d7a29a0c680bb2752dc4b20da355daa6b78b 100644 (file)
@@ -59,6 +59,7 @@ import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.effects.EffectConstructor;
 import org.simantics.scl.compiler.internal.codegen.effects.ThreadLocalVariable;
 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.JavaTypeTranslator;
 import org.simantics.scl.compiler.internal.codegen.types.StandardTypeConstructor;
 import org.simantics.scl.compiler.internal.codegen.utils.Constants;
@@ -68,6 +69,7 @@ import org.simantics.scl.compiler.internal.deriving.InstanceDeriver;
 import org.simantics.scl.compiler.internal.deriving.InstanceDerivers;
 import org.simantics.scl.compiler.internal.elaboration.profiling.BranchPointInjector;
 import org.simantics.scl.compiler.internal.elaboration.utils.StronglyConnectedComponents;
+import org.simantics.scl.compiler.internal.header.ModuleHeader;
 import org.simantics.scl.compiler.internal.parsing.declarations.ConstructorAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DAnnotationAst;
 import org.simantics.scl.compiler.internal.parsing.declarations.DClassAst;
@@ -116,7 +118,9 @@ public class Elaboration {
     private final CompilationContext compilationContext;
     private final ErrorLog errorLog;
     private final String moduleName;
+    private final ModuleHeader moduleHeader;
     private final ArrayList<ImportDeclaration> importsAst;
+    private final JavaReferenceValidatorFactory jrvFactory;
     final JavaReferenceValidator<Object, Object, Object, Object> javaReferenceValidator;
     private final ValueRepository valueDefinitionsAst;
     private final RelationRepository relationDefinitionsAst;
@@ -131,18 +135,23 @@ public class Elaboration {
     THashMap<String, ClassRef> classRefs = new THashMap<String, ClassRef>();
     THashMap<String, BranchPoint[]> branchPoints; 
     
-    @SuppressWarnings("unchecked")
     public Elaboration(CompilationContext compilationContext, CompilationTimer timer, EnvironmentFactory localEnvironmentFactory,
-            String moduleName, ArrayList<ImportDeclaration> importsAst,
-            JavaReferenceValidator<?, ?, ?, ?> javaReferenceValidator,
+            String moduleName, ModuleHeader moduleHeader, ArrayList<ImportDeclaration> importsAst,
+            JavaReferenceValidatorFactory jrvFactory,
             ValueRepository valueDefinitionsAst,
             RelationRepository relationDefinitionsAst) {
         this.compilationContext = compilationContext;
         this.errorLog = compilationContext.errorLog;
         this.moduleName = moduleName;
+        this.moduleHeader = moduleHeader;
         importsAst = processRelativeImports(importsAst);
         this.importsAst = importsAst;
-        this.javaReferenceValidator = (JavaReferenceValidator<Object, Object, Object, Object>)javaReferenceValidator;
+        this.jrvFactory = jrvFactory;
+        this.javaReferenceValidator = moduleHeader == null || moduleHeader.classLoader == null
+                ? jrvFactory.getDefaultJavaReferenceValidator()
+                : jrvFactory.getJavaReferenceValidator(moduleHeader.classLoader);
+        if(javaReferenceValidator == null)
+            errorLog.log(moduleHeader.classLoaderLocation, "Didn't find the specified class loader.");
         this.valueDefinitionsAst = valueDefinitionsAst;
         this.relationDefinitionsAst = relationDefinitionsAst;
 
@@ -653,15 +662,12 @@ public class Elaboration {
             if(annotations != null) {
                 for(DAnnotationAst annotation : annotations)
                     if(annotation.id.text.equals("@JavaName")) {
-                        Expression p0 = annotation.parameters[0];
-                        if(p0 instanceof EVar)
-                            javaName = ((EVar)p0).name;
-                        else if(p0 instanceof ELiteral) {
-                            ELiteral lit = (ELiteral)p0;
-                            javaName = ((StringConstant)lit.getValue()).getValue();
-                        }
+                        String temp = AnnotationUtils.processStringAnnotation(errorLog, annotation);
+                        if(temp != null)
+                            javaName = temp;
                     }
                     else if(annotation.id.text.equals("@private")) {
+                        AnnotationUtils.processTagAnnotation(errorLog, annotation);
                         isPrivate = true;
                     }
             }