Resolve oneof field names when doing scoping for complex values
Change-Id: I4492d8ff259f5bc5443698b6e696b493255252e5
Signed-off-by: Harry Terkelsen <het@google.com>
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
index 00ac058..f888abf 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NormalFieldNameFinderStrategy.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012 Google Inc.
+ * Copyright (c) 2014 Google Inc.
*
* 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
@@ -12,10 +12,12 @@
import static org.eclipse.xtext.resource.EObjectDescription.create;
import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
import com.google.eclipse.protobuf.model.util.MessageFields;
import com.google.eclipse.protobuf.protobuf.Group;
import com.google.eclipse.protobuf.protobuf.IndexedElement;
import com.google.eclipse.protobuf.protobuf.MessageField;
+import com.google.eclipse.protobuf.protobuf.OneOf;
import com.google.inject.Inject;
import org.eclipse.emf.ecore.EObject;
@@ -31,24 +33,30 @@
@Inject private MessageFields messageFields;
@Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
- Set<IEObjectDescription> descriptions = newHashSet();
- Iterable<? extends EObject> elements = reference instanceof Group
+ Iterable<? extends EObject> elements = reference instanceof Group
? ((Group) reference).getElements()
- : reference instanceof MessageField
+ : reference instanceof MessageField
? messageFields.messageTypeOf((MessageField) reference).getElements()
: null;
+ return getDescriptions(elements);
+ }
- if (elements != null) {
- for (EObject element : elements) {
- if (element instanceof MessageField) {
- String name = ((MessageField) element).getName();
+ private Set<IEObjectDescription> getDescriptions(Iterable<? extends EObject> elements) {
+ if (elements == null) {
+ return ImmutableSet.of();
+ }
+ Set<IEObjectDescription> descriptions = newHashSet();
+ for (EObject element : elements) {
+ if (element instanceof MessageField) {
+ String name = ((MessageField) element).getName();
+ descriptions.add(create(name, element));
+ } else if (element instanceof Group) {
+ String name = ((Group) element).getName();
+ if (!Strings.isNullOrEmpty(name)) {
descriptions.add(create(name, element));
- } else if (element instanceof Group) {
- String name = ((Group) element).getName();
- if (!Strings.isNullOrEmpty(name)) {
- descriptions.add(create(name, element));
- }
}
+ } else if (element instanceof OneOf) {
+ descriptions.addAll(getDescriptions(((OneOf) element).getElements()));
}
}
return descriptions;