Add basic TypeScript and TSX support

Co-Authored-By: Keith Simmons <keith@zed.dev>
This commit is contained in:
Max Brunsfeld 2022-03-28 18:18:49 -07:00
parent a8600e76a3
commit dd1c88afa5
14 changed files with 373 additions and 13 deletions

View file

@ -555,6 +555,11 @@ pub fn build_language_registry(login_shell_env_loaded: Task<()>) -> LanguageRegi
tree_sitter_rust::language(),
Some(Arc::new(RustLspAdapter)),
),
(
"tsx",
tree_sitter_typescript::language_tsx(),
None, //
),
(
"typescript",
tree_sitter_typescript::language_typescript(),
@ -578,17 +583,26 @@ fn language(
)
.unwrap();
let mut language = Language::new(config, Some(grammar));
if let Some(query) = load_query(&format!("{}/highlights.scm", name)) {
language = language.with_highlights_query(query.as_ref()).unwrap();
if let Some(query) = load_query(name, "/highlights") {
language = language
.with_highlights_query(query.as_ref())
.expect("failed to evaluate highlights query");
}
if let Some(query) = load_query(&format!("{}/brackets.scm", name)) {
language = language.with_brackets_query(query.as_ref()).unwrap();
if let Some(query) = load_query(name, "/brackets") {
language = language
.with_brackets_query(query.as_ref())
.expect("failed to load brackets query");
}
if let Some(query) = load_query(&format!("{}/indents.scm", name)) {
language = language.with_indents_query(query.as_ref()).unwrap();
if let Some(query) = load_query(name, "/indents") {
language = language
.with_indents_query(query.as_ref())
.expect("failed to load indents query");
}
if let Some(query) = load_query(&format!("{}/outline.scm", name)) {
language = language.with_outline_query(query.as_ref()).unwrap();
if let Some(query) = load_query(name, "/outline") {
language = language
.with_outline_query(query.as_ref())
.expect("failed to load outline query");
}
if let Some(lsp_adapter) = lsp_adapter {
language = language.with_lsp_adapter(lsp_adapter)
@ -596,11 +610,23 @@ fn language(
language
}
fn load_query(path: &str) -> Option<Cow<'static, str>> {
LanguageDir::get(path).map(|item| match item.data {
Cow::Borrowed(s) => Cow::Borrowed(str::from_utf8(s).unwrap()),
Cow::Owned(s) => Cow::Owned(String::from_utf8(s).unwrap()),
})
fn load_query(name: &str, filename_prefix: &str) -> Option<Cow<'static, str>> {
let mut result = None;
for path in LanguageDir::iter() {
if let Some(remainder) = path.strip_prefix(name) {
if remainder.starts_with(filename_prefix) {
let contents = match LanguageDir::get(path.as_ref()).unwrap().data {
Cow::Borrowed(s) => Cow::Borrowed(str::from_utf8(s).unwrap()),
Cow::Owned(s) => Cow::Owned(String::from_utf8(s).unwrap()),
};
match &mut result {
None => result = Some(contents),
Some(r) => r.to_mut().push_str(contents.as_ref()),
}
}
}
}
result
}
#[cfg(test)]