Working on supporting pluggable descriptor.proto definitions.
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Descriptor_fileOptions_Test.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Descriptor_fileOptions_Test.java
index 3afe1bb..43ee6b3 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Descriptor_fileOptions_Test.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/scoping/Descriptor_fileOptions_Test.java
@@ -28,7 +28,7 @@
@Rule public XtextRule xtext = new XtextRule();
- private IProtoDescriptor descriptor;
+ private ProtoDescriptor descriptor;
@Before public void setUp() {
descriptor = xtext.getInstanceOf(ProtoDescriptor.class);
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 845fa54..ed93126 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
@@ -106,7 +106,7 @@
@Override public void completeOption_Value(EObject model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
Option option = (Option) model;
- IProtoDescriptor descriptor = descriptorProvider.get();
+ ProtoDescriptor descriptor = descriptorProvider.get();
Enum enumType = descriptor.enumTypeOf(option);
if (enumType != null) {
proposeAndAccept(enumType, context, acceptor);
@@ -399,7 +399,7 @@
@Override public void completeFieldOption_Value(EObject model, Assignment assignment, ContentAssistContext context,
ICompletionProposalAcceptor acceptor) {
FieldOption option = (FieldOption) model;
- IProtoDescriptor descriptor = descriptorProvider.get();
+ ProtoDescriptor descriptor = descriptorProvider.get();
Enum enumType = descriptor.enumTypeOf(option);
if (enumType != null) {
proposeAndAccept(enumType, context, acceptor);
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptor.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptor.java
deleted file mode 100644
index 4560359..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptor.java
+++ /dev/null
@@ -1,83 +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.scoping;
-
-import java.util.Collection;
-
-import com.google.eclipse.protobuf.protobuf.*;
-import com.google.eclipse.protobuf.protobuf.Enum;
-
-/**
- * Contains the elements from descriptor.proto (provided with protobuf's library.)
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public interface IProtoDescriptor {
-
- /**
- * Returns all the file-level options available. These are the options defined in
- * {@code google/protobuf/descriptor.proto} (more details can be found
- * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @return all the file-level options available.
- */
- public abstract Collection<Property> fileOptions();
-
- /**
- * Looks up an option per name, as defined in {@code google/protobuf/descriptor.proto}
- * (more details can be found <a
- * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @param name the name of the option to look for.
- * @return the option whose name matches the given one or {@code null} if a matching option is not found.
- */
- public abstract Property lookupOption(String name);
-
- /**
- * Returns all the message-level options available. These are the options defined in
- * {@code google/protobuf/descriptor.proto} (more details can be found
- * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @return all the message-level options available.
- */
- public abstract Collection<Property> messageOptions();
-
- /**
- * Returns all the field-level options available. These are the options defined in
- * {@code google/protobuf/descriptor.proto} (more details can be found
- * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @return all the field-level options available.
- */
- public abstract Collection<Property> fieldOptions();
-
- /**
- * Looks up a field-level option per name. Field-level options are defined in {@code google/protobuf/descriptor.proto}
- * (more details can be found <a
- * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @param name the name of the option to look for.
- * @return the option whose name matches the given one or {@code null} if a matching option is not found.
- */
- public abstract Property lookupFieldOption(String name);
-
- /**
- * Returns the enum type of the given option, only if the given option is defined in
- * {@code google/protobuf/descriptor.proto} and its type is enum (more details can be found <a
- * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @param option the given option.
- * @return the enum type of the given option or {@code null} if the type of the given option is not enum.
- */
- public abstract Enum enumTypeOf(Option option);
-
- /**
- * Returns the enum type of the given option, only if the given option is defined in
- * {@code google/protobuf/descriptor.proto} and its type is enum (more details can be found <a
- * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
- * @param option the given option.
- * @return the enum type of the given option or {@code null} if the type of the given option is not enum.
- */
- public abstract Enum enumTypeOf(FieldOption option);
-
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java
new file mode 100644
index 0000000..319e45b
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IProtoDescriptorSource.java
@@ -0,0 +1,37 @@
+/*
+ * 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 com.google.inject.ImplementedBy;
+
+import org.eclipse.emf.common.util.URI;
+
+import java.io.*;
+
+/**
+ * Provides the contents of <code>{@link ProtoDescriptor}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@ImplementedBy(OssProtoDescriptorSource.class)
+public interface IProtoDescriptorSource {
+
+ /**
+ * Returns the URI of the resource containing the descriptor.
+ * @return the URI of the resource containing the descriptor.
+ */
+ URI uri();
+
+ /**
+ * Returns the contents of the descriptor.
+ * @return the contents of the descriptor.
+ * @throws IOException if something goes wrong.
+ */
+ InputStream contents() throws IOException;
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java
new file mode 100644
index 0000000..01492b4
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OssProtoDescriptorSource.java
@@ -0,0 +1,37 @@
+/*
+ * 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 com.google.inject.Singleton;
+
+import org.eclipse.emf.common.util.URI;
+
+import java.io.*;
+import java.net.URL;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+class OssProtoDescriptorSource implements IProtoDescriptorSource {
+
+ private static final String DESCRIPTOR_URL = "platform:/plugin/com.google.eclipse.protobuf/descriptor.proto";
+
+ private static final URI DESCRIPTOR_URI = URI.createURI(DESCRIPTOR_URL);
+
+ public URI uri() {
+ return DESCRIPTOR_URI;
+ }
+
+ public InputStream contents() throws IOException {
+ URL url = new URL(DESCRIPTOR_URL);
+ return url.openConnection().getInputStream();
+ }
+
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
index 618b2d4..31c4cf5 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor.java
@@ -12,7 +12,6 @@
import static com.google.eclipse.protobuf.scoping.OptionType.*;
import static com.google.eclipse.protobuf.util.Closeables.close;
import static java.util.Collections.unmodifiableCollection;
-import static org.eclipse.emf.common.util.URI.createURI;
import static org.eclipse.xtext.EcoreUtil2.*;
import static org.eclipse.xtext.util.CancelIndicator.NullImpl;
import static org.eclipse.xtext.util.Strings.isEmpty;
@@ -26,8 +25,7 @@
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.resource.XtextResource;
-import java.io.*;
-import java.net.URL;
+import java.io.InputStreamReader;
import java.util.*;
/**
@@ -35,9 +33,8 @@
*
* @author alruiz@google.com (Alex Ruiz)
*/
-public class ProtoDescriptor implements IProtoDescriptor {
+public class ProtoDescriptor {
- private static final String DESCRIPTOR_URI = "platform:/plugin/com.google.eclipse.protobuf/descriptor.proto";
private static final Map<String, OptionType> OPTION_DEFINITION_BY_NAME = new HashMap<String, OptionType>();
static {
@@ -54,13 +51,13 @@
private final ModelNodes nodes;
- @Inject public ProtoDescriptor(IParser parser, ModelNodes nodes) {
+ @Inject public ProtoDescriptor(IParser parser, IProtoDescriptorSource source, ModelNodes nodes) {
this.nodes = nodes;
addOptionTypes();
InputStreamReader reader = null;
try {
- XtextResource resource = new XtextResource(createURI(DESCRIPTOR_URI));
- reader = new InputStreamReader(globalScopeContents(), "UTF-8");
+ XtextResource resource = new XtextResource(source.uri());
+ reader = new InputStreamReader(source.contents(), "UTF-8");
IParseResult result = parser.parse(reader);
root = (Protobuf) result.getRootASTElement();
resource.getContents().add(root);
@@ -79,11 +76,6 @@
optionsByType.put(type, new LinkedHashMap<String, Property>());
}
- private static InputStream globalScopeContents() throws IOException {
- URL url = new URL(DESCRIPTOR_URI);
- return url.openConnection().getInputStream();
- }
-
private void initContents() {
for (Message m : getAllContentsOfType(root, Message.class)) {
OptionType type = OPTION_DEFINITION_BY_NAME.get(m.getName());
@@ -114,17 +106,28 @@
return "uninterpreted_option".equals(property.getName());
}
- /** {@inheritDoc} */
+ /**
+ * Returns all the file-level options available. These are the options defined in
+ * {@code google/protobuf/descriptor.proto} (more details can be found
+ * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @return all the file-level options available.
+ */
public Collection<Property> fileOptions() {
return optionsOfType(FILE);
}
- /** {@inheritDoc} */
+ /**
+ * Looks up an option per name, as defined in {@code google/protobuf/descriptor.proto}
+ * (more details can be found <a
+ * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @param name the name of the option to look for.
+ * @return the option whose name matches the given one or {@code null} if a matching option is not found.
+ */
public Property lookupOption(String name) {
return lookupOption(name, FILE, MESSAGE, METHOD);
}
- public Property lookupOption(String name, OptionType...types) {
+ private Property lookupOption(String name, OptionType...types) {
for (OptionType type : types) {
Property p = lookupOption(name, type);
if (p != null) return p;
@@ -132,7 +135,13 @@
return null;
}
- /** {@inheritDoc} */
+ /**
+ * Looks up a field-level option per name. Field-level options are defined in {@code google/protobuf/descriptor.proto}
+ * (more details can be found <a
+ * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @param name the name of the option to look for.
+ * @return the option whose name matches the given one or {@code null} if a matching option is not found.
+ */
public Property lookupFieldOption(String name) {
return lookupOption(name, FIELD);
}
@@ -141,12 +150,22 @@
return optionsByType.get(type).get(name);
}
- /** {@inheritDoc} */
+ /**
+ * Returns all the message-level options available. These are the options defined in
+ * {@code google/protobuf/descriptor.proto} (more details can be found
+ * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @return all the message-level options available.
+ */
public Collection<Property> messageOptions() {
return optionsOfType(MESSAGE);
}
- /** {@inheritDoc} */
+ /**
+ * Returns all the field-level options available. These are the options defined in
+ * {@code google/protobuf/descriptor.proto} (more details can be found
+ * <a href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @return all the field-level options available.
+ */
public Collection<Property> fieldOptions() {
return optionsOfType(FIELD);
}
@@ -155,13 +174,25 @@
return unmodifiableCollection(optionsByType.get(type).values());
}
- /** {@inheritDoc} */
+ /**
+ * Returns the enum type of the given option, only if the given option is defined in
+ * {@code google/protobuf/descriptor.proto} and its type is enum (more details can be found <a
+ * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @param option the given option.
+ * @return the enum type of the given option or {@code null} if the type of the given option is not enum.
+ */
public Enum enumTypeOf(Option option) {
String name = option.getName();
return enumTypeOf(lookupOption(name));
}
- /** {@inheritDoc} */
+ /**
+ * Returns the enum type of the given option, only if the given option is defined in
+ * {@code google/protobuf/descriptor.proto} and its type is enum (more details can be found <a
+ * href=http://code.google.com/apis/protocolbuffers/docs/proto.html#options" target="_blank">here</a>.)
+ * @param option the given option.
+ * @return the enum type of the given option or {@code null} if the type of the given option is not enum.
+ */
public Enum enumTypeOf(FieldOption option) {
String name = option.getName();
return enumTypeOf(lookupFieldOption(name));
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
index 82aef7f..b235efb 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
@@ -19,15 +19,16 @@
* @author Alex Ruiz
*/
@Singleton
-public class ProtoDescriptorProvider implements Provider<IProtoDescriptor> {
+public class ProtoDescriptorProvider implements Provider<ProtoDescriptor> {
@Inject private IParser parser;
+ @Inject private IProtoDescriptorSource source;
@Inject private ModelNodes nodes;
- private IProtoDescriptor descriptor;
+ private ProtoDescriptor descriptor;
- public synchronized IProtoDescriptor get() {
- if (descriptor == null) descriptor = new ProtoDescriptor(parser, nodes);
+ public synchronized ProtoDescriptor get() {
+ if (descriptor == null) descriptor = new ProtoDescriptor(parser, source, nodes);
return descriptor;
}
}
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 461b2a5..562a552 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
@@ -170,7 +170,7 @@
}
private Enum enumTypeOfOption(EObject mayBeOption) {
- IProtoDescriptor descriptor = descriptorProvider.get();
+ ProtoDescriptor descriptor = descriptorProvider.get();
if (mayBeOption instanceof Option) return descriptor.enumTypeOf((Option) mayBeOption);
if (mayBeOption instanceof FieldOption) return descriptor.enumTypeOf((FieldOption) mayBeOption);
return null;