瀏覽代碼

[parser] don't put Meta.Last on double duty

closes #7864
closes #9853
Simon Krajewski 3 年之前
父節點
當前提交
28f5f76cd8
共有 4 個文件被更改,包括 45 次插入3 次删除
  1. 6 0
      src-json/meta.json
  2. 1 1
      src/context/display/displayEmitter.ml
  3. 2 2
      src/syntax/grammar.mly
  4. 36 0
      tests/display/src/cases/Metadata.hx

+ 6 - 0
src-json/meta.json

@@ -517,6 +517,12 @@
 		"platforms": ["hl"],
 		"targets": ["TClass", "TClassField"]
 	},
+	{
+		"name": "HxCompletion",
+		"metadata": ":hx.completion",
+		"doc": "Internally used for completion",
+		"internal": true
+	},
 	{
 		"name": "HxGen",
 		"metadata": ":hxGen",

+ 1 - 1
src/context/display/displayEmitter.ml

@@ -155,7 +155,7 @@ let display_meta com meta p = match com.display.dms_kind with
 	| DMDefault ->
 		let all = Meta.get_all() in
 		let all = List.map make_ci_metadata all in
-		let subject = if meta = Meta.Last then None else Some (Meta.to_string meta) in
+		let subject = if meta = Meta.HxCompletion then None else Some (Meta.to_string meta) in
 		raise_fields all CRMetadata (make_subject subject p);
 	| _ ->
 		()

+ 2 - 2
src/syntax/grammar.mly

@@ -558,7 +558,7 @@ and parse_meta_params pname s = match s with parser
 
 and parse_meta_entry = parser
 	[< '(At,p1); s >] ->
-		let meta = check_resume p1 (fun () -> Some (Meta.Last,[],p1)) (fun () -> None) in
+		let meta = check_resume p1 (fun () -> Some (Meta.HxCompletion,[],p1)) (fun () -> None) in
 		match s with parser
 		| [< name,p = parse_meta_name p1; params = parse_meta_params p >] -> (name,params,punion p1 p)
 		| [< >] -> match meta with None -> serror() | Some meta -> meta
@@ -580,7 +580,7 @@ and parse_meta_name_2 p1 acc s =
 
 and parse_meta_name p1 = parser
 	| [< '(DblDot,p) when p.pmin = p1.pmax; s >] ->
-		let meta = check_resume p (fun () -> Some (Meta.Last,p)) (fun() -> None) in
+		let meta = check_resume p (fun () -> Some (Meta.HxCompletion,p)) (fun() -> None) in
 		begin match s with parser
 		| [< name,p2 = parse_meta_name_2 p [] >] -> (Meta.parse (rev_concat "." name)),p2
 		| [< >] -> match meta with None -> raise Stream.Failure | Some meta -> meta

+ 36 - 0
tests/display/src/cases/Metadata.hx

@@ -109,4 +109,40 @@ class Metadata extends DisplayTestCase {
 		eq("Marks a class or class field as generic so each type parameter combination generates its own type/field.", metadataDoc(pos(2)));
 		eq("Marks a class or class field as generic so each type parameter combination generates its own type/field.", metadataDoc(pos(3)));
 	}
+
+	/**
+		#if !macro
+		@:build(cases.Metadata.Main.build())
+		#end
+		class Main {
+			#if !macro
+			@{-1-}
+			static var dummy = 123;
+
+			static function main() {}
+			#else
+			static function build() {
+				haxe.macro.Context.getBuildFields();
+				return null;
+			}
+			#end
+		}
+	**/
+	function test9853() {
+		eq(true, hasPath(fields(pos(1)), "@:generic"));
+	}
+
+	/**
+		@{-1-}
+		class Main {
+			static function main() {}
+		}
+		@{-2-}
+		class Test {}
+
+	**/
+	function test7864() {
+		eq(true, hasPath(fields(pos(1)), "@:generic"));
+		eq(true, hasPath(fields(pos(2)), "@:generic"));
+	}
 }