docs: @Override
      public void sawOpcode(int seen) {
  
          if (seen == Const.GETSTATIC) {
              XField f = getXFieldOperand();
              if (pendingBugs.containsKey(f)) {
                  if (!isLocked()) {
                      reporter.reportBug(pendingBugs.remove(f));
  
                  }
  
              }
          }
          // we are only interested in method calls
          if (seen != Const.INVOKEVIRTUAL) {
              return;
          }
  
          try {
              @SlashedClassName String className = getClassConstantOperand();
  
              if (className.startsWith("[")) {
                  // Ignore array classes
                  return;
              }
              ClassDescriptor cDesc = DescriptorFactory.createClassDescriptor(className);
  
              // if it is not compatible with Calendar or DateFormat, we are not
              // interested anymore
              boolean isCalendar = subtypes2.isSubtype(cDesc, calendarType);
              boolean isDateFormat = subtypes2.isSubtype(cDesc, dateFormatType);
              if (!isCalendar && !isDateFormat) {
                  return;
              }
  
              // determine the number of arguments the method expects
              int numArguments = getNumberArguments(getSigConstantOperand());
              // go back on the stack to find what the receiver of the method is
              OpcodeStack.Item invokedOn = stack.getStackItem(numArguments);
              XField field = invokedOn.getXField();
              // find out, if the field is static. if not, we are not interested
              // anymore
              if (field == null || !field.isStatic()) {
                  return;
              }
  
              if (Const.STATIC_INITIALIZER_NAME.equals(getMethodName()) && field.getClassName().equals(getDottedClassName())) {
                  return;
              }
              String invokedName = getNameConstantOperand();
              if (invokedName.startsWith("get")) {
                  return;
              }
              if ("equals".equals(invokedName) && numArguments == 1) {
                  OpcodeStack.Item passedAsArgument = stack.getStackItem(0);
                  field = passedAsArgument.getXField();
                  if (field == null || !field.isStatic()) {
                      return;
                  }
              }
  
              if (!SystemProperties.getBoolean(PROP_SKIP_SYNCHRONIZED_CHECK)) {
                  // check synchronization
                  if (isLocked()) {
                      return;
                  }
              }
  
              // if we get here, we want to generate a report, depending on the
              // type
              String tBugType;
              if (isCalendar) {
                  tBugType = "STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE";
              } else if (isDateFormat) {
                  tBugType = "STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE";
              } else {
                  throw new IllegalStateException("Not possible");
              }
              int priority;
              if (amVisitingMainMethod()) {
                  priority = LOW_PRIORITY;
              } else {
                  if (getClassContext().getXClass().usesConcurrency()) {
                      priority = NORMAL_PRIORITY;
                  } else {
                      priority = LOW_PRIORITY;
                  }
                  if (invokedName.startsWith("set") || "format".equals(invokedName) || "add".equals(invokedName)
                          || "clear".equals(invokedName) || "parse".equals(invokedName) || "applyPattern".equals(invokedName)) {
                      priority--;
                  }
              }
              bugAccumulator.accumulateBug(new BugInstance(this, tBugType, priority).addClassAndMethod(this).addCalledMethod(this)
                      .addOptionalField(field), this);
  
          } catch (ClassNotFoundException e) {
              AnalysisContext.reportMissingClass(e);
          }
      }