Skip to content

Commit

Permalink
Add project-specific lints with ast-grep (vercel/turborepo#5637)
Browse files Browse the repository at this point in the history
ast-grep[0] is a tool that uses tree-sitter[1] and a pattern language to
match against code using its ast. It implements code transformation,
querying, and linting.

Since clippy isn't extensible for project-specific lints, this adds a
first ast-grep lint disallowing `context` as a variable name. Currently
it's set to warning as usage is addressed.

To run, install ast-grep, then run `ast-grep scan`. Example output:

```
warning[no-context]: Don't name variables `context`.
    ┌─ ./crates/turbopack-ecmascript-hmr-protocol/src/lib.rs:132:9
    │
132 │     pub context: &'a str,
    │     ----^^^^^^^---------
    │
    = Use a more specific name, such as chunking_context, asset_context, etc.
```

[0] https://ast-grep.github.io
[1] https://tree-sitter.github.io/tree-sitter/
  • Loading branch information
wbinnssmith authored Aug 1, 2023
1 parent 92fc159 commit 6baba7e
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 0 deletions.
42 changes: 42 additions & 0 deletions .config/ast-grep/rule-tests/__snapshots__/no-context-snapshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
id: no-context
snapshots:
"fn foo(context: ChunkingContext) -> u32 { 5 };":
labels:
- source: context
style: primary
start: 7
end: 14
- source: "context: ChunkingContext"
style: secondary
start: 7
end: 31
foo(|context| context):
labels:
- source: context
style: primary
start: 5
end: 12
- source: "|context|"
style: secondary
start: 4
end: 13
let context = ChunkingContext::new();:
labels:
- source: context
style: primary
start: 4
end: 11
- source: let context = ChunkingContext::new();
style: secondary
start: 0
end: 37
"struct Foo { context: Context };":
labels:
- source: context
style: primary
start: 13
end: 20
- source: "context: Context"
style: secondary
start: 13
end: 29
11 changes: 11 additions & 0 deletions .config/ast-grep/rule-tests/no-context-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
id: no-context
valid:
- "let chunking_context = ChunkingContext::new();"
- "struct Foo { chunking_context: Context };"
- "foo(|chunking_context| context)"
- "fn foo(chunking_context: ChunkingContext) -> u32 { 5 };"
invalid:
- "let context = ChunkingContext::new();"
- "struct Foo { context: Context };"
- "foo(|context| context)"
- "fn foo(context: ChunkingContext) -> u32 { 5 };"
Empty file.
20 changes: 20 additions & 0 deletions .config/ast-grep/rules/no-context.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
id: no-context
message: Don't name variables `context`.
note: Use a more specific name, such as chunking_context, asset_context, etc.
severity: warning
language: Rust
rule:
regex: \bcontext\b
any:
- all:
- inside:
any:
- kind: closure_parameters
- kind: parameter
- kind: function_type
- kind: let_declaration
- kind: identifier
- all:
- kind: field_identifier
- inside:
kind: field_declaration
6 changes: 6 additions & 0 deletions sgconfig.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
ruleDirs:
- .config/ast-grep/rules
testConfigs:
- testDir: .config/ast-grep/rule-tests
utilDirs:
- .config/ast-grep/rule-utils

0 comments on commit 6baba7e

Please sign in to comment.