Skip to content

Commit bf307ec

Browse files
committed
add configurable lint messages and alias-avoidance
Signed-off-by: Gabriel Nordeborn <gabbe.nord@gmail.com>
1 parent ea503bb commit bf307ec

28 files changed

Lines changed: 1004 additions & 208 deletions

docs/rescript_ai.md

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -163,14 +163,26 @@ Example shape:
163163
{
164164
"lint": {
165165
"rules": {
166-
"forbidden-reference": {
167-
"severity": "error",
168-
"items": [
169-
"RescriptCore",
170-
"Belt",
171-
"Belt.Array.forEach"
172-
]
173-
},
166+
"forbidden-reference": [
167+
{
168+
"severity": "error",
169+
"message": "Do not use Belt.Array helpers here.",
170+
"items": [
171+
{"kind": "module", "path": "Belt.Array"},
172+
{"kind": "value", "path": "Belt.Array.forEach"}
173+
]
174+
},
175+
{
176+
"severity": "warning",
177+
"items": [
178+
{
179+
"kind": "type",
180+
"path": "Js.Json.t",
181+
"message": "Avoid Js.Json.t here."
182+
}
183+
]
184+
}
185+
],
174186
"single-use-function": {
175187
"severity": "warning"
176188
}
@@ -179,6 +191,10 @@ Example shape:
179191
}
180192
```
181193

194+
`forbidden-reference` accepts either one rule object or an array of rule objects.
195+
Each `items` entry must be an object with `kind` (`module`, `value`, or `type`)
196+
and `path`; `message` is optional at both the rule and item level.
197+
182198
## Lint V1 Rules
183199

184200
### Forbidden references
@@ -318,7 +334,11 @@ Lint and rewrite config should each live under their own namespace in `.rescript
318334
"rules": {
319335
"forbidden-reference": {
320336
"severity": "error",
321-
"items": ["Belt.Array.forEach", "Belt.Array.map", "Js.Json.t"]
337+
"items": [
338+
{"kind": "value", "path": "Belt.Array.forEach"},
339+
{"kind": "value", "path": "Belt.Array.map"},
340+
{"kind": "type", "path": "Js.Json.t"}
341+
]
322342
},
323343
"single-use-function": {
324344
"severity": "warning"

tests/tools_tests/.rescript-lint.json

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,43 @@
11
{
22
"lint": {
33
"rules": {
4-
"forbidden-reference": {
5-
"severity": "error",
6-
"items": ["Belt.Array.forEach", "Belt.Array.map", "Js.Json.t"]
7-
},
4+
"forbidden-reference": [
5+
{
6+
"severity": "error",
7+
"items": [
8+
{
9+
"kind": "module",
10+
"path": "Belt.Array",
11+
"message": "Avoid Belt.Array module references here."
12+
},
13+
{
14+
"kind": "value",
15+
"path": "Belt.Array.forEach"
16+
},
17+
{
18+
"kind": "value",
19+
"path": "Belt.Array.map",
20+
"message": "Prefer Array.map directly."
21+
}
22+
],
23+
"message": "Do not use Belt.Array helpers here. Prefer Stdlib/Array directly."
24+
},
25+
{
26+
"severity": "warning",
27+
"items": [
28+
{
29+
"kind": "type",
30+
"path": "Js.Json.t",
31+
"message": "Avoid Js.Json.t here."
32+
}
33+
]
34+
}
35+
],
836
"single-use-function": {
37+
"severity": "warning",
38+
"message": "Inline this helper unless it is a meaningful reusable abstraction."
39+
},
40+
"alias-avoidance": {
941
"severity": "warning"
1042
}
1143
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
severity: warning
2+
rule: alias-avoidance
3+
path: src/lint/AliasAvoidance.res
4+
range: 1:8-1:21
5+
message: Use the fully qualified reference directly instead of creating a local alias
6+
symbol: ShowFixture.Nested
7+
snippet:
8+
```text
9+
> 1 | module AliasGreeting = ShowFixture.Nested
10+
| ^^^^^^^^^^^^^
11+
```
12+
13+
severity: warning
14+
rule: alias-avoidance
15+
path: src/lint/AliasAvoidance.res
16+
range: 3:6-3:15
17+
message: Use the fully qualified reference directly instead of creating a local alias
18+
symbol: ShowFixture.item
19+
snippet:
20+
```text
21+
1 | module AliasGreeting = ShowFixture.Nested
22+
> 3 | type itemAlias = ShowFixture.item
23+
| ^^^^^^^^^
24+
```
25+
26+
severity: warning
27+
rule: alias-avoidance
28+
path: src/lint/AliasAvoidance.res
29+
range: 5:5-5:8
30+
message: Use the fully qualified reference directly instead of creating a local alias
31+
symbol: String.length
32+
snippet:
33+
```text
34+
3 | type itemAlias = ShowFixture.item
35+
> 5 | let len = String.length
36+
| ^^^
37+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"rule":"alias-avoidance","path":"src/lint/AliasAvoidance.res","range":[0,7,0,20],"severity":"warning","message":"Use the fully qualified reference directly instead of creating a local alias","symbol":"ShowFixture.Nested"},{"rule":"alias-avoidance","path":"src/lint/AliasAvoidance.res","range":[2,5,2,14],"severity":"warning","message":"Use the fully qualified reference directly instead of creating a local alias","symbol":"ShowFixture.item"},{"rule":"alias-avoidance","path":"src/lint/AliasAvoidance.res","range":[4,4,4,7],"severity":"warning","message":"Use the fully qualified reference directly instead of creating a local alias","symbol":"String.length"}]
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
severity: warning
2+
rule: alias-avoidance
3+
path: src/lint/AliasAvoidance.resi
4+
range: 1:8-1:21
5+
message: Use the fully qualified reference directly instead of creating a local alias
6+
symbol: ShowFixture.Nested
7+
snippet:
8+
```text
9+
> 1 | module AliasGreeting = ShowFixture.Nested
10+
| ^^^^^^^^^^^^^
11+
```
12+
13+
severity: warning
14+
rule: alias-avoidance
15+
path: src/lint/AliasAvoidance.resi
16+
range: 3:6-3:15
17+
message: Use the fully qualified reference directly instead of creating a local alias
18+
symbol: ShowFixture.item
19+
snippet:
20+
```text
21+
1 | module AliasGreeting = ShowFixture.Nested
22+
> 3 | type itemAlias = ShowFixture.item
23+
| ^^^^^^^^^
24+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"rule":"alias-avoidance","path":"src/lint/AliasAvoidance.resi","range":[0,7,0,20],"severity":"warning","message":"Use the fully qualified reference directly instead of creating a local alias","symbol":"ShowFixture.Nested"},{"rule":"alias-avoidance","path":"src/lint/AliasAvoidance.resi","range":[2,5,2,14],"severity":"warning","message":"Use the fully qualified reference directly instead of creating a local alias","symbol":"ShowFixture.item"}]

tests/tools_tests/src/expected/ForbiddenExplicit.res.lint.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ severity: error
22
rule: forbidden-reference
33
path: src/lint/ForbiddenExplicit.res
44
range: 1:28-1:35
5-
message: Forbidden reference
5+
message: Do not use Belt.Array helpers here. Prefer Stdlib/Array directly.
66
symbol: Belt_Array.forEach
77
snippet:
88
```text
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"rule":"forbidden-reference","path":"src/lint/ForbiddenExplicit.res","range":[0,27,0,34],"severity":"error","message":"Forbidden reference","symbol":"Belt_Array.forEach"}]
1+
[{"rule":"forbidden-reference","path":"src/lint/ForbiddenExplicit.res","range":[0,27,0,34],"severity":"error","message":"Do not use Belt.Array helpers here. Prefer Stdlib/Array directly.","symbol":"Belt_Array.forEach"}]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
severity: error
2+
rule: forbidden-reference
3+
path: src/lint/ForbiddenModule.res
4+
range: 1:23-1:29
5+
message: Avoid Belt.Array module references here.
6+
symbol: Belt_Array.length
7+
snippet:
8+
```text
9+
> 1 | let size = Belt.Array.length([1, 2])
10+
| ^^^^^^
11+
```
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"rule":"forbidden-reference","path":"src/lint/ForbiddenModule.res","range":[0,22,0,28],"severity":"error","message":"Avoid Belt.Array module references here.","symbol":"Belt_Array.length"}]

0 commit comments

Comments
 (0)