<s> package org . eclipse . jdt . internal . compiler . lookup ; import org . eclipse . jdt . internal . compiler . ast . Wildcard ; public class ParameterizedMethodBinding extends MethodBinding { protected MethodBinding originalMethod ; public ParameterizedMethodBinding ( final ParameterizedTypeBinding parameterizedDeclaringClass , MethodBinding originalMethod ) { super ( originalMethod . modifiers , originalMethod . selector , originalMethod . returnType , originalMethod . parameters , originalMethod . thrownExceptions , parameterizedDeclaringClass ) ; this . originalMethod = originalMethod ; this . tagBits = originalMethod . tagBits & ~ TagBits . HasMissingType ; this . parameterNonNullness = originalMethod . parameterNonNullness ; final TypeVariableBinding [ ] originalVariables = originalMethod . typeVariables ; Substitution substitution = null ; final int length = originalVariables . length ; final boolean isStatic = originalMethod . isStatic ( ) ; if ( length == 0 ) { this . typeVariables = Binding . NO_TYPE_VARIABLES ; if ( ! isStatic ) substitution = parameterizedDeclaringClass ; } else { final TypeVariableBinding [ ] substitutedVariables = new TypeVariableBinding [ length ] ; for ( int i = 0 ; i < length ; i ++ ) { TypeVariableBinding originalVariable = originalVariables [ i ] ; substitutedVariables [ i ] = new TypeVariableBinding ( originalVariable . sourceName , this , originalVariable . rank , parameterizedDeclaringClass . environment ) ; } this . typeVariables = substitutedVariables ; substitution = new Substitution ( ) { public LookupEnvironment environment ( ) { return parameterizedDeclaringClass . environment ; } public boolean isRawSubstitution ( ) { return ! isStatic && parameterizedDeclaringClass . isRawSubstitution ( ) ; } public TypeBinding substitute ( TypeVariableBinding typeVariable ) { if ( typeVariable . rank < length && originalVariables [ typeVariable . rank ] == typeVariable ) { return substitutedVariables [ typeVariable . rank ] ; } if ( ! isStatic ) return parameterizedDeclaringClass . substitute ( typeVariable ) ; return typeVariable ; } } ; for ( int i = 0 ; i < length ; i ++ ) { TypeVariableBinding originalVariable = originalVariables [ i ] ; TypeVariableBinding substitutedVariable = substitutedVariables [ i ] ; TypeBinding substitutedSuperclass = Scope . substitute ( substitution , originalVariable . superclass ) ; ReferenceBinding [ ] substitutedInterfaces = Scope . substitute ( substitution , originalVariable . superInterfaces ) ; if ( originalVariable . firstBound != null ) { substitutedVariable . firstBound = originalVariable . firstBound == originalVariable . superclass ? substitutedSuperclass : substitutedInterfaces [ 0 ] ; } switch ( substitutedSuperclass . kind ( ) ) { case Binding . ARRAY_TYPE : substitutedVariable . superclass = parameterizedDeclaringClass . environment . getResolvedType ( TypeConstants . JAVA_LANG_OBJECT , null ) ; substitutedVariable . superInterfaces = substitutedInterfaces ; break ; default : if ( substitutedSuperclass . isInterface ( ) ) { substitutedVariable . superclass = parameterizedDeclaringClass . environment . getResolvedType ( TypeConstants . JAVA_LANG_OBJECT , null ) ; int interfaceCount = substitutedInterfaces . length ; System . arraycopy ( substitutedInterfaces , 0 , substitutedInterfaces = new ReferenceBinding [ interfaceCount + 1 ] , 1 , interfaceCount ) ; substitutedInterfaces [ 0 ] = ( ReferenceBinding ) substitutedSuperclass ; substitutedVariable . superInterfaces = substitutedInterfaces ; } else { substitutedVariable . superclass = ( ReferenceBinding ) substitutedSuperclass ; substitutedVariable . superInterfaces = substitutedInterfaces ; } } } } if ( substitution != null ) { this . returnType = Scope . substitute ( substitution , this . returnType ) ; this . parameters = Scope . substitute ( substitution , this . parameters ) ; this . thrownExceptions = Scope . substitute ( substitution , this . thrownExceptions ) ; if ( this . thrownExceptions == null ) this . thrownExceptions = Binding . NO_EXCEPTIONS ; } checkMissingType : { if ( ( this . tagBits & TagBits . HasMissingType ) != 0 ) break checkMissingType ; if ( ( this . returnType . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } for ( int i = 0 , max = this . parameters . length ; i < max ; i ++ ) { if ( ( this . parameters [ i ] . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } } for ( int i = 0 , max = this . thrownExceptions . length ; i < max ; i ++ ) { if ( ( this . thrownExceptions [ i ] . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } } } } public ParameterizedMethodBinding ( final ReferenceBinding declaringClass , MethodBinding originalMethod , char [ ] [ ] alternateParamaterNames , final LookupEnvironment environment ) { super ( originalMethod . modifiers , originalMethod . selector , originalMethod . returnType , originalMethod . parameters , originalMethod . thrownExceptions , declaringClass ) ; this . originalMethod = originalMethod ; this . tagBits = originalMethod . tagBits & ~ TagBits . HasMissingType ; this . parameterNonNullness = originalMethod . parameterNonNullness ; final TypeVariableBinding [ ] originalVariables = originalMethod . typeVariables ; Substitution substitution = null ; final int length = originalVariables . length ; if ( length == 0 ) { this . typeVariables = Binding . NO_TYPE_VARIABLES ; } else { final TypeVariableBinding [ ] substitutedVariables = new TypeVariableBinding [ length ] ; for ( int i = 0 ; i < length ; i ++ ) { TypeVariableBinding originalVariable = originalVariables [ i ] ; substitutedVariables [ i ] = new TypeVariableBinding ( alternateParamaterNames == null ? originalVariable . sourceName : alternateParamaterNames [ i ] , this , originalVariable . rank , environment ) ; } this . typeVariables = substitutedVariables ; substitution = new Substitution ( ) { public LookupEnvironment environment ( ) { return environment ; } public boolean isRawSubstitution ( ) { return false ; } public TypeBinding substitute ( TypeVariableBinding typeVariable ) { if ( typeVariable . rank < length && originalVariables [ typeVariable . rank ] == typeVariable ) { return substitutedVariables [ typeVariable . rank ] ; } return typeVariable ; } } ; for ( int i = 0 ; i < length ; i ++ ) { TypeVariableBinding originalVariable = originalVariables [ i ] ; TypeVariableBinding substitutedVariable = substitutedVariables [ i ] ; TypeBinding substitutedSuperclass = Scope . substitute ( substitution , originalVariable . superclass ) ; ReferenceBinding [ ] substitutedInterfaces = Scope . substitute ( substitution , originalVariable . superInterfaces ) ; if ( originalVariable . firstBound != null ) { substitutedVariable . firstBound = originalVariable . firstBound == originalVariable . superclass ? substitutedSuperclass : substitutedInterfaces [ 0 ] ; } switch ( substitutedSuperclass . kind ( ) ) { case Binding . ARRAY_TYPE : substitutedVariable . superclass = environment . getResolvedType ( TypeConstants . JAVA_LANG_OBJECT , null ) ; substitutedVariable . superInterfaces = substitutedInterfaces ; break ; default : if ( substitutedSuperclass . isInterface ( ) ) { substitutedVariable . superclass = environment . getResolvedType ( TypeConstants . JAVA_LANG_OBJECT , null ) ; int interfaceCount = substitutedInterfaces . length ; System . arraycopy ( substitutedInterfaces , 0 , substitutedInterfaces = new ReferenceBinding [ interfaceCount + 1 ] , 1 , interfaceCount ) ; substitutedInterfaces [ 0 ] = ( ReferenceBinding ) substitutedSuperclass ; substitutedVariable . superInterfaces = substitutedInterfaces ; } else { substitutedVariable . superclass = ( ReferenceBinding ) substitutedSuperclass ; substitutedVariable . superInterfaces = substitutedInterfaces ; } } } } if ( substitution != null ) { this . returnType = Scope . substitute ( substitution , this . returnType ) ; this . parameters = Scope . substitute ( substitution , this . parameters ) ; this . thrownExceptions = Scope . substitute ( substitution , this . thrownExceptions ) ; if ( this . thrownExceptions == null ) this . thrownExceptions = Binding . NO_EXCEPTIONS ; } checkMissingType : { if ( ( this . tagBits & TagBits . HasMissingType ) != 0 ) break checkMissingType ; if ( ( this . returnType . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } for ( int i = 0 , max = this . parameters . length ; i < max ; i ++ ) { if ( ( this . parameters [ i ] . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } } for ( int i = 0 , max = this . thrownExceptions . length ; i < max ; i ++ ) { if ( ( this . thrownExceptions [ i ] . tagBits & TagBits . HasMissingType ) != 0 ) { this . tagBits |= TagBits . HasMissingType ; break checkMissingType ; } } } } public ParameterizedMethodBinding ( ) { } public static ParameterizedMethodBinding instantiateGetClass ( TypeBinding receiverType , MethodBinding originalMethod , Scope scope ) { ParameterizedMethodBinding method = new ParameterizedMethodBinding ( ) ; method . modifiers = originalMethod . modifiers ; method . selector = originalMethod . selector ; method . declaringClass = originalMethod . declaringClass ; method . typeVariables = Binding . NO_TYPE_VARIABLES ; method . originalMethod = originalMethod ; method . parameters = originalMethod . parameters ; method . thrownExceptions = originalMethod . thrownExceptions ; method . tagBits = originalMethod . tagBits ; ReferenceBinding genericClassType = scope . getJavaLangClass ( ) ; LookupEnvironment environment = scope . environment ( ) ; TypeBinding rawType = environment . convertToRawType ( receiverType . erasure ( ) , false ) ; method . returnType = environment . createParameterizedType ( genericClassType , new TypeBinding [ ] { environment . createWildcard ( genericClassType , 0 , rawType , null , Wildcard . EXTENDS ) } , null ) ; if ( ( method . returnType . tagBits & TagBits . HasMissingType ) != 0 ) { method . tagBits |= TagBits . HasMissingType ; } return method ; } public boolean hasSubstitutedParameters ( ) { return this . parameters != this . originalMethod . parameters ; } public boolean hasSubstitutedReturnType ( ) { return this . returnType != this . originalMethod . returnType ; } public MethodBinding original ( ) { return this . originalMethod . original ( ) ; } } </s>