Made missing Modifier 'optional' by default to handle oneof fields.
Added support for 'repeated oneof' (arrays of unions).
diff --git a/com.google.eclipse.protobuf.feature/feature.xml b/com.google.eclipse.protobuf.feature/feature.xml
index c4de350..4fac131 100644
--- a/com.google.eclipse.protobuf.feature/feature.xml
+++ b/com.google.eclipse.protobuf.feature/feature.xml
@@ -2,7 +2,7 @@
<feature
id="com.google.eclipse.protobuf"
label="%featureName"
- version="1.4.3.qualifier"
+ version="1.5.0.qualifier"
provider-name="%providerName">
<description url="https://code.google.com/p/protobuf-dt/">
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
index afade5d..db7b19a 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/model/util/IndexedElements_calculateNewIndexFor_Test.java
@@ -40,7 +40,7 @@
@Test public void should_return_one_for_first_and_only_field() {
MessageField field = xtext.find("name", MessageField.class);
long index = indexedElements.calculateNewIndexFor(field);
- assertThat(index, equalTo(1L));
+ assertThat(index, equalTo(3L));
}
// syntax = "proto2";
@@ -52,6 +52,6 @@
@Test public void should_return_max_index_value_plus_one_for_new_field() {
MessageField field = xtext.find("id", MessageField.class);
long index = indexedElements.calculateNewIndexFor(field);
- assertThat(index, equalTo(7L));
+ assertThat(index, equalTo(9L));
}
}
diff --git a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
index c71eae4..67642e8 100644
--- a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 1.4.3.qualifier
+Bundle-Version: 1.5.1.qualifier
Bundle-SymbolicName: com.google.eclipse.protobuf.ui; singleton:=true
Bundle-ActivationPolicy: lazy
Require-Bundle: com.google.eclipse.protobuf;visibility:=reexport,
diff --git a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
index 2476c62..7a531b1 100644
--- a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
Eclipse-ExtensibleAPI: true
Bundle-Name: %Bundle-Name
Bundle-Vendor: %Bundle-Vendor
-Bundle-Version: 1.4.3.qualifier
+Bundle-Version: 1.5.1.qualifier
Bundle-SymbolicName: com.google.eclipse.protobuf; singleton:=true
Bundle-ActivationPolicy: lazy
Require-Bundle: com.ibm.icu;resolution:=optional,
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 57722aa..35f14b9 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
@@ -64,16 +64,22 @@
elements+=GroupElement*
'}' (';')?;
+UnmodifiedGroup returns Group:
+ =>'group' name=Name '=' index=(LONG | HEX)
+ ('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*) ']')? '{'
+ elements+=GroupElement*
+ '}' (';')?;
+
GroupElement:
Option | IndexedElement | ComplexType | TypeExtension | Extensions;
-
+
OneOf:
- 'oneof' name=Name '{'
- elements+=OneOfElement*
+ (isRepeated?='repeated')? 'oneof' name=Name '{'
+ elements+=OneOfElement+
'}' (';')?;
-
+
OneOfElement returns MessageElement:
- Extensions | UnmodifiedMessageField;
+ Extensions | UnmodifiedGroup | UnmodifiedMessageField;
Extensions:
'extensions' ranges+=Range (',' ranges+=Range)* (';')+;
@@ -87,7 +93,7 @@
('[' (fieldOptions+=FieldOption (',' fieldOptions+=FieldOption)*)? ']')? (';')+;
enum Modifier:
- required | optional | repeated;
+ optional | required | repeated;
TypeLink:
ScalarTypeLink | ComplexTypeLink;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
index 26c8496..bae304a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
@@ -8,23 +8,10 @@
*/
package com.google.eclipse.protobuf;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.xtext.conversion.IValueConverterService;
-import org.eclipse.xtext.naming.IQualifiedNameConverter;
-import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.parser.IAstFactory;
-import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
-import org.eclipse.xtext.resource.IGlobalServiceProvider;
-import org.eclipse.xtext.resource.XtextResource;
-import org.eclipse.xtext.resource.XtextResourceSet;
-import org.eclipse.xtext.scoping.impl.ImportUriResolver;
-import org.eclipse.xtext.validation.IResourceValidator;
-
import com.google.eclipse.protobuf.conversion.ProtobufTerminalConverters;
import com.google.eclipse.protobuf.linking.ProtobufResource;
import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameConverter;
import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameProvider;
-import com.google.eclipse.protobuf.parser.ProtobufAstFactory;
import com.google.eclipse.protobuf.resource.FastXtextResourceSet;
import com.google.eclipse.protobuf.resource.GlobalResourceServiceProvider;
import com.google.eclipse.protobuf.scoping.ExtensionRegistryProvider;
@@ -33,6 +20,17 @@
import com.google.eclipse.protobuf.validation.ProtobufSyntaxErrorMessageProvider;
import com.google.inject.Binder;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.naming.IQualifiedNameConverter;
+import org.eclipse.xtext.naming.IQualifiedNameProvider;
+import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
+import org.eclipse.xtext.resource.IGlobalServiceProvider;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.resource.XtextResourceSet;
+import org.eclipse.xtext.scoping.impl.ImportUriResolver;
+import org.eclipse.xtext.validation.IResourceValidator;
+
/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
*/
@@ -49,10 +47,6 @@
return ProtobufQualifiedNameConverter.class;
}
- @Override public Class<? extends IAstFactory> bindIAstFactory() {
- return ProtobufAstFactory.class;
- }
-
@Override public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
return ProtobufQualifiedNameProvider.class;
}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java
deleted file mode 100644
index dc8dc4f..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ProtobufAstFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.google.eclipse.protobuf.parser;
-import com.google.eclipse.protobuf.protobuf.MessageField;
-import com.google.eclipse.protobuf.protobuf.Modifier;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.xtext.conversion.ValueConverterException;
-import org.eclipse.xtext.nodemodel.INode;
-import org.eclipse.xtext.parser.DefaultEcoreElementFactory;
-
-public class ProtobufAstFactory extends DefaultEcoreElementFactory {
- private static final String UNMODIFIEDMESSAGEFIELD_RULE = "UnmodifiedMessageField";
- private static final String ONEOFELEMENT_RULE = "OneOfElement";
-
- @Override
- public void add(EObject object, String feature, Object value, String ruleName, INode node)
- throws ValueConverterException {
- // TODO(foremans): Auto-generated method stub
- super.add(object, feature, value, ruleName, node);
- if (ONEOFELEMENT_RULE.equals(ruleName) && value instanceof MessageField) {
- MessageField field = (MessageField) value;
- field.setModifier(Modifier.OPTIONAL);
- }
- }
-
- @Override
- public void set(EObject object, String feature, Object value, String ruleName, INode node)
- throws ValueConverterException {
- super.set(object, feature, value, ruleName, node);
- if (UNMODIFIEDMESSAGEFIELD_RULE.equals(ruleName)) {
- MessageField field = (MessageField) object;
- field.setModifier(Modifier.OPTIONAL);
- }
- }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
index 82a7ed5..38bc64e 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ProtobufJavaValidator.java
@@ -75,6 +75,9 @@
}
EObject container = e.eContainer();
+ if (container instanceof OneOf) {
+ container = container.eContainer();
+ }
if (container instanceof Message) {
Message message = (Message) container;
Iterable<MessageElement> elements = message.getElements();