summaryrefslogtreecommitdiff
path: root/source/slang/slang-ast-type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ast-type.cpp')
-rw-r--r--source/slang/slang-ast-type.cpp61
1 files changed, 17 insertions, 44 deletions
diff --git a/source/slang/slang-ast-type.cpp b/source/slang/slang-ast-type.cpp
index 3801b99b0..362503a64 100644
--- a/source/slang/slang-ast-type.cpp
+++ b/source/slang/slang-ast-type.cpp
@@ -314,64 +314,37 @@ Type* MatrixExpressionType::getRowType()
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ArrayExpressionType !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-bool ArrayExpressionType::_equalsImplOverride(Type* type)
+Type* ArrayExpressionType::getElementType()
{
- auto arrType = as<ArrayExpressionType>(type);
- if (!arrType)
- return false;
- return (areValsEqual(arrayLength, arrType->arrayLength) && baseType->equals(arrType->baseType));
-}
-
-Val* ArrayExpressionType::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff)
-{
- int diff = 0;
- auto elementType = as<Type>(baseType->substituteImpl(astBuilder, subst, &diff));
- IntVal* newArrayLength = nullptr;
- if (arrayLength)
- {
- newArrayLength = as<IntVal>(arrayLength->substituteImpl(astBuilder, subst, &diff));
- SLANG_ASSERT(newArrayLength);
- }
- if (diff)
- {
- *ioDiff = 1;
- auto rsType = getArrayType(
- astBuilder,
- elementType,
- newArrayLength);
- return rsType;
- }
- return this;
-}
-
-Type* ArrayExpressionType::_createCanonicalTypeOverride()
-{
- auto canonicalElementType = baseType->getCanonicalType();
- auto canonicalArrayType = getASTBuilder()->getArrayType(
- canonicalElementType,
- arrayLength);
- return canonicalArrayType;
+ return as<Type>(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[0]);
}
-HashCode ArrayExpressionType::_getHashCodeOverride()
+IntVal* ArrayExpressionType::getElementCount()
{
- if (arrayLength)
- return (baseType->getHashCode() * 16777619) ^ arrayLength->getHashCode();
- else
- return baseType->getHashCode();
+ return as<IntVal>(findInnerMostGenericSubstitution(declRef.substitutions)->getArgs()[1]);
}
void ArrayExpressionType::_toTextOverride(StringBuilder& out)
{
- out << baseType;
+ out << getElementType();
out.appendChar('[');
- if (arrayLength)
+ if (!isUnsized())
{
- out << arrayLength;
+ out << getElementCount();
}
out.appendChar(']');
}
+bool ArrayExpressionType::isUnsized()
+{
+ if (auto constSize = as<ConstantIntVal>(getElementCount()))
+ {
+ if (constSize->value == kUnsizedArrayMagicLength)
+ return true;
+ }
+ return false;
+}
+
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TypeType !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void TypeType::_toTextOverride(StringBuilder& out)