In progress: [ Issue 40 ] Add support for import resolution across multiple folders
https://code.google.com/p/protobuf-dt/issues/detail?id=40
Adding support for using both workspace and file system paths for resolution of imports.
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index dd25975..da63f1b 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -67,11 +67,6 @@
id="com.google.eclipse.protobuf.ui.preferences.compiler.CompilerPreferencePage" name="%page.name.2">
<keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
</page>
- <page category="com.google.eclipse.protobuf.Protobuf"
- class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferencePage"
- id="com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferencePage" name="%page.name.3">
- <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
- </page>
</extension>
<extension point="org.eclipse.ui.keywords">
<keyword id="com.google.eclipse.protobuf.ui.keyword_Protobuf" label="%keyword.label" />
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
index 52208d1..89b6b9a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceNames.java
@@ -13,7 +13,6 @@
*/
final class PathsPreferenceNames {
- static final String ENABLE_PROJECT_SETTINGS = "paths.enableProjectSettings";
static final String FILES_IN_ONE_DIRECTORY_ONLY = "paths.filesInOneDirectoryOnly";
static final String FILES_IN_MULTIPLE_DIRECTORIES = "paths.filesInMultipleDirectories";
static final String DIRECTORY_PATHS = "paths.directoryPaths";
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
index f0f19cb..8e46543 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
@@ -52,7 +52,8 @@
/** {@inheritDoc} */
@Override protected Control createContents(Composite parent) {
// generated by WindowBuilder
- Composite contents = contentsComposite(parent);
+ Composite contents = new Composite(parent, NONE);
+ contents.setLayout(new GridLayout(3, false));
grpResolutionOfImported = new Group(contents, SWT.NONE);
grpResolutionOfImported.setLayout(new GridLayout(1, false));
@@ -82,13 +83,7 @@
btnOneFolderOnly.setSelection(store.getBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
setDirectoryNames(store.getString(DIRECTORY_PATHS));
- boolean shouldEnablePathsOptions = true;
- if (isPropertyPage()) {
- boolean useProjectSettings = store.getBoolean(ENABLE_PROJECT_SETTINGS);
- activateProjectSettings(useProjectSettings);
- shouldEnablePathsOptions = shouldEnablePathsOptions & useProjectSettings;
- }
- enableProjectOptions(shouldEnablePathsOptions);
+ enableProjectOptions(true);
}
private void addEventListeners() {
@@ -124,13 +119,7 @@
btnOneFolderOnly.setSelection(store.getDefaultBoolean(FILES_IN_ONE_DIRECTORY_ONLY));
btnMultipleFolders.setSelection(store.getDefaultBoolean(FILES_IN_MULTIPLE_DIRECTORIES));
setDirectoryNames(store.getDefaultString(DIRECTORY_PATHS));
- boolean shouldEnablePathsOptions = true;
- if (isPropertyPage()) {
- boolean useProjectSettings = store.getDefaultBoolean(ENABLE_PROJECT_SETTINGS);
- activateProjectSettings(useProjectSettings);
- shouldEnablePathsOptions = shouldEnablePathsOptions & useProjectSettings;
- }
- enableProjectOptions(shouldEnablePathsOptions);
+ enableProjectOptions(true);
super.performDefaults();
}
@@ -148,7 +137,6 @@
/** {@inheritDoc} */
@Override protected void savePreferences() {
IPreferenceStore store = getPreferenceStore();
- if (isPropertyPage()) store.setValue(ENABLE_PROJECT_SETTINGS, areProjectSettingsActive());
store.setValue(FILES_IN_ONE_DIRECTORY_ONLY, btnOneFolderOnly.getSelection());
store.setValue(FILES_IN_MULTIPLE_DIRECTORIES, btnMultipleFolders.getSelection());
store.setValue(DIRECTORY_PATHS, directoryNames());
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
index d55c8df..dc49133 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferenceReader.java
@@ -8,8 +8,6 @@
*/
package com.google.eclipse.protobuf.ui.preferences.paths;
-import static com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferenceNames.ENABLE_PROJECT_SETTINGS;
-
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
@@ -27,8 +25,6 @@
public PathsPreferences readFromPrefereceStore(IProject project) {
IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
- boolean useProject = store.getBoolean(ENABLE_PROJECT_SETTINGS);
- if (!useProject) store = storeAccess.getWritablePreferenceStore();
return new PathsPreferences(store);
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
index ee257a2..831688c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategies.java
@@ -14,7 +14,8 @@
import java.util.Map;
import com.google.eclipse.protobuf.ui.preferences.paths.PathResolutionType;
-import com.google.inject.*;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
/**
* @author alruiz@google.com (Alex Ruiz)
@@ -26,7 +27,7 @@
@Inject FileResolverStrategies(Resources resources) {
strategies.put(SINGLE_DIRECTORY, new SingleDirectoryFileResolver(resources));
- strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver());
+ strategies.put(MULTIPLE_DIRECTORIES, new MultipleDirectoriesFileResolver(resources));
}
FileResolverStrategy strategyFor(PathResolutionType type) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
index 328fadb..15c6e5d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/FileResolverStrategy.java
@@ -8,7 +8,6 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
-import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.URI;
import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
@@ -21,5 +20,5 @@
String PREFIX = "platform:/resource";
String SEPARATOR = "/";
- String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project);
+ String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences);
}
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 913e46f..403bab5 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
@@ -55,7 +55,7 @@
private String resolveUri(String importUri, URI resourceUri) {
IProject project = resources.project(resourceUri);
PathsPreferences preferences = preferenceReader.readFromPrefereceStore(project);
- return resolver(preferences).resolveUri(importUri, resourceUri, preferences, project);
+ return resolver(preferences).resolveUri(importUri, resourceUri, preferences);
}
private FileResolverStrategy resolver(PathsPreferences preferences) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
index 2a39595..abb6877 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesFileResolver.java
@@ -8,8 +8,6 @@
*/
package com.google.eclipse.protobuf.ui.scoping;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
import org.eclipse.emf.common.util.URI;
import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
@@ -20,19 +18,25 @@
*/
class MultipleDirectoriesFileResolver implements FileResolverStrategy {
+ private final Resources resources;
+
+ MultipleDirectoriesFileResolver(Resources resources) {
+ this.resources = resources;
+ }
+
/** {@inheritDoc} */
- public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+ public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
for (DirectoryPath directoryPath : preferences.directoryPaths()) {
- String resolved = resolveUri(importUri, directoryPath.value(), project);
+ if (!directoryPath.isWorkspacePath()) continue; // TODO file system is not supported yet.
+ String resolved = resolveUriInWorkspace(importUri, directoryPath.value());
if (resolved != null) return resolved;
}
return null;
}
- private String resolveUri(String importUri, String directoryName, IProject project) {
- String path = directoryName + SEPARATOR + importUri;
- IResource findMember = project.findMember(path);
- boolean exists = (findMember != null) ? findMember.exists() : false;
- return (exists) ? PREFIX + project.getFullPath() + SEPARATOR + path : null;
+ private String resolveUriInWorkspace(String importUri, String directoryName) {
+ String path = PREFIX + directoryName + SEPARATOR + importUri;
+ boolean exists = resources.fileExists(URI.createURI(path));
+ return (exists) ? path : null;
}
}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
index bcee62c..b220689 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryFileResolver.java
@@ -13,7 +13,6 @@
import java.util.*;
-import org.eclipse.core.resources.IProject;
import org.eclipse.emf.common.util.URI;
import org.eclipse.xtext.util.Pair;
@@ -30,7 +29,7 @@
this.resources = resources;
}
- public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences, IProject project) {
+ public String resolveUri(String importUri, URI declaringResourceUri, PathsPreferences preferences) {
List<String> resourceUriSegments = removeFirstAndLast(declaringResourceUri.segmentsList());
Pair<String, List<String>> importUriPair = pair(importUri, createURI(importUri).segmentsList());
return resolveUri(importUriPair, resourceUriSegments);