diff options
Diffstat (limited to 'source/slang/slang-ast-type.cpp')
| -rw-r--r-- | source/slang/slang-ast-type.cpp | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/source/slang/slang-ast-type.cpp b/source/slang/slang-ast-type.cpp index 64b8c7515..45a736f23 100644 --- a/source/slang/slang-ast-type.cpp +++ b/source/slang/slang-ast-type.cpp @@ -655,7 +655,7 @@ bool ExtractExistentialType::_equalsImplOverride(Type* type) HashCode ExtractExistentialType::_getHashCodeOverride() { - return combineHash(declRef.getHashCode(), interfaceDeclRef.getHashCode()); + return combineHash(declRef.getHashCode(), originalInterfaceType->getHashCode(), originalInterfaceDeclRef.getHashCode()); } Type* ExtractExistentialType::_createCanonicalTypeOverride() @@ -667,7 +667,8 @@ Val* ExtractExistentialType::_substituteImplOverride(ASTBuilder* astBuilder, Sub { int diff = 0; auto substDeclRef = declRef.substituteImpl(astBuilder, subst, &diff); - auto interfaceSubstDeclRef = interfaceDeclRef.substituteImpl(astBuilder, subst, &diff); + auto substOriginalInterfaceType = originalInterfaceType->substituteImpl(astBuilder, subst, &diff); + auto substOriginalInterfaceDeclRef = originalInterfaceDeclRef.substituteImpl(astBuilder, subst, &diff); if (!diff) return this; @@ -675,10 +676,46 @@ Val* ExtractExistentialType::_substituteImplOverride(ASTBuilder* astBuilder, Sub ExtractExistentialType* substValue = astBuilder->create<ExtractExistentialType>(); substValue->declRef = substDeclRef; - substValue->interfaceDeclRef = interfaceSubstDeclRef; + substValue->originalInterfaceType = as<Type>(substOriginalInterfaceType); + substValue->originalInterfaceDeclRef = substOriginalInterfaceDeclRef; return substValue; } +SubtypeWitness* ExtractExistentialType::getSubtypeWitness() +{ + if (auto cachedValue = this->cachedSubtypeWitness) + return cachedValue; + + ExtractExistentialSubtypeWitness* openedWitness = m_astBuilder->create<ExtractExistentialSubtypeWitness>(); + openedWitness->sub = this; + openedWitness->sup = originalInterfaceType; + openedWitness->declRef = this->declRef; + + this->cachedSubtypeWitness = openedWitness; + return openedWitness; +} + +DeclRef<InterfaceDecl> ExtractExistentialType::getSpecializedInterfaceDeclRef() +{ + if (auto cachedValue = this->cachedSpecializedInterfaceDeclRef) + return cachedValue; + + auto interfaceDecl = originalInterfaceDeclRef.getDecl(); + + SubtypeWitness* openedWitness = getSubtypeWitness(); + + ThisTypeSubstitution* openedThisType = m_astBuilder->create<ThisTypeSubstitution>(); + openedThisType->outer = originalInterfaceDeclRef.substitutions.substitutions; + openedThisType->interfaceDecl = interfaceDecl; + openedThisType->witness = openedWitness; + + DeclRef<InterfaceDecl> specialiedInterfaceDeclRef = DeclRef<InterfaceDecl>(interfaceDecl, openedThisType); + + this->cachedSpecializedInterfaceDeclRef = specialiedInterfaceDeclRef; + return specialiedInterfaceDeclRef; +} + + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TaggedUnionType !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! void TaggedUnionType::_toTextOverride(StringBuilder& out) |
