Browse Source

优化代码提示

mxd 3 years ago
parent
commit
2b6ac64511

+ 20 - 0
magic-editor/src/console/src/scripts/parsing/ast.js

@@ -52,6 +52,14 @@ class MethodCall extends Node {
         return [this.target, ...this.args]
     }
 
+    getMethod(){
+        return this.target;
+    }
+
+    getArguments(){
+        return this.args;
+    }
+
     async getJavaType(env) {
         let method = this.target.member.getText()
         let targetType = await this.target.getJavaType(env)
@@ -80,6 +88,14 @@ class FunctionCall extends Node {
         return [this.target, ...this.args]
     }
 
+    getFunction(){
+        return this.target;
+    }
+
+    getArguments(){
+        return this.args;
+    }
+
     async getJavaType(env) {
         return await this.target.getJavaType(env);
     }
@@ -363,6 +379,10 @@ class VarDefine extends Node {
     expressions() {
         return this.expression == null ? [] : [this.expression]
     }
+
+    async getJavaType(env) {
+        return this.expression.getJavaType(env);
+    }
 }
 
 class TernaryOperation extends Node {

+ 9 - 5
magic-editor/src/console/src/scripts/parsing/parser.js

@@ -253,9 +253,14 @@ export class Parser {
 
     parseNewExpression(opening) {
         let expression = this.parseAccessOrCall(TokenType.Identifier, true);
-        let args = this.parseArguments();
-        let closing = this.stream.expect(")").getSpan();
-        return this.parseConverterOrAccessOrCall(new NewStatement(new Span(opening, closing), identifier.getText(), args));
+        if (expression instanceof MethodCall) {
+            let span = new Span(opening.getSource(), opening.getStart(), this.stream.getPrev().getSpan().getEnd());
+            return this.parseConverterOrAccessOrCall(new NewStatement(span, expression.getMethod(), expression.getArguments()));
+        } else if (expression instanceof FunctionCall) {
+            let span = new Span(opening.getSource(), opening.getStart(), this.stream.getPrev().getSpan().getEnd());
+            return this.parseConverterOrAccessOrCall(new NewStatement(span, expression.getFunction(), expression.getArguments()));
+        }
+        throw new ParseException("Expected MethodCall or FunctionCall or LambdaFunction", this.stream.getPrev().getSpan());
     }
 
     parseArguments() {
@@ -746,7 +751,6 @@ export class Parser {
                         value = varName;
                     } else if (this.stream.match(TokenType.StringLiteral, false)) {
                         value = this.stream.consume().getText();
-                        value = value.substring(1, value.length - 1);
                     }
                     let index = -1;
                     if (this.stream.match('as', true)) {
@@ -774,7 +778,7 @@ export class Parser {
                         let varName = this.stream.consume().getText();
                         if (this.stream.match(TokenType.Assignment, true)) {
                             let isAsync = this.stream.match("async", true);
-                            let value = this.parseStatement();
+                            let value = this.parseExpression();
                             env[varName] = isAsync ? "java.util.concurrent.Future" : await value.getJavaType(env);
                             if (!this.stream.hasMore()) {
                                 expression = value;