Bug 574940: refactor Code completion
adapt to new api
Change-Id: Ieb32f47f38da76d1c78e24f1b56640e033197aba
diff --git a/plugins/org.eclipse.ease.modules.platform/plugin.xml b/plugins/org.eclipse.ease.modules.platform/plugin.xml
index 5d50d58..a0f48dd 100644
--- a/plugins/org.eclipse.ease.modules.platform/plugin.xml
+++ b/plugins/org.eclipse.ease.modules.platform/plugin.xml
@@ -58,7 +58,7 @@
class="org.eclipse.ease.modules.platform.completion.ResourcesCompletionProvider">
</codeCompletionProvider>
<codeCompletionProvider
- class="org.eclipse.ease.modules.platform.debug.LaunchModuleCompletionProvider">
+ class="org.eclipse.ease.modules.platform.completion.LaunchModuleCompletionProvider">
</codeCompletionProvider>
</extension>
<extension
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
similarity index 75%
rename from plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java
rename to plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
index 176017b..84e038d 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModuleCompletionProvider.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProvider.java
@@ -10,7 +10,7 @@
* Contributors:
* Jonah Graham - initial API and implementation
*******************************************************************************/
-package org.eclipse.ease.modules.platform.debug;
+package org.eclipse.ease.modules.platform.completion;
import java.util.ArrayList;
import java.util.Collection;
@@ -24,32 +24,33 @@
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.ILaunchGroup;
import org.eclipse.ease.ICompletionContext;
-import org.eclipse.ease.ICompletionContext.Type;
import org.eclipse.ease.Logger;
import org.eclipse.ease.modules.platform.PluginConstants;
-import org.eclipse.ease.ui.completion.AbstractCompletionProvider;
+import org.eclipse.ease.modules.platform.debug.LaunchModule;
import org.eclipse.ease.ui.completion.ScriptCompletionProposal;
+import org.eclipse.ease.ui.completion.provider.AbstractCompletionProvider;
public class LaunchModuleCompletionProvider extends AbstractCompletionProvider {
@Override
public boolean isActive(final ICompletionContext context) {
- if (context.getType() == Type.STRING_LITERAL) {
- final String caller = context.getCaller();
- final int param = context.getParameterOffset();
- if (caller.endsWith("launch") || caller.endsWith("launchUI")) {
- return (param == 0) || (param == 1);
- }
- if (caller.endsWith("getLaunchConfiguration")) {
- return param == 0;
- }
- }
+ if ((isStringParameter(context)) && (context.getLoadedModules().contains(getModuleDefinition(LaunchModule.MODULE_ID))))
+ return isLaunchConfigurationParameter(context) || isLaunchTypeParameter(context);
+
return false;
}
+ private boolean isLaunchConfigurationParameter(ICompletionContext context) {
+ return isMethodParameter(context, "launch", 0) || isMethodParameter(context, "launchUI", 0) || isMethodParameter(context, "getLaunchConfiguration", 0);
+ }
+
+ private boolean isLaunchTypeParameter(ICompletionContext context) {
+ return isMethodParameter(context, "launch", 1) || isMethodParameter(context, "launchUI", 1);
+ }
+
@Override
protected void prepareProposals(ICompletionContext context) {
- if (context.getParameterOffset() == 0) {
+ if (isLaunchConfigurationParameter(getContext())) {
try {
final ILaunchConfiguration[] configurations = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
@@ -64,7 +65,7 @@
Logger.warning(PluginConstants.PLUGIN_ID, "Code Completion: could not read launch configurations", e);
}
- } else {
+ } else if (isLaunchTypeParameter(getContext())) {
// TODO: Make this parameter dependent on the selected launch config
// to only populate the relevant modes
final Collection<ScriptCompletionProposal> proposals = new ArrayList<>();
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
index 5cd9b91..59c3f54 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProvider.java
@@ -13,54 +13,43 @@
package org.eclipse.ease.modules.platform.completion;
import org.eclipse.ease.ICompletionContext;
-import org.eclipse.ease.modules.ModuleDefinition;
import org.eclipse.ease.modules.platform.ResourcesModule;
import org.eclipse.ease.modules.platform.ScriptingModule;
import org.eclipse.ease.modules.platform.UIModule;
-import org.eclipse.ease.service.IScriptService;
import org.eclipse.ease.ui.completion.provider.AbstractFileLocationCompletionProvider;
-import org.eclipse.ui.PlatformUI;
public class ResourcesCompletionProvider extends AbstractFileLocationCompletionProvider {
@Override
public boolean isActive(final ICompletionContext context) {
- if (super.isActive(context)) {
+ if (super.isActive(context))
+ return isMethodFromResources(context) || isMethodFromScripting(context) || isMethodFromUi(context);
- // Resources module
- if (context.getLoadedModules().contains(getModule(ResourcesModule.MODULE_ID))) {
+ return false;
+ }
- // simple methods
- if (context.getCaller().endsWith("copyFile") || context.getCaller().endsWith("createFile") || context.getCaller().endsWith("createFolder")
- || context.getCaller().endsWith("deleteFile") || context.getCaller().endsWith("deleteFolder")
- || context.getCaller().endsWith("fileExists"))
- return true;
+ private boolean isMethodFromUi(final ICompletionContext context) {
+ if (context.getLoadedModules().contains(getModuleDefinition(UIModule.MODULE_ID)))
+ return isMethodParameter(context, "showEditor", 0) || isMethodParameter(context, "openEditor", 0);
- if ((context.getCaller().endsWith("findFiles")) && (context.getParameterOffset() == 1))
- return true;
- if ((context.getCaller().endsWith("getFile")) && (context.getParameterOffset() == 0))
- return true;
- if ((context.getCaller().endsWith("openFile")) && (context.getParameterOffset() == 0))
- return true;
- if ((context.getCaller().endsWith("readFile")) && (context.getParameterOffset() == 0))
- return true;
- if ((context.getCaller().endsWith("writeFile")) && (context.getParameterOffset() == 0))
- return true;
- if ((context.getCaller().endsWith("createProblemMarker")) && (context.getParameterOffset() == 1))
- return true;
- }
+ return false;
+ }
- // Scripting module
- if (context.getLoadedModules().contains(getModule(ScriptingModule.MODULE_ID))) {
- if ((context.getCaller().endsWith("fork")) && (context.getParameterOffset() == 0))
- return true;
- }
+ private boolean isMethodFromScripting(final ICompletionContext context) {
+ if (context.getLoadedModules().contains(getModuleDefinition(ScriptingModule.MODULE_ID)))
+ return isMethodParameter(context, "fork", 0);
- // UI module
- if (context.getLoadedModules().contains(getModule(UIModule.MODULE_ID))) {
- if ((context.getCaller().endsWith("showEditor")) || (context.getCaller().endsWith("openEditor")))
- return true;
- }
+ return false;
+ }
+
+ private boolean isMethodFromResources(final ICompletionContext context) {
+ if (context.getLoadedModules().contains(getModuleDefinition(ResourcesModule.MODULE_ID))) {
+ return isMethodParameter(context, "copyFile", 0) || isMethodParameter(context, "copyFile", 1) || isMethodParameter(context, "createFile", 0)
+ || isMethodParameter(context, "createFolder", 0) || isMethodParameter(context, "deleteFile", 0)
+ || isMethodParameter(context, "deleteFolder", 0) || isMethodParameter(context, "fileExists", 0)
+ || isMethodParameter(context, "findFiles", 1) || isMethodParameter(context, "getFile", 0) || isMethodParameter(context, "openFile", 0)
+ || isMethodParameter(context, "readFile", 0) || isMethodParameter(context, "writeFile", 0)
+ || isMethodParameter(context, "createProblemMarker", 1);
}
return false;
@@ -68,19 +57,13 @@
@Override
protected boolean showCandidate(final Object candidate) {
- final String caller = getContext().getCaller();
-
- if ((caller.endsWith("showEditor")) || (caller.endsWith("openEditor")))
+ if (isMethodFromUi(getContext()))
return !isFileSystemResource(candidate);
- if ((caller.endsWith("createFile")) || (caller.endsWith("createFolder")) || (caller.endsWith("deleteFolder")) || (caller.endsWith("findFiles")))
+ if (isMethodParameter(getContext(), "createFile", 0) || isMethodParameter(getContext(), "createFolder", 0)
+ || isMethodParameter(getContext(), "deleteFolder", 0) || isMethodParameter(getContext(), "findFiles", 1))
return !isFile(candidate);
return super.showCandidate(candidate);
}
-
- private static ModuleDefinition getModule(final String identifier) {
- final IScriptService scriptService = PlatformUI.getWorkbench().getService(IScriptService.class);
- return scriptService.getModuleDefinition(identifier);
- }
}
\ No newline at end of file
diff --git a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
index a0b9f09..a12f634 100644
--- a/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
+++ b/plugins/org.eclipse.ease.modules.platform/src/org/eclipse/ease/modules/platform/debug/LaunchModule.java
@@ -41,7 +41,8 @@
* </p>
*/
public class LaunchModule extends AbstractScriptModule {
- public static final String MODULE_NAME = "/System/Launch";
+
+ public static final String MODULE_ID = "/System/Launch";
/**
* Obtain the platform launch manager. This allows access to the Eclipse debug core launch manager, allowing control over all non-UI aspects of launches.
diff --git a/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF b/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
index f42c65d..eccd694 100644
--- a/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.ease.modules.platform.test/META-INF/MANIFEST.MF
@@ -8,5 +8,6 @@
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Require-Bundle: org.junit.jupiter.api,
org.eclipse.ease.lang.javascript.rhino,
- org.mockito
+ org.mockito,
+ org.junit.jupiter.params
Automatic-Module-Name: org.eclipse.ease.modules.platform.test
diff --git a/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java
new file mode 100644
index 0000000..61c596b
--- /dev/null
+++ b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/LaunchModuleCompletionProviderTest.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License_Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.completion;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.ease.ICompletionContext;
+import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.modules.IEnvironment;
+import org.eclipse.ease.modules.platform.debug.LaunchModule;
+import org.eclipse.ease.service.EngineDescription;
+import org.eclipse.ease.service.ScriptType;
+import org.eclipse.ease.ui.completion.BasicContext;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class LaunchModuleCompletionProviderTest {
+ @ParameterizedTest(name = "for ''{0}''")
+ @DisplayName("isActive() = true")
+ @ValueSource(strings = { "launch(\"", "launchUI(\"", "getLaunchConfiguration(\"", "launch(1,\"", "launchUI(1,\"" })
+ public void isActive_equals_true(String input) {
+ assertTrue(new LaunchModuleCompletionProvider().isActive(createContext(input)));
+ }
+
+ @ParameterizedTest(name = "for ''{0}''")
+ @DisplayName("isActive() = false")
+ @ValueSource(strings = { "", "getLaunchConfiguration(1,\"" })
+ public void isActive_equals_false(String input) {
+ assertFalse(new LaunchModuleCompletionProvider().isActive(createContext(input)));
+ }
+
+ private ICompletionContext createContext(String input) {
+ return new BasicContext(createEngine(), input, input.length());
+ }
+
+ private IScriptEngine createEngine() {
+ final EngineDescription engineDescription = mock(EngineDescription.class);
+ when(engineDescription.getSupportedScriptTypes()).thenReturn(Arrays.asList(new ScriptType(null)));
+
+ final Map<String, Object> variables = new HashMap<>();
+ variables.put(IEnvironment.MODULE_PREFIX + "Launch", new LaunchModule());
+
+ final IScriptEngine engine = mock(IScriptEngine.class);
+ when(engine.getDescription()).thenReturn(engineDescription);
+ when(engine.getVariables()).thenReturn(variables);
+
+ return engine;
+ }
+}
diff --git a/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java
new file mode 100644
index 0000000..181fd49
--- /dev/null
+++ b/tests/org.eclipse.ease.modules.platform.test/src/org/eclipse/ease/modules/platform/completion/ResourcesCompletionProviderTest.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Christian Pontesegger and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License_Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Christian Pontesegger - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ease.modules.platform.completion;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.ease.ICompletionContext;
+import org.eclipse.ease.IScriptEngine;
+import org.eclipse.ease.modules.IEnvironment;
+import org.eclipse.ease.modules.platform.ResourcesModule;
+import org.eclipse.ease.modules.platform.ScriptingModule;
+import org.eclipse.ease.modules.platform.UIModule;
+import org.eclipse.ease.service.EngineDescription;
+import org.eclipse.ease.service.ScriptType;
+import org.eclipse.ease.ui.completion.BasicContext;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+public class ResourcesCompletionProviderTest {
+ @ParameterizedTest(name = "for ''{0}''")
+ @DisplayName("isActive() = true")
+ @ValueSource(strings = { "copyFile(\"", "copyFile(1,\"", "createFile(\"", "createFolder(\"", "deleteFile(\"", "deleteFolder(\"", "fileExists(\"",
+ "findFiles(1,\"", "getFile(\"", "openFile(\"", "readFile(\"", "writeFile(\"", "createProblemMarker(1,\"", "fork(\"", "showEditor(\"",
+ "openEditor(\"" })
+ public void isActive_equals_true(String input) {
+ assertTrue(new ResourcesCompletionProvider().isActive(createContext(input)));
+ }
+
+ @ParameterizedTest(name = "for ''{0}''")
+ @DisplayName("isActive() = false")
+ @ValueSource(strings = { "", "findFiles(\"" })
+ public void isActive_equals_false(String input) {
+ assertFalse(new ResourcesCompletionProvider().isActive(createContext(input)));
+ }
+
+ private ICompletionContext createContext(String input) {
+ return new BasicContext(createEngine(), input, input.length());
+ }
+
+ private IScriptEngine createEngine() {
+ final EngineDescription engineDescription = mock(EngineDescription.class);
+ when(engineDescription.getSupportedScriptTypes()).thenReturn(Arrays.asList(new ScriptType(null)));
+
+ final Map<String, Object> variables = new HashMap<>();
+ variables.put(IEnvironment.MODULE_PREFIX + "Resources", new ResourcesModule());
+ variables.put(IEnvironment.MODULE_PREFIX + "Scripting", new ScriptingModule());
+ variables.put(IEnvironment.MODULE_PREFIX + "UI", new UIModule());
+
+ final IScriptEngine engine = mock(IScriptEngine.class);
+ when(engine.getDescription()).thenReturn(engineDescription);
+ when(engine.getVariables()).thenReturn(variables);
+
+ return engine;
+ }
+}
diff --git a/tests/pom.xml b/tests/pom.xml
index a9e1d40..8ea53ca 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -24,7 +24,16 @@
<artifactId>tycho-surefire-plugin</artifactId>
<version>${tycho.version}</version>
<configuration>
- <providerHint>junit5</providerHint>
+ <providerHint>junit57</providerHint>
+ <trimStackTrace>false</trimStackTrace>
+
+ <dependencies>
+ <!-- avoid CNFE in Surefire when looking for JUnitPlatformProvider -->
+ <dependency>
+ <artifactId>org.junit</artifactId>
+ <type>eclipse-plugin</type>
+ </dependency>
+ </dependencies>
</configuration>
</plugin>