Replace enum fields idents with syms (#14048)
* replace enum fields idents with syms * Trigger build Co-authored-by: cooldome <ariabushenko@bk.ru>
This commit is contained in:
parent
218cbf0e09
commit
5db0bb744c
2 changed files with 13 additions and 1 deletions
|
|
@ -60,6 +60,10 @@
|
||||||
x.val = nil
|
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
|
## Compiler changes
|
||||||
|
|
||||||
- Specific warnings can now be turned into errors via `--warningAsError[X]:on|off`.
|
- Specific warnings can now be turned into errors via `--warningAsError[X]:on|off`.
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
|
||||||
counter, x: BiggestInt
|
counter, x: BiggestInt
|
||||||
e: PSym
|
e: PSym
|
||||||
base: PType
|
base: PType
|
||||||
|
identToReplace: ptr PNode
|
||||||
counter = 0
|
counter = 0
|
||||||
base = nil
|
base = nil
|
||||||
result = newOrPrevType(tyEnum, prev, c)
|
result = newOrPrevType(tyEnum, prev, c)
|
||||||
|
|
@ -83,9 +84,11 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
|
||||||
of nkEnumFieldDef:
|
of nkEnumFieldDef:
|
||||||
if n[i][0].kind == nkPragmaExpr:
|
if n[i][0].kind == nkPragmaExpr:
|
||||||
e = newSymS(skEnumField, n[i][0][0], c)
|
e = newSymS(skEnumField, n[i][0][0], c)
|
||||||
|
identToReplace = addr n[i][0][0]
|
||||||
pragma(c, e, n[i][0][1], enumFieldPragmas)
|
pragma(c, e, n[i][0][1], enumFieldPragmas)
|
||||||
else:
|
else:
|
||||||
e = newSymS(skEnumField, n[i][0], c)
|
e = newSymS(skEnumField, n[i][0], c)
|
||||||
|
identToReplace = addr n[i][0]
|
||||||
var v = semConstExpr(c, n[i][1])
|
var v = semConstExpr(c, n[i][1])
|
||||||
var strVal: PNode = nil
|
var strVal: PNode = nil
|
||||||
case skipTypes(v.typ, abstractInst-{tyTypeDesc}).kind
|
case skipTypes(v.typ, abstractInst-{tyTypeDesc}).kind
|
||||||
|
|
@ -118,19 +121,24 @@ proc semEnum(c: PContext, n: PNode, prev: PType): PType =
|
||||||
e = n[i].sym
|
e = n[i].sym
|
||||||
of nkIdent, nkAccQuoted:
|
of nkIdent, nkAccQuoted:
|
||||||
e = newSymS(skEnumField, n[i], c)
|
e = newSymS(skEnumField, n[i], c)
|
||||||
|
identToReplace = addr n[i]
|
||||||
of nkPragmaExpr:
|
of nkPragmaExpr:
|
||||||
e = newSymS(skEnumField, n[i][0], c)
|
e = newSymS(skEnumField, n[i][0], c)
|
||||||
pragma(c, e, n[i][1], enumFieldPragmas)
|
pragma(c, e, n[i][1], enumFieldPragmas)
|
||||||
|
identToReplace = addr n[i][0]
|
||||||
else:
|
else:
|
||||||
illFormedAst(n[i], c.config)
|
illFormedAst(n[i], c.config)
|
||||||
e.typ = result
|
e.typ = result
|
||||||
e.position = int(counter)
|
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 e.position == 0: hasNull = true
|
||||||
if result.sym != nil and sfExported in result.sym.flags:
|
if result.sym != nil and sfExported in result.sym.flags:
|
||||||
incl(e.flags, sfUsed)
|
incl(e.flags, sfUsed)
|
||||||
incl(e.flags, sfExported)
|
incl(e.flags, sfExported)
|
||||||
if not isPure: strTableAdd(c.module.tab, e)
|
if not isPure: strTableAdd(c.module.tab, e)
|
||||||
result.n.add newSymNode(e)
|
result.n.add symNode
|
||||||
styleCheckDef(c.config, e)
|
styleCheckDef(c.config, e)
|
||||||
onDef(e.info, e)
|
onDef(e.info, e)
|
||||||
if sfGenSym notin e.flags:
|
if sfGenSym notin e.flags:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue