In progress: [ Issue 24 ] Fix qualified names
https://code.google.com/p/protobuf-dt/issues/detail?id=24
Qualified names for local types fixed.
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
index fbb35d6..02c901c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
@@ -8,6 +8,7 @@
*/
package com.google.eclipse.protobuf.scoping;
+import static java.util.Collections.unmodifiableList;
import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
import static org.eclipse.xtext.util.Strings.isEmpty;
import static org.eclipse.xtext.util.Tuples.pair;
@@ -77,7 +78,7 @@
qualifiedName = converter.toQualifiedName(containerName).append(qualifiedName);
names.add(qualifiedName);
}
- return names;
+ return unmodifiableList(names);
}
});
}
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 e02d65d..843b5e0 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
@@ -10,7 +10,6 @@
import static org.eclipse.emf.common.util.URI.createURI;
import static org.eclipse.emf.ecore.util.EcoreUtil.getAllContents;
-import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType;
import static org.eclipse.xtext.resource.EObjectDescription.create;
import java.util.*;
@@ -48,25 +47,37 @@
@SuppressWarnings("unused")
IScope scope_TypeReference_type(TypeReference typeRef, EReference reference) {
Protobuf root = finder.rootOf(typeRef);
- List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
- Message message = (Message) typeRef.eContainer().eContainer();
- descriptions.addAll(allTypeDescriptionsInside(message));
+ Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+ EObject message = typeRef.eContainer().eContainer();
+ descriptions.addAll(innerTypes(message));
+ descriptions.addAll(innerTypes(message.eContainer()));
+ descriptions.addAll(innerTypes(root));
descriptions.addAll(importedTypes(root));
IScope scope = createScope(descriptions);
System.out.println("scope for property: " + ((Property) typeRef.eContainer()).getName() + ": " + scope);
return scope;
}
- private List<IEObjectDescription> allTypeDescriptionsInside(Message root) {
+ private Collection<IEObjectDescription> innerTypes(EObject root) {
+ return innerTypes(root, 0);
+ }
+
+ private Collection<IEObjectDescription> innerTypes(EObject root, int level) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
- for (Type type : getAllContentsOfType(root, Type.class)) {
- for (QualifiedName name : alternativeNamesProvider.alternativeFullyQualifiedNames(type))
- descriptions.add(create(name, type));
+ for (EObject element : root.eContents()) {
+ if (!(element instanceof Type)) continue;
+ Type type = (Type) 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));
}
return descriptions;
}
- private List<IEObjectDescription> importedTypes(Protobuf root) {
+ private Collection<IEObjectDescription> importedTypes(Protobuf root) {
ResourceSet resourceSet = root.eResource().getResourceSet();
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (Import anImport : root.getImports()) {
@@ -77,7 +88,7 @@
return descriptions;
}
- private List<IEObjectDescription> describeTypesUsingQualifiedNames(Resource resource) {
+ private Collection<IEObjectDescription> describeTypesUsingQualifiedNames(Resource resource) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
TreeIterator<Object> contents = getAllContents(resource, true);
while (contents.hasNext()) {
@@ -104,18 +115,18 @@
}
private static IScope scopeForLiterals(Enum enumType) {
- List<IEObjectDescription> descriptions = describeLiterals(enumType);
+ Collection<IEObjectDescription> descriptions = describeLiterals(enumType);
return createScope(descriptions);
}
- private static List<IEObjectDescription> describeLiterals(Enum enumType) {
+ private static Collection<IEObjectDescription> describeLiterals(Enum enumType) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (Literal literal : enumType.getLiterals())
descriptions.add(create(literal.getName(), literal));
return descriptions;
}
- private static IScope createScope(List<IEObjectDescription> descriptions) {
+ private static IScope createScope(Iterable<IEObjectDescription> descriptions) {
return new SimpleScope(descriptions, DO_NOT_IGNORE_CASE);
}
}