
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