diff --git a/CHANGELOG.md b/CHANGELOG.md index d24e34777..990cbb3c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ #### :bug: Bug Fix +- Fix issue where hovering over a field in record construction would show the type without instantiating its type arguments https://github.com/rescript-lang/rescript-vscode/pull/560 - Fix Incorrect semantic highlighting of `external` declarations https://github.com/rescript-lang/rescript-vscode/pull/517 - Fix issue where doc comment with nested comments inside is not shown properly on hover https://github.com/rescript-lang/rescript-vscode/pull/526 - Fix server crashes when open file is removed from disk with inlayHints enabled https://github.com/rescript-lang/rescript-vscode/issues/538 diff --git a/analysis/src/ProcessExtra.ml b/analysis/src/ProcessExtra.ml index e60a3682e..d54680531 100644 --- a/analysis/src/ProcessExtra.ml +++ b/analysis/src/ProcessExtra.ml @@ -210,7 +210,7 @@ let getTypeAtPath ~env path = | Some declaredType -> `Local declaredType | None -> `Not_found) -let addForField ~env ~extra recordType fieldType {Asttypes.txt; loc} = +let addForField ~env ~extra ~recordType ~fieldType {Asttypes.txt; loc} = match (Shared.dig recordType).desc with | Tconstr (path, _args, _memo) -> let t = getTypeAtPath ~env path in @@ -232,12 +232,12 @@ let addForField ~env ~extra recordType fieldType {Asttypes.txt; loc} = addLocItem extra nameLoc (Typed (name, fieldType, locType)) | _ -> () -let addForRecord ~env ~extra recordType items = +let addForRecord ~env ~extra ~recordType items = match (Shared.dig recordType).desc with | Tconstr (path, _args, _memo) -> let t = getTypeAtPath ~env path in items - |> List.iter (fun ({Asttypes.txt; loc}, {Types.lbl_res}, _) -> + |> List.iter (fun ({Asttypes.txt; loc}, _, _) -> (* let name = Longident.last(txt); *) let name = handleConstructor txt in let nameLoc = Utils.endOfLocation loc (String.length name) in @@ -254,7 +254,7 @@ let addForRecord ~env ~extra recordType items = GlobalReference (moduleName, path, Field name) | _ -> NotFound in - addLocItem extra nameLoc (Typed (name, lbl_res, locType))) + addLocItem extra nameLoc (Typed (name, recordType, locType))) | _ -> () let addForConstructor ~env ~extra constructorType {Asttypes.txt; loc} @@ -373,7 +373,8 @@ let pat ~(file : File.t) ~env ~extra (iter : Tast_iterator.iterator) in (* Log.log("Entering pattern " ++ Utils.showLocation(pat_loc)); *) (match pattern.pat_desc with - | Tpat_record (items, _) -> addForRecord ~env ~extra pattern.pat_type items + | Tpat_record (items, _) -> + addForRecord ~env ~extra ~recordType:pattern.pat_type items | Tpat_construct (lident, constructor, _) -> addForConstructor ~env ~extra pattern.pat_type lident constructor | Tpat_alias (_inner, ident, name) -> @@ -400,7 +401,7 @@ let expr ~env ~(extra : extra) (iter : Tast_iterator.iterator) (Some (expression.exp_type, Value)) path txt loc | Texp_record {fields} -> - addForRecord ~env ~extra expression.exp_type + addForRecord ~env ~extra ~recordType:expression.exp_type (fields |> Array.to_list |> Utils.filterMap (fun (desc, item) -> match item with @@ -415,7 +416,8 @@ let expr ~env ~(extra : extra) (iter : Tast_iterator.iterator) | Texp_construct (lident, constructor, _args) -> addForConstructor ~env ~extra expression.exp_type lident constructor | Texp_field (inner, lident, _label_description) -> - addForField ~env ~extra inner.exp_type expression.exp_type lident + addForField ~env ~extra ~recordType:inner.exp_type + ~fieldType:expression.exp_type lident | _ -> ()); Tast_iterator.default_iterator.expr iter expression diff --git a/analysis/tests/src/Hover.res b/analysis/tests/src/Hover.res index be0fd1be9..236381562 100644 --- a/analysis/tests/src/Hover.res +++ b/analysis/tests/src/Hover.res @@ -155,3 +155,16 @@ module ModWithDocComment = { /*** module level doc comment 2 */ } + +module TypeSubstitutionRecords = { + type foo<'a> = {content: 'a, zzz: string} + type bar = {age: int} + type foobar = foo + + // ^db+ + + let x1: foo = {content: {age: 42}, zzz: ""} + // ^hov + let x2: foobar = {content: {age: 42}, zzz: ""} + // ^hov +} diff --git a/analysis/tests/src/expected/Hover.res.txt b/analysis/tests/src/expected/Hover.res.txt index 91db38a50..7f067dd9d 100644 --- a/analysis/tests/src/expected/Hover.res.txt +++ b/analysis/tests/src/expected/Hover.res.txt @@ -104,3 +104,25 @@ Hover src/Hover.res 142:9 Hover src/Hover.res 146:6 {"contents": "```rescript\nint\n```\n\n doc comment 2 "} + +Hover src/Hover.res 165:23 +Ident!! Dep +Ident!! JsLogger +Ident!! A +Ident!! B +Ident!! Comp +locItems: + 165:22-165:29 Typed content foo (LocalReference Field(content)) +[ref] Local defn Field(content) +{"contents": "```rescript\nfoo\n```\n\n```rescript\ntype foo<'a> = {content: 'a, zzz: string}\n```"} + +Hover src/Hover.res 167:22 +Ident!! Dep +Ident!! JsLogger +Ident!! A +Ident!! B +Ident!! Comp +locItems: + 167:20-167:27 Typed content foobar NotFound +{"contents": "```rescript\nfoobar\n```\n\n```rescript\ntype foobar = foo\n```"} +