-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
769b9f1
commit da75c9e
Showing
11 changed files
with
612 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
[package] | ||
name = "tree-sitter-elixir" | ||
description = "elixir grammar for the tree-sitter parsing library" | ||
version = "0.19.0" | ||
keywords = ["incremental", "parsing", "elixir"] | ||
categories = ["parsing", "text-editors"] | ||
repository = "https://github.com/tree-sitter/tree-sitter-elixir" | ||
edition = "2018" | ||
license = "MIT" | ||
|
||
build = "bindings/rust/build.rs" | ||
include = [ | ||
"bindings/rust/*", | ||
"grammar.js", | ||
"queries/*", | ||
"src/*", | ||
] | ||
|
||
[lib] | ||
path = "bindings/rust/lib.rs" | ||
|
||
[dependencies] | ||
tree-sitter = "0.19" | ||
|
||
[build-dependencies] | ||
cc = "1.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
{ | ||
"targets": [ | ||
{ | ||
"target_name": "tree_sitter_elixir_binding", | ||
"include_dirs": [ | ||
"<!(node -e \"require('nan')\")", | ||
"src" | ||
], | ||
"sources": [ | ||
"bindings/node/binding.cc", | ||
"src/parser.c", | ||
# If your language uses an external scanner, add it here. | ||
], | ||
"cflags_c": [ | ||
"-std=c99", | ||
] | ||
} | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
#include "tree_sitter/parser.h" | ||
#include <node.h> | ||
#include "nan.h" | ||
|
||
using namespace v8; | ||
|
||
extern "C" TSLanguage * tree_sitter_elixir(); | ||
|
||
namespace { | ||
|
||
NAN_METHOD(New) {} | ||
|
||
void Init(Local<Object> exports, Local<Object> module) { | ||
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New); | ||
tpl->SetClassName(Nan::New("Language").ToLocalChecked()); | ||
tpl->InstanceTemplate()->SetInternalFieldCount(1); | ||
|
||
Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked(); | ||
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked(); | ||
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_elixir()); | ||
|
||
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("elixir").ToLocalChecked()); | ||
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance); | ||
} | ||
|
||
NODE_MODULE(tree_sitter_elixir_binding, Init) | ||
|
||
} // namespace |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
try { | ||
module.exports = require("../../build/Release/tree_sitter_elixir_binding"); | ||
} catch (error1) { | ||
if (error1.code !== 'MODULE_NOT_FOUND') { | ||
throw error1; | ||
} | ||
try { | ||
module.exports = require("../../build/Debug/tree_sitter_elixir_binding"); | ||
} catch (error2) { | ||
if (error2.code !== 'MODULE_NOT_FOUND') { | ||
throw error2; | ||
} | ||
throw error1 | ||
} | ||
} | ||
|
||
try { | ||
module.exports.nodeTypeInfo = require("../../src/node-types.json"); | ||
} catch (_) {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
fn main() { | ||
let src_dir = std::path::Path::new("src"); | ||
|
||
let mut c_config = cc::Build::new(); | ||
c_config.include(&src_dir); | ||
c_config | ||
.flag_if_supported("-Wno-unused-parameter") | ||
.flag_if_supported("-Wno-unused-but-set-variable") | ||
.flag_if_supported("-Wno-trigraphs"); | ||
let parser_path = src_dir.join("parser.c"); | ||
c_config.file(&parser_path); | ||
|
||
// If your language uses an external scanner written in C, | ||
// then include this block of code: | ||
|
||
/* | ||
let scanner_path = src_dir.join("scanner.c"); | ||
c_config.file(&scanner_path); | ||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); | ||
*/ | ||
|
||
c_config.compile("parser"); | ||
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); | ||
|
||
// If your language uses an external scanner written in C++, | ||
// then include this block of code: | ||
|
||
/* | ||
let mut cpp_config = cc::Build::new(); | ||
cpp_config.cpp(true); | ||
cpp_config.include(&src_dir); | ||
cpp_config | ||
.flag_if_supported("-Wno-unused-parameter") | ||
.flag_if_supported("-Wno-unused-but-set-variable"); | ||
let scanner_path = src_dir.join("scanner.cc"); | ||
cpp_config.file(&scanner_path); | ||
cpp_config.compile("scanner"); | ||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); | ||
*/ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
//! This crate provides elixir language support for the [tree-sitter][] parsing library. | ||
//! | ||
//! Typically, you will use the [language][language func] function to add this language to a | ||
//! tree-sitter [Parser][], and then use the parser to parse some code: | ||
//! | ||
//! ``` | ||
//! let code = ""; | ||
//! let mut parser = tree_sitter::Parser::new(); | ||
//! parser.set_language(tree_sitter_elixir::language()).expect("Error loading elixir grammar"); | ||
//! let tree = parser.parse(code, None).unwrap(); | ||
//! ``` | ||
//! | ||
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html | ||
//! [language func]: fn.language.html | ||
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html | ||
//! [tree-sitter]: https://tree-sitter.github.io/ | ||
use tree_sitter::Language; | ||
|
||
extern "C" { | ||
fn tree_sitter_elixir() -> Language; | ||
} | ||
|
||
/// Get the tree-sitter [Language][] for this grammar. | ||
/// | ||
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html | ||
pub fn language() -> Language { | ||
unsafe { tree_sitter_elixir() } | ||
} | ||
|
||
/// The content of the [`node-types.json`][] file for this grammar. | ||
/// | ||
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types | ||
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json"); | ||
|
||
// Uncomment these to include any queries that this grammar contains | ||
|
||
// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm"); | ||
// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm"); | ||
// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm"); | ||
// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm"); | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
#[test] | ||
fn test_can_load_grammar() { | ||
let mut parser = tree_sitter::Parser::new(); | ||
parser | ||
.set_language(super::language()) | ||
.expect("Error loading elixir language"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
module.exports = grammar({ | ||
name: "elixir", | ||
|
||
rules: { | ||
source: ($) => "TODO", | ||
}, | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
{ | ||
"name": "elixir", | ||
"rules": { | ||
"source": { | ||
"type": "STRING", | ||
"value": "TODO" | ||
} | ||
}, | ||
"extras": [ | ||
{ | ||
"type": "PATTERN", | ||
"value": "\\s" | ||
} | ||
], | ||
"conflicts": [], | ||
"precedences": [], | ||
"externals": [], | ||
"inline": [], | ||
"supertypes": [] | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
[ | ||
{ | ||
"type": "source", | ||
"named": true, | ||
"fields": {} | ||
}, | ||
{ | ||
"type": "TODO", | ||
"named": false | ||
} | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,166 @@ | ||
#include <tree_sitter/parser.h> | ||
|
||
#if defined(__GNUC__) || defined(__clang__) | ||
#pragma GCC diagnostic push | ||
#pragma GCC diagnostic ignored "-Wmissing-field-initializers" | ||
#endif | ||
|
||
#define LANGUAGE_VERSION 13 | ||
#define STATE_COUNT 4 | ||
#define LARGE_STATE_COUNT 2 | ||
#define SYMBOL_COUNT 3 | ||
#define ALIAS_COUNT 0 | ||
#define TOKEN_COUNT 2 | ||
#define EXTERNAL_TOKEN_COUNT 0 | ||
#define FIELD_COUNT 0 | ||
#define MAX_ALIAS_SEQUENCE_LENGTH 1 | ||
#define PRODUCTION_ID_COUNT 1 | ||
|
||
enum { | ||
anon_sym_TODO = 1, | ||
sym_source = 2, | ||
}; | ||
|
||
static const char * const ts_symbol_names[] = { | ||
[ts_builtin_sym_end] = "end", | ||
[anon_sym_TODO] = "TODO", | ||
[sym_source] = "source", | ||
}; | ||
|
||
static const TSSymbol ts_symbol_map[] = { | ||
[ts_builtin_sym_end] = ts_builtin_sym_end, | ||
[anon_sym_TODO] = anon_sym_TODO, | ||
[sym_source] = sym_source, | ||
}; | ||
|
||
static const TSSymbolMetadata ts_symbol_metadata[] = { | ||
[ts_builtin_sym_end] = { | ||
.visible = false, | ||
.named = true, | ||
}, | ||
[anon_sym_TODO] = { | ||
.visible = true, | ||
.named = false, | ||
}, | ||
[sym_source] = { | ||
.visible = true, | ||
.named = true, | ||
}, | ||
}; | ||
|
||
static const TSSymbol ts_alias_sequences[PRODUCTION_ID_COUNT][MAX_ALIAS_SEQUENCE_LENGTH] = { | ||
[0] = {0}, | ||
}; | ||
|
||
static const uint16_t ts_non_terminal_alias_map[] = { | ||
0, | ||
}; | ||
|
||
static bool ts_lex(TSLexer *lexer, TSStateId state) { | ||
START_LEXER(); | ||
eof = lexer->eof(lexer); | ||
switch (state) { | ||
case 0: | ||
if (eof) ADVANCE(4); | ||
if (lookahead == 'T') ADVANCE(2); | ||
if (lookahead == '\t' || | ||
lookahead == '\n' || | ||
lookahead == '\r' || | ||
lookahead == ' ') SKIP(0) | ||
END_STATE(); | ||
case 1: | ||
if (lookahead == 'D') ADVANCE(3); | ||
END_STATE(); | ||
case 2: | ||
if (lookahead == 'O') ADVANCE(1); | ||
END_STATE(); | ||
case 3: | ||
if (lookahead == 'O') ADVANCE(5); | ||
END_STATE(); | ||
case 4: | ||
ACCEPT_TOKEN(ts_builtin_sym_end); | ||
END_STATE(); | ||
case 5: | ||
ACCEPT_TOKEN(anon_sym_TODO); | ||
END_STATE(); | ||
default: | ||
return false; | ||
} | ||
} | ||
|
||
static const TSLexMode ts_lex_modes[STATE_COUNT] = { | ||
[0] = {.lex_state = 0}, | ||
[1] = {.lex_state = 0}, | ||
[2] = {.lex_state = 0}, | ||
[3] = {.lex_state = 0}, | ||
}; | ||
|
||
static const uint16_t ts_parse_table[LARGE_STATE_COUNT][SYMBOL_COUNT] = { | ||
[0] = { | ||
[ts_builtin_sym_end] = ACTIONS(1), | ||
[anon_sym_TODO] = ACTIONS(1), | ||
}, | ||
[1] = { | ||
[sym_source] = STATE(3), | ||
[anon_sym_TODO] = ACTIONS(3), | ||
}, | ||
}; | ||
|
||
static const uint16_t ts_small_parse_table[] = { | ||
[0] = 1, | ||
ACTIONS(5), 1, | ||
ts_builtin_sym_end, | ||
[4] = 1, | ||
ACTIONS(7), 1, | ||
ts_builtin_sym_end, | ||
}; | ||
|
||
static const uint32_t ts_small_parse_table_map[] = { | ||
[SMALL_STATE(2)] = 0, | ||
[SMALL_STATE(3)] = 4, | ||
}; | ||
|
||
static const TSParseActionEntry ts_parse_actions[] = { | ||
[0] = {.entry = {.count = 0, .reusable = false}}, | ||
[1] = {.entry = {.count = 1, .reusable = false}}, RECOVER(), | ||
[3] = {.entry = {.count = 1, .reusable = true}}, SHIFT(2), | ||
[5] = {.entry = {.count = 1, .reusable = true}}, REDUCE(sym_source, 1), | ||
[7] = {.entry = {.count = 1, .reusable = true}}, ACCEPT_INPUT(), | ||
}; | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
#ifdef _WIN32 | ||
#define extern __declspec(dllexport) | ||
#endif | ||
|
||
extern const TSLanguage *tree_sitter_elixir(void) { | ||
static const TSLanguage language = { | ||
.version = LANGUAGE_VERSION, | ||
.symbol_count = SYMBOL_COUNT, | ||
.alias_count = ALIAS_COUNT, | ||
.token_count = TOKEN_COUNT, | ||
.external_token_count = EXTERNAL_TOKEN_COUNT, | ||
.state_count = STATE_COUNT, | ||
.large_state_count = LARGE_STATE_COUNT, | ||
.production_id_count = PRODUCTION_ID_COUNT, | ||
.field_count = FIELD_COUNT, | ||
.max_alias_sequence_length = MAX_ALIAS_SEQUENCE_LENGTH, | ||
.parse_table = &ts_parse_table[0][0], | ||
.small_parse_table = ts_small_parse_table, | ||
.small_parse_table_map = ts_small_parse_table_map, | ||
.parse_actions = ts_parse_actions, | ||
.symbol_names = ts_symbol_names, | ||
.symbol_metadata = ts_symbol_metadata, | ||
.public_symbol_map = ts_symbol_map, | ||
.alias_map = ts_non_terminal_alias_map, | ||
.alias_sequences = &ts_alias_sequences[0][0], | ||
.lex_modes = ts_lex_modes, | ||
.lex_fn = ts_lex, | ||
}; | ||
return &language; | ||
} | ||
#ifdef __cplusplus | ||
} | ||
#endif |
Oops, something went wrong.