diff --git a/src/context/resolution.ml b/src/context/resolution.ml index dd4f7c022e8..2e2de852619 100644 --- a/src/context/resolution.ml +++ b/src/context/resolution.ml @@ -2,7 +2,7 @@ open Globals open Type type resolution_kind = - | RTypeImport of string* module_type + | RTypeImport of string * module_type | RClassFieldImport of string * tclass * tclass_field | RAbstractFieldImport of string * tabstract * tclass * tclass_field | REnumConstructorImport of string * tenum * tenum_field @@ -107,8 +107,7 @@ class resolution_list (id : string list) = object(self) l <- loop [] l; end - method resolve (i : string) : resolution = - self#resolve_lazies; + method resolve' (i : string) : resolution = let rec loop l = match l with | [] -> raise Not_found @@ -148,6 +147,10 @@ class resolution_list (id : string list) = object(self) in loop l + method resolve (i : string) : resolution = + self#resolve_lazies; + self#resolve' i + method expand_enum_constructors (mt : module_type) = match mt with | TAbstractDecl ({a_impl = Some c} as a) when a.a_enum -> Some (class_statics_resolution c null_pos) diff --git a/src/typing/typeloadFields.ml b/src/typing/typeloadFields.ml index e964d3ae775..3ac9309f686 100644 --- a/src/typing/typeloadFields.ml +++ b/src/typing/typeloadFields.ml @@ -460,10 +460,39 @@ let build_enum_abstract ctx c a fields p = EVars [mk_evar ~t:(CTAnonymous fields,p) ("",null_pos)],p let apply_macro ctx mode path el p = - let cpath, meth = (match List.rev (ExtString.String.nsplit path ".") with - | meth :: name :: pack -> (List.rev pack,name), meth - | _ -> raise_typing_error "Invalid macro path" p - ) in + let cpath, meth = match List.rev (ExtString.String.nsplit path ".") with + | [fname;tname] -> + begin try + let res = ctx.m.import_resolution#resolve' tname in + begin match res.r_kind with + | RTypeImport(_,mt) -> + (t_path mt),fname + | _ -> + raise_typing_error "Invalid macro path" p + end; + + with Not_found -> + ([],tname),fname + end + | [fname;tname;mname] -> + begin try + let res = ctx.m.import_resolution#resolve' mname in + begin match res.r_kind with + | RTypeImport(_,mt) -> + let path = t_path mt in + (fst path @ [snd path],tname),fname + | _ -> + raise_typing_error "Invalid macro path" p + end; + + with Not_found -> + ([mname],tname),fname + end + | meth :: name :: pack -> + (List.rev pack,name), meth + | _ -> + raise_typing_error "Invalid macro path" p + in ctx.g.do_macro ctx mode cpath meth el p let build_module_def ctx mt meta fvars fbuild = diff --git a/tests/misc/projects/Issue11373/Main.hx b/tests/misc/projects/Issue11373/Main.hx new file mode 100644 index 00000000000..7af488a0f9e --- /dev/null +++ b/tests/misc/projects/Issue11373/Main.hx @@ -0,0 +1,18 @@ +import pack.BuildMacro; +import pack.BuildMacro as BM; + +@:build(BuildMacro.build()) +class ClassImport {} + +@:build(BuildMacro.BuildMacro.build()) +class SubClassImport {} + +@:build(BM.build()) +class ClassImportAlias {} + +@:build(BM.BuildMacro.build()) +class SubClassImportAlias {} + +function main() { + trace(BuildMacro.report()); +} \ No newline at end of file diff --git a/tests/misc/projects/Issue11373/compile.hxml b/tests/misc/projects/Issue11373/compile.hxml new file mode 100644 index 00000000000..b30a755894b --- /dev/null +++ b/tests/misc/projects/Issue11373/compile.hxml @@ -0,0 +1,2 @@ +--main Main +--interp \ No newline at end of file diff --git a/tests/misc/projects/Issue11373/compile.hxml.stdout b/tests/misc/projects/Issue11373/compile.hxml.stdout new file mode 100644 index 00000000000..a2290538b2f --- /dev/null +++ b/tests/misc/projects/Issue11373/compile.hxml.stdout @@ -0,0 +1 @@ +Main.hx:17: ClassImport, ClassImportAlias, SubClassImport, SubClassImportAlias \ No newline at end of file diff --git a/tests/misc/projects/Issue11373/pack/BuildMacro.hx b/tests/misc/projects/Issue11373/pack/BuildMacro.hx new file mode 100644 index 00000000000..5237d9e98fe --- /dev/null +++ b/tests/misc/projects/Issue11373/pack/BuildMacro.hx @@ -0,0 +1,21 @@ +package pack; + +import haxe.macro.Context; + +class BuildMacro { + #if macro + static var builtTypes = []; + #end + + static public function build():Array { + #if macro + builtTypes.push("" + Context.getLocalClass()); + #end + return null; + } + + macro static public function report() { + builtTypes.sort(Reflect.compare); + return macro $v{builtTypes.join(", ")}; + } +} \ No newline at end of file