diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index f30145e..69870a5 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -402,7 +402,7 @@
                 } else {
                     arraySize = Type::kUnsizedArray;
                 }
-                type = fSymbolTable->addArrayDimensions(type, {arraySize});
+                type = fSymbolTable->addArrayDimension(type, arraySize);
             }
         }
         auto var = std::make_unique<Variable>(varDecl.fOffset, fModifiers->addToPool(modifiers),
@@ -903,7 +903,7 @@
         }
         if (pd.fIsArray) {
             int arraySize = (paramIter++)->getInt();
-            type = fSymbolTable->addArrayDimensions(type, {arraySize});
+            type = fSymbolTable->addArrayDimension(type, arraySize);
         }
         // Only the (builtin) declarations of 'sample' are allowed to have FP parameters
         if ((type->nonnullable() == *fContext.fFragmentProcessor_Type && !fIsBuiltinCode) ||
@@ -1164,7 +1164,7 @@
         } else {
             arraySize = Type::kUnsizedArray;
         }
-        type = symbols->addArrayDimensions(type, {arraySize});
+        type = symbols->addArrayDimension(type, arraySize);
     }
     const Variable* var = old->takeOwnershipOfSymbol(
             std::make_unique<Variable>(intf.fOffset,
@@ -1319,7 +1319,7 @@
     if (isArray) {
         auto iter = type.begin();
         int arraySize = *iter ? iter->getInt() : Type::kUnsizedArray;
-        result = fSymbolTable->addArrayDimensions(result, {arraySize});
+        result = fSymbolTable->addArrayDimension(result, arraySize);
     }
     return result;
 }
@@ -2459,10 +2459,9 @@
                                                       const ASTNode& index) {
     if (base->kind() == Expression::Kind::kTypeReference) {
         if (index.fKind == ASTNode::Kind::kInt) {
-            const Type& oldType = base->as<TypeReference>().value();
-            SkSTArray<1, int> dimension = {index.getInt()};
-            const Type* newType = fSymbolTable->addArrayDimensions(&oldType, dimension);
-            return std::make_unique<TypeReference>(fContext, base->fOffset, newType);
+            const Type* type = &base->as<TypeReference>().value();
+            type = fSymbolTable->addArrayDimension(type, index.getInt());
+            return std::make_unique<TypeReference>(fContext, base->fOffset, type);
 
         } else {
             fErrors.error(base->fOffset, "array size must be a constant");
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 6c5c97b..db91a4a 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -556,7 +556,7 @@
                 }
                 // Add the array dimensions to our type.
                 int arraySize = size.getInt();
-                type = fSymbols.addArrayDimensions(type, {arraySize});
+                type = fSymbols.addArrayDimension(type, arraySize);
             }
 
             fields.push_back(Type::Field(modifiers, vd.fName, type));
diff --git a/src/sksl/ir/SkSLSymbolTable.cpp b/src/sksl/ir/SkSLSymbolTable.cpp
index a2ec139..fb102fa 100644
--- a/src/sksl/ir/SkSLSymbolTable.cpp
+++ b/src/sksl/ir/SkSLSymbolTable.cpp
@@ -121,18 +121,17 @@
     }
 }
 
-const Type* SymbolTable::addArrayDimensions(const Type* type, const SkTArray<int>& dimensions) {
-    StringFragment baseName = type->name();
-    String arrayDims;
-    for (int index = dimensions.count(); index--; ) {
-        int dim = dimensions[index];
-        arrayDims = (dim != Type::kUnsizedArray)
-                            ? String::printf("[%d]%s", dim, arrayDims.c_str())
-                            : String::printf("[]%s", arrayDims.c_str());
-
-        type = this->takeOwnershipOfSymbol(std::make_unique<Type>(baseName + arrayDims,
+const Type* SymbolTable::addArrayDimension(const Type* type, int arraySize) {
+    if (arraySize != 0) {
+        // SkSL doesn't support multi-dimensional arrays.
+        SkASSERT(type->typeKind() != Type::TypeKind::kArray);
+        String baseName = type->name();
+        String arrayName = (arraySize != Type::kUnsizedArray)
+                                   ? String::printf("%s[%d]", baseName.c_str(), arraySize)
+                                   : String::printf("%s[]", baseName.c_str());
+        type = this->takeOwnershipOfSymbol(std::make_unique<Type>(std::move(arrayName),
                                                                   Type::TypeKind::kArray,
-                                                                  *type, dim));
+                                                                  *type, arraySize));
     }
     return type;
 }
diff --git a/src/sksl/ir/SkSLSymbolTable.h b/src/sksl/ir/SkSLSymbolTable.h
index 1dea68e..3ea5ba1 100644
--- a/src/sksl/ir/SkSLSymbolTable.h
+++ b/src/sksl/ir/SkSLSymbolTable.h
@@ -74,11 +74,11 @@
     }
 
     /**
-     * Given baseType = `float` and dimensions = {1, 2, 3}, creates the full chain of required
-     * array types in the symbol table: `float[3]`, `float[2][3]`, and `float[1][2][3]`. The
-     * fully-dimensioned array type is returned. `kUnsizedArray` can be passed as a `[]` dimension.
+     * Given type = `float` and arraySize = 5, creates the array type `float[5]` in the symbol
+     * table. The created array type is returned. `kUnsizedArray` can be passed as a `[]` dimension.
+     * If zero is passed, the base type is returned unchanged.
      */
-    const Type* addArrayDimensions(const Type* type, const SkTArray<int>& dimensions);
+    const Type* addArrayDimension(const Type* type, int arraySize);
 
     // Call fn for every symbol in the table.  You may not mutate anything.
     template <typename Fn>
