mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-26 17:24:02 +00:00
Named arguments in commands + many grammar fixes (#20994)
* Breaking parser changes, implement https://github.com/nim-lang/RFCs/issues/442 Types are separated from expressions and better reflected in the grammar. * add test * more accurate grammar * fix keyword typedescs * accept expressions in proc argument lists * CI "fixes" * fixes * allow full ref expressions again, adapt old tests * cleanup, fix some tests * improve grammar, try and revert semtypes change * restrict sigil binding to identOrLiteral * fix, should have caught this immediately * add changelog entry, fix double not nil bug * correct grammar * change section * fix * real fix hopefully * fix test * support LL(1) for tuples * make grammar.txt too
This commit is contained in:
@@ -36,3 +36,12 @@ echo f -4
|
||||
|
||||
echo int -1 # doesn't compile
|
||||
echo int `-` 1 # compiles
|
||||
|
||||
var num = 1
|
||||
num += int 2
|
||||
doAssert num == 3
|
||||
|
||||
import options
|
||||
var opt = some some none int
|
||||
opt = some some none int
|
||||
opt = some none Option[int]
|
||||
|
||||
17
tests/parser/tcommandequals.nim
Normal file
17
tests/parser/tcommandequals.nim
Normal file
@@ -0,0 +1,17 @@
|
||||
discard """
|
||||
output: '''
|
||||
5
|
||||
'''
|
||||
"""
|
||||
|
||||
proc foo(a, b: int) =
|
||||
echo a + b
|
||||
|
||||
foo a = 2, b = 3
|
||||
|
||||
import macros
|
||||
|
||||
macro bar(args: varargs[untyped]): untyped =
|
||||
doAssert args[0].kind == nnkExprEqExpr
|
||||
|
||||
bar "a" = 1
|
||||
16
tests/parser/tcommandindent.nim
Normal file
16
tests/parser/tcommandindent.nim
Normal file
@@ -0,0 +1,16 @@
|
||||
when false: # parse the following
|
||||
let foo = Obj(
|
||||
field1: proc (src: pointer, srcLen: Natural)
|
||||
{.nimcall, gcsafe, raises: [IOError, Defect].} =
|
||||
var file = FileOutputStream(s).file
|
||||
|
||||
implementWrites s.buffers, src, srcLen, "FILE",
|
||||
writeStartAddr, writeLen,
|
||||
file.writeBuffer(writeStartAddr, writeLen)
|
||||
,
|
||||
field2: proc {.nimcall, gcsafe, raises: [IOError, Defect].} =
|
||||
flushFile FileOutputStream(s).file
|
||||
,
|
||||
field3: proc () {.nimcall, gcsafe, raises: [IOError, Defect].} =
|
||||
close FileOutputStream(s).file
|
||||
)
|
||||
3
tests/parser/tdoublenotnil.nim
Normal file
3
tests/parser/tdoublenotnil.nim
Normal file
@@ -0,0 +1,3 @@
|
||||
when false:
|
||||
type Foo = Bar not nil not nil #[tt.Error
|
||||
^ invalid indentation]#
|
||||
10
tests/parser/ttypeexprobject.nim
Normal file
10
tests/parser/ttypeexprobject.nim
Normal file
@@ -0,0 +1,10 @@
|
||||
discard """
|
||||
errormsg: "invalid indentation"
|
||||
line: 10
|
||||
column: 14
|
||||
"""
|
||||
|
||||
type
|
||||
A = (object | tuple | int)
|
||||
B = int | object | tuple
|
||||
C = object | tuple | int # issue #8846
|
||||
25
tests/parser/ttypeexprs.nim
Normal file
25
tests/parser/ttypeexprs.nim
Normal file
@@ -0,0 +1,25 @@
|
||||
proc foo[T: ptr int | ptr string](x: T) = discard
|
||||
var x = "abc"
|
||||
foo(addr x)
|
||||
|
||||
let n = 3'u32
|
||||
type Double = (
|
||||
when n.sizeof == 4: uint64
|
||||
elif n.sizeof == 2: uint32
|
||||
else: uint16
|
||||
)
|
||||
|
||||
type
|
||||
A = (ref | ptr | pointer)
|
||||
B = pointer | ptr | ref
|
||||
C = ref | ptr | pointer
|
||||
|
||||
template `+`(a, b): untyped = (b, a)
|
||||
template `*`(a, b): untyped = (a, b)
|
||||
|
||||
doAssert (ref int + ref float * ref string + ref bool) is
|
||||
(ref bool, ((ref float, ref string), ref int))
|
||||
type X = ref int + ref float * ref string + ref bool
|
||||
doAssert X is (ref bool, ((ref float, ref string), ref int))
|
||||
|
||||
type SomePointer = proc | ref | ptr | pointer
|
||||
Reference in New Issue
Block a user