fixes ttypeselectors

This commit is contained in:
Zahary Karadjov 2012-09-28 14:30:19 +03:00
commit 2aabae702d
3 changed files with 14 additions and 8 deletions

View file

@ -114,6 +114,16 @@ proc semConstExpr(c: PContext, n: PNode): PNode =
include hlo, seminst, semcall include hlo, seminst, semcall
proc symFromType(t: PType, info: TLineInfo): PSym =
if t.sym != nil: return t.sym
result = newSym(skType, getIdent"AnonType", t.owner, info)
result.flags.incl sfAnon
result.typ = t
proc symNodeFromType(c: PContext, t: PType, info: TLineInfo): PNode =
result = newSymNode(symFromType(t, info), info)
result.typ = makeTypeDesc(c, t)
proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode = proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode =
inc(evalTemplateCounter) inc(evalTemplateCounter)
if evalTemplateCounter > 100: if evalTemplateCounter > 100:
@ -133,7 +143,8 @@ proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode =
result = semStmt(c, result) result = semStmt(c, result)
of tyTypeDesc: of tyTypeDesc:
if n.kind == nkStmtList: result.kind = nkStmtListType if n.kind == nkStmtList: result.kind = nkStmtListType
result.typ = semTypeNode(c, result, nil) var typ = semTypeNode(c, result, nil)
result = symNodeFromType(c, typ, n.info)
else: else:
result = semExpr(c, result) result = semExpr(c, result)
result = fitNode(c, s.typ.sons[0], result) result = fitNode(c, s.typ.sons[0], result)

View file

@ -1573,11 +1573,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode =
result = semExpr(c, n.sons[0], flags) result = semExpr(c, n.sons[0], flags)
of nkTypeOfExpr: of nkTypeOfExpr:
var typ = semTypeNode(c, n, nil).skipTypes({tyTypeDesc}) var typ = semTypeNode(c, n, nil).skipTypes({tyTypeDesc})
typ = makeTypedesc(c, typ) result = symNodeFromType(c, typ, n.info)
var sym = newSym(skType, getIdent"TypeOfExpr",
typ.owner, n.info).linkTo(typ)
sym.flags.incl(sfAnon)
result = newSymNode(sym, n.info)
of nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand, nkCallStrLit: of nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand, nkCallStrLit:
# check if it is an expression macro: # check if it is an expression macro:
checkMinSonsLen(n, 1) checkMinSonsLen(n, 1)

View file

@ -9,8 +9,7 @@ template selectType(x: int): typeDesc =
template simpleTypeTempl: typeDesc = template simpleTypeTempl: typeDesc =
string string
macro typeFromMacro(s: expr): typeDesc = macro typeFromMacro: typedesc = string
result = newIdentNode"string"
proc t1*(x: int): simpleTypeTempl() = proc t1*(x: int): simpleTypeTempl() =
result = "test" result = "test"