Skip to content

Commit 34bd896

Browse files
committed
Follow through type definitions during object completion.
The type of a nested object can be spread across several type definitions sometimes across several files. When completing `foo["x"]["y"]["z`, look up the type definitions to expand them when traversing the type.
1 parent 377e5e1 commit 34bd896

File tree

6 files changed

+58
-1
lines changed

6 files changed

+58
-1
lines changed

analysis/src/NewCompletions.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1159,10 +1159,17 @@ let processCompletable ~findItems ~full ~package ~rawOpens
11591159
| Tvar None -> []
11601160
| _ -> []
11611161
in
1162+
let envRef = ref (QueryEnv.fromFile full.file) in
11621163
let rec getObj (t : Types.type_expr) =
11631164
match t.desc with
11641165
| Tlink t1 | Tsubst t1 | Tpoly (t1, []) -> getObj t1
11651166
| Tobject (tObj, _) -> getFields tObj
1167+
| Tconstr (path, _, _) -> (
1168+
match Hover.digConstructor ~env:envRef.contents ~package path with
1169+
| Some (env, {item = {decl = {type_manifest = Some tt}}}) ->
1170+
envRef := env;
1171+
getObj tt
1172+
| _ -> [])
11661173
| _ -> []
11671174
in
11681175
let fields =

analysis/tests/src/Completion.res

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,10 @@ let someObj = {"name": "a", "age": 32}
7676
let nestedObj = {"x": {"y": {"name": "a", "age": 32}}}
7777

7878
//^com nestedObj["x"]["y"]["
79+
80+
let o : Obj.objT = assert false
81+
//^com o["a
82+
83+
type nestedObjT = {"x": Obj.nestedObjT}
84+
let no : nestedObjT = assert false
85+
//^com no["x"]["y"]["

analysis/tests/src/Obj.res

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
type objT = {"name": string, "age": int}
2+
3+
type nestedObjT = {"y": objT}

analysis/tests/src/expected/Completion.res.txt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,21 @@ DocumentSymbol tests/src/Completion.res
539539
"name": "nestedObj",
540540
"kind": 19,
541541
"location": {"uri": "Completion.res", "range": {"start": {"line": 75, "character": 4}, "end": {"line": 75, "character": 13}}}
542+
},
543+
{
544+
"name": "o",
545+
"kind": 13,
546+
"location": {"uri": "Completion.res", "range": {"start": {"line": 79, "character": 4}, "end": {"line": 79, "character": 5}}}
547+
},
548+
{
549+
"name": "nestedObjT",
550+
"kind": 26,
551+
"location": {"uri": "Completion.res", "range": {"start": {"line": 82, "character": 0}, "end": {"line": 82, "character": 39}}}
552+
},
553+
{
554+
"name": "no",
555+
"kind": 13,
556+
"location": {"uri": "Completion.res", "range": {"start": {"line": 83, "character": 4}, "end": {"line": 83, "character": 6}}}
542557
}
543558
]
544559

@@ -626,3 +641,27 @@ Complete tests/src/Completion.res 76:2
626641
"documentation": null
627642
}]
628643

644+
Complete tests/src/Completion.res 79:2
645+
[{
646+
"label": "age",
647+
"kind": 4,
648+
"tags": [],
649+
"detail": "int",
650+
"documentation": null
651+
}]
652+
653+
Complete tests/src/Completion.res 83:2
654+
[{
655+
"label": "name",
656+
"kind": 4,
657+
"tags": [],
658+
"detail": "string",
659+
"documentation": null
660+
}, {
661+
"label": "age",
662+
"kind": 4,
663+
"tags": [],
664+
"detail": "int",
665+
"documentation": null
666+
}]
667+

analysis/tests/src/expected/Debug.res.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Dependencies: @rescript/react
33
Source directories: tests/node_modules/@rescript/react/./src tests/node_modules/@rescript/react/./src/legacy
44
Source files: tests/node_modules/@rescript/react/./src/React.res tests/node_modules/@rescript/react/./src/ReactDOM.res tests/node_modules/@rescript/react/./src/ReactDOMServer.res tests/node_modules/@rescript/react/./src/ReactDOMStyle.res tests/node_modules/@rescript/react/./src/ReactEvent.res tests/node_modules/@rescript/react/./src/ReactEvent.resi tests/node_modules/@rescript/react/./src/ReactTestUtils.res tests/node_modules/@rescript/react/./src/ReactTestUtils.resi tests/node_modules/@rescript/react/./src/RescriptReactErrorBoundary.res tests/node_modules/@rescript/react/./src/RescriptReactErrorBoundary.resi tests/node_modules/@rescript/react/./src/RescriptReactRouter.res tests/node_modules/@rescript/react/./src/RescriptReactRouter.resi tests/node_modules/@rescript/react/./src/legacy/ReactDOMRe.res tests/node_modules/@rescript/react/./src/legacy/ReasonReact.res
55
Source directories: tests/src
6-
Source files: tests/src/Auto.res tests/src/Completion.res tests/src/Component.res tests/src/Component.resi tests/src/Cross.res tests/src/Debug.res tests/src/Definition.res tests/src/DefinitionWithInterface.res tests/src/DefinitionWithInterface.resi tests/src/Div.res tests/src/Fragment.res tests/src/Hover.res tests/src/Jsx.res tests/src/Jsx.resi tests/src/Patterns.res tests/src/RecModules.res tests/src/RecordCompletion.res tests/src/References.res tests/src/ReferencesWithInterface.res tests/src/ReferencesWithInterface.resi tests/src/Rename.res tests/src/RenameWithInterface.res tests/src/RenameWithInterface.resi tests/src/TypeDefinition.res
6+
Source files: tests/src/Auto.res tests/src/Completion.res tests/src/Component.res tests/src/Component.resi tests/src/Cross.res tests/src/Debug.res tests/src/Definition.res tests/src/DefinitionWithInterface.res tests/src/DefinitionWithInterface.resi tests/src/Div.res tests/src/Fragment.res tests/src/Hover.res tests/src/Jsx.res tests/src/Jsx.resi tests/src/Obj.res tests/src/Patterns.res tests/src/RecModules.res tests/src/RecordCompletion.res tests/src/References.res tests/src/ReferencesWithInterface.res tests/src/ReferencesWithInterface.resi tests/src/Rename.res tests/src/RenameWithInterface.res tests/src/RenameWithInterface.resi tests/src/TypeDefinition.res
77
Impl cmt:tests/lib/bs/./src/Auto.cmt res:tests/src/Auto.res
88
Impl cmt:tests/lib/bs/./src/Completion.cmt res:tests/src/Completion.res
99
IntfAndImpl cmti:tests/lib/bs/./src/Component.cmti resi:tests/src/Component.resi cmt:tests/lib/bs/./src/Component.cmt res:tests/src/Component.res
@@ -15,6 +15,7 @@ Impl cmt:tests/lib/bs/./src/Div.cmt res:tests/src/Div.res
1515
Impl cmt:tests/lib/bs/./src/Fragment.cmt res:tests/src/Fragment.res
1616
Impl cmt:tests/lib/bs/./src/Hover.cmt res:tests/src/Hover.res
1717
IntfAndImpl cmti:tests/lib/bs/./src/Jsx.cmti resi:tests/src/Jsx.resi cmt:tests/lib/bs/./src/Jsx.cmt res:tests/src/Jsx.res
18+
Impl cmt:tests/lib/bs/./src/Obj.cmt res:tests/src/Obj.res
1819
Impl cmt:tests/lib/bs/./src/Patterns.cmt res:tests/src/Patterns.res
1920
Impl cmt:tests/lib/bs/./src/RecModules.cmt res:tests/src/RecModules.res
2021
Impl cmt:tests/lib/bs/./src/RecordCompletion.cmt res:tests/src/RecordCompletion.res

analysis/tests/src/expected/Obj.res.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)