Fixed: [ Issue 82 ] Support single-line comments as documentation.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index d8d1779..43c431f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -11,14 +11,33 @@
import static com.google.inject.name.Names.named;
import static org.eclipse.ui.PlatformUI.isWorkbenchRunning;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.ui.LanguageSpecific;
+import org.eclipse.xtext.ui.editor.IURIEditorOpener;
+import org.eclipse.xtext.ui.editor.IXtextEditorCallback;
+import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
+import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.IHighlightingConfiguration;
+import org.eclipse.xtext.ui.editor.syntaxcoloring.ISemanticHighlightingCalculator;
+
import com.google.eclipse.protobuf.scoping.IFileUriResolver;
import com.google.eclipse.protobuf.ui.builder.AutoAddNatureEditorCallback;
+import com.google.eclipse.protobuf.ui.documentation.ProtobufDocumentationProvider;
import com.google.eclipse.protobuf.ui.editor.ProtobufUriEditorOpener;
import com.google.eclipse.protobuf.ui.editor.hyperlinking.ProtobufHyperlinkDetector;
import com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider;
-import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.*;
+import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.HighlightingConfiguration;
+import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.ProtobufSemanticHighlightingCalculator;
import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
-import com.google.eclipse.protobuf.ui.outline.*;
+import com.google.eclipse.protobuf.ui.outline.LinkWithEditor;
+import com.google.eclipse.protobuf.ui.outline.ProtobufOutlinePage;
import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
import com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferenceStoreInitializer;
import com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferenceStoreInitializer;
@@ -27,17 +46,6 @@
import com.google.eclipse.protobuf.ui.validation.ValidateOnActivation;
import com.google.inject.Binder;
-import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
-import org.eclipse.ui.*;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.xtext.ui.LanguageSpecific;
-import org.eclipse.xtext.ui.editor.*;
-import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
-import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
-import org.eclipse.xtext.ui.editor.preferences.*;
-import org.eclipse.xtext.ui.editor.syntaxcoloring.*;
-
/**
* Use this class to register components to be used within the IDE.
*
@@ -119,4 +127,8 @@
public void configureHighlightingConfiguration(Binder binder) {
binder.bind(IHighlightingConfiguration.class).to(HighlightingConfiguration.class);
}
+
+ public void configureEObjectDocumentationProvider(Binder binder) {
+ binder.bind(IEObjectDocumentationProvider.class).to(ProtobufDocumentationProvider.class);
+ }
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java
new file mode 100644
index 0000000..b4e270e
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/ProtobufDocumentationProvider.java
@@ -0,0 +1,47 @@
+/*
+ * 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.ui.documentation;
+
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.documentation.impl.MultiLineCommentDocumentationProvider;
+
+import com.google.inject.Inject;
+
+/**
+ * Provides single-line and multi-line comments as documentation of a protobuf element.
+ *
+ * @author Alex Ruiz
+ */
+public class ProtobufDocumentationProvider implements IEObjectDocumentationProvider {
+
+ private final List<IEObjectDocumentationProvider> delegates = new ArrayList<IEObjectDocumentationProvider>();
+
+ @Inject
+ public ProtobufDocumentationProvider(SingleLineDocumentationProvider p1, MultiLineCommentDocumentationProvider p2) {
+ delegates.add(p1);
+ delegates.add(p2);
+ }
+
+
+ /** {@inheritDoc} */
+ public String getDocumentation(EObject o) {
+ for (IEObjectDocumentationProvider p: delegates) {
+ String documentation = p.getDocumentation(o);
+ if (!(isEmpty(documentation))) return documentation;
+ }
+ return "";
+ }
+
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java
new file mode 100644
index 0000000..e74b45d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/documentation/SingleLineDocumentationProvider.java
@@ -0,0 +1,77 @@
+/*
+ * 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.ui.documentation;
+
+import static org.eclipse.xtext.nodemodel.util.NodeModelUtils.getNode;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.TerminalRule;
+import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.nodemodel.*;
+
+import com.google.eclipse.protobuf.protobuf.*;
+import com.google.eclipse.protobuf.scoping.ProtoDescriptor;
+import com.google.eclipse.protobuf.scoping.ProtoDescriptorProvider;
+import com.google.inject.Inject;
+
+/**
+ * Provides single line comments of a protobuf element as its documentation when hovered.
+ *
+ * @author Alex Ruiz
+ */
+public class SingleLineDocumentationProvider implements IEObjectDocumentationProvider {
+
+ @Inject private ProtoDescriptorProvider descriptorProvider;
+
+ private static final String RULE_NAME = "SL_COMMENT";
+
+ public String getDocumentation(EObject o) {
+ String comment = findComment(o);
+ return comment != null ? comment : "";
+ }
+
+ private String findComment(EObject o) {
+ EObject target = findRealTarget(o);
+ ICompositeNode node = getNode(target);
+ if (node == null) return null;
+ StringBuilder commentBuilder = new StringBuilder();
+ for (INode currentNode : node.getAsTreeIterable()) {
+ if (currentNode instanceof ILeafNode && !((ILeafNode) currentNode).isHidden()) break;
+ if (currentNode instanceof ILeafNode && isSingleLineCommentTerminalRule(currentNode.getGrammarElement())) {
+ String comment = ((ILeafNode) currentNode).getText();
+ commentBuilder.append(cleanUp(comment));
+ }
+ }
+ return commentBuilder.toString();
+ }
+
+ private EObject findRealTarget(EObject o) {
+ if (o instanceof Option) {
+ ProtoDescriptor descriptor = descriptorProvider.get();
+ Property p = descriptor.lookupOption(((Option) o).getName());
+ return p != null ? p : o;
+ }
+ if (o instanceof FieldOption) {
+ ProtoDescriptor descriptor = descriptorProvider.get();
+ Property p = descriptor.lookupFieldOption(((FieldOption) o).getName());
+ return p != null ? p : o;
+ }
+ return o;
+ }
+
+ private boolean isSingleLineCommentTerminalRule(EObject o) {
+ if (!(o instanceof TerminalRule)) return false;
+ TerminalRule rule = (TerminalRule) o;
+ return RULE_NAME.equalsIgnoreCase(rule.getName());
+ }
+
+ private String cleanUp(String comment) {
+ return comment.replaceFirst("//\\s*", "").replaceAll("\\r\\n", " ").replaceAll("\\n", " ");
+ }
+}