test_class.declarator: FILE1 = "" +
  		"test1\n" +
  		"#include file2\n" +
  		"test3\n"
test_class.modifier: private static final
test_class.original_string: private static final String FILE1 = "" +
  		"test1\n" +
  		"#include file2\n" +
  		"test3\n";
test_class.type: String
test_class.var_name: FILE1
test_class.declarator: FILE2 = "" +
  		"test4\n" +
  		"test5\n"
test_class.modifier: private static final
test_class.original_string: private static final String FILE2 = "" +
  		"test4\n" +
  		"test5\n";
test_class.type: String
test_class.var_name: FILE2
test_class.declarator: RESULT = "" +
  		"test1\n" +
  		"test4\n" +
  		"test5\n" +
  		"test3\n"
test_class.modifier: private static final
test_class.original_string: private static final String RESULT = "" +
  		"test1\n" +
  		"test4\n" +
  		"test5\n" +
  		"test3\n";
test_class.type: String
test_class.var_name: RESULT
test_class.file: runelite-client/src/test/java/net/runelite/client/plugins/gpu/template/TemplateTest.java
test_class.identifier: TemplateTest
test_case.body: @Test
  	public void testProcess()
  	{
  		Function<String, String> func = (String resource) ->
  		{
  			switch (resource)
  			{
  				case "file2":
  					return FILE2;
  				default:
  					throw new RuntimeException("unknown resource");
  			}
  		};
  		String out = new Template()
  			.add(func)
  			.process(FILE1);
  		assertEquals(RESULT, out);
  	}
test_case.class_method_signature: TemplateTest.testProcess()
test_case.full_signature: @Test public void testProcess()
test_case.identifier: testProcess
test_case.invocations: process add assertEquals
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testProcess()
focal_class.declarator: resourceLoaders = new ArrayList<>()
focal_class.modifier: private final
focal_class.original_string: private final List<Function<String, String>> resourceLoaders = new ArrayList<>();
focal_class.type: List<Function<String, String>>
focal_class.var_name: resourceLoaders
focal_class.file: runelite-client/src/main/java/net/runelite/client/plugins/gpu/template/Template.java
focal_class.identifier: Template
focal_class.class_method_signature: Template.Template()
focal_class.full_signature: public  Template()
focal_class.identifier: Template
focal_class.modifiers: public
focal_class.parameters: ()
focal_class.signature:  Template()
focal_class.class_method_signature: Template.process(String str)
focal_class.full_signature: public String process(String str)
focal_class.identifier: process
focal_class.modifiers: public
focal_class.parameters: (String str)
focal_class.return: String
focal_class.signature: String process(String str)
focal_class.class_method_signature: Template.load(String filename)
focal_class.full_signature: public String load(String filename)
focal_class.identifier: load
focal_class.modifiers: public
focal_class.parameters: (String filename)
focal_class.return: String
focal_class.signature: String load(String filename)
focal_class.class_method_signature: Template.add(Function<String, String> fn)
focal_class.full_signature: public Template add(Function<String, String> fn)
focal_class.identifier: add
focal_class.modifiers: public
focal_class.parameters: (Function<String, String> fn)
focal_class.return: Template
focal_class.signature: Template add(Function<String, String> fn)
focal_class.class_method_signature: Template.addInclude(Class<?> clazz)
focal_class.full_signature: public Template addInclude(Class<?> clazz)
focal_class.identifier: addInclude
focal_class.modifiers: public
focal_class.parameters: (Class<?> clazz)
focal_class.return: Template
focal_class.signature: Template addInclude(Class<?> clazz)
focal_class.class_method_signature: Template.inputStreamToString(InputStream in)
focal_class.full_signature: private static String inputStreamToString(InputStream in)
focal_class.identifier: inputStreamToString
focal_class.modifiers: private static
focal_class.parameters: (InputStream in)
focal_class.return: String
focal_class.signature: String inputStreamToString(InputStream in)
focal_method.body: public String process(String str)
  	{
  		StringBuilder sb = new StringBuilder();
  		for (String line : str.split("\r?\n"))
  		{
  			if (line.startsWith("#include "))
  			{
  				String resource = line.substring(9);
  				String resourceStr = load(resource);
  				sb.append(resourceStr);
  			}
  			else
  			{
  				sb.append(line).append('\n');
  			}
  		}
  		return sb.toString();
  	}
focal_method.class_method_signature: Template.process(String str)
focal_method.full_signature: public String process(String str)
focal_method.identifier: process
focal_method.invocations: split startsWith substring load append append append toString
focal_method.modifiers: public
focal_method.parameters: (String str)
focal_method.return: String
focal_method.signature: String process(String str)