add default field support for object in ARC/ORC (#20480)
* fresh start * add cpp target * add result support * add nimPreviewRangeDefault * reduce * use orc * refactor common parts * add tuple support * add testcase for tuple * cleanup; fixes nimsuggest tests * there is something wrong with cpp * remove * add support for seqs * fixes style * addd initial distinct support * remove links * typo * fixes tuple defaults * add rangedefault * add cpp support * fixes one more bugs * add more hasDefaults * fixes ordinal types * add testcase for #16744 * add testcase for #3608 * fixes docgen * small fix * recursive * fixes * cleanup and remove tuple support * fixes nimsuggest * fixes generics procs * refactor * increases timeout * refactor hasDefault * zero default; disable i386 * add tuples back * fixes bugs * fixes tuple * add more tests * fix one more bug regarding tuples * more tests and cleanup * remove messy distinct types which must be initialized by original types * add tests * fixes zero default * fixes grammar * fixes tests * fixes tests * fixes tests * fixes comments * fixes and add testcase * undo default values for results Co-authored-by: flywind <43030857+xflywind@users.noreply.github.com>
This commit is contained in:
parent
6cf0727192
commit
f89ba2c951
23 changed files with 727 additions and 80 deletions
|
|
@ -23,7 +23,6 @@ const
|
|||
errXExpectsOneTypeParam = "'$1' expects one type parameter"
|
||||
errArrayExpectsTwoTypeParams = "array expects two type parameters"
|
||||
errInvalidVisibilityX = "invalid visibility: '$1'"
|
||||
errInitHereNotAllowed = "initialization not allowed here"
|
||||
errXCannotBeAssignedTo = "'$1' cannot be assigned to"
|
||||
errIteratorNotAllowed = "iterators can only be defined at the module's top level"
|
||||
errXNeedsReturnType = "$1 needs a return type"
|
||||
|
|
@ -293,17 +292,18 @@ proc semRange(c: PContext, n: PNode, prev: PType): PType =
|
|||
if n.len == 2:
|
||||
if isRange(n[1]):
|
||||
result = semRangeAux(c, n[1], prev)
|
||||
let n = result.n
|
||||
if n[0].kind in {nkCharLit..nkUInt64Lit} and n[0].intVal > 0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[1].kind in {nkCharLit..nkUInt64Lit} and n[1].intVal < 0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[0].kind in {nkFloatLit..nkFloat64Lit} and
|
||||
n[0].floatVal > 0.0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[1].kind in {nkFloatLit..nkFloat64Lit} and
|
||||
n[1].floatVal < 0.0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
if not isDefined(c.config, "nimPreviewRangeDefault"):
|
||||
let n = result.n
|
||||
if n[0].kind in {nkCharLit..nkUInt64Lit} and n[0].intVal > 0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[1].kind in {nkCharLit..nkUInt64Lit} and n[1].intVal < 0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[0].kind in {nkFloatLit..nkFloat64Lit} and
|
||||
n[0].floatVal > 0.0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
elif n[1].kind in {nkFloatLit..nkFloat64Lit} and
|
||||
n[1].floatVal < 0.0:
|
||||
incl(result.flags, tfRequiresInit)
|
||||
else:
|
||||
if n[1].kind == nkInfix and considerQuotedIdent(c, n[1][0]).s == "..<":
|
||||
localError(c.config, n[0].info, "range types need to be constructed with '..', '..<' is not supported")
|
||||
|
|
@ -481,13 +481,19 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType =
|
|||
var a = n[i]
|
||||
if (a.kind != nkIdentDefs): illFormedAst(a, c.config)
|
||||
checkMinSonsLen(a, 3, c.config)
|
||||
if a[^2].kind != nkEmpty:
|
||||
var hasDefaultField = a[^1].kind != nkEmpty
|
||||
if hasDefaultField:
|
||||
a[^1] = semConstExpr(c, a[^1])
|
||||
typ = a[^1].typ
|
||||
elif a[^2].kind != nkEmpty:
|
||||
typ = semTypeNode(c, a[^2], nil)
|
||||
if c.graph.config.isDefined("nimPreviewRangeDefault") and typ.skipTypes(abstractInst).kind == tyRange:
|
||||
a[^1] = newIntNode(nkIntLit, firstOrd(c.config, typ))
|
||||
a[^1].typ = typ
|
||||
hasDefaultField = true
|
||||
else:
|
||||
localError(c.config, a.info, errTypeExpected)
|
||||
typ = errorType(c)
|
||||
if a[^1].kind != nkEmpty:
|
||||
localError(c.config, a[^1].info, errInitHereNotAllowed)
|
||||
for j in 0..<a.len - 2:
|
||||
var field = newSymG(skField, a[j], c)
|
||||
field.typ = typ
|
||||
|
|
@ -496,7 +502,11 @@ proc semTuple(c: PContext, n: PNode, prev: PType): PType =
|
|||
if containsOrIncl(check, field.name.id):
|
||||
localError(c.config, a[j].info, "attempt to redefine: '" & field.name.s & "'")
|
||||
else:
|
||||
result.n.add newSymNode(field)
|
||||
let fSym = newSymNode(field)
|
||||
if hasDefaultField:
|
||||
fSym.sym.ast = a[^1]
|
||||
fSym.sym.ast.flags.incl nfUseDefaultField
|
||||
result.n.add fSym
|
||||
addSonSkipIntLit(result, typ, c.idgen)
|
||||
styleCheckDef(c, a[j].info, field)
|
||||
onDef(field.info, field)
|
||||
|
|
@ -805,14 +815,21 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int,
|
|||
var a: PNode
|
||||
if father.kind != nkRecList and n.len >= 4: a = newNodeI(nkRecList, n.info)
|
||||
else: a = newNodeI(nkEmpty, n.info)
|
||||
if n[^1].kind != nkEmpty:
|
||||
localError(c.config, n[^1].info, errInitHereNotAllowed)
|
||||
var typ: PType
|
||||
if n[^2].kind == nkEmpty:
|
||||
var hasDefaultField = n[^1].kind != nkEmpty
|
||||
if hasDefaultField:
|
||||
n[^1] = semConstExpr(c, n[^1])
|
||||
typ = n[^1].typ
|
||||
propagateToOwner(rectype, typ)
|
||||
elif n[^2].kind == nkEmpty:
|
||||
localError(c.config, n.info, errTypeExpected)
|
||||
typ = errorType(c)
|
||||
else:
|
||||
typ = semTypeNode(c, n[^2], nil)
|
||||
if c.graph.config.isDefined("nimPreviewRangeDefault") and typ.skipTypes(abstractInst).kind == tyRange:
|
||||
n[^1] = newIntNode(nkIntLit, firstOrd(c.config, typ))
|
||||
n[^1].typ = typ
|
||||
hasDefaultField = true
|
||||
propagateToOwner(rectype, typ)
|
||||
var fieldOwner = if c.inGenericContext > 0: c.getCurrOwner
|
||||
else: rectype.sym
|
||||
|
|
@ -834,8 +851,12 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var IntSet, pos: var int,
|
|||
inc(pos)
|
||||
if containsOrIncl(check, f.name.id):
|
||||
localError(c.config, info, "attempt to redefine: '" & f.name.s & "'")
|
||||
if a.kind == nkEmpty: father.add newSymNode(f)
|
||||
else: a.add newSymNode(f)
|
||||
let fSym = newSymNode(f)
|
||||
if hasDefaultField:
|
||||
fSym.sym.ast = n[^1]
|
||||
fSym.sym.ast.flags.incl nfUseDefaultField
|
||||
if a.kind == nkEmpty: father.add fSym
|
||||
else: a.add fSym
|
||||
styleCheckDef(c, f)
|
||||
onDef(f.info, f)
|
||||
if a.kind != nkEmpty: father.add a
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue