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