Skip to content

Commit 5f71794

Browse files
committed
feat(tree-sitter): add Dart definition support
1 parent c24a8c5 commit 5f71794

7 files changed

Lines changed: 173 additions & 0 deletions

File tree

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export default `abstract class Animal {
2+
String speak();
3+
}
4+
5+
class Point {
6+
const Point();
7+
Point.named();
8+
factory Point.origin() => const Point();
9+
10+
int get x => 0;
11+
set x(int value) {}
12+
13+
Point operator +(Point other) => this;
14+
}
15+
16+
mixin Runner {
17+
void run() {
18+
print("running");
19+
}
20+
}
21+
22+
enum Status {
23+
ready,
24+
running;
25+
26+
const Status();
27+
}
28+
29+
class Dog extends Animal with Runner {
30+
final String name;
31+
32+
Dog(this.name);
33+
34+
@override
35+
String speak() {
36+
return "\$name barks";
37+
}
38+
}
39+
40+
extension StringTools on String {
41+
String doubled() {
42+
return this + this;
43+
}
44+
}
45+
46+
extension type UserId(int value) {
47+
UserId.zero() : value = 0;
48+
}
49+
50+
typedef Operation = int Function(int left, int right);
51+
52+
int get answer => 42;
53+
set answer(int value) {}
54+
55+
int add(int left, int right) {
56+
return left + right;
57+
}
58+
`

src/services/tree-sitter/__tests__/languageParser.spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ describe("loadRequiredLanguageParsers", () => {
4949
expect(parsers.kts.query).toBeDefined()
5050
})
5151

52+
it("should load Dart parser for .dart files", async () => {
53+
const parsers = await loadRequiredLanguageParsers(["test.dart"], WASM_DIR)
54+
expect(parsers.dart).toBeDefined()
55+
expect(parsers.dart.query).toBeDefined()
56+
})
57+
5258
it("should throw error for unsupported file extensions", async () => {
5359
const files = ["test.unsupported"]
5460
await expect(loadRequiredLanguageParsers(files, WASM_DIR)).rejects.toThrow("Unsupported language: unsupported")
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { dartQuery } from "../queries"
2+
import { testParseSourceCodeDefinitions } from "./helpers"
3+
import sampleDartContent from "./fixtures/sample-dart"
4+
5+
const dartOptions = {
6+
language: "dart",
7+
wasmFile: "tree-sitter-dart.wasm",
8+
queryString: dartQuery,
9+
extKey: "dart",
10+
}
11+
12+
describe("parseSourceCodeDefinitionsForFile with Dart", () => {
13+
it("should capture common Dart declarations", async () => {
14+
const result = await testParseSourceCodeDefinitions("/test/file.dart", sampleDartContent, dartOptions)
15+
16+
expect(result).toMatch(/abstract class Animal/)
17+
expect(result).toMatch(/class Point/)
18+
expect(result).toMatch(/const Point\(\)/)
19+
expect(result).toMatch(/Point\.named\(\)/)
20+
expect(result).toMatch(/factory Point\.origin\(\)/)
21+
expect(result).toMatch(/int get x/)
22+
expect(result).toMatch(/set x\(int value\)/)
23+
expect(result).toMatch(/Point operator \+/)
24+
expect(result).toMatch(/mixin Runner/)
25+
expect(result).toMatch(/enum Status/)
26+
expect(result).toMatch(/const Status\(\)/)
27+
expect(result).toMatch(/class Dog extends Animal with Runner/)
28+
expect(result).toMatch(/extension StringTools on String/)
29+
expect(result).toMatch(/extension type UserId/)
30+
expect(result).toMatch(/typedef Operation/)
31+
expect(result).toMatch(/int get answer/)
32+
expect(result).toMatch(/set answer\(int value\)/)
33+
expect(result).toMatch(/String speak\(\)/)
34+
expect(result).toMatch(/int add\(int left, int right\)/)
35+
})
36+
})

src/services/tree-sitter/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ const extensions = [
9393
"erb",
9494
// Visual Basic .NET
9595
"vb",
96+
// Dart
97+
"dart",
9698
].map((e) => `.${e}`)
9799

98100
export { extensions }

src/services/tree-sitter/languageParser.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import {
2828
embeddedTemplateQuery,
2929
elispQuery,
3030
elixirQuery,
31+
dartQuery,
3132
} from "./queries"
3233

3334
export interface LanguageParser {
@@ -218,6 +219,10 @@ export async function loadRequiredLanguageParsers(filesToParse: string[], source
218219
language = await loadLanguage("elixir", sourceDirectory)
219220
query = new Query(language, elixirQuery)
220221
break
222+
case "dart":
223+
language = await loadLanguage("dart", sourceDirectory)
224+
query = new Query(language, dartQuery)
225+
break
221226
default:
222227
throw new Error(`Unsupported language: ${ext}`)
223228
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Definition captures adapted from tree-sitter-dart's canonical tags query:
2+
// https://github.com/UserNobody14/tree-sitter-dart/blob/master/queries/tags.scm
3+
export default `
4+
(class_definition
5+
name: (identifier) @name) @definition.class
6+
7+
(method_signature
8+
(function_signature)) @definition.method
9+
10+
(type_alias
11+
(type_identifier) @name) @definition.type
12+
13+
(method_signature
14+
(getter_signature
15+
name: (identifier) @name)) @definition.method
16+
17+
(method_signature
18+
(setter_signature
19+
name: (identifier) @name)) @definition.method
20+
21+
(method_signature
22+
(function_signature
23+
name: (identifier) @name)) @definition.method
24+
25+
(method_signature
26+
(factory_constructor_signature
27+
(identifier) @name)) @definition.method
28+
29+
(method_signature
30+
(constructor_signature
31+
name: (identifier) @name)) @definition.method
32+
33+
(method_signature
34+
(operator_signature)) @definition.method
35+
36+
(constructor_signature
37+
name: (identifier) @name) @definition.method
38+
39+
(constant_constructor_signature
40+
(identifier) @name) @definition.method
41+
42+
(mixin_declaration
43+
(mixin)
44+
(identifier) @name) @definition.mixin
45+
46+
(extension_declaration
47+
name: (identifier) @name) @definition.extension
48+
49+
(extension_type_declaration
50+
name: (identifier) @name) @definition.extension
51+
52+
(enum_declaration
53+
name: (identifier) @name) @definition.enum
54+
55+
(program
56+
(getter_signature
57+
name: (identifier) @name) @definition.function)
58+
59+
(program
60+
(setter_signature
61+
name: (identifier) @name) @definition.function)
62+
63+
(function_signature
64+
name: (identifier) @name) @definition.function
65+
`

src/services/tree-sitter/queries/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ export { zigQuery } from "./zig"
2626
export { default as embeddedTemplateQuery } from "./embedded_template"
2727
export { elispQuery } from "./elisp"
2828
export { scalaQuery } from "./scala"
29+
export { default as dartQuery } from "./dart"

0 commit comments

Comments
 (0)