@@ -311,8 +311,27 @@ let visitSynTypeConstraint (tc: SynTypeConstraint) : FileContentEntry list =
311311let inline (| NameofIdent | _ |) ( ident : Ident ) =
312312 if ident.idText = " nameof" then ValueSome() else ValueNone
313313
314+ /// nameof X.Y.Z can be used in expressions and patterns
315+ [<RequireQualifiedAccess; NoComparison>]
316+ type NameofResult =
317+ /// Example: nameof X
318+ /// Where X is a module name
319+ | SingleIdent of potentialModuleName : Ident
320+ /// Example: nameof X.Y.Z
321+ /// Where Z is either a module name or something from inside module or namespace Y.
322+ /// Both options need to be explored.
323+ | LongIdent of longIdent : LongIdent
324+
325+ let visitNameofResult ( nameofResult : NameofResult ) : FileContentEntry =
326+ match nameofResult with
327+ | NameofResult.SingleIdent moduleName -> visitIdentAsPotentialModuleName moduleName
328+ | NameofResult.LongIdent longIdent ->
329+ // In this case the last part of the LongIdent could be a module name.
330+ // So we should not cut off the last part.
331+ FileContentEntry.PrefixedIdentifier( longIdentToPath false longIdent)
332+
314333/// Special case of `nameof Module` type of expression
315- let (| NameofExpr | _ |) ( e : SynExpr ) =
334+ let (| NameofExpr | _ |) ( e : SynExpr ) : NameofResult option =
316335 let rec stripParen ( e : SynExpr ) =
317336 match e with
318337 | SynExpr.Paren( expr = expr) -> stripParen expr
@@ -321,14 +340,20 @@ let (|NameofExpr|_|) (e: SynExpr) =
321340 match e with
322341 | SynExpr.App( flag = ExprAtomicFlag.NonAtomic; isInfix = false ; funcExpr = SynExpr.Ident NameofIdent; argExpr = moduleNameExpr) ->
323342 match stripParen moduleNameExpr with
324- | SynExpr.Ident moduleNameIdent -> Some moduleNameIdent
343+ | SynExpr.Ident moduleNameIdent -> Some( NameofResult.SingleIdent moduleNameIdent)
344+ | SynExpr.LongIdent( longDotId = longIdent) ->
345+ match longIdent.LongIdent with
346+ | [] -> None
347+ // This is highly unlikely to be produced by the parser
348+ | [ moduleNameIdent ] -> Some( NameofResult.SingleIdent moduleNameIdent)
349+ | lid -> Some( NameofResult.LongIdent( lid))
325350 | _ -> None
326351 | _ -> None
327352
328353let visitSynExpr ( e : SynExpr ) : FileContentEntry list =
329354 let rec visit ( e : SynExpr ) ( continuation : FileContentEntry list -> FileContentEntry list ) : FileContentEntry list =
330355 match e with
331- | NameofExpr moduleNameIdent -> continuation [ visitIdentAsPotentialModuleName moduleNameIdent ]
356+ | NameofExpr nameofResult -> continuation [ visitNameofResult nameofResult ]
332357 | SynExpr.Const _ -> continuation []
333358 | SynExpr.Paren( expr = expr) -> visit expr continuation
334359 | SynExpr.Quote( operator = operator; quotedExpr = quotedExpr) ->
@@ -552,18 +577,22 @@ let (|NameofPat|_|) (pat: SynPat) =
552577 | SynPat.LongIdent( longDotId = SynLongIdent( id = [ NameofIdent ]); typarDecls = None; argPats = SynArgPats.Pats [ moduleNamePat ]) ->
553578 match stripPats moduleNamePat with
554579 | SynPat.LongIdent(
555- longDotId = SynLongIdent.SynLongIdent( id = [ moduleNameIdent ]; dotRanges = []; trivia = [ None ] )
580+ longDotId = SynLongIdent.SynLongIdent( id = longIdent )
556581 extraId = None
557582 typarDecls = None
558583 argPats = SynArgPats.Pats []
559- accessibility = None) -> Some moduleNameIdent
584+ accessibility = None) ->
585+ match longIdent with
586+ | [] -> None
587+ | [ moduleNameIdent ] -> Some( NameofResult.SingleIdent moduleNameIdent)
588+ | lid -> Some( NameofResult.LongIdent lid)
560589 | _ -> None
561590 | _ -> None
562591
563592let visitPat ( p : SynPat ) : FileContentEntry list =
564593 let rec visit ( p : SynPat ) ( continuation : FileContentEntry list -> FileContentEntry list ) : FileContentEntry list =
565594 match p with
566- | NameofPat moduleNameIdent -> continuation [ visitIdentAsPotentialModuleName moduleNameIdent ]
595+ | NameofPat moduleNameIdent -> continuation [ visitNameofResult moduleNameIdent ]
567596 | SynPat.Paren( pat = pat) -> visit pat continuation
568597 | SynPat.Typed( pat = pat; targetType = t) -> visit pat ( fun nodes -> nodes @ visitSynType t)
569598 | SynPat.Const _ -> continuation []
0 commit comments