OR-1 dataflow CPU sketch
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