/**
* Copyright (c) 2009 Borland Software Corp.
*
* 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:
* Alexander Shatalin (Borland) - initial API and implementation
*/
package org.eclipse.gmf.internal.xpand.ast.analyze;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EOperation;
import org.eclipse.gmf.internal.xpand.ast.AbstractAstVisitor;
import org.eclipse.gmf.internal.xpand.ocl.ExpressionHelper;
import org.eclipse.m2m.internal.qvt.oml.expressions.Module;
import org.eclipse.ocl.ecore.OperationCallExp;
public class UnusedModulesCollector extends AbstractAstVisitor {
private Set<Module> myUnusedModules;
public UnusedModulesCollector(Set<Module> allModules) {
myUnusedModules = new LinkedHashSet<Module>(allModules);
}
public Set<Module> getUnusedModules() {
return myUnusedModules;
}
@Override
protected void visitExpressionHelper(ExpressionHelper expressionHelper) {
if (myUnusedModules.size() == 0) {
return;
}
if (expressionHelper.getOCLExpression() != null) {
purgeUsedModule(expressionHelper.getOCLExpression());
for (Iterator<EObject> it = expressionHelper.getOCLExpression().eAllContents(); it.hasNext();) {
purgeUsedModule(it.next());
}
}
}
private void purgeUsedModule(EObject oclAstElement) {
if (oclAstElement instanceof OperationCallExp) {
OperationCallExp opCall = (OperationCallExp) oclAstElement;
EOperation referredOperation = opCall.getReferredOperation();
if (referredOperation != null) {
EObject eContainer = referredOperation.eContainer();
if (eContainer instanceof Module) {
myUnusedModules.remove(eContainer);
}
}
}
}
}