code: @SuppressWarnings("unchecked")
      public AnalysisResult analyze(@Nonnull AnalysisContext analysisContext) {
          TIMING_LOG.debug("Analysis starts");
  
          AnalysisResult.Extensions extensions = prepareAnalysis(analysisContext);
  
          if (extensions.getAnalyzers().isEmpty()) {
              throw new IllegalArgumentException("At least one analyzer needs to be present. Make sure there is at" +
                      " least one on the classpath and that the extension filters do not exclude all of them.");
          }
  
          StreamSupport.stream(extensions.spliterator(), false)
                  .map(e -> (Map.Entry<ExtensionInstance<? extends Configurable>, AnalysisContext>) (Map.Entry) e)
                  .forEach(e -> e.getKey().getInstance().initialize(e.getValue()));
  
          AnalysisProgress progress = new AnalysisProgress(extensions, pipelineConfiguration);
  
          TIMING_LOG.debug("Initialization complete.");
  
          matchingTransformsCache.clear();
  
          Exception error = null;
          try {
              for (ExtensionInstance<ApiAnalyzer> ia : extensions.getAnalyzers().keySet()) {
                  analyzeWith(ia.getInstance(), analysisContext.getOldApi(), analysisContext.getNewApi(), progress);
              }
          } catch (Exception t) {
              error = t;
          }
  
          return new AnalysisResult(error, extensions);
      }
docs: Performs the analysis configured by the given analysis context.
  <p>
  Make sure to call the {@link AnalysisResult#close()} method (or perform the analysis in try-with-resources
  block).
  
  @param analysisContext describes the analysis to be performed
  @return a result object that has to be closed for the analysis to conclude