code: @Override
      public void sawOpcode(int seen) {
          Units unit = null;
          try {
              stack.precomputation(this);
  
              switch (seen) {
                  case Const.INVOKEVIRTUAL:
                  case Const.INVOKEINTERFACE:
                  case Const.INVOKESTATIC:
                      unit = processInvoke();
                  break;
  
                  case Const.GETSTATIC:
                      String clsName = getClassConstantOperand();
                      if ("java/util/concurrent/TimeUnit".equals(clsName) || "edu/emory/matchcs/backport/java/util/concurrent/TimeUnit".equals(clsName)) {
                          unit = TIMEUNIT_TO_UNITS.get(getNameConstantOperand());
                      }
                  break;
  
                  case Const.L2I:
                  case Const.I2L:
                      if (stack.getStackDepth() > 0) {
                          OpcodeStack.Item item = stack.getStackItem(0);
                          unit = (Units) item.getUserValue();
                      }
                  break;
  
                  case Const.IADD:
                  case Const.ISUB:
                  case Const.IMUL:
                  case Const.IDIV:
                  case Const.IREM:
                  case Const.LADD:
                  case Const.LSUB:
                  case Const.LMUL:
                  case Const.LDIV:
                  case Const.LREM:
                      processArithmetic();
                  break;
  
                  default:
                  break;
              }
          } finally {
              stack.sawOpcode(this, seen);
              if ((unit != null) && (stack.getStackDepth() > 0)) {
                  OpcodeStack.Item item = stack.getStackItem(0);
                  item.setUserValue(unit);
              }
          }
      }
docs: overrides the visitor to look for operations on two time unit values that are conflicting