Code cleanup.
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/AstBasedCppToProtobufMapper.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/AstBasedCppToProtobufMapper.java
index ab73569..621f55b 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/AstBasedCppToProtobufMapper.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/AstBasedCppToProtobufMapper.java
@@ -21,8 +21,8 @@
 import org.eclipse.core.runtime.*;
 import org.eclipse.ui.IEditorPart;
 
-import com.google.eclipse.protobuf.cdt.editor.Editors;
 import com.google.eclipse.protobuf.cdt.mapping.*;
+import com.google.eclipse.protobuf.cdt.util.Editors;
 import com.google.inject.*;
 
 /**
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtoFilePathFinder.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtoFilePathFinder.java
new file mode 100644
index 0000000..38d640c
--- /dev/null
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtoFilePathFinder.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2012 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.cdt.actions;
+
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import java.io.*;
+import java.util.regex.*;
+
+import org.eclipse.cdt.core.model.*;
+import org.eclipse.cdt.internal.ui.editor.CEditor;
+import org.eclipse.core.runtime.*;
+import org.eclipse.ui.IEditorPart;
+
+import com.google.inject.Singleton;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@SuppressWarnings("restriction")
+@Singleton class ProtoFilePathFinder {
+  private static final Pattern PROTO_PATH_PATTERN = Pattern.compile("// source: (.*)");
+
+  IPath findProtoFilePathIn(IEditorPart editor) {
+    CEditor cEditor = (CEditor) editor;
+    String contents = contentsOf(cEditor);
+    if (isEmpty(contents)) {
+      return null;
+    }
+    String line = null;
+    int lineCounter = 0;
+    BufferedReader reader = new BufferedReader(new StringReader(contents));
+    try {
+      while ((line = reader.readLine()) != null) {
+        switch (lineCounter) {
+          case 0:
+            if (!"// Generated by the protocol buffer compiler.  DO NOT EDIT!".equals(line)) {
+              return null;
+            }
+            lineCounter++;
+            break;
+          case 1:
+            return pathFrom(line);
+        }
+      }
+    } catch (IOException e) {}
+    return null;
+  }
+
+  private String contentsOf(CEditor cEditor) {
+    ICElement input = cEditor.getInputCElement();
+    if (input instanceof ITranslationUnit) {
+      ITranslationUnit translationUnit = (ITranslationUnit) input;
+      return new String(translationUnit.getContents());
+    }
+    return null;
+  }
+
+  private IPath pathFrom(String line) {
+    Matcher matcher = PROTO_PATH_PATTERN.matcher(line);
+    if (!matcher.matches()) {
+      return null;
+    }
+    String path = matcher.group(1);
+    return (!isEmpty(path)) ? new Path(path) : null;
+  }
+}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
index 8b46ce4..badec44 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/actions/ProtobufElementUriFinder.java
@@ -8,17 +8,14 @@
  */
 package com.google.eclipse.protobuf.cdt.actions;
 
-import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.xtext.naming.QualifiedName;
 import org.eclipse.xtext.resource.IResourceDescription;
 
-import com.google.eclipse.protobuf.cdt.editor.Editors;
 import com.google.eclipse.protobuf.cdt.mapping.CppToProtobufMapping;
 import com.google.eclipse.protobuf.cdt.matching.ProtobufElementMatcher;
-import com.google.eclipse.protobuf.cdt.path.ProtoFilePaths;
 import com.google.eclipse.protobuf.resource.*;
 import com.google.inject.Inject;
 
@@ -28,14 +25,12 @@
 class ProtobufElementUriFinder {
   @Inject private ProtobufElementMatcher matcher;
   @Inject private ResourceDescriptions descriptions;
-  @Inject private Editors editors;
   @Inject private IndexLookup indexLookup;
   @Inject private AstBasedCppToProtobufMapper mapper;
-  @Inject private ProtoFilePaths paths;
+  @Inject private ProtoFilePathFinder pathFinder;
 
   URI findProtobufElementUriFromSelectionOf(IEditorPart editor) {
-    IFile file = editors.fileDisplayedIn(editor);
-    IPath protoFilePath = paths.protoFilePath(file);
+    IPath protoFilePath = pathFinder.findProtoFilePathIn(editor);
     if (protoFilePath != null) {
       CppToProtobufMapping mapping = mapper.createMappingFromSelectionOf(editor);
       if (mapping != null) {
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/path/ProtoFilePaths.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/path/ProtoFilePaths.java
deleted file mode 100644
index 3f69641..0000000
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/path/ProtoFilePaths.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2012 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.cdt.path;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences.compilerPreferences;
-import static com.google.eclipse.protobuf.ui.util.Paths.segmentsOf;
-import static org.eclipse.core.runtime.IPath.SEPARATOR;
-import static org.eclipse.xtext.util.Strings.*;
-
-import java.util.List;
-
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-
-import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferences;
-import com.google.inject.Inject;
-
-/**
- * Utility methods related to paths of .proto files.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtoFilePaths {
-  private static final String PATH_SEPARATOR = new String(new char[] { SEPARATOR });
-
-  @Inject private IPreferenceStoreAccess storeAccess;
-
-  /**
-   * Returns the path of the .proto file used as source of the generated C++ header file.
-   * @param cppHeaderFile the generated C++ header file.
-   * @return the path of the .proto file used as source of the generated C++ header file, or {@code null} if the given
-   * file is not a C++ header file or if C++ code generation is not enabled in the proto editor.
-   */
-  public IPath protoFilePath(IFile cppHeaderFile) {
-    IPath cppOutputDirectory = cppOutputDirectory(cppHeaderFile.getProject());
-    if (cppOutputDirectory == null) {
-      return null;
-    }
-    IPath headerFilePath = cppHeaderFile.getFullPath();
-    List<String> newPathSegments = newArrayList(headerFilePath.segments());
-    for (int i = 0; i < headerFilePath.segmentCount() - 1; i++) {
-      newPathSegments.remove(0);
-      if (headerFilePath.segment(i).equals(cppOutputDirectory.lastSegment())) {
-        break;
-      }
-    }
-    int fileNameIndex = newPathSegments.size() - 1;
-    String fileName = newPathSegments.get(fileNameIndex);
-    newPathSegments.set(fileNameIndex, fileName.replace(".pb.h", ".proto"));
-    return new Path(concat(PATH_SEPARATOR, newPathSegments));
-  }
-
-  private IPath cppOutputDirectory(IProject project) {
-    CompilerPreferences preferences = compilerPreferences(storeAccess, project);
-    if (!preferences.compileProtoFiles().getValue() && !preferences.cppCodeGenerationEnabled().getValue()) {
-      return null;
-    }
-    String directoryName = preferences.cppOutputDirectory().getValue();
-    if (isEmpty(directoryName)) {
-      return null;
-    }
-    IFolder directory = null;
-    String[] segments = segmentsOf(directoryName);
-    StringBuilder pathBuilder = new StringBuilder();
-    for (String segment : segments) {
-      pathBuilder.append(segment);
-      directory = project.getFolder(pathBuilder.toString());
-      if (!directory.exists()) {
-        return null;
-      }
-      pathBuilder.append(SEPARATOR);
-    }
-    if (directory == null) {
-      return null;
-    }
-    return directory.getFullPath();
-  }
-}
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/editor/Editors.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/util/Editors.java
similarity index 96%
rename from com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/editor/Editors.java
rename to com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/util/Editors.java
index 2c088b4..8a006dd 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/editor/Editors.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/util/Editors.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.cdt.editor;
+package com.google.eclipse.protobuf.cdt.util;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.jface.text.ITextSelection;
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java
index b28ffe3..ae13715 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/resource/ResourceDescriptions.java
@@ -64,7 +64,7 @@
     for (IEObjectDescription exported : resource.getExportedObjects()) {
       QualifiedName qualifiedName = exported.getQualifiedName();
       Matcher matcher = pattern.matcher(converter.toString(qualifiedName));
-      if (matcher.matches() && haveMatchingNames(exported.getEClass(), type)) {
+      if (haveMatchingNames(exported.getEClass(), type) && matcher.matches()) {
         descriptions.add(exported);
       }
     }