@Nullable
  static Equation analyze(Member method, MethodNode methodNode, boolean stable, boolean jsr) {
    EKey key = new EKey(method, Direction.Pure, stable);
    Effects hardCodedSolution = HardCodedPurity.getInstance().getHardCodedSolution(method);
    if (hardCodedSolution != null) {
      return new Equation(key, hardCodedSolution);
    }

    if ((methodNode.access & UN_ANALYZABLE_FLAG) != 0) return null;
    if (methodNode.instructions.size() > 1000) {
      // Skip purity analysis for very long methods, as it's rarely useful
      return null;
    }

    DataInterpreter dataInterpreter = new DataInterpreter(methodNode);
    try {
      if (jsr) {
        new Analyzer<>(dataInterpreter).analyze("this", methodNode);
      }
      else {
        new LiteAnalyzer<>(dataInterpreter).analyze("this", methodNode);
      }
    }
    catch (AnalyzerException e) {
      return null;
    }
    EffectQuantum[] quanta = dataInterpreter.effects;
    DataValue returnValue = dataInterpreter.returnValue == null ? DataValue.UnknownDataValue1 : dataInterpreter.returnValue;
    List<EffectQuantum> effects = new ArrayList<>();
    for (EffectQuantum effectQuantum : quanta) {
      if (effectQuantum != null) {
        if (effectQuantum == EffectQuantum.TopEffectQuantum) {
          return returnValue == DataValue.UnknownDataValue1 ? null : new Equation(key, new Effects(returnValue, Effects.TOP_EFFECTS));
        }
        effects.add(effectQuantum);
      }
    }
    return new Equation(key, new Effects(returnValue, Set.copyOf(effects)));
  }
@Nullable
  static Equation analyze(Member method, MethodNode methodNode, boolean stable, boolean jsr)