Fixed: [ Issue 33 ] Fixed references to messages in services
https://code.google.com/p/protobuf-dt/issues/detail?id=33
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 2bdff31..d168a9e 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
@@ -52,47 +52,61 @@
descriptions.addAll(innerTypes(message));
descriptions.addAll(innerTypes(message.eContainer()));
descriptions.addAll(innerTypes(root));
- descriptions.addAll(importedTypes(root));
+ descriptions.addAll(importedTypes(root, Type.class));
return createScope(descriptions);
}
private Collection<IEObjectDescription> innerTypes(EObject root) {
- return innerTypes(root, 0);
+ return innerTypes(root, Type.class);
}
- private Collection<IEObjectDescription> innerTypes(EObject root, int level) {
+ @SuppressWarnings("unused")
+ IScope scope_MessageReference_type(MessageReference msgRef, EReference reference) {
+ Protobuf root = finder.rootOf(msgRef);
+ Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+ Class<Message> targetType = Message.class;
+ descriptions.addAll(innerTypes(root, targetType));
+ descriptions.addAll(importedTypes(root, targetType));
+ return createScope(descriptions);
+ }
+
+ private <T extends Type> Collection<IEObjectDescription> innerTypes(EObject root, Class<T> targetType) {
+ return innerTypes(root, targetType, 0);
+ }
+
+ private <T extends Type> Collection<IEObjectDescription> innerTypes(EObject root, Class<T> targetType, int level) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (EObject element : root.eContents()) {
- if (!(element instanceof Type)) continue;
- Type type = (Type) element;
+ if (!targetType.isInstance(element)) continue;
+ T type = targetType.cast(element);
List<QualifiedName> names = alternativeNamesProvider.alternativeFullyQualifiedNames(type);
int nameCount = names.size();
for (int i = level; i < nameCount; i++) descriptions.add(create(names.get(i), type));
descriptions.add(create(nameProvider.getFullyQualifiedName(type), type));
if (!(element instanceof Message)) continue;
- descriptions.addAll(innerTypes(element, level + 1));
+ descriptions.addAll(innerTypes(element, targetType, level + 1));
}
return descriptions;
}
- private Collection<IEObjectDescription> importedTypes(Protobuf root) {
+ private <T extends Type> Collection<IEObjectDescription> importedTypes(Protobuf root, Class<T> targetType) {
ResourceSet resourceSet = root.eResource().getResourceSet();
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (Import anImport : root.getImports()) {
URI importUri = createURI(uriResolver.apply(anImport));
Resource imported = resourceSet.getResource(importUri, true);
- descriptions.addAll(innerTypes(imported));
+ descriptions.addAll(innerTypes(imported, targetType));
}
return descriptions;
}
- private Collection<IEObjectDescription> innerTypes(Resource resource) {
+ private <T extends Type> Collection<IEObjectDescription> innerTypes(Resource resource, Class<T> targetType) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
TreeIterator<Object> contents = getAllContents(resource, true);
while (contents.hasNext()) {
Object next = contents.next();
- if (!(next instanceof Type)) continue;
- Type type = (Type) next;
+ if (!targetType.isInstance(next)) continue;
+ T type = targetType.cast(next);
descriptions.add(create(nameProvider.getFullyQualifiedName(type), type));
}
return descriptions;