diff options
Diffstat (limited to 'source/slang/syntax.cpp')
| -rw-r--r-- | source/slang/syntax.cpp | 127 |
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; - } } |
