diff --git a/plugins/org.eclipse.xtext/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.xtext/.settings/org.eclipse.jdt.ui.prefs index f6caf5998..e5f3622ad 100644 --- a/plugins/org.eclipse.xtext/.settings/org.eclipse.jdt.ui.prefs +++ b/plugins/org.eclipse.xtext/.settings/org.eclipse.jdt.ui.prefs @@ -1,4 +1,3 @@ -#Wed Oct 14 22:36:24 CEST 2009 cleanup.add_default_serial_version_id=true cleanup.add_generated_serial_version_id=false cleanup.add_missing_annotations=true @@ -72,6 +71,7 @@ sp_cleanup.add_missing_deprecated_annotations=true sp_cleanup.add_missing_methods=false sp_cleanup.add_missing_nls_tags=false sp_cleanup.add_missing_override_annotations=true +sp_cleanup.add_missing_override_annotations_interface_methods=false sp_cleanup.add_serial_version_id=false sp_cleanup.always_use_blocks=true sp_cleanup.always_use_parentheses_in_expressions=false @@ -99,7 +99,7 @@ sp_cleanup.remove_private_constructors=true sp_cleanup.remove_trailing_whitespaces=false sp_cleanup.remove_trailing_whitespaces_all=true sp_cleanup.remove_trailing_whitespaces_ignore_empty=false -sp_cleanup.remove_unnecessary_casts=true +sp_cleanup.remove_unnecessary_casts=false sp_cleanup.remove_unnecessary_nls_tags=false sp_cleanup.remove_unused_imports=false sp_cleanup.remove_unused_local_variables=false diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java index b674e77a0..73bc28a9a 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java @@ -43,6 +43,7 @@ import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.URIConverter; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.ecore.util.InternalEList; import org.eclipse.xtext.linking.lazy.LazyLinkingResource; import org.eclipse.xtext.resource.ClassloaderClasspathUriResolver; import org.eclipse.xtext.util.CancelIndicator; @@ -608,4 +609,55 @@ public class EcoreUtil2 extends EcoreUtil { return URIConverter.INSTANCE.normalize(resource.getURI()); } } + + /** + * A better performing alternative to the {@link org.eclipse.emf.ecore.util.EcoreUtil.CrossReferencer}. + * + * @since 2.4 + */ + @SuppressWarnings("unchecked") + public static void findCrossReferences(EObject rootElement, Set targets, ElementReferenceAcceptor acceptor) { + for(EReference ref: rootElement.eClass().getEAllReferences()) { + if(rootElement.eIsSet(ref)) { + if(ref.isContainment()) { + Object content = rootElement.eGet(ref, false); + if(ref.isMany()) { + InternalEList contentList = (InternalEList) content; + for(int i=0; i values = (InternalEList) value; + for(int i=0; i< values.size(); ++i) { + EObject refElement = values.get(i); + if(targets.contains(refElement)) { + acceptor.accept(rootElement, refElement, ref, i); + } + } + } else { + EObject refElement = (EObject) value; + if(targets.contains(refElement)) { + acceptor.accept(rootElement, refElement, ref, -1); + } + } + } + } + } + } + + /** + * @since 2.4 + */ + public static interface ElementReferenceAcceptor { + void accept(EObject referrer, EObject referenced, EReference reference, int index); + } }