Skip to content

Commit 791f322

Browse files
cristianocchenglou
authored andcommitted
Add support for @deprecated attributes in autocomplete and hover.
Add support for `@deprecated` attributes in autocomplete and hover. For autocomplete: tell the client that the item is deprecated (typically shown with a strike-through by the client). Also, show the deprecation message. For hover, show the deprecation message. See rescript-lang/rescript-vscode#45
1 parent 9e0bb72 commit 791f322

File tree

10 files changed

+158
-58
lines changed

10 files changed

+158
-58
lines changed

Changes.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
## master
2+
- Add support for @deprecated attributes in autocomplete and hover.
3+
4+
## Upcoming Release of rescript-vscode
25

36
#### New features
47
- Add support for autocomplete for pipe-first `foo->`: the type of `foo` is used to determine the module to take completions from.

editor-extensions/vscode/package-lock.json

Lines changed: 29 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editor-extensions/vscode/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"url": "https://github.com/jaredly/reason-language-server"
1111
},
1212
"engines": {
13-
"vscode": "^1.22.0"
13+
"vscode": "^1.43.0"
1414
},
1515
"categories": [
1616
"Other"
@@ -143,7 +143,7 @@
143143
},
144144
"devDependencies": {
145145
"vscode": "^1.1.17",
146-
"vscode-languageclient": "^4.1.3",
146+
"vscode-languageclient": "^6.1.3",
147147
"vscode-languageserver-types": "^3.14.0",
148148
"typescript": "^2.8.1"
149149
}

examples/example-project/src/ZZ.res

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,3 +111,17 @@ module Lib = {
111111
let next = (~number=0, ~year) => number + year
112112
}
113113

114+
@ocaml.doc("This module is commented")
115+
@deprecated("This module is deprecated")
116+
module Dep : {
117+
@ocaml.doc("Some doc comment")
118+
@deprecated("Use customDouble instead")
119+
let customDouble : int => int
120+
121+
let customDouble2 : int => int
122+
} = {
123+
let customDouble = foo => foo * 2
124+
let customDouble2 = foo => foo * 2
125+
}
126+
127+
let cc = Dep.customDouble(11)

src/rescript-editor-support/Hover.re

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ let codeBlock = code => {
1818

1919
let showModuleTopLevel =
2020
(
21+
~deprecated,
2122
~docstring,
2223
~name,
2324
topLevel: list(SharedTypes.declared(SharedTypes.moduleItem)),
@@ -41,20 +42,27 @@ let showModuleTopLevel =
4142
| None => ""
4243
| Some(s) => "\n" ++ s ++ "\n"
4344
};
44-
Some(doc ++ codeBlock(full));
45+
let depr =
46+
switch (deprecated) {
47+
| None => ""
48+
| Some(s) => "\n Deprecated: " ++ s ++ "\n"
49+
};
50+
Some(depr ++ doc ++ codeBlock(full));
4551
};
4652

4753
let showModule =
4854
(
55+
~deprecated,
4956
~docstring,
5057
~file: SharedTypes.file,
5158
~name,
5259
declared: option(SharedTypes.declared(SharedTypes.moduleKind)),
5360
) => {
5461
switch (declared) {
55-
| None => showModuleTopLevel(~docstring, ~name, file.contents.topLevel)
62+
| None =>
63+
showModuleTopLevel(~deprecated, ~docstring, ~name, file.contents.topLevel)
5664
| Some({item: Structure({topLevel})}) =>
57-
showModuleTopLevel(~docstring, ~name, topLevel)
65+
showModuleTopLevel(~deprecated, ~docstring, ~name, topLevel)
5866
| Some({item: Ident(_)}) => Some("Unable to resolve module reference")
5967
};
6068
};
@@ -70,12 +78,12 @@ let newHover = (~rootUri, ~file: SharedTypes.file, ~getModule, loc) => {
7078
let%opt md = Hashtbl.find_opt(file.stamps.modules, stamp);
7179
let%opt (file, declared) =
7280
References.resolveModuleReference(~file, ~getModule, md);
73-
let (name, docstring) =
81+
let (name, deprecated, docstring) =
7482
switch (declared) {
75-
| Some(d) => (d.name.txt, d.docstring)
76-
| None => (file.moduleName, file.contents.docstring)
83+
| Some(d) => (d.name.txt, d.deprecated, d.docstring)
84+
| None => (file.moduleName, None, file.contents.docstring)
7785
};
78-
showModule(~docstring, ~name, ~file, declared);
86+
showModule(~deprecated, ~docstring, ~name, ~file, declared);
7987
| LModule(GlobalReference(moduleName, path, tip)) =>
8088
let%opt file = getModule(moduleName);
8189
let env = Query.fileEnv(file);
@@ -84,16 +92,17 @@ let newHover = (~rootUri, ~file: SharedTypes.file, ~getModule, loc) => {
8492
let%opt md = Hashtbl.find_opt(file.stamps.modules, stamp);
8593
let%opt (file, declared) =
8694
References.resolveModuleReference(~file, ~getModule, md);
87-
let (name, docstring) =
95+
let (name, deprecated, docstring) =
8896
switch (declared) {
89-
| Some(d) => (d.name.txt, d.docstring)
90-
| None => (file.moduleName, file.contents.docstring)
97+
| Some(d) => (d.name.txt, d.deprecated, d.docstring)
98+
| None => (file.moduleName, None, file.contents.docstring)
9199
};
92-
showModule(~docstring, ~name, ~file, declared);
100+
showModule(~deprecated, ~docstring, ~name, ~file, declared);
93101
| LModule(NotFound) => None
94102
| TopLevelModule(name) =>
95103
let%opt file = getModule(name);
96104
showModule(
105+
~deprecated=None,
97106
~docstring=file.contents.docstring,
98107
~name=file.moduleName,
99108
~file,
@@ -113,7 +122,7 @@ let newHover = (~rootUri, ~file: SharedTypes.file, ~getModule, loc) => {
113122
},
114123
)
115124
| Typed(t, locKind) =>
116-
let fromType = (~docstring, typ) => {
125+
let fromType = (~deprecated, ~docstring, typ) => {
117126
let typeString = codeBlock(typ |> Shared.typeToString);
118127
let extraTypeInfo = {
119128
let env = Query.fileEnv(file);
@@ -125,35 +134,44 @@ let newHover = (~rootUri, ~file: SharedTypes.file, ~getModule, loc) => {
125134
if (isUncurriedInternal) {
126135
None;
127136
} else {
128-
Some((decl |> Shared.declToString(txt), docstring));
137+
Some((decl |> Shared.declToString(txt), deprecated, docstring));
129138
};
130139
};
131-
let (typeString, docstring) =
140+
let (typeString, deprecated, docstring) =
132141
switch (extraTypeInfo) {
133-
| None => (typeString, docstring)
134-
| Some((extra, extraDocstring)) => (
142+
| None => (typeString, deprecated, docstring)
143+
| Some((extra, extraDeprecated, extraDocstring)) => (
135144
typeString ++ "\n\n" ++ codeBlock(extra),
145+
extraDeprecated,
136146
extraDocstring,
137147
)
138148
};
139-
(Some(typeString), docstring);
149+
let deprecatedMsg =
150+
switch (deprecated) {
151+
| None => None
152+
| Some(s) => Some("Deprecated: " ++ s)
153+
};
154+
(Some(typeString), deprecatedMsg, docstring);
140155
};
141156

142157
let parts =
143158
switch (References.definedForLoc(~file, ~getModule, locKind)) {
144159
| None =>
145-
let (typeString, docstring) = t |> fromType(~docstring=None);
146-
[typeString, docstring];
147-
| Some((docstring, {uri}, res)) =>
160+
let (typeString, deprecatedMsg, docstring) =
161+
t |> fromType(~deprecated=None, ~docstring=None);
162+
[typeString, deprecatedMsg, docstring];
163+
| Some((deprecated, docstring, {uri}, res)) =>
148164
let pathFromRoot = uri |> Uri2.pathFromRoot(~rootUri);
149165

150166
let parts =
151167
switch (res) {
152168
| `Declared =>
153-
let (typeString, docstring) = t |> fromType(~docstring);
154-
[typeString, docstring];
169+
let (typeString, deprecatedMsg, docstring) =
170+
t |> fromType(~deprecated, ~docstring);
171+
[typeString, deprecatedMsg, docstring];
155172
| `Constructor({cname: {txt}, args}) =>
156-
let (typeString, docstring) = t |> fromType(~docstring);
173+
let (typeString, deprecatedMsg, docstring) =
174+
t |> fromType(~deprecated, ~docstring);
157175

158176
let argsString =
159177
switch (args) {
@@ -165,10 +183,16 @@ let newHover = (~rootUri, ~file: SharedTypes.file, ~getModule, loc) => {
165183
|> Printf.sprintf("(%s)")
166184
};
167185

168-
[typeString, Some(codeBlock(txt ++ argsString)), docstring];
186+
[
187+
typeString,
188+
Some(codeBlock(txt ++ argsString)),
189+
deprecatedMsg,
190+
docstring,
191+
];
169192
| `Field({typ}) =>
170-
let (typeString, docstring) = typ |> fromType(~docstring);
171-
[typeString, docstring];
193+
let (typeString, deprecatedMsg, docstring) =
194+
typ |> fromType(~deprecated, ~docstring);
195+
[typeString, deprecatedMsg, docstring];
172196
};
173197

174198
parts @ [Some(pathFromRoot)];

src/rescript-editor-support/NewCompletions.re

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -577,26 +577,33 @@ let getItems =
577577

578578
module J = JsonShort;
579579

580-
let mkItem = (~name, ~kind, ~detail, ~docstring, ~uri, ~pos_lnum) => {
580+
let mkItem = (~name, ~kind, ~detail, ~deprecated, ~docstring, ~uri, ~pos_lnum) => {
581+
let valueMessage =
582+
(
583+
switch (deprecated) {
584+
| None => ""
585+
| Some(s) => "Deprecated: " ++ s ++ "\n\n"
586+
}
587+
)
588+
++ (
589+
switch (docstring) {
590+
| None => ""
591+
| Some(s) => s ++ "\n\n"
592+
}
593+
)
594+
++ "\n"
595+
++ Uri2.toString(uri)
596+
++ ":"
597+
++ string_of_int(pos_lnum);
598+
let tags = deprecated == None ? [] : [J.i(1 /* deprecated */)];
581599
J.o([
582600
("label", J.s(name)),
583601
("kind", J.i(kind)),
602+
("tags", J.l(tags)),
584603
("detail", detail |> J.s),
585604
(
586605
"documentation",
587-
J.o([
588-
("kind", J.s("markdown")),
589-
(
590-
"value",
591-
J.s(
592-
(docstring |? "No docs")
593-
++ "\n\n"
594-
++ Uri2.toString(uri)
595-
++ ":"
596-
++ string_of_int(pos_lnum),
597-
),
598-
),
599-
]),
606+
J.o([("kind", J.s("markdown")), ("value", J.s(valueMessage))]),
600607
),
601608
]);
602609
};
@@ -639,6 +646,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
639646
uri,
640647
{
641648
SharedTypes.name: {txt: name, loc: {loc_start: {pos_lnum}}},
649+
deprecated,
642650
docstring,
643651
item,
644652
},
@@ -647,6 +655,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
647655
mkItem(
648656
~name,
649657
~kind=kindToInt(item),
658+
~deprecated,
650659
~detail=detail(name, item),
651660
~docstring,
652661
~uri,
@@ -761,6 +770,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
761770
txt: name,
762771
loc: {loc_start: {pos_lnum}},
763772
},
773+
deprecated,
764774
docstring,
765775
item,
766776
},
@@ -770,6 +780,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
770780
~name=completionName(name),
771781
~kind=kindToInt(item),
772782
~detail=detail(name, item),
783+
~deprecated,
773784
~docstring,
774785
~uri,
775786
~pos_lnum,
@@ -786,6 +797,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
786797
mkItem(
787798
~name,
788799
~kind=4,
800+
~deprecated=None,
789801
~detail="",
790802
~docstring=None,
791803
~uri=full.file.uri,
@@ -862,6 +874,7 @@ let computeCompletions = (~full, ~maybeText, ~package, ~pos, ~state) => {
862874
mkItem(
863875
~name,
864876
~kind=4,
877+
~deprecated=None,
865878
~detail=typ |> Shared.typeToString,
866879
~docstring=None,
867880
~uri=full.file.uri,

0 commit comments

Comments
 (0)