@@ -155,77 +155,15 @@ private void handlePredicates(String source, MemorySegment query, @Unsigned int
155155 var t = TSQueryPredicateStep .asSlice (tokens , nargs );
156156 if (TSQueryPredicateStep .type (t ) == TSQueryPredicateStepTypeDone ()) break ;
157157 }
158+
158159 var t0 = TSQueryPredicateStep .asSlice (tokens , 0 );
159160 if (TSQueryPredicateStep .type (t0 ) == TSQueryPredicateStepTypeCapture ()) {
160161 var name = captureNames .get (TSQueryPredicateStep .value_id (t0 ));
161162 throw new QueryError .Predicate (row , "@%s" .formatted (name ));
162163 }
163164 var predicate = stringValues .get (TSQueryPredicateStep .value_id (t0 ));
164- if (QueryPredicate .Eq .NAMES .contains (predicate )) {
165- if (nargs != 3 ) {
166- var error = "#%s expects 2 arguments, got %d" ;
167- throw new QueryError .Predicate (row , error , predicate , nargs - 1 );
168- }
169- var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
170- if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
171- var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
172- var error = "first argument to #%s must be a capture name, got \" %s\" " ;
173- throw new QueryError .Predicate (row , error , predicate , value );
174- }
175- var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
176- var t2 = TSQueryPredicateStep .asSlice (tokens , 2 );
177- var id = TSQueryPredicateStep .value_id (t2 );
178- var isCapture = TSQueryPredicateStep .type (t2 ) == TSQueryPredicateStepTypeCapture ();
179- var value = isCapture ? captureNames .get (id ) : stringValues .get (id );
180- predicates .get (i ).add (new QueryPredicate .Eq (predicate , capture , value , isCapture ));
181- } else if (QueryPredicate .Match .NAMES .contains (predicate )) {
182- if (nargs != 3 ) {
183- var error = "#%s expects 2 arguments, got %d" ;
184- throw new QueryError .Predicate (row , error , predicate , nargs - 1 );
185- }
186- var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
187- if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
188- var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
189- var error = "first argument to #%s must be a capture name, got \" %s\" " ;
190- throw new QueryError .Predicate (row , error , predicate , value );
191- }
192- var t2 = TSQueryPredicateStep .asSlice (tokens , 2 );
193- if (TSQueryPredicateStep .type (t2 ) != TSQueryPredicateStepTypeString ()) {
194- var value = captureNames .get (TSQueryPredicateStep .value_id (t2 ));
195- var error = "second argument to #%s must be a string literal, got @%s" ;
196- throw new QueryError .Predicate (row , error , predicate , value );
197- }
198- try {
199- var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
200- var pattern = Pattern .compile (stringValues .get (TSQueryPredicateStep .value_id (t2 )));
201- predicates .get (i ).add (new QueryPredicate .Match (predicate , capture , pattern ));
202- } catch (PatternSyntaxException e ) {
203- throw new QueryError .Predicate (row , "pattern error" , e );
204- }
205- } else if (QueryPredicate .AnyOf .NAMES .contains (predicate )) {
206- if (nargs < 3 ) {
207- var error = "#%s expects at least 2 arguments, got %d" ;
208- throw new QueryError .Predicate (row , error , predicate , nargs - 1 );
209- }
210- var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
211- if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
212- var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
213- var error = "first argument to #%s must be a capture name, got \" %s\" " ;
214- throw new QueryError .Predicate (row , error , predicate , value );
215- }
216- List <String > values = new ArrayList <>((int ) nargs - 2 );
217- for (long k = 2 ; k < nargs ; ++k ) {
218- var t = TSQueryPredicateStep .asSlice (tokens , k );
219- if (TSQueryPredicateStep .type (t ) != TSQueryPredicateStepTypeString ()) {
220- var value = captureNames .get (TSQueryPredicateStep .value_id (t ));
221- var error = "arguments to #%s must be string literals, got @%s" ;
222- throw new QueryError .Predicate (row , error , predicate , value );
223- }
224- values .add (stringValues .get (TSQueryPredicateStep .value_id (t )));
225- }
226- var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
227- predicates .get (i ).add (new QueryPredicate .AnyOf (predicate , capture , values ));
228- } else if (predicate .equals ("is?" ) || predicate .equals ("is-not?" ) || predicate .equals ("set!" )) {
165+
166+ if (predicate .equals ("is?" ) || predicate .equals ("is-not?" ) || predicate .equals ("set!" )) {
229167 if (nargs == 1 || nargs > 3 ) {
230168 var error = "#%s expects 1-2 arguments, got %d" ;
231169 throw new QueryError .Predicate (row , error , predicate , nargs - 1 );
@@ -254,26 +192,97 @@ private void handlePredicates(String source, MemorySegment query, @Unsigned int
254192 settings .get (i ).put (key , Optional .ofNullable (value ));
255193 }
256194 } else {
257- List <QueryPredicateArg > values = new ArrayList <>((int ) nargs - 1 );
258- for (long k = 1 ; k < nargs ; ++k ) {
259- var t = TSQueryPredicateStep .asSlice (tokens , k );
260- if (TSQueryPredicateStep .type (t ) == TSQueryPredicateStepTypeString ()) {
261- var value = stringValues .get (TSQueryPredicateStep .value_id (t ));
262- values .add (new QueryPredicateArg .Literal (value ));
263- } else {
264- var capture = captureNames .get (TSQueryPredicateStep .value_id (t ));
265- values .add (new QueryPredicateArg .Capture (capture ));
266- }
267- }
268- predicates .get (i ).add (new QueryPredicate (predicate , values ));
195+ predicates .get (i ).add (handlePredicate (predicate , tokens , row , nargs ));
269196 }
197+
270198 j += nargs ;
271199 tokens = TSQueryPredicateStep .asSlice (tokens , nargs + 1 );
272200 }
273201 }
274202 }
275203 }
276204
205+ private QueryPredicate handlePredicate (String name , MemorySegment tokens , long row , long nargs ) {
206+ if (QueryPredicate .Eq .NAMES .contains (name )) {
207+ if (nargs != 3 ) {
208+ var error = "#%s expects 2 arguments, got %d" ;
209+ throw new QueryError .Predicate (row , error , name , nargs - 1 );
210+ }
211+ var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
212+ if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
213+ var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
214+ var error = "first argument to #%s must be a capture name, got \" %s\" " ;
215+ throw new QueryError .Predicate (row , error , name , value );
216+ }
217+ var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
218+ var t2 = TSQueryPredicateStep .asSlice (tokens , 2 );
219+ var id = TSQueryPredicateStep .value_id (t2 );
220+ var isCapture = TSQueryPredicateStep .type (t2 ) == TSQueryPredicateStepTypeCapture ();
221+ var value = isCapture ? captureNames .get (id ) : stringValues .get (id );
222+ return new QueryPredicate .Eq (name , capture , value , isCapture );
223+ } else if (QueryPredicate .Match .NAMES .contains (name )) {
224+ if (nargs != 3 ) {
225+ var error = "#%s expects 2 arguments, got %d" ;
226+ throw new QueryError .Predicate (row , error , name , nargs - 1 );
227+ }
228+ var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
229+ if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
230+ var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
231+ var error = "first argument to #%s must be a capture name, got \" %s\" " ;
232+ throw new QueryError .Predicate (row , error , name , value );
233+ }
234+ var t2 = TSQueryPredicateStep .asSlice (tokens , 2 );
235+ if (TSQueryPredicateStep .type (t2 ) != TSQueryPredicateStepTypeString ()) {
236+ var value = captureNames .get (TSQueryPredicateStep .value_id (t2 ));
237+ var error = "second argument to #%s must be a string literal, got @%s" ;
238+ throw new QueryError .Predicate (row , error , name , value );
239+ }
240+ try {
241+ var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
242+ var pattern = Pattern .compile (stringValues .get (TSQueryPredicateStep .value_id (t2 )));
243+ return new QueryPredicate .Match (name , capture , pattern );
244+ } catch (PatternSyntaxException e ) {
245+ throw new QueryError .Predicate (row , "pattern error" , e );
246+ }
247+ } else if (QueryPredicate .AnyOf .NAMES .contains (name )) {
248+ if (nargs < 3 ) {
249+ var error = "#%s expects at least 2 arguments, got %d" ;
250+ throw new QueryError .Predicate (row , error , name , nargs - 1 );
251+ }
252+ var t1 = TSQueryPredicateStep .asSlice (tokens , 1 );
253+ if (TSQueryPredicateStep .type (t1 ) != TSQueryPredicateStepTypeCapture ()) {
254+ var value = stringValues .get (TSQueryPredicateStep .value_id (t1 ));
255+ var error = "first argument to #%s must be a capture name, got \" %s\" " ;
256+ throw new QueryError .Predicate (row , error , name , value );
257+ }
258+ List <String > values = new ArrayList <>((int ) nargs - 2 );
259+ for (long k = 2 ; k < nargs ; ++k ) {
260+ var t = TSQueryPredicateStep .asSlice (tokens , k );
261+ if (TSQueryPredicateStep .type (t ) != TSQueryPredicateStepTypeString ()) {
262+ var value = captureNames .get (TSQueryPredicateStep .value_id (t ));
263+ var error = "arguments to #%s must be string literals, got @%s" ;
264+ throw new QueryError .Predicate (row , error , name , value );
265+ }
266+ values .add (stringValues .get (TSQueryPredicateStep .value_id (t )));
267+ }
268+ var capture = captureNames .get (TSQueryPredicateStep .value_id (t1 ));
269+ return new QueryPredicate .AnyOf (name , capture , values );
270+ } else {
271+ List <QueryPredicateArg > values = new ArrayList <>((int ) nargs - 1 );
272+ for (long k = 1 ; k < nargs ; ++k ) {
273+ var t = TSQueryPredicateStep .asSlice (tokens , k );
274+ if (TSQueryPredicateStep .type (t ) == TSQueryPredicateStepTypeString ()) {
275+ var value = stringValues .get (TSQueryPredicateStep .value_id (t ));
276+ values .add (new QueryPredicateArg .Literal (value ));
277+ } else {
278+ var capture = captureNames .get (TSQueryPredicateStep .value_id (t ));
279+ values .add (new QueryPredicateArg .Capture (capture ));
280+ }
281+ }
282+ return new QueryPredicate (name , values );
283+ }
284+ }
285+
277286 MemorySegment segment () {
278287 return self ;
279288 }
0 commit comments