mxd пре 5 година
родитељ
комит
df2cd4fa1f

+ 34 - 0
src/main/java/org/ssssssss/script/MagicModuleLoader.java

@@ -0,0 +1,34 @@
+package org.ssssssss.script;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+
+public class MagicModuleLoader {
+
+	private static Map<String,Object> modules = new ConcurrentHashMap<>();
+
+	private static Function<String,Object> classLoader = (className)->{
+		try{
+			return Class.forName(className);
+		}catch(Exception e){
+			return null;
+		}
+	};
+
+	public static void setClassLoader(Function<String,Object> classLoader){
+		MagicModuleLoader.classLoader = classLoader;
+	}
+
+	public static void addModule(String moduleName, Object target){
+		modules.put(moduleName, target);
+	}
+
+	public static Object loadModule(String moduleName){
+		return modules.get(moduleName);
+	}
+
+	public static Object loadClass(String className){
+		return classLoader.apply(className);
+	}
+}

+ 12 - 13
src/main/java/org/ssssssss/script/MagicScriptDebugContext.java

@@ -84,25 +84,24 @@ public class MagicScriptDebugContext extends MagicScriptContext {
 			Object value = entry.getValue();
 			Map<String, Object> variable = new HashMap<>();
 			variable.put("name", entry.getKey());
-			variable.put("value", value);
 			if (value != null) {
+				variable.put("value", value.toString());
 				variable.put("type", value.getClass());
+			}else{
+				variable.put("value", "null");
 			}
 			varList.add(variable);
 		}
-		varList.sort(new Comparator<Map<String, Object>>() {
-			@Override
-			public int compare(Map<String, Object> o1, Map<String, Object> o2) {
-				Object k1 = o1.get("name");
-				Object k2 = o2.get("name");
-				if(k1 == null){
-					return -1;
-				}
-				if(k2 == null){
-					return 1;
-				}
-				return k1.toString().compareTo(k2.toString());
+		varList.sort((o1, o2) -> {
+			Object k1 = o1.get("name");
+			Object k2 = o2.get("name");
+			if(k1 == null){
+				return -1;
 			}
+			if(k2 == null){
+				return 1;
+			}
+			return k1.toString().compareTo(k2.toString());
 		});
 		Map<String, Object> info = new HashMap<>();
 		info.put("variables", varList);

+ 10 - 0
src/main/java/org/ssssssss/script/exception/ModuleNotFoundException.java

@@ -0,0 +1,10 @@
+package org.ssssssss.script.exception;
+
+import org.ssssssss.script.parsing.Span;
+
+public class ModuleNotFoundException extends ScriptException{
+
+	public ModuleNotFoundException(String errorMessage, Span.Line line) {
+		super(errorMessage, line);
+	}
+}

+ 7 - 9
src/main/java/org/ssssssss/script/parsing/Parser.java

@@ -72,23 +72,21 @@ public class Parser {
         if (stream.hasMore()) {
             Token expected = stream.consume();
             String packageName = null;
-            if (expected.getType() == TokenType.StringLiteral) {
+            boolean isStringLiteral = expected.getType() == TokenType.StringLiteral;
+            if (isStringLiteral) {
                 packageName = new StringLiteral(expected.getSpan()).getValue();
             } else if (expected.getType() == TokenType.Identifier) {
                 packageName = expected.getSpan().getText();
             } else {
                 MagicScriptError.error("Expected identifier or string, but got stream is " + expected.getType().getError(), stream.getPrev().getSpan());
             }
-            if (stream.hasMore()) {
+            String varName = packageName;
+            if (isStringLiteral || stream.match("as",false)) {
                 stream.expect("as");
-                if (stream.hasMore()) {
-                    Token token = stream.expect(TokenType.Identifier);
-                    return new Import(new Span(opening, token.getSpan()), packageName, token.getSpan().getText());
-                } else {
-                    MagicScriptError.error("Expected identifier, but got stream is EOF", stream.getPrev().getSpan());
-                }
+                expected = stream.expect(TokenType.Identifier);
+                varName = expected.getSpan().getText();
             }
-            MagicScriptError.error("Expected as, but got stream is EOF", stream.getPrev().getSpan());
+            return new Import(new Span(opening, expected.getSpan()), packageName, varName, !isStringLiteral);
         }
         MagicScriptError.error("Expected identifier or string, but got stream is EOF", stream.getPrev().getSpan());
         return null;

+ 28 - 16
src/main/java/org/ssssssss/script/parsing/ast/Import.java

@@ -1,28 +1,40 @@
 package org.ssssssss.script.parsing.ast;
 
+import org.ssssssss.script.MagicModuleLoader;
 import org.ssssssss.script.MagicScriptContext;
-import org.ssssssss.script.MagicScriptError;
+import org.ssssssss.script.exception.ModuleNotFoundException;
 import org.ssssssss.script.parsing.Span;
 
 public class Import extends Node {
 
-    private String packageName;
+	private String packageName;
 
-    private String variableName;
+	private String variableName;
 
-    public Import(Span span, String packageName, String variableName) {
-        super(span);
-        this.packageName = packageName;
-        this.variableName = variableName;
-    }
+	private boolean module;
 
-    @Override
-    public Object evaluate(MagicScriptContext context) {
-        try {
-            context.set(variableName, Class.forName(packageName));
-        } catch (ClassNotFoundException e) {
-            MagicScriptError.error(packageName + " not found.", getSpan(), e);
+	public Import(Span span, String packageName, String variableName, boolean module) {
+		super(span);
+		this.packageName = packageName;
+		this.variableName = variableName;
+		this.module = module;
+	}
+
+	@Override
+	public Object evaluate(MagicScriptContext context) {
+        if (this.module) {
+            Object target = MagicModuleLoader.loadModule(packageName);
+            if (target == null) {
+                throw new ModuleNotFoundException(String.format("module [%s] not found.", this.packageName), getSpan().getLine());
+            }
+            context.set(variableName, target);
+        }else{
+            Object target = MagicModuleLoader.loadClass(packageName);
+            if (target == null) {
+                throw new ModuleNotFoundException(String.format("class [%s] not found.", this.packageName), getSpan().getLine());
+            }
+            context.set(variableName, target);
         }
-        return null;
-    }
+		return null;
+	}
 }

+ 1 - 1
src/main/resources/magicapi-support/js/index.js

@@ -131,7 +131,7 @@ $(function(){
             var item = data.variables[i];
             var $tr = $('<tr/>');
             $tr.append($('<td/>').html(item.name))
-            $tr.append($('<td/>').html(JSON.stringify(item.value)))
+            $tr.append($('<td/>').html(item.value))
             $tr.append($('<td/>').html(item.type))
             $tbody.append($tr);
         }