diff options
author | Alexander Kriegisch <Alexander@Kriegisch.name> | 2023-12-10 16:55:33 +0700 |
---|---|---|
committer | Alexander Kriegisch <Alexander@Kriegisch.name> | 2023-12-11 03:38:37 +0100 |
commit | 8c72d2da438d06885d48ffd3ade30b89a782b874 (patch) | |
tree | d80c381cff3c700115f5584cde1f9eaa38835bec /tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj | |
parent | 6be5a0a6a62e9afefad53a27f4c75d95ae7dac74 (diff) | |
download | aspectj-8c72d2da438d06885d48ffd3ade30b89a782b874.tar.gz aspectj-8c72d2da438d06885d48ffd3ade30b89a782b874.zip |
Add tests for Java 21 unnamed patterns
TODO: Activate after
https://github.com/eclipse-jdt/eclipse.jdt.core/issues/893 is done.
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
Diffstat (limited to 'tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj')
-rw-r--r-- | tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj b/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj new file mode 100644 index 000000000..d224a94fc --- /dev/null +++ b/tests/features1921/java21/UnnamedPatternsPreview1Aspect.aj @@ -0,0 +1,89 @@ +import java.awt.*; +import java.util.List; +import java.util.PriorityQueue; +import java.util.Queue; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Examples taken from <a href="https://openjdk.org/jeps/443">JEP 443</a> + */ +public class UnnamedPatternsPreview1Aspect { + public static void main(String[] args) {} + + before() : execution(* main(String[])) { + System.out.println(thisJoinPoint); + + // An enhanced for loop with side effects + int acc = 0; + final int LIMIT = 2; + for (Order _ : List.of(new Order(), new Order(), new Order())) { + if (acc < LIMIT) + acc++; + } + System.out.println(acc); + + // The initialisation of a basic for loop can declare unnamed local variables + for (int i = 0, _ = sideEffect(); i < 2; i++) { + System.out.println(i); + } + + // An assignment statement, where the result of the expression on the right hand side is not needed + Queue<Integer> q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var y = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, y)); + } + + // The same unnamed variable name '_' can be used in multiple assignment statements + q = new PriorityQueue<>(List.of(1, 2, 3, 4, 5, 6)); + while (q.size() >= 3) { + var x = q.remove(); + var _ = q.remove(); + var _ = q.remove(); + System.out.println(new Point(x, 0)); + } + + // Unnamed variables can be used in one or multiple catch blocks + String s = "123xy"; + try { + int i = Integer.parseInt(s); + System.out.println(i); + } catch (NumberFormatException _) { + System.out.println("Bad number: " + s); + } catch (Exception _) { + System.out.println("Unexpected error"); + } + + // Try with resources + try (var _ = ScopedContext.acquire()) { + System.out.println("Doing something within scoped context"); + } + + // A lambda whose parameter is irrelevant + System.out.println( + Stream.of("one", "two", "three") + .collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA")) + ); + } + + static int sideEffect() { + System.out.println("side effect"); + return 42; + } + + static class Order {} + + static class ScopedContext implements AutoCloseable { + public static ScopedContext acquire() { + return new ScopedContext(); + } + + @Override + public void close() { + System.out.println("Closing scoped context"); + } + } +} |