Expose CommandSession in SCL
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / commands / CommandSession.java
index a8f3d2045efb105928e18c951d1322410bd13a0f..00a7714a63640a3f2ae31bd29df0625c7f455ff4 100644 (file)
@@ -11,13 +11,13 @@ import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.simantics.scl.compiler.common.names.Names;
 import org.simantics.scl.compiler.constants.StringConstant;
+import org.simantics.scl.compiler.dynamic.SafeDynamic;
 import org.simantics.scl.compiler.elaboration.expressions.EApply;
 import org.simantics.scl.compiler.elaboration.expressions.EBlock;
 import org.simantics.scl.compiler.elaboration.expressions.EConstant;
@@ -33,6 +33,7 @@ import org.simantics.scl.compiler.environment.Environment;
 import org.simantics.scl.compiler.environment.LocalEnvironment;
 import org.simantics.scl.compiler.environment.specification.EnvironmentSpecification;
 import org.simantics.scl.compiler.errors.CompilationError;
+import org.simantics.scl.compiler.errors.ErrorSeverity;
 import org.simantics.scl.compiler.errors.Locations;
 import org.simantics.scl.compiler.internal.codegen.utils.NameMangling;
 import org.simantics.scl.compiler.internal.parsing.exceptions.SCLSyntaxErrorException;
@@ -43,6 +44,7 @@ import org.simantics.scl.compiler.module.ImportDeclaration;
 import org.simantics.scl.compiler.module.repository.ImportFailure;
 import org.simantics.scl.compiler.module.repository.ImportFailureException;
 import org.simantics.scl.compiler.module.repository.ModuleRepository;
+import org.simantics.scl.compiler.module.repository.UpdateListener;
 import org.simantics.scl.compiler.runtime.RuntimeEnvironment;
 import org.simantics.scl.compiler.top.ExpressionEvaluator;
 import org.simantics.scl.compiler.top.LocalStorage;
@@ -76,12 +78,17 @@ public class CommandSession {
     THashMap<String,Type> variableTypes = new THashMap<String,Type>();
     
     PrintStream fileOutput;
+    private UpdateListener dependenciesListener;
     
     /**
      * Only checks the commands for compilation errors but does not run them.
      */
     private boolean validateOnly; 
     
+    public CommandSession(ModuleRepository moduleRepository) {
+        this(moduleRepository, SCLReporting.getCurrentReportingHandler());
+    }
+
     public CommandSession(ModuleRepository moduleRepository, SCLReportingHandler handler) {
         this.moduleRepository = moduleRepository;
         this.defaultHandler = new PrintDecorator(
@@ -108,10 +115,13 @@ public class CommandSession {
         
         runtimeEnvironment = null;
         try {
+            if(dependenciesListener != null)
+                dependenciesListener.stopListening();
             try {
                 runtimeEnvironment = moduleRepository.createRuntimeEnvironment(
                         environmentSpecification,
-                        getClass().getClassLoader());
+                        getClass().getClassLoader(),
+                        dependenciesListener);
             } catch(ImportFailureException e) {
                 THashSet<String> failedModules = new THashSet<String>();
                 for(ImportFailure failure : e.failures) {
@@ -119,7 +129,8 @@ public class CommandSession {
                     defaultHandler.printError(failure.toString());
                     if(failure.reason instanceof CompilationError[])
                         for(CompilationError error : (CompilationError[])failure.reason) {
-                            defaultHandler.printError("    " + error.description);
+                            if(error.severity != ErrorSeverity.WARNING)
+                                defaultHandler.printError("    " + error.description);
                         }
                 }
                 for(CommandSessionImportEntry entry : importEntries)
@@ -129,7 +140,7 @@ public class CommandSession {
                 try {
                     runtimeEnvironment = moduleRepository.createRuntimeEnvironment(
                             environmentSpecification,
-                            getClass().getClassLoader());
+                            getClass().getClassLoader()); // no listener here, because should listen also failed modules
                 } catch (ImportFailureException e1) {
                     for(ImportFailure failure : e1.failures)
                         defaultHandler.printError(failure.toString());
@@ -507,7 +518,7 @@ public class CommandSession {
             if(e.location != Locations.NO_LOCATION)
                 handler.printError(parser.reader.locationUnderlining(e.location));
             handler.printError(e.getMessage());
-        } catch(Exception e) {
+        } catch (Exception | AssertionError e) {
             if(e instanceof InterruptedException)
                 handler.printError("Execution interrupted.");
             else
@@ -594,7 +605,9 @@ public class CommandSession {
             b.append("\tat ");
             if("_SCL_Module".equals(fileName)
                     || "_SCL_TypeClassInstance".equals(fileName))
-                b.append(NameMangling.demangle(methodName))
+                b.append(className)
+                .append('.')
+                .append(NameMangling.demangle(methodName))
                 .append('(').append(element.getLineNumber()).append(')');
             else
                 b.append(element);
@@ -607,6 +620,11 @@ public class CommandSession {
         variableTypes.put(name, type);
     }
 
+    public void setVariable(String name, SafeDynamic typeAndValue) {
+        variableValues.put(name, typeAndValue.value);
+        variableTypes.put(name, typeAndValue.type_);
+    }
+
     public Object getVariableValue(String name) {
         return variableValues.get(name);
     }
@@ -615,6 +633,14 @@ public class CommandSession {
         return variableTypes.get(name);
     }
     
+    public SafeDynamic getVariableValueAndType(String name) {
+        Type type = variableTypes.get(name);
+        if(type == null)
+            return null;
+        Object value = variableValues.get(name);
+        return new SafeDynamic(type, value);
+    }
+    
     public void removeVariable(String name) {
        variableValues.remove(name);
        variableTypes.remove(name);
@@ -651,7 +677,7 @@ public class CommandSession {
             formatException(handler, e);
         }
     }
-    
+
     public static CompilationError[] validate(ModuleRepository moduleRepository,StringReader commandReader) {
         CommandSession session = new CommandSession(moduleRepository, null);
         return session.validate(commandReader);
@@ -665,4 +691,7 @@ public class CommandSession {
         return validate(new StringReader(command));
     }
 
+    public void setDependenciesListener(UpdateListener dependenciesListener) {
+        this.dependenciesListener = dependenciesListener;
+    }
 }