Skip to content

Commit e5ab2f3

Browse files
committed
refactor(query): move predicate handling to dedicated method
To make the code a bit easier to read, avoiding the two enclosing `for` loops and irrelevant local variables which were in scope.
1 parent 07a8052 commit e5ab2f3

File tree

1 file changed

+86
-77
lines changed
  • src/main/java/io/github/treesitter/jtreesitter

1 file changed

+86
-77
lines changed

src/main/java/io/github/treesitter/jtreesitter/Query.java

Lines changed: 86 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)