From 0771e898735298da85ff37074f7700761ccf078e Mon Sep 17 00:00:00 2001 From: shmyga Date: Fri, 15 Mar 2019 16:16:29 +0300 Subject: [PATCH] [macro] update ProvideMacro --- src/main/haxework/macro/ProvideMacro.hx | 36 ++++++++++++++---------- src/main/haxework/macro/TemplateMacro.hx | 5 +--- src/main/haxework/macro/Util.hx | 18 ++++++++++-- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/main/haxework/macro/ProvideMacro.hx b/src/main/haxework/macro/ProvideMacro.hx index 9f426b7..fdc0006 100644 --- a/src/main/haxework/macro/ProvideMacro.hx +++ b/src/main/haxework/macro/ProvideMacro.hx @@ -3,59 +3,65 @@ package haxework.macro; import haxe.macro.Context; import haxe.macro.Expr; - class ProvideMacro { + private static var metaName = ":provide"; + public static function has(field:Field):Bool { - return Util.hasFieldMeta(":provide", field); + return Util.hasFieldMeta(metaName, field); } - private var field:Field; + private var meta:MetadataEntry; public function new(field:Field) { this.field = field; + this.meta = Util.getFieldMeta(metaName, field); } public function apply():Array { var result:Array = []; var type:ComplexType = switch field.kind { - case FieldType.FVar(t): t; + case FVar(t): t; default: null; } var name:String = switch type { - case ComplexType.TPath(p): p.name; + case TPath(p): p.name; default: null; } + var provideType:String = meta.params.length == 0 ? null : Util.getExprString(meta.params[0].expr); var isStatic = Lambda.exists(field.access, function(a: Access) return a == AStatic); result.push({ name: field.name, - access: isStatic ? [Access.APublic, Access.AStatic] : [Access.APublic], + access: isStatic ? [APublic, AStatic] : [APublic], pos: field.pos, - kind: FieldType.FProp('get', 'set', type) + kind: FProp('get', 'set', type), }); - var access = [Access.APrivate, Access.AInline]; - if (isStatic) access.push(Access.AStatic); + var access = [APrivate, AInline]; + if (isStatic) access.push(AStatic); + var args = [name]; + if (provideType != null) args.push('"${provideType}"'); result.push({ name: 'get_${field.name}', access: access, pos: field.pos, - kind: FieldType.FFun({ + kind: FFun({ args: [], - expr: Context.parse('return haxework.provider.Provider.get(${name})', field.pos), + expr: Context.parse('return haxework.provider.Provider.get(${args.join(',')})', field.pos), params: [], - ret: type + ret: type, }) }); + args.insert(1, "value"); result.push({ name: 'set_${field.name}', access: access, pos: field.pos, - kind: FieldType.FFun({ + kind: FFun({ args: [{name: 'value', type: type}], - expr: Context.parse('{haxework.provider.Provider.set(${name}, value); return value;}', field.pos), + expr: Context.parse('{haxework.provider.Provider.set(${args.join(',')}); return value;}', field.pos), params: [], - ret: type + ret: type, }) }); return result; diff --git a/src/main/haxework/macro/TemplateMacro.hx b/src/main/haxework/macro/TemplateMacro.hx index 59116f5..c30c17e 100644 --- a/src/main/haxework/macro/TemplateMacro.hx +++ b/src/main/haxework/macro/TemplateMacro.hx @@ -205,10 +205,7 @@ class TemplateMacro { for (field in fields) if (field.meta != null) { for (meta in field.meta) { if (meta.name == ':view') { - var viewId:String = meta.params.length == 0 ? field.name : switch meta.params[0].expr { - case ExprDef.EConst(Constant.CString(value)): value; - default: null; - } + var viewId:String = meta.params.length == 0 ? field.name : Util.getExprString(meta.params[0].expr); result.set(viewId, field.name); } } diff --git a/src/main/haxework/macro/Util.hx b/src/main/haxework/macro/Util.hx index 0bcd427..87e8859 100644 --- a/src/main/haxework/macro/Util.hx +++ b/src/main/haxework/macro/Util.hx @@ -7,8 +7,8 @@ import haxe.macro.Expr; class Util { public static function getMetaParams(meta:MetadataEntry):Array { - return meta.params.map(function(param:Expr) return switch(param.expr) { - case ExprDef.EConst(Constant.CString(value)): value; + return meta.params.map(function(param:Expr) return switch param.expr { + case EConst(CString(value)): value; case _: null; }); } @@ -30,4 +30,18 @@ class Util { } return false; } + + public static function getFieldMeta(metaName:String, field:Field):MetadataEntry { + for (md in field.meta) if (md.name == metaName) { + return md; + } + return null; + } + + public static function getExprString(expr:ExprDef) { + return switch expr { + case EConst(CString(value)): value; + case _: null; + } + } }