Fixed: [ Issue 69 ] Fully-qualified names can start with a period. https://code.google.com/p/protobuf-dt/issues/detail?id=69
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/QualifiedNames_addLeadingDot_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/QualifiedNames_addLeadingDot_Test.java new file mode 100644 index 0000000..ff1cea0 --- /dev/null +++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/QualifiedNames_addLeadingDot_Test.java
@@ -0,0 +1,35 @@ +/* + * Copyright (c) 2011 Google Inc. + * + * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse + * Public License v1.0 which accompanies this distribution, and is available at + * + * http://www.eclipse.org/legal/epl-v10.html + */ +package com.google.eclipse.protobuf.scoping; + +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +import org.eclipse.xtext.naming.QualifiedName; +import org.junit.Test; + +/** + * Tests for <code>{@link QualifiedNames#addLeadingDot(QualifiedName)}</code>. + * + * @author alruiz@google.com (Alex Ruiz) + */ +public class QualifiedNames_addLeadingDot_Test { + + @Test public void should_add_leading_dot() { + QualifiedName name = QualifiedName.create("jedis", "Luke"); + QualifiedName withLeadingDot = QualifiedNames.addLeadingDot(name); + assertThat(withLeadingDot.toString(), equalTo(".jedis.Luke")); + } + + @Test public void should_not_add_leading_dot_if_qualified_name_already_has_it() { + QualifiedName name = QualifiedName.create("", "jedis", "Luke"); + QualifiedName withLeadingDot = QualifiedNames.addLeadingDot(name); + assertThat(withLeadingDot.toString(), equalTo(".jedis.Luke")); + } +}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java index 5a11f2a..68441f6 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -55,7 +55,6 @@ @Inject private Literals literals; @Inject private Properties properties; - /** {@inheritDoc} */ @Override public void completeProtobuf_Syntax(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { } @@ -340,11 +339,6 @@ return imageHelper.getImage(images.defaultImage()); } - @Override public void complete_FieldOption(EObject model, RuleCall ruleCall, ContentAssistContext context, - ICompletionProposalAcceptor acceptor) { - System.out.println("complete_FieldOption"); - } - @Override public void completeFieldOption_Name(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { Field field = extractFieldFrom(context);
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext index 1f00280..61a0f2c 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/Protobuf.xtext
@@ -31,7 +31,7 @@ 'import' importURI=STRING ';'; QualifiedName: - Name ('.' Name)*; + '.'? Name ('.' Name)*; Option: 'option' name=Name '=' value=ValueRef ';';
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 562a552..7feb1fb 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,6 +8,7 @@ */ package com.google.eclipse.protobuf.scoping; +import static com.google.eclipse.protobuf.scoping.QualifiedNames.addLeadingDot; import static java.util.Collections.emptyList; import static org.eclipse.emf.common.util.URI.createURI; import static org.eclipse.emf.ecore.util.EcoreUtil.getAllContents; @@ -91,7 +92,7 @@ for (int i = level; i < nameCount; i++) { descriptions.add(create(names.get(i), element)); } - descriptions.add(create(nameProvider.getFullyQualifiedName(element), element)); + descriptions.addAll(fullyQualifiedNamesOf(element)); // TODO investigate if groups can have messages, and if so, add those messages to the scope. if (element instanceof Message) { descriptions.addAll(children(element, targetType, level + 1)); @@ -136,7 +137,7 @@ } return null; } - + private boolean arePackagesRelated(Package aPackage, EObject root) { Package p = finder.packageOf(root); return packageResolver.areRelated(aPackage, p); @@ -149,7 +150,7 @@ Object next = contents.next(); if (!targetType.isInstance(next)) continue; T type = targetType.cast(next); - descriptions.add(create(nameProvider.getFullyQualifiedName(type), type)); + descriptions.addAll(fullyQualifiedNamesOf(type)); for (QualifiedName name : importedNamesProvider.namesOf(type)) { descriptions.add(create(name, type)); } @@ -157,6 +158,14 @@ return descriptions; } + private Collection<IEObjectDescription> fullyQualifiedNamesOf(EObject obj) { + List<IEObjectDescription> descriptions = new ArrayList<IEObjectDescription>(); + QualifiedName fqn = nameProvider.getFullyQualifiedName(obj); + descriptions.add(create(fqn, obj)); + descriptions.add(create(addLeadingDot(fqn), obj)); + return descriptions; + } + @SuppressWarnings("unused") IScope scope_LiteralRef_literal(LiteralRef literalRef, EReference reference) { EObject container = literalRef.eContainer();
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java index 047a80a..23c73cb 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java
@@ -11,27 +11,34 @@ import static java.util.Collections.*; import static org.eclipse.xtext.util.Strings.isEmpty; -import com.google.eclipse.protobuf.protobuf.Package; +import java.util.*; import org.eclipse.xtext.naming.*; -import java.util.*; +import com.google.eclipse.protobuf.protobuf.Package; /** * @author alruiz@google.com (Alex Ruiz) */ final class QualifiedNames { - static List<QualifiedName> addPackageNameSegments(QualifiedName qualifiedName, Package p, - IQualifiedNameConverter converter) { - QualifiedName name = qualifiedName; + static QualifiedName addLeadingDot(QualifiedName name) { + if (name.getFirstSegment().equals("")) return name; + List<String> segments = new ArrayList<String>(); + segments.addAll(name.getSegments()); + segments.add(0, ""); + return QualifiedName.create(segments.toArray(new String[segments.size()])); + } + + static List<QualifiedName> addPackageNameSegments(QualifiedName name, Package p, IQualifiedNameConverter converter) { + QualifiedName current = name; List<String> segments = fqnSegments(p, converter); int segmentCount = segments.size(); if (segmentCount <= 1) return emptyList(); List<QualifiedName> allNames = new ArrayList<QualifiedName>(); for (int i = segmentCount - 1; i > 0; i--) { - name = QualifiedName.create(segments.get(i)).append(name); - allNames.add(name); + current = QualifiedName.create(segments.get(i)).append(current); + allNames.add(current); } return unmodifiableList(allNames); } @@ -42,6 +49,6 @@ if (isEmpty(packageName)) return emptyList(); return converter.toQualifiedName(packageName).getSegments(); } - + private QualifiedNames() {} }