Fixed linking to groups in complex values, for example:
message M {
option (custom_option) = {
groupMember {
valueInGroup: true
}
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
index b0b7f57..d524df7 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -8,14 +8,6 @@
*/
package com.google.eclipse.protobuf.ui.contentassist;
-import static java.lang.String.valueOf;
-import static java.util.Collections.emptyList;
-import static java.util.Collections.emptySet;
-
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
-import static org.eclipse.xtext.util.Strings.isEmpty;
-import static org.eclipse.xtext.util.Strings.toFirstLower;
-
import static com.google.common.collect.Lists.newArrayList;
import static com.google.eclipse.protobuf.grammar.CommonKeyword.CLOSING_BRACKET;
import static com.google.eclipse.protobuf.grammar.CommonKeyword.DEFAULT;
@@ -38,24 +30,12 @@
import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.EQUAL_PROTO2_IN_QUOTES;
import static com.google.eclipse.protobuf.ui.grammar.CompoundElement.PROTO2_IN_QUOTES;
import static com.google.eclipse.protobuf.util.CommonWords.space;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.xtext.Assignment;
-import org.eclipse.xtext.Keyword;
-import org.eclipse.xtext.RuleCall;
-import org.eclipse.xtext.naming.QualifiedName;
-import org.eclipse.xtext.resource.IEObjectDescription;
-import org.eclipse.xtext.ui.PluginImageHelper;
-import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
-import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
-import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import static java.lang.String.valueOf;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptySet;
+import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+import static org.eclipse.xtext.util.Strings.toFirstLower;
import com.google.eclipse.protobuf.grammar.CommonKeyword;
import com.google.eclipse.protobuf.model.util.IndexedElements;
@@ -90,6 +70,24 @@
import com.google.eclipse.protobuf.ui.labeling.Images;
import com.google.inject.Inject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.Keyword;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.naming.QualifiedName;
+import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.ui.PluginImageHelper;
+import org.eclipse.xtext.ui.editor.contentassist.ConfigurableCompletionProposal;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+
+import java.util.Collection;
+import java.util.List;
+
/**
* @author alruiz@google.com (Alex Ruiz)
@@ -696,7 +694,10 @@
SimpleValueField field = (SimpleValueField) model;
FieldName name = field.getName();
if (name != null) {
- proposeFieldValue(name.getTarget(), context, acceptor);
+ IndexedElement target = name.getTarget();
+ if (target instanceof MessageField) {
+ proposeFieldValue((MessageField) target, context, acceptor);
+ }
}
}
}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
index cfb6a0b..eb022ea 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -212,13 +212,13 @@
// { foo: 1, bar: 2 }
ComplexValueCurlyBracket:
'{'
- (fields+=ValueField (',')? (fields+=ValueField (',')?)*)?
+ fields+=ValueField ((',')? fields+=ValueField)* (',')?
'}';
-
+
// < foo: 1, bar: 2 >
ComplexValueAngleBracket:
'<'
- (fields+=ValueField (',')? (fields+=ValueField (',')?)*)?
+ fields+=ValueField ((',')? fields+=ValueField)* (',')?
'>';
ValueField:
@@ -234,10 +234,10 @@
NormalFieldName | ExtensionFieldName;
NormalFieldName:
- target=[MessageField|Name];
+ target=[IndexedElement|Name];
ExtensionFieldName:
- '[' target=[MessageField|QualifiedName] ']';
+ '[' target=[IndexedElement|QualifiedName] ']';
QualifiedName:
'.'? SafeId ('.' (WS)* SafeId)*;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
index b78b18a..c5c7ff0 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/CustomOptionFieldNameFinder.java
@@ -10,20 +10,19 @@
import static java.util.Collections.emptySet;
-import java.util.Collection;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.resource.IEObjectDescription;
-
import com.google.eclipse.protobuf.model.util.Options;
import com.google.eclipse.protobuf.protobuf.AbstractCustomOption;
import com.google.eclipse.protobuf.protobuf.ComplexValue;
import com.google.eclipse.protobuf.protobuf.ComplexValueField;
import com.google.eclipse.protobuf.protobuf.FieldName;
import com.google.eclipse.protobuf.protobuf.IndexedElement;
-import com.google.eclipse.protobuf.protobuf.MessageField;
import com.google.inject.Inject;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.resource.IEObjectDescription;
+
+import java.util.Collection;
+
/**
* @author alruiz@google.com (Alex Ruiz)
*/
@@ -31,14 +30,14 @@
@Inject private Options options;
Collection<IEObjectDescription> findFieldNamesSources(ComplexValue value, FinderStrategy strategy) {
- MessageField source = sourceOf(value);
+ IndexedElement source = sourceOf(value);
if (source == null) {
return emptySet();
}
return strategy.findMessageFields(source);
}
- private MessageField sourceOf(ComplexValue value) {
+ private IndexedElement sourceOf(ComplexValue value) {
IndexedElement source = null;
EObject container = value.eContainer();
if (container instanceof AbstractCustomOption) {
@@ -48,15 +47,15 @@
if (container instanceof ComplexValueField) {
source = sourceOfNameOf((ComplexValueField) container);
}
- return (source instanceof MessageField) ? (MessageField) source : null;
+ return source;
}
- private MessageField sourceOfNameOf(ComplexValueField field) {
+ private IndexedElement sourceOfNameOf(ComplexValueField field) {
FieldName name = field.getName();
return (name == null) ? null : name.getTarget();
}
static interface FinderStrategy {
- Collection<IEObjectDescription> findMessageFields(MessageField reference);
+ Collection<IEObjectDescription> findMessageFields(IndexedElement reference);
}
}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
index f9e1a71..39cbfbd 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ExtensionFieldNameFinderStrategy.java
@@ -15,10 +15,13 @@
import org.eclipse.xtext.resource.IEObjectDescription;
+import com.google.common.base.Strings;
import com.google.eclipse.protobuf.model.util.MessageFields;
import com.google.eclipse.protobuf.model.util.Messages;
import com.google.eclipse.protobuf.model.util.ModelObjects;
import com.google.eclipse.protobuf.naming.NormalNamingStrategy;
+import com.google.eclipse.protobuf.protobuf.Group;
+import com.google.eclipse.protobuf.protobuf.IndexedElement;
import com.google.eclipse.protobuf.protobuf.Message;
import com.google.eclipse.protobuf.protobuf.MessageElement;
import com.google.eclipse.protobuf.protobuf.MessageField;
@@ -35,16 +38,22 @@
@Inject private NormalNamingStrategy namingStrategy;
@Inject private QualifiedNameDescriptions qualifiedNameDescriptions;
- @Override public Collection<IEObjectDescription> findMessageFields(MessageField reference) {
+ @Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
Set<IEObjectDescription> descriptions = newHashSet();
- Message type = messageFields.messageTypeOf(reference);
- // check first in descriptor.proto
- for (TypeExtension extension : messages.extensionsOf(type, modelObjects.rootOf(reference))) {
- for (MessageElement element : extension.getElements()) {
- if (!(element instanceof MessageField)) {
- continue;
+ if (reference instanceof MessageField) {
+ Message type = messageFields.messageTypeOf((MessageField) reference);
+ // check first in descriptor.proto
+ for (TypeExtension extension : messages.extensionsOf(type, modelObjects.rootOf(reference))) {
+ for (MessageElement element : extension.getElements()) {
+ if (element instanceof IndexedElement) {
+ descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element, namingStrategy));
+ }
}
- descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(element, namingStrategy));
+ }
+ } else if (reference instanceof Group) {
+ String name = ((Group) reference).getName();
+ if (!Strings.isNullOrEmpty(name)) {
+ descriptions.addAll(qualifiedNameDescriptions.qualifiedNames(reference, namingStrategy));
}
}
return descriptions;
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 f0cb8b8..00ac058 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
@@ -8,34 +8,47 @@
*/
package com.google.eclipse.protobuf.scoping;
+import static com.google.common.collect.Sets.newHashSet;
import static org.eclipse.xtext.resource.EObjectDescription.create;
-import static com.google.common.collect.Sets.newHashSet;
+import com.google.common.base.Strings;
+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.inject.Inject;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.resource.IEObjectDescription;
import java.util.Collection;
import java.util.Set;
-import org.eclipse.xtext.resource.IEObjectDescription;
-
-import com.google.eclipse.protobuf.model.util.MessageFields;
-import com.google.eclipse.protobuf.protobuf.Message;
-import com.google.eclipse.protobuf.protobuf.MessageElement;
-import com.google.eclipse.protobuf.protobuf.MessageField;
-import com.google.inject.Inject;
-
/**
* @author alruiz@google.com (Alex Ruiz)
*/
class NormalFieldNameFinderStrategy implements CustomOptionFieldNameFinder.FinderStrategy {
@Inject private MessageFields messageFields;
- @Override public Collection<IEObjectDescription> findMessageFields(MessageField reference) {
+ @Override public Collection<IEObjectDescription> findMessageFields(IndexedElement reference) {
Set<IEObjectDescription> descriptions = newHashSet();
- Message type = messageFields.messageTypeOf(reference);
- for (MessageElement element : type.getElements()) {
- if (element instanceof MessageField) {
- String name = ((MessageField) element).getName();
- descriptions.add(create(name, element));
+ Iterable<? extends EObject> elements = reference instanceof Group
+ ? ((Group) reference).getElements()
+ : reference instanceof MessageField
+ ? messageFields.messageTypeOf((MessageField) reference).getElements()
+ : null;
+
+ if (elements != null) {
+ 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));
+ }
+ }
}
}
return descriptions;