Use GetOperatorString in intermediate output

The special names for built-ins used in intermediate output are kept
only where they add some significant value, like clearly
disambiguating between component-wise and non-component-wise ops.
Otherwise intermediate output now relies on GetOperatorString to give
names for ops.

This will make it easier to add new built-in functions.

This also fixes intermediate output for TIntermSwizzle, dFdx, dFdy and
fwidth.

BUG=angleproject:1730
TEST=angle_unittests

Change-Id: Ifa06b886ad8e24b0820513adae8decd60d80a0e7
Reviewed-on: https://chromium-review.googlesource.com/431032
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/intermOut.cpp b/src/compiler/translator/intermOut.cpp
index 926967b..d4edd6e 100644
--- a/src/compiler/translator/intermOut.cpp
+++ b/src/compiler/translator/intermOut.cpp
@@ -95,7 +95,12 @@
 {
     TInfoSinkBase &out = sink;
     OutputTreeText(out, node, mDepth);
-    out << "vector swizzle";
+    out << "vector swizzle (";
+    node->writeOffsetsAsXYZW(&out);
+    out << ")";
+
+    out << " (" << node->getCompleteString() << ")";
+    out << "\n";
     return true;
 }
 
@@ -295,6 +300,8 @@
 
     switch (node->getOp())
     {
+        // Give verbose names for ops that have special syntax and some built-in functions that are
+        // easy to confuse with others, but mostly use GLSL names for functions.
         case EOpNegative:
             out << "Negate value";
             break;
@@ -321,166 +328,13 @@
             out << "Pre-Decrement";
             break;
 
-        case EOpRadians:
-            out << "radians";
-            break;
-        case EOpDegrees:
-            out << "degrees";
-            break;
-        case EOpSin:
-            out << "sine";
-            break;
-        case EOpCos:
-            out << "cosine";
-            break;
-        case EOpTan:
-            out << "tangent";
-            break;
-        case EOpAsin:
-            out << "arc sine";
-            break;
-        case EOpAcos:
-            out << "arc cosine";
-            break;
-        case EOpAtan:
-            out << "arc tangent";
-            break;
-
-        case EOpSinh:
-            out << "hyperbolic sine";
-            break;
-        case EOpCosh:
-            out << "hyperbolic cosine";
-            break;
-        case EOpTanh:
-            out << "hyperbolic tangent";
-            break;
-        case EOpAsinh:
-            out << "arc hyperbolic sine";
-            break;
-        case EOpAcosh:
-            out << "arc hyperbolic cosine";
-            break;
-        case EOpAtanh:
-            out << "arc hyperbolic tangent";
-            break;
-
-        case EOpExp:
-            out << "exp";
-            break;
-        case EOpLog:
-            out << "log";
-            break;
-        case EOpExp2:
-            out << "exp2";
-            break;
-        case EOpLog2:
-            out << "log2";
-            break;
-        case EOpSqrt:
-            out << "sqrt";
-            break;
-        case EOpInverseSqrt:
-            out << "inverse sqrt";
-            break;
-
-        case EOpAbs:
-            out << "Absolute value";
-            break;
-        case EOpSign:
-            out << "Sign";
-            break;
-        case EOpFloor:
-            out << "Floor";
-            break;
-        case EOpTrunc:
-            out << "Truncate";
-            break;
-        case EOpRound:
-            out << "Round";
-            break;
-        case EOpRoundEven:
-            out << "Round half even";
-            break;
-        case EOpCeil:
-            out << "Ceiling";
-            break;
-        case EOpFract:
-            out << "Fraction";
-            break;
-        case EOpIsNan:
-            out << "Is not a number";
-            break;
-        case EOpIsInf:
-            out << "Is infinity";
-            break;
-
-        case EOpFloatBitsToInt:
-            out << "float bits to int";
-            break;
-        case EOpFloatBitsToUint:
-            out << "float bits to uint";
-            break;
-        case EOpIntBitsToFloat:
-            out << "int bits to float";
-            break;
-        case EOpUintBitsToFloat:
-            out << "uint bits to float";
-            break;
-
-        case EOpPackSnorm2x16:
-            out << "pack Snorm 2x16";
-            break;
-        case EOpPackUnorm2x16:
-            out << "pack Unorm 2x16";
-            break;
-        case EOpPackHalf2x16:
-            out << "pack half 2x16";
-            break;
-
-        case EOpUnpackSnorm2x16:
-            out << "unpack Snorm 2x16";
-            break;
-        case EOpUnpackUnorm2x16:
-            out << "unpack Unorm 2x16";
-            break;
-        case EOpUnpackHalf2x16:
-            out << "unpack half 2x16";
-            break;
-
-        case EOpLength:
-            out << "length";
-            break;
-        case EOpNormalize:
-            out << "normalize";
-            break;
-        // case EOpDPdx:           out << "dPdx";                 break;
-        // case EOpDPdy:           out << "dPdy";                 break;
-        // case EOpFwidth:         out << "fwidth";               break;
-
-        case EOpDeterminant:
-            out << "determinant";
-            break;
-        case EOpTranspose:
-            out << "transpose";
-            break;
-        case EOpInverse:
-            out << "inverse";
-            break;
-
-        case EOpAny:
-            out << "any";
-            break;
-        case EOpAll:
-            out << "all";
-            break;
         case EOpLogicalNotComponentWise:
             out << "component-wise not";
             break;
 
         default:
-            out.prefix(SH_ERROR);
-            out << "Bad unary op";
+            out << GetOperatorString(node->getOp());
+            break;
     }
 
     out << " (" << node->getCompleteString() << ")";
@@ -532,171 +386,60 @@
         return true;
     }
 
-    switch (node->getOp())
+    if (node->isConstructor())
     {
-        case EOpFunctionCall:
-            OutputFunction(out, "Function Call", node->getFunctionSymbolInfo());
-            break;
-        case EOpConstructFloat:
-            out << "Construct float";
-            break;
-        case EOpConstructVec2:
-            out << "Construct vec2";
-            break;
-        case EOpConstructVec3:
-            out << "Construct vec3";
-            break;
-        case EOpConstructVec4:
-            out << "Construct vec4";
-            break;
-        case EOpConstructBool:
-            out << "Construct bool";
-            break;
-        case EOpConstructBVec2:
-            out << "Construct bvec2";
-            break;
-        case EOpConstructBVec3:
-            out << "Construct bvec3";
-            break;
-        case EOpConstructBVec4:
-            out << "Construct bvec4";
-            break;
-        case EOpConstructInt:
-            out << "Construct int";
-            break;
-        case EOpConstructIVec2:
-            out << "Construct ivec2";
-            break;
-        case EOpConstructIVec3:
-            out << "Construct ivec3";
-            break;
-        case EOpConstructIVec4:
-            out << "Construct ivec4";
-            break;
-        case EOpConstructUInt:
-            out << "Construct uint";
-            break;
-        case EOpConstructUVec2:
-            out << "Construct uvec2";
-            break;
-        case EOpConstructUVec3:
-            out << "Construct uvec3";
-            break;
-        case EOpConstructUVec4:
-            out << "Construct uvec4";
-            break;
-        case EOpConstructMat2:
-            out << "Construct mat2";
-            break;
-        case EOpConstructMat2x3:
-            out << "Construct mat2x3";
-            break;
-        case EOpConstructMat2x4:
-            out << "Construct mat2x4";
-            break;
-        case EOpConstructMat3x2:
-            out << "Construct mat3x2";
-            break;
-        case EOpConstructMat3:
-            out << "Construct mat3";
-            break;
-        case EOpConstructMat3x4:
-            out << "Construct mat3x4";
-            break;
-        case EOpConstructMat4x2:
-            out << "Construct mat4x2";
-            break;
-        case EOpConstructMat4x3:
-            out << "Construct mat4x3";
-            break;
-        case EOpConstructMat4:
-            out << "Construct mat4";
-            break;
-        case EOpConstructStruct:
+        if (node->getOp() == EOpConstructStruct)
+        {
             out << "Construct structure";
-            break;
+        }
+        else
+        {
+            out << "Construct " << GetOperatorString(node->getOp());
+        }
+    }
+    else
+    {
+        // Give verbose names for some built-in functions that are easy to confuse with others, but
+        // mostly use GLSL names for functions.
+        switch (node->getOp())
+        {
+            case EOpFunctionCall:
+                OutputFunction(out, "Function Call", node->getFunctionSymbolInfo());
+                break;
 
-        case EOpEqualComponentWise:
-            out << "component-wise equal";
-            break;
-        case EOpNotEqualComponentWise:
-            out << "component-wise not equal";
-            break;
-        case EOpLessThanComponentWise:
-            out << "component-wise less than";
-            break;
-        case EOpGreaterThanComponentWise:
-            out << "component-wise greater than";
-            break;
-        case EOpLessThanEqualComponentWise:
-            out << "component-wise less than or equal";
-            break;
-        case EOpGreaterThanEqualComponentWise:
-            out << "component-wise greater than or equal";
-            break;
+            case EOpEqualComponentWise:
+                out << "component-wise equal";
+                break;
+            case EOpNotEqualComponentWise:
+                out << "component-wise not equal";
+                break;
+            case EOpLessThanComponentWise:
+                out << "component-wise less than";
+                break;
+            case EOpGreaterThanComponentWise:
+                out << "component-wise greater than";
+                break;
+            case EOpLessThanEqualComponentWise:
+                out << "component-wise less than or equal";
+                break;
+            case EOpGreaterThanEqualComponentWise:
+                out << "component-wise greater than or equal";
+                break;
 
-        case EOpMod:
-            out << "mod";
-            break;
-        case EOpModf:
-            out << "modf";
-            break;
-        case EOpPow:
-            out << "pow";
-            break;
+            case EOpDot:
+                out << "dot product";
+                break;
+            case EOpCross:
+                out << "cross product";
+                break;
+            case EOpMulMatrixComponentWise:
+                out << "component-wise multiply";
+                break;
 
-        case EOpAtan:
-            out << "arc tangent";
-            break;
-
-        case EOpMin:
-            out << "min";
-            break;
-        case EOpMax:
-            out << "max";
-            break;
-        case EOpClamp:
-            out << "clamp";
-            break;
-        case EOpMix:
-            out << "mix";
-            break;
-        case EOpStep:
-            out << "step";
-            break;
-        case EOpSmoothStep:
-            out << "smoothstep";
-            break;
-
-        case EOpDistance:
-            out << "distance";
-            break;
-        case EOpDot:
-            out << "dot-product";
-            break;
-        case EOpCross:
-            out << "cross-product";
-            break;
-        case EOpFaceForward:
-            out << "face-forward";
-            break;
-        case EOpReflect:
-            out << "reflect";
-            break;
-        case EOpRefract:
-            out << "refract";
-            break;
-        case EOpMulMatrixComponentWise:
-            out << "component-wise multiply";
-            break;
-
-        case EOpOuterProduct:
-            out << "outer product";
-            break;
-
-        default:
-            out.prefix(SH_ERROR);
-            out << "Bad aggregation op";
+            default:
+                out << GetOperatorString(node->getOp());
+                break;
+        }
     }
 
     out << " (" << node->getCompleteString() << ")";