public void performPremain()

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);
  }