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; + } }