diff --git a/analysis/src/CompletionBackEnd.ml b/analysis/src/CompletionBackEnd.ml index 61acb9d08..dd8ebf2d4 100644 --- a/analysis/src/CompletionBackEnd.ml +++ b/analysis/src/CompletionBackEnd.ml @@ -55,7 +55,7 @@ let resolveOpens ~env opens ~package = (* loop(previous) *) [] opens -let completionForExporteds iterExported getDeclared ~prefix ~exact ~env +let completionForExporteds iterExported getDeclared ~prefix ~exact ~(env : QueryEnv.t) ~package ~namesUsed transformContents = let res = ref [] in iterExported (fun name stamp -> @@ -65,27 +65,32 @@ let completionForExporteds iterExported getDeclared ~prefix ~exact ~env | Some (declared : _ Declared.t) when not (Hashtbl.mem namesUsed declared.name.txt) -> Hashtbl.add namesUsed declared.name.txt (); + let docstring = + match ProcessCmt.fileForModule (env.file.moduleName ^ "." ^ name) ~package with + | Some file -> file.structure.docstring + | None -> declared.docstring + in res := { (Completion.create declared.name.txt ~env ~kind:(transformContents declared.item)) with deprecated = declared.deprecated; - docstring = declared.docstring; + docstring; } :: !res | _ -> ()); !res -let completionForExportedModules ~env ~prefix ~exact ~namesUsed = +let completionForExportedModules ~env ~package ~prefix ~exact ~namesUsed = completionForExporteds (Exported.iter env.QueryEnv.exported Exported.Module) - (Stamps.findModule env.file.stamps) ~prefix ~exact ~env ~namesUsed (fun m -> - Completion.Module m) + (Stamps.findModule env.file.stamps) ~prefix ~exact ~env ~package ~namesUsed + (fun m -> Completion.Module m) -let completionForExportedValues ~env ~prefix ~exact ~namesUsed = +let completionForExportedValues ~env ~package ~prefix ~exact ~namesUsed = completionForExporteds (Exported.iter env.QueryEnv.exported Exported.Value) - (Stamps.findValue env.file.stamps) ~prefix ~exact ~env ~namesUsed (fun v -> - Completion.Value v) + (Stamps.findValue env.file.stamps) ~prefix ~exact ~env ~package ~namesUsed + (fun v -> Completion.Value v) let completionForExportedTypes ~env ~prefix ~exact ~namesUsed = completionForExporteds (Exported.iter env.QueryEnv.exported Exported.Type) @@ -219,8 +224,8 @@ let kindToDetail name (kind : Completion.kind) = | Value typ -> typ |> Shared.typeToString | ObjLabel typ -> typ |> Shared.typeToString | Label typString -> typString - | Module _ -> "module" - | FileModule _ -> "file module" + | Module _ -> "" + | FileModule docstring -> docstring | Field ({typ; optional}, s) -> (* Handle optional fields. Checking for "?" is because sometimes optional fields are prefixed with "?" when completing, and at that point we don't @@ -247,21 +252,22 @@ let kindToDetail name (kind : Completion.kind) = | ExtractedType (extractedType, _) -> TypeUtils.extractedTypeToString extractedType -let findAllCompletions ~(env : QueryEnv.t) ~prefix ~exact ~namesUsed +let findAllCompletions ~(env : QueryEnv.t) ~package ~prefix ~exact ~namesUsed ~(completionContext : Completable.completionContext) = Log.log ("findAllCompletions uri:" ^ Uri.toString env.file.uri); match completionContext with | Value -> - completionForExportedValues ~env ~prefix ~exact ~namesUsed + completionForExportedValues ~env ~package ~prefix ~exact ~namesUsed @ completionsForExportedConstructors ~env ~prefix ~exact ~namesUsed - @ completionForExportedModules ~env ~prefix ~exact ~namesUsed + @ completionForExportedModules ~env ~package ~prefix ~exact ~namesUsed | Type -> - completionForExportedTypes ~env ~prefix ~exact ~namesUsed - @ completionForExportedModules ~env ~prefix ~exact ~namesUsed - | Module -> completionForExportedModules ~env ~prefix ~exact ~namesUsed + completionForExportedTypes ~env ~package ~prefix ~exact ~namesUsed + @ completionForExportedModules ~env ~package ~prefix ~exact ~namesUsed + | Module -> + completionForExportedModules ~env ~package ~prefix ~exact ~namesUsed | Field -> completionForExportedFields ~env ~prefix ~exact ~namesUsed - @ completionForExportedModules ~env ~prefix ~exact ~namesUsed + @ completionForExportedModules ~env ~package ~prefix ~exact ~namesUsed let processLocalValue name loc contextPath ~prefix ~exact ~env ~(localTables : LocalTables.t) = @@ -362,19 +368,20 @@ let processLocalModule name loc ~prefix ~exact ~env (Printf.sprintf "Completion Module Not Found %s loc:%s\n" name (Loc.toString loc)) -let getItemsFromOpens ~opens ~localTables ~prefix ~exact ~completionContext = +let getItemsFromOpens ~opens ~package ~localTables ~prefix ~exact + ~completionContext = opens |> List.fold_left (fun results env -> let completionsFromThisOpen = - findAllCompletions ~env ~prefix ~exact + findAllCompletions ~env ~package ~prefix ~exact ~namesUsed:localTables.LocalTables.namesUsed ~completionContext in completionsFromThisOpen @ results) [] let findLocalCompletionsForValuesAndConstructors ~(localTables : LocalTables.t) - ~env ~prefix ~exact ~opens ~scope = + ~env ~package ~prefix ~exact ~opens ~scope = localTables |> LocalTables.populateValues ~env; localTables |> LocalTables.populateConstructors ~env; localTables |> LocalTables.populateModules ~env; @@ -389,7 +396,7 @@ let findLocalCompletionsForValuesAndConstructors ~(localTables : LocalTables.t) (processLocalModule ~prefix ~exact ~env ~localTables); let valuesFromOpens = - getItemsFromOpens ~opens ~localTables ~prefix ~exact + getItemsFromOpens ~opens ~package ~localTables ~prefix ~exact ~completionContext:Value in @@ -404,8 +411,8 @@ let findLocalCompletionsForValuesAndConstructors ~(localTables : LocalTables.t) (processLocalModule ~prefix ~exact ~env ~localTables); List.rev_append localTables.resultRev valuesFromOpens -let findLocalCompletionsForValues ~(localTables : LocalTables.t) ~env ~prefix - ~exact ~opens ~scope = +let findLocalCompletionsForValues ~(localTables : LocalTables.t) ~env ~package + ~prefix ~exact ~opens ~scope = localTables |> LocalTables.populateValues ~env; localTables |> LocalTables.populateModules ~env; scope @@ -416,7 +423,7 @@ let findLocalCompletionsForValues ~(localTables : LocalTables.t) ~env ~prefix (processLocalModule ~prefix ~exact ~env ~localTables); let valuesFromOpens = - getItemsFromOpens ~opens ~localTables ~prefix ~exact + getItemsFromOpens ~opens ~package ~localTables ~prefix ~exact ~completionContext:Value in @@ -428,8 +435,8 @@ let findLocalCompletionsForValues ~(localTables : LocalTables.t) ~env ~prefix (processLocalModule ~prefix ~exact ~env ~localTables); List.rev_append localTables.resultRev valuesFromOpens -let findLocalCompletionsForTypes ~(localTables : LocalTables.t) ~env ~prefix - ~exact ~opens ~scope = +let findLocalCompletionsForTypes ~(localTables : LocalTables.t) ~env ~package + ~prefix ~exact ~opens ~scope = localTables |> LocalTables.populateTypes ~env; localTables |> LocalTables.populateModules ~env; scope @@ -440,7 +447,8 @@ let findLocalCompletionsForTypes ~(localTables : LocalTables.t) ~env ~prefix (processLocalModule ~prefix ~exact ~env ~localTables); let valuesFromOpens = - getItemsFromOpens ~opens ~localTables ~prefix ~exact ~completionContext:Type + getItemsFromOpens ~opens ~package ~localTables ~prefix ~exact + ~completionContext:Type in scope @@ -451,15 +459,15 @@ let findLocalCompletionsForTypes ~(localTables : LocalTables.t) ~env ~prefix (processLocalModule ~prefix ~exact ~env ~localTables); List.rev_append localTables.resultRev valuesFromOpens -let findLocalCompletionsForModules ~(localTables : LocalTables.t) ~env ~prefix - ~exact ~opens ~scope = +let findLocalCompletionsForModules ~(localTables : LocalTables.t) ~env ~package + ~prefix ~exact ~opens ~scope = localTables |> LocalTables.populateModules ~env; scope |> Scope.iterModulesBeforeFirstOpen (processLocalModule ~prefix ~exact ~env ~localTables); let valuesFromOpens = - getItemsFromOpens ~opens ~localTables ~prefix ~exact + getItemsFromOpens ~opens ~package ~localTables ~prefix ~exact ~completionContext:Module in @@ -468,8 +476,8 @@ let findLocalCompletionsForModules ~(localTables : LocalTables.t) ~env ~prefix (processLocalModule ~prefix ~exact ~env ~localTables); List.rev_append localTables.resultRev valuesFromOpens -let findLocalCompletionsWithOpens ~pos ~(env : QueryEnv.t) ~prefix ~exact ~opens - ~scope ~(completionContext : Completable.completionContext) = +let findLocalCompletionsWithOpens ~pos ~package ~(env : QueryEnv.t) ~prefix + ~exact ~opens ~scope ~(completionContext : Completable.completionContext) = (* TODO: handle arbitrary interleaving of opens and local bindings correctly *) Log.log ("findLocalCompletionsWithOpens uri:" ^ Uri.toString env.file.uri ^ " pos:" @@ -477,23 +485,25 @@ let findLocalCompletionsWithOpens ~pos ~(env : QueryEnv.t) ~prefix ~exact ~opens let localTables = LocalTables.create () in match completionContext with | Value -> - findLocalCompletionsForValuesAndConstructors ~localTables ~env ~prefix - ~exact ~opens ~scope + findLocalCompletionsForValuesAndConstructors ~localTables ~env ~package + ~prefix ~exact ~opens ~scope | Type -> - findLocalCompletionsForTypes ~localTables ~env ~prefix ~exact ~opens ~scope + findLocalCompletionsForTypes ~localTables ~env ~package ~prefix ~exact + ~opens ~scope | Module -> - findLocalCompletionsForModules ~localTables ~env ~prefix ~exact ~opens - ~scope + findLocalCompletionsForModules ~localTables ~env ~package ~prefix ~exact + ~opens ~scope | Field -> (* There's no local completion for fields *) [] -let getComplementaryCompletionsForTypedValue ~opens ~allFiles ~scope ~env prefix - = +let getComplementaryCompletionsForTypedValue ~opens ~allFiles ~scope ~env + ~package prefix = let exact = false in let localCompletionsWithOpens = let localTables = LocalTables.create () in - findLocalCompletionsForValues ~localTables ~env ~prefix ~exact ~opens ~scope + findLocalCompletionsForValues ~localTables ~env ~package ~prefix ~exact + ~opens ~scope in let fileModules = allFiles |> FileSet.elements @@ -518,8 +528,8 @@ let getCompletionsForPath ~debug ~package ~opens ~full ~pos ~exact ~scope | [] -> [] | [prefix] -> let localCompletionsWithOpens = - findLocalCompletionsWithOpens ~pos ~env ~prefix ~exact ~opens ~scope - ~completionContext + findLocalCompletionsWithOpens ~pos ~package ~env ~prefix ~exact ~opens + ~scope ~completionContext in let fileModules = allFiles |> FileSet.elements @@ -530,8 +540,14 @@ let getCompletionsForPath ~debug ~package ~opens ~full ~pos ~exact ~scope (* TODO complete the namespaced name too *) (String.contains name '-') then + let docstring = + match ProcessCmt.fileForModule ~package name with + | None -> [] + | Some file -> file.structure.docstring + in Some - (Completion.create name ~env ~kind:(Completion.FileModule name)) + (Completion.create name ~env ~docstring + ~kind:(Completion.FileModule name)) else None) in localCompletionsWithOpens @ fileModules @@ -541,7 +557,8 @@ let getCompletionsForPath ~debug ~package ~opens ~full ~pos ~exact ~scope | Some (env, prefix) -> Log.log "Got the env"; let namesUsed = Hashtbl.create 10 in - findAllCompletions ~env ~prefix ~exact ~namesUsed ~completionContext + findAllCompletions ~env ~package ~prefix ~exact ~namesUsed + ~completionContext | None -> []) let mkItem ~name ~kind ~detail ~deprecated ~docstring = @@ -1601,7 +1618,8 @@ let rec processCompletable ~debug ~full ~scope ~env ~pos ~forHover completable = if prefix = "" then [] else prefix - |> getComplementaryCompletionsForTypedValue ~opens ~allFiles ~env ~scope + |> getComplementaryCompletionsForTypedValue ~opens ~allFiles ~env + ~package ~scope in match contextPath diff --git a/analysis/tests/src/expected/Completion.res.txt b/analysis/tests/src/expected/Completion.res.txt index aef3b28be..ac59967b2 100644 --- a/analysis/tests/src/expected/Completion.res.txt +++ b/analysis/tests/src/expected/Completion.res.txt @@ -296,7 +296,7 @@ Path Array. "label": "Floatarray", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -816,7 +816,7 @@ Path O. "label": "Comp", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -874,14 +874,14 @@ Path Lis "label": "List", "kind": 9, "tags": [], - "detail": "file module", - "documentation": null + "detail": "List", + "documentation": {"kind": "markdown", "value": " List operations.\n\n Some functions are flagged as not tail-recursive. A tail-recursive\n function uses constant stack space, while a non-tail-recursive function\n uses stack space proportional to the length of its list argument, which\n can be a problem with very long lists. When the function takes several\n list arguments, an approximate formula giving stack usage (in some\n unspecified constant unit) is shown in parentheses.\n\n The above considerations can usually be ignored if your lists are not\n longer than about 10000 elements.\n"} }, { "label": "ListLabels", "kind": 9, "tags": [], - "detail": "file module", - "documentation": null + "detail": "ListLabels", + "documentation": {"kind": "markdown", "value": " List operations.\n\n Some functions are flagged as not tail-recursive. A tail-recursive\n function uses constant stack space, while a non-tail-recursive function\n uses stack space proportional to the length of its list argument, which\n can be a problem with very long lists. When the function takes several\n list arguments, an approximate formula giving stack usage (in some\n unspecified constant unit) is shown in parentheses.\n\n The above considerations can usually be ignored if your lists are not\n longer than about 10000 elements.\n"} }] Complete src/Completion.res 169:16 @@ -896,7 +896,7 @@ Path WithChildren "label": "WithChildren", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -971,7 +971,7 @@ Path For "label": "ForAuto", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -1205,7 +1205,7 @@ Path SomeLo "label": "SomeLocalModule", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -1261,7 +1261,7 @@ Path SomeLocal "label": "SomeLocalModule", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -1279,7 +1279,7 @@ Path SomeLocal "label": "SomeLocalModule", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -1648,13 +1648,13 @@ Path Res "label": "RescriptReactErrorBoundary", "kind": 9, "tags": [], - "detail": "file module", + "detail": "RescriptReactErrorBoundary", "documentation": null }, { "label": "RescriptReactRouter", "kind": 9, "tags": [], - "detail": "file module", + "detail": "RescriptReactRouter", "documentation": null }] @@ -1762,19 +1762,19 @@ Path T "label": "TableclothMap", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TableclothMap", "documentation": null }, { "label": "TypeAtPosCompletion", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TypeAtPosCompletion", "documentation": null }, { "label": "TypeDefinition", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TypeDefinition", "documentation": null }] diff --git a/analysis/tests/src/expected/CompletionFunctionArguments.res.txt b/analysis/tests/src/expected/CompletionFunctionArguments.res.txt index d15f00087..75342d6aa 100644 --- a/analysis/tests/src/expected/CompletionFunctionArguments.res.txt +++ b/analysis/tests/src/expected/CompletionFunctionArguments.res.txt @@ -169,19 +169,19 @@ Path someFnTakingVariant "label": "OIncludeMeInCompletions", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }, { "label": "Obj", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Obj", "documentation": null }, { "label": "Objects", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Objects", "documentation": null }] @@ -207,7 +207,7 @@ Path someFnTakingVariant "label": "Sort", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Sort", "documentation": null }] @@ -233,19 +233,19 @@ Path someFnTakingVariant "label": "OIncludeMeInCompletions", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }, { "label": "Obj", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Obj", "documentation": null }, { "label": "Objects", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Objects", "documentation": null }] diff --git a/analysis/tests/src/expected/CompletionJsxProps.res.txt b/analysis/tests/src/expected/CompletionJsxProps.res.txt index 43a91f799..26cb13822 100644 --- a/analysis/tests/src/expected/CompletionJsxProps.res.txt +++ b/analysis/tests/src/expected/CompletionJsxProps.res.txt @@ -66,19 +66,19 @@ Path CompletionSupport.TestComponent.make "label": "TableclothMap", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TableclothMap", "documentation": null }, { "label": "TypeAtPosCompletion", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TypeAtPosCompletion", "documentation": null }, { "label": "TypeDefinition", "kind": 9, "tags": [], - "detail": "file module", + "detail": "TypeDefinition", "documentation": null }] diff --git a/analysis/tests/src/expected/CompletionTypeAnnotation.res.txt b/analysis/tests/src/expected/CompletionTypeAnnotation.res.txt index cb0319ed2..e7b084e45 100644 --- a/analysis/tests/src/expected/CompletionTypeAnnotation.res.txt +++ b/analysis/tests/src/expected/CompletionTypeAnnotation.res.txt @@ -82,13 +82,13 @@ Path someVariant "label": "Obj", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Obj", "documentation": null }, { "label": "Objects", "kind": 9, "tags": [], - "detail": "file module", + "detail": "Objects", "documentation": null }] diff --git a/analysis/tests/src/expected/Jsx2.res.txt b/analysis/tests/src/expected/Jsx2.res.txt index b6f0c10e3..ee11ed9a6 100644 --- a/analysis/tests/src/expected/Jsx2.res.txt +++ b/analysis/tests/src/expected/Jsx2.res.txt @@ -46,26 +46,26 @@ Path M "label": "M", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }, { "label": "Map", "kind": 9, "tags": [], - "detail": "file module", - "documentation": null + "detail": "Map", + "documentation": {"kind": "markdown", "value": " Association tables over ordered types.\n\n This module implements applicative association tables, also known as\n finite maps or dictionaries, given a total ordering function\n over the keys.\n All operations over maps are purely applicative (no side-effects).\n The implementation uses balanced binary trees, and therefore searching\n and insertion take time logarithmic in the size of the map.\n\n For instance:\n {[\n module IntPairs =\n struct\n type t = int * int\n let compare (x0,y0) (x1,y1) =\n match Pervasives.compare x0 x1 with\n 0 -> Pervasives.compare y0 y1\n | c -> c\n end\n\n module PairsMap = Map.Make(IntPairs)\n\n let m = PairsMap.(empty |> add (0,1) \"hello\" |> add (1,0) \"world\")\n ]}\n\n This creates a new module [PairsMap], with a new type ['a PairsMap.t]\n of maps from [int * int] to ['a]. In this example, [m] contains [string]\n values so its type is [string PairsMap.t].\n"} }, { "label": "MapLabels", "kind": 9, "tags": [], - "detail": "file module", + "detail": "MapLabels", "documentation": null }, { "label": "MoreLabels", "kind": 9, "tags": [], - "detail": "file module", - "documentation": null + "detail": "MoreLabels", + "documentation": {"kind": "markdown", "value": " Extra labeled libraries.\n\n This meta-module provides labelized version of the {!Hashtbl},\n {!Map} and {!Set} modules.\n\n They only differ by their labels. They are provided to help\n porting from previous versions of OCaml.\n The contents of this module are subject to change.\n"} }] Complete src/Jsx2.res 22:19 @@ -336,7 +336,7 @@ Path WithChildren "label": "WithChildren", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -385,7 +385,7 @@ Path ReactDOMR "label": "ReactDOMRe", "kind": 9, "tags": [], - "detail": "file module", + "detail": "ReactDOMRe", "documentation": null }] @@ -495,7 +495,7 @@ Path Nested.Co "label": "Comp", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] @@ -511,7 +511,7 @@ Path Nested. "label": "Comp", "kind": 9, "tags": [], - "detail": "module", + "detail": "", "documentation": null }] diff --git a/analysis/tests/src/expected/RecoveryOnProp.res.txt b/analysis/tests/src/expected/RecoveryOnProp.res.txt index b8f163ba5..719a3cc1c 100644 --- a/analysis/tests/src/expected/RecoveryOnProp.res.txt +++ b/analysis/tests/src/expected/RecoveryOnProp.res.txt @@ -19,13 +19,13 @@ Path Res "label": "RescriptReactErrorBoundary", "kind": 9, "tags": [], - "detail": "file module", + "detail": "RescriptReactErrorBoundary", "documentation": null }, { "label": "RescriptReactRouter", "kind": 9, "tags": [], - "detail": "file module", + "detail": "RescriptReactRouter", "documentation": null }]