@@ -18,6 +18,11 @@ let longIdentToPath (skipLast: bool) (longId: LongIdent) : LongIdentifier =
1818let synLongIdentToPath ( skipLast : bool ) ( synLongIdent : SynLongIdent ) =
1919 longIdentToPath skipLast synLongIdent.LongIdent
2020
21+ /// In some rare cases we are interested in the name of a single Ident.
22+ /// For example `nameof ModuleName` in expressions or patterns.
23+ let visitIdentAsPotentialModuleName ( moduleNameIdent : Ident ) =
24+ FileContentEntry.ModuleName moduleNameIdent.idText
25+
2126let visitSynLongIdent ( lid : SynLongIdent ) : FileContentEntry list = visitLongIdent lid.LongIdent
2227
2328let visitLongIdent ( lid : LongIdent ) =
@@ -302,9 +307,28 @@ let visitSynTypeConstraint (tc: SynTypeConstraint) : FileContentEntry list =
302307 | SynTypeConstraint.WhereTyparIsEnum( typeArgs = typeArgs) -> List.collect visitSynType typeArgs
303308 | SynTypeConstraint.WhereTyparIsDelegate( typeArgs = typeArgs) -> List.collect visitSynType typeArgs
304309
310+ [<return : Struct>]
311+ let inline (| NameofIdent | _ |) ( ident : Ident ) =
312+ if ident.idText = " nameof" then ValueSome() else ValueNone
313+
314+ /// Special case of `nameof Module` type of expression
315+ let (| NameofExpr | _ |) ( e : SynExpr ) =
316+ let rec stripParen ( e : SynExpr ) =
317+ match e with
318+ | SynExpr.Paren( expr = expr) -> stripParen expr
319+ | _ -> e
320+
321+ match e with
322+ | SynExpr.App( flag = ExprAtomicFlag.NonAtomic; isInfix = false ; funcExpr = SynExpr.Ident NameofIdent; argExpr = moduleNameExpr) ->
323+ match stripParen moduleNameExpr with
324+ | SynExpr.Ident moduleNameIdent -> Some moduleNameIdent
325+ | _ -> None
326+ | _ -> None
327+
305328let visitSynExpr ( e : SynExpr ) : FileContentEntry list =
306329 let rec visit ( e : SynExpr ) ( continuation : FileContentEntry list -> FileContentEntry list ) : FileContentEntry list =
307330 match e with
331+ | NameofExpr moduleNameIdent -> continuation [ visitIdentAsPotentialModuleName moduleNameIdent ]
308332 | SynExpr.Const _ -> continuation []
309333 | SynExpr.Paren( expr = expr) -> visit expr continuation
310334 | SynExpr.Quote( operator = operator; quotedExpr = quotedExpr) ->
@@ -389,7 +413,7 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
389413 | SynExpr.IfThenElse( ifExpr = ifExpr; thenExpr = thenExpr; elseExpr = elseExpr) ->
390414 let continuations = List.map visit ( ifExpr :: thenExpr :: Option.toList elseExpr)
391415 Continuation.concatenate continuations continuation
392- | SynExpr.Typar _ -> continuation []
416+ | SynExpr.Typar _
393417 | SynExpr.Ident _ -> continuation []
394418 | SynExpr.LongIdent( longDotId = longDotId) -> continuation ( visitSynLongIdent longDotId)
395419 | SynExpr.LongIdentSet( longDotId, expr, _) -> visit expr ( fun nodes -> visitSynLongIdent longDotId @ nodes |> continuation)
@@ -517,9 +541,29 @@ let visitSynExpr (e: SynExpr) : FileContentEntry list =
517541
518542 visit e id
519543
544+ /// Special case of `| nameof Module ->` type of pattern
545+ let (| NameofPat | _ |) ( pat : SynPat ) =
546+ let rec stripPats p =
547+ match p with
548+ | SynPat.Paren( pat = pat) -> stripPats pat
549+ | _ -> p
550+
551+ match pat with
552+ | SynPat.LongIdent( longDotId = SynLongIdent( id = [ NameofIdent ]); typarDecls = None; argPats = SynArgPats.Pats [ moduleNamePat ]) ->
553+ match stripPats moduleNamePat with
554+ | SynPat.LongIdent(
555+ longDotId = SynLongIdent.SynLongIdent( id = [ moduleNameIdent ]; dotRanges = []; trivia = [ None ])
556+ extraId = None
557+ typarDecls = None
558+ argPats = SynArgPats.Pats []
559+ accessibility = None) -> Some moduleNameIdent
560+ | _ -> None
561+ | _ -> None
562+
520563let visitPat ( p : SynPat ) : FileContentEntry list =
521564 let rec visit ( p : SynPat ) ( continuation : FileContentEntry list -> FileContentEntry list ) : FileContentEntry list =
522565 match p with
566+ | NameofPat moduleNameIdent -> continuation [ visitIdentAsPotentialModuleName moduleNameIdent ]
523567 | SynPat.Paren( pat = pat) -> visit pat continuation
524568 | SynPat.Typed( pat = pat; targetType = t) -> visit pat ( fun nodes -> nodes @ visitSynType t)
525569 | SynPat.Const _ -> continuation []
0 commit comments