override def visitMethod()

in chill-scala/src/main/scala/com/twitter/chill/ClosureCleaner.scala [245:296]


  override def visitMethod(
      access: Int,
      name: String,
      desc: String,
      sig: String,
      exceptions: Array[String]
  ): MethodVisitor =
    if (
      specificMethod.isDefined &&
      (specificMethod.get.name != name || specificMethod.get.desc != desc)
    ) {
      null
    } else {
      new MethodVisitor(ASM7) {
        override def visitFieldInsn(op: Int, owner: String, name: String, desc: String): Unit =
          if (op == GETFIELD) {
            val ownerName = owner.replace('/', '.')
            output.keys.iterator
              .filter(_.getName == ownerName)
              .foreach(cl => output(cl) += name)
          }

        override def visitMethodInsn(
            op: Int,
            owner: String,
            name: String,
            desc: String,
            itf: Boolean
        ): Unit = {
          val ownerName = owner.replace('/', '.')
          output.keys.iterator.filter(_.getName == ownerName).foreach { cl =>
            // Check for calls a getter method for a variable in an interpreter wrapper object.
            // This means that the corresponding field will be accessed, so we should save it.
            if (
              op == INVOKEVIRTUAL && owner.endsWith("$iwC") && !name.endsWith(
                "$outer"
              )
            ) {
              output(cl) += name
            }
            val m = MethodIdentifier(cl, name, desc)
            if (!visitedMethods.contains(m)) {
              // Keep track of visited methods to avoid potential infinite cycles
              visitedMethods += m
              AsmUtil.classReader(cl).foreach { cr =>
                cr.accept(new FieldAccessFinder(output, Some(m), visitedMethods), 0)
              }
            }
          }
        }
      }
    }