Skip to content

Commit 016b0e8

Browse files
[feat]: Add Typescript & TSX Language Grammars (#37)
1 parent 9ceda95 commit 016b0e8

File tree

14 files changed

+177
-3
lines changed

14 files changed

+177
-3
lines changed

CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.pbxproj

+25
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
28B3F05D290C3709000CD04D /* TreeSitterSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F05C290C3709000CD04D /* TreeSitterSwift */; };
3535
28B3F063290C372D000CD04D /* TreeSitterZig in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F062290C372D000CD04D /* TreeSitterZig */; };
3636
28B9F7AA290DDAC900245748 /* TreeSitterBash in Frameworks */ = {isa = PBXBuildFile; productRef = 28B9F7A9290DDAC900245748 /* TreeSitterBash */; };
37+
6CA62EA929F9D36700785B11 /* TreeSitterTS in Frameworks */ = {isa = PBXBuildFile; productRef = 6CA62EA829F9D36700785B11 /* TreeSitterTS */; };
38+
6CA62EAB29F9D36700785B11 /* TreeSitterTSX in Frameworks */ = {isa = PBXBuildFile; productRef = 6CA62EAA29F9D36700785B11 /* TreeSitterTSX */; };
3739
6CEC70FE29C3A85000B61C7A /* TreeSitterRegex in Frameworks */ = {isa = PBXBuildFile; productRef = 6CEC70FD29C3A85000B61C7A /* TreeSitterRegex */; };
3840
9D6DA3B8298F1A4600E69066 /* TreeSitterOCaml in Frameworks */ = {isa = PBXBuildFile; productRef = 9D6DA3B7298F1A4600E69066 /* TreeSitterOCaml */; };
3941
/* End PBXBuildFile section */
@@ -52,6 +54,7 @@
5254
28B3F051290C36B1000CD04D /* TreeSitterPHP in Frameworks */,
5355
28B3F042290C365C000CD04D /* TreeSitterHaskell in Frameworks */,
5456
285BF67329AAA45B00641989 /* TreeSitterLua in Frameworks */,
57+
6CA62EAB29F9D36700785B11 /* TreeSitterTSX in Frameworks */,
5558
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */,
5659
282C119329AA32C8004F1EA6 /* TreeSitterSQL in Frameworks */,
5760
28B3F039290C362C000CD04D /* TreeSitterElixir in Frameworks */,
@@ -75,6 +78,7 @@
7578
28B3F048290C367C000CD04D /* TreeSitterJava in Frameworks */,
7679
6CEC70FE29C3A85000B61C7A /* TreeSitterRegex in Frameworks */,
7780
282E5977298051980064B34A /* TreeSitterYAML in Frameworks */,
81+
6CA62EA929F9D36700785B11 /* TreeSitterTS in Frameworks */,
7882
2886C788298135540023E016 /* TreeSitterKotlin in Frameworks */,
7983
28B3F057290C36D5000CD04D /* TreeSitterRuby in Frameworks */,
8084
);
@@ -181,6 +185,8 @@
181185
285BF67229AAA45B00641989 /* TreeSitterLua */,
182186
6CEC70FD29C3A85000B61C7A /* TreeSitterRegex */,
183187
28AAB6AD29CA57D40087654B /* TreeSitterDart */,
188+
6CA62EA829F9D36700785B11 /* TreeSitterTS */,
189+
6CA62EAA29F9D36700785B11 /* TreeSitterTSX */,
184190
);
185191
productName = "CodeLanguages-Container";
186192
productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */;
@@ -239,6 +245,7 @@
239245
285BF67129AAA45B00641989 /* XCRemoteSwiftPackageReference "tree-sitter-lua" */,
240246
6CEC70FC29C3A85000B61C7A /* XCRemoteSwiftPackageReference "tree-sitter-regex" */,
241247
28AAB6AC29CA57D40087654B /* XCRemoteSwiftPackageReference "tree-sitter-dart" */,
248+
6CA62EA729F9D36700785B11 /* XCRemoteSwiftPackageReference "tree-sitter-typescript" */,
242249
);
243250
productRefGroup = 28B3F00D290C207D000CD04D /* Products */;
244251
projectDirPath = "";
@@ -696,6 +703,14 @@
696703
kind = branch;
697704
};
698705
};
706+
6CA62EA729F9D36700785B11 /* XCRemoteSwiftPackageReference "tree-sitter-typescript" */ = {
707+
isa = XCRemoteSwiftPackageReference;
708+
repositoryURL = "https://github.com/thecoolwinter/tree-sitter-typescript";
709+
requirement = {
710+
branch = master;
711+
kind = branch;
712+
};
713+
};
699714
6CEC70FC29C3A85000B61C7A /* XCRemoteSwiftPackageReference "tree-sitter-regex" */ = {
700715
isa = XCRemoteSwiftPackageReference;
701716
repositoryURL = "https://github.com/thecoolwinter/tree-sitter-regex/";
@@ -845,6 +860,16 @@
845860
package = 28B9F7A6290DDAB500245748 /* XCRemoteSwiftPackageReference "tree-sitter-bash" */;
846861
productName = TreeSitterBash;
847862
};
863+
6CA62EA829F9D36700785B11 /* TreeSitterTS */ = {
864+
isa = XCSwiftPackageProductDependency;
865+
package = 6CA62EA729F9D36700785B11 /* XCRemoteSwiftPackageReference "tree-sitter-typescript" */;
866+
productName = TreeSitterTS;
867+
};
868+
6CA62EAA29F9D36700785B11 /* TreeSitterTSX */ = {
869+
isa = XCSwiftPackageProductDependency;
870+
package = 6CA62EA729F9D36700785B11 /* XCRemoteSwiftPackageReference "tree-sitter-typescript" */;
871+
productName = TreeSitterTSX;
872+
};
848873
6CEC70FD29C3A85000B61C7A /* TreeSitterRegex */ = {
849874
isa = XCSwiftPackageProductDependency;
850875
package = 6CEC70FC29C3A85000B61C7A /* XCRemoteSwiftPackageReference "tree-sitter-regex" */;

CodeLanguages-Container/CodeLanguages-Container.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

+10-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"location" : "https://github.com/tree-sitter/tree-sitter-bash.git",
1616
"state" : {
1717
"branch" : "master",
18-
"revision" : "b338fa9f4807b9e0336cd4dde04948a8c324a4cf"
18+
"revision" : "422a07cb221b92c6b117e854efa8945a506b5214"
1919
}
2020
},
2121
{
@@ -243,6 +243,15 @@
243243
"revision" : "eda05af7ac41adb4eb19c346883c0fa32fe3bdd8"
244244
}
245245
},
246+
{
247+
"identity" : "tree-sitter-typescript",
248+
"kind" : "remoteSourceControl",
249+
"location" : "https://github.com/thecoolwinter/tree-sitter-typescript",
250+
"state" : {
251+
"branch" : "master",
252+
"revision" : "018464ed3f93fe757418316b3cc1c72198fa5b8c"
253+
}
254+
},
246255
{
247256
"identity" : "tree-sitter-yaml",
248257
"kind" : "remoteSourceControl",

CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h

+2
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ extern TSLanguage *tree_sitter_ruby();
4949
extern TSLanguage *tree_sitter_rust();
5050
extern TSLanguage *tree_sitter_sql();
5151
extern TSLanguage *tree_sitter_swift();
52+
extern TSLanguage *tree_sitter_tsx();
53+
extern TSLanguage *tree_sitter_typescript();
5254
extern TSLanguage *tree_sitter_yaml();
5355
extern TSLanguage *tree_sitter_zig();
5456

2.98 MB
Binary file not shown.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ In order to add support for additional languages we have a complete guide on how
8181
| [Sql](https://github.com/lukepistrol/tree-sitter-sql/tree/feature/spm) |||
8282
| [Swift](https://github.com/alex-pinkus/tree-sitter-swift/tree/with-generated-files) |||
8383
| [TOML](https://github.com/ikatyang/tree-sitter-toml) | | |
84-
| [TypeScript/TSX](https://github.com/tree-sitter/tree-sitter-typescript) | | |
84+
| [TypeScript/TSX](https://github.com/tree-sitter/tree-sitter-typescript) | | |
8585
| [Verilog](https://github.com/tree-sitter/tree-sitter-verilog) | | _not available_ |
8686
| [YAML](https://github.com/lukepistrol/tree-sitter-yaml/tree/feature/spm) |||
8787
| [Zig](https://github.com/maxxnino/tree-sitter-zig) |||

Sources/CodeEditLanguages/CodeLanguage+Definitions.swift

+18
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public extension CodeLanguage {
3939
.rust,
4040
.sql,
4141
.swift,
42+
.tsx,
43+
.typescript,
4244
.yaml,
4345
.zig
4446
]
@@ -248,6 +250,22 @@ public extension CodeLanguage {
248250
extensions: ["swift"]
249251
)
250252

253+
/// A language structure for `TSX`
254+
static let tsx: CodeLanguage = .init(
255+
id: .tsx,
256+
tsName: "typescript",
257+
extensions: ["tsx"],
258+
parentURL: CodeLanguage.jsx.queryURL
259+
)
260+
261+
/// A language structure for `Typescript`
262+
static let typescript: CodeLanguage = .init(
263+
id: .typescript,
264+
tsName: "typescript",
265+
extensions: ["ts"],
266+
parentURL: CodeLanguage.javascript.queryURL
267+
)
268+
251269
/// A language structure for `YAML`
252270
static let yaml: CodeLanguage = .init(
253271
id: .yaml,

Sources/CodeEditLanguages/CodeLanguage.swift

+4
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ public struct CodeLanguage {
122122
return tree_sitter_sql()
123123
case .swift:
124124
return tree_sitter_swift()
125+
case .tsx:
126+
return tree_sitter_tsx()
127+
case .typescript:
128+
return tree_sitter_typescript()
125129
case .yaml:
126130
return tree_sitter_yaml()
127131
case .zig:

Sources/CodeEditLanguages/Resources/tree-sitter-bash/highlights.scm

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
"function"
2323
"if"
2424
"in"
25+
"select"
26+
"then"
2527
"unset"
28+
"until"
2629
"while"
27-
"then"
2830
] @keyword
2931

3032
(comment) @comment
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
; Types
2+
3+
(type_identifier) @type
4+
(predefined_type) @type.builtin
5+
6+
((identifier) @type
7+
(#match? @type "^[A-Z]"))
8+
9+
(type_arguments
10+
"<" @punctuation.bracket
11+
">" @punctuation.bracket)
12+
13+
; Variables
14+
15+
(required_parameter (identifier) @variable.parameter)
16+
(optional_parameter (identifier) @variable.parameter)
17+
18+
; Keywords
19+
20+
[ "abstract"
21+
"declare"
22+
"enum"
23+
"export"
24+
"implements"
25+
"interface"
26+
"keyof"
27+
"namespace"
28+
"private"
29+
"protected"
30+
"public"
31+
"type"
32+
"readonly"
33+
"override"
34+
"satisfies"
35+
] @keyword
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
(required_parameter (identifier) @local.definition)
2+
(optional_parameter (identifier) @local.definition)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
(function_signature
2+
name: (identifier) @name) @definition.function
3+
4+
(method_signature
5+
name: (property_identifier) @name) @definition.method
6+
7+
(abstract_method_signature
8+
name: (property_identifier) @name) @definition.method
9+
10+
(abstract_class_declaration
11+
name: (type_identifier) @name) @definition.class
12+
13+
(module
14+
name: (identifier) @name) @definition.module
15+
16+
(interface_declaration
17+
name: (type_identifier) @name) @definition.interface
18+
19+
(type_annotation
20+
(type_identifier) @name) @reference.type
21+
22+
(new_expression
23+
constructor: (identifier) @name) @reference.class

Sources/CodeEditLanguages/TreeSitterLanguage.swift

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ public enum TreeSitterLanguage: String {
3737
case rust
3838
case sql
3939
case swift
40+
case tsx
41+
case typescript
4042
case yaml
4143
case zig
4244
case plainText

Sources/CodeEditLanguages/TreeSitterModel.swift

+14
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ public class TreeSitterModel {
7676
return sqlQuery
7777
case .swift:
7878
return swiftQuery
79+
case .tsx:
80+
return tsxQuery
81+
case .typescript:
82+
return typescriptQuery
7983
case .yaml:
8084
return yamlQuery
8185
case .zig:
@@ -225,6 +229,16 @@ public class TreeSitterModel {
225229
return queryFor(.swift)
226230
}()
227231

232+
/// Query for `TSX` files.
233+
public private(set) lazy var tsxQuery: Query? = {
234+
return queryFor(.tsx)
235+
}()
236+
237+
/// Query for `Typescript` files.
238+
public private(set) lazy var typescriptQuery: Query? = {
239+
return queryFor(.typescript)
240+
}()
241+
228242
/// Query for `YAML` files.
229243
public private(set) lazy var yamlQuery: Query? = {
230244
return queryFor(.yaml)

Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift

+38
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,44 @@ final class CodeEditLanguagesTests: XCTestCase {
573573
XCTAssertNotEqual(query?.patternCount, 0)
574574
}
575575

576+
// MARK: - TSX
577+
578+
func test_CodeLanguageTSX() throws {
579+
let url = URL(fileURLWithPath: "~/path/to/file.tsx")
580+
let language = CodeLanguage.detectLanguageFrom(url: url)
581+
582+
XCTAssertEqual(language.id, .tsx)
583+
}
584+
585+
func test_FetchQueryTSX() throws {
586+
var language = CodeLanguage.tsx
587+
language.resourceURL = bundleURL
588+
589+
let data = try Data(contentsOf: language.queryURL!)
590+
let query = try? Query(language: language.language!, data: data)
591+
XCTAssertNotNil(query)
592+
XCTAssertNotEqual(query?.patternCount, 0)
593+
}
594+
595+
// MARK: - Typescript
596+
597+
func test_CodeLanguageTypescript() throws {
598+
let url = URL(fileURLWithPath: "~/path/to/file.ts")
599+
let language = CodeLanguage.detectLanguageFrom(url: url)
600+
601+
XCTAssertEqual(language.id, .typescript)
602+
}
603+
604+
func test_FetchQueryTypescript() throws {
605+
var language = CodeLanguage.typescript
606+
language.resourceURL = bundleURL
607+
608+
let data = try Data(contentsOf: language.queryURL!)
609+
let query = try? Query(language: language.language!, data: data)
610+
XCTAssertNotNil(query)
611+
XCTAssertNotEqual(query?.patternCount, 0)
612+
}
613+
576614
// MARK: - YAML
577615

578616
func test_CodeLanguageYAML() throws {

0 commit comments

Comments
 (0)