@@ -760,7 +760,7 @@ func (ctx *parseContext) mapFieldListAsParams(fl *ast.FieldList) tree.Container[
760760 } else {
761761 closeParen := ctx .prefix (fl .Closing )
762762 ctx .skip (1 ) // ")"
763- if len ( closeParen .Comments ) > 0 {
763+ if ! closeParen .IsEmpty () {
764764 elements = append (elements , tree.RightPadded [tree.Statement ]{
765765 Element : & tree.Empty {ID : uuid .New ()},
766766 After : closeParen ,
@@ -2193,8 +2193,14 @@ func (ctx *parseContext) mapSliceExpr(expr *ast.SliceExpr) tree.Expression {
21932193// mapMapType maps a map type expression like `map[K]V`.
21942194func (ctx * parseContext ) mapMapType (expr * ast.MapType ) tree.Expression {
21952195 prefix := ctx .prefixAndSkip (expr .Map , len ("map" ))
2196- lbrackPrefix := ctx .prefix (expr .Map + token .Pos (len ("map" )))
2197- ctx .skip (1 ) // "["
2196+ lbrackOff := ctx .findNext ('[' )
2197+ var lbrackPrefix tree.Space
2198+ if lbrackOff >= 0 {
2199+ lbrackPrefix = ctx .prefix (ctx .file .Pos (lbrackOff ))
2200+ ctx .skip (1 ) // "["
2201+ } else {
2202+ ctx .skip (1 ) // "["
2203+ }
21982204 key := ctx .mapTypeExpr (expr .Key )
21992205 rbrackOff := ctx .findNext (']' )
22002206 var rbrackPrefix tree.Space
@@ -2216,26 +2222,60 @@ func (ctx *parseContext) mapMapType(expr *ast.MapType) tree.Expression {
22162222// mapChanType maps a channel type expression.
22172223func (ctx * parseContext ) mapChanType (expr * ast.ChanType ) tree.Expression {
22182224 prefix := ctx .prefix (expr .Begin )
2225+ var markers tree.Markers
22192226
22202227 var dir tree.ChanDir
22212228 switch expr .Dir {
22222229 case ast .SEND :
22232230 dir = tree .ChanSendOnly
2224- ctx .skip (len ("chan<-" ))
2231+ ctx .skip (len ("chan" ))
2232+ arrowOff := ctx .findNext ('<' )
2233+ var dirMarkerBefore tree.Space
2234+ if arrowOff >= 0 {
2235+ dirMarkerBefore = ctx .prefix (ctx .file .Pos (arrowOff ))
2236+ ctx .cursor = arrowOff
2237+ }
2238+ ctx .skip (2 ) // "<-"
2239+ if ! dirMarkerBefore .IsEmpty () {
2240+ markers = tree.Markers {
2241+ ID : uuid .New (),
2242+ Entries : []tree.Marker {tree.ChanDirMarker {
2243+ Ident : uuid .New (),
2244+ Before : dirMarkerBefore ,
2245+ }},
2246+ }
2247+ }
22252248 case ast .RECV :
22262249 dir = tree .ChanRecvOnly
2227- ctx .skip (len ("<-chan" ))
2250+ ctx .skip (2 ) // "<-"
2251+ chanOff := ctx .findNext ('c' )
2252+ var dirMarkerBefore tree.Space
2253+ if chanOff >= 0 && chanOff + 4 <= len (ctx .src ) && string (ctx .src [chanOff :chanOff + 4 ]) == "chan" {
2254+ dirMarkerBefore = ctx .prefix (ctx .file .Pos (chanOff ))
2255+ ctx .cursor = chanOff
2256+ }
2257+ ctx .skip (len ("chan" ))
2258+ if ! dirMarkerBefore .IsEmpty () {
2259+ markers = tree.Markers {
2260+ ID : uuid .New (),
2261+ Entries : []tree.Marker {tree.ChanDirMarker {
2262+ Ident : uuid .New (),
2263+ Before : dirMarkerBefore ,
2264+ }},
2265+ }
2266+ }
22282267 default :
22292268 dir = tree .ChanBidi
22302269 ctx .skip (len ("chan" ))
22312270 }
22322271
22332272 value := ctx .mapTypeExpr (expr .Value )
22342273 return & tree.Channel {
2235- ID : uuid .New (),
2236- Prefix : prefix ,
2237- Dir : dir ,
2238- Value : value ,
2274+ ID : uuid .New (),
2275+ Prefix : prefix ,
2276+ Markers : markers ,
2277+ Dir : dir ,
2278+ Value : value ,
22392279 }
22402280}
22412281
0 commit comments