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;