summaryrefslogtreecommitdiffstats
path: root/source/slang/syntax.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/syntax.cpp')
-rw-r--r--source/slang/syntax.cpp127
1 files changed, 11 insertions, 116 deletions
diff --git a/source/slang/syntax.cpp b/source/slang/syntax.cpp
index f8237359d..dd08fa2b1 100644
--- a/source/slang/syntax.cpp
+++ b/source/slang/syntax.cpp
@@ -321,6 +321,7 @@ void Type::accept(IValVisitor* visitor, void* extra)
IntVal* elementCount)
{
RefPtr<ArrayExpressionType> arrayType = new ArrayExpressionType();
+ arrayType->setSession(this);
arrayType->baseType = elementType;
arrayType->ArrayLength = elementCount;
return arrayType;
@@ -865,8 +866,16 @@ void Type::accept(IValVisitor* visitor, void* extra)
int NamedExpressionType::GetHashCode()
{
- SLANG_UNEXPECTED("unreachable");
- UNREACHABLE_RETURN(0);
+ // Type equality is based on comparing canonical types,
+ // so the hash code for a type needs to come from the
+ // canonical version of the type. This really means
+ // that `Type::GetHashCode()` should dispatch out to
+ // something like `Type::GetHashCodeImpl()` on the
+ // canonical version of a type, but it is less invasive
+ // for now (and hopefully equivalent) to just have any
+ // named types automaticlaly route hash-code requests
+ // to their canonical type.
+ return GetCanonicalType()->GetHashCode();
}
// FuncType
@@ -1875,118 +1884,4 @@ void Type::accept(IValVisitor* visitor, void* extra)
insertGlobalGenericSubstitutions(newSubst, subst, ioDiff);
return newSubst;
}
-
- // FilteredTupleType
-
- String FilteredTupleType::ToString()
- {
- StringBuilder sb;
- sb.append(originalType->ToString());
- sb.append("{");
- bool first = true;
- for (auto ee : elements)
- {
- if (!ee.type)
- continue;
-
- if (!first) sb.append(", ");
-
- sb.append(ee.fieldDeclRef.GetName()->text);
- sb.append(":");
- sb.append(ee.type->ToString());
-
- first = false;
- }
- sb.append("}");
- return sb.ProduceString();
- }
-
- RefPtr<Val> FilteredTupleType::SubstituteImpl(Substitutions* subst, int* ioDiff)
- {
- int diff = 0;
- auto substOriginalType = originalType->SubstituteImpl(subst, &diff).As<Type>();
-
- List<Element> substElements;
- for (auto ee : elements)
- {
- Element substElement;
- substElement.fieldDeclRef = ee.fieldDeclRef.SubstituteImpl(subst, &diff);
- substElement.type = ee.type->SubstituteImpl(subst, &diff).As<Type>();
- substElements.Add(substElement);
- }
-
- if (!diff)
- return this;
-
- (*ioDiff)++;
- RefPtr<FilteredTupleType> substType = new FilteredTupleType();
- substType->setSession(session);
- substType->originalType = substOriginalType;
- substType->elements = substElements;
- return substType;
- }
-
- bool FilteredTupleType::EqualsImpl(Type * type)
- {
- auto tupleType = type->As<FilteredTupleType>();
- if (!tupleType)
- return false;
-
- if (!originalType->Equals(tupleType->originalType))
- return false;
-
- auto elementCount = elements.Count();
- if (tupleType->elements.Count() != elementCount)
- return false;
-
- for (UInt ee = 0; ee < elementCount; ee++)
- {
- if (!elements[ee].type || !tupleType->elements[ee].type)
- {
- if (!elements[ee].type != !tupleType->elements[ee].type)
- return false;
-
- continue;
- }
-
- if (!elements[ee].fieldDeclRef.Equals(tupleType->elements[ee].fieldDeclRef))
- return false;
-
- if (!elements[ee].type->Equals(tupleType->elements[ee].type))
- return false;
- }
- return true;
- }
-
- int FilteredTupleType::GetHashCode()
- {
- int hash = (int)(typeid(this).hash_code());
- hash = combineHash(hash,
- originalType->GetHashCode());
- for (auto ee : elements)
- {
- hash = combineHash(hash,
- ee.fieldDeclRef.GetHashCode());
- hash = combineHash(hash,
- ee.type->GetHashCode());
- }
- return hash;
- }
-
- Type* FilteredTupleType::CreateCanonicalType()
- {
- RefPtr<FilteredTupleType> canTupleType = new FilteredTupleType();
- canTupleType->setSession(session);
- canTupleType->originalType = originalType->GetCanonicalType();
- for (auto ee : elements)
- {
- Element element;
- element.fieldDeclRef = ee.fieldDeclRef;
- element.type = ee.type ? ee.type->GetCanonicalType() : nullptr;
-
- canTupleType->elements.Add(element);
- }
- getSession()->canonicalTypes.Add(canTupleType);
- return canTupleType;
- }
}