From 2aabae702d558acfb95003fe6a2aa7ae300f6ed4 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Fri, 28 Sep 2012 14:30:19 +0300 Subject: [PATCH] fixes ttypeselectors --- compiler/sem.nim | 13 ++++++++++++- compiler/semexprs.nim | 6 +----- tests/compile/ttypeselectors.nim | 3 +-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/compiler/sem.nim b/compiler/sem.nim index 315ff92cda..397581f63e 100755 --- a/compiler/sem.nim +++ b/compiler/sem.nim @@ -114,6 +114,16 @@ proc semConstExpr(c: PContext, n: PNode): PNode = 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 = inc(evalTemplateCounter) if evalTemplateCounter > 100: @@ -133,7 +143,8 @@ proc semAfterMacroCall(c: PContext, n: PNode, s: PSym): PNode = result = semStmt(c, result) of tyTypeDesc: 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: result = semExpr(c, result) result = fitNode(c, s.typ.sons[0], result) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 5dedc9b821..7c147e7786 100755 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1573,11 +1573,7 @@ proc semExpr(c: PContext, n: PNode, flags: TExprFlags = {}): PNode = result = semExpr(c, n.sons[0], flags) of nkTypeOfExpr: var typ = semTypeNode(c, n, nil).skipTypes({tyTypeDesc}) - typ = makeTypedesc(c, typ) - var sym = newSym(skType, getIdent"TypeOfExpr", - typ.owner, n.info).linkTo(typ) - sym.flags.incl(sfAnon) - result = newSymNode(sym, n.info) + result = symNodeFromType(c, typ, n.info) of nkCall, nkInfix, nkPrefix, nkPostfix, nkCommand, nkCallStrLit: # check if it is an expression macro: checkMinSonsLen(n, 1) diff --git a/tests/compile/ttypeselectors.nim b/tests/compile/ttypeselectors.nim index 9ed7e2008b..cca643e1fe 100644 --- a/tests/compile/ttypeselectors.nim +++ b/tests/compile/ttypeselectors.nim @@ -9,8 +9,7 @@ template selectType(x: int): typeDesc = template simpleTypeTempl: typeDesc = string -macro typeFromMacro(s: expr): typeDesc = - result = newIdentNode"string" +macro typeFromMacro: typedesc = string proc t1*(x: int): simpleTypeTempl() = result = "test"