From 66b8ace522199fc77d70f8b97162c6e1c82c687b Mon Sep 17 00:00:00 2001 From: Moritz Eysholdt Date: Fri, 14 Oct 2016 09:07:32 +0200 Subject: [PATCH] [GrammarUtil/perf] make containing*() fast for misses containingAssignment() and containingCrossReference() should return null as fast as possible when there is no Assignemnt/CrossReference Signed-off-by: Moritz Eysholdt --- .../src/org/eclipse/xtext/GrammarUtil.java | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java b/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java index 3f08d2f5b..66d405bcc 100644 --- a/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java +++ b/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java @@ -120,7 +120,26 @@ public class GrammarUtil { } public static Assignment containingAssignment(EObject e) { - return getContainerOfType(e, Assignment.class); + EObject current = e; + while (current != null) { + switch (current.eClass().getClassifierID()) { + case XtextPackage.ASSIGNMENT: + return (Assignment) current; + case XtextPackage.GROUP: + case XtextPackage.UNORDERED_GROUP: + case XtextPackage.PARSER_RULE: + case XtextPackage.TERMINAL_RULE: + case XtextPackage.ENUM_RULE: + return null; + case XtextPackage.ALTERNATIVES: + if (((Alternatives) current).getCardinality() != null) { + return null; + } + default: + current = current.eContainer(); + } + } + return null; } public static Group containingGroup(EObject e) { @@ -132,7 +151,23 @@ public class GrammarUtil { } public static CrossReference containingCrossReference(EObject e) { - return getContainerOfType(e, CrossReference.class); + EObject current = e; + while (current != null) { + switch (current.eClass().getClassifierID()) { + case XtextPackage.CROSS_REFERENCE: + return (CrossReference) current; + case XtextPackage.GROUP: + case XtextPackage.UNORDERED_GROUP: + case XtextPackage.ALTERNATIVES: + case XtextPackage.PARSER_RULE: + case XtextPackage.TERMINAL_RULE: + case XtextPackage.ENUM_RULE: + return null; + default: + current = current.eContainer(); + } + } + return null; } public static List containedActions(EObject e) {