In progress: [ Issue 40 ] Add support for import resolution across multiple folders https://code.google.com/p/protobuf-dt/issues/detail?id=40
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java index 970c2fd..c0692f0 100644 --- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java +++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ProtobufImportUriFixer.java
@@ -8,17 +8,24 @@ */ package com.google.eclipse.protobuf.ui.scoping; +import static com.google.eclipse.protobuf.ui.preferences.paths.FileResolutionType.SINGLE_FOLDER; import static org.eclipse.emf.common.util.URI.createURI; import static org.eclipse.xtext.util.Tuples.pair; import java.util.ArrayList; import java.util.List; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; import org.eclipse.emf.common.util.URI; +import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess; import org.eclipse.xtext.util.Pair; import com.google.eclipse.protobuf.scoping.ImportUriFixer; import com.google.eclipse.protobuf.scoping.ResourceChecker; +import com.google.eclipse.protobuf.ui.preferences.paths.Preferences; +import com.google.inject.Inject; /** * @author alruiz@google.com (Alex Ruiz) @@ -27,6 +34,8 @@ private static final String SEPARATOR = "/"; + @Inject private IPreferenceStoreAccess access; + /* * The import URI is relative to the file where the import is. Protoc works fine, but the editor doesn't. * In order for the editor to see the import, we need to add to the import URI "platform:resource" and the parent @@ -45,17 +54,34 @@ public String fixUri(String importUri, URI resourceUri, ResourceChecker checker) { if (importUri.startsWith(PREFIX)) return importUri; Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList()); - String fixed = fixUri(importUriPair, resourceUri, checker); + Preferences preferences = Preferences.loadPreferences(access, projectFrom(resourceUri)); + String fixed = fixUri(importUriPair, resourceUri, checker, preferences); System.out.println(resourceUri + " : " + importUri + " : " + fixed); if (fixed == null) return importUri; return fixed; } - - private String fixUri(Pair<String, List<String>> importUri, URI resourceUri, ResourceChecker checker) { - List<String> segments = resourceUri.segmentsList(); - return fixUri(importUri, removeFirstAndLast(segments), checker); - } + private static IProject projectFrom(URI resourceUri) { + IPath resourcePath = new Path(resourceUri.toPlatformString(true)); + IFile resource = ResourcesPlugin.getWorkspace().getRoot().getFile(resourcePath); + return resource.getProject(); + } + + private String fixUri(Pair<String, List<String>> importUri, URI resourceUri, ResourceChecker checker, + Preferences preferences) { + List<String> segments = removeFirstAndLast(resourceUri.segmentsList()); + if (preferences.fileResolutionType.equals(SINGLE_FOLDER)) { + return fixUri(importUri, segments, checker); + } + List<String> folderNames = preferences.folderNames; + for (String folderName : folderNames) { + segments.set(1, folderName); + String fixed = fixUri(importUri, segments, checker); + if (fixed != null) return fixed; + } + return null; + } + private List<String> removeFirstAndLast(List<String> list) { if (list.isEmpty()) return list; List<String> newList = new ArrayList<String>(list);