@@ -1047,10 +1047,10 @@ let printConstructorArgs argsLen ~asSnippet =
1047
1047
if List. length ! args > 0 then " (" ^ (! args |> String. concat " , " ) ^ " )"
1048
1048
else " "
1049
1049
1050
- type completionMode = Pattern | Expression
1050
+ type completionMode = Pattern of Completable .patternMode option | Expression
1051
1051
1052
- let rec completeTypedValue ( t : SharedTypes.completionType ) ~full ~prefix
1053
- ~ completionContext ~ mode =
1052
+ let rec completeTypedValue ~full ~prefix ~ completionContext ~ mode
1053
+ ( t : SharedTypes.completionType ) =
1054
1054
match t with
1055
1055
| Tbool env ->
1056
1056
[
@@ -1142,10 +1142,23 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
1142
1142
|> List. filter (fun (field : field ) ->
1143
1143
List. mem field.fname.txt seenFields = false )
1144
1144
|> 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 )
1149
1162
|> filterItems ~prefix
1150
1163
| None ->
1151
1164
if prefix = " " then
@@ -1157,7 +1170,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
1157
1170
(ExtractedType
1158
1171
( extractedType,
1159
1172
match mode with
1160
- | Pattern -> `Type
1173
+ | Pattern _ -> `Type
1161
1174
| Expression -> `Value ))
1162
1175
~env () ;
1163
1176
]
@@ -1190,7 +1203,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~full ~prefix
1190
1203
(ExtractedType
1191
1204
( typ,
1192
1205
match mode with
1193
- | Pattern -> `Type
1206
+ | Pattern _ -> `Type
1194
1207
| Expression -> `Value ))
1195
1208
~env () ;
1196
1209
]
@@ -1360,7 +1373,7 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
1360
1373
Utils. startsWith name prefix
1361
1374
&& (forHover || not (List. mem name identsSeen)))
1362
1375
|> List. map mkLabel
1363
- | Cpattern {contextPath; prefix; nested; fallback} -> (
1376
+ | Cpattern {contextPath; prefix; nested; fallback; patternMode } -> (
1364
1377
let fallbackOrEmpty ?items () =
1365
1378
match (fallback, items) with
1366
1379
| Some fallback , (None | Some [] ) ->
@@ -1385,7 +1398,8 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
1385
1398
| Some (typ , _env , completionContext ) ->
1386
1399
let items =
1387
1400
typ
1388
- |> completeTypedValue ~mode: Pattern ~full ~prefix ~completion Context
1401
+ |> completeTypedValue ~mode: (Pattern patternMode) ~full ~prefix
1402
+ ~completion Context
1389
1403
in
1390
1404
fallbackOrEmpty ~items () )
1391
1405
| None -> fallbackOrEmpty () )
0 commit comments