/** * 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.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.gmf.internal.xpand.ast.AbstractAstVisitor; import org.eclipse.gmf.internal.xpand.ast.AbstractDefinition; import org.eclipse.gmf.internal.xpand.model.ExecutionContext; import org.eclipse.gmf.internal.xpand.ocl.DeclaredParameter; import org.eclipse.gmf.internal.xpand.ocl.ExpressionHelper; import org.eclipse.ocl.ecore.TypeExp; public class UnusedMetamodelsCollector extends AbstractAstVisitor { private LinkedHashSet<EPackage> myUnusedEPackages; private ExecutionContext myContext; public UnusedMetamodelsCollector(Set<EPackage> ePackages, ExecutionContext context) { myUnusedEPackages = new LinkedHashSet<EPackage>(ePackages); myContext = context; } public Set<EPackage> getUnusedEPackages() { return myUnusedEPackages; } @Override protected boolean visit(AbstractDefinition definition) { if (myUnusedEPackages.size() == 0) { return false; } EClassifier type = definition.getType().getTypeForName(myContext); if (type != null) { myUnusedEPackages.remove(type.getEPackage()); } for (DeclaredParameter parameter : definition.getParemeters()) { type = parameter.getTypeForName(myContext); if (type != null) { myUnusedEPackages.remove(type.getEPackage()); } } return super.visit(definition); } @Override protected void visitExpressionHelper(ExpressionHelper expressionHelper) { if (myUnusedEPackages.size() == 0) { return; } if (expressionHelper.getOCLExpression() != null) { purgeUsedEPackages(expressionHelper.getOCLExpression()); for (Iterator<EObject> it = expressionHelper.getOCLExpression().eAllContents(); it.hasNext();) { purgeUsedEPackages(it.next()); } } } private void purgeUsedEPackages(EObject oclAstElement) { if (oclAstElement instanceof TypeExp) { TypeExp typeExpression = (TypeExp) oclAstElement; if (typeExpression.getReferredType() != null) { myUnusedEPackages.remove(typeExpression.getReferredType().getEPackage()); } } } }