[458026] Improve the computation of used packages for circularity
diff --git a/plugins/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.xtend b/plugins/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.xtend
index 3345864..d574316 100644
--- a/plugins/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.xtend
+++ b/plugins/org.eclipse.emf.ecore.xcore/src/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.xtend
@@ -170,8 +170,10 @@
                val EPackage referencedEPackage = eCrossReference.getEPackage
                if (referencedEPackage != null)
                {
-                 ePackages.add(referencedEPackage)
-                 referencedEPackages.add(referencedEPackage)
+                 if (ePackages.add(referencedEPackage))
+                 {
+                   referencedEPackages.add(referencedEPackage)
+                 }
                }
              }
              EStructuralFeature:
@@ -182,8 +184,10 @@
                  val EPackage referencedEPackage = eContainingClass.getEPackage
                  if (referencedEPackage != null)
                  {
-                   ePackages.add(referencedEPackage) 
-                   referencedEPackages.add(referencedEPackage)
+                   if (ePackages.add(referencedEPackage))
+                   {
+                     referencedEPackages.add(referencedEPackage)
+                   }
                  }
                }
              }
@@ -195,65 +199,70 @@
 
     for (referencedEPackage : referencedEPackages)
     {
-      if (genModel.findGenPackage(referencedEPackage) == null)
+      var usedGenPackage = genModel.findGenPackage(referencedEPackage);
+      if (usedGenPackage == null)
       {
-        var usedGenPackage = mapper.getGen(mapper.getToXcoreMapping(referencedEPackage).xcoreElement) as GenPackage
+        usedGenPackage = mapper.getGen(mapper.getToXcoreMapping(referencedEPackage).xcoreElement) as GenPackage
         if (usedGenPackage == null)
         {
           usedGenPackage = findLocalGenPackage(referencedEPackage)
         }
-        if (usedGenPackage != null)
+      }
+
+      if (usedGenPackage != null)
+      {
+        if (usedGenPackage.eResource() != null)
         {
           genModel.usedGenPackages.add(usedGenPackage)
         }
-        else
+      }
+      else
+      {
+        val genModelResource = genModel.eResource
+        val resources = genModelResource.resourceSet.resources
+        i = 0
+        var boolean found = false
+        while (i < resources.size && !found)
         {
-          val genModelResource = genModel.eResource
-          val resources = genModelResource.resourceSet.resources
-          i = 0
-          var boolean found = false
-          while (i < resources.size && !found)
+          val resource = resources.get(i)
+          if (resource != genModelResource)
           {
-            val resource = resources.get(i)
-            if (resource != genModelResource)
+            val fileExtension = resource.URI.fileExtension
+            if ("xcore".equals(fileExtension))
             {
-              val fileExtension = resource.URI.fileExtension
-              if ("xcore".equals(fileExtension))
+              val contents = resource.contents;
+              if (!contents.empty)
               {
-                val contents = resource.contents;
-                if (!contents.empty)
+                val GenModel usedGenModel = resource.contents.get(1) as GenModel
+                usedGenPackage = usedGenModel.findGenPackage(referencedEPackage)
+                if (usedGenPackage != null)
                 {
-                  val GenModel usedGenModel = resource.contents.get(1) as GenModel
-                  usedGenPackage = usedGenModel.findGenPackage(referencedEPackage)
-                  if (usedGenPackage != null)
-                  {
-                    genModel.usedGenPackages.add(usedGenPackage)
-                    found = true
-                  }
-                }
-              }
-              else if ("genmodel".equals(fileExtension))
-              {
-                val contents = resource.contents;
-                if (!contents.empty)
-                {
-                  val GenModel usedGenModel = resource.contents.get(0) as GenModel
-                  usedGenModel.reconcile
-                  usedGenPackage = usedGenModel.findGenPackage(referencedEPackage)
-                  if (usedGenPackage != null)
-                  {
-                    genModel.usedGenPackages.add(usedGenPackage)
-                    found = true
-                  }
+                  genModel.usedGenPackages.add(usedGenPackage)
+                  found = true
                 }
               }
             }
-            i = i + 1
+            else if ("genmodel".equals(fileExtension))
+            {
+              val contents = resource.contents;
+              if (!contents.empty)
+              {
+                val GenModel usedGenModel = resource.contents.get(0) as GenModel
+                usedGenModel.reconcile
+                usedGenPackage = usedGenModel.findGenPackage(referencedEPackage)
+                if (usedGenPackage != null)
+                {
+                  genModel.usedGenPackages.add(usedGenPackage)
+                  found = true
+                }
+              }
+            }
           }
-          if (!found)
-          {
-            throw new RuntimeException("No GenPackage found for " + referencedEPackage)
-          }
+          i = i + 1
+        }
+        if (!found)
+        {
+          throw new RuntimeException("No GenPackage found for " + referencedEPackage)
         }
       }
     }
diff --git a/plugins/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.java b/plugins/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.java
index bddbf4a..7232ae0 100644
--- a/plugins/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.java
+++ b/plugins/org.eclipse.emf.ecore.xcore/xtend-gen/org/eclipse/emf/ecore/xcore/util/XcoreGenModelBuilder.java
@@ -251,8 +251,10 @@
                     final EPackage referencedEPackage = ((EClassifier)eCrossReference).getEPackage();
                     boolean _notEquals = (!Objects.equal(referencedEPackage, null));
                     if (_notEquals) {
-                      ePackages.add(referencedEPackage);
-                      referencedEPackages.add(referencedEPackage);
+                      boolean _add = ePackages.add(referencedEPackage);
+                      if (_add) {
+                        referencedEPackages.add(referencedEPackage);
+                      }
                     }
                   }
                 }
@@ -265,8 +267,10 @@
                       final EPackage referencedEPackage = eContainingClass.getEPackage();
                       boolean _notEquals_1 = (!Objects.equal(referencedEPackage, null));
                       if (_notEquals_1) {
-                        ePackages.add(referencedEPackage);
-                        referencedEPackages.add(referencedEPackage);
+                        boolean _add = ePackages.add(referencedEPackage);
+                        if (_add) {
+                          referencedEPackages.add(referencedEPackage);
+                        }
                       }
                     }
                   }
@@ -278,22 +282,28 @@
       }
     }
     for (final EPackage referencedEPackage : referencedEPackages) {
-      GenPackage _findGenPackage = genModel.findGenPackage(referencedEPackage);
-      boolean _equals = Objects.equal(_findGenPackage, null);
-      if (_equals) {
-        ToXcoreMapping _toXcoreMapping = this.mapper.getToXcoreMapping(referencedEPackage);
-        XNamedElement _xcoreElement = _toXcoreMapping.getXcoreElement();
-        GenBase _gen = this.mapper.getGen(_xcoreElement);
-        GenPackage usedGenPackage = ((GenPackage) _gen);
-        boolean _equals_1 = Objects.equal(usedGenPackage, null);
-        if (_equals_1) {
-          GenPackage _findLocalGenPackage = this.findLocalGenPackage(referencedEPackage);
-          usedGenPackage = _findLocalGenPackage;
+      {
+        GenPackage usedGenPackage = genModel.findGenPackage(referencedEPackage);
+        boolean _equals = Objects.equal(usedGenPackage, null);
+        if (_equals) {
+          ToXcoreMapping _toXcoreMapping = this.mapper.getToXcoreMapping(referencedEPackage);
+          XNamedElement _xcoreElement = _toXcoreMapping.getXcoreElement();
+          GenBase _gen = this.mapper.getGen(_xcoreElement);
+          usedGenPackage = ((GenPackage) _gen);
+          boolean _equals_1 = Objects.equal(usedGenPackage, null);
+          if (_equals_1) {
+            GenPackage _findLocalGenPackage = this.findLocalGenPackage(referencedEPackage);
+            usedGenPackage = _findLocalGenPackage;
+          }
         }
         boolean _notEquals = (!Objects.equal(usedGenPackage, null));
         if (_notEquals) {
-          EList<GenPackage> _usedGenPackages = genModel.getUsedGenPackages();
-          _usedGenPackages.add(usedGenPackage);
+          Resource _eResource = usedGenPackage.eResource();
+          boolean _notEquals_1 = (!Objects.equal(_eResource, null));
+          if (_notEquals_1) {
+            EList<GenPackage> _usedGenPackages = genModel.getUsedGenPackages();
+            _usedGenPackages.add(usedGenPackage);
+          }
         } else {
           final Resource genModelResource = genModel.eResource();
           ResourceSet _resourceSet = genModelResource.getResourceSet();
@@ -303,8 +313,8 @@
           while (((i < resources.size()) && (!found))) {
             {
               final Resource resource = resources.get(i);
-              boolean _notEquals_1 = (!Objects.equal(resource, genModelResource));
-              if (_notEquals_1) {
+              boolean _notEquals_2 = (!Objects.equal(resource, genModelResource));
+              if (_notEquals_2) {
                 URI _uRI = resource.getURI();
                 final String fileExtension = _uRI.fileExtension();
                 boolean _equals_2 = "xcore".equals(fileExtension);
@@ -316,10 +326,10 @@
                     EList<EObject> _contents = resource.getContents();
                     EObject _get = _contents.get(1);
                     final GenModel usedGenModel = ((GenModel) _get);
-                    GenPackage _findGenPackage_1 = usedGenModel.findGenPackage(referencedEPackage);
-                    usedGenPackage = _findGenPackage_1;
-                    boolean _notEquals_2 = (!Objects.equal(usedGenPackage, null));
-                    if (_notEquals_2) {
+                    GenPackage _findGenPackage = usedGenModel.findGenPackage(referencedEPackage);
+                    usedGenPackage = _findGenPackage;
+                    boolean _notEquals_3 = (!Objects.equal(usedGenPackage, null));
+                    if (_notEquals_3) {
                       EList<GenPackage> _usedGenPackages_1 = genModel.getUsedGenPackages();
                       _usedGenPackages_1.add(usedGenPackage);
                       found = true;
@@ -336,10 +346,10 @@
                       EObject _get_1 = _contents_1.get(0);
                       final GenModel usedGenModel_1 = ((GenModel) _get_1);
                       usedGenModel_1.reconcile();
-                      GenPackage _findGenPackage_2 = usedGenModel_1.findGenPackage(referencedEPackage);
-                      usedGenPackage = _findGenPackage_2;
-                      boolean _notEquals_3 = (!Objects.equal(usedGenPackage, null));
-                      if (_notEquals_3) {
+                      GenPackage _findGenPackage_1 = usedGenModel_1.findGenPackage(referencedEPackage);
+                      usedGenPackage = _findGenPackage_1;
+                      boolean _notEquals_4 = (!Objects.equal(usedGenPackage, null));
+                      if (_notEquals_4) {
                         EList<GenPackage> _usedGenPackages_2 = genModel.getUsedGenPackages();
                         _usedGenPackages_2.add(usedGenPackage);
                         found = true;