Skip to content

Commit af288d3

Browse files
committed
update languages, add Dockerfile support
1 parent 84c7897 commit af288d3

File tree

10 files changed

+116
-3
lines changed

10 files changed

+116
-3
lines changed

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
objects = {
88

99
/* Begin PBXBuildFile section */
10+
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */ = {isa = PBXBuildFile; productRef = 2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */; };
1011
28B3F010290C207D000CD04D /* CodeLanguages_Container.h in Headers */ = {isa = PBXBuildFile; fileRef = 28B3F00F290C207D000CD04D /* CodeLanguages_Container.h */; settings = {ATTRIBUTES = (Public, ); }; };
1112
28B3F02D290C35D9000CD04D /* TreeSitterC in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F02C290C35D9000CD04D /* TreeSitterC */; };
1213
28B3F030290C35F9000CD04D /* TreeSitterCPP in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F02F290C35F9000CD04D /* TreeSitterCPP */; };
@@ -43,6 +44,7 @@
4344
files = (
4445
28B3F051290C36B1000CD04D /* TreeSitterPHP in Frameworks */,
4546
28B3F042290C365C000CD04D /* TreeSitterHaskell in Frameworks */,
47+
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */,
4648
28B3F039290C362C000CD04D /* TreeSitterElixir in Frameworks */,
4749
28B3F02D290C35D9000CD04D /* TreeSitterC in Frameworks */,
4850
28B3F04B290C368B000CD04D /* TreeSitterJS in Frameworks */,
@@ -157,6 +159,7 @@
157159
28B3F05F290C3720000CD04D /* TreeSitterYAML */,
158160
28B3F062290C372D000CD04D /* TreeSitterZig */,
159161
28B9F7A9290DDAC900245748 /* TreeSitterBash */,
162+
2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */,
160163
);
161164
productName = "CodeLanguages-Container";
162165
productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */;
@@ -207,6 +210,7 @@
207210
28B3F05E290C3720000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-yaml" */,
208211
28B3F061290C372D000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-zig" */,
209212
28B9F7A6290DDAB500245748 /* XCRemoteSwiftPackageReference "tree-sitter-bash" */,
213+
2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */,
210214
);
211215
productRefGroup = 28B3F00D290C207D000CD04D /* Products */;
212216
projectDirPath = "";
@@ -446,6 +450,14 @@
446450
/* End XCConfigurationList section */
447451

448452
/* Begin XCRemoteSwiftPackageReference section */
453+
2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */ = {
454+
isa = XCRemoteSwiftPackageReference;
455+
repositoryURL = "https://github.com/camdencheek/tree-sitter-dockerfile.git";
456+
requirement = {
457+
branch = main;
458+
kind = branch;
459+
};
460+
};
449461
28B3F02B290C35D9000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-c" */ = {
450462
isa = XCRemoteSwiftPackageReference;
451463
repositoryURL = "https://github.com/tree-sitter/tree-sitter-c.git";
@@ -609,6 +621,11 @@
609621
/* End XCRemoteSwiftPackageReference section */
610622

611623
/* Begin XCSwiftPackageProductDependency section */
624+
2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */ = {
625+
isa = XCSwiftPackageProductDependency;
626+
package = 2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */;
627+
productName = TreeSitterDockerfile;
628+
};
612629
28B3F02C290C35D9000CD04D /* TreeSitterC */ = {
613630
isa = XCSwiftPackageProductDependency;
614631
package = 28B3F02B290C35D9000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-c" */;

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

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CodeLanguages-Container/CodeLanguages-Container/CodeLanguages_Container.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extern TSLanguage *tree_sitter_c();
2727
extern TSLanguage *tree_sitter_cpp();
2828
extern TSLanguage *tree_sitter_c_sharp();
2929
extern TSLanguage *tree_sitter_css();
30+
extern TSLanguage *tree_sitter_dockerfile();
3031
extern TSLanguage *tree_sitter_elixir();
3132
extern TSLanguage *tree_sitter_go();
3233
extern TSLanguage *tree_sitter_gomod();
216 KB
Binary file not shown.

Sources/CodeEditLanguages/CodeLanguage.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ public struct CodeLanguage {
7676
return tree_sitter_c_sharp()
7777
case .css:
7878
return tree_sitter_css()
79+
case .dockerfile:
80+
return tree_sitter_dockerfile()
7981
case .elixir:
8082
return tree_sitter_elixir()
8183
case .go:
@@ -123,7 +125,7 @@ public extension CodeLanguage {
123125
/// - Returns: A language structure
124126
static func detectLanguageFrom(url: URL) -> CodeLanguage {
125127
let fileExtension = url.pathExtension.lowercased()
126-
let fileName = url.pathComponents.last?.lowercased()
128+
let fileName = url.pathComponents.last // should not be lowercase since it has to match e.g. `Dockerfile`
127129
// This is to handle special file types without an extension (e.g., Makefile, Dockerfile)
128130
let fileNameOrExtension = fileExtension.isEmpty ? (fileName != nil ? fileName! : "") : fileExtension
129131
if let lang = allLanguages.first(where: { lang in lang.extensions.contains(fileNameOrExtension)}) {
@@ -140,6 +142,7 @@ public extension CodeLanguage {
140142
.cpp,
141143
.cSharp,
142144
.css,
145+
.dockerfile,
143146
.elixir,
144147
.go,
145148
.goMod,
@@ -176,6 +179,9 @@ public extension CodeLanguage {
176179
/// A language structure for `CSS`
177180
static let css: CodeLanguage = .init(id: .css, tsName: "css", extensions: ["css"])
178181

182+
/// A language structure for `Dockerfile`
183+
static let dockerfile: CodeLanguage = .init(id: .dockerfile, tsName: "dockerfile", extensions: ["Dockerfile"])
184+
179185
/// A language structure for `Elixir`
180186
static let elixir: CodeLanguage = .init(id: .elixir, tsName: "elixir", extensions: ["ex", "exs"])
181187

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
(raw_string_literal
2+
delimiter: (raw_string_delimiter) @injection.language
3+
(raw_string_content) @injection.content)
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
[
2+
"FROM"
3+
"AS"
4+
"RUN"
5+
"CMD"
6+
"LABEL"
7+
"EXPOSE"
8+
"ENV"
9+
"ADD"
10+
"COPY"
11+
"ENTRYPOINT"
12+
"VOLUME"
13+
"USER"
14+
"WORKDIR"
15+
"ARG"
16+
"ONBUILD"
17+
"STOPSIGNAL"
18+
"HEALTHCHECK"
19+
"SHELL"
20+
"MAINTAINER"
21+
"CROSS_BUILD"
22+
] @keyword
23+
24+
[
25+
":"
26+
"@"
27+
] @operator
28+
29+
(comment) @comment
30+
31+
32+
(image_spec
33+
(image_tag
34+
":" @punctuation.special)
35+
(image_digest
36+
"@" @punctuation.special))
37+
38+
(double_quoted_string) @string
39+
40+
(expansion
41+
[
42+
"$"
43+
"{"
44+
"}"
45+
] @punctuation.special
46+
) @none
47+
48+
((variable) @constant
49+
(#match? @constant "^[A-Z][A-Z_0-9]*$"))
50+
51+

Sources/CodeEditLanguages/TreeSitterLanguage.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public enum TreeSitterLanguage: String {
1414
case cpp
1515
case cSharp
1616
case css
17+
case dockerfile
1718
case elixir
1819
case go
1920
case goMod

Sources/CodeEditLanguages/TreeSitterModel.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class TreeSitterModel {
2929
return cSharpQuery
3030
case .css:
3131
return cssQuery
32+
case .dockerfile:
33+
return dockerfileQuery
3234
case .elixir:
3335
return elixirQuery
3436
case .go:
@@ -91,6 +93,10 @@ public class TreeSitterModel {
9193
return queryFor(.css)
9294
}()
9395

96+
public private(set) lazy var dockerfileQuery: Query? = {
97+
return queryFor(.dockerfile)
98+
}()
99+
94100
/// Query for `Elixir` files.
95101
public private(set) lazy var elixirQuery: Query? = {
96102
return queryFor(.elixir)

Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,25 @@ final class CodeEditLanguagesTests: XCTestCase {
130130
XCTAssertNotEqual(query?.patternCount, 0)
131131
}
132132

133+
// MARK: - Dockerfile
134+
135+
func test_CodeLanguageDockerfile() throws {
136+
let url = URL(fileURLWithPath: "~/path/to/Dockerfile")
137+
let language = CodeLanguage.detectLanguageFrom(url: url)
138+
139+
XCTAssertEqual(language.id, .dockerfile)
140+
}
141+
142+
func test_FetchQueryDockerfile() throws {
143+
var language = CodeLanguage.dockerfile
144+
language.resourceURL = bundleURL
145+
146+
let data = try Data(contentsOf: language.queryURL!)
147+
let query = try? Query(language: language.language!, data: data)
148+
XCTAssertNotNil(query)
149+
XCTAssertNotEqual(query?.patternCount, 0)
150+
}
151+
133152
// MARK: - Elixir
134153

135154
func test_CodeLanguageElixir() throws {

0 commit comments

Comments
 (0)