]> gerrit.simantics Code Review - simantics/platform.git/commitdiff
Compilation of SCL expressions from SCL 36/1336/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Wed, 27 Dec 2017 12:12:55 +0000 (14:12 +0200)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Wed, 27 Dec 2017 12:12:55 +0000 (14:12 +0200)
refs #7695

Change-Id: I053be9e6d4197ad563a31f09e21c6bea89c3e5ed

bundles/org.simantics.scl.compiler/scl/SCL/CallHierarchy.scl
bundles/org.simantics.scl.compiler/scl/SCL/Common.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/scl/SCL/Environment.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/scl/SCL/Expressions.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/scl/SCL/Module.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/scl/SCL/ModuleRepository.scl [new file with mode: 0644]
bundles/org.simantics.scl.compiler/scl/SCL/Reflection.scl
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/CurrentModuleRepositoryModule.java [moved from bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/java/ReflectionJavaModule.java with 89% similarity]
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/environment/specification/EnvironmentSpecification.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/repository/ModuleRepository.java
bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/source/repository/BuiltinModuleSourceRepository.java

index 4e823970e8b88594de582c6f08ab155329308dbe..99ff5d18d1ca234cd9b662858665fdd33a3213b8 100644 (file)
@@ -3,7 +3,7 @@ module {
     export = [whoCalls, unusedDefinitions]
 }
 
-import "SCL/Reflection"
+import "SCL/ModuleRepository"
 
 @JavaType "org.simantics.scl.compiler.module.debug.SymbolReference"
 data SymbolReference =
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/Common.scl b/bundles/org.simantics.scl.compiler/scl/SCL/Common.scl
new file mode 100644 (file)
index 0000000..9fe13d1
--- /dev/null
@@ -0,0 +1,27 @@
+module {
+    export = [moduleOfName, nameOfName, createName]
+}
+
+// Names
+
+importJava "org.simantics.scl.compiler.common.names.Name" where
+    data Name
+    
+    @JavaName module
+    moduleOfName_ :: Name -> String
+    @JavaName name
+    nameOfName_ :: Name -> String
+    
+    @JavaName create
+    createName_ :: String -> String -> Name
+
+instance Show Name where
+    sb <+ n = sb << moduleOfName n << "/" << nameOfName n
+    
+moduleOfName = moduleOfName_
+nameOfName = nameOfName_
+createName = createName_    
+    
+// Locations
+
+type Location = Long
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/Environment.scl b/bundles/org.simantics.scl.compiler/scl/SCL/Environment.scl
new file mode 100644 (file)
index 0000000..b8306ad
--- /dev/null
@@ -0,0 +1,19 @@
+include "./ModuleRepository"
+
+importJava "org.simantics.scl.compiler.environment.Environment" where
+    data Environment
+
+importJava "org.simantics.scl.compiler.runtime.RuntimeEnvironment" where
+    data RuntimeEnvironment
+
+importJava "org.simantics.scl.compiler.environment.specification.EnvironmentSpecification" where
+    data EnvironmentSpecification
+    
+    fromList :: [(String,String)] -> EnvironmentSpecification
+
+importJava "org.simantics.scl.compiler.module.repository.ModuleRepository" where
+    @JavaName createRuntimeEnvironment
+    createRuntimeEnvironment_ :: ModuleRepository -> EnvironmentSpecification -> <Proc> RuntimeEnvironment
+    
+createRuntimeEnvironment :: [(String,String)] -> <Proc> RuntimeEnvironment
+createRuntimeEnvironment = createRuntimeEnvironment_ MODULE_REPOSITORY . fromList
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/Expressions.scl b/bundles/org.simantics.scl.compiler/scl/SCL/Expressions.scl
new file mode 100644 (file)
index 0000000..6bb8571
--- /dev/null
@@ -0,0 +1,31 @@
+include "./Environment"
+
+importJava "org.simantics.scl.compiler.top.ExpressionEvaluator" where
+    data ExpressionEvaluator
+    
+    @JavaName "<init>" 
+    createExpressionEvaluator :: RuntimeEnvironment -> String -> <Proc> ExpressionEvaluator
+    
+    eval :: ExpressionEvaluator -> <Proc> a
+    
+    expectedType :: ExpressionEvaluator -> Type -> <Proc> ExpressionEvaluator 
+
+importJava "org.simantics.scl.compiler.top.SCLExpressionCompilationException" where
+    data SCLExpressionCompilationException
+
+data EvaluationModifier
+
+applyModifier evaluator _  = ()
+
+evaluateExpression :: Typeable a => RuntimeEnvironment -> [EvaluationModifier] -> String -> <Proc> a
+evaluateExpression runtimeEnvironment modifiers expression = do
+    evaluator = createExpressionEvaluator runtimeEnvironment expression
+    expectedType evaluator (typeOfProxy (TypeProxy :: TypeProxy a))
+    iter (applyModifier evaluator) modifiers
+    eval evaluator
+
+untypedEvaluateExpression ::  RuntimeEnvironment -> [EvaluationModifier] -> String -> <Proc> a
+untypedEvaluateExpression runtimeEnvironment modifiers expression = do
+    evaluator = createExpressionEvaluator runtimeEnvironment expression
+    iter (applyModifier evaluator) modifiers
+    eval evaluator
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/Module.scl b/bundles/org.simantics.scl.compiler/scl/SCL/Module.scl
new file mode 100644 (file)
index 0000000..22efc68
--- /dev/null
@@ -0,0 +1,9 @@
+include "./Common"
+
+importJava "org.simantics.scl.compiler.module.Module" where
+    data Module
+    
+    @JavaName getValueNames
+    valueNamesOf_ :: Module -> [String]
+
+valueNamesOf = valueNamesOf_      
\ No newline at end of file
diff --git a/bundles/org.simantics.scl.compiler/scl/SCL/ModuleRepository.scl b/bundles/org.simantics.scl.compiler/scl/SCL/ModuleRepository.scl
new file mode 100644 (file)
index 0000000..eceb418
--- /dev/null
@@ -0,0 +1,45 @@
+module {
+    export = [possibleUnsafeSclValueByName, unsafeSclValueByName, sclModuleNames, moduleByName]
+}
+
+include "./CurrentModuleRepository"
+include "./Module"
+
+importJava "org.simantics.scl.compiler.module.repository.ModuleRepository" where
+    // data ModuleRepository
+    // defined in CurrentModuleRepository
+
+    @JavaName getValue
+    unsafeSclValueByName_ :: ModuleRepository -> String -> <Proc> a
+    
+    @JavaName getSourceRepository
+    moduleSourceRepositoryOf :: ModuleRepository -> ModuleSourceRepository
+    
+    @JavaName getModule
+    moduleByName_ :: ModuleRepository -> String -> <Proc> Failable Module 
+    
+importJava "org.simantics.scl.compiler.source.repository.ModuleSourceRepository" where
+    data ModuleSourceRepository
+    
+    @JavaName getModuleNames
+    sclModuleNames_ :: ModuleSourceRepository -> [String]
+
+importJava "org.simantics.scl.compiler.errors.Failable" where
+    data Failable a
+    
+    didSucceed :: Failable a -> Boolean
+    getResult :: Failable a -> Maybe a 
+
+unsafeSclValueByName :: String -> <Proc> a
+unsafeSclValueByName = unsafeSclValueByName_ MODULE_REPOSITORY
+
+possibleUnsafeSclValueByName :: String -> <Proc> Maybe a
+possibleUnsafeSclValueByName name = Just (unsafeSclValueByName name) `catch` \(_ :: Exception) -> Nothing
+
+sclModuleNames :: <Proc> [String]
+sclModuleNames = sclModuleNames_ (moduleSourceRepositoryOf MODULE_REPOSITORY)
+
+moduleByName :: String -> <Proc> Maybe Module
+moduleByName name = getResult failable
+  where
+    failable = moduleByName_ MODULE_REPOSITORY name
\ No newline at end of file
index 6b2fd0bcdffac1eac36cf9186a1f28a3fb3d6f13..3e8aeb97be5f2dda3e33ffabd349d6838e5f89dd 100644 (file)
@@ -1,69 +1,5 @@
 module {
-    export = [possibleUnsafeSclValueByName, unsafeSclValueByName, sclModuleNames, moduleByName,
-              moduleOfName, nameOfName, createName, valueNamesOf]
+    deprecated = "Use more specialized modules like ModuleRepository"
 }
 
-include "SCL/ReflectionJava"
-
-importJava "org.simantics.scl.compiler.module.repository.ModuleRepository" where
-    @JavaName getValue
-    unsafeSclValueByName_ :: ModuleRepository -> String -> <Proc> a
-    
-    @JavaName getSourceRepository
-    moduleSourceRepositoryOf :: ModuleRepository -> ModuleSourceRepository
-    
-    @JavaName getModule
-    moduleByName_ :: ModuleRepository -> String -> <Proc> Failable Module 
-    
-importJava "org.simantics.scl.compiler.source.repository.ModuleSourceRepository" where
-    data ModuleSourceRepository
-    
-    @JavaName getModuleNames
-    sclModuleNames_ :: ModuleSourceRepository -> [String]
-
-importJava "org.simantics.scl.compiler.errors.Failable" where
-    data Failable a
-    
-    didSucceed :: Failable a -> Boolean
-    getResult :: Failable a -> Maybe a 
-
-importJava "org.simantics.scl.compiler.module.Module" where
-    data Module
-    
-    @JavaName getValueNames
-    valueNamesOf_ :: Module -> [String]    
-    
-importJava "org.simantics.scl.compiler.common.names.Name" where
-    data Name
-    
-    @JavaName module
-    moduleOfName_ :: Name -> String
-    @JavaName name
-    nameOfName_ :: Name -> String
-    
-    @JavaName create
-    createName_ :: String -> String -> Name
-
-instance Show Name where
-    sb <+ n = sb << moduleOfName n << "/" << nameOfName n
-    
-moduleOfName = moduleOfName_
-nameOfName = nameOfName_
-createName = createName_
-valueNamesOf = valueNamesOf_      
-    
-type Location = Long
-    
-unsafeSclValueByName :: String -> <Proc> a
-unsafeSclValueByName = unsafeSclValueByName_ MODULE_REPOSITORY
-
-possibleUnsafeSclValueByName :: String -> <Proc> Maybe a
-possibleUnsafeSclValueByName name = Just (unsafeSclValueByName name) `catch` \(_ :: Exception) -> Nothing
-
-sclModuleNames :: <Proc> [String]
-sclModuleNames = sclModuleNames_ (moduleSourceRepositoryOf MODULE_REPOSITORY)
-
-moduleByName :: String -> <Proc> Maybe Module
-moduleByName name = getResult failable
-  where
-    failable = moduleByName_ MODULE_REPOSITORY name
\ No newline at end of file
+include "./ModuleRepository"
\ No newline at end of file
@@ -17,12 +17,12 @@ import org.simantics.scl.compiler.types.Type;
 import org.simantics.scl.compiler.types.Types;
 import org.simantics.scl.compiler.types.kinds.Kinds;
 
-public class ReflectionJavaModule extends ConcreteModule {
+public class CurrentModuleRepositoryModule extends ConcreteModule {
     
-    public static ReflectionJavaModule INSTANCE = new ReflectionJavaModule();
+    public static CurrentModuleRepositoryModule INSTANCE = new CurrentModuleRepositoryModule();
 
-    public ReflectionJavaModule() {
-        super("SCL/ReflectionJava");
+    public CurrentModuleRepositoryModule() {
+        super("SCL/CurrentModuleRepository");
         
         // ModuleRepository type
         TCon ModuleRepository = Types.con(getName(), "ModuleRepository");
index c6dc8db4ec7d418af344f5107e9afde4a26c7ae8..d247685f5d7b56acdc20c7107ce2441bc89294c4 100644 (file)
@@ -1,8 +1,10 @@
 package org.simantics.scl.compiler.environment.specification;
 
 import java.util.ArrayList;
+import java.util.List;
 
 import org.simantics.scl.compiler.module.ImportDeclaration;
+import org.simantics.scl.runtime.tuple.Tuple2;
 
 public class EnvironmentSpecification {
     public final ArrayList<ImportDeclaration> imports = new ArrayList<ImportDeclaration>();
@@ -19,6 +21,13 @@ public class EnvironmentSpecification {
             spec.importModule(strings[i], strings[i+1]);
         return spec;
     }
+    
+    public static EnvironmentSpecification fromList(List<Tuple2> imports) {
+        EnvironmentSpecification spec = new EnvironmentSpecification();
+        for(Tuple2 tuple : imports)
+            spec.importModule((String)tuple.c0, (String)tuple.c1);
+        return spec;
+    }
 
     @Override
     public int hashCode() {
index f2e4e97ae09944f7132c8ac6d1d03f054de41753..0f0b8542049a53c7f8eea2667ba15c40789f0f7b 100644 (file)
@@ -369,6 +369,10 @@ public class ModuleRepository {
         return createRuntimeEnvironment(environmentSpecification, parentClassLoader, null);
     }
     
+    public RuntimeEnvironment createRuntimeEnvironment(EnvironmentSpecification environmentSpecification) throws ImportFailureException {
+        return createRuntimeEnvironment(environmentSpecification, getClass().getClassLoader());
+    }
+    
     public RuntimeEnvironment createRuntimeEnvironment(
             EnvironmentSpecification environmentSpecification,
             ClassLoader parentClassLoader,
index f3fd697401b43f75d70ba420883d5d22101201ae..22c986b5c84f879e840e7377f726d7df7babe6aa 100644 (file)
@@ -4,13 +4,13 @@ import org.simantics.scl.compiler.elaboration.java.Builtins;
 import org.simantics.scl.compiler.elaboration.java.JavaModule;
 import org.simantics.scl.compiler.elaboration.java.LoggingModule;
 import org.simantics.scl.compiler.elaboration.java.MinigraphModule;
-import org.simantics.scl.compiler.elaboration.java.ReflectionJavaModule;
+import org.simantics.scl.compiler.elaboration.java.CurrentModuleRepositoryModule;
 
 public class BuiltinModuleSourceRepository extends MapModuleSourceRepository implements ModuleSourceRepository {
     public BuiltinModuleSourceRepository() {
         super(Builtins.INSTANCE,
                 JavaModule.INSTANCE,
-                ReflectionJavaModule.INSTANCE,
+                CurrentModuleRepositoryModule.INSTANCE,
                 MinigraphModule.INSTANCE,
                 new LoggingModule());
     }