org_aspectj_ajde_core_tests_ResourceCopyTest_java
org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression
@Override
    public TypeBinding resolveType(BlockScope scope) {
        Constant falseConstant;
        Constant trueConstant;
        Constant condConstant;
        LookupEnvironment env = scope.environment();
        long sourceLevel = scope.compilerOptions().sourceLevel;
        boolean use15specifics = sourceLevel >= 0x310000L;
        boolean bl = this.use18specifics = sourceLevel >= 0x340000L;
        if (this.use18specifics && (this.expressionContext == ExpressionContext.ASSIGNMENT_CONTEXT || this.expressionContext == ExpressionContext.INVOCATION_CONTEXT)) {
            this.valueIfTrue.setExpressionContext(this.expressionContext);
            this.valueIfTrue.setExpectedType(this.expectedType);
            this.valueIfFalse.setExpressionContext(this.expressionContext);
            this.valueIfFalse.setExpectedType(this.expectedType);
        }
        this.collectPatternVariablesToScope(null, scope);
        if (this.constant != Constant.NotAConstant) {
            this.constant = Constant.NotAConstant;
            TypeBinding conditionType = this.condition.resolveTypeExpecting(scope, TypeBinding.BOOLEAN);
            this.condition.computeConversion(scope, TypeBinding.BOOLEAN, conditionType);
            if (this.valueIfTrue instanceof CastExpression) {
                this.valueIfTrue.bits |= 0x20;
            }
            this.originalValueIfTrueType = this.valueIfTrue.resolveType(scope);
            if (this.valueIfFalse instanceof CastExpression) {
                this.valueIfFalse.bits |= 0x20;
            }
            this.originalValueIfFalseType = this.valueIfFalse.resolveType(scope);
            if (conditionType == null || this.originalValueIfTrueType == null || this.originalValueIfFalseType == null) {
                return null;
            }
        } else {
            if (this.originalValueIfTrueType.kind() == 65540) {
                this.originalValueIfTrueType = this.valueIfTrue.resolveType(scope);
            }
            if (this.originalValueIfFalseType.kind() == 65540) {
                this.originalValueIfFalseType = this.valueIfFalse.resolveType(scope);
            }
            if (this.originalValueIfTrueType == null || !this.originalValueIfTrueType.isValidBinding()) {
                this.resolvedType = null;
                return null;
            }
            if (this.originalValueIfFalseType == null || !this.originalValueIfFalseType.isValidBinding()) {
                this.resolvedType = null;
                return null;
            }
        }
        if ((condConstant = this.condition.constant) != Constant.NotAConstant && (trueConstant = this.valueIfTrue.constant) != Constant.NotAConstant && (falseConstant = this.valueIfFalse.constant) != Constant.NotAConstant) {
            Constant constant = this.constant = condConstant.booleanValue() ? trueConstant : falseConstant;
        }
        if (this.isPolyExpression()) {
            if (this.expectedType == null || !this.expectedType.isProperType(true)) {
                this.constant = Constant.NotAConstant;
                return new PolyTypeBinding(this);
            }
            this.resolvedType = this.computeConversions(scope, this.expectedType) ? this.expectedType : null;
            return this.resolvedType;
        }
        TypeBinding valueIfTrueType = this.originalValueIfTrueType;
        TypeBinding valueIfFalseType = this.originalValueIfFalseType;
        if (use15specifics && TypeBinding.notEquals(valueIfTrueType, valueIfFalseType)) {
            TypeBinding unboxedIfTrueType;
            if (valueIfTrueType.isBaseType()) {
                if (valueIfFalseType.isBaseType()) {
                    if (valueIfTrueType == TypeBinding.NULL) {
                        valueIfFalseType = env.computeBoxingType(valueIfFalseType);
                    } else if (valueIfFalseType == TypeBinding.NULL) {
                        valueIfTrueType = env.computeBoxingType(valueIfTrueType);
                    }
                } else {
                    TypeBinding unboxedIfFalseType;
                    TypeBinding typeBinding = unboxedIfFalseType = valueIfFalseType.isBaseType() ? valueIfFalseType : env.computeBoxingType(valueIfFalseType);
                    if (valueIfTrueType.isNumericType() && unboxedIfFalseType.isNumericType()) {
                        valueIfFalseType = unboxedIfFalseType;
                    } else if (valueIfTrueType != TypeBinding.NULL) {
                        valueIfFalseType = env.computeBoxingType(valueIfFalseType);
                    }
                }
            } else if (valueIfFalseType.isBaseType()) {
                TypeBinding typeBinding = unboxedIfTrueType = valueIfTrueType.isBaseType() ? valueIfTrueType : env.computeBoxingType(valueIfTrueType);
                if (unboxedIfTrueType.isNumericType() && valueIfFalseType.isNumericType()) {
                    valueIfTrueType = unboxedIfTrueType;
                } else if (valueIfFalseType != TypeBinding.NULL) {
                    valueIfTrueType = env.computeBoxingType(valueIfTrueType);
                }
            } else {
                unboxedIfTrueType = env.computeBoxingType(valueIfTrueType);
                TypeBinding unboxedIfFalseType = env.computeBoxingType(valueIfFalseType);
                if (unboxedIfTrueType.isNumericType() && unboxedIfFalseType.isNumericType()) {
                    valueIfTrueType = unboxedIfTrueType;
                    valueIfFalseType = unboxedIfFalseType;
                }
            }
        }
        if (TypeBinding.equalsEquals(valueIfTrueType, valueIfFalseType)) {
            this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType);
            this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType);
            if (TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BOOLEAN)) {
                this.optimizedIfTrueConstant = this.valueIfTrue.optimizedBooleanConstant();
                this.optimizedIfFalseConstant = this.valueIfFalse.optimizedBooleanConstant();
                if (this.optimizedIfTrueConstant != Constant.NotAConstant && this.optimizedIfFalseConstant != Constant.NotAConstant && this.optimizedIfTrueConstant.booleanValue() == this.optimizedIfFalseConstant.booleanValue()) {
                    this.optimizedBooleanConstant = this.optimizedIfTrueConstant;
                } else {
                    condConstant = this.condition.optimizedBooleanConstant();
                    if (condConstant != Constant.NotAConstant) {
                        this.optimizedBooleanConstant = condConstant.booleanValue() ? this.optimizedIfTrueConstant : this.optimizedIfFalseConstant;
                    }
                }
            }
            this.resolvedType = NullAnnotationMatching.moreDangerousType(valueIfTrueType, valueIfFalseType);
            return this.resolvedType;
        }
        if (valueIfTrueType.isNumericType() && valueIfFalseType.isNumericType()) {
            if (TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BYTE) && TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.SHORT) || TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.SHORT) && TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.BYTE)) {
                this.valueIfTrue.computeConversion(scope, TypeBinding.SHORT, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, TypeBinding.SHORT, this.originalValueIfFalseType);
                this.resolvedType = TypeBinding.SHORT;
                return this.resolvedType;
            }
            if ((TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.BYTE) || TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.SHORT) || TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.CHAR)) && TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.INT) && this.valueIfFalse.isConstantValueOfTypeAssignableToType(valueIfFalseType, valueIfTrueType)) {
                this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, valueIfTrueType, this.originalValueIfFalseType);
                this.resolvedType = valueIfTrueType;
                return this.resolvedType;
            }
            if ((TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.BYTE) || TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.SHORT) || TypeBinding.equalsEquals(valueIfFalseType, TypeBinding.CHAR)) && TypeBinding.equalsEquals(valueIfTrueType, TypeBinding.INT) && this.valueIfTrue.isConstantValueOfTypeAssignableToType(valueIfTrueType, valueIfFalseType)) {
                this.valueIfTrue.computeConversion(scope, valueIfFalseType, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType);
                this.resolvedType = valueIfFalseType;
                return this.resolvedType;
            }
            if (BaseTypeBinding.isNarrowing(valueIfTrueType.id, 10) && BaseTypeBinding.isNarrowing(valueIfFalseType.id, 10)) {
                this.valueIfTrue.computeConversion(scope, TypeBinding.INT, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, TypeBinding.INT, this.originalValueIfFalseType);
                this.resolvedType = TypeBinding.INT;
                return this.resolvedType;
            }
            if (BaseTypeBinding.isNarrowing(valueIfTrueType.id, 7) && BaseTypeBinding.isNarrowing(valueIfFalseType.id, 7)) {
                this.valueIfTrue.computeConversion(scope, TypeBinding.LONG, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, TypeBinding.LONG, this.originalValueIfFalseType);
                this.resolvedType = TypeBinding.LONG;
                return this.resolvedType;
            }
            if (BaseTypeBinding.isNarrowing(valueIfTrueType.id, 9) && BaseTypeBinding.isNarrowing(valueIfFalseType.id, 9)) {
                this.valueIfTrue.computeConversion(scope, TypeBinding.FLOAT, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, TypeBinding.FLOAT, this.originalValueIfFalseType);
                this.resolvedType = TypeBinding.FLOAT;
                return this.resolvedType;
            }
            this.valueIfTrue.computeConversion(scope, TypeBinding.DOUBLE, this.originalValueIfTrueType);
            this.valueIfFalse.computeConversion(scope, TypeBinding.DOUBLE, this.originalValueIfFalseType);
            this.resolvedType = TypeBinding.DOUBLE;
            return this.resolvedType;
        }
        if (valueIfTrueType.isBaseType() && valueIfTrueType != TypeBinding.NULL) {
            if (use15specifics) {
                valueIfTrueType = env.computeBoxingType(valueIfTrueType);
            } else {
                scope.problemReporter().conditionalArgumentsIncompatibleTypes(this, valueIfTrueType, valueIfFalseType);
                return null;
            }
        }
        if (valueIfFalseType.isBaseType() && valueIfFalseType != TypeBinding.NULL) {
            if (use15specifics) {
                valueIfFalseType = env.computeBoxingType(valueIfFalseType);
            } else {
                scope.problemReporter().conditionalArgumentsIncompatibleTypes(this, valueIfTrueType, valueIfFalseType);
                return null;
            }
        }
        if (use15specifics) {
            TypeBinding commonType = null;
            commonType = valueIfTrueType == TypeBinding.NULL ? valueIfFalseType : (valueIfFalseType == TypeBinding.NULL ? valueIfTrueType : scope.lowerUpperBound(new TypeBinding[]{valueIfTrueType, valueIfFalseType}));
            if (commonType != null) {
                this.valueIfTrue.computeConversion(scope, commonType, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, commonType, this.originalValueIfFalseType);
                this.resolvedType = commonType.capture(scope, this.sourceStart, this.sourceEnd);
                return this.resolvedType;
            }
        } else {
            if (valueIfFalseType.isCompatibleWith(valueIfTrueType)) {
                this.valueIfTrue.computeConversion(scope, valueIfTrueType, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, valueIfTrueType, this.originalValueIfFalseType);
                this.resolvedType = valueIfTrueType;
                return this.resolvedType;
            }
            if (valueIfTrueType.isCompatibleWith(valueIfFalseType)) {
                this.valueIfTrue.computeConversion(scope, valueIfFalseType, this.originalValueIfTrueType);
                this.valueIfFalse.computeConversion(scope, valueIfFalseType, this.originalValueIfFalseType);
                this.resolvedType = valueIfFalseType;
                return this.resolvedType;
            }
        }
        scope.problemReporter().conditionalArgumentsIncompatibleTypes(this, valueIfTrueType, valueIfFalseType);
        return null;
    }
 -> java.util.Arrays.equals(char[],char[]): boolean -> java.lang.Object.hashCode(): int -> java.util.LinkedHashSet.add(java.lang.Object): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int -> java.util.Arrays.equals(char[],char[]): boolean -> 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.lang.String.valueOf(char[]): java.lang.String
 [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] -> java.lang.Object.hashCode(): int [EXIT] [EXIT] -> java.util.LinkedHashSet.add(java.lang.Object): boolean [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [EXIT] [EXIT] [CALL] [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] -> java.lang.System.arraycopy(java.lang.Object,int,java.lang.Object,int,int): void [CALL] -> java.util.Arrays.binarySearch(java.lang.Object[],int,int,java.lang.Object,java.util.Comparator): int [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [CALL] [CALL] [CALL] [CALL] -> java.util.Arrays.equals(char[],char[]): boolean -> java.util.Arrays.equals(char[],char[]): boolean [EXIT] [EXIT] [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] [CALL] [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] -> java.lang.String.valueOf(char[]): java.lang.String [CALL] [CALL] [EXIT] [EXIT] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [EXIT] [CALL] [CALL] [EXIT] [CALL] [EXIT] [EXIT] [EXIT]