From dc870efda5457e09a9236bb1f62387d2f3a5de8b Mon Sep 17 00:00:00 2001 From: Alex Plate Date: Thu, 22 Jul 2021 16:51:38 +0300 Subject: [PATCH] [Workspace Model] [Artifact] Detect removing of artifact in modifiable bridge GitOrigin-RevId: a7ba8a3418f9771b73e30dde4faae64bb5530062 --- .../workspacemodel/ArtifactBridge.kt | 6 +++++- .../ArtifactModifiableModelBridge.kt | 4 ++-- .../artifacts/workspacemodel/BridgeUtils.kt | 2 +- .../workspacemodel/InvalidArtifactBridge.kt | 2 +- .../artifacts/ArtifactsModelTest.java | 19 +++++++++++++++++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactBridge.kt b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactBridge.kt index 40e4b1f31172..0c6a4146ec48 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactBridge.kt +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactBridge.kt @@ -29,6 +29,7 @@ open class ArtifactBridge( var entityStorage: VersionedEntityStorage, val project: Project, val eventDispatcher: EventDispatcher?, + val originalArtifact: ArtifactBridge?, ) : ModifiableArtifact, UserDataHolderBase() { init { @@ -42,7 +43,10 @@ open class ArtifactBridge( // In this case two artifact bridges exists with the same ArtifactId: one for removed artifact and one for newly created // We should make sure that we "disable" removed artifact bridge if (event.storageAfter.resolve(artifactId) != null - && event.storageBefore.artifactsMap.getDataByEntity(it.entity) != this@ArtifactBridge) return@forEach + && event.storageBefore.artifactsMap.getDataByEntity(it.entity) != this@ArtifactBridge + && event.storageBefore.artifactsMap.getDataByEntity(it.entity) != originalArtifact) { + return@forEach + } entityStorage = VersionedEntityStorageOnStorage(event.storageBefore) assert(entityStorage.current.resolve(artifactId) != null) { "Cannot resolve artifact $artifactId." } diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactModifiableModelBridge.kt b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactModifiableModelBridge.kt index 4581102857fb..02fc0bd4c7ba 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactModifiableModelBridge.kt +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/ArtifactModifiableModelBridge.kt @@ -148,7 +148,7 @@ class ArtifactModifiableModelBridge( ) val persistentId = artifactEntity.persistentId() - val modifiableArtifact = ArtifactBridge(persistentId, versionedOnBuilder, project, eventDispatcher) + val modifiableArtifact = ArtifactBridge(persistentId, versionedOnBuilder, project, eventDispatcher, null) modifiableToOriginal[modifiableArtifact] = modifiableArtifact diff.mutableArtifactsMap.addMapping(artifactEntity, modifiableArtifact) @@ -186,7 +186,7 @@ class ArtifactModifiableModelBridge( val existingModifiableArtifact = modifiableToOriginal.getKeysByValue(artifact)?.singleOrNull() if (existingModifiableArtifact != null) return existingModifiableArtifact - val modifiableArtifact = ArtifactBridge(artifactId, versionedOnBuilder, project, eventDispatcher) + val modifiableArtifact = ArtifactBridge(artifactId, versionedOnBuilder, project, eventDispatcher, artifact) modifiableToOriginal[modifiableArtifact] = artifact eventDispatcher.multicaster.artifactChanged(modifiableArtifact, artifact.name) return modifiableArtifact diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/BridgeUtils.kt b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/BridgeUtils.kt index 75ebf8acc8da..302d5d39589a 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/BridgeUtils.kt +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/BridgeUtils.kt @@ -57,7 +57,7 @@ internal fun createArtifactBridge(it: ArtifactEntity, entityStorage: VersionedEn JavaCompilerBundle.message("unknown.artifact.properties.0", unknownProperty)) } - return ArtifactBridge(it.persistentId(), entityStorage, project, null) + return ArtifactBridge(it.persistentId(), entityStorage, project, null, null) } fun PackagingElement<*>.forThisAndFullTree(action: (PackagingElement<*>) -> Unit) { diff --git a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/InvalidArtifactBridge.kt b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/InvalidArtifactBridge.kt index aa94fff8b4b2..8d4b57ac5ad7 100644 --- a/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/InvalidArtifactBridge.kt +++ b/java/compiler/impl/src/com/intellij/packaging/impl/artifacts/workspacemodel/InvalidArtifactBridge.kt @@ -17,6 +17,6 @@ class InvalidArtifactBridge( @Nls(capitalization = Nls.Capitalization.Sentence) private val _errorMessage: String, -) : InvalidArtifact, ArtifactBridge(_artifactId, entityStorage, project, eventDispatcher) { +) : InvalidArtifact, ArtifactBridge(_artifactId, entityStorage, project, eventDispatcher, null) { override fun getErrorMessage(): String = _errorMessage } diff --git a/java/compiler/tests/com/intellij/compiler/artifacts/ArtifactsModelTest.java b/java/compiler/tests/com/intellij/compiler/artifacts/ArtifactsModelTest.java index 4b86e1b89581..c9279a0fd22c 100644 --- a/java/compiler/tests/com/intellij/compiler/artifacts/ArtifactsModelTest.java +++ b/java/compiler/tests/com/intellij/compiler/artifacts/ArtifactsModelTest.java @@ -7,6 +7,7 @@ import com.intellij.packaging.impl.artifacts.PlainArtifactType; import org.jetbrains.annotations.NotNull; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotEquals; public class ArtifactsModelTest extends ArtifactsTestCase { public void testAddArtifact() { @@ -145,6 +146,24 @@ public class ArtifactsModelTest extends ArtifactsTestCase { assertTrue(newModifiableArtifact.isBuildOnMake()); } + public void testReplaceArtifactWithCheckingModifiableArtifactData() { + // This test checks if the recreation of the artifact with the same name doesn't replace the new artifact with the new one + Artifact artifact = addArtifact("A"); + assertSame(artifact, assertOneElement(getArtifacts())); + final ModifiableArtifactModel model = getArtifactManager().createModifiableModel(); + // Just create a modifiable artifact + ModifiableArtifact newArtifact = model.getOrCreateModifiableArtifact(artifact); + model.removeArtifact(artifact); + ModifiableArtifact newModifiableArtifact = model.addArtifact("A", PlainArtifactType.getInstance()); + newModifiableArtifact.setBuildOnMake(true); + newModifiableArtifact.setOutputPath("B"); + commit(model); + assertEquals("B", newModifiableArtifact.getOutputPath()); + assertTrue(newModifiableArtifact.isBuildOnMake()); + assertFalse(newArtifact.isBuildOnMake()); + assertNotEquals("B", newArtifact.getOutputPath()); + } + private Artifact[] getArtifacts() { return getArtifactManager().getArtifacts(); }