Fixed: [ Issue 24 ] Fix qualified names
https://code.google.com/p/protobuf-dt/issues/detail?id=24
Fixed for real.
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 3281bed..4e77ddc 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
@@ -8,16 +8,19 @@
*/
package com.google.eclipse.protobuf.scoping;
-import static org.eclipse.emf.common.util.URI.createFileURI;
+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.ArrayList;
import java.util.List;
-import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.resource.IEObjectDescription;
@@ -57,22 +60,39 @@
@SuppressWarnings("unused")
IScope scope_TypeReference_type(TypeReference typeRef, EReference reference) {
Protobuf root = finder.rootOf(typeRef);
- resolveImports(root);
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (Type type : getAllContentsOfType(root, Type.class)) {
- descriptions.add(create(nameProvider.getFullyQualifiedName(type), type));
+ descriptions.add(describeUsingQualifiedName(type));
descriptions.add(create(type.getName(), type));
}
+ descriptions.addAll(importedTypes(root));
return createScope(descriptions);
}
- private void resolveImports(Protobuf root) {
- EList<Import> imports = root.getImports();
+ private List<IEObjectDescription> importedTypes(Protobuf root) {
ResourceSet resourceSet = root.eResource().getResourceSet();
- for (Import imp : imports) {
- String importURI = uriResolver.apply(imp);
- resourceSet.getResource(createFileURI(importURI), true);
+ 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(describeTypesUsingQualifiedNames(imported));
}
+ return descriptions;
+ }
+
+ private List<IEObjectDescription> describeTypesUsingQualifiedNames(Resource resource) {
+ List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
+ TreeIterator<Object> contents = getAllContents(resource, true);
+ while (contents.hasNext()) {
+ Object next = contents.next();
+ if (!(next instanceof Type)) continue;
+ descriptions.add(describeUsingQualifiedName((Type) next));
+ }
+ return descriptions;
+ }
+
+ private IEObjectDescription describeUsingQualifiedName(Type type) {
+ return create(nameProvider.getFullyQualifiedName(type), type);
}
@SuppressWarnings("unused")
@@ -80,21 +100,21 @@
EObject container = literalRef.eContainer();
if (container instanceof Property) {
Enum enumType = finder.enumTypeOf((Property) container);
- if (enumType != null) return scopeForLiteralsIn(enumType);
+ if (enumType != null) return scopeForLiterals(enumType);
}
if (container instanceof Option && globals.isOptimizeForOption((Option) container)) {
Enum optimizedMode = globals.optimizedMode();
- return scopeForLiteralsIn(optimizedMode);
+ return scopeForLiterals(optimizedMode);
}
return null;
}
- private static IScope scopeForLiteralsIn(Enum enumType) {
- List<IEObjectDescription> descriptions = literalDescriptions(enumType);
+ private static IScope scopeForLiterals(Enum enumType) {
+ List<IEObjectDescription> descriptions = describeLiterals(enumType);
return createScope(descriptions);
}
- private static List<IEObjectDescription> literalDescriptions(Enum enumType) {
+ private static List<IEObjectDescription> describeLiterals(Enum enumType) {
List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
for (Literal literal : enumType.getLiterals())
descriptions.add(create(literal.getName(), literal));