import java.io.*; class X { void processorMissing() { System.out.println(""" \{1} """); "\{}"; System.out.println(NOPE."\{false}"); System.out.println(RAW."\{false}"); } void correct(int i) { System.out.println(STR."the value is \{i}"); String s = STR.""; StringTemplate st = StringTemplate.RAW.""" """; } void wrongType(String foo) { String s = StringTemplate.RAW.""" this: \{foo} """; var x = (java.io.Serializable & StringTemplate.Processor)null; java.util.ArrayList v = x."asdf"; String t = x."reticulation"; } String unresolvedValues() { return STR."\{logic} \{proportion}"; } interface MyProcessor extends StringTemplate.Processor {} String raw(StringTemplate.Processor processor, MyProcessor myProcessor) { System.out.println(myProcessor.""); return processor."\{}\{}\{}\{}\{}\{}"; var z = (java.io.Serializable & StringTemplate.Processor)myProcessor; System.out.println(z.""); } void nested() { System.out.println(STR."\{STR."\{STR."\{STR."\{STR."\{STR."\{STR.""}"}"}"}"}"}"); } String badEscape() { System.out.println(STR."b\ad \{} esc\ape 1"); System.out.println(STR. """ b\ad \{} esc\ape 2 """); System.out.println(STR."\{}unclosed); return STR."\{} \uX"; } static class Covariant implements StringTemplate.Processor { @Override public Integer process(StringTemplate stringTemplate) { return 123; } } public static void testCovariant() { Covariant proc = new Covariant(); // In Java 22, covariant processors are supported Integer i = proc."hello"; } static class CovariantException implements StringTemplate.Processor { @Override public Integer process(StringTemplate stringTemplate) throws Ex { return 123; } } class Ex extends Exception {} class Ex2 extends Exception {} public static void testHandle(StringTemplate.Processor proc) { try { Object x = proc."hello"; } catch (Ex ex) {} } public static void testExceptionInFragments(StringTemplate.Processor proc, StringTemplate.Processor proc2) { try { proc."hell\{proc2."xyz"}o"; } catch (Ex ex) {} } public static void testCovariantException() { CovariantException proc = new CovariantException(); // As of Java 21, covariant processors are not supported Integer i = proc."hello"; try { Integer i2 = proc."hello"; } catch (Ex ex) {} } public static void testCapturedWilcard(StringTemplate.Processor str) { Object s = str.""; } void testCapturedWildcard2() { StringTemplate.Processor, RuntimeException> processor = null; Object o = processor.""" """.""" """; } public static void noNewlineAfterTextBlockOpeningQuotes() { System.out.println(STR."""\{}"""); } public static void voidExpression() { String a = STR."\{voidExpression()}"; System.out.println(a); } interface AnyProcessor extends StringTemplate.Processor {} interface FooProcessor extends AnyProcessor { @Override Object process(StringTemplate stringTemplate) throws Ex, IOException; } interface BarProcessor extends AnyProcessor { @Override Object process(StringTemplate stringTemplate) throws Ex2, EOFException, FileNotFoundException; } interface FooBarProcessor extends FooProcessor, BarProcessor {} static void test(FooBarProcessor fooBarProcessor) { System.out.println(fooBarProcessor.""); } static class IntegerProcessor implements StringTemplate.Processor { @Override public Integer process(StringTemplate template) { return 1; } } void myTest() { Integer x = new IntegerProcessor()."hello"; System.out.println(x); } }