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", " ");
+  }
+}