Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 265365
Collapse All | Expand All

(-)src/org/eclipse/emf/codegen/ecore/genmodel/impl/GenClassImpl.java (-21 / +48 lines)
Lines 21-33 Link Here
21
import java.util.Arrays;
21
import java.util.Arrays;
22
import java.util.Collection;
22
import java.util.Collection;
23
import java.util.Collections;
23
import java.util.Collections;
24
import java.util.HashSet;
25
import java.util.Iterator;
24
import java.util.Iterator;
26
import java.util.LinkedHashMap;
25
import java.util.LinkedHashMap;
27
import java.util.List;
26
import java.util.List;
28
import java.util.Locale;
27
import java.util.Locale;
29
import java.util.Map;
28
import java.util.Map;
30
import java.util.Set;
31
29
32
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin;
30
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin;
33
import org.eclipse.emf.codegen.ecore.Generator;
31
import org.eclipse.emf.codegen.ecore.Generator;
Lines 448-482 Link Here
448
  }
446
  }
449
447
450
  public List<GenClass> getSwitchGenClasses()
448
  public List<GenClass> getSwitchGenClasses()
451
  {
449
  { 
452
    // for Ecore or something that explicitly extends it, we need to exclude
450
    // Traverse the supertypes to find the maximum depths.
453
    // EObject, which is already handled by the default case
451
    // Exclude this class itself, which is handled separately in the template.
454
    List<GenClass> result = 
452
    //
455
      collectGenClasses
453
    Map<EClass, Integer> maxDepths = new LinkedHashMap<EClass, Integer>();
456
        (getEcoreClass().getESuperTypes(), 
454
    findMaxSuperTypeDepths(maxDepths, getEcoreClass(), 0);
457
         new GenClassFilter()
455
    maxDepths.remove(getEcoreClass());
458
         {
459
           public boolean accept(GenClass genClass) 
460
           {
461
             return !genClass.isEObject();
462
           }
463
         });
464
    Set<GenClass> resultSet = new HashSet<GenClass>(result);
465
456
466
    for (int i = 0; i < result.size(); i++)
457
    // Order the results in a list of lists, indexed by maximum depth.
458
    // Exclude EObject, which is handled by the default case.
459
    //
460
    List<List<GenClass>> ordered = new ArrayList<List<GenClass>>();
461
    int resultSize = 0;
462
    for (Map.Entry<EClass, Integer> entry : maxDepths.entrySet())
467
    {
463
    {
468
      GenClass base = result.get(i);
464
      GenClass genClass = findGenClass(entry.getKey());
469
      for (GenClass baseOfBase : base.getBaseGenClasses())
465
      if (genClass != null && !genClass.isEObject())
470
      {
466
      {
471
        if (!baseOfBase.isEObject() && resultSet.add(baseOfBase))
467
        int depth = entry.getValue();
468
        while (ordered.size() <= depth)
472
        {
469
        {
473
          result.add(baseOfBase);
470
          ordered.add(new ArrayList<GenClass>());
474
        }
471
        }
472
        ordered.get(depth).add(genClass);
473
        resultSize++;
475
      }
474
      }
476
    }
475
    }
476
477
    // Traverse the list of lists to build a final ordered result.
478
    //
479
    List<GenClass> result = new ArrayList<GenClass>(resultSize);
480
    for (List<GenClass> genClasses : ordered)
481
    {
482
      result.addAll(genClasses);
483
    }
477
    return result;
484
    return result;
478
  }
485
  }
479
486
487
  private void findMaxSuperTypeDepths(Map<EClass, Integer> maxDepths, EClass eClass, int depth)
488
  {
489
    Integer existing = maxDepths.get(eClass);
490
    if (existing != null)
491
    {
492
      if (depth > existing)
493
      {
494
        maxDepths.put(eClass, depth);
495
      }
496
    }
497
    else
498
    {
499
      maxDepths.put(eClass, depth);
500
      for (EClass base : eClass.getESuperTypes())
501
      {
502
        findMaxSuperTypeDepths(maxDepths, base, depth + 1);
503
      }
504
    }
505
  }
506
480
  public GenClass getBaseGenClass()
507
  public GenClass getBaseGenClass()
481
  {
508
  {
482
    List<EClass> s = getEcoreClass().getESuperTypes();
509
    List<EClass> s = getEcoreClass().getESuperTypes();

Return to bug 265365