diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2023-04-11 10:18:18 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-04-11 10:18:18 -0400 |
| commit | 20ea33f3321738e7c1b4cad7bdcaedcdb54dd0f0 (patch) | |
| tree | 899484670ffacf3e884b5d670e2cc8ed6d5259e3 /source/compiler-core/slang-artifact-util.cpp | |
| parent | d934bbcc5702ebd8964f65b1708c239c29320103 (diff) | |
Artifact simplification (#2781)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP simplifying artifact interface.
* Use ContainedKind.
* Remove LazyCastableList.
Use ContainedKind for find.
* Remove ICastableList.
* Remove need for ICastableList.
* Remove IArtifactContainer.
* Small fixes.
* Small improvements around Artifact.
* Make explicit find is for *representations* that can cast.
Fix bug in handling casting in lookup.
* Made associated items artifacts too.
* Small fixes.
* Small improvements around writing a container.
Diffstat (limited to 'source/compiler-core/slang-artifact-util.cpp')
| -rw-r--r-- | source/compiler-core/slang-artifact-util.cpp | 141 |
1 files changed, 120 insertions, 21 deletions
diff --git a/source/compiler-core/slang-artifact-util.cpp b/source/compiler-core/slang-artifact-util.cpp index 413bd5efe..1a920ff18 100644 --- a/source/compiler-core/slang-artifact-util.cpp +++ b/source/compiler-core/slang-artifact-util.cpp @@ -1,4 +1,4 @@ -// slang-artifact.cpp +// slang-artifact-util.cpp #include "slang-artifact-util.h" #include "slang-artifact-impl.h" @@ -6,22 +6,28 @@ #include "slang-artifact-desc-util.h" +#include "../core/slang-castable.h" #include "../core/slang-io.h" namespace Slang { -/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ArtifactUtil !!!!!!!!!!!!!!!!!!!!!!!!!!! */ +static bool _checkSelf(ArtifactUtil::FindStyle findStyle) +{ + return Index(findStyle) <= Index(ArtifactUtil::FindStyle::SelfOrChildren); +} -/* static */ComPtr<IArtifactContainer> ArtifactUtil::createContainer(const ArtifactDesc& desc) +static bool _checkChildren(ArtifactUtil::FindStyle findStyle) { - const auto containerDesc = ArtifactDesc::make(ArtifactKind::Container, ArtifactPayload::CompileResults, desc.style); - return ArtifactContainer::create(containerDesc); + return Index(findStyle) >= Index(ArtifactUtil::FindStyle::SelfOrChildren); } -/* static */ComPtr<IArtifactContainer> ArtifactUtil::createResultsContainer() +static bool _checkRecursive(ArtifactUtil::FindStyle findStyle) { - return ArtifactContainer::create(ArtifactDesc::make(ArtifactKind::Container, ArtifactPayload::CompileResults)); + return findStyle == ArtifactUtil::FindStyle::Recursive || + findStyle == ArtifactUtil::FindStyle::ChildrenRecursive; } + +/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ArtifactUtil !!!!!!!!!!!!!!!!!!!!!!!!!!! */ /* static */ComPtr<IArtifact> ArtifactUtil::createArtifact(const ArtifactDesc& desc, const char* name) { @@ -32,18 +38,7 @@ namespace Slang { /* static */ComPtr<IArtifact> ArtifactUtil::createArtifact(const ArtifactDesc& desc) { - if (isDerivedFrom(desc.kind, ArtifactKind::Container)) - { - auto container = ArtifactContainer::create(desc); - - ComPtr<IArtifact> artifact; - artifact.attach(container.detach()); - return artifact; - } - else - { - return Artifact::create(desc); - } + return Artifact::create(desc); } /* static */ComPtr<IArtifact> ArtifactUtil::createArtifactForCompileTarget(SlangCompileTarget target) @@ -79,7 +74,7 @@ namespace Slang { return true; } - /* Hmm, we might want to have a base class for 'signifiant' payloads, + /* Hmm, we might want to have a base class for 'significant' payloads, where signifiance here means somewhat approximately 'the meat' of a compilation result, as contrasted with 'meta data', 'diagnostics etc'*/ if (isDerivedFrom(desc.payload, ArtifactPayload::Metadata)) @@ -92,7 +87,7 @@ namespace Slang { /* static */IArtifact* ArtifactUtil::findSignificant(IArtifact* artifact) { - return artifact->findArtifactByPredicate(IArtifact::FindStyle::SelfOrChildren, &ArtifactUtil::isSignificant, nullptr); + return findArtifactByPredicate(artifact, FindStyle::SelfOrChildren, &ArtifactUtil::isSignificant, nullptr); } UnownedStringSlice ArtifactUtil::findPath(IArtifact* artifact) @@ -190,4 +185,108 @@ static SlangResult _calcInferred(IArtifact* artifact, const UnownedStringSlice& } } +static bool _isByDerivedDesc(IArtifact* artifact, void* data) +{ + const ArtifactDesc& desc = *(const ArtifactDesc*)data; + return ArtifactDescUtil::isDescDerivedFrom(artifact->getDesc(), desc); +} + +static bool _isDesc(IArtifact* artifact, void* data) +{ + const ArtifactDesc& desc = *(const ArtifactDesc*)data; + return artifact->getDesc() == desc; +} + +static bool _isName(IArtifact* artifact, void* data) +{ + const char* name = (const char*)data; + const auto artifactName = artifact->getName(); + + if (name == nullptr || artifactName == nullptr) + { + return name == artifactName; + } + return ::strcmp(name, artifactName) == 0; +} + +/* static */IArtifact* ArtifactUtil::findArtifactByDerivedDesc(IArtifact* artifact, FindStyle findStyle, const ArtifactDesc& desc) +{ + return findArtifactByPredicate(artifact, findStyle, _isByDerivedDesc, &const_cast<ArtifactDesc&>(desc)); +} + +/* static */IArtifact* ArtifactUtil::findArtifactByName(IArtifact* artifact, FindStyle findStyle, const char* name) +{ + return findArtifactByPredicate(artifact, findStyle, _isName, const_cast<char*>(name)); +} + +/* static */IArtifact* ArtifactUtil::findArtifactByDesc(IArtifact* artifact, FindStyle findStyle, const ArtifactDesc& desc) +{ + return findArtifactByPredicate(artifact, findStyle, _isDesc, &const_cast<ArtifactDesc&>(desc)); +} + +/* static */IArtifact* ArtifactUtil::findArtifactByPredicate(IArtifact* artifact, FindStyle findStyle, FindFunc func, void* data) +{ + if (_checkSelf(findStyle) && func(artifact, data)) + { + return artifact; + } + + if (!_checkChildren(findStyle)) + { + return nullptr; + } + + // Expand the children so we can search them + artifact->expandChildren(); + + auto children = artifact->getChildren(); + if (children.count == 0) + { + return nullptr; + } + + // Check the children + for (auto child : children) + { + if (func(child, data)) + { + return child; + } + } + + // If it's recursive, we check all the children of children + if (_checkRecursive(findStyle)) + { + for (auto child : children) + { + if (auto found = findArtifactByPredicate(child, FindStyle::ChildrenRecursive, func, data)) + { + return found; + } + } + } + + return nullptr; +} + +/* static */void ArtifactUtil::addAssociated(IArtifact* artifact, IArtifactPostEmitMetadata* metadata) +{ + if (metadata) + { + auto metadataArtifact = ArtifactUtil::createArtifact(ArtifactDesc::make(ArtifactKind::Instance, ArtifactPayload::PostEmitMetadata)); + metadataArtifact->addRepresentation(metadata); + artifact->addAssociated(metadataArtifact); + } +} + +/* static */void ArtifactUtil::addAssociated(IArtifact* artifact, IArtifactDiagnostics* diagnostics) +{ + if (diagnostics) + { + auto diagnosticsArtifact = ArtifactUtil::createArtifact(ArtifactDesc::make(ArtifactKind::Instance, ArtifactPayload::Diagnostics)); + diagnosticsArtifact->addRepresentation(diagnostics); + artifact->addAssociated(diagnosticsArtifact); + } +} + } // namespace Slang |
