Fixed a bug in scoping of options.
ExtensionOptionField was being scoped insufficiently causing test
Labels_labelFor_Test.should_return_label_for_custom_option() to fail.
Change-Id: I64344d6a611361deb4986c68fb9b2c87edd3bf8d
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
index d541014..2071827 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -257,18 +257,19 @@
* Recursively scope {@code OptionField} starting with an {@code OptionSource}.
*/
private IScope getScopeOfOptionField(
- OptionSource optionSource, EReference reference, int fieldIndex, EList<OptionField> fields) {
+ IScope scope, OptionSource optionSource, EReference reference, int fieldIndex, EList<OptionField> fields) {
if (fieldIndex < 0 || fields.size() <= fieldIndex) {
throw new IllegalArgumentException();
}
- IScope parentScope, retval = IScope.NULLSCOPE;
+ IScope retval = scope;
+ IScope parentScope = IScope.NULLSCOPE;
QualifiedName name = QualifiedName.EMPTY;
if (fieldIndex == 0) {
parentScope = super.getScope(optionSource, OPTION_SOURCE__TARGET);
name = getEObjectName(optionSource);
} else {
OptionField parentOptionField = fields.get(fieldIndex - 1);
- parentScope = getScopeOfOptionField(optionSource, reference, fieldIndex - 1, fields);
+ parentScope = getScopeOfOptionField(retval, optionSource, reference, fieldIndex - 1, fields);
name = getEObjectName(parentOptionField);
}
IEObjectDescription indexedElementDescription = parentScope.getSingleElement(name);
@@ -532,7 +533,8 @@
*
* The {@code OptionField} {@code number} contains a cross-reference to {@code Code.number}.
*/
- public @Nullable IScope scope_OptionField_target(OptionField optionField, EReference reference) {
+ public IScope scope_OptionField_target(OptionField optionField, EReference reference) {
+ IScope scope = getLocalScopeProvider().getResourceScope(optionField.eResource(), reference);
EObject customOption = optionField.eContainer();
if (customOption != null) {
OptionSource optionSource = null;
@@ -547,10 +549,10 @@
}
if (optionSource != null && fields != null) {
int index = fields.indexOf(optionField);
- return getScopeOfOptionField(optionSource, reference, index, fields);
+ return getScopeOfOptionField(scope, optionSource, reference, index, fields);
}
}
- return null;
+ return scope;
}
/**