docs: @Override
      public void sawOpcode(int seen) {
          // System.out.println(getPC() + " " + Const.getOpcodeName(seen) + " " + state);
  
          if (stack.getStackDepth() < stackDepth) {
              state = FormatState.NONE;
              stackDepth = 0;
              arguments = null;
          }
          if (seen == Const.ANEWARRAY && stack.getStackDepth() >= 2) {
              Object size = stack.getStackItem(0).getConstant();
              Object formatStr = stack.getStackItem(1).getConstant();
              if (size instanceof Integer && formatStr instanceof String) {
                  arguments = new OpcodeStack.Item[(Integer) size];
                  this.formatString = (String) formatStr;
                  state = FormatState.READY_FOR_FORMAT;
                  stackDepth = stack.getStackDepth();
              }
          } else if (state == FormatState.READY_FOR_FORMAT && seen == Const.DUP) {
              state = FormatState.EXPECTING_ASSIGNMENT;
          } else if (state == FormatState.EXPECTING_ASSIGNMENT && stack.getStackDepth() == stackDepth + 3 && seen == Const.AASTORE) {
              Object pos = stack.getStackItem(1).getConstant();
              OpcodeStack.Item value = stack.getStackItem(0);
              if (pos instanceof Integer) {
                  int index = (Integer) pos;
                  if (index >= 0 && index < arguments.length) {
                      arguments[index] = value;
                      state = FormatState.READY_FOR_FORMAT;
                  } else {
                      state = FormatState.NONE;
                  }
              } else {
                  state = FormatState.NONE;
              }
          } else if (state == FormatState.READY_FOR_FORMAT
                  && (seen == Const.INVOKESPECIAL || seen == Const.INVOKEVIRTUAL || seen == Const.INVOKESTATIC || seen == Const.INVOKEINTERFACE)
                  && stack.getStackDepth() == stackDepth) {
  
              String cl = getClassConstantOperand();
              String nm = getNameConstantOperand();
              String sig = getSigConstantOperand();
              XMethod m = getXMethodOperand();
              if ((m == null || m.isVarArgs())
                      && sig.indexOf("Ljava/lang/String;[Ljava/lang/Object;)") >= 0
                      && ("java/util/Formatter".equals(cl) && "format".equals(nm) || "java/lang/String".equals(cl)
                              && "format".equals(nm) || "java/io/PrintStream".equals(cl) && "format".equals(nm)
                              || "java/io/PrintStream".equals(cl) && "printf".equals(nm) || cl.endsWith("Writer")
                              && "format".equals(nm) || cl.endsWith("Writer") && "printf".equals(nm)) || cl.endsWith("Logger")
                              && nm.endsWith("fmt")) {
  
                  if (formatString.indexOf('\n') >= 0) {
                      bugReporter.reportBug(new BugInstance(this, "VA_FORMAT_STRING_USES_NEWLINE", NORMAL_PRIORITY)
                      .addClassAndMethod(this).addCalledMethod(this).addString(formatString)
                      .describe(StringAnnotation.FORMAT_STRING_ROLE).addSourceLine(this));
                  }
              }
  
          }
      }