diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTests.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTests.java index 996316ebc3..8db4fa08e0 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTests.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTests.java @@ -14,13 +14,11 @@ import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; -import org.stringtemplate.v4.ST; -import org.stringtemplate.v4.STGroup; -import org.stringtemplate.v4.STGroupString; -import org.stringtemplate.v4.StringRenderer; +import org.stringtemplate.v4.*; import java.io.File; import java.io.IOException; +import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -43,9 +41,9 @@ public abstract class RuntimeTests { protected abstract RuntimeRunner createRuntimeRunner(); - private final static StringRenderer rendered = new StringRenderer(); - private final static HashMap testDescriptors = new HashMap<>(); + private final static HashMap cachedTargetTemplates = new HashMap<>(); + private final static StringRenderer rendered = new StringRenderer(); static { File descriptorsDir = new File(Paths.get(RuntimeTestUtils.resourcePath.toString(), "org/antlr/v4/test/runtime/descriptors").toString()); @@ -119,10 +117,20 @@ private static void test(RuntimeTestDescriptor descriptor, RuntimeRunner runner) FileUtils.mkdir(runner.getTempDirPath()); - String sourceName = "org/antlr/v4/test/runtime/templates/" + targetName + ".test.stg"; - String template = RuntimeTestUtils.getTextFromResource(sourceName); - STGroup targetTemplates = new STGroupString(sourceName, template, '<', '>'); - targetTemplates.registerRenderer(String.class, rendered); + STGroup targetTemplates = cachedTargetTemplates.get(targetName); + if (targetTemplates == null) { + synchronized (cachedTargetTemplates) { + targetTemplates = cachedTargetTemplates.get(targetName); + if (targetTemplates == null) { + ClassLoader classLoader = RuntimeTests.class.getClassLoader(); + URL templates = classLoader.getResource("org/antlr/v4/test/runtime/templates/" + targetName + ".test.stg"); + assert templates != null; + targetTemplates = new STGroupFile(templates, "UTF-8", '<', '>'); + targetTemplates.registerRenderer(String.class, rendered); + cachedTargetTemplates.put(targetName, targetTemplates); + } + } + } // write out any slave grammars List> slaveGrammars = descriptor.slaveGrammars;