/** * Copyright (c) 2012 Eclipse contributors 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 */ package org.eclipse.emf.ecore.xcore.ui.refactoring; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.SubMonitor; import org.eclipse.emf.codegen.ecore.genmodel.GenClass; import org.eclipse.emf.codegen.ecore.genmodel.GenDataType; import org.eclipse.emf.codegen.ecore.genmodel.GenEnumLiteral; import org.eclipse.emf.codegen.ecore.genmodel.GenFeature; import org.eclipse.emf.codegen.ecore.genmodel.GenOperation; import org.eclipse.emf.codegen.ecore.genmodel.GenPackage; import org.eclipse.emf.codegen.ecore.genmodel.GenParameter; import org.eclipse.emf.codegen.ecore.genmodel.GenTypeParameter; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xcore.XClass; import org.eclipse.emf.ecore.xcore.XDataType; import org.eclipse.emf.ecore.xcore.XEnumLiteral; import org.eclipse.emf.ecore.xcore.XOperation; import org.eclipse.emf.ecore.xcore.XPackage; import org.eclipse.emf.ecore.xcore.XParameter; import org.eclipse.emf.ecore.xcore.XStructuralFeature; import org.eclipse.emf.ecore.xcore.XTypeParameter; import org.eclipse.emf.ecore.xcore.mappings.XClassMapping; import org.eclipse.emf.ecore.xcore.mappings.XDataTypeMapping; import org.eclipse.emf.ecore.xcore.mappings.XEnumLiteralMapping; import org.eclipse.emf.ecore.xcore.mappings.XFeatureMapping; import org.eclipse.emf.ecore.xcore.mappings.XOperationMapping; import org.eclipse.emf.ecore.xcore.mappings.XPackageMapping; import org.eclipse.emf.ecore.xcore.mappings.XParameterMapping; import org.eclipse.emf.ecore.xcore.mappings.XTypeParameterMapping; import org.eclipse.emf.ecore.xcore.mappings.XcoreMapper; import org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer; import org.eclipse.emf.ecore.xcore.util.XcoreSwitch; import org.eclipse.xtext.common.types.JvmIdentifiableElement; import org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator; import com.google.common.collect.Lists; import com.google.inject.Inject; public class XcoreDependentElementsCalculator extends DefaultDependentElementsCalculator { @Inject private XcoreMapper mapper; @Override public List<URI> getDependentElementURIs(EObject eObject, final IProgressMonitor monitor) { final List<URI> result = super.getDependentElementURIs(eObject, monitor); new XcoreSwitch<Boolean>() { @Override public Boolean caseXPackage(XPackage xPackage) { XPackageMapping mapping = mapper.getMapping(xPackage); GenPackage genPackage = mapping.getGenPackage(); result.addAll(doGetDependentElementURIs(genPackage, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEPackage(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genPackage)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXClass(XClass xClass) { XClassMapping mapping = mapper.getMapping(xClass); GenClass genClass = mapping.getGenClass(); result.addAll(doGetDependentElementURIs(genClass, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEClass(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genClass)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXDataType(XDataType xDataType) { XDataTypeMapping mapping = mapper.getMapping(xDataType); GenDataType genDataType = mapping.getGenDataType(); result.addAll(doGetDependentElementURIs(genDataType, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEDataType(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genDataType)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXEnumLiteral(XEnumLiteral xEnumLiteral) { XEnumLiteralMapping mapping = mapper.getMapping(xEnumLiteral); GenEnumLiteral genEnumLiteral = mapping.getGenEnumLiteral(); result.addAll(doGetDependentElementURIs(genEnumLiteral, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEEnumLiteral(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genEnumLiteral)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXStructuralFeature(XStructuralFeature xStructuralFeature) { XFeatureMapping mapping = mapper.getMapping(xStructuralFeature); GenFeature genFeature = mapping.getGenFeature(); result.addAll(doGetDependentElementURIs(genFeature, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEStructuralFeature(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genFeature)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXOperation(XOperation xOperation) { XOperationMapping mapping = mapper.getMapping(xOperation); GenOperation genOperation = mapping.getGenOperation(); result.addAll(doGetDependentElementURIs(genOperation, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEOperation(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genOperation)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXParameter(XParameter xParameter) { XParameterMapping mapping = mapper.getMapping(xParameter); GenParameter genParameter = mapping.getGenParameter(); result.addAll(doGetDependentElementURIs(genParameter, monitor)); result.addAll(doGetDependentElementURIs(mapping.getEParameter(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genParameter)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } @Override public Boolean caseXTypeParameter(XTypeParameter xTypeParameter) { XTypeParameterMapping mapping = mapper.getMapping(xTypeParameter); GenTypeParameter genTypeParameter = mapping.getGenTypeParameter(); result.addAll(doGetDependentElementURIs(genTypeParameter, monitor)); result.addAll(doGetDependentElementURIs(mapping.getETypeParameter(), monitor)); for (JvmIdentifiableElement jvmIdentifiableElement : XcoreJvmInferrer.getInferredElements(genTypeParameter)) { result.addAll(doGetDependentElementURIs(jvmIdentifiableElement, monitor)); } return Boolean.FALSE; } }.doSwitch(eObject); return result; } protected List<URI> doGetDependentElementURIs(EObject eObject, final IProgressMonitor monitor) { List<URI> result = Lists.newArrayList(); if (eObject != null) { SubMonitor progress = SubMonitor.convert(monitor, 10); for (Iterator<EObject> i = EcoreUtil.getAllProperContents(Collections.singleton(eObject), false); !progress.isCanceled() && i.hasNext(); ) { EObject childElement = i.next(); URI childURI = EcoreUtil.getURI(childElement); if (childURI != null) { result.add(childURI); } } progress.worked(1); progress.setWorkRemaining(10); } return result; } }