@@ -33,9 +33,19 @@ static jfieldID _inputEditStartPointField;
3333static jfieldID _inputEditOldEndPointField;
3434static jfieldID _inputEditNewEndPointField;
3535
36+ // TSQueryMatch
37+ static jclass _matchClass;
38+ static jfieldID _matchClassIdField;
39+ static jfieldID _matchClassPatternIndexField;
40+ static jfieldID _matchClassCapturesField;
41+
42+ // TSQueryCapture
43+ static jclass _captureClass;
44+ static jfieldID _captureClassIndexField;
45+ static jfieldID _captureClassNodeField;
3646
3747void onLoad (JNIEnv* env) {
38- // Node
48+ // Node
3949 _loadClass (_nodeClass, " com/itsaky/androidide/treesitter/TSNode" );
4050 _loadField (_nodeContext0Field, _nodeClass, " context0" , " I" );
4151 _loadField (_nodeContext1Field, _nodeClass, " context1" , " I" );
@@ -45,7 +55,8 @@ void onLoad(JNIEnv* env) {
4555 _loadField (_nodeTreeField, _nodeClass, " tree" , " J" );
4656
4757 // TreeCursorNode
48- _loadClass (_treeCursorNodeClass, " com/itsaky/androidide/treesitter/TSTreeCursorNode" );
58+ _loadClass (_treeCursorNodeClass,
59+ " com/itsaky/androidide/treesitter/TSTreeCursorNode" );
4960 _loadField (_treeCursorNodeTypeField, _treeCursorNodeClass, " type" ,
5061 " Ljava/lang/String;" );
5162 _loadField (_treeCursorNodeNameField, _treeCursorNodeClass, " name" ,
@@ -64,14 +75,34 @@ void onLoad(JNIEnv* env) {
6475 _loadField (_inputEditStartByteField, _inputEditClass, " startByte" , " I" );
6576 _loadField (_inputEditOldEndByteField, _inputEditClass, " oldEndByte" , " I" );
6677 _loadField (_inputEditNewEndByteField, _inputEditClass, " newEndByte" , " I" );
67- _loadField (_inputEditStartPointField, _inputEditClass, " start_point" , " Lcom/itsaky/androidide/treesitter/TSPoint;" );
68- _loadField (_inputEditOldEndPointField, _inputEditClass, " old_end_point" , " Lcom/itsaky/androidide/treesitter/TSPoint;" );
69- _loadField (_inputEditNewEndPointField, _inputEditClass, " new_end_point" , " Lcom/itsaky/androidide/treesitter/TSPoint;" );
78+ _loadField (_inputEditStartPointField, _inputEditClass, " start_point" ,
79+ " Lcom/itsaky/androidide/treesitter/TSPoint;" );
80+ _loadField (_inputEditOldEndPointField, _inputEditClass, " old_end_point" ,
81+ " Lcom/itsaky/androidide/treesitter/TSPoint;" );
82+ _loadField (_inputEditNewEndPointField, _inputEditClass, " new_end_point" ,
83+ " Lcom/itsaky/androidide/treesitter/TSPoint;" );
84+
85+ // TSQueryMatch
86+ _loadClass (_matchClass, " com/itsaky/androidide/treesitter/TSQueryMatch" );
87+ _loadField (_matchClassIdField, _matchClass, " id" , " I" );
88+ _loadField (_matchClassPatternIndexField, _matchClass, " patternIndex" , " I" );
89+ _loadField (_matchClassCapturesField, _matchClass, " captures" ,
90+ " [Lcom/itsaky/androidide/treesitter/TSQueryCapture;" );
91+
92+ // TSQueryCapture
93+ _loadClass (_captureClass, " com/itsaky/androidide/treesitter/TSQueryCapture" );
94+ _loadField (_captureClassIndexField, _captureClass, " index" , " I" );
95+ _loadField (_captureClassNodeField, _captureClass, " node" ,
96+ " Lcom/itsaky/androidide/treesitter/TSNode;" );
7097}
7198
7299void onUnload (JNIEnv* env) {
73100 env->DeleteGlobalRef (_nodeClass);
74101 env->DeleteGlobalRef (_treeCursorNodeClass);
102+ env->DeleteGlobalRef (_pointClass);
103+ env->DeleteGlobalRef (_inputEditClass);
104+ env->DeleteGlobalRef (_matchClass);
105+ env->DeleteGlobalRef (_captureClass);
75106}
76107
77108// Node
@@ -87,16 +118,15 @@ jobject _marshalNode(JNIEnv* env, TSNode node) {
87118}
88119
89120TSNode _unmarshalNode (JNIEnv* env, jobject javaObject) {
90- return (TSNode) {
91- {
92- (uint32_t )env->GetIntField (javaObject, _nodeContext0Field),
93- (uint32_t )env->GetIntField (javaObject, _nodeContext1Field),
94- (uint32_t )env->GetIntField (javaObject, _nodeContext2Field),
95- (uint32_t )env->GetIntField (javaObject, _nodeContext3Field),
96- },
97- (const void *)env->GetLongField (javaObject, _nodeIdField),
98- (const TSTree*)env->GetLongField (javaObject, _nodeTreeField)
99- };
121+ return (TSNode){
122+ {
123+ (uint32_t )env->GetIntField (javaObject, _nodeContext0Field),
124+ (uint32_t )env->GetIntField (javaObject, _nodeContext1Field),
125+ (uint32_t )env->GetIntField (javaObject, _nodeContext2Field),
126+ (uint32_t )env->GetIntField (javaObject, _nodeContext3Field),
127+ },
128+ (const void *)env->GetLongField (javaObject, _nodeIdField),
129+ (const TSTree*)env->GetLongField (javaObject, _nodeTreeField)};
100130}
101131
102132// TreeCursorNode
@@ -122,22 +152,45 @@ jobject _marshalPoint(JNIEnv* env, TSPoint point) {
122152}
123153
124154TSPoint _unmarshalPoint (JNIEnv* env, jobject javaObject) {
125- return (TSPoint) {
126- (uint32_t )env->GetIntField (javaObject, _pointRowField),
127- (uint32_t )env->GetIntField (javaObject, _pointColumnField),
155+ return (TSPoint){
156+ (uint32_t )env->GetIntField (javaObject, _pointRowField),
157+ (uint32_t )env->GetIntField (javaObject, _pointColumnField),
128158 };
129159}
130160
131161// TSInputEdit
132162TSInputEdit _unmarshalInputEdit (JNIEnv* env, jobject inputEdit) {
133- return (TSInputEdit) {
134- (uint32_t )env->GetIntField (inputEdit, _inputEditStartByteField),
135- (uint32_t )env->GetIntField (inputEdit, _inputEditOldEndByteField),
136- (uint32_t )env->GetIntField (inputEdit, _inputEditNewEndByteField),
137- _unmarshalPoint (env, env->GetObjectField (inputEdit, _inputEditStartPointField)),
138- _unmarshalPoint (env, env->GetObjectField (inputEdit, _inputEditOldEndPointField)),
139- _unmarshalPoint (env, env->GetObjectField (inputEdit, _inputEditNewEndPointField)),
163+ return (TSInputEdit){
164+ (uint32_t )env->GetIntField (inputEdit, _inputEditStartByteField),
165+ (uint32_t )env->GetIntField (inputEdit, _inputEditOldEndByteField),
166+ (uint32_t )env->GetIntField (inputEdit, _inputEditNewEndByteField),
167+ _unmarshalPoint (
168+ env, env->GetObjectField (inputEdit, _inputEditStartPointField)),
169+ _unmarshalPoint (
170+ env, env->GetObjectField (inputEdit, _inputEditOldEndPointField)),
171+ _unmarshalPoint (
172+ env, env->GetObjectField (inputEdit, _inputEditNewEndPointField)),
140173 };
141174}
142175
176+ jobject _marshalMatch (JNIEnv* env, TSQueryMatch match) {
177+ jobject obj = env->AllocObject (_matchClass);
178+ env->SetIntField (obj, _matchClassIdField, match.id );
179+ env->SetIntField (obj, _matchClassPatternIndexField, match.pattern_index );
180+ jobjectArray captures = env->NewObjectArray (match.capture_count , _captureClass, NULL );
181+ for (int i = 0 ; i < match.capture_count ; i++) {
182+ const TSQueryCapture* c = match.captures + i;
183+ env->SetObjectArrayElement (captures, i, _marshalCapture (env, *c));
184+ }
185+ env->SetObjectField (obj, _matchClassCapturesField, captures);
186+ return obj;
187+ }
188+
189+ jobject _marshalCapture (JNIEnv* env, TSQueryCapture capture) {
190+ jobject obj = env->AllocObject (_captureClass);
191+ env->SetIntField (obj, _captureClassIndexField, capture.index );
192+ env->SetObjectField (obj, _captureClassNodeField, _marshalNode (env, capture.node ));
193+ return obj;
194+ }
195+
143196#endif
0 commit comments