diff --git a/cli/loader/src/lib.rs b/cli/loader/src/lib.rs index d4a5b1ac..b1e8a71d 100644 --- a/cli/loader/src/lib.rs +++ b/cli/loader/src/lib.rs @@ -187,6 +187,8 @@ pub struct Grammar { pub first_line_regex: Option, #[serde(skip_serializing_if = "Option::is_none")] pub content_regex: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub class_name: Option, } #[derive(Serialize, Deserialize)] diff --git a/cli/src/init.rs b/cli/src/init.rs index bbae3e3d..ef79d2f4 100644 --- a/cli/src/init.rs +++ b/cli/src/init.rs @@ -24,6 +24,7 @@ const PARSER_NAME_PLACEHOLDER: &str = "PARSER_NAME"; const CAMEL_PARSER_NAME_PLACEHOLDER: &str = "CAMEL_PARSER_NAME"; const UPPER_PARSER_NAME_PLACEHOLDER: &str = "UPPER_PARSER_NAME"; const LOWER_PARSER_NAME_PLACEHOLDER: &str = "LOWER_PARSER_NAME"; +const PARSER_CLASS_NAME_PLACEHOLDER: &str = "PARSER_CLASS_NAME"; const PARSER_DESCRIPTION_PLACEHOLDER: &str = "PARSER_DESCRIPTION"; const PARSER_LICENSE_PLACEHOLDER: &str = "PARSER_LICENSE"; @@ -152,6 +153,7 @@ impl JsonConfigOpts { injection_regex: Some(format!("^{}$", self.name)), first_line_regex: None, content_regex: None, + class_name: Some(format!("TreeSitter{}", self.name.to_upper_camel_case())), }], metadata: Metadata { version: self.version, @@ -209,6 +211,7 @@ struct GenerateOpts<'a> { funding: Option<&'a str>, version: &'a Version, camel_parser_name: &'a str, + class_name: &'a str, } pub fn generate_grammar_files( @@ -250,6 +253,10 @@ pub fn generate_grammar_files( .camelcase .clone() .unwrap_or_else(|| language_name.to_upper_camel_case()); + let class_name = tree_sitter_config.grammars[0] + .class_name + .clone() + .unwrap_or_else(|| format!("TreeSitter{}", language_name.to_upper_camel_case())); let generate_opts = GenerateOpts { author_name: authors @@ -275,6 +282,7 @@ pub fn generate_grammar_files( .and_then(|l| l.funding.as_ref().map(|f| f.as_str())), version: &tree_sitter_config.metadata.version, camel_parser_name: &camel_name, + class_name: &class_name, }; // Create package.json @@ -708,7 +716,8 @@ fn generate_file( .replace( PARSER_VERSION_PLACEHOLDER, &generate_opts.version.to_string(), - ); + ) + .replace(PARSER_CLASS_NAME_PLACEHOLDER, generate_opts.class_name); if let Some(name) = generate_opts.author_name { replacement = replacement.replace(AUTHOR_NAME_PLACEHOLDER, name); diff --git a/cli/src/templates/package.swift b/cli/src/templates/package.swift index b42ffc5c..8d5f068a 100644 --- a/cli/src/templates/package.swift +++ b/cli/src/templates/package.swift @@ -9,16 +9,16 @@ if FileManager.default.fileExists(atPath: "src/scanner.c") { } let package = Package( - name: "TreeSitterCAMEL_PARSER_NAME", + name: "PARSER_CLASS_NAME", products: [ - .library(name: "TreeSitterCAMEL_PARSER_NAME", targets: ["TreeSitterCAMEL_PARSER_NAME"]), + .library(name: "PARSER_CLASS_NAME", targets: ["PARSER_CLASS_NAME"]), ], dependencies: [ .package(url: "https://github.com/ChimeHQ/SwiftTreeSitter", from: "0.8.0"), ], targets: [ .target( - name: "TreeSitterCAMEL_PARSER_NAME", + name: "PARSER_CLASS_NAME", dependencies: [], path: ".", sources: sources, @@ -29,12 +29,12 @@ let package = Package( cSettings: [.headerSearchPath("src")] ), .testTarget( - name: "TreeSitterCAMEL_PARSER_NAMETests", + name: "PARSER_CLASS_NAMETests", dependencies: [ "SwiftTreeSitter", - "TreeSitterCAMEL_PARSER_NAME", + "PARSER_CLASS_NAME", ], - path: "bindings/swift/TreeSitterCAMEL_PARSER_NAMETests" + path: "bindings/swift/PARSER_CLASS_NAMETests" ) ], cLanguageStandard: .c11 diff --git a/cli/src/templates/tests.swift b/cli/src/templates/tests.swift index 3d0b8ce0..c481b883 100644 --- a/cli/src/templates/tests.swift +++ b/cli/src/templates/tests.swift @@ -1,8 +1,8 @@ import XCTest import SwiftTreeSitter -import TreeSitterCAMEL_PARSER_NAME +import PARSER_CLASS_NAME -final class TreeSitterCAMEL_PARSER_NAMETests: XCTestCase { +final class PARSER_CLASS_NAMETests: XCTestCase { func testCanLoadGrammar() throws { let parser = Parser() let language = Language(language: tree_sitter_LOWER_PARSER_NAME()) diff --git a/docs/src/assets/schemas/config.schema.json b/docs/src/assets/schemas/config.schema.json index c14a9e64..481acc58 100644 --- a/docs/src/assets/schemas/config.schema.json +++ b/docs/src/assets/schemas/config.schema.json @@ -133,6 +133,11 @@ "type": "string", "format": "regex", "description": "A regex pattern that will be tested against the contents of the file in order to break ties in cases where multiple grammars matched the file." + }, + "class-name": { + "type": "string", + "pattern": "^TreeSitter\\w+$", + "description": "The class name for the Swift, Java & Kotlin bindings" } }, "additionalProperties": false,