diff --git a/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.xtend b/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.xtend index a00ebabab..da40ecf86 100644 --- a/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.xtend +++ b/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.xtend @@ -52,6 +52,7 @@ class LiveShadowedChunkedContainerTest { @Inject IResourceDescription.Manager resourceDescriptionManager @Inject Provider provider + WorkspaceConfig workspaceConfig ProjectConfig fooProject ProjectConfig barProject @@ -63,9 +64,11 @@ class LiveShadowedChunkedContainerTest { LiveShadowedChunkedContainer fooContainer LiveShadowedChunkedContainer barContainer + LiveShadowedChunkedResourceDescriptions liveShadowedChunkedResourceDescriptions + @Before def void setUp() { - val workspaceConfig = new WorkspaceConfig() + workspaceConfig = new WorkspaceConfig() fooProject = new ProjectConfig('foo', workspaceConfig) barProject = new ProjectConfig('bar', workspaceConfig) val rs0 = resourceSetProvider.get @@ -78,7 +81,7 @@ class LiveShadowedChunkedContainerTest { rs1 = resourceSetProvider.get new ChunkedResourceDescriptions(chunks, rs1) ProjectConfigAdapter.install(rs1, fooProject) - val liveShadowedChunkedResourceDescriptions = provider.get + liveShadowedChunkedResourceDescriptions = provider.get liveShadowedChunkedResourceDescriptions.context = rs1 fooContainer = new LiveShadowedChunkedContainer(liveShadowedChunkedResourceDescriptions, 'foo') barContainer = new LiveShadowedChunkedContainer(liveShadowedChunkedResourceDescriptions, 'bar') @@ -104,16 +107,66 @@ class LiveShadowedChunkedContainerTest { assertTrue(barContainer.hasResourceDescription(barURI)) assertFalse(barContainer.hasResourceDescription(fooURI)) assertEquals(barURI, barContainer.getResourceDescription(barURI).URI) + + assertEquals('foo', (liveShadowedChunkedResourceDescriptions.globalDescriptions as ChunkedResourceDescriptions).getContainer('foo').getExportedObjects.map[qualifiedName.toString].join(',')) + assertEquals('bar', (liveShadowedChunkedResourceDescriptions.globalDescriptions as ChunkedResourceDescriptions).getContainer('bar').getExportedObjects.map[qualifiedName.toString].join(',')) } @Test - def testAddResource() { - 'baz'.parse(fooProject.sourceFolders.head.path.trimSegments(1).appendSegment('baz.livecontainertestlanguage'), rs1) + def testAddRemoveResource() { + val bazResource = 'baz'.parse(fooProject.sourceFolders.head.path.trimSegments(1).appendSegment('baz.livecontainertestlanguage'), rs1).eResource assertEquals(2, fooContainer.resourceDescriptions.size) assertEquals(2, fooContainer.resourceDescriptionCount) assertEquals('baz,foo', fooContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) assertEquals(1, barContainer.resourceDescriptions.size) assertEquals(1, barContainer.resourceDescriptionCount) + rs1.resources.remove(bazResource) + assertEquals(1, fooContainer.resourceDescriptions.size) + assertEquals(1, fooContainer.resourceDescriptionCount) + assertEquals('foo', fooContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(1, barContainer.resourceDescriptions.size) + assertEquals(1, barContainer.resourceDescriptionCount) + } + + @Test + def testMoveResourceBetweenContainers() { + val oldURI = fooProject.sourceFolders.head.path.trimSegments(1).appendSegment('baz.livecontainertestlanguage') + val bazResource = 'baz'.parse(oldURI, rs1).eResource + assertEquals(2, fooContainer.resourceDescriptions.size) + assertEquals(2, fooContainer.resourceDescriptionCount) + assertEquals('baz,foo', fooContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(oldURI, fooContainer.getExportedObjects(MODEL, QualifiedName.create('baz'), false).head.EObjectURI.trimFragment) + assertEquals(1, barContainer.resourceDescriptions.size) + assertEquals(1, barContainer.resourceDescriptionCount) + val newURI = URI.createURI(bazResource.URI.toString().replace('/foo/', '/bar/')) + bazResource.URI = newURI + assertEquals(1, fooContainer.resourceDescriptions.size) + assertEquals(1, fooContainer.resourceDescriptionCount) + assertEquals('foo', fooContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(1, fooContainer.resourceDescriptions.size) + assertEquals(1, fooContainer.resourceDescriptionCount) + assertEquals('bar,baz', barContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(2, barContainer.resourceDescriptions.size) + assertEquals(2, barContainer.resourceDescriptionCount) + assertEquals(newURI, barContainer.getExportedObjects(MODEL, QualifiedName.create('baz'), false).head.EObjectURI.trimFragment) + } + + @Test + def testAddToNewContainer() { + val bazProject = new ProjectConfig('baz', workspaceConfig) + val newURI = bazProject.sourceFolders.head.path.trimSegments(1).appendSegment('baz.livecontainertestlanguage') + 'baz'.parse(newURI, rs1) + val bazContainer = new LiveShadowedChunkedContainer(liveShadowedChunkedResourceDescriptions, 'baz') + assertEquals(1, fooContainer.resourceDescriptions.size) + assertEquals(1, fooContainer.resourceDescriptionCount) + assertEquals('foo', fooContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(1, barContainer.resourceDescriptions.size) + assertEquals(1, barContainer.resourceDescriptionCount) + assertEquals('bar', barContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(1, bazContainer.resourceDescriptions.size) + assertEquals(1, bazContainer.resourceDescriptionCount) + assertEquals('baz', bazContainer.exportedObjects.map[qualifiedName.toString].sort.join(',')) + assertEquals(newURI, bazContainer.getExportedObjects(MODEL, QualifiedName.create('baz'), false).head.EObjectURI.trimFragment) } @Test diff --git a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.java b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.java index 4fa797b95..df267039c 100644 --- a/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.java +++ b/org.eclipse.xtext.tests/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainerTest.java @@ -17,6 +17,7 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.resource.IEObjectDescription; import org.eclipse.xtext.resource.IResourceDescription; +import org.eclipse.xtext.resource.IResourceDescriptions; import org.eclipse.xtext.resource.LiveContainerTestLanguageInjectorProvider; import org.eclipse.xtext.resource.XtextResourceSet; import org.eclipse.xtext.resource.containers.LiveShadowedChunkedContainer; @@ -65,6 +66,8 @@ public class LiveShadowedChunkedContainerTest { @Inject private Provider provider; + private WorkspaceConfig workspaceConfig; + private ProjectConfig fooProject; private ProjectConfig barProject; @@ -79,13 +82,16 @@ public class LiveShadowedChunkedContainerTest { private LiveShadowedChunkedContainer barContainer; + private LiveShadowedChunkedResourceDescriptions liveShadowedChunkedResourceDescriptions; + @Before public void setUp() { try { - final WorkspaceConfig workspaceConfig = new WorkspaceConfig(); - ProjectConfig _projectConfig = new ProjectConfig("foo", workspaceConfig); + WorkspaceConfig _workspaceConfig = new WorkspaceConfig(); + this.workspaceConfig = _workspaceConfig; + ProjectConfig _projectConfig = new ProjectConfig("foo", this.workspaceConfig); this.fooProject = _projectConfig; - ProjectConfig _projectConfig_1 = new ProjectConfig("bar", workspaceConfig); + ProjectConfig _projectConfig_1 = new ProjectConfig("bar", this.workspaceConfig); this.barProject = _projectConfig_1; final XtextResourceSet rs0 = this.resourceSetProvider.get(); this.fooURI = IterableExtensions.head(this.fooProject.getSourceFolders()).getPath().trimSegments(1).appendSegment("foo.livecontainertestlanguage"); @@ -98,11 +104,11 @@ public class LiveShadowedChunkedContainerTest { this.rs1 = this.resourceSetProvider.get(); new ChunkedResourceDescriptions(chunks, this.rs1); ProjectConfigAdapter.install(this.rs1, this.fooProject); - final LiveShadowedChunkedResourceDescriptions liveShadowedChunkedResourceDescriptions = this.provider.get(); - liveShadowedChunkedResourceDescriptions.setContext(this.rs1); - LiveShadowedChunkedContainer _liveShadowedChunkedContainer = new LiveShadowedChunkedContainer(liveShadowedChunkedResourceDescriptions, "foo"); + this.liveShadowedChunkedResourceDescriptions = this.provider.get(); + this.liveShadowedChunkedResourceDescriptions.setContext(this.rs1); + LiveShadowedChunkedContainer _liveShadowedChunkedContainer = new LiveShadowedChunkedContainer(this.liveShadowedChunkedResourceDescriptions, "foo"); this.fooContainer = _liveShadowedChunkedContainer; - LiveShadowedChunkedContainer _liveShadowedChunkedContainer_1 = new LiveShadowedChunkedContainer(liveShadowedChunkedResourceDescriptions, "bar"); + LiveShadowedChunkedContainer _liveShadowedChunkedContainer_1 = new LiveShadowedChunkedContainer(this.liveShadowedChunkedResourceDescriptions, "bar"); this.barContainer = _liveShadowedChunkedContainer_1; } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); @@ -147,15 +153,25 @@ public class LiveShadowedChunkedContainerTest { Assert.assertTrue(this.barContainer.hasResourceDescription(this.barURI)); Assert.assertFalse(this.barContainer.hasResourceDescription(this.fooURI)); Assert.assertEquals(this.barURI, this.barContainer.getResourceDescription(this.barURI).getURI()); + IResourceDescriptions _globalDescriptions = this.liveShadowedChunkedResourceDescriptions.getGlobalDescriptions(); + final Function1 _function_6 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("foo", IterableExtensions.join(IterableExtensions.map(((ChunkedResourceDescriptions) _globalDescriptions).getContainer("foo").getExportedObjects(), _function_6), ",")); + IResourceDescriptions _globalDescriptions_1 = this.liveShadowedChunkedResourceDescriptions.getGlobalDescriptions(); + final Function1 _function_7 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("bar", IterableExtensions.join(IterableExtensions.map(((ChunkedResourceDescriptions) _globalDescriptions_1).getContainer("bar").getExportedObjects(), _function_7), ",")); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } } @Test - public void testAddResource() { + public void testAddRemoveResource() { try { - this._parseHelper.parse("baz", IterableExtensions.head(this.fooProject.getSourceFolders()).getPath().trimSegments(1).appendSegment("baz.livecontainertestlanguage"), this.rs1); + final Resource bazResource = this._parseHelper.parse("baz", IterableExtensions.head(this.fooProject.getSourceFolders()).getPath().trimSegments(1).appendSegment("baz.livecontainertestlanguage"), this.rs1).eResource(); Assert.assertEquals(2, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); Assert.assertEquals(2, this.fooContainer.getResourceDescriptionCount()); final Function1 _function = (IEObjectDescription it) -> { @@ -164,6 +180,82 @@ public class LiveShadowedChunkedContainerTest { Assert.assertEquals("baz,foo", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.fooContainer.getExportedObjects(), _function)), ",")); Assert.assertEquals(1, IterableExtensions.size(this.barContainer.getResourceDescriptions())); Assert.assertEquals(1, this.barContainer.getResourceDescriptionCount()); + this.rs1.getResources().remove(bazResource); + Assert.assertEquals(1, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.fooContainer.getResourceDescriptionCount()); + final Function1 _function_1 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("foo", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.fooContainer.getExportedObjects(), _function_1)), ",")); + Assert.assertEquals(1, IterableExtensions.size(this.barContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.barContainer.getResourceDescriptionCount()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testMoveResourceBetweenContainers() { + try { + final URI oldURI = IterableExtensions.head(this.fooProject.getSourceFolders()).getPath().trimSegments(1).appendSegment("baz.livecontainertestlanguage"); + final Resource bazResource = this._parseHelper.parse("baz", oldURI, this.rs1).eResource(); + Assert.assertEquals(2, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); + Assert.assertEquals(2, this.fooContainer.getResourceDescriptionCount()); + final Function1 _function = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("baz,foo", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.fooContainer.getExportedObjects(), _function)), ",")); + Assert.assertEquals(oldURI, IterableExtensions.head(this.fooContainer.getExportedObjects(LiveContainerTestLanguagePackage.Literals.MODEL, QualifiedName.create("baz"), false)).getEObjectURI().trimFragment()); + Assert.assertEquals(1, IterableExtensions.size(this.barContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.barContainer.getResourceDescriptionCount()); + final URI newURI = URI.createURI(bazResource.getURI().toString().replace("/foo/", "/bar/")); + bazResource.setURI(newURI); + Assert.assertEquals(1, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.fooContainer.getResourceDescriptionCount()); + final Function1 _function_1 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("foo", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.fooContainer.getExportedObjects(), _function_1)), ",")); + Assert.assertEquals(1, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.fooContainer.getResourceDescriptionCount()); + final Function1 _function_2 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("bar,baz", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.barContainer.getExportedObjects(), _function_2)), ",")); + Assert.assertEquals(2, IterableExtensions.size(this.barContainer.getResourceDescriptions())); + Assert.assertEquals(2, this.barContainer.getResourceDescriptionCount()); + Assert.assertEquals(newURI, IterableExtensions.head(this.barContainer.getExportedObjects(LiveContainerTestLanguagePackage.Literals.MODEL, QualifiedName.create("baz"), false)).getEObjectURI().trimFragment()); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } + + @Test + public void testAddToNewContainer() { + try { + final ProjectConfig bazProject = new ProjectConfig("baz", this.workspaceConfig); + final URI newURI = IterableExtensions.head(bazProject.getSourceFolders()).getPath().trimSegments(1).appendSegment("baz.livecontainertestlanguage"); + this._parseHelper.parse("baz", newURI, this.rs1); + final LiveShadowedChunkedContainer bazContainer = new LiveShadowedChunkedContainer(this.liveShadowedChunkedResourceDescriptions, "baz"); + Assert.assertEquals(1, IterableExtensions.size(this.fooContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.fooContainer.getResourceDescriptionCount()); + final Function1 _function = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("foo", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.fooContainer.getExportedObjects(), _function)), ",")); + Assert.assertEquals(1, IterableExtensions.size(this.barContainer.getResourceDescriptions())); + Assert.assertEquals(1, this.barContainer.getResourceDescriptionCount()); + final Function1 _function_1 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("bar", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(this.barContainer.getExportedObjects(), _function_1)), ",")); + Assert.assertEquals(1, IterableExtensions.size(bazContainer.getResourceDescriptions())); + Assert.assertEquals(1, bazContainer.getResourceDescriptionCount()); + final Function1 _function_2 = (IEObjectDescription it) -> { + return it.getQualifiedName().toString(); + }; + Assert.assertEquals("baz", IterableExtensions.join(IterableExtensions.sort(IterableExtensions.map(bazContainer.getExportedObjects(), _function_2)), ",")); + Assert.assertEquals(newURI, IterableExtensions.head(bazContainer.getExportedObjects(LiveContainerTestLanguagePackage.Literals.MODEL, QualifiedName.create("baz"), false)).getEObjectURI().trimFragment()); } catch (Throwable _e) { throw Exceptions.sneakyThrow(_e); } diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.xtend b/org.eclipse.xtext/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.xtend index 307f4fa8b..e595c2e6a 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.xtend +++ b/org.eclipse.xtext/src/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.xtend @@ -19,6 +19,7 @@ import org.eclipse.xtext.resource.IContainer import org.eclipse.xtext.resource.impl.ChunkedResourceDescriptions import org.eclipse.xtext.resource.impl.LiveShadowedChunkedResourceDescriptions import org.eclipse.xtext.workspace.IProjectConfig +import org.eclipse.xtext.resource.impl.ResourceDescriptionsData /** * @author koehnlein - Initial contribution and API @@ -50,7 +51,7 @@ class LiveShadowedChunkedContainer implements IContainer { } protected def getChunk() { - chunkedResourceDescriptions.getContainer(containerName) + chunkedResourceDescriptions.getContainer(containerName) ?: new ResourceDescriptionsData(#[]) } protected def getContainedLocalDescriptions() { diff --git a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.java b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.java index 566720c70..20ba38c58 100644 --- a/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.java +++ b/org.eclipse.xtext/xtend-gen/org/eclipse/xtext/resource/containers/LiveShadowedChunkedContainer.java @@ -9,6 +9,7 @@ package org.eclipse.xtext.resource.containers; import com.google.common.annotations.Beta; import com.google.common.collect.Iterables; +import java.util.Collections; import java.util.Set; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; @@ -27,6 +28,7 @@ import org.eclipse.xtext.resource.impl.ResourceDescriptionsData; import org.eclipse.xtext.workspace.IProjectConfig; import org.eclipse.xtext.workspace.ISourceFolder; import org.eclipse.xtext.workspace.IWorkspaceConfig; +import org.eclipse.xtext.xbase.lib.CollectionLiterals; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; @@ -65,7 +67,15 @@ public class LiveShadowedChunkedContainer implements IContainer { } protected ResourceDescriptionsData getChunk() { - return this.getChunkedResourceDescriptions().getContainer(this.containerName); + ResourceDescriptionsData _elvis = null; + ResourceDescriptionsData _container = this.getChunkedResourceDescriptions().getContainer(this.containerName); + if (_container != null) { + _elvis = _container; + } else { + ResourceDescriptionsData _resourceDescriptionsData = new ResourceDescriptionsData(Collections.unmodifiableList(CollectionLiterals.newArrayList())); + _elvis = _resourceDescriptionsData; + } + return _elvis; } protected Iterable getContainedLocalDescriptions() {