Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ coverage/
.pytest_cache/
target/
docs
squawk-vscode/syntaxes/pgsql.tmLanguage.json
squawk-vscode/.vscode-test/
squawk-vscode/dist/
25 changes: 25 additions & 0 deletions crates/xtask/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ pub(crate) fn codegen() -> Result<()> {
let token_sets_file = project_root().join("crates/squawk_parser/src/generated/token_sets.rs");
std::fs::write(token_sets_file, token_sets).context("problem writing generated token sets")?;

update_textmate_keywords(&keyword_kinds.all_keywords)?;

let kinds = generate_kind_src(&ast_src.nodes, &grammar, keyword_kinds.all_keywords);

let syntax_kinds = generate_syntax_kinds(kinds)?;
Expand Down Expand Up @@ -898,6 +900,29 @@ fn generate_nodes(nodes: &[AstNodeSrc], enums: &[AstEnumSrc]) -> String {
format!("{PRELUDE}{output}")
}

fn update_textmate_keywords(all_keywords: &[String]) -> Result<()> {
let tmlanguage_path = project_root().join("squawk-vscode/syntaxes/pgsql.tmLanguage.json");
let content = std::fs::read_to_string(&tmlanguage_path)?;
let mut json: serde_json::Value = serde_json::from_str(&content)?;

let mut keywords = all_keywords
.iter()
.map(|k| k.to_lowercase())
.collect::<Vec<_>>();
keywords.sort();

let keywords_joined = keywords.join("|");
let match_pattern = format!("(?xi)\\b({keywords_joined})\\b");

json["repository"]["keywords"]["patterns"][0]["match"] =
serde_json::Value::String(match_pattern);

let output = serde_json::to_string_pretty(&json)?;
std::fs::write(&tmlanguage_path, format!("{output}\n"))?;

Ok(())
}

fn generate_tokens(tokens: &[(&'static str, &'static str)]) -> String {
let tokens = tokens.iter().map(|(name, kind)| {
let name = format_ident!("{}", name.to_case(Case::Pascal));
Expand Down
8 changes: 6 additions & 2 deletions squawk-vscode/syntaxes/pgsql.tmLanguage.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
{
"fileTypes": ["sql", "pgsql", "psql"],
"fileTypes": [
"sql",
"pgsql",
"psql"
],
"foldingStartMarker": "\\s*\\(\\s*$",
"foldingStopMarker": "^\\s*\\)",
"name": "SQL (PostgreSQL)",
Expand Down Expand Up @@ -178,7 +182,7 @@
"name": "keyword.other.pgsql"
}
},
"match": "(?xi)\\b(abort|absolute|access|action|add|admin|after|aggregate|all|also|alter|always|analyse|analyze|and|any|array|as|asc|assertion|assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|bigint|binary|bit|boolean|both|by|cache|called|cascade|cascaded|case|cast|catalog|chain|char|character|characteristics|check|checkpoint|class|close|cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|create|cross|csv|current|current_catalog|current_date|current_role|current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|definer|delete|delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|domain|double|drop|each|else|enable|encoding|encrypted|end|enum|escape|event|except|exclude|excluding|exclusive|execute|exists|explain|extension|external|extract|false|family|fetch|first|float|following|for|force|foreign|forward|freeze|from|full|function|functions|global|grant|granted|greatest|group|handler|having|header|hold|hour|identity|if|ilike|immediate|immutable|implicit|in|including|increment|index|indexes|inherit|inherits|initially|inline|inner|inout|input|insensitive|insert|instead|int|integer|intersect|interval|into|invoker|is|isnull|isolation|join|key|label|language|large|last|lateral|lc_collate|lc_ctype|leading|leakproof|least|left|level|like|limit|listen|load|local|localtime|localtimestamp|location|lock|mapping|match|materialized|maxvalue|minute|minvalue|mode|month|move|name|names|national|natural|nchar|next|no|none|not|nothing|notify|notnull|nowait|null|nullif|nulls|numeric|object|of|off|offset|oids|on|only|operator|option|options|or|order|out|outer|over|overlaps|overlay|owned|owner|parser|partial|partition|passing|password|placing|plans|position|preceding|precision|prepare|prepared|preserve|primary|prior|privileges|procedural|procedure|program|quote|range|read|real|reassign|recheck|recursive|ref|references|refresh|reindex|relative|release|rename|repeatable|replace|replica|reset|restart|restrict|returning|returns|revoke|right|role|rollback|row|rows|rule|savepoint|schema|scroll|search|second|security|select|sequence|sequences|serializable|server|session|session_user|set|setof|share|show|similar|simple|smallint|snapshot|some|stable|standalone|start|statement|statistics|stdin|stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|tablespace|temp|template|temporary|text|then|time|timestamp|to|trailing|transaction|treat|trigger|trim|true|truncate|trusted|type|types|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|unlogged|until|update|user|using|vacuum|valid|validate|validator|value|values|varchar|variadic|varying|verbose|version|view|volatile|when|where|whitespace|window|with|without|work|wrapper|write|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone)\\b"
"match": "(?xi)\\b(abort|absent|absolute|access|action|add|admin|after|aggregate|all|also|alter|always|analyse|analyze|and|any|array|as|asc|asensitive|assertion|assignment|asymmetric|at|atomic|attach|attribute|authorization|backward|before|begin|between|bigint|binary|bit|boolean|both|breadth|by|cache|call|called|cascade|cascaded|case|cast|catalog|chain|char|character|characteristics|check|checkpoint|class|close|cluster|coalesce|collate|collation|column|columns|comment|comments|commit|committed|compression|concurrently|conditional|configuration|conflict|connection|constraint|constraints|content|continue|conversion|copy|cost|create|cross|csv|cube|current|current_catalog|current_date|current_role|current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|definer|delete|delimiter|delimiters|depends|depth|desc|destination|detach|dictionary|disable|discard|distinct|do|document|domain|double|drop|each|edge|else|empty|enable|encoding|encrypted|end|enforced|enum|error|escape|event|except|exclude|excluding|exclusive|execute|exists|explain|expression|extension|external|extract|false|family|fetch|filter|finalize|first|float|following|for|force|foreign|format|forward|freeze|from|full|function|functions|generated|global|grant|granted|graph|graph_table|greatest|group|grouping|groups|handler|having|header|hold|hour|identity|if|ignore|ilike|immediate|immutable|implicit|import|in|include|including|increment|indent|index|indexes|inherit|inherits|initially|inline|inner|inout|input|insensitive|insert|instead|int|integer|intersect|interval|into|invoker|is|isnull|isolation|join|json|json_array|json_arrayagg|json_exists|json_object|json_objectagg|json_query|json_scalar|json_serialize|json_table|json_value|keep|key|keys|label|language|large|last|lateral|leading|leakproof|least|left|level|like|limit|listen|load|local|localtime|localtimestamp|location|lock|locked|logged|lsn|mapping|match|matched|materialized|maxvalue|merge|merge_action|method|minute|minvalue|mode|month|move|name|names|national|natural|nchar|nested|new|next|nfc|nfd|nfkc|nfkd|no|node|none|normalize|normalized|not|nothing|notify|notnull|nowait|null|nullif|nulls|numeric|object|objects|of|off|offset|oids|old|omit|on|only|operator|option|options|or|order|ordinality|others|out|outer|over|overlaps|overlay|overriding|owned|owner|parallel|parameter|parser|partial|partition|partitions|passing|password|path|period|placing|plan|plans|policy|portion|position|preceding|precision|prepare|prepared|preserve|primary|prior|privileges|procedural|procedure|procedures|program|properties|property|publication|quote|quotes|range|read|real|reassign|recursive|ref|references|referencing|refresh|reindex|relationship|relative|release|rename|repack|repeatable|replace|replica|reset|respect|restart|restrict|return|returning|returns|revoke|right|role|rollback|rollup|routine|routines|row|rows|rule|savepoint|scalar|schema|schemas|scroll|search|second|security|select|sequence|sequences|serializable|server|session|session_user|set|setof|sets|share|show|similar|simple|skip|smallint|snapshot|some|source|split|sql|stable|standalone|start|statement|statistics|stdin|stdout|storage|stored|strict|string|strip|subscription|substring|support|symmetric|sysid|system|system_user|table|tables|tablesample|tablespace|target|temp|template|temporary|text|then|ties|time|timestamp|to|trailing|transaction|transform|treat|trigger|trim|true|truncate|trusted|type|types|uescape|unbounded|uncommitted|unconditional|unencrypted|union|unique|unknown|unlisten|unlogged|until|update|user|using|vacuum|valid|validate|validator|value|values|varchar|variadic|varying|verbose|version|vertex|view|views|virtual|volatile|wait|when|where|whitespace|window|with|within|without|work|wrapper|write|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|xmlforest|xmlnamespaces|xmlparse|xmlpi|xmlroot|xmlserialize|xmltable|year|yes|zone)\\b"
}
]
},
Expand Down
Loading