Split TIntermDeclaration from TIntermAggregate

The new class TIntermDeclaration is now used for struct, interface
block and variable declarations. TIntermDeclaration nodes do not have
a type - rather the type is stored in each child node. The types may
differ in case the declaration is a series of array declarators with
mismatching sizes.

TIntermAggregate is still used for function calls, function
prototypes, function parameter lists and invariant declarations.

BUG=angleproject:1490
TEST=angle_unittests

Change-Id: I0457188f354481470855f61ac1c878fc2579b1d1
Reviewed-on: https://chromium-review.googlesource.com/400023
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/compiler/translator/VariableInfo.cpp b/src/compiler/translator/VariableInfo.cpp
index 7e1e5cd..07fe12e 100644
--- a/src/compiler/translator/VariableInfo.cpp
+++ b/src/compiler/translator/VariableInfo.cpp
@@ -559,54 +559,43 @@
     }
 }
 
-bool CollectVariables::visitAggregate(Visit, TIntermAggregate *node)
+bool CollectVariables::visitDeclaration(Visit, TIntermDeclaration *node)
 {
-    bool visitChildren = true;
+    const TIntermSequence &sequence = *(node->getSequence());
+    ASSERT(!sequence.empty());
 
-    switch (node->getOp())
+    const TIntermTyped &typedNode = *(sequence.front()->getAsTyped());
+    TQualifier qualifier          = typedNode.getQualifier();
+
+    if (typedNode.getBasicType() == EbtInterfaceBlock)
     {
-      case EOpDeclaration:
+        visitInfoList(sequence, mInterfaceBlocks);
+        return false;
+    }
+    else if (qualifier == EvqAttribute || qualifier == EvqVertexIn || qualifier == EvqFragmentOut ||
+             qualifier == EvqUniform || IsVarying(qualifier))
+    {
+        switch (qualifier)
         {
-            const TIntermSequence &sequence = *(node->getSequence());
-            ASSERT(!sequence.empty());
-
-            const TIntermTyped &typedNode = *(sequence.front()->getAsTyped());
-            TQualifier qualifier = typedNode.getQualifier();
-
-            if (typedNode.getBasicType() == EbtInterfaceBlock)
-            {
-                visitInfoList(sequence, mInterfaceBlocks);
-                visitChildren = false;
-            }
-            else if (qualifier == EvqAttribute || qualifier == EvqVertexIn ||
-                     qualifier == EvqFragmentOut || qualifier == EvqUniform ||
-                     IsVarying(qualifier))
-            {
-                switch (qualifier)
-                {
-                  case EvqAttribute:
-                  case EvqVertexIn:
-                    visitInfoList(sequence, mAttribs);
-                    break;
-                  case EvqFragmentOut:
-                    visitInfoList(sequence, mOutputVariables);
-                    break;
-                  case EvqUniform:
-                    visitInfoList(sequence, mUniforms);
-                    break;
-                  default:
-                    visitInfoList(sequence, mVaryings);
-                    break;
-                }
-
-                visitChildren = false;
-            }
-            break;
+            case EvqAttribute:
+            case EvqVertexIn:
+                visitInfoList(sequence, mAttribs);
+                break;
+            case EvqFragmentOut:
+                visitInfoList(sequence, mOutputVariables);
+                break;
+            case EvqUniform:
+                visitInfoList(sequence, mUniforms);
+                break;
+            default:
+                visitInfoList(sequence, mVaryings);
+                break;
         }
-      default: break;
+
+        return false;
     }
 
-    return visitChildren;
+    return true;
 }
 
 bool CollectVariables::visitBinary(Visit, TIntermBinary *binaryNode)