package org.absmodels.abs.plugin.editor.views.typehierarchy; import java.util.ArrayList; import java.util.Collection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import abs.frontend.ast.DataConstructor; import abs.frontend.ast.DataTypeDecl; import abs.frontend.ast.Decl; import abs.frontend.ast.HasTypeHierarchy; import abs.frontend.ast.InterfaceDecl; import abs.frontend.ast.TypeSynDecl; import abs.frontend.typechecker.InterfaceType; import abs.frontend.typechecker.Type; import abs.frontend.typechecker.UnionType; public class TypeHierarchyContentProvider implements ITreeContentProvider { private static final Object[] nothing = new Object[] {}; @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } @Override public void dispose() { } @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Type) { Type type = (Type) inputElement; if (type.getDecl() != null) { return new Object[] { type.getDecl() }; } if (type instanceof UnionType) { UnionType unionType = (UnionType) type; java.util.List<Object> result = new ArrayList<Object>(); for (InterfaceType t : unionType.getTypes()) { for (Object e : getElements(t)) { result.add(e); } } return result.toArray(); } } return nothing; } @Override public Object[] getChildren(Object node) { if (node instanceof InterfaceDecl) { InterfaceDecl interfaceDecl = (InterfaceDecl) node; Collection<HasTypeHierarchy> subTypes = interfaceDecl.getDirectSubTypes(); return subTypes.toArray(); } else if (node instanceof DataTypeDecl) { DataTypeDecl dataTypeDecl = (DataTypeDecl) node; Object[] result = new Object[dataTypeDecl.getNumDataConstructor()]; int i = 0; for (DataConstructor d : dataTypeDecl.getDataConstructors()) { result[i] = d; i++; } return result; } else if (node instanceof TypeSynDecl) { TypeSynDecl typeSynDecl = (TypeSynDecl) node; return new Object[] { typeSynDecl.getType().getDecl() }; } return nothing; } @Override public Object getParent(Object element) { return null; } @Override public boolean hasChildren(Object element) { return element instanceof InterfaceDecl || element instanceof DataTypeDecl || element instanceof TypeSynDecl; } }