Use std lib for parameter substitution in fields.
This commit is contained in:
@@ -60,7 +60,7 @@ class Types {
|
|||||||
static public function getFields(t:Type, ?substituteParams = true)
|
static public function getFields(t:Type, ?substituteParams = true)
|
||||||
return
|
return
|
||||||
switch (reduce(t)) {
|
switch (reduce(t)) {
|
||||||
case TInst(c, _):
|
case TInst(c, params):
|
||||||
var id = c.toString(),
|
var id = c.toString(),
|
||||||
c = c.get();
|
c = c.get();
|
||||||
if (!fieldsCache.exists(id)) {
|
if (!fieldsCache.exists(id)) {
|
||||||
@@ -72,61 +72,9 @@ class Types {
|
|||||||
if (substituteParams && ret.isSuccess()) {
|
if (substituteParams && ret.isSuccess()) {
|
||||||
var e = ECheckType(macro null, toComplex(t)).at();
|
var e = ECheckType(macro null, toComplex(t)).at();
|
||||||
var fields = Reflect.copy(ret.sure());
|
var fields = Reflect.copy(ret.sure());
|
||||||
ret = Success(fields);
|
|
||||||
|
|
||||||
for (field in fields)
|
for (field in fields)
|
||||||
if (field.isPublic) {
|
field.type = haxe.macro.TypeTools.applyTypeParameters(field.type, c.params, params);
|
||||||
var member = e.field(field.name, e.pos);
|
|
||||||
field.type =
|
|
||||||
switch (member.typeof()) {
|
|
||||||
case Success(t): t;
|
|
||||||
case Failure(f):
|
|
||||||
switch reduce(field.type) {
|
|
||||||
case TFun(args, _):
|
|
||||||
var fArgs = [],
|
|
||||||
fParams = [];
|
|
||||||
for (a in args)
|
|
||||||
fArgs.push(a.name.toArg());
|
|
||||||
var f = (macro null).func(fArgs, false);
|
|
||||||
f.expr = EReturn(member.call(f.getArgIdents(), e.pos)).at(e.pos);
|
|
||||||
f.asExpr(e.pos).typeof().sure();
|
|
||||||
default:
|
|
||||||
f.throwSelf();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
var kind =
|
|
||||||
switch (field.kind) {
|
|
||||||
case FVar(read, write):
|
|
||||||
FProp(accessToName(read), accessToName(write, true), field.pos.makeBlankType());
|
|
||||||
default:
|
|
||||||
switch (reduce(field.type)) {
|
|
||||||
case TFun(args, _):
|
|
||||||
var argList = [];
|
|
||||||
for (arg in args)
|
|
||||||
argList.push(
|
|
||||||
arg.name.toArg(field.pos.makeBlankType())
|
|
||||||
);
|
|
||||||
FFun({
|
|
||||||
args : argList,
|
|
||||||
ret: field.pos.makeBlankType(),
|
|
||||||
expr: null,
|
|
||||||
params: []
|
|
||||||
});
|
|
||||||
default: null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (kind != null) {
|
|
||||||
var f = {
|
|
||||||
name: field.name,
|
|
||||||
pos: field.pos,
|
|
||||||
kind: kind,
|
|
||||||
access: [APrivate]
|
|
||||||
};
|
|
||||||
field.type = ECheckType(e, TAnonymous([f])).at(e.pos).field(field.name, e.pos).typeof().sure();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ret;
|
ret;
|
||||||
case TAnonymous(anon): Success(anon.get().fields);
|
case TAnonymous(anon): Success(anon.get().fields);
|
||||||
|
|||||||
Reference in New Issue
Block a user