org_aspectj_ajde_core_tests_InpathTest_java
org.aspectj.org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding
private MethodBinding createMethod(IBinaryMethod method, IBinaryType binaryType, long sourceLevel, char[][][] missingTypeNames) {
        boolean forceStoreAnnotations;
        IBinaryAnnotation[] receiverAnnotations;
        MethodBinding result;
        int i;
        int size;
        if (!this.isPrototype()) {
            throw new IllegalStateException();
        }
        int methodModifiers = method.getModifiers() | 0x2000000;
        if (sourceLevel < 0x310000L) {
            methodModifiers &= 0xFFFFFF7F;
        }
        if (this.isInterface() && (methodModifiers & 0x400) == 0 && (methodModifiers & 8) == 0 && (methodModifiers & 2) == 0) {
            methodModifiers |= 0x10000;
        }
        ReferenceBinding[] exceptions = Binding.NO_EXCEPTIONS;
        TypeBinding[] parameters = Binding.NO_PARAMETERS;
        TypeVariableBinding[] typeVars = Binding.NO_TYPE_VARIABLES;
        AnnotationBinding[][] paramAnnotations = null;
        TypeBinding returnType = null;
        Object argumentNames = method.getArgumentNames();
        IBinaryAnnotation[] declAnnotations = method.getAnnotations();
        boolean use15specifics = sourceLevel >= 0x310000L;
        ITypeAnnotationWalker walker = this.getTypeAnnotationWalker(method.getTypeAnnotations(), this.getNullDefaultFrom(declAnnotations));
        char[] methodSignature = method.getGenericSignature();
        if (methodSignature == null) {
            int argumentNamesLength;
            char[][] exceptionTypes;
            int size2;
            char nextChar;
            char[] methodDescriptor = method.getMethodDescriptor();
            if (sourceLevel >= 0x340000L) {
                walker = binaryType.enrichWithExternalAnnotationsFor(walker, method, this.environment);
            }
            int numOfParams = 0;
            int index = 0;
            while ((nextChar = methodDescriptor[++index]) != ')') {
                if (nextChar == '[') continue;
                ++numOfParams;
                if (nextChar != 'L') continue;
                while ((nextChar = methodDescriptor[++index]) != ';') {
                }
            }
            int startIndex = 0;
            if (method.isConstructor()) {
                if (this.isMemberType() && !this.isStatic()) {
                    ++startIndex;
                }
                if (this.isEnum()) {
                    startIndex += 2;
                }
            }
            if ((size2 = numOfParams - startIndex) > 0) {
                parameters = new TypeBinding[size2];
                if (this.environment.globalOptions.storeAnnotations) {
                    paramAnnotations = new AnnotationBinding[size2][];
                }
                index = 1;
                short visibleIdx = 0;
                int end = 0;
                int i2 = 0;
                while (i2 < numOfParams) {
                    while ((nextChar = methodDescriptor[++end]) == '[') {
                    }
                    if (nextChar == 'L') {
                        while ((nextChar = methodDescriptor[++end]) != ';') {
                        }
                    }
                    if (i2 >= startIndex) {
                        short s = visibleIdx;
                        visibleIdx = (short)(s + 1);
                        parameters[i2 - startIndex] = this.environment.getTypeFromSignature(methodDescriptor, index, end, false, this, missingTypeNames, walker.toMethodParameter(s));
                        if (paramAnnotations != null) {
                            paramAnnotations[i2 - startIndex] = BinaryTypeBinding.createAnnotations(method.getParameterAnnotations(i2 - startIndex, this.fileName), this.environment, missingTypeNames);
                        }
                    }
                    index = end + 1;
                    ++i2;
                }
            }
            if ((exceptionTypes = method.getExceptionTypeNames()) != null && (size2 = exceptionTypes.length) > 0) {
                exceptions = new ReferenceBinding[size2];
                int i3 = 0;
                while (i3 < size2) {
                    exceptions[i3] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i3], 0, -1, false, missingTypeNames, walker.toThrows(i3));
                    ++i3;
                }
            }
            if (!method.isConstructor()) {
                returnType = this.environment.getTypeFromSignature(methodDescriptor, index + 1, -1, false, this, missingTypeNames, walker.toMethodReturn());
            }
            int n = argumentNamesLength = argumentNames == null ? 0 : ((char[][])argumentNames).length;
            if (startIndex > 0 && argumentNamesLength > 0) {
                if (startIndex >= argumentNamesLength) {
                    argumentNames = Binding.NO_PARAMETER_NAMES;
                } else {
                    char[][] slicedArgumentNames = new char[argumentNamesLength - startIndex][];
                    System.arraycopy(argumentNames, startIndex, slicedArgumentNames, 0, argumentNamesLength - startIndex);
                    argumentNames = slicedArgumentNames;
                }
            }
        } else {
            ArrayList<TypeBinding> types;
            if (sourceLevel >= 0x340000L) {
                walker = binaryType.enrichWithExternalAnnotationsFor(walker, method, this.environment);
            }
            methodModifiers |= 0x40000000;
            SignatureWrapper wrapper = new SignatureWrapper(methodSignature, use15specifics);
            if (wrapper.signature[wrapper.start] == '<') {
                ++wrapper.start;
                typeVars = this.createTypeVariables(wrapper, false, missingTypeNames, walker, false);
                ++wrapper.start;
            }
            if (CharOperation.prefixEquals(ajcInterMethod, method.getSelector()) || CharOperation.prefixEquals(ajcInterField, method.getSelector())) {
                try {
                    char[] sel = method.getSelector();
                    int dollar2 = CharOperation.indexOf('$', sel, 4);
                    int dollar3 = CharOperation.indexOf('$', sel, dollar2 + 1);
                    int dollar4 = CharOperation.indexOf('$', sel, dollar3 + 1);
                    char[] targetType = CharOperation.subarray(sel, dollar3 + 1, dollar4);
                    targetType = CharOperation.replaceOnCopy(targetType, '_', '/');
                    ReferenceBinding binding = this.environment.getTypeFromConstantPoolName(targetType, 0, targetType.length, false, missingTypeNames);
                    TypeVariableBinding[] tvb = binding.typeVariables();
                    if (tvb != null && tvb.length > 0) {
                        int i4 = 0;
                        while (i4 < tvb.length) {
                            int j = 0;
                            while (j < typeVars.length) {
                                if (CharOperation.equals(tvb[i4].sourceName, typeVars[j].sourceName)) {
                                    System.err.println("Type variable for name '" + new String(tvb[i4].sourceName) + "' clash on generic ITD " + this.toString());
                                }
                                ++j;
                            }
                            ++i4;
                        }
                        TypeVariableBinding[] newTypeVars = new TypeVariableBinding[(typeVars == null ? 0 : typeVars.length) + tvb.length];
                        System.arraycopy(typeVars, 0, newTypeVars, 0, typeVars.length);
                        System.arraycopy(tvb, 0, newTypeVars, typeVars.length, tvb.length);
                        typeVars = newTypeVars;
                    }
                }
                catch (Exception e) {
                    System.err.println("Unexpected problem in code that fixes 242797 - please raise an AspectJ bug.");
                    e.printStackTrace();
                }
            }
            if (wrapper.signature[wrapper.start] == '(') {
                ++wrapper.start;
                if (wrapper.signature[wrapper.start] == ')') {
                    ++wrapper.start;
                } else {
                    types = new ArrayList<TypeBinding>(2);
                    short rank = 0;
                    while (wrapper.signature[wrapper.start] != ')') {
                        IBinaryAnnotation[] binaryParameterAnnotations = method.getParameterAnnotations(rank, this.fileName);
                        ITypeAnnotationWalker updatedWalker = NonNullDefaultAwareTypeAnnotationWalker.updateWalkerForParamNonNullDefault(walker, this.getNullDefaultFrom(binaryParameterAnnotations), this.environment);
                        types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, updatedWalker.toMethodParameter(rank)));
                        rank = (short)(rank + 1);
                    }
                    ++wrapper.start;
                    int numParam = types.size();
                    parameters = new TypeBinding[numParam];
                    types.toArray(parameters);
                    if (this.environment.globalOptions.storeAnnotations) {
                        paramAnnotations = new AnnotationBinding[numParam][];
                        int i5 = 0;
                        while (i5 < numParam) {
                            paramAnnotations[i5] = BinaryTypeBinding.createAnnotations(method.getParameterAnnotations(i5, this.fileName), this.environment, missingTypeNames);
                            ++i5;
                        }
                    }
                }
            }
            returnType = this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, walker.toMethodReturn());
            if (!wrapper.atEnd() && wrapper.signature[wrapper.start] == '^') {
                types = new ArrayList(2);
                int excRank = 0;
                do {
                    ++wrapper.start;
                    types.add(this.environment.getTypeFromTypeSignature(wrapper, typeVars, this, missingTypeNames, walker.toThrows(excRank++)));
                } while (!wrapper.atEnd() && wrapper.signature[wrapper.start] == '^');
                exceptions = new ReferenceBinding[types.size()];
                types.toArray(exceptions);
            } else {
                char[][] exceptionTypes = method.getExceptionTypeNames();
                if (exceptionTypes != null && (size = exceptionTypes.length) > 0) {
                    exceptions = new ReferenceBinding[size];
                    i = 0;
                    while (i < size) {
                        exceptions[i] = this.environment.getTypeFromConstantPoolName(exceptionTypes[i], 0, -1, false, missingTypeNames, walker.toThrows(i));
                        ++i;
                    }
                }
            }
        }
        MethodBinding methodBinding = result = method.isConstructor() ? new MethodBinding(methodModifiers, parameters, exceptions, this) : new MethodBinding(methodModifiers, method.getSelector(), returnType, parameters, exceptions, this);
        if (declAnnotations != null) {
            IBinaryAnnotation[] i5 = declAnnotations;
            i = declAnnotations.length;
            size = 0;
            while (size < i) {
                IBinaryAnnotation annotation = i5[size];
                char[] typeName = annotation.getTypeName();
                if (this.isPreviewFeature(typeName)) {
                    result.tagBits |= 0x180000000L;
                    break;
                }
                ++size;
            }
        }
        if ((receiverAnnotations = walker.toReceiver().getAnnotationsAtCursor(this.id, false)) != null && receiverAnnotations.length > 0) {
            result.receiver = this.environment.createAnnotatedType((TypeBinding)this, BinaryTypeBinding.createAnnotations(receiverAnnotations, this.environment, missingTypeNames));
        }
        boolean bl = forceStoreAnnotations = !this.environment.globalOptions.storeAnnotations && this.environment.globalOptions.sourceLevel >= 0x350000L && method instanceof MethodInfoWithAnnotations && (method.getTagBits() & 0x400000000000L) != 0L;
        if (this.environment.globalOptions.storeAnnotations || forceStoreAnnotations) {
            if (forceStoreAnnotations) {
                this.storedAnnotations(true, true);
            }
            IBinaryAnnotation[] annotations = method.getAnnotations();
            if (method.isConstructor()) {
                IBinaryAnnotation[] tAnnotations = walker.toMethodReturn().getAnnotationsAtCursor(this.id, false);
                result.setTypeAnnotations(BinaryTypeBinding.createAnnotations(tAnnotations, this.environment, missingTypeNames));
            }
            result.setAnnotations(BinaryTypeBinding.createAnnotations(annotations, this.environment, missingTypeNames), paramAnnotations, this.isAnnotationType() ? BinaryTypeBinding.convertMemberValue(method.getDefaultValue(), this.environment, missingTypeNames, true) : null, this.environment);
        }
        if (argumentNames != null) {
            result.parameterNames = argumentNames;
        }
        if (use15specifics) {
            result.tagBits |= method.getTagBits();
        }
        result.typeVariables = typeVars;
        int i6 = 0;
        int length = typeVars.length;
        while (i6 < length) {
            this.environment.typeSystem.fixTypeVariableDeclaringElement(typeVars[i6], result);
            ++i6;
        }
        return result;
    }
 -> java.util.Arrays.equals(char[],char[]): boolean -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.util.Map.get(java.lang.Object): java.lang.Object -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.hashCode(char[]): int -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void
 [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [EXIT] [EXIT] [CALL] [CALL] [CALL] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [EXIT] [EXIT] -> java.util.Map.get(java.lang.Object): java.lang.Object [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [EXIT] [CALL] [CALL] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] -> java.util.Arrays.hashCode(char[]): int [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT]