@@ -1047,10 +1047,10 @@ let printConstructorArgs argsLen ~asSnippet =
10471047 if List. length ! args > 0 then " (" ^ (! args |> String. concat " , " ) ^ " )"
10481048 else " "
10491049
1050- type completionMode = Pattern | Expression
1050+ type completionMode = Pattern of Completable .patternMode option | Expression
10511051
1052- let rec completeTypedValue ( t : SharedTypes.completionType ) ~full ~prefix
1053- ~ completionContext ~ mode =
1052+ let rec completeTypedValue ~full ~prefix ~ completionContext ~ mode
1053+ ( t : SharedTypes.completionType ) =
10541054 match t with
10551055 | Tbool env ->
10561056 [
@@ -1142,10 +1142,23 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
11421142 |> List. filter (fun (field : field ) ->
11431143 List. mem field.fname.txt seenFields = false )
11441144 |> List. map (fun (field : field ) ->
1145- Completion. create field.fname.txt
1146- ~kind:
1147- (Field (field, TypeUtils. extractedTypeToString extractedType))
1148- ~env )
1145+ match (field.optional, mode) with
1146+ | true , Pattern (Some Destructuring) ->
1147+ Completion. create (" ?" ^ field.fname.txt)
1148+ ~docstring:
1149+ [
1150+ field.fname.txt
1151+ ^ " is an optional field, and needs to be destructured \
1152+ using '?'." ;
1153+ ]
1154+ ~kind:
1155+ (Field (field, TypeUtils. extractedTypeToString extractedType))
1156+ ~env
1157+ | _ ->
1158+ Completion. create field.fname.txt
1159+ ~kind:
1160+ (Field (field, TypeUtils. extractedTypeToString extractedType))
1161+ ~env )
11491162 |> filterItems ~prefix
11501163 | None ->
11511164 if prefix = " " then
@@ -1157,7 +1170,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
11571170 (ExtractedType
11581171 ( extractedType,
11591172 match mode with
1160- | Pattern -> `Type
1173+ | Pattern _ -> `Type
11611174 | Expression -> `Value ))
11621175 ~env () ;
11631176 ]
@@ -1190,7 +1203,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
11901203 (ExtractedType
11911204 ( typ,
11921205 match mode with
1193- | Pattern -> `Type
1206+ | Pattern _ -> `Type
11941207 | Expression -> `Value ))
11951208 ~env () ;
11961209 ]
@@ -1360,7 +1373,7 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
13601373 Utils. startsWith name prefix
13611374 && (forHover || not (List. mem name identsSeen)))
13621375 |> List. map mkLabel
1363- | Cpattern {contextPath; prefix; nested; fallback} -> (
1376+ | Cpattern {contextPath; prefix; nested; fallback; patternMode } -> (
13641377 let fallbackOrEmpty ?items () =
13651378 match (fallback, items) with
13661379 | Some fallback , (None | Some [] ) ->
@@ -1385,7 +1398,8 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
13851398 | Some (typ , _env , completionContext ) ->
13861399 let items =
13871400 typ
1388- |> completeTypedValue ~mode: Pattern ~full ~prefix ~completion Context
1401+ |> completeTypedValue ~mode: (Pattern patternMode) ~full ~prefix
1402+ ~completion Context
13891403 in
13901404 fallbackOrEmpty ~items () )
13911405 | None -> fallbackOrEmpty () )
0 commit comments