Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
objects = {

/* Begin PBXBuildFile section */
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */ = {isa = PBXBuildFile; productRef = 2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */; };
28B3F010290C207D000CD04D /* CodeLanguages_Container.h in Headers */ = {isa = PBXBuildFile; fileRef = 28B3F00F290C207D000CD04D /* CodeLanguages_Container.h */; settings = {ATTRIBUTES = (Public, ); }; };
28B3F02D290C35D9000CD04D /* TreeSitterC in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F02C290C35D9000CD04D /* TreeSitterC */; };
28B3F030290C35F9000CD04D /* TreeSitterCPP in Frameworks */ = {isa = PBXBuildFile; productRef = 28B3F02F290C35F9000CD04D /* TreeSitterCPP */; };
Expand Down Expand Up @@ -43,6 +44,7 @@
files = (
28B3F051290C36B1000CD04D /* TreeSitterPHP in Frameworks */,
28B3F042290C365C000CD04D /* TreeSitterHaskell in Frameworks */,
2846B262296BA1CF005F60B6 /* TreeSitterDockerfile in Frameworks */,
28B3F039290C362C000CD04D /* TreeSitterElixir in Frameworks */,
28B3F02D290C35D9000CD04D /* TreeSitterC in Frameworks */,
28B3F04B290C368B000CD04D /* TreeSitterJS in Frameworks */,
Expand Down Expand Up @@ -157,6 +159,7 @@
28B3F05F290C3720000CD04D /* TreeSitterYAML */,
28B3F062290C372D000CD04D /* TreeSitterZig */,
28B9F7A9290DDAC900245748 /* TreeSitterBash */,
2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */,
);
productName = "CodeLanguages-Container";
productReference = 28B3F00C290C207D000CD04D /* CodeLanguages_Container.framework */;
Expand Down Expand Up @@ -207,6 +210,7 @@
28B3F05E290C3720000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-yaml" */,
28B3F061290C372D000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-zig" */,
28B9F7A6290DDAB500245748 /* XCRemoteSwiftPackageReference "tree-sitter-bash" */,
2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */,
);
productRefGroup = 28B3F00D290C207D000CD04D /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -446,6 +450,14 @@
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/camdencheek/tree-sitter-dockerfile.git";
requirement = {
branch = main;
kind = branch;
};
};
28B3F02B290C35D9000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-c" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/tree-sitter/tree-sitter-c.git";
Expand Down Expand Up @@ -609,6 +621,11 @@
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
2846B261296BA1CF005F60B6 /* TreeSitterDockerfile */ = {
isa = XCSwiftPackageProductDependency;
package = 2846B260296BA1CF005F60B6 /* XCRemoteSwiftPackageReference "tree-sitter-dockerfile" */;
productName = TreeSitterDockerfile;
};
28B3F02C290C35D9000CD04D /* TreeSitterC */ = {
isa = XCSwiftPackageProductDependency;
package = 28B3F02B290C35D9000CD04D /* XCRemoteSwiftPackageReference "tree-sitter-c" */;
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ extern TSLanguage *tree_sitter_c();
extern TSLanguage *tree_sitter_cpp();
extern TSLanguage *tree_sitter_c_sharp();
extern TSLanguage *tree_sitter_css();
extern TSLanguage *tree_sitter_dockerfile();
extern TSLanguage *tree_sitter_elixir();
extern TSLanguage *tree_sitter_go();
extern TSLanguage *tree_sitter_gomod();
Expand Down
Binary file modified CodeLanguagesContainer.xcframework.zip
Binary file not shown.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ In order to add support for additional languages we have a complete guide on how
| [C++](https://github.com/tree-sitter/tree-sitter-cpp) | ✅ | ✅ |
| [C#](https://github.com/tree-sitter/tree-sitter-c-sharp) | ✅ | ✅ |
| [CSS](https://github.com/lukepistrol/tree-sitter-css) | ✅ | ✅ |
| [Dockerfile](https://github.com/camdencheek/tree-sitter-dockerfile) | ✅ | ✅ |
| [Elixir](https://github.com/elixir-lang/tree-sitter-elixir) | ✅ | ✅ |
| [ERB, EJS](https://github.com/tree-sitter/tree-sitter-embedded-template) | | |
| [Go](https://github.com/tree-sitter/tree-sitter-go) | ✅ | ✅ |
Expand Down
11 changes: 10 additions & 1 deletion Sources/CodeEditLanguages/CodeLanguage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ public struct CodeLanguage {
public let tsName: String

/// A set of file extensions for the language
///
/// In special cases this can also be a file name
/// (e.g `Dockerfile`, `Makefile`)
public let extensions: Set<String>

/// The query URL of a language this language inherits from. (e.g.: C for C++)
Expand Down Expand Up @@ -73,6 +76,8 @@ public struct CodeLanguage {
return tree_sitter_c_sharp()
case .css:
return tree_sitter_css()
case .dockerfile:
return tree_sitter_dockerfile()
case .elixir:
return tree_sitter_elixir()
case .go:
Expand Down Expand Up @@ -120,7 +125,7 @@ public extension CodeLanguage {
/// - Returns: A language structure
static func detectLanguageFrom(url: URL) -> CodeLanguage {
let fileExtension = url.pathExtension.lowercased()
let fileName = url.pathComponents.last?.lowercased()
let fileName = url.pathComponents.last // should not be lowercase since it has to match e.g. `Dockerfile`
// This is to handle special file types without an extension (e.g., Makefile, Dockerfile)
let fileNameOrExtension = fileExtension.isEmpty ? (fileName != nil ? fileName! : "") : fileExtension
if let lang = allLanguages.first(where: { lang in lang.extensions.contains(fileNameOrExtension)}) {
Expand All @@ -137,6 +142,7 @@ public extension CodeLanguage {
.cpp,
.cSharp,
.css,
.dockerfile,
.elixir,
.go,
.goMod,
Expand Down Expand Up @@ -173,6 +179,9 @@ public extension CodeLanguage {
/// A language structure for `CSS`
static let css: CodeLanguage = .init(id: .css, tsName: "css", extensions: ["css"])

/// A language structure for `Dockerfile`
static let dockerfile: CodeLanguage = .init(id: .dockerfile, tsName: "dockerfile", extensions: ["Dockerfile"])

/// A language structure for `Elixir`
static let elixir: CodeLanguage = .init(id: .elixir, tsName: "elixir", extensions: ["ex", "exs"])

Expand Down
2 changes: 2 additions & 0 deletions Sources/CodeEditLanguages/Documentation.docc/CodeLanguage.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ let language = CodeLanguage.detectLanguageFrom(url: fileURL)
- C++
- C#
- CSS
- Dockerfile
- Elixir
- Go
- Go Mod
Expand Down Expand Up @@ -67,6 +68,7 @@ let language = CodeLanguage.detectLanguageFrom(url: fileURL)
- ``cpp``
- ``cSharp``
- ``css``
- ``dockerfile``
- ``elixir``
- ``go``
- ``goMod``
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ let query = TreeSitterModel.shared.swiftQuery
- ``cppQuery``
- ``cSharpQuery``
- ``cssQuery``
- ``dockerfileQuery``
- ``elixirQuery``
- ``goQuery``
- ``goModQuery``
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
(raw_string_literal
delimiter: (raw_string_delimiter) @injection.language
(raw_string_content) @injection.content)
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[
"FROM"
"AS"
"RUN"
"CMD"
"LABEL"
"EXPOSE"
"ENV"
"ADD"
"COPY"
"ENTRYPOINT"
"VOLUME"
"USER"
"WORKDIR"
"ARG"
"ONBUILD"
"STOPSIGNAL"
"HEALTHCHECK"
"SHELL"
"MAINTAINER"
"CROSS_BUILD"
] @keyword

[
":"
"@"
] @operator

(comment) @comment


(image_spec
(image_tag
":" @punctuation.special)
(image_digest
"@" @punctuation.special))

(double_quoted_string) @string

(expansion
[
"$"
"{"
"}"
] @punctuation.special
) @none

((variable) @constant
(#match? @constant "^[A-Z][A-Z_0-9]*$"))


1 change: 1 addition & 0 deletions Sources/CodeEditLanguages/TreeSitterLanguage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public enum TreeSitterLanguage: String {
case cpp
case cSharp
case css
case dockerfile
case elixir
case go
case goMod
Expand Down
7 changes: 7 additions & 0 deletions Sources/CodeEditLanguages/TreeSitterModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public class TreeSitterModel {
return cSharpQuery
case .css:
return cssQuery
case .dockerfile:
return dockerfileQuery
case .elixir:
return elixirQuery
case .go:
Expand Down Expand Up @@ -91,6 +93,11 @@ public class TreeSitterModel {
return queryFor(.css)
}()

/// Query for `Dockerfile` files.
public private(set) lazy var dockerfileQuery: Query? = {
return queryFor(.dockerfile)
}()

/// Query for `Elixir` files.
public private(set) lazy var elixirQuery: Query? = {
return queryFor(.elixir)
Expand Down
19 changes: 19 additions & 0 deletions Tests/CodeEditLanguagesTests/CodeEditLanguagesTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,25 @@ final class CodeEditLanguagesTests: XCTestCase {
XCTAssertNotEqual(query?.patternCount, 0)
}

// MARK: - Dockerfile

func test_CodeLanguageDockerfile() throws {
let url = URL(fileURLWithPath: "~/path/to/Dockerfile")
let language = CodeLanguage.detectLanguageFrom(url: url)

XCTAssertEqual(language.id, .dockerfile)
}

func test_FetchQueryDockerfile() throws {
var language = CodeLanguage.dockerfile
language.resourceURL = bundleURL

let data = try Data(contentsOf: language.queryURL!)
let query = try? Query(language: language.language!, data: data)
XCTAssertNotNil(query)
XCTAssertNotEqual(query?.patternCount, 0)
}

// MARK: - Elixir

func test_CodeLanguageElixir() throws {
Expand Down