OR-1 dataflow CPU sketch
at main 122 lines 4.5 kB view raw
1#include "./conversions.h" 2#include "./language.h" 3#include "./lookaheaditerator.h" 4#include "tree_sitter/api.h" 5 6#include <napi.h> 7 8using namespace Napi; 9 10namespace node_tree_sitter { 11 12void LookaheadIterator::Init(Napi::Env env, Napi::Object exports) { 13 auto *data = env.GetInstanceData<AddonData>(); 14 15 Function ctor = DefineClass(env, "LookaheadIterator", { 16 InstanceAccessor("currentTypeId", &LookaheadIterator::CurrentTypeId, nullptr, napi_default_method), 17 InstanceAccessor("currentType", &LookaheadIterator::CurrentType, nullptr, napi_default_method), 18 19 InstanceMethod("reset", &LookaheadIterator::Reset, napi_default_method), 20 InstanceMethod("resetState", &LookaheadIterator::ResetState, napi_default_method), 21 InstanceMethod("_next", &LookaheadIterator::Next, napi_default_method), 22 }); 23 24 exports["LookaheadIterator"] = ctor; 25 data->lookahead_iterator_constructor = Napi::Persistent(ctor); 26} 27 28LookaheadIterator::LookaheadIterator(const Napi::CallbackInfo &info) : Napi::ObjectWrap<LookaheadIterator>(info), iterator_(nullptr) { 29 Napi::Env env = info.Env(); 30 const TSLanguage *language = language_methods::UnwrapLanguage(info[0]); 31 32 if (language == nullptr) { 33 Napi::Error::New(env, "Missing language argument").ThrowAsJavaScriptException(); 34 return; 35 } 36 if (!info[1].IsNumber()) { 37 Napi::Error::New(env, "Missing state argument").ThrowAsJavaScriptException(); 38 return; 39 } 40 41 TSStateId state = info[1].As<Napi::Number>().Uint32Value(); 42 iterator_ = ts_lookahead_iterator_new(language, state); 43 if (iterator_ == nullptr) { 44 Napi::Error::New(env, "Invalid state argument").ThrowAsJavaScriptException(); 45 return; 46 } 47} 48 49 50LookaheadIterator::~LookaheadIterator() { 51 ts_lookahead_iterator_delete(iterator_); 52} 53 54Napi::Value LookaheadIterator::NewInstance(Napi::Env env, TSLookaheadIterator *iterator) { 55 auto *data = env.GetInstanceData<AddonData>(); 56 if (iterator != nullptr) { 57 Object self = data->lookahead_iterator_constructor.New({}); 58 LookaheadIterator::Unwrap(self)->iterator_ = iterator; 59 return self; 60 } 61 62 return env.Null(); 63} 64 65LookaheadIterator *LookaheadIterator::UnwrapLookaheadIterator(const Napi::Value &value) { 66 auto *data = value.Env().GetInstanceData<AddonData>(); 67 if (!value.IsObject()) { 68 return nullptr; 69 } 70 auto js_iterator = value.As<Object>(); 71 if (!js_iterator.InstanceOf(data->lookahead_iterator_constructor.Value())) { 72 return nullptr; 73 } 74 return LookaheadIterator::Unwrap(js_iterator); 75} 76 77Napi::Value LookaheadIterator::CurrentType(const Napi::CallbackInfo &info) { 78 LookaheadIterator *iterator = UnwrapLookaheadIterator(info.This()); 79 return Napi::String::New(info.Env(), ts_lookahead_iterator_current_symbol_name(iterator->iterator_)); 80} 81 82Napi::Value LookaheadIterator::CurrentTypeId(const Napi::CallbackInfo &info) { 83 LookaheadIterator *iterator = UnwrapLookaheadIterator(info.This()); 84 return Napi::Number::New(info.Env(), ts_lookahead_iterator_current_symbol(iterator->iterator_)); 85} 86 87Napi::Value LookaheadIterator::Reset(const Napi::CallbackInfo &info) { 88 LookaheadIterator *iterator = UnwrapLookaheadIterator(info.This()); 89 const TSLanguage *language = language_methods::UnwrapLanguage(info[0]); 90 91 if (language == nullptr) { 92 Napi::Error::New(info.Env(), "Invalid language argument").ThrowAsJavaScriptException(); 93 return info.Env().Undefined(); 94 } 95 if (!info[1].IsNumber()) { 96 Napi::Error::New(info.Env(), "Missing state argument").ThrowAsJavaScriptException(); 97 return info.Env().Undefined(); 98 } 99 100 TSStateId state = info[1].As<Napi::Number>().Uint32Value(); 101 return Napi::Boolean::New(info.Env(), ts_lookahead_iterator_reset(iterator->iterator_, language, state)); 102} 103 104Napi::Value LookaheadIterator::ResetState(const Napi::CallbackInfo &info) { 105 Napi::Env env = info.Env(); 106 LookaheadIterator *iterator = UnwrapLookaheadIterator(info.This()); 107 108 if (!info[0].IsNumber()) { 109 Napi::Error::New(env, "Missing state argument").ThrowAsJavaScriptException(); 110 return env.Undefined(); 111 } 112 113 TSStateId state = info[0].As<Napi::Number>().Uint32Value(); 114 return Napi::Boolean::New(env, ts_lookahead_iterator_reset_state(iterator->iterator_, state)); 115} 116 117Napi::Value LookaheadIterator::Next(const Napi::CallbackInfo &info) { 118 LookaheadIterator *iterator = UnwrapLookaheadIterator(info.This()); 119 return Napi::Boolean::New(info.Env(), ts_lookahead_iterator_next(iterator->iterator_)); 120} 121 122} // namespace node_tree_sitter