From 5db0bb744c08feb0c2c17ecd9cba12c276cde374 Mon Sep 17 00:00:00 2001 From: cooldome Date: Tue, 21 Apr 2020 19:12:32 +0100 Subject: [PATCH] Replace enum fields idents with syms (#14048) * replace enum fields idents with syms * Trigger build Co-authored-by: cooldome --- changelog.md | 4 ++++ compiler/semtypes.nim | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index dbe1f89cc9..c30abab9f7 100644 --- a/changelog.md +++ b/changelog.md @@ -60,6 +60,10 @@ x.val = nil ``` +- getImpl() on enum type symbols now returns field syms instead of idents. This helps + with writing typed macros. Old behavior for backwards compatiblity can be restored + with command line switch `--oldast`. + ## Compiler changes - Specific warnings can now be turned into errors via `--warningAsError[X]:on|off`. diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim index 7fe23eb8ec..7ede8e7926 100644 --- a/compiler/semtypes.nim +++ b/compiler/semtypes.nim @@ -62,6 +62,7 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType = counter, x: BiggestInt e: PSym base: PType + identToReplace: ptr PNode counter = 0 base = nil result = newOrPrevType(tyEnum, prev, c) @@ -83,9 +84,11 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType = of nkEnumFieldDef: if n[i][0].kind == nkPragmaExpr: e = newSymS(skEnumField, n[i][0][0], c) + identToReplace = addr n[i][0][0] pragma(c, e, n[i][0][1], enumFieldPragmas) else: e = newSymS(skEnumField, n[i][0], c) + identToReplace = addr n[i][0] var v = semConstExpr(c, n[i][1]) var strVal: PNode = nil case skipTypes(v.typ, abstractInst-{tyTypeDesc}).kind @@ -118,19 +121,24 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType = e = n[i].sym of nkIdent, nkAccQuoted: e = newSymS(skEnumField, n[i], c) + identToReplace = addr n[i] of nkPragmaExpr: e = newSymS(skEnumField, n[i][0], c) pragma(c, e, n[i][1], enumFieldPragmas) + identToReplace = addr n[i][0] else: illFormedAst(n[i], c.config) e.typ = result e.position = int(counter) + let symNode = newSymNode(e) + if optOldAst notin c.config.options and identToReplace != nil: + identToReplace[] = symNode if e.position == 0: hasNull = true if result.sym != nil and sfExported in result.sym.flags: incl(e.flags, sfUsed) incl(e.flags, sfExported) if not isPure: strTableAdd(c.module.tab, e) - result.n.add newSymNode(e) + result.n.add symNode styleCheckDef(c.config, e) onDef(e.info, e) if sfGenSym notin e.flags: