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;