Added unit tests. Cleaned up code.
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_enumTypeOf_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_enumTypeOf_Test.java
new file mode 100644
index 0000000..a8ae9e5
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_enumTypeOf_Test.java
@@ -0,0 +1,64 @@
+/*
+ * 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.util;
+
+import static com.google.eclipse.protobuf.junit.Finder.findProperty;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Enum;
+
+/**
+ * Tests for <code>{@link ProtobufElementFinder#enumTypeOf(Property)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufElementFinder_enumTypeOf_Test {
+
+ @Rule public XtextRule xtext = new XtextRule();
+
+ private ProtobufElementFinder finder;
+
+ @Before public void setUp() {
+ finder = xtext.getInstanceOf(ProtobufElementFinder.class);
+ }
+
+ @Test public void should_return_enum_if_property_type_is_enum() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("enum PhoneType { ")
+ .append(" MOBILE = 0; ")
+ .append(" HOME = 1; ")
+ .append(" WORK = 2; ")
+ .append("} ")
+ .append(" ")
+ .append("message PhoneNumber { ")
+ .append(" optional PhoneType type = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property type = findProperty("type", root);
+ Enum phoneType = finder.enumTypeOf(type);
+ assertThat(phoneType.getName(), equalTo("PhoneType"));
+ }
+
+ @Test public void should_return_null_if_property_type_is_not_enum() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("message Person { ")
+ .append(" optional string name = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property name = findProperty("name", root);
+ Enum anEnum = finder.enumTypeOf(name);
+ assertThat(anEnum, nullValue());
+ }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_packageOf_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_packageOf_Test.java
new file mode 100644
index 0000000..e1da903
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_packageOf_Test.java
@@ -0,0 +1,61 @@
+/*
+ * 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.util;
+
+import static com.google.eclipse.protobuf.junit.Finder.findProperty;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.eclipse.emf.ecore.EObject;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Package;
+
+/**
+ * Tests for <code>{@link ProtobufElementFinder#packageOf(EObject)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufElementFinder_packageOf_Test {
+
+ @Rule public XtextRule xtext = new XtextRule();
+
+ private ProtobufElementFinder finder;
+
+ @Before public void setUp() {
+ finder = xtext.getInstanceOf(ProtobufElementFinder.class);
+ }
+
+ @Test public void should_return_package_if_proto_has_one() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("package person.test; ")
+ .append(" ")
+ .append("message Person { ")
+ .append(" optional int32 id = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property id = findProperty("id", root);
+ Package aPackage = finder.packageOf(id);
+ assertThat(aPackage.getName(), equalTo("person.test"));
+ }
+
+ @Test public void should_return_null_if_proto_does_not_have_package() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("message Person { ")
+ .append(" optional int32 id = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property id = findProperty("id", root);
+ Package aPackage = finder.packageOf(id);
+ assertThat(aPackage, nullValue());
+ }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_rootOf_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_rootOf_Test.java
new file mode 100644
index 0000000..2450b54
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_rootOf_Test.java
@@ -0,0 +1,46 @@
+/*
+ * 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.util;
+
+import static com.google.eclipse.protobuf.junit.Finder.findProperty;
+import static org.hamcrest.core.IsSame.sameInstance;
+import static org.junit.Assert.assertThat;
+
+import org.eclipse.emf.ecore.EObject;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.Property;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+
+/**
+ * Tests for <code>{@link ProtobufElementFinder#rootOf(EObject)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufElementFinder_rootOf_Test {
+
+ @Rule public XtextRule xtext = new XtextRule();
+
+ private ProtobufElementFinder finder;
+
+ @Before public void setUp() {
+ finder = xtext.getInstanceOf(ProtobufElementFinder.class);
+ }
+
+ @Test public void should_return_root_of_proto() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("message Person { ")
+ .append(" optional string name = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property name = findProperty("name", root);
+ assertThat(finder.rootOf(name), sameInstance(root));
+ }
+}
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_scalarTypeOf_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_scalarTypeOf_Test.java
new file mode 100644
index 0000000..7b12cc5
--- /dev/null
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/util/ProtobufElementFinder_scalarTypeOf_Test.java
@@ -0,0 +1,63 @@
+/*
+ * 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.util;
+
+import static com.google.eclipse.protobuf.junit.Finder.findProperty;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.hamcrest.core.IsNull.nullValue;
+import static org.junit.Assert.assertThat;
+
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.XtextRule;
+import com.google.eclipse.protobuf.protobuf.*;
+
+/**
+ * Tests for <code>{@link ProtobufElementFinder#scalarTypeOf(Property)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufElementFinder_scalarTypeOf_Test {
+
+ @Rule public XtextRule xtext = new XtextRule();
+
+ private ProtobufElementFinder finder;
+
+ @Before public void setUp() {
+ finder = xtext.getInstanceOf(ProtobufElementFinder.class);
+ }
+
+ @Test public void should_return_scalar_if_property_type_is_scalar() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("message Person { ")
+ .append(" optional int32 id = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property id = findProperty("id", root);
+ ScalarType int32 = finder.scalarTypeOf(id);
+ assertThat(int32.getName(), equalTo("int32"));
+ }
+
+ @Test public void should_return_null_if_property_type_is_not_scalar() {
+ StringBuilder proto = new StringBuilder();
+ proto.append("enum PhoneType { ")
+ .append(" MOBILE = 0; ")
+ .append(" HOME = 1; ")
+ .append(" WORK = 2; ")
+ .append("} ")
+ .append(" ")
+ .append("message PhoneNumber { ")
+ .append(" optional PhoneType type = 1;")
+ .append("} ");
+ Protobuf root = xtext.parse(proto);
+ Property type = findProperty("type", root);
+ ScalarType scalar = finder.scalarTypeOf(type);
+ assertThat(scalar, nullValue());
+ }
+}
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 9f58cae..af4f45e 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
@@ -30,7 +30,7 @@
import com.google.eclipse.protobuf.ui.grammar.CompoundElement;
import com.google.eclipse.protobuf.ui.labeling.Images;
import com.google.eclipse.protobuf.ui.util.*;
-import com.google.eclipse.protobuf.util.EObjectFinder;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
import com.google.inject.Inject;
/**
@@ -40,7 +40,7 @@
*/
public class ProtobufProposalProvider extends AbstractProtobufProposalProvider {
- @Inject private EObjectFinder finder;
+ @Inject private ProtobufElementFinder finder;
@Inject private Globals globals;
@Inject private PluginImageHelper imageHelper;
@Inject private Images imageRegistry;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
index 42c6f3c..4b4ee83 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/naming/ProtobufQualifiedNameProvider.java
@@ -21,7 +21,7 @@
import com.google.common.base.Function;
import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.eclipse.protobuf.util.EObjectFinder;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
import com.google.inject.Inject;
import com.google.inject.Provider;
@@ -35,7 +35,7 @@
@Inject private IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
@Inject private IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
- @Inject private EObjectFinder finder;
+ @Inject private ProtobufElementFinder finder;
private Function<EObject, String> resolver = newResolver(String.class, "name");
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 4e77ddc..4af752b 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
@@ -38,7 +38,7 @@
import com.google.eclipse.protobuf.protobuf.Protobuf;
import com.google.eclipse.protobuf.protobuf.Type;
import com.google.eclipse.protobuf.protobuf.TypeReference;
-import com.google.eclipse.protobuf.util.EObjectFinder;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
import com.google.inject.Inject;
/**
@@ -52,7 +52,7 @@
private static final boolean DO_NOT_IGNORE_CASE = false;
- @Inject private EObjectFinder finder;
+ @Inject private ProtobufElementFinder finder;
@Inject private Globals globals;
@Inject private IQualifiedNameProvider nameProvider;
@Inject private ImportUriResolver uriResolver;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/EObjectFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/EObjectFinder.java
deleted file mode 100644
index b5375c2..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/EObjectFinder.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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.util;
-
-import org.eclipse.emf.ecore.EObject;
-
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.protobuf.Enum;
-import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.inject.Singleton;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton
-public class EObjectFinder {
-
- public Enum enumTypeOf(Property p) {
- AbstractTypeReference aTypeRef = (p).getType();
- if (aTypeRef instanceof TypeReference) {
- Type type = ((TypeReference) aTypeRef).getType();
- if (type instanceof Enum) return (Enum) type;
- }
- return null;
- }
-
- public ScalarType scalarTypeOf(Property p) {
- AbstractTypeReference aTypeRef = (p).getType();
- if (aTypeRef instanceof ScalarTypeReference)
- return ((ScalarTypeReference) aTypeRef).getScalar();
- return null;
- }
-
- public Package packageOf(EObject o) {
- return rootOf(o).getPackage();
- }
-
- public Protobuf rootOf(EObject o) {
- EObject current = o;
- while (!(current instanceof Protobuf)) current = current.eContainer();
- return (Protobuf) current;
- }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/ProtobufElementFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/ProtobufElementFinder.java
new file mode 100644
index 0000000..952cdf0
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/util/ProtobufElementFinder.java
@@ -0,0 +1,72 @@
+/*
+ * 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.util;
+
+import org.eclipse.emf.ecore.EObject;
+
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.protobuf.Enum;
+import com.google.eclipse.protobuf.protobuf.Package;
+import com.google.inject.Singleton;
+
+/**
+ * Utility methods to find elements in a parser proto file.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+public class ProtobufElementFinder {
+
+ /**
+ * Returns the enum type of the given property, only if the type of the given property is an enum.
+ * @param p the given property.
+ * @return the enum type of the given property or {@code null} if the type of the given property is not enum.
+ */
+ public Enum enumTypeOf(Property p) {
+ AbstractTypeReference aTypeRef = (p).getType();
+ if (aTypeRef instanceof TypeReference) {
+ Type type = ((TypeReference) aTypeRef).getType();
+ if (type instanceof Enum) return (Enum) type;
+ }
+ return null;
+ }
+
+ /**
+ * Returns the scalar type of the given property, only if the type of the given property is a scalar.
+ * @param p the given property.
+ * @return the scalar type of the given property or {@code null} if the type of the given property is not a scalar.
+ */
+ public ScalarType scalarTypeOf(Property p) {
+ AbstractTypeReference aTypeRef = (p).getType();
+ if (aTypeRef instanceof ScalarTypeReference)
+ return ((ScalarTypeReference) aTypeRef).getScalar();
+ return null;
+ }
+
+ /**
+ * Returns the package of the proto file containing the given object.
+ * @param o the given object.
+ * @return the package of the proto file containing the given object or {@code null} if the proto file does not have a
+ * package.
+ */
+ public Package packageOf(EObject o) {
+ return rootOf(o).getPackage();
+ }
+
+ /**
+ * Returns the root element of the proto file containing the given object.
+ * @param o the given object.
+ * @return the root element of the proto file containing the given object.
+ */
+ public Protobuf rootOf(EObject o) {
+ EObject current = o;
+ while (!(current instanceof Protobuf)) current = current.eContainer();
+ return (Protobuf) current;
+ }
+}