/******************************************************************************* * Copyright © 2011, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * *******************************************************************************/ package org.eclipse.edt.compiler.generationServer; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.edt.compiler.generationServer.parts.IElementInfo; import org.eclipse.edt.compiler.generationServer.parts.IElementInfoVisitor; import org.eclipse.edt.compiler.generationServer.parts.IEmbeddedMemberInfo; import org.eclipse.edt.compiler.generationServer.parts.IExternalMemberInfo; import org.eclipse.edt.compiler.generationServer.parts.IPartInfo; import org.eclipse.edt.compiler.generationServer.parts.IUnresolvedPartInfo; public class GenerationServer { private static List listeners; private GenerationServer() { super(); // This class is never to be instantiated } public static boolean hasListeners() { return getListeners().size() > 0; } public static void addListener(IGenerationListener listener) { getListeners().add(listener); } public static void removeListener(IGenerationListener listener) { getListeners().remove(listener); } private static List getListeners() { if (listeners == null) { listeners = new ArrayList(); } return listeners; } public static void begin() { Iterator i = getListeners().iterator(); while (i.hasNext()) { IGenerationListener listener = (IGenerationListener)i.next(); listener.begin(); } } public static void end() { Iterator i = getListeners().iterator(); while (i.hasNext()) { IGenerationListener listener = (IGenerationListener)i.next(); listener.end(); } } public static void acceptGeneratedPart(IPartInfo part) { if (part == null) { return; } Iterator i = getListeners().iterator(); while (i.hasNext()) { IGenerationListener listener = (IGenerationListener)i.next(); listener.acceptGeneratedPart(part); } } public static void acceptAssociatedPart(IPartInfo part) { if (part == null) { return; } Iterator i = getListeners().iterator(); while (i.hasNext()) { IGenerationListener listener = (IGenerationListener)i.next(); listener.acceptAssociatedPart(part); } } public static void reset() { listeners = null; } //Given an array of partInfos, return an array of all parts (including referenced parts). //All parts in the array will be unique. public static IPartInfo[] getAllUniqueReferecedParts(IPartInfo[] parts) { List list = new ArrayList(); for (int i = 0; i < parts.length; i++) { addAllUnique(parts[i].getAllReferencedParts(), list); } return (IPartInfo[])list.toArray(new IPartInfo[list.size()]); } //Given an array of ElementInfos, return an array of all elements (including referenced parts, nested functions, referenced programs, etc). //All parts in the array will be unique. public static IElementInfo[] getAllUniqueReferecedElements(IElementInfo[] elements) { final List list = new ArrayList(); IElementInfoVisitor visitor = new IElementInfoVisitor() { public void endVisit(IPartInfo info) { } public void endVisit(IEmbeddedMemberInfo info) { } public void endVisit(IUnresolvedPartInfo info) { } public void endVisit(IExternalMemberInfo info) { } public boolean visit(IPartInfo info) { addAllUnique(info.getAllReferencedParts(), list); return false; } public boolean visit(IEmbeddedMemberInfo info) { if (!list.contains(info)) { list.add(info); } return false; } public boolean visit(IUnresolvedPartInfo info) { if (!list.contains(info)) { list.add(info); } return false; } public boolean visit(IExternalMemberInfo info) { if (!list.contains(info)) { list.add(info); } return false; } }; for (int i = 0; i < elements.length; i++) { elements[i].accept(visitor); } return (IElementInfo[])list.toArray(new IElementInfo[list.size()]); } private static void addAllUnique(Object[] parts, List list) { for (int i = 0; i < parts.length; i++) { if (!(list.contains(parts[i]))) { list.add(parts[i]); } } } }