Files
javademos/patterns/run.sh
T
Claude 65a4bbbbe3 patterns: run Guards, NullCase and MatchException demos on 21 too; add switch-on-long check
Adds broken/SwitchOnLong.java and regenerates transcripts so every 'runs on 21, 25 and 27' claim has a transcript. Additive commit.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TF9JWFvJSNm6HVzswzZU5a
2026-09-24 11:54:48 +00:00

68 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
{ all3 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; all3 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
{ all3 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
all3 co broken/SwitchOnLong.java; 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"