/* * Copyright 2010 Henry Coles * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and limitations under the License. */ package org.pitest.mutationtest.engine.gregor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; public class MethodInfo { private final ClassInfo owningClass; private final int access; private final String methodName; private final String methodDescriptor; public MethodInfo() { this(new ClassInfo(0, 0, "", "", "", new String[0]), 0, "", "()V"); } private MethodInfo(final ClassInfo owningClass, final int access, final String name, final String methodDescriptor) { this.owningClass = owningClass; this.access = access; this.methodName = name; this.methodDescriptor = methodDescriptor; } public String getDescription() { return this.owningClass.getName() + "::" + getName(); } public String getName() { return this.methodName; } public String getMethodDescriptor() { return this.methodDescriptor; } @Override public String toString() { return "MethodInfo [access=" + this.access + ", desc=" + this.methodDescriptor + ", name=" + this.methodName + "]"; } public boolean isStatic() { return ((this.access & Opcodes.ACC_STATIC) != 0); } public boolean isSynthetic() { return ((this.access & Opcodes.ACC_SYNTHETIC) != 0); } public boolean isConstructor() { return isConstructor(this.methodName); } public static boolean isConstructor(final String methodName) { return "<init>".equals(methodName); } public Type getReturnType() { return Type.getReturnType(this.methodDescriptor); } public static boolean isVoid(final String desc) { return Type.getReturnType(desc).equals(Type.VOID_TYPE); } public boolean isStaticInitializer() { return "<clinit>".equals(this.methodName); } public boolean isVoid() { return isVoid(this.methodDescriptor); } public boolean takesNoParameters() { return this.methodDescriptor.startsWith("()"); } public boolean isInGroovyClass() { return this.owningClass.isGroovyClass(); } public boolean isGeneratedEnumMethod() { return this.owningClass.isEnum() && (isValuesMethod() || isValueOfMethod() || isStaticInitializer()); } private boolean isValuesMethod() { return this.getName().equals("values") && takesNoParameters() && isStatic(); } private boolean isValueOfMethod() { return this.getName().equals("valueOf") && this.methodDescriptor.startsWith("(Ljava/lang/String;)") && isStatic(); } public MethodInfo withMethodDescriptor(final String newDescriptor) { return new MethodInfo(this.owningClass, this.access, this.methodName, newDescriptor); } public MethodInfo withAccess(final int accessModifier) { return new MethodInfo(this.owningClass, accessModifier, this.methodName, this.methodDescriptor); } public MethodInfo withMethodName(final String newMethodName) { return new MethodInfo(this.owningClass, this.access, newMethodName, this.methodDescriptor); } public MethodInfo withOwner(final ClassInfo newOwnerClass) { return new MethodInfo(newOwnerClass, this.access, this.methodName, this.methodDescriptor); } }