summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-artifact-util.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2023-04-11 10:18:18 -0400
committerGitHub <noreply@github.com>2023-04-11 10:18:18 -0400
commit20ea33f3321738e7c1b4cad7bdcaedcdb54dd0f0 (patch)
tree899484670ffacf3e884b5d670e2cc8ed6d5259e3 /source/compiler-core/slang-artifact-util.cpp
parentd934bbcc5702ebd8964f65b1708c239c29320103 (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.cpp141
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