Prechádzať zdrojové kódy

rewrite var initialization parsing (closes #3911)

- give explicit error for missing expression after = (see #3699)
- use display with EVars to allow completion in subsequent initializations (see #3422)
Simon Krajewski 10 rokov pred
rodič
commit
8bcb2f9ddb

+ 33 - 8
parser.ml

@@ -1083,10 +1083,8 @@ and block acc s =
 			block acc s
 
 and parse_block_elt = parser
-	| [< '(Kwd Var,p1); vl = psep Comma parse_var_decl; p2 = semicolon >] ->
-		(match vl with
-			| [] -> error (Custom "Missing variable identifier") p1
-			| _ -> (EVars vl,punion p1 p2))
+	| [< '(Kwd Var,p1); vl = parse_var_decls p1; p2 = semicolon >] ->
+		(EVars vl,punion p1 p2)
 	| [< e = expr; _ = semicolon >] -> e
 
 and parse_obj_decl = parser
@@ -1105,11 +1103,38 @@ and parse_array_decl = parser
 	| [< >] ->
 		[]
 
+and parse_var_decl_head = parser
+	| [< name, _ = dollar_ident; t = parse_type_opt >] -> (name,t)
+
+and parse_var_assignment = parser
+	| [< '(Binop OpAssign,p1); s >] ->
+		begin match s with parser
+		| [< e = expr >] -> Some e
+		| [< >] -> error (Custom "expression expected after =") p1
+		end
+	| [< >] -> None
+
+and parse_var_decls_next vl = parser
+	| [< '(Comma,p1); name,t = parse_var_decl_head; s >] ->
+		begin try
+			let eo = parse_var_assignment s in
+			parse_var_decls_next ((name,t,eo) :: vl) s
+		with Display e ->
+			let v = (name,t,Some e) in
+			let e = (EVars(List.rev (v :: vl)),punion p1 (pos e)) in
+			display e
+		end
+	| [< >] ->
+		vl
+
+and parse_var_decls p1 = parser
+	| [< name,t = parse_var_decl_head; s >] ->
+		let eo = parse_var_assignment s in
+		List.rev (parse_var_decls_next [name,t,eo] s)
+	| [< s >] -> error (Custom "Missing variable identifier") p1
+
 and parse_var_decl = parser
-	| [< name, _ = dollar_ident; t = parse_type_opt; s >] ->
-		match s with parser
-		| [< '(Binop OpAssign,_); s >] -> let e = try expr s with Display e -> e in (name,t,Some e)
-		| [< >] -> (name,t,None)
+	| [< name,t = parse_var_decl_head; eo = parse_var_assignment >] -> (name,t,eo)
 
 and inline_function = parser
 	| [< '(Kwd Inline,_); '(Kwd Function,p1) >] -> true, p1

+ 2 - 1
tests/misc/projects/Issue3699/compile-var-fail.hxml.stderr

@@ -1 +1,2 @@
-MainVar.hx:3: characters 2-5 : Missing variable identifier
+MainVar.hx:3: characters 10-11 : expression expected after =
+MainVar.hx:3: characters 12-13 : Unexpected ;

+ 7 - 0
tests/misc/projects/Issue3911/Main1.hx

@@ -0,0 +1,7 @@
+class Main1 {
+    function new(a:Int) {}
+
+    static function main() {
+        var m = new Main1(
+    }
+}

+ 7 - 0
tests/misc/projects/Issue3911/Main2.hx

@@ -0,0 +1,7 @@
+class Main2 {
+    function new(a:Int) {}
+
+    static function main() {
+        var m = new Main2()
+    }
+}

+ 7 - 0
tests/misc/projects/Issue3911/Main3.hx

@@ -0,0 +1,7 @@
+class Main3 {
+    function new(a:Int) {}
+
+    static function main() {
+        var m = new Main3();
+    }
+}

+ 1 - 0
tests/misc/projects/Issue3911/compile1.hxml

@@ -0,0 +1 @@
+--display Main1.hx@97

+ 3 - 0
tests/misc/projects/Issue3911/compile1.hxml.stderr

@@ -0,0 +1,3 @@
+<type>
+a : Int -&gt; Void
+</type>

+ 1 - 0
tests/misc/projects/Issue3911/compile2.hxml

@@ -0,0 +1 @@
+--display Main2.hx@97

+ 3 - 0
tests/misc/projects/Issue3911/compile2.hxml.stderr

@@ -0,0 +1,3 @@
+<type>
+a : Int -&gt; Void
+</type>

+ 1 - 0
tests/misc/projects/Issue3911/compile3.hxml

@@ -0,0 +1 @@
+--display Main3.hx@97

+ 3 - 0
tests/misc/projects/Issue3911/compile3.hxml.stderr

@@ -0,0 +1,3 @@
+<type>
+a : Int -&gt; Void
+</type>