Przeglądaj źródła

[display] sort out import/using path handling

closes #7075
Simon Krajewski 7 lat temu
rodzic
commit
1d3abcbb70

+ 8 - 3
src/syntax/grammar.mly

@@ -227,7 +227,7 @@ and parse_import s p1 =
 				type_path (List.map fst acc) true (punion pn p)
 			in
 			check_resume p resume (fun () -> ());
-			(match s with parser
+			begin match s with parser
 			| [< '(Const (Ident k),p) >] ->
 				loop pn ((k,p) :: acc)
 			| [< '(Kwd Macro,p) >] ->
@@ -237,7 +237,8 @@ and parse_import s p1 =
 			| [< '(Binop OpMult,_); '(Semicolon,p2) >] ->
 				p2, List.rev acc, IAll
 			| [< >] ->
-				serror());
+				if do_resume() then p,List.rev acc,INormal else serror()
+			end
 		| [< '(Semicolon,p2) >] ->
 			p2, List.rev acc, INormal
 		| [< '(Kwd In,_); '(Const (Ident name),pname); '(Semicolon,p2) >] ->
@@ -245,7 +246,7 @@ and parse_import s p1 =
 		| [< '(Const (Ident "as"),_); '(Const (Ident name),pname); '(Semicolon,p2) >] ->
 			p2, List.rev acc, IAsName(name,pname)
 		| [< >] ->
-			serror()
+			if do_resume() then (last_pos s),List.rev acc,INormal else serror()
 	in
 	let p2, path, mode = (match s with parser
 		| [< '(Const (Ident name),p) >] -> loop p [name,p]
@@ -265,9 +266,13 @@ and parse_using s p1 =
 				loop pn (("macro",p) :: acc)
 			| [< '(Kwd Extern,p) >] ->
 				loop pn (("extern",p) :: acc)
+			| [< >] ->
+				if do_resume() then p,List.rev acc else serror()
 			end
 		| [< '(Semicolon,p2) >] ->
 			p2,List.rev acc
+		| [< >] ->
+			if do_resume() then (last_pos s),List.rev acc else serror()
 	in
 	let p2, path = (match s with parser
 		| [< '(Const (Ident name),p) >] -> loop p [name,p]

+ 14 - 3
src/typing/typeload.ml

@@ -775,8 +775,17 @@ let string_list_of_expr_path (e,p) =
 let handle_path_display ctx path p =
 	let open ImportHandling in
 	match ImportHandling.convert_import_to_something_usable !Parser.resume_display path,ctx.com.display.dms_kind with
-		| (IDKPackage sl,p),_ ->
+		| (IDKPackage [_],p),DMDefault ->
+			let fields = DisplayToplevel.collect ctx true Typecore.NoValue in
+			raise_fields fields CRImport (Some p) false
+		| (IDKPackage sl,p),DMDefault ->
+			let sl = match List.rev sl with
+				| s :: sl -> List.rev sl
+				| [] -> assert false
+			in
 			raise (Parser.TypePath(sl,None,true,p))
+		| (IDKPackage _,_),_ ->
+			() (* ? *)
 		| (IDKModule(sl,s),_),DMDefinition ->
 			(* We assume that we want to go to the module file, not a specific type
 			   which might not even exist anyway. *)
@@ -801,11 +810,13 @@ let handle_path_display ctx path p =
 				()
 			end
 		| (IDKModule(sl,s),p),_ ->
-			raise (Parser.TypePath(sl,Some(s,false),true,p))
+			raise (Parser.TypePath(sl,None,true,p))
 		| (IDKSubType(sl,sm,st),p),DMDefinition ->
 			resolve_position_by_path ctx { tpackage = sl; tname = sm; tparams = []; tsub = Some st} p
 		| (IDKSubType(sl,sm,st),p),_ ->
-			raise (Parser.TypePath(sl @ [sm],Some(st,false),true,p))
+			raise (Parser.TypePath(sl,Some(sm,false),true,p))
+		| ((IDKSubTypeField(sl,sm,st,sf) | IDKModuleField(sl,(sm as st),sf)),p),DMDefault ->
+			raise (Parser.TypePath(sl @ [sm],Some(st,false),true,p));
 		| ((IDKSubTypeField(sl,sm,st,sf) | IDKModuleField(sl,(sm as st),sf)),p),_ ->
 			let m = ctx.g.do_load_module ctx (sl,sm) p in
 			List.iter (fun t -> match t with

+ 17 - 10
tests/display/src/cases/IImport.hx

@@ -5,13 +5,17 @@ using Lambda;
 
 class IImport extends DisplayTestCase {
 	/**
-	import ha{-1-}xe.ma{-2-}cro.Exp{-3-}rTools.Expr{-4-}ArrayTools.it{-5-}er;
+	import ha{-1-}xe.{-6-}ma{-2-}cro.{-7-}Exp{-3-}rTools.{-8-}Expr{-4-}ArrayTools.{-9-}it{-5-}er;
 	**/
 	function testImport1() {
-		eq(true, hasPath(fields(pos(1)), "Serializer"));
-		eq(true, hasPath(fields(pos(2)), "ExprTools"));
-		eq(true, hasPath(fields(pos(3)), "ExprArrayTools"));
-		eq(true, hasField(fields(pos(4)), "iter", "el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void"));
+		eq(true, hasPath(fields(pos(2)), "Serializer"));
+		eq(true, hasPath(fields(pos(6)), "Serializer"));
+		eq(true, hasPath(fields(pos(3)), "ExprTools"));
+		eq(true, hasPath(fields(pos(7)), "ExprTools"));
+		eq(true, hasPath(fields(pos(4)), "ExprArrayTools"));
+		eq(true, hasPath(fields(pos(8)), "ExprArrayTools"));
+		eq(true, hasField(fields(pos(5)), "iter", "el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void"));
+		eq(true, hasField(fields(pos(9)), "iter", "el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void"));
 		eq("el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void", type(pos(5)));
 		// TODO: test @position display. A bit annoying because it actually ends up in other files and we can't use markers.
 	}
@@ -32,13 +36,16 @@ class IImport extends DisplayTestCase {
 	}
 
 	/**
-	using ha{-1-}xe.ma{-2-}cro.Exp{-3-}rTools.Expr{-4-}ArrayTools;
+	using ha{-1-}xe.{-5-}ma{-2-}cro.{-6-}Exp{-3-}rTools.{-7-}Expr{-4-}ArrayTools;
 	**/
 	function testUsing1() {
-		eq(true, hasPath(fields(pos(1)), "Serializer"));
-		eq(true, hasPath(fields(pos(2)), "ExprTools"));
-		eq(true, hasPath(fields(pos(3)), "ExprArrayTools"));
-		eq(true, hasField(fields(pos(4)), "iter", "el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void"));
+		eq(true, hasPath(fields(pos(2)), "Serializer"));
+		eq(true, hasPath(fields(pos(5)), "Serializer"));
+		eq(true, hasPath(fields(pos(3)), "ExprTools"));
+		eq(true, hasPath(fields(pos(6)), "ExprTools"));
+		eq(true, hasPath(fields(pos(4)), "ExprArrayTools"));
+		eq(true, hasPath(fields(pos(7)), "ExprArrayTools"));
+		// eq(true, hasField(fields(pos(8)), "iter", "el : Array<haxe.macro.Expr> -> f : (haxe.macro.Expr -> Void) -> Void"));
 		// TODO: test @position display. A bit annoying because it actually ends up in other files and we can't use markers.
 	}
 

+ 26 - 0
tests/display/src/cases/Issue7075.hx

@@ -0,0 +1,26 @@
+package cases;
+
+class Issue7075 extends DisplayTestCase {
+	/**
+	import hax{-1-}
+
+	class Main {
+		static function main() {}
+	}
+	**/
+	function test1() {
+		eq(true, hasToplevel(toplevel(pos(1)), "type", "CallStack"));
+	}
+
+	/**
+	import haxe.d{-1-}
+
+	class Main {
+		static function main() {}
+	}
+	**/
+	function test2() {
+		var fields = fields(pos(1));
+		eq(true, hasField(fields, "CallStack", ""));
+	}
+}