@@ -112,7 +112,7 @@ let rec extractType ~env ~package (t : Types.type_expr) =
112112 match t.desc with
113113 | Tlink t1 | Tsubst t1 | Tpoly (t1 , [] ) -> extractType ~env ~package t1
114114 | Tconstr (Path. Pident {name = "option" } , [payloadTypeExpr ], _ ) ->
115- Some (Completable. Toption (env, payloadTypeExpr))
115+ Some (Toption (env, payloadTypeExpr))
116116 | Tconstr (Path. Pident {name = "array" } , [payloadTypeExpr ], _ ) ->
117117 Some (Tarray (env, payloadTypeExpr))
118118 | Tconstr (Path. Pident {name = "bool" } , [] , _ ) -> Some (Tbool env)
@@ -126,7 +126,7 @@ let rec extractType ~env ~package (t : Types.type_expr) =
126126 (Tvariant
127127 {env; constructors; variantName = name.txt; variantDecl = decl})
128128 | Some (env , {item = {kind = Record fields } } ) ->
129- Some (Trecord {env; fields; typeExpr = t})
129+ Some (Trecord {env; fields; name = `TypeExpr t})
130130 | _ -> None )
131131 | Ttuple expressions -> Some (Tuple (env, expressions, t))
132132 | Tvariant {row_fields} ->
@@ -244,15 +244,17 @@ let rec resolveTypeForPipeCompletion ~env ~package ~lhsLoc ~full
244244
245245let extractTypeFromCompletionType (t : completionType ) ~env ~full =
246246 match t with
247+ | ExtractedType extractedType -> Some extractedType
247248 | TypeExpr t -> t |> extractType ~env ~package: full.package
248249 | InlineRecord fields -> Some (TinlineRecord {env; fields})
249250 | ResolvedType typ -> (
250251 match typ.kind with
251252 | Tuple items -> Some (Tuple (env, items, Ctype. newty (Ttuple items)))
252- | Record fields -> Some (TinlineRecord {env; fields})
253+ | Record fields -> Some (Trecord {env; fields; name = `Str typ.name })
253254 | Variant constructors ->
254255 Some
255- (Tvariant {env; constructors; variantName = " " ; variantDecl = typ.decl})
256+ (Tvariant
257+ {env; constructors; variantName = typ.name; variantDecl = typ.decl})
256258 | Abstract _ | Open -> (
257259 match typ.decl.type_manifest with
258260 | None -> None
@@ -279,8 +281,15 @@ let rec resolveNested (typ : completionType) ~env ~full ~nested =
279281 | Some {typ; optional} ->
280282 let typ = if optional then Utils. unwrapIfOption typ else typ in
281283 TypeExpr typ |> resolveNested ~env ~full ~nested )
282- | NRecordBody {seenFields} , Some (Trecord {env; typeExpr} ) ->
284+ | NRecordBody {seenFields}, Some (Trecord {env; name = `TypeExpr typeExpr})
285+ ->
283286 Some (TypeExpr typeExpr, env, Some (Completable. RecordField {seenFields}))
287+ | ( NRecordBody {seenFields},
288+ Some (Trecord {env; name = `Str _} as extractedType) ) ->
289+ Some
290+ ( ExtractedType extractedType,
291+ env,
292+ Some (Completable. RecordField {seenFields}) )
284293 | NRecordBody {seenFields} , Some (TinlineRecord {env; fields} ) ->
285294 Some
286295 (InlineRecord fields, env, Some (Completable. RecordField {seenFields}))
@@ -362,3 +371,28 @@ let contextPathFromCoreType (coreType : Parsetree.core_type) =
362371 | Ptyp_constr (loc , [] ) ->
363372 Some (Completable. CPId (loc.txt |> Utils. flattenLongIdent, Type ))
364373 | _ -> None
374+
375+ let printRecordFromFields ?name (fields : field list ) =
376+ (match name with
377+ | None -> " "
378+ | Some name -> " type " ^ name ^ " = " )
379+ ^ " {"
380+ ^ (fields
381+ |> List. map (fun f -> f.fname.txt ^ " : " ^ Shared. typeToString f.typ)
382+ |> String. concat " , " )
383+ ^ " }"
384+
385+ let extractedTypeToString = function
386+ | Tuple (_, _, typ)
387+ | Toption (_, typ)
388+ | Tpolyvariant {typeExpr = typ}
389+ | Tfunction {typ}
390+ | Trecord {name = `TypeExpr typ } ->
391+ Shared. typeToString typ
392+ | Tbool _ -> " bool"
393+ | Tstring _ -> " string"
394+ | Tarray (_ , innerTyp ) -> " array<" ^ Shared. typeToString innerTyp ^ " >"
395+ | Tvariant {variantDecl; variantName} ->
396+ Shared. declToString variantName variantDecl
397+ | Trecord {name = `Str name ; fields} -> printRecordFromFields ~name fields
398+ | TinlineRecord {fields} -> printRecordFromFields fields
0 commit comments