docs: public void finishAnalysis() {
          assert analyzedMethodConfig != null;
          Taint outputTaint = analyzedMethodConfig.getOutputTaint();
          if (outputTaint == null) {
              // void methods
              return;
          }
          String returnType = getReturnType(methodDescriptor.getSignature());
          if (taintConfig.isClassTaintSafe(returnType) && outputTaint.getState() != Taint.State.NULL) {
              // we do not have to store summaries with safe output
              return;
          }
          String realInstanceClassName = outputTaint.getRealInstanceClassName();
          if (returnType.equals("L" + realInstanceClassName + ";")) {
              // storing it in method summary is useless
              outputTaint.setRealInstanceClass(null);
              analyzedMethodConfig.setOuputTaint(outputTaint);
          }
          String className = methodDescriptor.getSlashedClassName();
          String methodId = "." + methodDescriptor.getName() + methodDescriptor.getSignature();
          if (analyzedMethodConfig.isInformative()
                  || taintConfig.getSuperMethodConfig(className, methodId) != null) {
              String fullMethodName = className.concat(methodId);
              if (!taintConfig.containsKey(fullMethodName)) {
                  // prefer configured summaries to derived
                  taintConfig.put(fullMethodName, analyzedMethodConfig);
              }
          }
      }