docs: public void build() {
          int numGood = 0, numBytecodes = 0;
  
          if (DEBUG) {
              System.out.println("Method: " + methodGen.getName() + " - " + methodGen.getSignature() + "in class "
                      + methodGen.getClassName());
          }
  
          // Associate line number information with each InstructionHandle
          LineNumberTable table = methodGen.getLineNumberTable(methodGen.getConstantPool());
  
          if (table != null && table.getTableLength() > 0) {
              checkTable(table);
              InstructionHandle handle = methodGen.getInstructionList().getStart();
              while (handle != null) {
                  int bytecodeOffset = handle.getPosition();
                  if (bytecodeOffset < 0) {
                      throw new IllegalStateException("Bad bytecode offset: " + bytecodeOffset);
                  }
                  if (DEBUG) {
                      System.out.println("Looking for source line for bytecode offset " + bytecodeOffset);
                  }
                  int sourceLine;
                  try {
                      sourceLine = table.getSourceLine(bytecodeOffset);
                  } catch (ArrayIndexOutOfBoundsException e) {
                      if (LINE_NUMBER_BUG) {
                          throw e;
                      } else {
                          sourceLine = -1;
                      }
                  }
                  if (sourceLine >= 0) {
                      ++numGood;
                  }
                  lineNumberMap.put(handle, new LineNumber(bytecodeOffset, sourceLine));
                  handle = handle.getNext();
                  ++numBytecodes;
              }
              hasLineNumbers = true;
  
              if (DEBUG) {
                  System.out.println("\t" + numGood + "/" + numBytecodes + " had valid line numbers");
              }
          }
      }