diff options
-rwxr-xr-x | compiler/parser.nim | 26 | ||||
-rwxr-xr-x | doc/manual.txt | 15 | ||||
-rwxr-xr-x | tests/compile/trectuple.nim | 4 |
3 files changed, 40 insertions, 5 deletions
diff --git a/compiler/parser.nim b/compiler/parser.nim index 88edcd967..835a48fcc 100755 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -620,7 +620,7 @@ proc parseIdentColonEquals(p: var TParser, flags: TDeclaredIdentFlags): PNode = else: addSon(result, ast.emptyNode) -proc parseTuple(p: var TParser): PNode = +proc parseTuple(p: var TParser, indentAllowed = false): PNode = result = newNodeP(nkTupleTy, p) getTok(p) if p.tok.tokType == tkBracketLe: @@ -634,6 +634,29 @@ proc parseTuple(p: var TParser): PNode = optInd(p, a) optPar(p) eat(p, tkBracketRi) + elif indentAllowed: + skipComment(p, result) + if p.tok.tokType == tkInd: + pushInd(p.lex, p.tok.indent) + getTok(p) + skipComment(p, result) + while true: + case p.tok.tokType + of tkSad: + getTok(p) + of tkSymbol, tkAccent: + var a = parseIdentColonEquals(p, {}) + skipComment(p, a) + addSon(result, a) + of tkDed: + getTok(p) + break + of tkEof: + break + else: + parMessage(p, errIdentifierExpected, p.tok) + break + popInd(p.lex) proc parseParamList(p: var TParser, retColon = true): PNode = var a: PNode @@ -1380,6 +1403,7 @@ proc parseTypeDef(p: var TParser): PNode = of tkObject: a = parseObject(p) of tkEnum: a = parseEnum(p) of tkDistinct: a = parseDistinct(p) + of tkTuple: a = parseTuple(p, true) else: a = parseTypeDesc(p) addSon(result, a) else: diff --git a/doc/manual.txt b/doc/manual.txt index 36e444170..34389d7f9 100755 --- a/doc/manual.txt +++ b/doc/manual.txt @@ -924,8 +924,8 @@ order. The assignment operator for tuples copies each component. The default assignment operator for objects copies each component. Overloading -of the assignment operator for objects is not possible, but this may change in -future versions of the compiler. +of the assignment operator for objects is not possible, but this will change +in future versions of the compiler. .. code-block:: nimrod @@ -940,7 +940,16 @@ future versions of the compiler. person = ("Peter", 30) The implementation aligns the fields for best access performance. The alignment -is compatible with the way the C compiler does it. +is compatible with the way the C compiler does it. For consistency +with ``object`` declarations, tuples in a ``type`` section can also be defined +with indentation instead of ``[]``: + +.. code-block:: nimrod + + type + TPerson = tuple # type representing a person + name: string # a person consists of a name + age: natural # and an age Objects provide many features that tuples do not. Object provide inheritance and information hiding. Objects have access to their type at runtime, so that diff --git a/tests/compile/trectuple.nim b/tests/compile/trectuple.nim index 4d5febbfa..7c43ec5ba 100755 --- a/tests/compile/trectuple.nim +++ b/tests/compile/trectuple.nim @@ -1,7 +1,9 @@ type PNode = ref TNode - TNode = tuple[self: PNode] + TNode = tuple # comment + self: PNode # comment + a, b: int # comment var node: PNode new(node) |