All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pitest.highwheel.bytecodeparser.DependencyMethodVisitor Maven / Gradle / Ivy

package org.pitest.highwheel.bytecodeparser;

import static org.pitest.highwheel.bytecodeparser.NameUtil.getElementNameForType;

import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.pitest.highwheel.classpath.AccessVisitor;
import org.pitest.highwheel.model.AccessPoint;
import org.pitest.highwheel.model.AccessPointName;
import org.pitest.highwheel.model.AccessType;
import org.pitest.highwheel.model.ElementName;

class DependencyMethodVisitor extends MethodVisitor {

  private final AccessPoint   parent;
  private final AccessVisitor typeReceiver;
  private final NameTransformer nameTransformer;

  public DependencyMethodVisitor(final AccessPoint owner,
      final AccessVisitor typeReceiver, NameTransformer nameTransformer) {
    super(Opcodes.ASM5, null);
    this.typeReceiver = typeReceiver;
    this.parent = owner;
    this.nameTransformer = nameTransformer;
  }

  @Override
  public void visitMethodInsn(final int opcode, final String owner,
      final String name, final String desc, boolean itf) {
    this.typeReceiver
        .apply(this.parent, AccessPoint.create(
            nameTransformer.transform(owner), AccessPointName.create(name, desc)),
            AccessType.USES);
  }

  @Override
  public void visitFieldInsn(final int opcode, final String owner,
      final String name, final String desc) {
    this.typeReceiver
        .apply(this.parent, AccessPoint.create(
            nameTransformer.transform(owner), AccessPointName.create(name, desc)),
            AccessType.USES);
  }

  @Override
  public AnnotationVisitor visitAnnotation(final String desc,
      final boolean visible) {
    this.typeReceiver.apply(this.parent, AccessPoint.create(ElementName
        .fromString(org.objectweb.asm.Type.getType(desc).getClassName())),
        AccessType.ANNOTATED);
    return null;
  }

  @Override
  public AnnotationVisitor visitParameterAnnotation(final int parameter,
      final String desc, final boolean visible) {
    this.typeReceiver.apply(this.parent, AccessPoint.create(ElementName
        .fromString(org.objectweb.asm.Type.getType(desc).getClassName())),
        AccessType.ANNOTATED);
    return null;
  }

  @Override
  public void visitLdcInsn(final Object cst) {
    if (cst instanceof Type) {
      ElementName element = getElementNameForType((Type) cst);
      this.typeReceiver
      .apply(this.parent, AccessPoint.create(element),
          AccessType.USES);
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy