diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-04 15:47:39 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-04 15:47:39 -0700 |
| commit | a2d90fb275962da84611160f8ddd74d934a68dbd (patch) | |
| tree | 066084537b9f4fe1f367de100ed6638a88a028c1 /source/slang/slang-check-resolve-val.cpp | |
| parent | 17da4f0dec2b86ba3a4bdaf8a2ae112047d23623 (diff) | |
Redesign `DeclRef` and systematic `Val` deduplication (#3049)
* Redesign DeclRef + Deduplicate Val.
* Update project files
* Fix warning.
* Fix.
* Fix.
* Remove `Val::_equalsImplOverride`.
* Rmove `Val::_getHashCodeOverride`.
* Remove `semanticVisitor` param from `resolve`.
* Cleanups.
---------
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-check-resolve-val.cpp')
| -rw-r--r-- | source/slang/slang-check-resolve-val.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/source/slang/slang-check-resolve-val.cpp b/source/slang/slang-check-resolve-val.cpp new file mode 100644 index 000000000..91722f82c --- /dev/null +++ b/source/slang/slang-check-resolve-val.cpp @@ -0,0 +1,48 @@ +// slang-check-resolve-val.cpp + +// Logic for resolving/simplifying Types and DeclRefs. + +#include "slang-check-impl.h" + +#include "slang-lookup.h" +#include "slang-syntax.h" +#include "slang-ast-synthesis.h" +#include "slang-ast-reflect.h" + +namespace Slang +{ + +Type* Type::createCanonicalType() +{ + SLANG_AST_NODE_VIRTUAL_CALL(Type, createCanonicalType, ()); +} + +Val* Type::_resolveImplOverride() +{ + Val* resolvedVal = createCanonicalType(); + return resolvedVal; +} + +DeclRefBase* _resolveAsDeclRef(DeclRefBase* declRefToResolve); + +Type* DeclRefType::_createCanonicalTypeOverride() +{ + auto astBuilder = getCurrentASTBuilder(); + + // A declaration reference is already canonical + auto resolvedDeclRef = getDeclRef(); + resolvedDeclRef = _resolveAsDeclRef(getDeclRef().declRefBase); + if (auto satisfyingVal = _tryLookupConcreteAssociatedTypeFromThisTypeSubst(astBuilder, resolvedDeclRef)) + return as<Type>(satisfyingVal); + if (resolvedDeclRef != getDeclRef()) + return DeclRefType::create(astBuilder, resolvedDeclRef); + return this; +} + + +Val* SubtypeWitness::_resolveImplOverride() +{ + return as<SubtypeWitness>(defaultResolveImpl()); +} + +} |
