feat: support indexing typescript / javascript / tsx / jsx (#539)

r0.3
Meng Zhang 2023-10-11 17:42:58 -07:00 committed by GitHub
parent 92c1f5a8c0
commit 888fbca7e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 59 additions and 14 deletions

11
Cargo.lock generated
View File

@ -3200,6 +3200,7 @@ dependencies = [
"tree-sitter-python", "tree-sitter-python",
"tree-sitter-rust", "tree-sitter-rust",
"tree-sitter-tags", "tree-sitter-tags",
"tree-sitter-typescript",
"walkdir", "walkdir",
] ]
@ -3942,6 +3943,16 @@ dependencies = [
"tree-sitter", "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]] [[package]]
name = "try-lock" name = "try-lock"
version = "0.2.4" version = "0.2.4"

View File

@ -20,6 +20,7 @@ serde-jsonlines = { workspace = true }
file-rotate = "0.7.5" file-rotate = "0.7.5"
tree-sitter-python = "0.20.2" tree-sitter-python = "0.20.2"
tree-sitter-rust = "0.20.3" tree-sitter-rust = "0.20.3"
tree-sitter-typescript = "0.20.3"
[dev-dependencies] [dev-dependencies]
temp_testdir = "0.2" temp_testdir = "0.2"

View File

@ -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

View File

@ -193,8 +193,6 @@ lazy_static! {
("haskell", vec!["hs"]), ("haskell", vec!["hs"]),
("html", vec!["html"]), ("html", vec!["html"]),
("java", vec!["java"]), ("java", vec!["java"]),
("javascript", vec!["js", "mjs"]),
("jsx", vec!["jsx"]),
("julia", vec!["jl"]), ("julia", vec!["jl"]),
("lua", vec!["lua"]), ("lua", vec!["lua"]),
("makefile", vec!["Makefile"]), ("makefile", vec!["Makefile"]),
@ -208,8 +206,10 @@ lazy_static! {
("sql", vec!["sql"]), ("sql", vec!["sql"]),
("scala", vec!["scala"]), ("scala", vec!["scala"]),
("shellscript", vec!["sh", "bash", "command", "zsh"]), ("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"]), ("tex", vec!["tex"]),
("vb", vec!["vb"]), ("vb", vec!["vb"]),
]) ])
@ -248,6 +248,17 @@ lazy_static! {
.unwrap(), .unwrap(),
), ),
), ),
(
"javascript-typescript",
TagsConfigurationSync(
TagsConfiguration::new(
tree_sitter_typescript::language_tsx(),
include_str!("../queries/tsx.scm"),
"",
)
.unwrap(),
),
),
]) ])
}; };
} }

View File

@ -91,11 +91,10 @@ fn from_source_file(file: SourceFile) -> impl Iterator<Item = IndexedDocument> {
return None; return None;
} }
let language = reduce_language_if_needed(&file.language).to_owned();
Some(IndexedDocument { Some(IndexedDocument {
git_url: file.git_url.clone(), git_url: file.git_url.clone(),
filepath: file.filepath.clone(), filepath: file.filepath.clone(),
language, language: file.language.clone(),
name, name,
body, body,
kind: tag.syntax_type_name, kind: tag.syntax_type_name,
@ -103,14 +102,6 @@ fn from_source_file(file: SourceFile) -> impl Iterator<Item = IndexedDocument> {
}) })
} }
fn reduce_language_if_needed(language: &str) -> &str {
if ["javascript", "jsx", "typescript", "tsx"].contains(&language) {
"javascript-typescript"
} else {
language
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use serde_json::{from_value, json}; use serde_json::{from_value, json};