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