@@ -584,15 +584,17 @@ let completionsGetTypeEnv = function
584
584
| _ -> None
585
585
586
586
let completionsGetCompletionType ~full = function
587
- | {Completion. kind = Value typ ; env} :: _ -> Some (TypeExpr typ, env)
588
- | {Completion. kind = ObjLabel typ ; env} :: _ -> Some (TypeExpr typ, env)
589
- | {Completion. kind = Field ({typ} , _ ); env} :: _ -> Some (TypeExpr typ, env)
587
+ | {Completion. kind = Value typ; env} :: _
588
+ | {Completion. kind = ObjLabel typ; env} :: _
589
+ | {Completion. kind = Field ({typ} , _ ); env} :: _ ->
590
+ typ
591
+ |> TypeUtils. extractType ~env ~package: full.package
592
+ |> Option. map (fun typ -> (typ, env))
590
593
| {Completion. kind = Type typ ; env} :: _ -> (
591
594
match TypeUtils. extractTypeFromResolvedType typ ~env ~full with
592
595
| None -> None
593
- | Some extractedType -> Some (ExtractedType extractedType, env))
594
- | {Completion. kind = ExtractedType typ ; env} :: _ ->
595
- Some (ExtractedType typ, env)
596
+ | Some extractedType -> Some (extractedType, env))
597
+ | {Completion. kind = ExtractedType typ ; env} :: _ -> Some (typ, env)
596
598
| _ -> None
597
599
598
600
let rec getCompletionsForContextPath ~full ~opens ~rawOpens ~allFiles ~pos ~env
@@ -1007,17 +1009,16 @@ let printConstructorArgs argsLen ~asSnippet =
1007
1009
1008
1010
type completionMode = Pattern | Expression
1009
1011
1010
- let rec completeTypedValue (t : SharedTypes.completionType ) ~env ~ full ~prefix
1012
+ let rec completeTypedValue (t : SharedTypes.completionType ) ~full ~prefix
1011
1013
~completionContext ~mode =
1012
- let extractedType = t |> TypeUtils. extractTypeFromCompletionType ~env ~full in
1013
- match extractedType with
1014
- | Some (Tbool env ) ->
1014
+ match t with
1015
+ | Tbool env ->
1015
1016
[
1016
1017
Completion. create " true" ~kind: (Label " bool" ) ~env ;
1017
1018
Completion. create " false" ~kind: (Label " bool" ) ~env ;
1018
1019
]
1019
1020
|> filterItems ~prefix
1020
- | Some ( Tvariant {env; constructors; variantDecl; variantName} ) ->
1021
+ | Tvariant {env; constructors; variantDecl; variantName} ->
1021
1022
constructors
1022
1023
|> List. map (fun (constructor : Constructor.t ) ->
1023
1024
let numArgs =
@@ -1037,7 +1038,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
1037
1038
(constructor, variantDecl |> Shared. declToString variantName))
1038
1039
~env () )
1039
1040
|> filterItems ~prefix
1040
- | Some ( Tpolyvariant {env; constructors; typeExpr} ) ->
1041
+ | Tpolyvariant {env; constructors; typeExpr} ->
1041
1042
constructors
1042
1043
|> List. map (fun (constructor : polyVariantConstructor ) ->
1043
1044
Completion. createWithSnippet
@@ -1057,39 +1058,46 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
1057
1058
(constructor, typeExpr |> Shared. typeToString))
1058
1059
~env () )
1059
1060
|> filterItems ~prefix
1060
- | Some (Toption (env , t )) ->
1061
- let innerType = Utils. unwrapIfOption t in
1061
+ | Toption (env , t ) ->
1062
+ let innerType =
1063
+ Utils. unwrapIfOption t |> TypeUtils. extractType ~env ~package: full.package
1064
+ in
1062
1065
let expandedCompletions =
1063
- TypeExpr innerType
1064
- |> completeTypedValue ~env ~full ~prefix ~completion Context ~mode
1065
- |> List. map (fun (c : Completion.t ) ->
1066
- {
1067
- c with
1068
- name = " Some(" ^ c.name ^ " )" ;
1069
- sortText = None ;
1070
- insertText =
1071
- (match c.insertText with
1072
- | None -> None
1073
- | Some insertText -> Some (" Some(" ^ insertText ^ " )" ));
1074
- })
1066
+ innerType
1067
+ |> Option. map (fun innerType ->
1068
+ innerType
1069
+ |> completeTypedValue ~full ~prefix ~completion Context ~mode
1070
+ |> List. map (fun (c : Completion.t ) ->
1071
+ {
1072
+ c with
1073
+ name = " Some(" ^ c.name ^ " )" ;
1074
+ sortText = None ;
1075
+ insertText =
1076
+ (match c.insertText with
1077
+ | None -> None
1078
+ | Some insertText -> Some (" Some(" ^ insertText ^ " )" ));
1079
+ }))
1075
1080
in
1076
- [
1077
- Completion. create " None" ~kind: (Label (t |> Shared. typeToString)) ~env ;
1078
- Completion. createWithSnippet ~name: " Some(_)"
1079
- ~kind: (Label (t |> Shared. typeToString))
1080
- ~env ~insert Text:" Some(${1:_})" () ;
1081
- ]
1082
- @ expandedCompletions
1081
+ ([
1082
+ Completion. create " None" ~kind: (Label (t |> Shared. typeToString)) ~env ;
1083
+ Completion. createWithSnippet ~name: " Some(_)"
1084
+ ~kind: (Label (t |> Shared. typeToString))
1085
+ ~env ~insert Text:" Some(${1:_})" () ;
1086
+ ]
1087
+ @
1088
+ match expandedCompletions with
1089
+ | None -> []
1090
+ | Some expandedCompletions -> expandedCompletions)
1083
1091
|> filterItems ~prefix
1084
- | Some ( Tuple (env , exprs , typ ) ) ->
1092
+ | Tuple (env , exprs , typ ) ->
1085
1093
let numExprs = List. length exprs in
1086
1094
[
1087
1095
Completion. createWithSnippet
1088
1096
~name: (printConstructorArgs numExprs ~as Snippet:false )
1089
1097
~insert Text:(printConstructorArgs numExprs ~as Snippet:true )
1090
1098
~kind: (Value typ) ~env () ;
1091
1099
]
1092
- | Some ( Trecord {env; fields} as extractedType ) -> (
1100
+ | Trecord {env; fields} as extractedType -> (
1093
1101
(* As we're completing for a record, we'll need a hint (completionContext)
1094
1102
here to figure out whether we should complete for a record field, or
1095
1103
the record body itself. *)
@@ -1112,7 +1120,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
1112
1120
~sort Text:" A" ~kind: (ExtractedType extractedType) ~env () ;
1113
1121
]
1114
1122
else [] )
1115
- | Some ( TinlineRecord {env; fields} ) -> (
1123
+ | TinlineRecord {env; fields} -> (
1116
1124
match completionContext with
1117
1125
| Some (Completable. RecordField {seenFields} ) ->
1118
1126
fields
@@ -1130,15 +1138,15 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
1130
1138
~sort Text:" A" ~kind: (Label " Inline record" ) ~env () ;
1131
1139
]
1132
1140
else [] )
1133
- | Some ( Tarray (env , typeExpr ) ) ->
1141
+ | Tarray (env , typeExpr ) ->
1134
1142
if prefix = " " then
1135
1143
[
1136
1144
Completion. createWithSnippet ~name: " []"
1137
1145
~insert Text:(if ! Cfg. supportsSnippets then " [$0]" else " []" )
1138
1146
~sort Text:" A" ~kind: (Value typeExpr) ~env () ;
1139
1147
]
1140
1148
else []
1141
- | Some ( Tstring env ) ->
1149
+ | Tstring env ->
1142
1150
if prefix = " " then
1143
1151
[
1144
1152
Completion. createWithSnippet ~name: " \"\" "
@@ -1149,7 +1157,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
1149
1157
~env () ;
1150
1158
]
1151
1159
else []
1152
- | Some ( Tfunction {env; typ; args} ) when prefix = " " && mode = Expression ->
1160
+ | Tfunction {env; typ; args} when prefix = " " && mode = Expression ->
1153
1161
let prettyPrintArgTyp ?currentIndex (argTyp : Types.type_expr ) =
1154
1162
let indexText =
1155
1163
match currentIndex with
@@ -1318,13 +1326,17 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
1318
1326
|> completionsGetTypeEnv
1319
1327
with
1320
1328
| Some (typ , env ) -> (
1321
- match TypeExpr typ |> TypeUtils. resolveNested ~env ~full ~nested with
1329
+ match
1330
+ typ
1331
+ |> TypeUtils. extractType ~env ~package: full.package
1332
+ |> Utils.Option. flatMap (fun typ ->
1333
+ typ |> TypeUtils. resolveNested ~env ~full ~nested )
1334
+ with
1322
1335
| None -> fallbackOrEmpty ()
1323
- | Some (typ , env , completionContext ) ->
1336
+ | Some (typ , _env , completionContext ) ->
1324
1337
let items =
1325
1338
typ
1326
- |> completeTypedValue ~mode: Pattern ~env ~full ~prefix
1327
- ~completion Context
1339
+ |> completeTypedValue ~mode: Pattern ~full ~prefix ~completion Context
1328
1340
in
1329
1341
fallbackOrEmpty ~items () )
1330
1342
| None -> fallbackOrEmpty () )
@@ -1347,7 +1359,7 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
1347
1359
in
1348
1360
let items =
1349
1361
typ
1350
- |> completeTypedValue ~mode: Expression ~env ~ full ~prefix
1362
+ |> completeTypedValue ~mode: Expression ~full ~prefix
1351
1363
~completion Context
1352
1364
|> List. map (fun (c : Completion.t ) ->
1353
1365
if isJsx then
0 commit comments