All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.fulib.scenarios.ast.decl.ClassDeclDelegate Maven / Gradle / Ivy

package org.fulib.scenarios.ast.decl;

import org.fulib.scenarios.ast.type.Type;
import org.fulib.scenarios.visitor.ExtractClassDecl;

import java.util.ArrayDeque;
import java.util.LinkedHashSet;
import java.util.Queue;
import java.util.Set;

public class ClassDeclDelegate
{
   public static Set getSuperClasses(ClassDecl classDecl)
   {
      Set superClasses = classDecl.getStoredSuperClasses();
      if (superClasses == null)
      {
         //noinspection SynchronizationOnLocalVariableOrMethodParameter
         synchronized (classDecl)
         {
            superClasses = classDecl.getStoredSuperClasses();
            if (superClasses == null)
            {
               superClasses = computeSuperClasses(classDecl);
               classDecl.setStoredSuperClasses(superClasses);
            }
         }
      }

      return superClasses;
   }

   /**
    * Computes the set of superclasses in breadth-first order.
    *
    * @param classDecl the class
    * @return the set of superclasses in breadth-first order.
    */
   private static Set computeSuperClasses(ClassDecl classDecl)
   {
      final Set result = new LinkedHashSet<>();
      final Queue queue = new ArrayDeque<>();

      queue.add(classDecl);

      while (!queue.isEmpty())
      {
         final ClassDecl c = queue.remove();
         if (!result.add(c))
         {
            continue;
         }

         Type superType = c.getSuperType();
         if (superType == null)
         {
            continue;
         }

         ClassDecl sup = superType.accept(ExtractClassDecl.INSTANCE, null);
         if (sup == null)
         {
            continue;
         }

         queue.add(sup);
         // interfaces...?
      }

      return result;
   }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy