explicit indices in array literals

This commit is contained in:
Araq 2011-01-16 16:22:23 +01:00
commit 0f743e0183
8 changed files with 60 additions and 3 deletions

View file

@ -94,6 +94,7 @@ type
errXCannotBeInParamDecl, errPragmaOnlyInHeaderOfProc, errImplOfXNotAllowed, errXCannotBeInParamDecl, errPragmaOnlyInHeaderOfProc, errImplOfXNotAllowed,
errImplOfXexpected, errNoSymbolToBorrowFromFound, errDiscardValue, errImplOfXexpected, errNoSymbolToBorrowFromFound, errDiscardValue,
errInvalidDiscard, errIllegalConvFromXtoY, errCannotBindXTwice, errInvalidDiscard, errIllegalConvFromXtoY, errCannotBindXTwice,
errInvalidOrderInArrayConstructor,
errInvalidOrderInEnumX, errEnumXHasWholes, errExceptExpected, errInvalidTry, errInvalidOrderInEnumX, errEnumXHasWholes, errExceptExpected, errInvalidTry,
errOptionExpected, errXisNoLabel, errNotAllCasesCovered, errOptionExpected, errXisNoLabel, errNotAllCasesCovered,
errUnkownSubstitionVar, errComplexStmtRequiresInd, errXisNotCallable, errUnkownSubstitionVar, errComplexStmtRequiresInd, errXisNotCallable,
@ -214,6 +215,7 @@ const
"value returned by statement has to be discarded", "value returned by statement has to be discarded",
"statement returns no value that can be discarded", "statement returns no value that can be discarded",
"conversion from $1 to $2 is invalid", "cannot bind parameter \'$1\' twice", "conversion from $1 to $2 is invalid", "cannot bind parameter \'$1\' twice",
"invalid order in array constructor",
"invalid order in enum \'$1\'", "enum \'$1\' has wholes", "invalid order in enum \'$1\'", "enum \'$1\' has wholes",
"\'except\' or \'finally\' expected", "\'except\' or \'finally\' expected",
"after catch all \'except\' or \'finally\' no section may follow", "after catch all \'except\' or \'finally\' no section may follow",

View file

@ -260,11 +260,29 @@ proc semArrayConstr(c: PContext, n: PNode): PNode =
if sonsLen(n) == 0: if sonsLen(n) == 0:
addSon(result.typ, newTypeS(tyEmpty, c)) # needs an empty basetype! addSon(result.typ, newTypeS(tyEmpty, c)) # needs an empty basetype!
else: else:
addSon(result, semExprWithType(c, n.sons[0])) var x = n.sons[0]
var lastIndex: biggestInt = 0
var indexType = getSysType(tyInt)
if x.kind == nkExprColonExpr:
var idx = semConstExpr(c, x.sons[0])
lastIndex = getOrdValue(idx)
indexType = idx.typ
x = x.sons[1]
addSon(result, semExprWithType(c, x))
var typ = skipTypes(result.sons[0].typ, {tyGenericInst, tyVar, tyOrdinal}) var typ = skipTypes(result.sons[0].typ, {tyGenericInst, tyVar, tyOrdinal})
for i in countup(1, sonsLen(n) - 1): for i in countup(1, sonsLen(n) - 1):
n.sons[i] = semExprWithType(c, n.sons[i]) x = n.sons[i]
if x.kind == nkExprColonExpr:
var idx = semConstExpr(c, x.sons[0])
idx = fitNode(c, indexType, idx)
if lastIndex+1 != getOrdValue(idx):
liMessage(x.info, errInvalidOrderInArrayConstructor)
x = x.sons[1]
n.sons[i] = semExprWithType(c, x)
addSon(result, fitNode(c, typ, n.sons[i])) addSon(result, fitNode(c, typ, n.sons[i]))
inc(lastIndex)
addSon(result.typ, typ) addSon(result.typ, typ)
result.typ.sons[0] = makeRangeType(c, 0, sonsLen(result) - 1, n.info) result.typ.sons[0] = makeRangeType(c, 0, sonsLen(result) - 1, n.info)

View file

@ -2,6 +2,7 @@ tack.nim;125
tambsym2.nim;7 tambsym2.nim;7
tambsys.nim; tambsys.nim;
tarray.nim;10012 tarray.nim;10012
tarraycons.nim;6
tarray2.nim;[16, 25, 36] tarray2.nim;[16, 25, 36]
tarray3.nim;3 tarray3.nim;3
tassert.nim;assertion failure!this shall be always written tassert.nim;assertion failure!this shall be always written

1 tack.nim 125
2 tambsym2.nim 7
3 tambsys.nim
4 tarray.nim 10012
5 tarraycons.nim 6
6 tarray2.nim [16, 25, 36]
7 tarray3.nim 3
8 tassert.nim assertion failure!this shall be always written

View file

@ -0,0 +1,17 @@
type
TEnum = enum
eA, eB, eC, eD, eE, eF
const
myMapping: array[TEnum, array[0..1, int]] = [
eA: [1, 2],
eB: [3, 4],
[5, 6],
eD: [0: 8, 1: 9],
eE: [0: 8, 9],
eF: [2, 1: 9]
]
echo myMapping[eC][1]

View file

@ -3,6 +3,7 @@ tadrdisc.nim;15;for a 'var' type a variable needs to be passed
tambsym.nim;6;ambiguous identifier tambsym.nim;6;ambiguous identifier
tambsym2.nim;4;undeclared identifier: 'CreateRGBSurface' tambsym2.nim;4;undeclared identifier: 'CreateRGBSurface'
tambsym3.nim;6;ambiguous identifier tambsym3.nim;6;ambiguous identifier
tarraycons.nim;9;invalid order in array constructor
tatomic.nim;2;identifier expected, but found 'atomic' tatomic.nim;2;identifier expected, but found 'atomic'
tbind2.nim;7;ambiguous call tbind2.nim;7;ambiguous call
tbind4.nim;4;undeclared identifier: 'lastId' tbind4.nim;4;undeclared identifier: 'lastId'

1 t99bott.nim 20 constant expression expected
3 tambsym.nim 6 ambiguous identifier
4 tambsym2.nim 4 undeclared identifier: 'CreateRGBSurface'
5 tambsym3.nim 6 ambiguous identifier
6 tarraycons.nim 9 invalid order in array constructor
7 tatomic.nim 2 identifier expected, but found 'atomic'
8 tbind2.nim 7 ambiguous call
9 tbind4.nim 4 undeclared identifier: 'lastId'

View file

@ -0,0 +1,17 @@
type
TEnum = enum
eA, eB, eC, eD, eE, eF
const
myMapping: array[TEnum, array[0..1, int]] = [
eA: [1, 2],
eC: [3, 4],
eB: [5, 6],
eD: [0: 8, 1: 9],
eE: [0: 8, 9],
eF: [2, 1: 9]
]
echo myMapping[eC][1]

View file

@ -2,7 +2,6 @@
- deprecate ^ and make it available as operator - deprecate ^ and make it available as operator
- test branch coverage - test branch coverage
- checked exceptions - checked exceptions
- explicit indices for array literals
- built-in serialization - built-in serialization
- do not ambiguity error for methods if amibiguity only affects the same - do not ambiguity error for methods if amibiguity only affects the same
dispatcher anyway dispatcher anyway

View file

@ -47,6 +47,8 @@ Additions
- A field in an ``enum`` may be given an explicit string representation. - A field in an ``enum`` may be given an explicit string representation.
This yields more maintainable code than using a constant This yields more maintainable code than using a constant
``array[TMyEnum, string]`` mapping. ``array[TMyEnum, string]`` mapping.
- Indices in array literals may be explicitly given, enhancing readability:
``[enumValueA: "a", enumValueB: "b"]``.