Przeglądaj źródła

parse documentation and metadata for structures (closes #4655) (closes #3083)

Simon Krajewski 9 lat temu
rodzic
commit
e1ca27a28f

+ 13 - 7
parser.ml

@@ -835,11 +835,11 @@ and parse_complex_type_inner = parser
 	| [< '(POpen,_); t = parse_complex_type; '(PClose,_) >] -> CTParent t
 	| [< '(BrOpen,p1); s >] ->
 		(match s with parser
-		| [< l = parse_type_anonymous false >] -> CTAnonymous l
+		| [< l = parse_type_anonymous >] -> CTAnonymous l
 		| [< t = parse_structural_extension; s>] ->
 			let tl = t :: plist parse_structural_extension s in
 			(match s with parser
-			| [< l = parse_type_anonymous false >] -> CTExtend (tl,l)
+			| [< l = parse_type_anonymous >] -> CTExtend (tl,l)
 			| [< l, _ = parse_class_fields true p1 >] -> CTExtend (tl,l))
 		| [< l, _ = parse_class_fields true p1 >] -> CTAnonymous l
 		| [< >] -> serror())
@@ -913,15 +913,21 @@ and parse_complex_type_next t = parser
 			CTFunction ([t] , t2))
 	| [< >] -> t
 
-and parse_type_anonymous opt = parser
-	| [< '(Question,_) when not opt; s >] -> parse_type_anonymous true s
+and parse_type_anonymous s =
+	let doc = get_doc s in
+	let meta = parse_meta s in
+	let opt = match s with parser
+		| [< '(Question,_) >] -> true
+		| [< >] -> false
+	in
+	match s with parser
 	| [< name, p1 = ident; t = parse_type_hint; s >] ->
 		let next p2 acc =
 			{
 				cff_name = name;
-				cff_meta = if opt then [Meta.Optional,[],p1] else [];
+				cff_meta = if opt then (Meta.Optional,[],p1) :: meta else meta;
 				cff_access = [];
-				cff_doc = None;
+				cff_doc = doc;
 				cff_kind = FVar (Some t,None);
 				cff_pos = punion p1 p2;
 			} :: acc
@@ -931,7 +937,7 @@ and parse_type_anonymous opt = parser
 		| [< '(Comma,p2) >] ->
 			(match s with parser
 			| [< '(BrClose,_) >] -> next p2 []
-			| [< l = parse_type_anonymous false >] -> next p2 l
+			| [< l = parse_type_anonymous >] -> next p2 l
 			| [< >] -> serror());
 		| [< >] -> serror()
 

+ 20 - 0
tests/misc/projects/Issue4655/Macro.hx

@@ -0,0 +1,20 @@
+import haxe.macro.Expr;
+import haxe.macro.Context;
+
+class Macro {
+	macro static public function getMetaAndDocInfo(e:Expr) {
+		var map = {};
+		switch (Context.follow(Context.typeof(e))) {
+			case TAnonymous(an):
+				for (field in an.get().fields) {
+					var meta = field.meta.get().map(function(m) return m.name);
+					Reflect.setField(map, field.name, {
+						doc: field.doc,
+						meta: meta.join(", ")
+					});
+				}
+			case _:
+		}
+		return macro $v{map};
+	}
+}

+ 24 - 0
tests/misc/projects/Issue4655/Main.hx

@@ -0,0 +1,24 @@
+/** Root level Test1. This comment will exist */
+typedef Test1 = {
+	/**test one (this comment will not exist)*/
+	@:meta1
+	?a: Int,
+
+	/**test other (this comment will not exist either)*/
+	@:meta2
+	b: Int
+}
+
+class Main {
+	static function main() {
+		var t:Test1;
+		var info = Macro.getMetaAndDocInfo(t);
+		function println(s) {
+			Sys.stderr().writeString(s + "\n");
+		}
+		println(info.a.doc);
+		println(info.a.meta);
+		println(info.b.doc);
+		println(info.b.meta);
+	}
+}

+ 3 - 0
tests/misc/projects/Issue4655/compile.hxml

@@ -0,0 +1,3 @@
+-main Main
+-D "use-rtti-doc"
+--interp

+ 4 - 0
tests/misc/projects/Issue4655/compile.hxml.stderr

@@ -0,0 +1,4 @@
+test one (this comment will not exist)
+:optional, :meta1
+test other (this comment will not exist either)
+:meta2