<s> package org . eclipse . jdt . internal . compiler . ast ; import org . eclipse . jdt . core . compiler . CharOperation ; import org . eclipse . jdt . internal . compiler . classfmt . ClassFileConstants ; import org . eclipse . jdt . internal . compiler . env . AccessRestriction ; import org . eclipse . jdt . internal . compiler . lookup . * ; import org . eclipse . jdt . internal . compiler . ASTVisitor ; public abstract class ASTNode implements TypeConstants , TypeIds { public int sourceStart , sourceEnd ; public final static int Bit1 = 0x1 ; public final static int Bit2 = 0x2 ; public final static int Bit3 = 0x4 ; public final static int Bit4 = 0x8 ; public final static int Bit5 = 0x10 ; public final static int Bit6 = 0x20 ; public final static int Bit7 = 0x40 ; public final static int Bit8 = 0x80 ; public final static int Bit9 = 0x100 ; public final static int Bit10 = 0x200 ; public final static int Bit11 = 0x400 ; public final static int Bit12 = 0x800 ; public final static int Bit13 = 0x1000 ; public final static int Bit14 = 0x2000 ; public final static int Bit15 = 0x4000 ; public final static int Bit16 = 0x8000 ; public final static int Bit17 = 0x10000 ; public final static int Bit18 = 0x20000 ; public final static int Bit19 = 0x40000 ; public final static int Bit20 = 0x80000 ; public final static int Bit21 = 0x100000 ; public final static int Bit22 = 0x200000 ; public final static int Bit23 = 0x400000 ; public final static int Bit24 = 0x800000 ; public final static int Bit25 = 0x1000000 ; public final static int Bit26 = 0x2000000 ; public final static int Bit27 = 0x4000000 ; public final static int Bit28 = 0x8000000 ; public final static int Bit29 = 0x10000000 ; public final static int Bit30 = 0x20000000 ; public final static int Bit31 = 0x40000000 ; public final static int Bit32 = 0x80000000 ; public final static long Bit32L = 0x80000000L ; public final static long Bit33L = 0x100000000L ; public final static long Bit34L = 0x200000000L ; public final static long Bit35L = 0x400000000L ; public final static long Bit36L = 0x800000000L ; public final static long Bit37L = 0x1000000000L ; public final static long Bit38L = 0x2000000000L ; public final static long Bit39L = 0x4000000000L ; public final static long Bit40L = 0x8000000000L ; public final static long Bit41L = 0x10000000000L ; public final static long Bit42L = 0x20000000000L ; public final static long Bit43L = 0x40000000000L ; public final static long Bit44L = 0x80000000000L ; public final static long Bit45L = 0x100000000000L ; public final static long Bit46L = 0x200000000000L ; public final static long Bit47L = 0x400000000000L ; public final static long Bit48L = 0x800000000000L ; public final static long Bit49L = 0x1000000000000L ; public final static long Bit50L = 0x2000000000000L ; public final static long Bit51L = 0x4000000000000L ; public final static long Bit52L = 0x8000000000000L ; public final static long Bit53L = 0x10000000000000L ; public final static long Bit54L = 0x20000000000000L ; public final static long Bit55L = 0x40000000000000L ; public final static long Bit56L = 0x80000000000000L ; public final static long Bit57L = 0x100000000000000L ; public final static long Bit58L = 0x200000000000000L ; public final static long Bit59L = 0x400000000000000L ; public final static long Bit60L = 0x800000000000000L ; public final static long Bit61L = 0x1000000000000000L ; public final static long Bit62L = 0x2000000000000000L ; public final static long Bit63L = 0x4000000000000000L ; public final static long Bit64L = 0x8000000000000000L ; public int bits = IsReachable ; public static final int ReturnTypeIDMASK = Bit1 | Bit2 | Bit3 | Bit4 ; public static final int OperatorSHIFT = 6 ; public static final int OperatorMASK = Bit7 | Bit8 | Bit9 | Bit10 | Bit11 | Bit12 ; public static final int IsReturnedValue = Bit5 ; public static final int UnnecessaryCast = Bit15 ; public static final int DisableUnnecessaryCastCheck = Bit6 ; public static final int GenerateCheckcast = Bit7 ; public static final int UnsafeCast = Bit8 ; public static final int RestrictiveFlagMASK = Bit1 | Bit2 | Bit3 ; public static final int IsArgument = Bit3 ; public static final int FirstAssignmentToLocal = Bit4 ; public static final int NeedReceiverGenericCast = Bit19 ; public static final int IsImplicitThis = Bit3 ; public static final int DepthSHIFT = 5 ; public static final int DepthMASK = Bit6 | Bit7 | Bit8 | Bit9 | Bit10 | Bit11 | Bit12 | Bit13 ; public static final int IsReachable = Bit32 ; public static final int LabelUsed = Bit7 ; public static final int DocumentedFallthrough = Bit30 ; public static final int IsLocalDeclarationReachable = Bit31 ; public static final int IsSubRoutineEscaping = Bit15 ; public static final int IsTryBlockExiting = Bit30 ; public static final int ContainsAssertion = Bit1 ; public static final int IsLocalType = Bit9 ; public static final int IsAnonymousType = Bit10 ; public static final int IsMemberType = Bit11 ; public static final int HasAbstractMethods = Bit12 ; public static final int IsSecondaryType = Bit13 ; public static final int HasBeenGenerated = Bit14 ; public static final int HasLocalType = Bit2 ; public static final int HasBeenResolved = Bit5 ; public static final int ParenthesizedSHIFT = 21 ; public static final int ParenthesizedMASK = Bit22 | Bit23 | Bit24 | Bit25 | Bit26 | Bit27 | Bit28 | Bit29 ; public static final int IgnoreNoEffectAssignCheck = Bit30 ; public static final int IsStrictlyAssigned = Bit14 ; public static final int IsCompoundAssigned = Bit17 ; public static final int DiscardEnclosingInstance = Bit14 ; public static final int Unchecked = Bit17 ; public static final int ResolveJavadoc = Bit17 ; public static final int IsUsefulEmptyStatement = Bit1 ; public static final int UndocumentedEmptyBlock = Bit4 ; public static final int OverridingMethodWithSupercall = Bit5 ; public static final int CanBeStatic = Bit9 ; public static final int ErrorInSignature = Bit6 ; public static final int NeedFreeReturn = Bit7 ; public static final int IsDefaultConstructor = Bit8 ; public static final int HasAllMethodBodies = Bit5 ; public static final int IsImplicitUnit = Bit1 ; public static final int InsideJavadoc = Bit16 ; public static final int SuperAccess = Bit15 ; public static final int Empty = Bit19 ; public static final int IsElseIfStatement = Bit30 ; public static final int ThenExit = Bit31 ; public static final int IsElseStatementUnreachable = Bit8 ; public static final int IsThenStatementUnreachable = Bit9 ; public static final int IsSuperType = Bit5 ; public static final int IsVarArgs = Bit15 ; public static final int IgnoreRawTypeCheck = Bit31 ; public static final int IsAnnotationDefaultValue = Bit1 ; public static final int IsNonNull = Bit18 ; public static final int NeededScope = Bit30 ; public static final int OnDemand = Bit18 ; public static final int Used = Bit2 ; public static final int DidResolve = Bit19 ; public static final int IsAnySubRoutineEscaping = Bit30 ; public static final int IsSynchronized = Bit31 ; public static final int BlockExit = Bit30 ; public static final int IsRecovered = Bit6 ; public static final int HasSyntaxErrors = Bit20 ; public static final int INVOCATION_ARGUMENT_OK = 0 ; public static final int INVOCATION_ARGUMENT_UNCHECKED = 1 ; public static final int INVOCATION_ARGUMENT_WILDCARD = 2 ; public static final int IsUnionType = Bit30 ; public static final int IsDiamond = Bit20 ; public static final int InsideExpressionStatement = Bit5 ; public ASTNode ( ) { super ( ) ; } private static int checkInvocationArgument ( BlockScope scope , Expression argument , TypeBinding parameterType , TypeBinding argumentType , TypeBinding originalParameterType ) { argument . computeConversion ( scope , parameterType , argumentType ) ; if ( argumentType != TypeBinding . NULL && parameterType . kind ( ) == Binding . WILDCARD_TYPE ) { WildcardBinding wildcard = ( WildcardBinding ) parameterType ; if ( wildcard . boundKind != Wildcard . SUPER ) { return INVOCATION_ARGUMENT_WILDCARD ; } } TypeBinding checkedParameterType = parameterType ; if ( argumentType != checkedParameterType && argumentType . needsUncheckedConversion ( checkedParameterType ) ) { scope . problemReporter ( ) . unsafeTypeConversion ( argument , argumentType , checkedParameterType ) ; return INVOCATION_ARGUMENT_UNCHECKED ; } return INVOCATION_ARGUMENT_OK ; } public static boolean checkInvocationArguments ( BlockScope scope , Expression receiver , TypeBinding receiverType , MethodBinding method , Expression [ ] arguments , TypeBinding [ ] argumentTypes , boolean argsContainCast , InvocationSite invocationSite ) { boolean is1_7 = scope . compilerOptions ( ) . sourceLevel >= ClassFileConstants . JDK1_7 ; if ( is1_7 && method . isPolymorphic ( ) ) { return false ; } TypeBinding [ ] params = method . parameters ; int paramLength = params . length ; boolean isRawMemberInvocation = ! method . isStatic ( ) && ! receiverType . isUnboundWildcard ( ) && method . declaringClass . isRawType ( ) && method . hasSubstitutedParameters ( ) ; boolean uncheckedBoundCheck = ( method . tagBits & TagBits . HasUncheckedTypeArgumentForBoundCheck ) != 0 ; MethodBinding rawOriginalGenericMethod = null ; if ( ! isRawMemberInvocation ) { if ( method instanceof ParameterizedGenericMethodBinding ) { ParameterizedGenericMethodBinding paramMethod = ( ParameterizedGenericMethodBinding ) method ; if ( paramMethod . isRaw && method . hasSubstitutedParameters ( ) ) { rawOriginalGenericMethod = method . original ( ) ; } } } int invocationStatus = INVOCATION_ARGUMENT_OK ; if ( arguments == null ) { if ( method . isVarargs ( ) ) { TypeBinding parameterType = ( ( ArrayBinding ) params [ paramLength - 1 ] ) . elementsType ( ) ; if ( ! parameterType . isReifiable ( ) && ( ! is1_7 || ( ( method . tagBits & TagBits . AnnotationSafeVarargs ) == 0 ) ) ) { scope . problemReporter ( ) . unsafeGenericArrayForVarargs ( parameterType , ( ASTNode ) invocationSite ) ; } } } else { if ( method . isVarargs ( ) ) { int lastIndex = paramLength - 1 ; for ( int i = 0 ; i < lastIndex ; i ++ ) { TypeBinding originalRawParam = rawOriginalGenericMethod == null ? null : rawOriginalGenericMethod . parameters [ i ] ; invocationStatus |= checkInvocationArgument ( scope , arguments [ i ] , params [ i ] , argumentTypes [ i ] , originalRawParam ) ; } int argLength = arguments . length ; if ( lastIndex <= argLength ) { TypeBinding parameterType = params [ lastIndex ] ; TypeBinding originalRawParam = null ; if ( paramLength != argLength || parameterType . dimensions ( ) != argumentTypes [ lastIndex ] . dimensions ( ) ) { parameterType = ( ( ArrayBinding ) parameterType ) . elementsType ( ) ; if ( ! parameterType . isReifiable ( ) && ( ! is1_7 || ( ( method . tagBits & TagBits . AnnotationSafeVarargs ) == 0 ) ) ) { scope . problemReporter ( ) . unsafeGenericArrayForVarargs ( parameterType , ( ASTNode ) invocationSite ) ; } originalRawParam = rawOriginalGenericMethod == null ? null : ( ( ArrayBinding ) rawOriginalGenericMethod . parameters [ lastIndex ] ) . elementsType ( ) ; } for ( int i = lastIndex ; i < argLength ; i ++ ) { invocationStatus |= checkInvocationArgument ( scope , arguments [ i ] , parameterType , argumentTypes [ i ] , originalRawParam ) ; } } if ( paramLength == argLength ) { int varargsIndex = paramLength - 1 ; ArrayBinding varargsType = ( ArrayBinding ) params [ varargsIndex ] ; TypeBinding lastArgType = argumentTypes [ varargsIndex ] ; int dimensions ; if ( lastArgType == TypeBinding . NULL ) { if ( ! ( varargsType . leafComponentType ( ) . isBaseType ( ) && varargsType . dimensions ( ) == 1 ) ) scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } else if ( varargsType . dimensions <= ( dimensions = lastArgType . dimensions ( ) ) ) { if ( lastArgType . leafComponentType ( ) . isBaseType ( ) ) { dimensions -- ; } if ( varargsType . dimensions < dimensions ) { scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } else if ( varargsType . dimensions == dimensions && lastArgType != varargsType && lastArgType . leafComponentType ( ) . erasure ( ) != varargsType . leafComponentType . erasure ( ) && lastArgType . isCompatibleWith ( varargsType . elementsType ( ) ) && lastArgType . isCompatibleWith ( varargsType ) ) { scope . problemReporter ( ) . varargsArgumentNeedCast ( method , lastArgType , invocationSite ) ; } } } } else { for ( int i = 0 ; i < paramLength ; i ++ ) { TypeBinding originalRawParam = rawOriginalGenericMethod == null ? null : rawOriginalGenericMethod . parameters [ i ] ; invocationStatus |= checkInvocationArgument ( scope , arguments [ i ] , params [ i ] , argumentTypes [ i ] , originalRawParam ) ; } } if ( argsContainCast ) { CastExpression . checkNeedForArgumentCasts ( scope , receiver , receiverType , method , arguments , argumentTypes , invocationSite ) ; } } if ( ( invocationStatus & INVOCATION_ARGUMENT_WILDCARD ) != 0 ) { scope . problemReporter ( ) . wildcardInvocation ( ( ASTNode ) invocationSite , receiverType , method , argumentTypes ) ; } else if ( ! method . isStatic ( ) && ! receiverType . isUnboundWildcard ( ) && method . declaringClass . isRawType ( ) && method . hasSubstitutedParameters ( ) ) { if ( scope . compilerOptions ( ) . reportUnavoidableGenericTypeProblems || receiver == null || ! receiver . forcedToBeRaw ( scope . referenceContext ( ) ) ) { scope . problemReporter ( ) . unsafeRawInvocation ( ( ASTNode ) invocationSite , method ) ; } } else if ( rawOriginalGenericMethod != null || uncheckedBoundCheck || ( ( invocationStatus & INVOCATION_ARGUMENT_UNCHECKED ) != 0 && method instanceof ParameterizedGenericMethodBinding ) ) { scope . problemReporter ( ) . unsafeRawGenericMethodInvocation ( ( ASTNode ) invocationSite , method , argumentTypes ) ; return true ; } return false ; } public ASTNode concreteStatement ( ) { return this ; } public final boolean isFieldUseDeprecated ( FieldBinding field , Scope scope , int filteredBits ) { if ( ( this . bits & ASTNode . InsideJavadoc ) == 0 && ( filteredBits & IsStrictlyAssigned ) == 0 && field . isOrEnclosedByPrivateType ( ) && ! scope . isDefinedInField ( field ) ) { if ( ( ( filteredBits & IsCompoundAssigned ) != 0 ) ) field . original ( ) . compoundUseFlag ++ ; else field . original ( ) . modifiers |= ExtraCompilerModifiers . AccLocallyUsed ; } if ( ( field . modifiers & ExtraCompilerModifiers . AccRestrictedAccess ) != 0 ) { AccessRestriction restriction = scope . environment ( ) . getAccessRestriction ( field . declaringClass . erasure ( ) ) ; if ( restriction != null ) { scope . problemReporter ( ) . forbiddenReference ( field , this , restriction . classpathEntryType , restriction . classpathEntryName , restriction . getProblemId ( ) ) ; } } if ( ! field . isViewedAsDeprecated ( ) ) return false ; if ( scope . isDefinedInSameUnit ( field . declaringClass ) ) return false ; if ( ! scope . compilerOptions ( ) . reportDeprecationInsideDeprecatedCode && scope . isInsideDeprecatedCode ( ) ) return false ; return true ; } public boolean isImplicitThis ( ) { return false ; } public final boolean isMethodUseDeprecated ( MethodBinding method , Scope scope , boolean isExplicitUse ) { if ( ( this . bits & ASTNode . InsideJavadoc ) == 0 && method . isOrEnclosedByPrivateType ( ) && ! scope . isDefinedInMethod ( method ) ) { method . original ( ) . modifiers |= ExtraCompilerModifiers . AccLocallyUsed ; } if ( isExplicitUse && ( method . modifiers & ExtraCompilerModifiers . AccRestrictedAccess ) != 0 ) { AccessRestriction restriction = scope . environment ( ) . getAccessRestriction ( method . declaringClass . erasure ( ) ) ; if ( restriction != null ) { scope . problemReporter ( ) . forbiddenReference ( method , this , restriction . classpathEntryType , restriction . classpathEntryName , restriction . getProblemId ( ) ) ; } } if ( ! method . isViewedAsDeprecated ( ) ) return false ; if ( scope . isDefinedInSameUnit ( method . declaringClass ) ) return false ; if ( ! isExplicitUse && ( method . modifiers & ClassFileConstants . AccDeprecated ) == 0 ) { return false ; } if ( ! scope . compilerOptions ( ) . reportDeprecationInsideDeprecatedCode && scope . isInsideDeprecatedCode ( ) ) return false ; return true ; } public boolean isSuper ( ) { return false ; } public boolean isThis ( ) { return false ; } public final boolean isTypeUseDeprecated ( TypeBinding type , Scope scope ) { if ( type . isArrayType ( ) ) { type = ( ( ArrayBinding ) type ) . leafComponentType ; } if ( type . isBaseType ( ) ) return false ; ReferenceBinding refType = ( ReferenceBinding ) type ; if ( ( this . bits & ASTNode . InsideJavadoc ) == 0 && refType . isOrEnclosedByPrivateType ( ) && ! scope . isDefinedInType ( refType ) ) { ( ( ReferenceBinding ) refType . erasure ( ) ) . modifiers |= ExtraCompilerModifiers . AccLocallyUsed ; } if ( refType . hasRestrictedAccess ( ) ) { AccessRestriction restriction = scope . environment ( ) . getAccessRestriction ( type . erasure ( ) ) ; if ( restriction != null ) { scope . problemReporter ( ) . forbiddenReference ( type , this , restriction . classpathEntryType , restriction . classpathEntryName , restriction . getProblemId ( ) ) ; } } refType . initializeDeprecatedAnnotationTagBits ( ) ; if ( ! refType . isViewedAsDeprecated ( ) ) return false ; if ( scope . isDefinedInSameUnit ( refType ) ) return false ; if ( ! scope . compilerOptions ( ) . reportDeprecationInsideDeprecatedCode && scope . isInsideDeprecatedCode ( ) ) return false ; return true ; } public abstract StringBuffer print ( int indent , StringBuffer output ) ; public static StringBuffer printAnnotations ( Annotation [ ] annotations , StringBuffer output ) { int length = annotations . length ; for ( int i = 0 ; i < length ; i ++ ) { annotations [ i ] . print ( 0 , output ) ; output . append ( " " ) ; } return output ; } public static StringBuffer printIndent ( int indent , StringBuffer output ) { for ( int i = indent ; i > 0 ; i -- ) output . append ( " " ) ; return output ; } public static StringBuffer printModifiers ( int modifiers , StringBuffer output ) { if ( ( modifiers & ClassFileConstants . AccPublic ) != 0 ) output . append ( "public " ) ; if ( ( modifiers & ClassFileConstants . AccPrivate ) != 0 ) output . append ( "private " ) ; if ( ( modifiers & ClassFileConstants . AccProtected ) != 0 ) output . append ( "protected " ) ; if ( ( modifiers & ClassFileConstants . AccStatic ) != 0 ) output . append ( "static " ) ; if ( ( modifiers & ClassFileConstants . AccFinal ) != 0 ) output . append ( "final " ) ; if ( ( modifiers & ClassFileConstants . AccSynchronized ) != 0 ) output . append ( "" ) ; if ( ( modifiers & ClassFileConstants . AccVolatile ) != 0 ) output . append ( "volatile " ) ; if ( ( modifiers & ClassFileConstants . AccTransient ) != 0 ) output . append ( "transient " ) ; if ( ( modifiers & ClassFileConstants . AccNative ) != 0 ) output . append ( "native " ) ; if ( ( modifiers & ClassFileConstants . AccAbstract ) != 0 ) output . append ( "abstract " ) ; return output ; } public static void resolveAnnotations ( BlockScope scope , Annotation [ ] sourceAnnotations , Binding recipient ) { AnnotationBinding [ ] annotations = null ; int length = sourceAnnotations == null ? 0 : sourceAnnotations . length ; if ( recipient != null ) { switch ( recipient . kind ( ) ) { case Binding . PACKAGE : PackageBinding packageBinding = ( PackageBinding ) recipient ; if ( ( packageBinding . tagBits & TagBits . AnnotationResolved ) != 0 ) return ; packageBinding . tagBits |= ( TagBits . AnnotationResolved | TagBits . DeprecatedAnnotationResolved ) ; break ; case Binding . TYPE : case Binding . GENERIC_TYPE : ReferenceBinding type = ( ReferenceBinding ) recipient ; if ( ( type . tagBits & TagBits . AnnotationResolved ) != 0 ) return ; type . tagBits |= ( TagBits . AnnotationResolved | TagBits . DeprecatedAnnotationResolved ) ; if ( length > 0 ) { annotations = new AnnotationBinding [ length ] ; type . setAnnotations ( annotations ) ; } break ; case Binding . METHOD : MethodBinding method = ( MethodBinding ) recipient ; if ( ( method . tagBits & TagBits . AnnotationResolved ) != 0 ) return ; method . tagBits |= ( TagBits . AnnotationResolved | TagBits . DeprecatedAnnotationResolved ) ; if ( length > 0 ) { annotations = new AnnotationBinding [ length ] ; method . setAnnotations ( annotations ) ; } break ; case Binding . FIELD : FieldBinding field = ( FieldBinding ) recipient ; if ( ( field . tagBits & TagBits . AnnotationResolved ) != 0 ) return ; field . tagBits |= ( TagBits . AnnotationResolved | TagBits . DeprecatedAnnotationResolved ) ; if ( length > 0 ) { annotations = new AnnotationBinding [ length ] ; field . setAnnotations ( annotations ) ; } break ; case Binding . LOCAL : LocalVariableBinding local = ( LocalVariableBinding ) recipient ; if ( ( local . tagBits & TagBits . AnnotationResolved ) != 0 ) return ; local . tagBits |= ( TagBits . AnnotationResolved | TagBits . DeprecatedAnnotationResolved ) ; if ( length > 0 ) { annotations = new AnnotationBinding [ length ] ; local . setAnnotations ( annotations ) ; } break ; default : return ; } } if ( sourceAnnotations == null ) return ; for ( int i = 0 ; i < length ; i ++ ) { Annotation annotation = sourceAnnotations [ i ] ; final Binding annotationRecipient = annotation . recipient ; if ( annotationRecipient != null && recipient != null ) { switch ( recipient . kind ( ) ) { case Binding . FIELD : FieldBinding field = ( FieldBinding ) recipient ; field . tagBits = ( ( FieldBinding ) annotationRecipient ) . tagBits ; if ( annotations != null ) { for ( int j = 0 ; j < length ; j ++ ) { Annotation annot = sourceAnnotations [ j ] ; annotations [ j ] = annot . getCompilerAnnotation ( ) ; } } break ; case Binding . LOCAL : LocalVariableBinding local = ( LocalVariableBinding ) recipient ; long otherLocalTagBits = ( ( LocalVariableBinding ) annotationRecipient ) . tagBits ; local . tagBits = otherLocalTagBits ; if ( ( otherLocalTagBits & TagBits . AnnotationSuppressWarnings ) == 0 ) { if ( annotations != null ) { for ( int j = 0 ; j < length ; j ++ ) { Annotation annot = sourceAnnotations [ j ] ; annotations [ j ] = annot . getCompilerAnnotation ( ) ; } } } else if ( annotations != null ) { LocalDeclaration localDeclaration = local . declaration ; int declarationSourceEnd = localDeclaration . declarationSourceEnd ; int declarationSourceStart = localDeclaration . declarationSourceStart ; for ( int j = 0 ; j < length ; j ++ ) { Annotation annot = sourceAnnotations [ j ] ; AnnotationBinding annotationBinding = annot . getCompilerAnnotation ( ) ; annotations [ j ] = annotationBinding ; if ( annotationBinding != null ) { final ReferenceBinding annotationType = annotationBinding . getAnnotationType ( ) ; if ( annotationType != null && annotationType . id == TypeIds . T_JavaLangSuppressWarnings ) { annot . recordSuppressWarnings ( scope , declarationSourceStart , declarationSourceEnd , scope . compilerOptions ( ) . suppressWarnings ) ; } } } } break ; } return ; } else { annotation . recipient = recipient ; annotation . resolveType ( scope ) ; if ( annotations != null ) { annotations [ i ] = annotation . getCompilerAnnotation ( ) ; } } } if ( annotations != null ) { AnnotationBinding [ ] distinctAnnotations = annotations ; for ( int i = 0 ; i < length ; i ++ ) { AnnotationBinding annotation = distinctAnnotations [ i ] ; if ( annotation == null ) continue ; TypeBinding annotationType = annotation . getAnnotationType ( ) ; boolean foundDuplicate = false ; for ( int j = i + 1 ; j < length ; j ++ ) { AnnotationBinding otherAnnotation = distinctAnnotations [ j ] ; if ( otherAnnotation == null ) continue ; if ( otherAnnotation . getAnnotationType ( ) == annotationType ) { foundDuplicate = true ; if ( distinctAnnotations == annotations ) { System . arraycopy ( distinctAnnotations , 0 , distinctAnnotations = new AnnotationBinding [ length ] , 0 , length ) ; } distinctAnnotations [ j ] = null ; scope . problemReporter ( ) . duplicateAnnotation ( sourceAnnotations [ j ] ) ; } } if ( foundDuplicate ) { scope . problemReporter ( ) . duplicateAnnotation ( sourceAnnotations [ i ] ) ; } } } } public static void resolveDeprecatedAnnotations ( BlockScope scope , Annotation [ ] annotations , Binding recipient ) { if ( recipient != null ) { int kind = recipient . kind ( ) ; if ( annotations != null ) { int length ; if ( ( length = annotations . length ) >= 0 ) { switch ( kind ) { case Binding . PACKAGE : PackageBinding packageBinding = ( PackageBinding ) recipient ; if ( ( packageBinding . tagBits & TagBits . DeprecatedAnnotationResolved ) != 0 ) return ; break ; case Binding . TYPE : case Binding . GENERIC_TYPE : ReferenceBinding type = ( ReferenceBinding ) recipient ; if ( ( type . tagBits & TagBits . DeprecatedAnnotationResolved ) != 0 ) return ; break ; case Binding . METHOD : MethodBinding method = ( MethodBinding ) recipient ; if ( ( method . tagBits & TagBits . DeprecatedAnnotationResolved ) != 0 ) return ; break ; case Binding . FIELD : FieldBinding field = ( FieldBinding ) recipient ; if ( ( field . tagBits & TagBits . DeprecatedAnnotationResolved ) != 0 ) return ; break ; case Binding . LOCAL : LocalVariableBinding local = ( LocalVariableBinding ) recipient ; if ( ( local . tagBits & TagBits . DeprecatedAnnotationResolved ) != 0 ) return ; break ; default : return ; } for ( int i = 0 ; i < length ; i ++ ) { TypeReference annotationTypeRef = annotations [ i ] . type ; if ( ! CharOperation . equals ( TypeConstants . JAVA_LANG_DEPRECATED [ 2 ] , annotationTypeRef . getLastToken ( ) ) ) return ; TypeBinding annotationType = annotations [ i ] . type . resolveType ( scope ) ; if ( annotationType != null && annotationType . isValidBinding ( ) && annotationType . id == TypeIds . T_JavaLangDeprecated ) { switch ( kind ) { case Binding . PACKAGE : PackageBinding packageBinding = ( PackageBinding ) recipient ; packageBinding . tagBits |= ( TagBits . AnnotationDeprecated | TagBits . DeprecatedAnnotationResolved ) ; return ; case Binding . TYPE : case Binding . GENERIC_TYPE : case Binding . TYPE_PARAMETER : ReferenceBinding type = ( ReferenceBinding ) recipient ; type . tagBits |= ( TagBits . AnnotationDeprecated | TagBits . DeprecatedAnnotationResolved ) ; return ; case Binding . METHOD : MethodBinding method = ( MethodBinding ) recipient ; method . tagBits |= ( TagBits . AnnotationDeprecated | TagBits . DeprecatedAnnotationResolved ) ; return ; case Binding . FIELD : FieldBinding field = ( FieldBinding ) recipient ; field . tagBits |= ( TagBits . AnnotationDeprecated | TagBits . DeprecatedAnnotationResolved ) ; return ; case Binding . LOCAL : LocalVariableBinding local = ( LocalVariableBinding ) recipient ; local . tagBits |= ( TagBits . AnnotationDeprecated | TagBits . DeprecatedAnnotationResolved ) ; return ; default : return ; } } } } } switch ( kind ) { case Binding . PACKAGE : PackageBinding packageBinding = ( PackageBinding ) recipient ; packageBinding . tagBits |= TagBits . DeprecatedAnnotationResolved ; return ; case Binding . TYPE : case Binding . GENERIC_TYPE : case Binding . TYPE_PARAMETER : ReferenceBinding type = ( ReferenceBinding ) recipient ; type . tagBits |= TagBits . DeprecatedAnnotationResolved ; return ; case Binding . METHOD : MethodBinding method = ( MethodBinding ) recipient ; method . tagBits |= TagBits . DeprecatedAnnotationResolved ; return ; case Binding . FIELD : FieldBinding field = ( FieldBinding ) recipient ; field . tagBits |= TagBits . DeprecatedAnnotationResolved ; return ; case Binding . LOCAL : LocalVariableBinding local = ( LocalVariableBinding ) recipient ; local . tagBits |= TagBits . DeprecatedAnnotationResolved ; return ; default : return ; } } } public int sourceStart ( ) { return this . sourceStart ; } public int sourceEnd ( ) { return this . sourceEnd ; } public String toString ( ) { return print ( 0 , new StringBuffer ( 30 ) ) . toString ( ) ; } public void traverse ( ASTVisitor visitor , BlockScope scope ) { } } </s>