From 55b15a261a796ba42165605723e26830e981f7f0 Mon Sep 17 00:00:00 2001 From: idrissrio Date: Tue, 7 Oct 2025 16:50:07 +0200 Subject: [PATCH 1/2] Java: Add integration test for buildless lambda recovery --- .../DB-CHECK.expected | 3 ++ .../ExtractionErrors.expected | 3 ++ .../ExtractionErrors.qlref | 1 + .../Test.java | 35 +++++++++++++++++++ .../test.py | 5 +++ .../unused_variable.expected | 7 ++++ .../unused_variable.ql | 5 +++ 7 files changed, 59 insertions(+) create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.expected create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.qlref create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/Test.java create mode 100755 java/ql/integration-tests/java/lambda-expression-buildless-recovery/test.py create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected create mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.ql diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected new file mode 100644 index 000000000000..fdef550779a6 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected @@ -0,0 +1,3 @@ +[VALUE_NOT_IN_TYPE] predicate diagnostics(@diagnostic id, string generated_by, int severity, string error_tag, string error_message, string full_error_message, @location_default location): Value -16777184 of field location is not in type @location_default. The value is however in the following types: @diagnostic. Appears in tuple (-16777200,"CodeQL Java extractor",5,"","Failed to traverse method body at /private/var/folders/y2/gcxfwn2j4slfs8cnlt6bzsn40000gn/T/pytest-of-idrissrio/pytest-19/ql/java/ql/integration-tests/java/lambda-expression-buildless-recovery/test/test/Test.java:10:17:10:42","",-16777184) +[VALUE_NOT_IN_TYPE] predicate diagnostic_for(@diagnostic diagnostic, @compilation compilation, int file_number, int file_number_diagnostic_number): Value -16777188 of field diagnostic is not in type @diagnostic. Appears in tuple (-16777188,-16777216,0,14) +[VALUE_NOT_IN_TYPE] predicate diagnostic_for(@diagnostic diagnostic, @compilation compilation, int file_number, int file_number_diagnostic_number): Value -16777176 of field diagnostic is not in type @diagnostic. Appears in tuple (-16777176,-16777216,0,21) diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.expected b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.expected new file mode 100644 index 000000000000..c9e472ebeb60 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.expected @@ -0,0 +1,3 @@ +| Frontend errors in file: (2 errors during annotation processing) | 2 | +| Frontend errors in file: Test.java (7 javac errors) | 2 | +| Unknown errors in file: Test.java (5) | 2 | diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.qlref b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.qlref new file mode 100644 index 000000000000..488db09ab058 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/ExtractionErrors.qlref @@ -0,0 +1 @@ +Diagnostics/ExtractionErrors.ql diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/Test.java b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/Test.java new file mode 100644 index 000000000000..e1df4c2a42f8 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/Test.java @@ -0,0 +1,35 @@ +// The import below is intentionally commented out to test buildless recovery. +// import java.util.stream.Stream; + +public class LambdaBuildlessRecoveryTest { + + private Stream getStringStream() { + return getStringStream(); + } + + public void testSimpleLambdaExpression() { + int unused = 0; + Stream s = getStringStream(); + Stream mapped = s.map(x -> x); + mapped.forEach(System.out::println); + } + + public void testLambdaWithBlockBody() { + int unused = 42; + Stream s = getStringStream(); + Stream filtered = s.filter(item -> { + int unused = 42; + String proc = item.toUpperCase(); + return proc.length() > 0; + }); + filtered.forEach(System.out::println); + } + + public void testVariableCapture() { + int unused = 99; + String prefix = "proc_"; + Stream s = getStringStream(); + Stream result = s.map(item -> prefix + item); + result.forEach(System.out::println); + } +} diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/test.py b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/test.py new file mode 100755 index 000000000000..773127096a75 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/test.py @@ -0,0 +1,5 @@ +def test(codeql, java, use_java_17): + codeql.database.create( + build_mode="none", + source_root="." + ) \ No newline at end of file diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected new file mode 100644 index 000000000000..a017b85d85ec --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected @@ -0,0 +1,7 @@ +| Test.java:11:9:11:23 | int unused | +| Test.java:13:9:13:46 | Stream mapped | +| Test.java:18:9:18:24 | int unused | +| Test.java:20:9:24:11 | Stream filtered | +| Test.java:29:9:29:24 | int unused | +| Test.java:30:9:30:32 | String prefix | +| Test.java:32:9:32:61 | Stream result | diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.ql b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.ql new file mode 100644 index 000000000000..cba463c08273 --- /dev/null +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.ql @@ -0,0 +1,5 @@ +import java + +from LocalVariableDecl v +where not exists(v.getAnAccess()) and exists(v.getFile().getRelativePath()) +select v From f69e5f5ffc1c3e76f26baca12cee157085dc2aa2 Mon Sep 17 00:00:00 2001 From: idrissrio Date: Tue, 7 Oct 2025 16:51:09 +0200 Subject: [PATCH 2/2] Java: Accept new test results after extractor changes --- .../lambda-expression-buildless-recovery/DB-CHECK.expected | 3 --- .../unused_variable.expected | 7 ++----- 2 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected deleted file mode 100644 index fdef550779a6..000000000000 --- a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/DB-CHECK.expected +++ /dev/null @@ -1,3 +0,0 @@ -[VALUE_NOT_IN_TYPE] predicate diagnostics(@diagnostic id, string generated_by, int severity, string error_tag, string error_message, string full_error_message, @location_default location): Value -16777184 of field location is not in type @location_default. The value is however in the following types: @diagnostic. Appears in tuple (-16777200,"CodeQL Java extractor",5,"","Failed to traverse method body at /private/var/folders/y2/gcxfwn2j4slfs8cnlt6bzsn40000gn/T/pytest-of-idrissrio/pytest-19/ql/java/ql/integration-tests/java/lambda-expression-buildless-recovery/test/test/Test.java:10:17:10:42","",-16777184) -[VALUE_NOT_IN_TYPE] predicate diagnostic_for(@diagnostic diagnostic, @compilation compilation, int file_number, int file_number_diagnostic_number): Value -16777188 of field diagnostic is not in type @diagnostic. Appears in tuple (-16777188,-16777216,0,14) -[VALUE_NOT_IN_TYPE] predicate diagnostic_for(@diagnostic diagnostic, @compilation compilation, int file_number, int file_number_diagnostic_number): Value -16777176 of field diagnostic is not in type @diagnostic. Appears in tuple (-16777176,-16777216,0,21) diff --git a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected index a017b85d85ec..282d65e7e63f 100644 --- a/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected +++ b/java/ql/integration-tests/java/lambda-expression-buildless-recovery/unused_variable.expected @@ -1,7 +1,4 @@ | Test.java:11:9:11:23 | int unused | -| Test.java:13:9:13:46 | Stream mapped | | Test.java:18:9:18:24 | int unused | -| Test.java:20:9:24:11 | Stream filtered | -| Test.java:29:9:29:24 | int unused | -| Test.java:30:9:30:32 | String prefix | -| Test.java:32:9:32:61 | Stream result | +| Test.java:21:13:21:28 | int unused | +| Test.java:29:9:29:24 | int unused | \ No newline at end of file