Always create TVariables for TIntermSymbol nodes

TIntermSymbol nodes are now constructed based on a specific TVariable.
This makes sure that all TIntermSymbol nodes that are created to refer
to a specific temporary in an AST transform will have consistent data.
The TVariable objects are not necessarily added to the symbol table
levels - just those variables that can be referred to by their name
during parsing need to be reachable through there.

In the future this can be taken a step further so that TIntermSymbol
nodes just to point to a TVariable instead of duplicating the
information.

BUG=angleproject:2267
TEST=angle_unittests

Change-Id: I4e7bcdb0637cd3b588d3c202ef02f4b7bd7954a1
Reviewed-on: https://chromium-review.googlesource.com/811925
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/SymbolTable.cpp b/src/compiler/translator/SymbolTable.cpp
index 5fa8741..04956d3 100644
--- a/src/compiler/translator/SymbolTable.cpp
+++ b/src/compiler/translator/SymbolTable.cpp
@@ -39,6 +39,20 @@
       mExtension(extension)
 {
     ASSERT(mSymbolType == SymbolType::BuiltIn || mExtension == TExtension::UNDEFINED);
+    ASSERT(mName != nullptr || mSymbolType == SymbolType::AngleInternal ||
+           mSymbolType == SymbolType::NotResolved);
+}
+
+const TString &TSymbol::name() const
+{
+    if (mName != nullptr)
+    {
+        return *mName;
+    }
+    ASSERT(mSymbolType == SymbolType::AngleInternal);
+    TInfoSinkBase symbolNameOut;
+    symbolNameOut << "s" << mUniqueId.get();
+    return *NewPoolTString(symbolNameOut.c_str());
 }
 
 TVariable::TVariable(TSymbolTable *symbolTable,
@@ -332,9 +346,10 @@
     }
 }
 
-TVariable *TSymbolTable::declareVariable(const TString *name, const TType &type)
+bool TSymbolTable::declareVariable(TVariable *variable)
 {
-    return insertVariable(currentLevel(), name, type, SymbolType::UserDefined);
+    ASSERT(variable->symbolType() == SymbolType::UserDefined);
+    return insertVariable(currentLevel(), variable);
 }
 
 bool TSymbolTable::declareStructType(TStructure *str)
@@ -388,6 +403,12 @@
     return nullptr;
 }
 
+bool TSymbolTable::insertVariable(ESymbolLevel level, TVariable *variable)
+{
+    ASSERT(variable);
+    return insert(level, variable);
+}
+
 bool TSymbolTable::insertStructType(ESymbolLevel level, TStructure *str)
 {
     ASSERT(str);