Class ExpressionSymbol
- All Implemented Interfaces:
Serializable, ISymbol, ISymbolNature, ITokenReference
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionExpressionSymbol(String name) ExpressionSymbol(ISymbol symbol) Create a new expression based around an existing symbol. -
Method Summary
Modifier and TypeMethodDescriptionClone the symbol and re-parent if this symbol like a method should have a parent.protected ExpressionSymbolbooleanTwo symbols are the same symbol when they agree on name, category, genus, mutability AND the declaration site they came from.Provide the name an end user would need to see on the screen.inthashCode()Mixes in exactly the fieldsSymbol.equals(Object)compares, and nothing else.booleanbooleanOnly use on symbols, to see if they are directly defined as a constant.booleanEven constants can be mutable until set.booleanbooleanvoidsetDeclaredAsConstant(boolean declaredAsConstant) voidvoidsetPromotionRequired(boolean promotionRequired) voidsetSourceToken(IToken sourceToken) voidsetUseStringOperator(boolean useStringOperator) Methods inherited from class Symbol
clearInitialisedBy, cloneIntoSymbol, copySymbolProperties, getAssignableCostTo, getAssignableCostTo, getCategory, getFullyQualifiedName, getGenus, getInitialisedBy, getName, getParsedModule, getProduceFullyQualifiedName, getSourceToken, getSquirrelledData, getSymbolTypeAsString, getType, getUnCoercedAssignableCostTo, isAssignableTo, isAssignableTo, isDevSource, isEk9Core, isExactSameType, isInjectionExpected, isLibSource, isMarkedPure, isNullAllowed, isPromotionSupported, isReferenced, putSquirrelledData, setCategory, setEk9Core, setGenus, setInitialisedBy, setInjectionExpected, setMarkedPure, setName, setNullAllowed, setParsedModule, setProduceFullyQualifiedName, setReferenced, setType, toStringMethods inherited from interface ISymbol
isExtensionOfInjectable, isFromLiteral, isIncomingParameter, isInitialised, isInjectable, isLoopVariable, isMarkedAbstract, isPrivate, isPropertyField, isProtected, isPublic, isReturningParameter, setTypeMethods inherited from interface ISymbolNature
isApplication, isConceptualTypeParameter, isControl, isFunction, isGenericInNature, isMethod, isParameterisedType, isPrimitiveType, isTemplateFunction, isTemplateType, isType, isVariable
-
Constructor Details
-
ExpressionSymbol
Create a new expression based around an existing symbol. -
ExpressionSymbol
-
-
Method Details
-
clone
Description copied from interface:ISymbolClone the symbol and re-parent if this symbol like a method should have a parent. Other symbols like VariableSymbols are un-parented -
cloneIntoExpressionSymbol
-
getFriendlyName
Description copied from interface:ISymbolProvide the name an end user would need to see on the screen. Normally this is just 'getName' but in the case of Templates We use a very nasty internal naming for List of SomeClass - which will probably be something like _List_hashed_version_of_ComeClass and the end user needs to see 'List of SomeClass' for it to be meaningful.- Specified by:
getFriendlyNamein interfaceISymbol- Overrides:
getFriendlyNamein classSymbol- Returns:
- a user presentable of the symbol name.
-
isDeclaredAsConstant
public boolean isDeclaredAsConstant()Description copied from interface:ISymbolOnly use on symbols, to see if they are directly defined as a constant. -
setDeclaredAsConstant
public void setDeclaredAsConstant(boolean declaredAsConstant) -
isMutable
public boolean isMutable()Description copied from interface:ISymbolEven constants can be mutable until set. then they change to being none mutable. Likewise in 'pure' scopes a variable can be mutable until it is first set then none mutable. -
isConstant
public boolean isConstant() -
setNotMutable
public void setNotMutable()- Specified by:
setNotMutablein interfaceISymbol- Overrides:
setNotMutablein classSymbol
-
isPromotionRequired
public boolean isPromotionRequired() -
setPromotionRequired
public void setPromotionRequired(boolean promotionRequired) -
isUseStringOperator
public boolean isUseStringOperator() -
setUseStringOperator
public void setUseStringOperator(boolean useStringOperator) -
setSourceToken
- Specified by:
setSourceTokenin interfaceITokenReference- Overrides:
setSourceTokenin classSymbol
-
equals
Description copied from class:SymbolTwo symbols are the same symbol when they agree on name, category, genus, mutability AND the declaration site they came from.The source token is part of identity deliberately. Name alone is not enough: symbol names are unqualified here, so two unrelated variables both called
count, or two types calledFooin different modules, would otherwise compare equal. The compiler relies on telling those apart -CodeFlowMapkeys initialisation state onMap<IScope, Map<ISymbol, SymbolAccess>>, and conflating two same-named declarations there makes flow analysis attribute one variable's initialisation to another.That distinction used to be present ONLY in
Symbol.hashCode(), which is why this looked like it worked: two same-named symbols compared equal yet hashed apart, so hash collections usually - but not reliably - kept them separate, while any directequalscall saw them as one. Encoding it here makes the two agree. SeeSymbolEqualsHashCodeContractTest. -
hashCode
public int hashCode()Description copied from class:SymbolMixes in exactly the fieldsSymbol.equals(Object)compares, and nothing else.A hashCode may legitimately use FEWER fields than equals (that only causes collisions, which are correct), but never MORE: any extra field makes two symbols that compare equal land in different buckets, so a HashSet silently holds visible duplicates and a HashMap lookup misses an entry that is present. This method used to mix in purity, which no equals at THIS level consults - purity belongs in
FunctionSymbol, the level whose equals compares it. The source token stays, and is now matched bySymbol.equals(Object). SeeSymbolEqualsHashCodeContractTest.
-