@@ -50,48 +50,81 @@ module CosmosCodeAnalysis =
5050
5151 let (| Query | _ |) =
5252 function
53- | Apply ( " Cosmos.query" , SynExpr.Const ( SynConst.String ( query, queryRange), constRange), range, appRange) ->
54- Some( query, constRange)
53+ | Apply ( " Cosmos.query" , SynExpr.Const ( SynConst.String ( query, queryRange), constRange), range, appRange) -> Some( query, constRange)
5554 | _ -> None
5655
5756 let (| LiteralQuery | _ |) =
5857 function
5958 | Apply ( " Cosmos.query" , SynExpr.Ident ( identifier), funcRange, appRange) -> Some( identifier.idText, funcRange)
6059 | _ -> None
6160
61+ let (| TypedQuery | _ |) =
62+ function
63+ | SynExpr.App ( exprAtomic,
64+ isInfix,
65+ ( SynExpr.TypeApp ( funcExpr, lessRange, typeNames, commasRange, greaterRange, typeArgsRange, typeAppRange)),
66+ SynExpr.Const ( SynConst.String ( query, queryRange), constRange),
67+ appRange) ->
68+ match funcExpr with
69+ | SynExpr.LongIdent ( isOptional, longDotId, altName, identRange) ->
70+ match longDotId with
71+ | LongIdentWithDots ( listOfIds, ranges) ->
72+ let fullName =
73+ listOfIds
74+ |> List.map ( fun id -> id.idText)
75+ |> String.concat " ."
76+
77+ match fullName with
78+ | " Cosmos.query" ->
79+ let names =
80+ typeNames
81+ |> List.filter ( fun typeName ->
82+ match typeName with
83+ | SynType.LongIdent (_) -> true
84+ | _ -> false )
85+ |> List.map ( fun typeName ->
86+ match typeName with
87+ | SynType.LongIdent ( dots) ->
88+ match dots with
89+ | LongIdentWithDots ( listOfIds, _) ->
90+ listOfIds
91+ |> List.map ( fun id -> id.idText)
92+ |> String.concat " ."
93+ | _ -> " " )
94+
95+ Some( names, query, typeAppRange)
96+ | _ -> None
97+ | _ -> None
98+ | _ -> None
99+
62100 let (| Database | _ |) =
63101 function
64- | Apply ( " Cosmos.database" , SynExpr.Const ( SynConst.String ( dbId, queryRange), constRange), range, appRange) ->
65- Some( dbId, constRange)
102+ | Apply ( " Cosmos.database" , SynExpr.Const ( SynConst.String ( dbId, queryRange), constRange), range, appRange) -> Some( dbId, constRange)
66103 | _ -> None
67104
68105 let (| LiteralDatabase | _ |) =
69106 function
70- | Apply ( " Cosmos.database" , SynExpr.Ident ( identifier), funcRange, appRange) ->
71- Some( identifier.idText, funcRange)
107+ | Apply ( " Cosmos.database" , SynExpr.Ident ( identifier), funcRange, appRange) -> Some( identifier.idText, funcRange)
72108 | _ -> None
73109
74110 let (| Container | _ |) =
75111 function
76- | Apply ( " Cosmos.container" , SynExpr.Const ( SynConst.String ( containerName, queryRange), constRange), range,
77- appRange ) -> Some( containerName, constRange)
112+ | Apply ( " Cosmos.container" , SynExpr.Const ( SynConst.String ( containerName, queryRange), constRange), range, appRange ) ->
113+ Some( containerName, constRange)
78114 | _ -> None
79115
80116 let (| LiteralContainer | _ |) =
81117 function
82- | Apply ( " Cosmos.container" , SynExpr.Ident ( identifier), funcRange, appRange) ->
83- Some( identifier.idText, funcRange)
118+ | Apply ( " Cosmos.container" , SynExpr.Ident ( identifier), funcRange, appRange) -> Some( identifier.idText, funcRange)
84119 | _ -> None
85120
86121 let (| ParameterTuple | _ |) =
87122 function
88123 | SynExpr.Tuple ( isStruct,
89- [ SynExpr.Const ( SynConst.String ( parameterName, paramRange), constRange);
90- Apply ( funcName, exprArgs, funcRange, appRange) ], commaRange, tupleRange) ->
91- Some( parameterName, paramRange, funcName, funcRange, Some appRange)
92- | SynExpr.Tuple ( isStruct,
93- [ SynExpr.Const ( SynConst.String ( parameterName, paramRange), constRange); secondItem ],
94- commaRange, tupleRange) ->
124+ [ SynExpr.Const ( SynConst.String ( parameterName, paramRange), constRange); Apply ( funcName, exprArgs, funcRange, appRange) ],
125+ commaRange,
126+ tupleRange) -> Some( parameterName, paramRange, funcName, funcRange, Some appRange)
127+ | SynExpr.Tuple ( isStruct, [ SynExpr.Const ( SynConst.String ( parameterName, paramRange), constRange); secondItem ], commaRange, tupleRange) ->
95128 match secondItem with
96129 | SynExpr.LongIdent ( isOptional, longDotId, altName, identRange) ->
97130 match longDotId with
@@ -122,15 +155,15 @@ module CosmosCodeAnalysis =
122155 function
123156 | Apply ( " Cosmos.parameters" , SynExpr.ArrayOrListOfSeqExpr ( isArray, listExpr, listRange), funcRange, appRange) ->
124157 match listExpr with
125- | SynExpr.CompExpr ( isArrayOfList, isNotNakedRefCell, compExpr, compRange) ->
126- Some( readParameters compExpr, compRange)
158+ | SynExpr.CompExpr ( isArrayOfList, isNotNakedRefCell, compExpr, compRange) -> Some( readParameters compExpr, compRange)
127159 | _ -> None
128160 | _ -> None
129161
130162 let rec findQuery =
131163 function
132164 | Query ( query, range) -> [ CosmosAnalyzerBlock.Query( query, range) ]
133165 | LiteralQuery ( identifier, range) -> [ CosmosAnalyzerBlock.LiteralQuery( identifier, range) ]
166+ | TypedQuery ( typeNames, query, typeAppRange) -> [ CosmosAnalyzerBlock.Query( query, typeAppRange) ]
134167 | SynExpr.App ( exprAtomic, isInfix, funcExpr, argExpr, range) ->
135168 [ yield ! findQuery funcExpr
136169 yield ! findQuery argExpr ]
@@ -262,8 +295,8 @@ module CosmosCodeAnalysis =
262295
263296 and visitBinding ( binding : SynBinding ): CosmosOperation list =
264297 match binding with
265- | SynBinding.Binding ( access, kind, mustInline, isMutable, attrs, xmlDecl, valData, headPat, returnInfo, expr,
266- range , seqPoint ) -> visitSyntacticExpression expr range
298+ | SynBinding.Binding ( access, kind, mustInline, isMutable, attrs, xmlDecl, valData, headPat, returnInfo, expr, range , seqPoint ) ->
299+ visitSyntacticExpression expr range
267300
268301
269302 let findOperations ( ctx : Context ) =
0 commit comments