Type, record and primitive patterns, guards, sealed exhaustiveness, MatchException via separate compilation, and eight captured transcripts. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01TF9JWFvJSNm6HVzswzZU5a
67 lines
4.3 KiB
Bash
Executable File
67 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Pattern matching from JDK 21 to 27: type/record patterns, guards, exhaustiveness, unnamed patterns (final),
|
|
# and primitive patterns (JEP 532, preview in 27; also preview on 25 with --enable-preview).
|
|
# Regenerates every file in output/. JDK25=/path JDK27=/path [JDK21=/path] ./run.sh
|
|
set -uo pipefail
|
|
unset JAVA_TOOL_OPTIONS
|
|
HERE="$(cd "$(dirname "$0")" && pwd)"
|
|
JDK25="${JDK25:-/opt/jdks/jdk-25.0.4.1+1}"; JDK27="${JDK27:-/opt/jdks/jdk27}"; JDK21="${JDK21:-}"
|
|
OUT="$HERE/output"; mkdir -p "$OUT"; B="$(mktemp -d)"; trap 'rm -rf "$B"' EXIT
|
|
cd "$HERE"
|
|
t() { "$1/bin/java" -version 2>&1 | sed -n 2p | sed 's/.*(build \(.*\))/\1/'; }
|
|
rel() { case "$1" in "$JDK25") echo 25;; "$JDK27") echo 27;; *) echo 21;; esac; }
|
|
mk() { mktemp -d -p "$B"; }
|
|
# compile + run (no flags)
|
|
cr() { local jdk="$1" src="$2" cls="$3" o; o="$(mk)"
|
|
echo "\$ javac $src && java $cls ($(t "$jdk"))"
|
|
"$jdk/bin/javac" -d "$o" "$src" 2>&1 && "$jdk/bin/java" -cp "$o" "$cls" 2>&1; }
|
|
# compile only, show diagnostics
|
|
co() { local jdk="$1" src="$2" o; o="$(mk)"
|
|
echo "\$ javac $src ($(t "$jdk"))"
|
|
"$jdk/bin/javac" -d "$o" "$src" 2>&1 | grep -v '^Note:'; }
|
|
# preview compile + run
|
|
crp() { local jdk="$1" src="$2" cls="$3" o r; o="$(mk)"; r="$(rel "$jdk")"
|
|
echo "\$ javac --enable-preview --release $r $src && java --enable-preview $cls ($(t "$jdk"))"
|
|
"$jdk/bin/javac" --enable-preview --release "$r" -d "$o" "$src" 2>&1 | grep -v '^Note:'
|
|
"$jdk/bin/java" --enable-preview -cp "$o" "$cls" 2>&1; }
|
|
both() { local fn="$1"; shift; "$fn" "$JDK25" "$@"; echo; "$fn" "$JDK27" "$@"; }
|
|
all3() { local fn="$1"; shift; [ -n "$JDK21" ] && { "$fn" "$JDK21" "$@"; echo; }; "$fn" "$JDK25" "$@"; echo; "$fn" "$JDK27" "$@"; }
|
|
|
|
# 01 - type patterns
|
|
{ all3 cr src/TypePatterns.java TypePatterns; } > "$OUT/01-type-patterns.txt"
|
|
|
|
# 02 - guards and dominance
|
|
{ both cr src/Guards.java Guards; echo; both co broken/Dominated.java; echo; both co broken/GuardBeforeGeneral.java; } > "$OUT/02-guards-and-dominance.txt"
|
|
|
|
# 03 - record patterns, and what happens when an accessor throws
|
|
{ all3 cr src/RecordPatterns.java RecordPatterns; echo; both cr src/MatchExceptionDemo.java MatchExceptionDemo; } > "$OUT/03-record-patterns.txt"
|
|
|
|
# 04 - exhaustiveness: the compiler's check, and what separate compilation can still break
|
|
{ all3 cr src/SealedExhaustive.java SealedExhaustive; echo
|
|
all3 co broken/NotExhaustive.java; echo
|
|
all3 co broken/NotExhaustiveObject.java; } > "$OUT/04-exhaustiveness.txt"
|
|
{ for j in "$JDK25" "$JDK27"; do
|
|
o="$(mk)"; mkdir "$o/old" "$o/new"
|
|
"$j/bin/javac" -d "$o/old" sep/v1/*.java sep/client/Client.java 2>&1
|
|
"$j/bin/javac" -cp "$o/old" -d "$o/new" sep/v2/*.java 2>&1
|
|
echo "\$ java -cp old Client (Client and Shape compiled together, v1) ($(t "$j"))"; "$j/bin/java" -cp "$o/old" Client 2>&1; echo
|
|
echo "\$ java -cp new:old Main (Shape gained Triangle; Client.class NOT recompiled) ($(t "$j"))"; "$j/bin/java" -cp "$o/new:$o/old" Main 2>&1 | head -4; echo
|
|
echo "\$ javac -cp new sep/client/Client.java (now recompile Client against v2) ($(t "$j"))"
|
|
"$j/bin/javac" -cp "$o/new" -d "$(mk)" sep/client/Client.java 2>&1; echo
|
|
done; } > "$OUT/05-separate-compilation.txt"
|
|
|
|
# 06 - null and unnamed patterns
|
|
{ both cr src/NullCase.java NullCase; echo; all3 cr src/Unnamed.java Unnamed; } > "$OUT/06-null-and-unnamed.txt"
|
|
|
|
# 07 - primitive patterns (preview)
|
|
{ for f in PrimitiveInstanceof; do both co preview/$f.java; done; echo
|
|
for f in PrimitiveInstanceof PrimitiveSwitch PrimitiveInRecord PrimitiveEdges; do both crp preview/$f.java $f; echo; done
|
|
both crp preview/BoxedToNarrower.java BoxedToNarrower; } > "$OUT/07-primitive-patterns.txt"
|
|
{ o="$(mk)"; "$JDK25/bin/javac" --enable-preview --release 25 -d "$o" preview/PrimitiveSwitch.java 2>&1 | grep -v '^Note:'
|
|
echo "\$ javap -v PrimitiveSwitch | grep -E 'minor|major' (compiled by $(t "$JDK25") with --enable-preview)"
|
|
"$JDK25/bin/javap" -v -cp "$o" PrimitiveSwitch | grep -E 'minor|major'; echo
|
|
echo "\$ java --enable-preview PrimitiveSwitch (class compiled on 25, run on $(t "$JDK27"))"; "$JDK27/bin/java" --enable-preview -cp "$o" PrimitiveSwitch 2>&1 | head -2; echo
|
|
echo "\$ java PrimitiveSwitch (same class, no flag, run on $(t "$JDK25"))"; "$JDK25/bin/java" -cp "$o" PrimitiveSwitch 2>&1 | head -2
|
|
} > "$OUT/08-preview-class-files.txt"
|
|
echo "wrote $OUT"
|