@@ -584,15 +584,17 @@ let completionsGetTypeEnv = function
584584 | _ -> None
585585
586586let 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))
590593 | {Completion. kind = Type typ ; env} :: _ -> (
591594 match TypeUtils. extractTypeFromResolvedType typ ~env ~full with
592595 | 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)
596598 | _ -> None
597599
598600let rec getCompletionsForContextPath ~full ~opens ~rawOpens ~allFiles ~pos ~env
@@ -1007,17 +1009,16 @@ let printConstructorArgs argsLen ~asSnippet =
10071009
10081010type completionMode = Pattern | Expression
10091011
1010- let rec completeTypedValue (t : SharedTypes.completionType ) ~env ~ full ~prefix
1012+ let rec completeTypedValue (t : SharedTypes.completionType ) ~full ~prefix
10111013 ~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 ->
10151016 [
10161017 Completion. create " true" ~kind: (Label " bool" ) ~env ;
10171018 Completion. create " false" ~kind: (Label " bool" ) ~env ;
10181019 ]
10191020 |> filterItems ~prefix
1020- | Some ( Tvariant {env; constructors; variantDecl; variantName} ) ->
1021+ | Tvariant {env; constructors; variantDecl; variantName} ->
10211022 constructors
10221023 |> List. map (fun (constructor : Constructor.t ) ->
10231024 let numArgs =
@@ -1037,7 +1038,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
10371038 (constructor, variantDecl |> Shared. declToString variantName))
10381039 ~env () )
10391040 |> filterItems ~prefix
1040- | Some ( Tpolyvariant {env; constructors; typeExpr} ) ->
1041+ | Tpolyvariant {env; constructors; typeExpr} ->
10411042 constructors
10421043 |> List. map (fun (constructor : polyVariantConstructor ) ->
10431044 Completion. createWithSnippet
@@ -1057,39 +1058,46 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
10571058 (constructor, typeExpr |> Shared. typeToString))
10581059 ~env () )
10591060 |> 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
10621065 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+ }))
10751080 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)
10831091 |> filterItems ~prefix
1084- | Some ( Tuple (env , exprs , typ ) ) ->
1092+ | Tuple (env , exprs , typ ) ->
10851093 let numExprs = List. length exprs in
10861094 [
10871095 Completion. createWithSnippet
10881096 ~name: (printConstructorArgs numExprs ~as Snippet:false )
10891097 ~insert Text:(printConstructorArgs numExprs ~as Snippet:true )
10901098 ~kind: (Value typ) ~env () ;
10911099 ]
1092- | Some ( Trecord {env; fields} as extractedType ) -> (
1100+ | Trecord {env; fields} as extractedType -> (
10931101 (* As we're completing for a record, we'll need a hint (completionContext)
10941102 here to figure out whether we should complete for a record field, or
10951103 the record body itself. *)
@@ -1112,7 +1120,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
11121120 ~sort Text:" A" ~kind: (ExtractedType extractedType) ~env () ;
11131121 ]
11141122 else [] )
1115- | Some ( TinlineRecord {env; fields} ) -> (
1123+ | TinlineRecord {env; fields} -> (
11161124 match completionContext with
11171125 | Some (Completable. RecordField {seenFields} ) ->
11181126 fields
@@ -1130,15 +1138,15 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
11301138 ~sort Text:" A" ~kind: (Label " Inline record" ) ~env () ;
11311139 ]
11321140 else [] )
1133- | Some ( Tarray (env , typeExpr ) ) ->
1141+ | Tarray (env , typeExpr ) ->
11341142 if prefix = " " then
11351143 [
11361144 Completion. createWithSnippet ~name: " []"
11371145 ~insert Text:(if ! Cfg. supportsSnippets then " [$0]" else " []" )
11381146 ~sort Text:" A" ~kind: (Value typeExpr) ~env () ;
11391147 ]
11401148 else []
1141- | Some ( Tstring env ) ->
1149+ | Tstring env ->
11421150 if prefix = " " then
11431151 [
11441152 Completion. createWithSnippet ~name: " \"\" "
@@ -1149,7 +1157,7 @@ let rec completeTypedValue (t : SharedTypes.completionType) ~env ~full ~prefix
11491157 ~env () ;
11501158 ]
11511159 else []
1152- | Some ( Tfunction {env; typ; args} ) when prefix = " " && mode = Expression ->
1160+ | Tfunction {env; typ; args} when prefix = " " && mode = Expression ->
11531161 let prettyPrintArgTyp ?currentIndex (argTyp : Types.type_expr ) =
11541162 let indexText =
11551163 match currentIndex with
@@ -1318,13 +1326,17 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
13181326 |> completionsGetTypeEnv
13191327 with
13201328 | 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
13221335 | None -> fallbackOrEmpty ()
1323- | Some (typ , env , completionContext ) ->
1336+ | Some (typ , _env , completionContext ) ->
13241337 let items =
13251338 typ
1326- |> completeTypedValue ~mode: Pattern ~env ~full ~prefix
1327- ~completion Context
1339+ |> completeTypedValue ~mode: Pattern ~full ~prefix ~completion Context
13281340 in
13291341 fallbackOrEmpty ~items () )
13301342 | None -> fallbackOrEmpty () )
@@ -1347,7 +1359,7 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover
13471359 in
13481360 let items =
13491361 typ
1350- |> completeTypedValue ~mode: Expression ~env ~ full ~prefix
1362+ |> completeTypedValue ~mode: Expression ~full ~prefix
13511363 ~completion Context
13521364 |> List. map (fun (c : Completion.t ) ->
13531365 if isJsx then
0 commit comments