org.eclipse.jdt.internal.compiler.ast
Class Expression

java.lang.Object
  extended by org.eclipse.jdt.internal.compiler.ast.ASTNode
      extended by org.eclipse.jdt.internal.compiler.ast.Statement
          extended by org.eclipse.jdt.internal.compiler.ast.Expression
All Implemented Interfaces:
TypeConstants, TypeIds
Direct Known Subclasses:
AllocationExpression, Annotation, ArrayAllocationExpression, ArrayInitializer, Assignment, CastExpression, ClassLiteralAccess, JavadocArgumentExpression, Literal, MessageSend, OperatorExpression, Reference, TypeReference

public abstract class Expression
extends Statement


Field Summary
 Constant constant
           
 int implicitConversion
           
 TypeBinding resolvedType
           
 int statementEnd
           
 
Fields inherited from class org.eclipse.jdt.internal.compiler.ast.ASTNode
Bit1, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19, Bit2, Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27, Bit28, Bit29, Bit3, Bit30, Bit31, Bit32, Bit32L, Bit33L, Bit34L, Bit35L, Bit36L, Bit37L, Bit38L, Bit39L, Bit4, Bit40L, Bit41L, Bit42L, Bit43L, Bit44L, Bit45L, Bit46L, Bit47L, Bit48L, Bit49L, Bit5, Bit50L, Bit51L, Bit52L, Bit53L, Bit54L, Bit55L, Bit56L, Bit57L, Bit58L, Bit59L, Bit6, Bit60L, Bit61L, Bit62L, Bit63L, Bit64L, Bit7, Bit8, Bit9, bits, ContainsAssertion, DepthMASK, DepthSHIFT, DisableUnnecessaryCastCheck, DocumentedFallthrough, FirstAssignmentToLocal, GenerateCheckcast, HasAbstractMethods, HasAllMethodBodies, HasLocalType, IgnoreRawTypeCheck, InsideJavadoc, IsAnnotationDefaultValue, IsAnonymousType, IsCompoundAssigned, IsElseIfStatement, IsImplicitThis, IsLocalDeclarationReachable, IsLocalType, IsMemberType, IsNonNull, IsReachable, IsReturnedValue, IsSecondaryType, IsStrictlyAssigned, IsSubRoutineEscaping, IsSuperType, IsTryBlockExiting, IsUsefulEmptyStatement, IsVarArgs, LabelUsed, OperatorMASK, OperatorSHIFT, ParenthesizedMASK, ParenthesizedSHIFT, RestrictiveFlagMASK, ReturnTypeIDMASK, sourceEnd, sourceStart, UndocumentedEmptyBlock, UnnecessaryCast, UnsafeCast
 
Fields inherited from interface org.eclipse.jdt.internal.compiler.lookup.TypeConstants
ANNOTATION, ANNOTATION_PREFIX, ANNOTATION_SUFFIX, ANONYM_PREFIX, ANONYM_SUFFIX, BOOLEAN, BYTE, CHAR, CharArray_JAVA_IO_OBJECTINPUTSTREAM, CharArray_JAVA_IO_OBJECTOUTPUTSTREAM, CharArray_JAVA_IO_OBJECTSTREAMFIELD, CharArray_JAVA_LANG_ANNOTATION_ANNOTATION, CharArray_JAVA_LANG_ENUM, CharArray_JAVA_LANG_OBJECT, CLINIT, CLONE, CONSTRAINT_EQUAL, CONSTRAINT_EXTENDS, CONSTRAINT_SUPER, DOUBLE, FLOAT, GETCLASS, INIT, INT, IO, JAVA, JAVA_IO, JAVA_IO_PRINTSTREAM, JAVA_IO_SERIALIZABLE, JAVA_LANG, JAVA_LANG_ANNOTATION_ANNOTATION, JAVA_LANG_ANNOTATION_DOCUMENTED, JAVA_LANG_ANNOTATION_ELEMENTTYPE, JAVA_LANG_ANNOTATION_INHERITED, JAVA_LANG_ANNOTATION_RETENTION, JAVA_LANG_ANNOTATION_RETENTIONPOLICY, JAVA_LANG_ANNOTATION_TARGET, JAVA_LANG_ASSERTIONERROR, JAVA_LANG_BOOLEAN, JAVA_LANG_BYTE, JAVA_LANG_CHARACTER, JAVA_LANG_CLASS, JAVA_LANG_CLASSNOTFOUNDEXCEPTION, JAVA_LANG_CLONEABLE, JAVA_LANG_DEPRECATED, JAVA_LANG_DOUBLE, JAVA_LANG_ENUM, JAVA_LANG_ERROR, JAVA_LANG_EXCEPTION, JAVA_LANG_FLOAT, JAVA_LANG_ILLEGALARGUMENTEXCEPTION, JAVA_LANG_INTEGER, JAVA_LANG_ITERABLE, JAVA_LANG_LONG, JAVA_LANG_NOCLASSDEFERROR, JAVA_LANG_OBJECT, JAVA_LANG_OVERRIDE, JAVA_LANG_REFLECT_CONSTRUCTOR, JAVA_LANG_REFLECT_FIELD, JAVA_LANG_REFLECT_METHOD, JAVA_LANG_RUNTIMEEXCEPTION, JAVA_LANG_SHORT, JAVA_LANG_STRING, JAVA_LANG_STRINGBUFFER, JAVA_LANG_STRINGBUILDER, JAVA_LANG_SUPPRESSWARNINGS, JAVA_LANG_SYSTEM, JAVA_LANG_THROWABLE, JAVA_LANG_VOID, JAVA_UTIL_ITERATOR, LANG, LENGTH, LONG, MAIN, MISMATCH, NULL, OBJECT, OK, PACKAGE_INFO_NAME, READOBJECT, READRESOLVE, REFLECT, SERIALPERSISTENTFIELDS, SERIALVERSIONUID, SHORT, SYNTHETIC_ACCESS_METHOD_PREFIX, SYNTHETIC_ASSERT_DISABLED, SYNTHETIC_CLASS, SYNTHETIC_ENCLOSING_INSTANCE_PREFIX, SYNTHETIC_ENUM_VALUES, SYNTHETIC_OUTER_LOCAL_PREFIX, SYNTHETIC_SWITCH_ENUM_TABLE, TYPE, UNCHECKED, UPPER_ANNOTATION_TYPE, UPPER_CLASS, UPPER_CONSTRUCTOR, UPPER_FIELD, UPPER_LOCAL_VARIABLE, UPPER_METHOD, UPPER_PACKAGE, UPPER_PARAMETER, UPPER_RUNTIME, UPPER_SOURCE, VALUE, VALUEOF, VALUES, VOID, WILDCARD_CAPTURE, WILDCARD_CAPTURE_NAME, WILDCARD_EXTENDS, WILDCARD_MINUS, WILDCARD_NAME, WILDCARD_PLUS, WILDCARD_STAR, WILDCARD_SUPER, WRITEOBJECT, WRITEREPLACE
 
Fields inherited from interface org.eclipse.jdt.internal.compiler.lookup.TypeIds
Boolean2Boolean, Boolean2Int, Boolean2String, BOXING, Byte2Byte, Byte2Char, Byte2Double, Byte2Float, Byte2Int, Byte2Long, Byte2Short, Byte2String, Char2Byte, Char2Char, Char2Double, Char2Float, Char2Int, Char2Long, Char2Short, Char2String, COMPILE_TYPE_MASK, Double2Byte, Double2Char, Double2Double, Double2Float, Double2Int, Double2Long, Double2Short, Double2String, Float2Byte, Float2Char, Float2Double, Float2Float, Float2Int, Float2Long, Float2Short, Float2String, IMPLICIT_CONVERSION_MASK, Int2Byte, Int2Char, Int2Double, Int2Float, Int2Int, Int2Long, Int2Short, Int2String, Long2Byte, Long2Char, Long2Double, Long2Float, Long2Int, Long2Long, Long2Short, Long2String, NoId, Null2String, Object2Object, Object2String, Short2Byte, Short2Char, Short2Double, Short2Float, Short2Int, Short2Long, Short2Short, Short2String, String2String, T_boolean, T_byte, T_char, T_double, T_float, T_int, T_JavaIoPrintStream, T_JavaIoSerializable, T_JavaLangAnnotationAnnotation, T_JavaLangAnnotationDocumented, T_JavaLangAnnotationElementType, T_JavaLangAnnotationInherited, T_JavaLangAnnotationRetention, T_JavaLangAnnotationRetentionPolicy, T_JavaLangAnnotationTarget, T_JavaLangAssertionError, T_JavaLangBoolean, T_JavaLangByte, T_JavaLangCharacter, T_JavaLangClass, T_JavaLangClassNotFoundException, T_JavaLangCloneable, T_JavaLangDeprecated, T_JavaLangDouble, T_JavaLangEnum, T_JavaLangError, T_JavaLangException, T_JavaLangFloat, T_JavaLangIllegalArgumentException, T_JavaLangInteger, T_JavaLangIterable, T_JavaLangLong, T_JavaLangNoClassDefError, T_JavaLangObject, T_JavaLangOverride, T_JavaLangReflectConstructor, T_JavaLangReflectField, T_JavaLangReflectMethod, T_JavaLangRuntimeException, T_JavaLangShort, T_JavaLangString, T_JavaLangStringBuffer, T_JavaLangStringBuilder, T_JavaLangSuppressWarnings, T_JavaLangSystem, T_JavaLangThrowable, T_JavaLangVoid, T_JavaUtilIterator, T_long, T_null, T_short, T_undefined, T_void, UNBOXING
 
Constructor Summary
Expression()
           
 
Method Summary
 FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo)
           
 FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo, boolean valueRequired)
           
 boolean checkCastTypesCompatibility(Scope scope, TypeBinding castType, TypeBinding expressionType, Expression expression)
          Returns false if cast is not legal.
 void checkNPE(BlockScope scope, FlowContext flowContext, FlowInfo flowInfo)
          Check the local variable of this expression, if any, against potential NPEs given a flow context and an upstream flow info.
 boolean checkUnsafeCast(Scope scope, TypeBinding castType, TypeBinding expressionType, TypeBinding match, boolean isNarrowing)
           
 void computeConversion(Scope scope, TypeBinding runtimeType, TypeBinding compileTimeType)
          Base types need that the widening is explicitly done by the compiler using some bytecode like i2f.
 void generateCode(BlockScope currentScope, CodeStream codeStream)
          Expression statements are plain expressions, however they generate like normal expressions with no value required.
 void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired)
          Every expression is responsible for generating its implicit conversion when necessary.
 void generateOptimizedBoolean(BlockScope currentScope, CodeStream codeStream, BranchLabel trueLabel, BranchLabel falseLabel, boolean valueRequired)
          Default generation of a boolean value
 void generateOptimizedStringConcatenation(BlockScope blockScope, CodeStream codeStream, int typeID)
           
 void generateOptimizedStringConcatenationCreation(BlockScope blockScope, CodeStream codeStream, int typeID)
           
 boolean isCompactableOperation()
           
 boolean isConstantValueOfTypeAssignableToType(TypeBinding constantType, TypeBinding targetType)
           
static boolean isConstantValueRepresentable(Constant constant, int constantTypeID, int targetTypeID)
           
 boolean isTypeReference()
           
 LocalVariableBinding localVariableBinding()
          Returns the local variable referenced by this node.
 void markAsNonNull()
          Mark this expression as being non null, per a specific tag in the source code.
 int nullStatus(FlowInfo flowInfo)
           
 Constant optimizedBooleanConstant()
          Constant usable for bytecode pattern optimizations, but cannot be inlined since it is not strictly equivalent to the definition of constant expressions.
 TypeBinding postConversionType(Scope scope)
          Returns the type of the expression after required implicit conversions.
 java.lang.StringBuffer print(int indent, java.lang.StringBuffer output)
           
abstract  java.lang.StringBuffer printExpression(int indent, java.lang.StringBuffer output)
           
 java.lang.StringBuffer printStatement(int indent, java.lang.StringBuffer output)
           
 void resolve(BlockScope scope)
           
 TypeBinding resolveType(BlockScope scope)
           
 TypeBinding resolveType(ClassScope scope)
           
 TypeBinding resolveTypeExpecting(BlockScope scope, TypeBinding expectedType)
           
 java.lang.Object reusableJSRTarget()
          Returns an object which can be used to identify identical JSR sequence targets (see TryStatement subroutine codegen) or null if not reusable
 void setExpectedType(TypeBinding expectedType)
          Record the type expectation before this expression is typechecked.
 void tagAsNeedCheckCast()
           
 void tagAsUnnecessaryCast(Scope scope, TypeBinding castType)
           
 Expression toTypeReference()
           
 void traverse(ASTVisitor visitor, BlockScope scope)
           
 void traverse(ASTVisitor visitor, ClassScope scope)
           
 void traverse(ASTVisitor visitor, CompilationUnitScope scope)
           
 
Methods inherited from class org.eclipse.jdt.internal.compiler.ast.Statement
branchChainTo, complainIfUnreachable, generateArguments, isEmptyBlock, isValidJavaStatement, resolveCase
 
Methods inherited from class org.eclipse.jdt.internal.compiler.ast.ASTNode
checkInvocationArguments, concreteStatement, isFieldUseDeprecated, isImplicitThis, isMethodUseDeprecated, isSuper, isThis, isTypeUseDeprecated, printAnnotations, printIndent, printModifiers, resolveAnnotations, resolveDeprecatedAnnotations, sourceEnd, sourceStart, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

constant

public Constant constant

statementEnd

public int statementEnd

implicitConversion

public int implicitConversion

resolvedType

public TypeBinding resolvedType
Constructor Detail

Expression

public Expression()
Method Detail

isConstantValueRepresentable

public static final boolean isConstantValueRepresentable(Constant constant,
                                                         int constantTypeID,
                                                         int targetTypeID)

analyseCode

public FlowInfo analyseCode(BlockScope currentScope,
                            FlowContext flowContext,
                            FlowInfo flowInfo)
Specified by:
analyseCode in class Statement

analyseCode

public FlowInfo analyseCode(BlockScope currentScope,
                            FlowContext flowContext,
                            FlowInfo flowInfo,
                            boolean valueRequired)

checkCastTypesCompatibility

public final boolean checkCastTypesCompatibility(Scope scope,
                                                 TypeBinding castType,
                                                 TypeBinding expressionType,
                                                 Expression expression)
Returns false if cast is not legal.


checkNPE

public void checkNPE(BlockScope scope,
                     FlowContext flowContext,
                     FlowInfo flowInfo)
Check the local variable of this expression, if any, against potential NPEs given a flow context and an upstream flow info. If so, report the risk to the context. Marks the local as checked, which affects the flow info.

Parameters:
scope - the scope of the analysis
flowContext - the current flow context
flowInfo - the upstream flow info; caveat: may get modified

checkUnsafeCast

public boolean checkUnsafeCast(Scope scope,
                               TypeBinding castType,
                               TypeBinding expressionType,
                               TypeBinding match,
                               boolean isNarrowing)

computeConversion

public void computeConversion(Scope scope,
                              TypeBinding runtimeType,
                              TypeBinding compileTimeType)
Base types need that the widening is explicitly done by the compiler using some bytecode like i2f. Also check unsafe type operations.


generateCode

public void generateCode(BlockScope currentScope,
                         CodeStream codeStream)
Expression statements are plain expressions, however they generate like normal expressions with no value required.

Specified by:
generateCode in class Statement
Parameters:
currentScope - org.eclipse.jdt.internal.compiler.lookup.BlockScope
codeStream - org.eclipse.jdt.internal.compiler.codegen.CodeStream

generateCode

public void generateCode(BlockScope currentScope,
                         CodeStream codeStream,
                         boolean valueRequired)
Every expression is responsible for generating its implicit conversion when necessary.

Parameters:
currentScope - org.eclipse.jdt.internal.compiler.lookup.BlockScope
codeStream - org.eclipse.jdt.internal.compiler.codegen.CodeStream
valueRequired - boolean

generateOptimizedBoolean

public void generateOptimizedBoolean(BlockScope currentScope,
                                     CodeStream codeStream,
                                     BranchLabel trueLabel,
                                     BranchLabel falseLabel,
                                     boolean valueRequired)
Default generation of a boolean value

Parameters:
currentScope -
codeStream -
trueLabel -
falseLabel -
valueRequired -

generateOptimizedStringConcatenation

public void generateOptimizedStringConcatenation(BlockScope blockScope,
                                                 CodeStream codeStream,
                                                 int typeID)

generateOptimizedStringConcatenationCreation

public void generateOptimizedStringConcatenationCreation(BlockScope blockScope,
                                                         CodeStream codeStream,
                                                         int typeID)

isCompactableOperation

public boolean isCompactableOperation()

isConstantValueOfTypeAssignableToType

public boolean isConstantValueOfTypeAssignableToType(TypeBinding constantType,
                                                     TypeBinding targetType)

isTypeReference

public boolean isTypeReference()

localVariableBinding

public LocalVariableBinding localVariableBinding()
Returns the local variable referenced by this node. Can be a direct reference (SingleNameReference) or thru a cast expression etc...


markAsNonNull

public void markAsNonNull()
Mark this expression as being non null, per a specific tag in the source code.


nullStatus

public int nullStatus(FlowInfo flowInfo)

optimizedBooleanConstant

public Constant optimizedBooleanConstant()
Constant usable for bytecode pattern optimizations, but cannot be inlined since it is not strictly equivalent to the definition of constant expressions. In particular, some side-effects may be required to occur (only the end value is known).

Returns:
Constant known to be of boolean type

postConversionType

public TypeBinding postConversionType(Scope scope)
Returns the type of the expression after required implicit conversions. When expression type gets promoted or inserted a generic cast, the converted type will differ from the resolved type (surface side-effects from #computeConversion(...)).

Returns:
the type after conversion

print

public java.lang.StringBuffer print(int indent,
                                    java.lang.StringBuffer output)
Overrides:
print in class Statement

printExpression

public abstract java.lang.StringBuffer printExpression(int indent,
                                                       java.lang.StringBuffer output)

printStatement

public java.lang.StringBuffer printStatement(int indent,
                                             java.lang.StringBuffer output)
Specified by:
printStatement in class Statement

resolve

public void resolve(BlockScope scope)
Specified by:
resolve in class Statement

resolveType

public TypeBinding resolveType(BlockScope scope)

resolveType

public TypeBinding resolveType(ClassScope scope)

resolveTypeExpecting

public TypeBinding resolveTypeExpecting(BlockScope scope,
                                        TypeBinding expectedType)

reusableJSRTarget

public java.lang.Object reusableJSRTarget()
Returns an object which can be used to identify identical JSR sequence targets (see TryStatement subroutine codegen) or null if not reusable


setExpectedType

public void setExpectedType(TypeBinding expectedType)
Record the type expectation before this expression is typechecked. e.g. String s = foo();, foo() will be tagged as being expected of type String Used to trigger proper inference of generic method invocations.


tagAsNeedCheckCast

public void tagAsNeedCheckCast()

tagAsUnnecessaryCast

public void tagAsUnnecessaryCast(Scope scope,
                                 TypeBinding castType)

toTypeReference

public Expression toTypeReference()

traverse

public void traverse(ASTVisitor visitor,
                     BlockScope scope)
Overrides:
traverse in class ASTNode

traverse

public void traverse(ASTVisitor visitor,
                     ClassScope scope)

traverse

public void traverse(ASTVisitor visitor,
                     CompilationUnitScope scope)