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>