in instrumentation/src/com/intellij/rt/coverage/instrumentation/Instrumentator.java [47:104]
public void performPremain(String argsString, Instrumentation instrumentation) throws Exception {
synchronized (Instrumentator.class) {
if (ourIsInitialized) {
ErrorReporter.info("Coverage agent has been applied twice, ignore the second one.");
return;
}
ourIsInitialized = true;
}
CoverageArgs args;
try {
args = CoverageArgs.fromString(argsString);
} catch (IllegalArgumentException e) {
ErrorReporter.error("Failed to parse agent arguments", e);
System.exit(1);
return;
}
ErrorReporter.printInfo("---- IntelliJ IDEA coverage runner ---- ");
ErrorReporter.printInfo((args.branchCoverage ? "Branch coverage " : "Line coverage ") + (args.testTracking ? "with tracking per test coverage ..." : "..."));
logPatterns(args.includePatterns, "include");
logPatterns(args.excludePatterns, "exclude");
logPatterns(args.annotationsToInclude, "include annotations");
logPatterns(args.annotationsToIgnore, "exclude annotations");
final TestTrackingMode testTrackingMode = createTestTrackingMode(args.testTracking);
final TestTrackingCallback callback = testTrackingMode == null ? null : testTrackingMode.createTestTrackingCallback(args.dataFile);
final InstrumentationOptions options = new InstrumentationOptions.Builder()
.setBranchCoverage(args.branchCoverage)
.setIsMergeData(args.mergeData)
.setIsCalculateUnloaded(args.calcUnloaded)
.setInstructionCoverage(OptionsUtil.INSTRUCTIONS_COVERAGE_ENABLED)
.setIsCalculateHits(OptionsUtil.CALCULATE_HITS_COUNT)
.setIncludePatterns(args.includePatterns)
.setExcludePatterns(args.excludePatterns)
.setIncludeAnnotations(args.annotationsToInclude)
.setExcludeAnnotations(args.annotationsToIgnore)
.setDataFile(args.dataFile)
.setSourceMapFile(args.sourceMap)
.setTestTrackingMode(testTrackingMode)
.build();
createDataFile(args.dataFile);
final ProjectData data = new ProjectData(callback);
CoverageRuntime.installRuntime(data);
final ProjectContext instrumentationData = new ProjectContext(options);
final CoverageTransformer transformer = new CoverageTransformer(data, instrumentationData);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
transformer.stop();
CoverageReport.save(data, instrumentationData);
}
}));
addTransformer(instrumentation, transformer);
}