Class VariableSymbol

java.lang.Object
org.ek9lang.compiler.symbols.Symbol
org.ek9lang.compiler.symbols.VariableSymbol
All Implemented Interfaces:
Serializable, ISymbol, ISymbolNature, ITokenReference

public class VariableSymbol extends Symbol
Models a variable.
See Also:
  • Constructor Details

  • Method Details

    • equals

      public boolean equals(Object o)
      Description copied from class: Symbol
      Two 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 called Foo in different modules, would otherwise compare equal. The compiler relies on telling those apart - CodeFlowMap keys initialisation state on Map<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 direct equals call saw them as one. Encoding it here makes the two agree. See SymbolEqualsHashCodeContractTest.

      Overrides:
      equals in class Symbol
    • hashCode

      public int hashCode()
      Description copied from class: Symbol
      Mixes in exactly the fields Symbol.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 by Symbol.equals(Object). See SymbolEqualsHashCodeContractTest.

      Overrides:
      hashCode in class Symbol
    • clone

      public VariableSymbol clone(IScope withParentAsAppropriate)
      Description copied from interface: ISymbol
      Clone the symbol and re-parent if this symbol like a method should have a parent. Other symbols like VariableSymbols are un-parented
      Specified by:
      clone in interface ISymbol
      Overrides:
      clone in class Symbol
    • cloneIntoVariable

      protected VariableSymbol cloneIntoVariable(VariableSymbol newCopy)
    • isPropertyField

      public boolean isPropertyField()
    • setAggregatePropertyField

      public void setAggregatePropertyField(boolean isAggregatePropertyField)
    • isPrivate

      public boolean isPrivate()
    • setPrivate

      public void setPrivate(boolean isPrivate)
    • isPublic

      public boolean isPublic()
    • isLoopVariable

      public boolean isLoopVariable()
    • setLoopVariable

      public void setLoopVariable(boolean asLoopVar)
    • isIncomingParameter

      public boolean isIncomingParameter()
    • setIncomingParameter

      public void setIncomingParameter(boolean incomingParameter)
    • isReturningParameter

      public boolean isReturningParameter()
    • setReturningParameter

      public void setReturningParameter(boolean returningParameter)
    • isMutable

      public boolean isMutable()
      Description copied from interface: ISymbol
      Even 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.
      Specified by:
      isMutable in interface ISymbol
      Overrides:
      isMutable in class Symbol
      Returns:
      If this symbol is mutable or not.
    • getFriendlyName

      public String getFriendlyName()
      Description copied from interface: ISymbol
      Provide 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:
      getFriendlyName in interface ISymbol
      Overrides:
      getFriendlyName in class Symbol
      Returns:
      a user presentable of the symbol name.