In progress: [ Issue 60 ] Imported types do not need to be fully-qualified
https://code.google.com/p/protobuf-dt/issues/detail?id=60

Local names now include package segments.
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
similarity index 76%
rename from com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java
rename to com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
index 45f0b4d..2a32898 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider_localNames_Test.java
@@ -23,23 +23,23 @@
 import com.google.eclipse.protobuf.protobuf.Enum;
 
 /**
- * Tests for <code>{@link AlternativeQualifiedNamesProvider#alternativeFullyQualifiedNames(EObject)}</code>.
+ * Tests for <code>{@link LocalNamesProvider#localNames(EObject)}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class AlternativeQualifiedNamesProvider_alternativeFullyQualifiedNames_Test {
+public class LocalNamesProvider_localNames_Test {
 
   @Rule public XtextRule xtext = new XtextRule();
 
-  private AlternativeQualifiedNamesProvider namesProvider;
+  private LocalNamesProvider namesProvider;
 
   @Before public void setUp() {
-    namesProvider = xtext.getInstanceOf(AlternativeQualifiedNamesProvider.class);
+    namesProvider = xtext.getInstanceOf(LocalNamesProvider.class);
   }
 
-  @Test public void should_return_all_possible_qualified_names() {
+  @Test public void should_return_all_possible_local_names() {
     StringBuilder proto = new StringBuilder();
-    proto.append("package alternative.names;                       ");
+    proto.append("package test.alternative.names;                  ");
     proto.append("                                                 ");
     proto.append("message Person {                                 ");
     proto.append("  message PhoneNumber {                          ");
@@ -53,9 +53,11 @@
     proto.append("}                                                ");
     Protobuf root = xtext.parse(proto);
     Enum phoneType = findEnum("PhoneType", root);
-    List<QualifiedName> names = namesProvider.alternativeFullyQualifiedNames(phoneType);
+    List<QualifiedName> names = namesProvider.localNames(phoneType);
     assertThat(names.get(0).toString(), equalTo("PhoneType"));
     assertThat(names.get(1).toString(), equalTo("PhoneNumber.PhoneType"));
     assertThat(names.get(2).toString(), equalTo("Person.PhoneNumber.PhoneType"));
+    assertThat(names.get(3).toString(), equalTo("names.Person.PhoneNumber.PhoneType"));
+    assertThat(names.get(4).toString(), equalTo("alternative.names.Person.PhoneNumber.PhoneType"));
   }
 }
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/LocalNamesProvider.java
similarity index 69%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/AlternativeQualifiedNamesProvider.java
rename to com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
index 02c901c..b8713b5 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/LocalNamesProvider.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
-import static java.util.Collections.unmodifiableList;
+import static java.util.Collections.*;
 import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 import static org.eclipse.xtext.util.Tuples.pair;
@@ -20,6 +20,8 @@
 import org.eclipse.xtext.util.*;
 
 import com.google.common.base.Function;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
 import com.google.inject.*;
 
 /**
@@ -51,17 +53,16 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-class AlternativeQualifiedNamesProvider {
-
-  // TODO: in example above, it looks like protoc considers names.Person.PhoneType as valid. In short, qualified
-  // names can use segments of the package as well.
+class LocalNamesProvider {
 
   @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
   @Inject private final IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
 
+  @Inject private ProtobufElementFinder finder;
+
   private final Function<EObject, String> resolver = newResolver(String.class, "name");
 
-  List<QualifiedName> alternativeFullyQualifiedNames(final EObject obj) {
+  List<QualifiedName> localNames(final EObject obj) {
     Pair<EObject, String> key = pair(obj, "fqns");
     return cache.get(key, obj.eResource(), new Provider<List<QualifiedName>>() {
       public List<QualifiedName> get() {
@@ -78,6 +79,24 @@
           qualifiedName = converter.toQualifiedName(containerName).append(qualifiedName);
           names.add(qualifiedName);
         }
+        names.addAll(addPackageSegments(qualifiedName));
+        return unmodifiableList(names);
+      }
+
+      private List<QualifiedName> addPackageSegments(QualifiedName qualifiedName) {
+        Package p = finder.packageOf(obj);
+        if (p == null) return emptyList();
+        String packageName = p.getName();
+        if (isEmpty(packageName)) return emptyList();
+        QualifiedName name = qualifiedName;
+        List<String> segments = converter.toQualifiedName(packageName).getSegments();
+        int segmentCount = segments.size();
+        if (segmentCount == 1) return emptyList();
+        List<QualifiedName> names = new ArrayList<QualifiedName>();
+        for (int i = segmentCount - 1; i > 0; i--) {
+          name = QualifiedName.create(segments.get(i)).append(name);
+          names.add(name);
+        }
         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 615996d..6d2ddd8 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
@@ -42,7 +42,7 @@
   @Inject private DescriptorProvider descriptorProvider;
   @Inject private IQualifiedNameProvider nameProvider;
   @Inject private ImportUriResolver uriResolver;
-  @Inject private AlternativeQualifiedNamesProvider alternativeNamesProvider;
+  @Inject private LocalNamesProvider localNamesProvider;
 
   @SuppressWarnings("unused")
   IScope scope_TypeReference_type(TypeReference typeRef, EReference reference) {
@@ -82,7 +82,7 @@
     List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>();
     for (EObject element : root.eContents()) {
       if (!targetType.isInstance(element)) continue;
-      List<QualifiedName> names = alternativeNamesProvider.alternativeFullyQualifiedNames(element);
+      List<QualifiedName> names = localNamesProvider.localNames(element);
       int nameCount = names.size();
       for (int i = level; i < nameCount; i++) {
         descriptions.add(create(names.get(i), element));