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));