private String instrument(final int lineNumber, final ScriptData data) {
final Parser parser = new Parser();
final String sourceUriAsString = data.getSourceUriAsString();
final AstRoot root = parser.parse(data.getSourceCode(), sourceUriAsString, lineNumber);
root.visit(new InstrumentingNodeVisitor(data, lineNumber - 1));
final String treeSource = root.toSource();
final StringBuilder buf = new StringBuilder(
INITIALIZING_CODE.length() +
data.getNumberOfStatements() * ARRAY_INITIALIZER.length() +
treeSource.length());
buf.append(COMPLETION_MONITOR);
buf.append(INITIALIZING_CODE);
buf.append(String.format("if(!%s['%s']) {%n", COVERAGE_VARIABLE_NAME, sourceUriAsString));
buf.append(String.format(" %s['%s'] = {};%n", COVERAGE_VARIABLE_NAME, sourceUriAsString));
for (final Integer i : data.getLineNumbersOfAllStatements()) {
buf.append(String.format(ARRAY_INITIALIZER, sourceUriAsString, i));
}
buf.append(String.format("}%n"));
buf.append(treeSource);
return buf.toString();
}