@@ -315,16 +315,37 @@ func (p *parser) importDecl(group *Group) Decl {
315
315
return d
316
316
}
317
317
318
- // ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
318
+ // AliasSpec = identifier "=>" [ PackageName "." ] identifier .
319
+ func (p * parser ) aliasDecl (tok token , name * Name , group * Group ) Decl {
320
+ // no tracing since this is already called from a const/type/var/funcDecl
321
+
322
+ d := new (AliasDecl )
323
+ d .initFrom (& name .node )
324
+
325
+ p .want (_Rarrow )
326
+ d .Tok = tok
327
+ d .Name = name
328
+ d .Orig = p .dotname (p .name ())
329
+ d .Group = group
330
+
331
+ return d
332
+ }
333
+
334
+ // ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] | AliasSpec .
319
335
func (p * parser ) constDecl (group * Group ) Decl {
320
336
if trace {
321
337
defer p .trace ("constDecl" )()
322
338
}
323
339
340
+ name := p .name ()
341
+ if p .tok == _Rarrow {
342
+ return p .aliasDecl (Const , name , group )
343
+ }
344
+
324
345
d := new (ConstDecl )
325
- d .init ( p )
346
+ d .initFrom ( & name . node )
326
347
327
- d .NameList = p .nameList (p . name () )
348
+ d .NameList = p .nameList (name )
328
349
if p .tok != _EOF && p .tok != _Semi && p .tok != _Rparen {
329
350
d .Type = p .tryType ()
330
351
if p .got (_Assign ) {
@@ -336,16 +357,24 @@ func (p *parser) constDecl(group *Group) Decl {
336
357
return d
337
358
}
338
359
339
- // TypeSpec = identifier Type .
360
+ // TypeSpec = identifier Type | AliasSpec .
340
361
func (p * parser ) typeDecl (group * Group ) Decl {
341
362
if trace {
342
363
defer p .trace ("typeDecl" )()
343
364
}
344
365
366
+ name := p .name ()
367
+ if p .tok == _Rarrow {
368
+ return p .aliasDecl (Type , name , group )
369
+ }
370
+
345
371
d := new (TypeDecl )
346
- d .init ( p )
372
+ d .initFrom ( & name . node )
347
373
348
- d .Name = p .name ()
374
+ d .Name = name
375
+ // accept "type T = p.T" for now so we can experiment
376
+ // with a type-alias only approach as well
377
+ d .Alias = p .got (_Assign )
349
378
d .Type = p .tryType ()
350
379
if d .Type == nil {
351
380
p .syntax_error ("in type declaration" )
@@ -356,16 +385,21 @@ func (p *parser) typeDecl(group *Group) Decl {
356
385
return d
357
386
}
358
387
359
- // VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
388
+ // VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) | AliasSpec .
360
389
func (p * parser ) varDecl (group * Group ) Decl {
361
390
if trace {
362
391
defer p .trace ("varDecl" )()
363
392
}
364
393
394
+ name := p .name ()
395
+ if p .tok == _Rarrow {
396
+ return p .aliasDecl (Var , name , group )
397
+ }
398
+
365
399
d := new (VarDecl )
366
- d .init ( p )
400
+ d .initFrom ( & name . node )
367
401
368
- d .NameList = p .nameList (p . name () )
402
+ d .NameList = p .nameList (name )
369
403
if p .got (_Assign ) {
370
404
d .Values = p .exprList ()
371
405
} else {
@@ -382,31 +416,28 @@ func (p *parser) varDecl(group *Group) Decl {
382
416
return d
383
417
}
384
418
385
- // FunctionDecl = "func" FunctionName ( Function | Signature ) .
419
+ var badRecv = new (Field ) // to signal invalid receiver in funcDecl
420
+
421
+ // FunctionDecl = "func" FunctionName ( Function | Signature ) | "func" AliasSpec .
386
422
// FunctionName = identifier .
387
423
// Function = Signature FunctionBody .
388
424
// MethodDecl = "func" Receiver MethodName ( Function | Signature ) .
389
425
// Receiver = Parameters .
390
- func (p * parser ) funcDecl () * FuncDecl {
426
+ func (p * parser ) funcDecl () Decl {
391
427
if trace {
392
428
defer p .trace ("funcDecl" )()
393
429
}
394
430
395
- f := new (FuncDecl )
396
- f .init (p )
397
-
398
- badRecv := false
431
+ var recv * Field
399
432
if p .tok == _Lparen {
400
- rcvr := p . paramList ()
401
- switch len (rcvr ) {
433
+ recv = badRecv
434
+ switch list := p . paramList (); len (list ) {
402
435
case 0 :
403
436
p .error ("method has no receiver" )
404
- badRecv = true
405
437
case 1 :
406
- f . Recv = rcvr [0 ]
438
+ recv = list [0 ]
407
439
default :
408
440
p .error ("method has multiple receivers" )
409
- badRecv = true
410
441
}
411
442
}
412
443
@@ -416,6 +447,11 @@ func (p *parser) funcDecl() *FuncDecl {
416
447
return nil
417
448
}
418
449
450
+ name := p .name ()
451
+ if recv == nil && p .tok == _Rarrow {
452
+ return p .aliasDecl (Func , name , nil )
453
+ }
454
+
419
455
// TODO(gri) check for regular functions only
420
456
// if name.Sym.Name == "init" {
421
457
// name = renameinit()
@@ -430,7 +466,11 @@ func (p *parser) funcDecl() *FuncDecl {
430
466
// }
431
467
// }
432
468
433
- f .Name = p .name ()
469
+ f := new (FuncDecl )
470
+ f .initFrom (& name .node ) // TODO(gri) is this the correct position for methods?
471
+
472
+ f .Recv = recv
473
+ f .Name = name
434
474
f .Type = p .funcType ()
435
475
if gcCompat {
436
476
f .node = f .Type .node
@@ -445,7 +485,7 @@ func (p *parser) funcDecl() *FuncDecl {
445
485
// p.error("can only use //go:noescape with external func implementations")
446
486
// }
447
487
448
- if badRecv {
488
+ if recv == badRecv {
449
489
return nil // TODO(gri) better solution
450
490
}
451
491
return f
@@ -514,7 +554,7 @@ func (p *parser) unaryExpr() Expr {
514
554
return x
515
555
}
516
556
517
- case _Arrow :
557
+ case _Larrow :
518
558
// receive op (<-x) or receive-only channel (<-chan E)
519
559
p .next ()
520
560
@@ -928,7 +968,7 @@ func (p *parser) tryType() Expr {
928
968
p .next ()
929
969
return indirect (p .type_ ())
930
970
931
- case _Arrow :
971
+ case _Larrow :
932
972
// recvchantype
933
973
p .next ()
934
974
p .want (_Chan )
@@ -974,7 +1014,7 @@ func (p *parser) tryType() Expr {
974
1014
p .next ()
975
1015
t := new (ChanType )
976
1016
t .init (p )
977
- if p .got (_Arrow ) {
1017
+ if p .got (_Larrow ) {
978
1018
t .Dir = SendOnly
979
1019
}
980
1020
t .Elem = p .chanElem ()
@@ -1317,7 +1357,7 @@ func (p *parser) paramDecl() *Field {
1317
1357
case _Name :
1318
1358
f .Name = p .name ()
1319
1359
switch p .tok {
1320
- case _Name , _Star , _Arrow , _Func , _Lbrack , _Chan , _Map , _Struct , _Interface , _Lparen :
1360
+ case _Name , _Star , _Larrow , _Func , _Lbrack , _Chan , _Map , _Struct , _Interface , _Lparen :
1321
1361
// sym name_or_type
1322
1362
f .Type = p .type_ ()
1323
1363
@@ -1332,7 +1372,7 @@ func (p *parser) paramDecl() *Field {
1332
1372
f .Name = nil
1333
1373
}
1334
1374
1335
- case _Arrow , _Star , _Func , _Lbrack , _Chan , _Map , _Struct , _Interface , _Lparen :
1375
+ case _Larrow , _Star , _Func , _Lbrack , _Chan , _Map , _Struct , _Interface , _Lparen :
1336
1376
// name_or_type
1337
1377
f .Type = p .type_ ()
1338
1378
@@ -1466,7 +1506,7 @@ func (p *parser) simpleStmt(lhs Expr, rangeOk bool) SimpleStmt {
1466
1506
p .next ()
1467
1507
return p .newAssignStmt (op , lhs , ImplicitOne )
1468
1508
1469
- case _Arrow :
1509
+ case _Larrow :
1470
1510
// lhs <- rhs
1471
1511
p .next ()
1472
1512
s := new (SendStmt )
@@ -1819,7 +1859,7 @@ func (p *parser) commClause() *CommClause {
1819
1859
p .next ()
1820
1860
lhs := p .exprList ()
1821
1861
1822
- if _ , ok := lhs .(* ListExpr ); ! ok && p .tok == _Arrow {
1862
+ if _ , ok := lhs .(* ListExpr ); ! ok && p .tok == _Larrow {
1823
1863
// lhs <- x
1824
1864
} else {
1825
1865
// lhs
@@ -1899,7 +1939,7 @@ func (p *parser) stmt() Stmt {
1899
1939
1900
1940
case _Literal , _Func , _Lparen , // operands
1901
1941
_Lbrack , _Struct , _Map , _Chan , _Interface , // composite types
1902
- _Arrow : // receive operator
1942
+ _Larrow : // receive operator
1903
1943
return p .simpleStmt (nil , false )
1904
1944
1905
1945
case _For :
0 commit comments