Skip to content

Commit

Permalink
address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
ilevyor committed Apr 3, 2024
1 parent 2165125 commit 582cd18
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 320 deletions.
10 changes: 5 additions & 5 deletions crates/core/src/pattern/patterns.rs
Original file line number Diff line number Diff line change
Expand Up @@ -510,12 +510,12 @@ impl Pattern {
fields
.iter()
.filter(|field| {
// ordinarily we want to match on all possible fields including the absense of nodes within a field
// eg. `func_call()` should not match `func_call(arg)` however sometimes we want to allow people to
// save some boilerplate and by default match a node even if a field is present in the code, but not
// in the snippet. eg.
// Ordinarily, we want to match on all possible fields, including the absence of nodes within a field.
// e.g., `func_call()` should not match `func_call(arg)`, however, sometimes we want to allow people to
// save some boilerplate and by default match a node even if a field is present in the code but not
// in the snippet. e.g.,
// `func name(args) {}` will match `async name(args) {}` because async is an optional_empty_field for tsx.
// to explicitly only match synchronous functions you could write:
// To explicitly only match synchronous functions, you could write:
// `$async func name(args)` where $async <: .
!((node.child_by_field_id(field.id()).is_none() && lang.optional_empty_field_compilation(sort, field.id()))
// we wanted to be able to match on the presence of parentheses in an arrow function manually
Expand Down
69 changes: 10 additions & 59 deletions crates/language/src/javascript.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
use crate::{
language::{fields_for_nodes, Field, FieldId, Language, SortId, TSLanguage},
xscript_util::{self, jslike_check_orphaned, jslike_get_statement_sorts},
language::{
fields_for_nodes, kind_and_field_id_for_names, Field, FieldId, Language, SortId, TSLanguage,
},
xscript_util::{
self, js_like_get_statement_sorts, js_optional_empty_field_compilation,
js_skip_snippet_compilation_sorts, jslike_check_orphaned,
},
};
use anyhow::Result;
use marzano_util::position::Range;
Expand Down Expand Up @@ -45,68 +50,14 @@ impl JavaScript {
let metavariable_sort = language.id_for_node_kind("grit_metavariable", true);
let comment_sort = language.id_for_node_kind("comment", true);

let statement_sorts = STATEMENT_SORTS.get_or_init(|| jslike_get_statement_sorts(language));
let statement_sorts = STATEMENT_SORTS.get_or_init(|| js_like_get_statement_sorts(language));

let skip_snippet_compilation_sorts = SKIP_SNIPPET_COMPILATION_SORTS.get_or_init(|| {
vec![
(
language.id_for_node_kind("method_definition", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_declaration", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("generator_function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("generator_function_declaration", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("arrow_function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
]
kind_and_field_id_for_names(language, js_skip_snippet_compilation_sorts())
});

let optional_empty_field_compilation = OPTIONAL_EMPTY_FIELD_COMPILATION.get_or_init(|| {
vec![
(
language.id_for_node_kind("function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("arrow_function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("generator_function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("generator_function_declaration", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("method_definition", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("function_declaration", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("import_statement", true),
language.field_id_for_name("import").unwrap(),
),
]
kind_and_field_id_for_names(language, js_optional_empty_field_compilation())
});

Self {
Expand Down
27 changes: 20 additions & 7 deletions crates/language/src/language.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,23 +143,35 @@ pub(crate) fn normalize_double_quote_string(s: &str) -> Option<&str> {
s.strip_prefix('"')?.strip_suffix('"')
}

pub(crate) fn kind_and_field_id_for_names(
lang: &TSLanguage,
names: Vec<(&str, &str)>,
) -> Vec<(u16, u16)> {
names
.iter()
.map(|(kind, field)| {
(
lang.id_for_node_kind(kind, true),
lang.field_id_for_name(field).unwrap(),
)
})
.collect()
}

#[enum_dispatch(TargetLanguage)]
pub trait Language {
/// tree sitter language to parse the source
fn get_ts_language(&self) -> &TSLanguage;

fn language_name(&self) -> &'static str;

/// ignore trivial tokens in language matching
/// such as extras in the tree-sitter grammar
fn skippable_sorts(&self) -> &'static [u16] {
&[]
}

fn skip_snippet_compilation_of_field(&self, _sort_id: SortId, _field_id: FieldId) -> bool {
false
}

/// get a list fields which when not present in a snippet will not be matched against.
/// by default empty fields will be require the target field to also be empty to match, e.g.,
/// `function() { $body }` will only match functions with no arguments.
fn optional_empty_field_compilation(&self, _sort_id: SortId, _field_id: FieldId) -> bool {
false
}
Expand Down Expand Up @@ -427,7 +439,8 @@ impl SnippetTree {
if snippet_root
.utf8_text(self.context.as_bytes())
.unwrap()
.trim() != self.snippet.trim()
.trim()
!= self.snippet.trim()
{
return None;
}
Expand Down
134 changes: 10 additions & 124 deletions crates/language/src/tsx.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
use std::{borrow::Cow, sync::OnceLock};

use crate::{
language::{fields_for_nodes, Field, FieldId, Language, SortId, TSLanguage},
xscript_util,
language::{
fields_for_nodes, kind_and_field_id_for_names, Field, FieldId, Language, SortId, TSLanguage,
},
xscript_util::{
self, js_like_optional_empty_field_compilation, js_like_skip_snippet_compilation_sorts,
},
};
use marzano_util::position::Range;
use tree_sitter::{Node, Parser};
use xscript_util::{jslike_check_orphaned, jslike_get_statement_sorts};
use xscript_util::{js_like_get_statement_sorts, jslike_check_orphaned};

static NODE_TYPES_STRING: &str = include_str!("../../../resources/node-types/tsx-node-types.json");
static NODE_TYPES: OnceLock<Vec<Vec<Field>>> = OnceLock::new();
Expand Down Expand Up @@ -44,132 +48,14 @@ impl Tsx {
let metavariable_sort = language.id_for_node_kind("grit_metavariable", true);
let comment_sort = language.id_for_node_kind("comment", true);
let skip_snippet_compilation_sorts = SKIP_SNIPPET_COMPILATION_SORTS.get_or_init(|| {
vec![
(
language.id_for_node_kind("method_definition", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_declaration", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("generator_function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("generator_function_declaration", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("arrow_function", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("constructor_type", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("construct_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_type", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("method_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("abstract_method_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
(
language.id_for_node_kind("function_signature", true),
language.field_id_for_name("parenthesis").unwrap(),
),
]
kind_and_field_id_for_names(language, js_like_skip_snippet_compilation_sorts())
});

let optional_empty_field_compilation = OPTIONAL_EMPTY_FIELD_COMPILATION.get_or_init(|| {
vec![
(
language.id_for_node_kind("call_expression", true),
language.field_id_for_name("type_arguments").unwrap(),
),
(
language.id_for_node_kind("new_expression", true),
language.field_id_for_name("type_arguments").unwrap(),
),
(
language.id_for_node_kind("function", true),
language.field_id_for_name("return_type").unwrap(),
),
(
language.id_for_node_kind("arrow_function", true),
language.field_id_for_name("return_type").unwrap(),
),
(
language.id_for_node_kind("function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("arrow_function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("generator_function", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("generator_function_declaration", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("method_definition", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("function_declaration", true),
language.field_id_for_name("async").unwrap(),
),
(
language.id_for_node_kind("import_statement", true),
language.field_id_for_name("import").unwrap(),
),
(
language.id_for_node_kind("import_statement", true),
language.field_id_for_name("type").unwrap(),
),
(
language.id_for_node_kind("public_field_definition", true),
language.field_id_for_name("static").unwrap(),
),
]
kind_and_field_id_for_names(language, js_like_optional_empty_field_compilation())
});

let statement_sorts = STATEMENT_SORTS.get_or_init(|| jslike_get_statement_sorts(language));
let statement_sorts = STATEMENT_SORTS.get_or_init(|| js_like_get_statement_sorts(language));

Self {
node_types,
Expand Down
Loading

0 comments on commit 582cd18

Please sign in to comment.