In progress: [ Issue 45 ] Protobuf-dt should be able to open files outside workspace
https://code.google.com/p/protobuf-dt/issues/detail?id=45

Code cleanup.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
index 6d662ce..5f69dbb 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
@@ -8,6 +8,8 @@
 import static com.google.eclipse.protobuf.ui.ProtobufUiModule.PLUGIN_ID;
 import static org.eclipse.core.runtime.IStatus.ERROR;
 import static org.eclipse.emf.common.util.URI.createURI;
+import static org.eclipse.emf.ecore.util.EcoreUtil.resolveAll;
+import static org.eclipse.xtext.util.CancelIndicator.NullImpl;
 import static org.eclipse.xtext.validation.CheckMode.FAST_ONLY;
 
 import java.io.*;
@@ -19,9 +21,8 @@
 import org.eclipse.jface.text.source.IAnnotationModel;
 import org.eclipse.ui.IURIEditorInput;
 import org.eclipse.ui.ide.FileStoreEditorInput;
-import org.eclipse.xtext.parser.IParseResult;
-import org.eclipse.xtext.parser.IParser;
-import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.linking.lazy.LazyLinkingResource;
+import org.eclipse.xtext.resource.*;
 import org.eclipse.xtext.ui.editor.model.XtextDocument;
 import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
 import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
@@ -43,8 +44,9 @@
   
   @Inject private Closeables closeables;
   @Inject private IssueResolutionProvider issueResolutionProvider;
-  @Inject private IParser parser;
+  @Inject private IResourceFactory resourceFactory;
   @Inject private IResourceValidator resourceValidator;
+  @Inject private XtextResourceSet resourceSet;
   
   @Override protected ElementInfo createElementInfo(Object element) throws CoreException {
     if (element instanceof FileStoreEditorInput) return createElementInfo((FileStoreEditorInput) element);
@@ -87,12 +89,10 @@
   private IDocument createDocument(FileStoreEditorInput input) throws CoreException {
     XtextDocument document = createEmptyDocument();
     File file = fileFrom(input);
-    XtextResource resource = new XtextResource(createURI(file.toURI().toString()));
     try {
       String contents = contentsOf(file);
       document.set(contents);
-      IParseResult result = parser.parse(readerFor(new StringInputStream(contents)));
-      resource.getContents().add(result.getRootASTElement());
+      XtextResource resource = createResource(file.toURI().toString(), new StringInputStream(contents));
       document.setInput(resource);
       return document;
     } catch (Throwable t) {
@@ -134,4 +134,20 @@
   private Reader readerFor(InputStream inputStream) throws IOException {
     return new InputStreamReader(inputStream, ENCODING);
   }
+  
+  private XtextResource createResource(String uri, InputStream input) {
+    XtextResource resource = (XtextResource) resourceFactory.createResource(createURI(uri));
+    resourceSet.getResources().add(resource);
+    try {
+      resource.load(input, null);
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+    if (resource instanceof LazyLinkingResource) {
+      ((LazyLinkingResource) resource).resolveLazyCrossReferences(NullImpl);
+      return resource;
+    }
+    resolveAll(resource);
+    return resource;
+  }
 }