|
@@ -1608,29 +1608,32 @@ let init_class ctx c p context_init herits fields =
|
|
in
|
|
in
|
|
let fd = if not is_macro then
|
|
let fd = if not is_macro then
|
|
fd
|
|
fd
|
|
- else if ctx.in_macro then
|
|
|
|
- let texpr = CTPath { tpackage = ["haxe";"macro"]; tname = "Expr"; tparams = []; tsub = None } in
|
|
|
|
- {
|
|
|
|
- f_params = fd.f_params;
|
|
|
|
- f_type = (match fd.f_type with None -> Some texpr | t -> t);
|
|
|
|
- f_args = List.map (fun (a,o,t,e) -> a,o,(match t with None -> Some texpr | _ -> t),e) fd.f_args;
|
|
|
|
- f_expr = fd.f_expr;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- let tdyn = Some (CTPath { tpackage = []; tname = "Dynamic"; tparams = []; tsub = None }) in
|
|
|
|
- let to_dyn = function
|
|
|
|
- | { tpackage = ["haxe";"macro"]; tname = "Expr"; tsub = Some ("ExprOf"); tparams = [TPType t] } -> Some t
|
|
|
|
- | { tpackage = []; tname = ("ExprOf"); tsub = None; tparams = [TPType t] } -> Some t
|
|
|
|
- | { tpackage = ["haxe"]; tname = ("PosInfos"); tsub = None; tparams = [] } -> error "haxe.PosInfos is not allowed on macro functions, use Context.currentPos() instead" p
|
|
|
|
- | _ -> tdyn
|
|
|
|
- in
|
|
|
|
- {
|
|
|
|
- f_params = fd.f_params;
|
|
|
|
- f_type = (match fd.f_type with Some (CTPath t) -> to_dyn t | _ -> tdyn);
|
|
|
|
- f_args = List.map (fun (a,o,t,_) -> a,o,(match t with Some (CTPath t) -> to_dyn t | _ -> tdyn),None) fd.f_args;
|
|
|
|
- f_expr = None;
|
|
|
|
- }
|
|
|
|
- in
|
|
|
|
|
|
+ else begin
|
|
|
|
+ (* a class with a macro cannot be extern in macro context (issue #2015) *)
|
|
|
|
+ c.cl_extern <- false;
|
|
|
|
+ if ctx.in_macro then
|
|
|
|
+ let texpr = CTPath { tpackage = ["haxe";"macro"]; tname = "Expr"; tparams = []; tsub = None } in
|
|
|
|
+ {
|
|
|
|
+ f_params = fd.f_params;
|
|
|
|
+ f_type = (match fd.f_type with None -> Some texpr | t -> t);
|
|
|
|
+ f_args = List.map (fun (a,o,t,e) -> a,o,(match t with None -> Some texpr | _ -> t),e) fd.f_args;
|
|
|
|
+ f_expr = fd.f_expr;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ let tdyn = Some (CTPath { tpackage = []; tname = "Dynamic"; tparams = []; tsub = None }) in
|
|
|
|
+ let to_dyn = function
|
|
|
|
+ | { tpackage = ["haxe";"macro"]; tname = "Expr"; tsub = Some ("ExprOf"); tparams = [TPType t] } -> Some t
|
|
|
|
+ | { tpackage = []; tname = ("ExprOf"); tsub = None; tparams = [TPType t] } -> Some t
|
|
|
|
+ | { tpackage = ["haxe"]; tname = ("PosInfos"); tsub = None; tparams = [] } -> error "haxe.PosInfos is not allowed on macro functions, use Context.currentPos() instead" p
|
|
|
|
+ | _ -> tdyn
|
|
|
|
+ in
|
|
|
|
+ {
|
|
|
|
+ f_params = fd.f_params;
|
|
|
|
+ f_type = (match fd.f_type with Some (CTPath t) -> to_dyn t | _ -> tdyn);
|
|
|
|
+ f_args = List.map (fun (a,o,t,_) -> a,o,(match t with Some (CTPath t) -> to_dyn t | _ -> tdyn),None) fd.f_args;
|
|
|
|
+ f_expr = None;
|
|
|
|
+ }
|
|
|
|
+ end in
|
|
let parent = (if not stat then get_parent c name else None) in
|
|
let parent = (if not stat then get_parent c name else None) in
|
|
let dynamic = List.mem ADynamic f.cff_access || (match parent with Some { cf_kind = Method MethDynamic } -> true | _ -> false) in
|
|
let dynamic = List.mem ADynamic f.cff_access || (match parent with Some { cf_kind = Method MethDynamic } -> true | _ -> false) in
|
|
if inline && dynamic then error "You can't have both 'inline' and 'dynamic'" p;
|
|
if inline && dynamic then error "You can't have both 'inline' and 'dynamic'" p;
|