<s> package org . eclipse . jdt . internal . compiler . ast ; import org . eclipse . jdt . core . compiler . IProblem ; import org . eclipse . jdt . internal . compiler . ASTVisitor ; import org . eclipse . jdt . internal . compiler . classfmt . ClassFileConstants ; import org . eclipse . jdt . internal . compiler . codegen . * ; import org . eclipse . jdt . internal . compiler . flow . * ; import org . eclipse . jdt . internal . compiler . impl . Constant ; import org . eclipse . jdt . internal . compiler . lookup . * ; import org . eclipse . jdt . internal . compiler . problem . ProblemReporter ; import org . eclipse . jdt . internal . compiler . problem . ProblemSeverities ; public class AllocationExpression extends Expression implements InvocationSite { public TypeReference type ; public Expression [ ] arguments ; public MethodBinding binding ; MethodBinding syntheticAccessor ; public TypeReference [ ] typeArguments ; public TypeBinding [ ] genericTypeArguments ; public FieldDeclaration enumConstant ; protected TypeBinding typeExpected ; public boolean inferredReturnType ; public FlowInfo analyseCode ( BlockScope currentScope , FlowContext flowContext , FlowInfo flowInfo ) { checkCapturedLocalInitializationIfNecessary ( ( ReferenceBinding ) this . binding . declaringClass . erasure ( ) , currentScope , flowInfo ) ; if ( this . arguments != null ) { for ( int i = 0 , count = this . arguments . length ; i < count ; i ++ ) { flowInfo = this . arguments [ i ] . analyseCode ( currentScope , flowContext , flowInfo ) . unconditionalInits ( ) ; if ( ( this . arguments [ i ] . implicitConversion & TypeIds . UNBOXING ) != 0 ) { this . arguments [ i ] . checkNPE ( currentScope , flowContext , flowInfo ) ; } } } ReferenceBinding [ ] thrownExceptions ; if ( ( ( thrownExceptions = this . binding . thrownExceptions ) . length ) != 0 ) { if ( ( this . bits & ASTNode . Unchecked ) != 0 && this . genericTypeArguments == null ) { thrownExceptions = currentScope . environment ( ) . convertToRawTypes ( this . binding . thrownExceptions , true , true ) ; } flowContext . checkExceptionHandlers ( thrownExceptions , this , flowInfo . unconditionalCopy ( ) , currentScope ) ; } if ( this . binding . declaringClass . isMemberType ( ) && ! this . binding . declaringClass . isStatic ( ) ) { currentScope . resetEnclosingMethodStaticFlag ( ) ; } manageEnclosingInstanceAccessIfNecessary ( currentScope , flowInfo ) ; manageSyntheticAccessIfNecessary ( currentScope , flowInfo ) ; return flowInfo ; } public void checkCapturedLocalInitializationIfNecessary ( ReferenceBinding checkedType , BlockScope currentScope , FlowInfo flowInfo ) { if ( ( ( checkedType . tagBits & ( TagBits . AnonymousTypeMask | TagBits . LocalTypeMask ) ) == TagBits . LocalTypeMask ) && ! currentScope . isDefinedInType ( checkedType ) ) { NestedTypeBinding nestedType = ( NestedTypeBinding ) checkedType ; SyntheticArgumentBinding [ ] syntheticArguments = nestedType . syntheticOuterLocalVariables ( ) ; if ( syntheticArguments != null ) for ( int i = 0 , count = syntheticArguments . length ; i < count ; i ++ ) { SyntheticArgumentBinding syntheticArgument = syntheticArguments [ i ] ; LocalVariableBinding targetLocal ; if ( ( targetLocal = syntheticArgument . actualOuterLocalVariable ) == null ) continue ; if ( targetLocal . declaration != null && ! flowInfo . isDefinitelyAssigned ( targetLocal ) ) { currentScope . problemReporter ( ) . uninitializedLocalVariable ( targetLocal , this ) ; } } } } public Expression enclosingInstance ( ) { return null ; } public void generateCode ( BlockScope currentScope , CodeStream codeStream , boolean valueRequired ) { if ( ! valueRequired ) currentScope . problemReporter ( ) . unusedObjectAllocation ( this ) ; int pc = codeStream . position ; MethodBinding codegenBinding = this . binding . original ( ) ; ReferenceBinding allocatedType = codegenBinding . declaringClass ; codeStream . new_ ( allocatedType ) ; boolean isUnboxing = ( this . implicitConversion & TypeIds . UNBOXING ) != 0 ; if ( valueRequired || isUnboxing ) { codeStream . dup ( ) ; } if ( this . type != null ) { codeStream . recordPositionsFrom ( pc , this . type . sourceStart ) ; } else { codeStream . ldc ( String . valueOf ( this . enumConstant . name ) ) ; codeStream . generateInlinedValue ( this . enumConstant . binding . id ) ; } if ( allocatedType . isNestedType ( ) ) { codeStream . generateSyntheticEnclosingInstanceValues ( currentScope , allocatedType , enclosingInstance ( ) , this ) ; } generateArguments ( this . binding , this . arguments , currentScope , codeStream ) ; if ( allocatedType . isNestedType ( ) ) { codeStream . generateSyntheticOuterArgumentValues ( currentScope , allocatedType , this ) ; } if ( this . syntheticAccessor == null ) { codeStream . invoke ( Opcodes . OPC_invokespecial , codegenBinding , null ) ; } else { for ( int i = 0 , max = this . syntheticAccessor . parameters . length - codegenBinding . parameters . length ; i < max ; i ++ ) { codeStream . aconst_null ( ) ; } codeStream . invoke ( Opcodes . OPC_invokespecial , this . syntheticAccessor , null ) ; } if ( valueRequired ) { codeStream . generateImplicitConversion ( this . implicitConversion ) ; } else if ( isUnboxing ) { codeStream . generateImplicitConversion ( this . implicitConversion ) ; switch ( postConversionType ( currentScope ) . id ) { case T_long : case T_double : codeStream . pop2 ( ) ; break ; default : codeStream . pop ( ) ; } } codeStream . recordPositionsFrom ( pc , this . sourceStart ) ; } public TypeBinding [ ] genericTypeArguments ( ) { return this . genericTypeArguments ; } public boolean isSuperAccess ( ) { return false ; } public boolean isTypeAccess ( ) { return true ; } public void manageEnclosingInstanceAccessIfNecessary ( BlockScope currentScope , FlowInfo flowInfo ) { if ( ( flowInfo . tagBits & FlowInfo . UNREACHABLE_OR_DEAD ) != 0 ) return ; ReferenceBinding allocatedTypeErasure = ( ReferenceBinding ) this . binding . declaringClass . erasure ( ) ; if ( allocatedTypeErasure . isNestedType ( ) && currentScope . enclosingSourceType ( ) . isLocalType ( ) ) { if ( allocatedTypeErasure . isLocalType ( ) ) { ( ( LocalTypeBinding ) allocatedTypeErasure ) . addInnerEmulationDependent ( currentScope , false ) ; } else { currentScope . propagateInnerEmulation ( allocatedTypeErasure , false ) ; } } } public void manageSyntheticAccessIfNecessary ( BlockScope currentScope , FlowInfo flowInfo ) { if ( ( flowInfo . tagBits & FlowInfo . UNREACHABLE_OR_DEAD ) != 0 ) return ; MethodBinding codegenBinding = this . binding . original ( ) ; ReferenceBinding declaringClass ; if ( codegenBinding . isPrivate ( ) && currentScope . enclosingSourceType ( ) != ( declaringClass = codegenBinding . declaringClass ) ) { if ( ( declaringClass . tagBits & TagBits . IsLocalType ) != 0 && currentScope . compilerOptions ( ) . complianceLevel >= ClassFileConstants . JDK1_4 ) { codegenBinding . tagBits |= TagBits . ClearPrivateModifier ; } else { this . syntheticAccessor = ( ( SourceTypeBinding ) declaringClass ) . addSyntheticMethod ( codegenBinding , isSuperAccess ( ) ) ; currentScope . problemReporter ( ) . needToEmulateMethodAccess ( codegenBinding , this ) ; } } } public StringBuffer printExpression ( int indent , StringBuffer output ) { if ( this . type != null ) { output . append ( "new " ) ; } if ( this . typeArguments != null ) { output . append ( '<' ) ; int max = this . typeArguments . length - 1 ; for ( int j = 0 ; j < max ; j ++ ) { this . typeArguments [ j ] . print ( 0 , output ) ; output . append ( ", " ) ; } this . typeArguments [ max ] . print ( 0 , output ) ; output . append ( '>' ) ; } if ( this . type != null ) { this . type . printExpression ( 0 , output ) ; } output . append ( '(' ) ; if ( this . arguments != null ) { for ( int i = 0 ; i < this . arguments . length ; i ++ ) { if ( i > 0 ) output . append ( ", " ) ; this . arguments [ i ] . printExpression ( 0 , output ) ; } } return output . append ( ')' ) ; } public TypeBinding resolveType ( BlockScope scope ) { this . constant = Constant . NotAConstant ; if ( this . type == null ) { this . resolvedType = scope . enclosingReceiverType ( ) ; } else { this . resolvedType = this . type . resolveType ( scope , true ) ; checkParameterizedAllocation : { if ( this . type instanceof ParameterizedQualifiedTypeReference ) { ReferenceBinding currentType = ( ReferenceBinding ) this . resolvedType ; if ( currentType == null ) return currentType ; do { if ( ( currentType . modifiers & ClassFileConstants . AccStatic ) != 0 ) break checkParameterizedAllocation ; if ( currentType . isRawType ( ) ) break checkParameterizedAllocation ; } while ( ( currentType = currentType . enclosingType ( ) ) != null ) ; ParameterizedQualifiedTypeReference qRef = ( ParameterizedQualifiedTypeReference ) this . type ; for ( int i = qRef . typeArguments . length - 2 ; i >= 0 ; i -- ) { if ( qRef . typeArguments [ i ] != null ) { scope . problemReporter ( ) . illegalQualifiedParameterizedTypeAllocation ( this . type , this . resolvedType ) ; break ; } } } } } final boolean isDiamond = this . type != null && ( this . type . bits & ASTNode . IsDiamond ) != 0 ; if ( this . typeArguments != null ) { int length = this . typeArguments . length ; boolean argHasError = scope . compilerOptions ( ) . sourceLevel < ClassFileConstants . JDK1_5 ; this . genericTypeArguments = new TypeBinding [ length ] ; for ( int i = 0 ; i < length ; i ++ ) { TypeReference typeReference = this . typeArguments [ i ] ; if ( ( this . genericTypeArguments [ i ] = typeReference . resolveType ( scope , true ) ) == null ) { argHasError = true ; } if ( argHasError && typeReference instanceof Wildcard ) { scope . problemReporter ( ) . illegalUsageOfWildcard ( typeReference ) ; } } if ( isDiamond ) { scope . problemReporter ( ) . diamondNotWithExplicitTypeArguments ( this . typeArguments ) ; return null ; } if ( argHasError ) { if ( this . arguments != null ) { for ( int i = 0 , max = this . arguments . length ; i < max ; i ++ ) { this . arguments [ i ] . resolveType ( scope ) ; } } return null ; } } boolean argsContainCast = false ; TypeBinding [ ] argumentTypes = Binding . NO_PARAMETERS ; if ( this . arguments != null ) { boolean argHasError = false ; int length = this . arguments . length ; argumentTypes = new TypeBinding [ length ] ; for ( int i = 0 ; i < length ; i ++ ) { Expression argument = this . arguments [ i ] ; if ( argument instanceof CastExpression ) { argument . bits |= DisableUnnecessaryCastCheck ; argsContainCast = true ; } if ( ( argumentTypes [ i ] = argument . resolveType ( scope ) ) == null ) { argHasError = true ; } } if ( argHasError ) { if ( isDiamond ) { return null ; } if ( this . resolvedType instanceof ReferenceBinding ) { TypeBinding [ ] pseudoArgs = new TypeBinding [ length ] ; for ( int i = length ; -- i >= 0 ; ) { pseudoArgs [ i ] = argumentTypes [ i ] == null ? TypeBinding . NULL : argumentTypes [ i ] ; } this . binding = scope . findMethod ( ( ReferenceBinding ) this . resolvedType , TypeConstants . INIT , pseudoArgs , this ) ; if ( this . binding != null && ! this . binding . isValidBinding ( ) ) { MethodBinding closestMatch = ( ( ProblemMethodBinding ) this . binding ) . closestMatch ; if ( closestMatch != null ) { if ( closestMatch . original ( ) . typeVariables != Binding . NO_TYPE_VARIABLES ) { closestMatch = scope . environment ( ) . createParameterizedGenericMethod ( closestMatch . original ( ) , ( RawTypeBinding ) null ) ; } this . binding = closestMatch ; MethodBinding closestMatchOriginal = closestMatch . original ( ) ; if ( closestMatchOriginal . isOrEnclosedByPrivateType ( ) && ! scope . isDefinedInMethod ( closestMatchOriginal ) ) { closestMatchOriginal . modifiers |= ExtraCompilerModifiers . AccLocallyUsed ; } } } } return this . resolvedType ; } } if ( this . resolvedType == null || ! this . resolvedType . isValidBinding ( ) ) { return null ; } if ( this . type != null && ! this . resolvedType . canBeInstantiated ( ) ) { scope . problemReporter ( ) . cannotInstantiate ( this . type , this . resolvedType ) ; return this . resolvedType ; } if ( isDiamond ) { TypeBinding [ ] inferredTypes = inferElidedTypes ( ( ( ParameterizedTypeBinding ) this . resolvedType ) . genericType ( ) , null , argumentTypes , scope ) ; if ( inferredTypes == null ) { scope . problemReporter ( ) . cannotInferElidedTypes ( this ) ; return this . resolvedType = null ; } this . resolvedType = this . type . resolvedType = scope . environment ( ) . createParameterizedType ( ( ( ParameterizedTypeBinding ) this . resolvedType ) . genericType ( ) , inferredTypes , ( ( ParameterizedTypeBinding ) this . resolvedType ) . enclosingType ( ) ) ; } ReferenceBinding allocationType = ( ReferenceBinding ) this . resolvedType ; if ( ! ( this . binding = scope . getConstructor ( allocationType , argumentTypes , this ) ) . isValidBinding ( ) ) { if ( this . binding . declaringClass == null ) { this . binding . declaringClass = allocationType ; } if ( this . type != null && ! this . type . resolvedType . isValidBinding ( ) ) { return null ; } scope . problemReporter ( ) . invalidConstructor ( this , this . binding ) ; return this . resolvedType ; } if ( ( this . binding . tagBits & TagBits . HasMissingType ) != 0 ) { scope . problemReporter ( ) . missingTypeInConstructor ( this , this . binding ) ; } if ( isMethodUseDeprecated ( this . binding , scope , true ) ) scope . problemReporter ( ) . deprecatedMethod ( this . binding , this ) ; if ( checkInvocationArguments ( scope , null , allocationType , this . binding , this . arguments , argumentTypes , argsContainCast , this ) ) { this . bits |= ASTNode . Unchecked ; } if ( this . typeArguments != null && this . binding . original ( ) . typeVariables == Binding . NO_TYPE_VARIABLES ) { scope . problemReporter ( ) . unnecessaryTypeArgumentsForMethodInvocation ( this . binding , this . genericTypeArguments , this . typeArguments ) ; } if ( ! isDiamond && this . resolvedType . isParameterizedTypeWithActualArguments ( ) ) { checkTypeArgumentRedundancy ( ( ParameterizedTypeBinding ) this . resolvedType , null , argumentTypes , scope ) ; } return allocationType ; } public TypeBinding [ ] inferElidedTypes ( ReferenceBinding allocationType , ReferenceBinding enclosingType , TypeBinding [ ] argumentTypes , final BlockScope scope ) { MethodBinding factory = scope . getStaticFactory ( allocationType , enclosingType , argumentTypes , this ) ; if ( factory instanceof ParameterizedGenericMethodBinding && factory . isValidBinding ( ) ) { ParameterizedGenericMethodBinding genericFactory = ( ParameterizedGenericMethodBinding ) factory ; this . inferredReturnType = genericFactory . inferredReturnType ; return ( ( ParameterizedTypeBinding ) factory . returnType ) . arguments ; } return null ; } public void checkTypeArgumentRedundancy ( ParameterizedTypeBinding allocationType , ReferenceBinding enclosingType , TypeBinding [ ] argumentTypes , final BlockScope scope ) { ProblemReporter reporter = scope . problemReporter ( ) ; if ( ( reporter . computeSeverity ( IProblem . RedundantSpecificationOfTypeArguments ) == ProblemSeverities . Ignore ) || scope . compilerOptions ( ) . sourceLevel < ClassFileConstants . JDK1_7 ) return ; if ( allocationType . arguments == null ) return ; if ( this . genericTypeArguments != null ) return ; if ( argumentTypes == Binding . NO_PARAMETERS && this . typeExpected instanceof ParameterizedTypeBinding ) { ParameterizedTypeBinding expected = ( ParameterizedTypeBinding ) this . typeExpected ; if ( expected . arguments != null && allocationType . arguments . length == expected . arguments . length ) { int i ; for ( i = 0 ; i < allocationType . arguments . length ; i ++ ) { if ( allocationType . arguments [ i ] != expected . arguments [ i ] ) break ; } if ( i == allocationType . arguments . length ) { reporter . redundantSpecificationOfTypeArguments ( this . type , allocationType . arguments ) ; return ; } } } TypeBinding [ ] inferredTypes = inferElidedTypes ( allocationType . genericType ( ) , enclosingType , argumentTypes , scope ) ; if ( inferredTypes == null ) { return ; } for ( int i = 0 ; i < inferredTypes . length ; i ++ ) { if ( inferredTypes [ i ] != allocationType . arguments [ i ] ) return ; } reporter . redundantSpecificationOfTypeArguments ( this . type , allocationType . arguments ) ; } public void setActualReceiverType ( ReferenceBinding receiverType ) { } public void setDepth ( int i ) { } public void setFieldIndex ( int i ) { } public void traverse ( ASTVisitor visitor , BlockScope scope ) { if ( visitor . visit ( this , scope ) ) { if ( this . typeArguments != null ) { for ( int i = 0 , typeArgumentsLength = this . typeArguments . length ; i < typeArgumentsLength ; i ++ ) { this . typeArguments [ i ] . traverse ( visitor , scope ) ; } } if ( this . type != null ) { this . type . traverse ( visitor , scope ) ; } if ( this . arguments != null ) { for ( int i = 0 , argumentsLength = this . arguments . length ; i < argumentsLength ; i ++ ) this . arguments [ i ] . traverse ( visitor , scope ) ; } } visitor . endVisit ( this , scope ) ; } public void setExpectedType ( TypeBinding expectedType ) { this . typeExpected = expectedType ; } public TypeBinding expectedType ( ) { return this . typeExpected ; } } </s>