瀏覽代碼

allow resuming on all var declarations (closes #5768)

Simon Krajewski 8 年之前
父節點
當前提交
8b5334958c
共有 2 個文件被更改,包括 70 次插入11 次删除
  1. 14 11
      src/syntax/parser.ml
  2. 56 0
      tests/display/src/cases/StructureCompletion.hx

+ 14 - 11
src/syntax/parser.ml

@@ -1228,27 +1228,30 @@ and parse_var_assignment = parser
 		end
 	| [< >] -> None
 
+and parse_var_assignment_resume vl name pn t s =
+	try
+		let eo = parse_var_assignment s in
+		((name,pn),t,eo)
+	with Display e ->
+		let v = ((name,pn),t,Some e) in
+		let e = (EVars(List.rev (v :: vl)),punion pn (pos e)) in
+		display e
+
 and parse_var_decls_next vl = parser
 	| [< '(Comma,p1); name,t,pn = parse_var_decl_head; s >] ->
-		begin try
-			let eo = parse_var_assignment s in
-			parse_var_decls_next (((name,pn),t,eo) :: vl) s
-		with Display e ->
-			let v = ((name,pn),t,Some e) in
-			let e = (EVars(List.rev (v :: vl)),punion p1 (pos e)) in
-			display e
-		end
+		let v_decl = parse_var_assignment_resume vl name pn t s in
+		parse_var_decls_next (v_decl :: vl) s
 	| [< >] ->
 		vl
 
 and parse_var_decls p1 = parser
 	| [< name,t,pn = parse_var_decl_head; s >] ->
-		let eo = parse_var_assignment s in
-		List.rev (parse_var_decls_next [(name,pn),t,eo] s)
+		let v_decl = parse_var_assignment_resume [] name pn t s in
+		List.rev (parse_var_decls_next [v_decl] s)
 	| [< s >] -> error (Custom "Missing variable identifier") p1
 
 and parse_var_decl = parser
-	| [< name,t,pn = parse_var_decl_head; eo = parse_var_assignment >] -> ((name,pn),t,eo)
+	| [< name,t,pn = parse_var_decl_head; v_decl = parse_var_assignment_resume [] name pn t >] -> v_decl
 
 and inline_function = parser
 	| [< '(Kwd Inline,_); '(Kwd Function,p1) >] -> true, p1

+ 56 - 0
tests/display/src/cases/StructureCompletion.hx

@@ -0,0 +1,56 @@
+package cases;
+
+class StructureCompletion extends DisplayTestCase {
+	/**
+	var o:{a:Float, b:String} = {{-1-}
+	**/
+	@:funcCode function testStructureCompletion1() {
+		eq(true, hasField(fields(pos(1)), "a", "Float"));
+		eq(true, hasField(fields(pos(1)), "b", "String"));
+	}
+
+	/**
+	var x, o:{a:Float, b:String} = {{-1-}
+	**/
+	@:funcCode function testStructureCompletion2() {
+		eq(true, hasField(fields(pos(1)), "a", "Float"));
+		eq(true, hasField(fields(pos(1)), "b", "String"));
+	}
+
+	/**
+	var o:{a:Float, b:String};
+	o = {{-1-}
+	**/
+	@:funcCode function testStructureCompletion3() {
+		eq(true, hasField(fields(pos(1)), "a", "Float"));
+		eq(true, hasField(fields(pos(1)), "b", "String"));
+	}
+
+	/**
+	class Main {
+		static function main () {
+			test({{-1-}
+		}
+
+		static function test(o:{a:Float, b:String}) { }
+	}
+	**/
+	function testStructureCompletion4() {
+		eq(true, hasField(fields(pos(1)), "a", "Float"));
+		eq(true, hasField(fields(pos(1)), "b", "String"));
+	}
+
+	/**
+	class Main {
+		static function main () {
+			test(0, {{-1-}
+		}
+
+		static function test(x, o:{a:Float, b:String}) { }
+	}
+	**/
+	function testStructureCompletion5() {
+		eq(true, hasField(fields(pos(1)), "a", "Float"));
+		eq(true, hasField(fields(pos(1)), "b", "String"));
+	}
+}