Skip to content

Commit 0033b22

Browse files
committed
start working on generating extension methods to help navigate a tree statically
1 parent de2c2db commit 0033b22

File tree

6 files changed

+550
-4
lines changed

6 files changed

+550
-4
lines changed

grammar.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ module.exports = grammar({
7878
$._declaration,
7979
$._statement,
8080
$._literal,
81+
// $._element
82+
// $._primary_pattern
8183
// $._primary,
8284
// $._type,
83-
// $._simple_type,
84-
// $._type,
8585
],
8686

8787
inline: $ => [

src/grammar.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12552,7 +12552,8 @@
1255212552
"supertypes": [
1255312553
"_declaration",
1255412554
"_statement",
12555-
"_literal"
12555+
"_literal",
12556+
"_element"
1255612557
]
1255712558
}
1255812559

tree_sitter/bin/gen_grammar.dart

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'dart:convert';
2+
import 'dart:io';
3+
4+
import 'package:args/args.dart';
5+
import 'package:freezed_annotation/freezed_annotation.dart';
6+
7+
part 'gen_grammar.freezed.dart';
8+
part 'gen_grammar.g.dart';
9+
10+
@freezed
11+
class Type with _$Type {
12+
const factory Type({
13+
required String type,
14+
required bool named,
15+
@Default({}) Map<String, Field> fields,
16+
Field? children,
17+
@Default([]) List<Type> subtypes,
18+
}) = _Type;
19+
factory Type.fromJson(Map<String, dynamic> map) => _$TypeFromJson(map);
20+
}
21+
22+
@freezed
23+
class Field with _$Field {
24+
const factory Field({
25+
required bool multiple,
26+
required bool required,
27+
@Default([]) List<Type> types,
28+
}) = _Field;
29+
factory Field.fromJson(Map<String, dynamic> map) => _$FieldFromJson(map);
30+
}
31+
32+
final genParser = ArgParser()
33+
..addOption('input',
34+
abbr: 'i', help: 'Grammar\'s Node Types file', mandatory: true)
35+
..addOption('output', abbr: 'o', help: 'Output file');
36+
final parser = ArgParser()..addCommand('gen', genParser);
37+
38+
Future<void> main(List<String> args) async {
39+
final results = parser.parse(args);
40+
final input = results.command!['input'] as String;
41+
final j = json.decode(File(input).readAsStringSync());
42+
final result = (j as List<dynamic>)
43+
.map((d) => Type.fromJson(d as Map<String, dynamic>))
44+
.toList();
45+
print(result);
46+
final output =
47+
results.command?['output'] as String? ?? 'lib/src/grammar.dart';
48+
}

0 commit comments

Comments
 (0)