In progress: [ Issue 40 ] Add support for import resolution across multiple folders https://code.google.com/p/protobuf-dt/issues/detail?id=40 Looks like it is working. Needs clean up and testing.
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java index bd05dac..7cba64e 100644 --- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java +++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver_resolveUri_Test.java
@@ -85,7 +85,7 @@ } private void callStubs(FileResolutionType type, boolean resolvedUriExists) { - when(resources.project(resource)).thenReturn(project); + when(resources.project(resource.getURI())).thenReturn(project); when(preferenceReader.readFromPrefereceStore(project)).thenReturn(preferences); when(preferences.fileResolutionType()).thenReturn(type); when(resources.fileExists(any(URI.class))).thenReturn(resolvedUriExists);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java index e5e6491..d3659fa 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileUriResolver.java
@@ -15,6 +15,8 @@ import java.util.ArrayList; import java.util.List; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.xtext.util.Pair; @@ -29,6 +31,7 @@ */ public class FileUriResolver implements IFileUriResolver { + private static final String PREFIX = "platform:/resource"; private static final String SEPARATOR = "/"; @Inject private PreferenceReader preferenceReader; @@ -52,23 +55,22 @@ public String resolveUri(String importUri, Resource declaringResource) { if (importUri.startsWith(PREFIX)) return importUri; Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList()); - Preferences preferences = preferenceReader.readFromPrefereceStore(resources.project(declaringResource)); - URI resourceUri = declaringResource.getURI(); - String fixed = resolveUri(importUriPair, resourceUri, preferences); - System.out.println(resourceUri + " : " + importUri + " : " + fixed); - if (fixed == null) return importUri; - return fixed; + String resolved = resolveUri(importUriPair, declaringResource.getURI()); +// System.out.println(declaringResource.getURI() + " : " + importUri + " : " + resolved); + if (resolved == null) return importUri; + return resolved; } - private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri, Preferences preferences) { + private String resolveUri(Pair<String, List<String>> importUri, URI resourceUri) { + IProject project = resources.project(resourceUri); + Preferences preferences = preferenceReader.readFromPrefereceStore(project); List<String> segments = removeFirstAndLast(resourceUri.segmentsList()); if (preferences.fileResolutionType().equals(SINGLE_FOLDER)) { return resolveUri(importUri, segments); } for (String folderName : preferences.folderNames()) { - segments.set(1, folderName); - String fixed = resolveUri(importUri, segments); - if (fixed != null) return fixed; + String resolved = resolveUri(importUri, folderName, project); + if (resolved != null) return resolved; } return null; } @@ -82,16 +84,20 @@ } private String resolveUri(Pair<String, List<String>> importUri, List<String> resourceUri) { - StringBuilder prefix = new StringBuilder(); - // prefix.append(PREFIX); + StringBuilder pathBuilder = new StringBuilder(); String firstSegment = importUri.getSecond().get(0); for (String segment : resourceUri) { if (segment.equals(firstSegment)) break; - prefix.append(SEPARATOR).append(segment); + pathBuilder.append(segment).append(SEPARATOR); } - prefix.append(SEPARATOR); - String fixed = PREFIX + prefix.toString() + importUri.getFirst(); - if (resources.fileExists(createURI(fixed))) return fixed; - return null; + String resolved = PREFIX + SEPARATOR + pathBuilder.toString() + importUri.getFirst(); + return (resources.fileExists(createURI(resolved))) ? resolved : null; + } + + private String resolveUri(Pair<String, List<String>> importUri, String folderName, IProject project) { + String path = folderName + SEPARATOR + importUri.getFirst(); + IResource findMember = project.findMember(path); + boolean exists = (findMember != null) ? findMember.exists() : false; + return (exists) ? PREFIX + project.getFullPath() + SEPARATOR + path : null; } }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java index 876f0d4..2839af5 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/Resources.java
@@ -12,7 +12,6 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.resource.Resource; /** * Utility methods related to resources (e.g. files, directories.) @@ -22,12 +21,12 @@ public class Resources { /** - * Returns the project that contains the given resource. - * @param resource the given resource. - * @return the project that contains the given resource. + * Returns the project that contains the resource at the given URI. + * @param resourceUri the given URI. + * @return the project that contains the resource at the given URI. */ - public IProject project(Resource resource) { - return file(resource.getURI()).getProject(); + public IProject project(URI resourceUri) { + return file(resourceUri).getProject(); } /**
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java index 1c0a857..58257de 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IFileUriResolver.java
@@ -21,9 +21,6 @@ @ImplementedBy(NullFileUriResolver.class) public interface IFileUriResolver { - /** Prefix present in resolved URIs. */ - String PREFIX = "platform:/resource"; - /** * Resolves the given partial URI. * @param importUri the partial URI (comes from a {@code Import}.)
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java index d0e2a67..4fdd459 100644 --- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java +++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
@@ -8,8 +8,6 @@ */ package com.google.eclipse.protobuf.scoping; -import static com.google.eclipse.protobuf.scoping.IFileUriResolver.PREFIX; - import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.scoping.impl.ImportUriResolver; @@ -32,11 +30,6 @@ @Inject private IFileUriResolver delegate; /** - * Prefix used by EMF for resource URIs: "platform:/resource/". - */ - public static final String URI_PREFIX = PREFIX + "/"; - - /** * If the given {@code EObject} is a <code>{@link Import}</code>, this method will add "platform:/resource" to the * URI of such import if not specified already. * @param from the given element to resolve. @@ -45,10 +38,10 @@ @Override public String apply(EObject from) { if (from instanceof Import) { Import anImport = (Import) from; - String originalUri = anImport.getImportURI(); + // String originalUri = anImport.getImportURI(); anImport.setImportURI(resolveImportUri(anImport)); String applied = super.apply(from); - anImport.setImportURI(originalUri); + // anImport.setImportURI(originalUri); return applied; } if (from instanceof Import) resolveImportUri((Import) from);