summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-artifact-util.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-artifact-util.cpp')
-rw-r--r--source/compiler-core/slang-artifact-util.cpp48
1 files changed, 35 insertions, 13 deletions
diff --git a/source/compiler-core/slang-artifact-util.cpp b/source/compiler-core/slang-artifact-util.cpp
index 7f69a0464..909c9b3d2 100644
--- a/source/compiler-core/slang-artifact-util.cpp
+++ b/source/compiler-core/slang-artifact-util.cpp
@@ -67,7 +67,7 @@ ArtifactStyle ArtifactUtilImpl::getStyleParent(ArtifactStyle style) { return get
UnownedStringSlice ArtifactUtilImpl::getStyleName(ArtifactStyle style) { return getName(style); }
bool ArtifactUtilImpl::isStyleDerivedFrom(ArtifactStyle style, ArtifactStyle base) { return isDerivedFrom(style, base); }
-SlangResult ArtifactUtilImpl::createLockFile(const char* inNameBase, ISlangMutableFileSystem* fileSystem, ILockFile** outLockFile)
+SlangResult ArtifactUtilImpl::createLockFile(const char* inNameBase, ISlangMutableFileSystem* fileSystem, IFileArtifactRepresentation** outLockFile)
{
if (fileSystem)
{
@@ -84,7 +84,7 @@ SlangResult ArtifactUtilImpl::createLockFile(const char* inNameBase, ISlangMutab
String lockPath;
SLANG_RETURN_ON_FAIL(File::generateTemporary(nameBase, lockPath));
- ComPtr<ILockFile> lockFile(new LockFile(lockPath, fileSystem));
+ ComPtr<IFileArtifactRepresentation> lockFile(new FileArtifactRepresentation(IFileArtifactRepresentation::Kind::Lock, lockPath, nullptr, fileSystem));
*outLockFile = lockFile.detach();
return SLANG_OK;
@@ -114,7 +114,7 @@ SlangResult ArtifactUtilImpl::requireFileDefaultImpl(IArtifact* artifact, Artifa
SLANG_RETURN_ON_FAIL(artifact->loadBlob(keep, blob.writeRef()));
// Okay we need to store as a temporary. Get a lock file.
- ComPtr<ILockFile> lockFile;
+ ComPtr<IFileArtifactRepresentation> lockFile;
SLANG_RETURN_ON_FAIL(createLockFile(artifact->getName(), nullptr, lockFile.writeRef()));
// Now we need the appropriate name for this item
@@ -126,25 +126,32 @@ SlangResult ArtifactUtilImpl::requireFileDefaultImpl(IArtifact* artifact, Artifa
// Write the contents
SLANG_RETURN_ON_FAIL(File::writeAllBytes(path, blob->getBufferPointer(), blob->getBufferSize()));
- // If the paths are identical we don't need a lock file
+ ComPtr<IFileArtifactRepresentation> fileRep;
+
+ // TODO(JS): This path comparison is perhaps not perfect, in that it assumes the path is not changed
+ // in any way. For example an impl of calcArtifactPath that changed slashes or used a canonical path
+ // might mean the lock file and the rep have the same path.
+ // As it stands calcArtifactPath impl doesn't do that, but that is perhaps somewhatfragile
+
+ // If the paths are identical, we can just use the lock file for the rep
if (UnownedStringSlice(lockFile->getPath()) == path.getUnownedSlice())
{
- // Make the lockFile no longer own the file
- lockFile->disown();
- // We no longer need the lock file
- lockFile.setNull();
+ fileRep.swap(lockFile);
+ }
+ else
+ {
+ // Create a new rep that references the lock file
+ fileRep = new FileArtifactRepresentation(IFileArtifactRepresentation::Kind::Owned, path, lockFile, nullptr);
}
-
+
// Create the rep
- IFileArtifactRepresentation* fileRep = new FileArtifactRepresentation(IFileArtifactRepresentation::Kind::Owned, path, lockFile, nullptr);
if (canKeep(keep))
{
artifact->addRepresentation(fileRep);
}
- // Return it
- fileRep->addRef();
- *outFile = fileRep;
+ // Return the file
+ *outFile = fileRep.detach();
return SLANG_OK;
}
@@ -153,4 +160,19 @@ ArtifactDesc ArtifactUtilImpl::makeDescFromCompileTarget(SlangCompileTarget targ
return ArtifactDescUtil::makeDescFromCompileTarget(target);
}
+SlangResult ArtifactUtilImpl::getChildrenDefaultImpl(IArtifact* artifact, IArtifactList** outList)
+{
+ auto desc = artifact->getDesc();
+
+ // If it's a container type for now, just create empty list of children
+ if (isDerivedFrom(desc.kind, ArtifactKind::Container))
+ {
+ *outList = ComPtr<IArtifactList>(new ArtifactList(artifact)).detach();
+ return SLANG_OK;
+ }
+
+ return SLANG_E_NOT_AVAILABLE;
+}
+
+
} // namespace Slang