From 888fbca7e177c0da823505249d56aacad3735f97 Mon Sep 17 00:00:00 2001 From: Meng Zhang Date: Wed, 11 Oct 2023 17:42:58 -0700 Subject: [PATCH] feat: support indexing typescript / javascript / tsx / jsx (#539) --- Cargo.lock | 11 +++++++++ crates/tabby-scheduler/Cargo.toml | 1 + crates/tabby-scheduler/queries/tsx.scm | 31 ++++++++++++++++++++++++++ crates/tabby-scheduler/src/dataset.rs | 19 ++++++++++++---- crates/tabby-scheduler/src/index.rs | 11 +-------- 5 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 crates/tabby-scheduler/queries/tsx.scm diff --git a/Cargo.lock b/Cargo.lock index 90f3540..63c841c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3200,6 +3200,7 @@ dependencies = [ "tree-sitter-python", "tree-sitter-rust", "tree-sitter-tags", + "tree-sitter-typescript", "walkdir", ] @@ -3942,6 +3943,16 @@ dependencies = [ "tree-sitter", ] +[[package]] +name = "tree-sitter-typescript" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75049f0aafabb2aac205d7bb24da162b53dcd0cfb326785f25a2f32efa8071a" +dependencies = [ + "cc", + "tree-sitter", +] + [[package]] name = "try-lock" version = "0.2.4" diff --git a/crates/tabby-scheduler/Cargo.toml b/crates/tabby-scheduler/Cargo.toml index 6132ac1..1b13ec2 100644 --- a/crates/tabby-scheduler/Cargo.toml +++ b/crates/tabby-scheduler/Cargo.toml @@ -20,6 +20,7 @@ serde-jsonlines = { workspace = true } file-rotate = "0.7.5" tree-sitter-python = "0.20.2" tree-sitter-rust = "0.20.3" +tree-sitter-typescript = "0.20.3" [dev-dependencies] temp_testdir = "0.2" diff --git a/crates/tabby-scheduler/queries/tsx.scm b/crates/tabby-scheduler/queries/tsx.scm new file mode 100644 index 0000000..fb2eb01 --- /dev/null +++ b/crates/tabby-scheduler/queries/tsx.scm @@ -0,0 +1,31 @@ +; Modified based on https://github.com/tree-sitter/tree-sitter-typescript/blob/master/queries/tags.scm + +(function_signature + name: (identifier) @name) @definition.function + +(method_signature + name: (property_identifier) @name) @definition.method + +(abstract_method_signature + name: (property_identifier) @name) @definition.method + +(abstract_class_declaration + name: (type_identifier) @name) @definition.class + +(module + name: (identifier) @name) @definition.module + +(interface_declaration + name: (type_identifier) @name) @definition.interface + +(type_annotation + (type_identifier) @name) @reference.type + +(new_expression + constructor: (identifier) @name) @reference.class + +(call_expression + function: (identifier) @name) @reference.call + +(call_expression + function: (member_expression property: (property_identifier) @name)) @reference.call \ No newline at end of file diff --git a/crates/tabby-scheduler/src/dataset.rs b/crates/tabby-scheduler/src/dataset.rs index a78235b..215a102 100644 --- a/crates/tabby-scheduler/src/dataset.rs +++ b/crates/tabby-scheduler/src/dataset.rs @@ -193,8 +193,6 @@ lazy_static! { ("haskell", vec!["hs"]), ("html", vec!["html"]), ("java", vec!["java"]), - ("javascript", vec!["js", "mjs"]), - ("jsx", vec!["jsx"]), ("julia", vec!["jl"]), ("lua", vec!["lua"]), ("makefile", vec!["Makefile"]), @@ -208,8 +206,10 @@ lazy_static! { ("sql", vec!["sql"]), ("scala", vec!["scala"]), ("shellscript", vec!["sh", "bash", "command", "zsh"]), - ("typescript", vec!["ts", "mts"]), - ("tsx", vec!["tsx"]), + ( + "javascript-typescript", + vec!["ts", "mts", "js", "mjs", "jsx", "tsx"], + ), ("tex", vec!["tex"]), ("vb", vec!["vb"]), ]) @@ -248,6 +248,17 @@ lazy_static! { .unwrap(), ), ), + ( + "javascript-typescript", + TagsConfigurationSync( + TagsConfiguration::new( + tree_sitter_typescript::language_tsx(), + include_str!("../queries/tsx.scm"), + "", + ) + .unwrap(), + ), + ), ]) }; } diff --git a/crates/tabby-scheduler/src/index.rs b/crates/tabby-scheduler/src/index.rs index da48760..ce4a179 100644 --- a/crates/tabby-scheduler/src/index.rs +++ b/crates/tabby-scheduler/src/index.rs @@ -91,11 +91,10 @@ fn from_source_file(file: SourceFile) -> impl Iterator { return None; } - let language = reduce_language_if_needed(&file.language).to_owned(); Some(IndexedDocument { git_url: file.git_url.clone(), filepath: file.filepath.clone(), - language, + language: file.language.clone(), name, body, kind: tag.syntax_type_name, @@ -103,14 +102,6 @@ fn from_source_file(file: SourceFile) -> impl Iterator { }) } -fn reduce_language_if_needed(language: &str) -> &str { - if ["javascript", "jsx", "typescript", "tsx"].contains(&language) { - "javascript-typescript" - } else { - language - } -} - #[cfg(test)] mod tests { use serde_json::{from_value, json};