Skip to content

Commit 6217d4f

Browse files
committed
Reuse GoExecutor in run configuration
Make 'Go application' run configuration work
1 parent 23cfe14 commit 6217d4f

File tree

7 files changed

+209
-141
lines changed

7 files changed

+209
-141
lines changed

src/com/goide/runconfig/GoRunConfigurationWithMain.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
public abstract class GoRunConfigurationWithMain<T extends GoRunningState> extends GoRunConfigurationBase<T> {
3939
private static final String FILE_PATH_NAME = "file_path";
4040

41-
@NotNull protected String myFilePath = "";
41+
@NotNull private String myFilePath = "";
4242

4343
public GoRunConfigurationWithMain(String name, GoModuleBasedConfiguration configurationModule, ConfigurationFactory factory) {
4444
super(name, configurationModule, factory);

src/com/goide/runconfig/GoRunningState.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,17 @@
1616

1717
package com.goide.runconfig;
1818

19-
import com.goide.GoConstants;
20-
import com.goide.sdk.GoSdkService;
21-
import com.goide.sdk.GoSdkUtil;
19+
import com.goide.util.GoExecutor;
2220
import com.intellij.execution.ExecutionException;
2321
import com.intellij.execution.configurations.CommandLineState;
24-
import com.intellij.execution.configurations.EncodingEnvironmentUtil;
2522
import com.intellij.execution.configurations.GeneralCommandLine;
2623
import com.intellij.execution.process.KillableColoredProcessHandler;
2724
import com.intellij.execution.process.ProcessHandler;
2825
import com.intellij.execution.runners.ExecutionEnvironment;
2926
import com.intellij.openapi.module.Module;
30-
import com.intellij.openapi.util.text.StringUtil;
31-
import com.intellij.openapi.vfs.CharsetToolkit;
3227
import org.jetbrains.annotations.NotNull;
3328

34-
public abstract class GoRunningState<T extends GoRunConfigurationBase> extends CommandLineState {
29+
public abstract class GoRunningState<T extends GoRunConfigurationBase<?>> extends CommandLineState {
3530
@NotNull protected final Module myModule;
3631
@NotNull protected final T myConfiguration;
3732

@@ -44,24 +39,19 @@ public GoRunningState(@NotNull ExecutionEnvironment env, @NotNull Module module,
4439
@NotNull
4540
@Override
4641
protected ProcessHandler startProcess() throws ExecutionException {
47-
String sdkHomePath = GoSdkService.getInstance(myConfiguration.getProject()).getSdkHomePath(myModule);
48-
if (StringUtil.isEmpty(sdkHomePath)) {
49-
throw new ExecutionException("Sdk is not set or Sdk home path is empty for module " + myModule.getName());
50-
}
51-
52-
GeneralCommandLine commandLine = getCommand(sdkHomePath);
53-
54-
commandLine.getParametersList().addParametersString(myConfiguration.getParams());
55-
commandLine.getEnvironment().put(GoConstants.GO_PATH, GoSdkUtil.retrieveGoPath(myModule));
56-
//noinspection unchecked
57-
commandLine.getEnvironment().putAll(myConfiguration.getCustomEnvironment());
58-
commandLine.setPassParentEnvironment(myConfiguration.isPassParentEnvironment());
59-
commandLine.withCharset(CharsetToolkit.UTF8_CHARSET);
60-
EncodingEnvironmentUtil.setLocaleEnvironmentIfMac(commandLine);
61-
42+
GeneralCommandLine commandLine = createExecutor().createCommandLine();
6243
return new KillableColoredProcessHandler(commandLine.createProcess(), commandLine.getCommandLineString());
6344
}
6445

6546
@NotNull
66-
protected abstract GeneralCommandLine getCommand(String sdkHomePath) throws ExecutionException;
47+
private GoExecutor createExecutor() throws ExecutionException {
48+
return patchExecutor(GoExecutor.in(myModule).withWorkDirectory(myConfiguration.getWorkingDirectory()))
49+
.withExtraEnvironment(myConfiguration.getCustomEnvironment())
50+
.withPassParentEnvironment(myConfiguration.isPassParentEnvironment())
51+
.addParameterString(myConfiguration.getParams());
52+
}
53+
54+
protected GoExecutor patchExecutor(@NotNull GoExecutor executor) throws ExecutionException {
55+
return executor;
56+
}
6757
}

src/com/goide/runconfig/application/GoApplicationRunningState.java

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,41 +16,63 @@
1616

1717
package com.goide.runconfig.application;
1818

19-
import com.goide.GoEnvironmentUtil;
2019
import com.goide.runconfig.GoRunningState;
20+
import com.goide.util.GoExecutor;
2121
import com.intellij.execution.ExecutionException;
22-
import com.intellij.execution.configurations.GeneralCommandLine;
23-
import com.intellij.execution.filters.TextConsoleBuilder;
2422
import com.intellij.execution.filters.TextConsoleBuilderFactory;
23+
import com.intellij.execution.process.ProcessHandler;
24+
import com.intellij.execution.process.ProcessOutput;
2525
import com.intellij.execution.runners.ExecutionEnvironment;
26-
import com.intellij.openapi.compiler.CompilerPaths;
2726
import com.intellij.openapi.module.Module;
2827
import com.intellij.openapi.util.io.FileUtil;
29-
import com.intellij.openapi.util.text.StringUtil;
30-
import com.intellij.util.PathUtil;
3128
import org.jetbrains.annotations.NotNull;
3229

30+
import java.io.File;
31+
import java.io.IOException;
32+
3333
public class GoApplicationRunningState extends GoRunningState<GoApplicationConfiguration> {
34-
public GoApplicationRunningState(@NotNull ExecutionEnvironment env, @NotNull Module module,
34+
private File myTempFile;
35+
36+
public GoApplicationRunningState(@NotNull ExecutionEnvironment env, @NotNull Module module,
3537
@NotNull GoApplicationConfiguration configuration) {
3638
super(env, module, configuration);
3739
}
3840

3941
@NotNull
4042
@Override
41-
protected GeneralCommandLine getCommand(@NotNull String sdkHomePath) throws ExecutionException {
42-
GeneralCommandLine commandLine = new GeneralCommandLine();
43-
String outputDirectory = CompilerPaths.getModuleOutputPath(myModule, false);
44-
if (StringUtil.isEmpty(outputDirectory)) {
45-
throw new ExecutionException("Output directory is not set for module " + myModule.getName());
43+
protected ProcessHandler startProcess() throws ExecutionException {
44+
setConsoleBuilder(TextConsoleBuilderFactory.getInstance().createBuilder(myModule.getProject()));
45+
try {
46+
myTempFile = FileUtil.createTempFile(myConfiguration.getName(), "go", true);
47+
//noinspection ResultOfMethodCallIgnored
48+
myTempFile.setExecutable(true);
49+
}
50+
catch (IOException e) {
51+
throw new ExecutionException("Can't create temporary output file", e);
52+
}
53+
try {
54+
ProcessOutput processOutput = new ProcessOutput();
55+
boolean success = GoExecutor.in(myModule)
56+
.addParameters("build", "-o", myTempFile.getAbsolutePath(), myConfiguration.getFilePath())
57+
.withProcessOutput(processOutput)
58+
.showOutputOnError()
59+
.execute();
60+
61+
if (!success) {
62+
throw new ExecutionException("Build failure. `go build` is finished with exit code " + processOutput.getExitCode());
63+
}
64+
65+
return super.startProcess();
4666
}
47-
48-
String modulePath = PathUtil.getParentPath(myModule.getModuleFilePath());
49-
String executable = FileUtil.toSystemDependentName(GoEnvironmentUtil.getExecutableResultForModule(modulePath, outputDirectory));
50-
commandLine.setExePath(executable);
51-
commandLine.withWorkDirectory(PathUtil.getParentPath(executable));
52-
TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(myModule.getProject());
53-
setConsoleBuilder(consoleBuilder);
54-
return commandLine;
67+
finally {
68+
//noinspection ResultOfMethodCallIgnored
69+
myTempFile.delete();
70+
}
71+
}
72+
73+
74+
@Override
75+
protected GoExecutor patchExecutor(@NotNull GoExecutor executor) throws ExecutionException {
76+
return executor.withExePath(myTempFile.getAbsolutePath());
5577
}
5678
}

src/com/goide/runconfig/file/GoRunFileRunningState.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,11 @@
1616

1717
package com.goide.runconfig.file;
1818

19-
import com.goide.GoEnvironmentUtil;
2019
import com.goide.runconfig.GoRunningState;
20+
import com.goide.util.GoExecutor;
2121
import com.intellij.execution.ExecutionException;
22-
import com.intellij.execution.configurations.GeneralCommandLine;
23-
import com.intellij.execution.configurations.ParametersList;
24-
import com.intellij.execution.filters.TextConsoleBuilder;
2522
import com.intellij.execution.filters.TextConsoleBuilderFactory;
23+
import com.intellij.execution.process.ProcessHandler;
2624
import com.intellij.execution.runners.ExecutionEnvironment;
2725
import com.intellij.openapi.module.Module;
2826
import org.jetbrains.annotations.NotNull;
@@ -34,17 +32,13 @@ public GoRunFileRunningState(@NotNull ExecutionEnvironment env, @NotNull Module
3432

3533
@NotNull
3634
@Override
37-
protected GeneralCommandLine getCommand(String sdkHomePath) throws ExecutionException {
38-
GeneralCommandLine commandLine = new GeneralCommandLine();
39-
String executable = GoEnvironmentUtil.getExecutableForSdk(sdkHomePath).getAbsolutePath();
40-
commandLine.setExePath(executable);
41-
ParametersList list = commandLine.getParametersList();
42-
list.add("run");
43-
String filePath = myConfiguration.getFilePath();
44-
list.addParametersString(filePath);
45-
commandLine.withWorkDirectory(myConfiguration.getWorkingDirectory());
46-
TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(myModule.getProject());
47-
setConsoleBuilder(consoleBuilder);
48-
return commandLine;
35+
protected ProcessHandler startProcess() throws ExecutionException {
36+
setConsoleBuilder(TextConsoleBuilderFactory.getInstance().createBuilder(myModule.getProject()));
37+
return super.startProcess();
38+
}
39+
40+
@Override
41+
protected GoExecutor patchExecutor(@NotNull GoExecutor executor) throws ExecutionException {
42+
return executor.addParameters("run", myConfiguration.getFilePath());
4943
}
5044
}

src/com/goide/runconfig/testing/GoTestRunningState.java

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616

1717
package com.goide.runconfig.testing;
1818

19-
import com.goide.GoEnvironmentUtil;
2019
import com.goide.psi.GoFile;
2120
import com.goide.psi.GoFunctionDeclaration;
2221
import com.goide.runconfig.GoRunningState;
22+
import com.goide.util.GoExecutor;
2323
import com.intellij.execution.DefaultExecutionResult;
2424
import com.intellij.execution.ExecutionException;
2525
import com.intellij.execution.ExecutionResult;
2626
import com.intellij.execution.Executor;
27-
import com.intellij.execution.configurations.GeneralCommandLine;
2827
import com.intellij.execution.filters.TextConsoleBuilder;
2928
import com.intellij.execution.filters.TextConsoleBuilderFactory;
3029
import com.intellij.execution.process.ProcessHandler;
@@ -67,34 +66,24 @@ public ExecutionResult execute(@NotNull Executor executor, @NotNull ProgramRunne
6766
return executionResult;
6867
}
6968

70-
@NotNull
7169
@Override
72-
protected GeneralCommandLine getCommand(String sdkHomePath) throws ExecutionException {
73-
String executable = GoEnvironmentUtil.getExecutableForSdk(sdkHomePath).getAbsolutePath();
74-
GeneralCommandLine runTests = new GeneralCommandLine();
75-
runTests.setExePath(executable);
76-
runTests.addParameters("test", "-v");
77-
fillCommandLineWithParameters(runTests);
78-
return runTests;
79-
}
80-
81-
private void fillCommandLineWithParameters(@NotNull GeneralCommandLine commandLine) throws ExecutionException {
82-
commandLine.withWorkDirectory(myConfiguration.getWorkingDirectory());
70+
protected GoExecutor patchExecutor(@NotNull GoExecutor executor) throws ExecutionException {
71+
executor.addParameters("test", "-v");
8372
switch (myConfiguration.getKind()) {
8473
case DIRECTORY:
8574
String relativePath = FileUtil.getRelativePath(myConfiguration.getWorkingDirectory(),
8675
myConfiguration.getDirectoryPath(),
8776
File.separatorChar);
8877
if (relativePath != null) {
89-
commandLine.addParameter(relativePath + "/...");
78+
executor.addParameters(relativePath + "/...");
9079
}
9180
else {
92-
commandLine.addParameter("./...");
93-
commandLine.withWorkDirectory(myConfiguration.getDirectoryPath());
81+
executor.addParameters("./...");
82+
executor.withWorkDirectory(myConfiguration.getDirectoryPath());
9483
}
9584
break;
9685
case PACKAGE:
97-
commandLine.addParameter(myConfiguration.getPackage());
86+
executor.addParameters(myConfiguration.getPackage());
9887
break;
9988
case FILE:
10089
String filePath = myConfiguration.getFilePath();
@@ -111,22 +100,23 @@ private void fillCommandLineWithParameters(@NotNull GeneralCommandLine commandLi
111100
if (StringUtil.isEmpty(importPath)) {
112101
throw new ExecutionException("Cannot find import path for " + filePath);
113102
}
114-
115-
commandLine.addParameter(importPath);
103+
104+
executor.addParameters(importPath);
116105
Collection<String> testNames = ContainerUtil.newLinkedHashSet();
117106
for (GoFunctionDeclaration function : ((GoFile)file).getFunctions()) {
118107
ContainerUtil.addIfNotNull(testNames, GoTestFinder.getTestFunctionName(function));
119108
}
120-
addFilterParameter(commandLine, "^" + StringUtil.join(testNames, "|") + "$");
109+
addFilterParameter(executor, "^" + StringUtil.join(testNames, "|") + "$");
121110
break;
122111
}
123112
String pattern = myConfiguration.getPattern();
124-
addFilterParameter(commandLine, pattern);
113+
addFilterParameter(executor, pattern);
114+
return executor;
125115
}
126116

127-
private static void addFilterParameter(@NotNull GeneralCommandLine commandLine, String pattern) {
117+
private static void addFilterParameter(@NotNull GoExecutor executor, String pattern) {
128118
if (StringUtil.isNotEmpty(pattern)) {
129-
commandLine.addParameters("-run", pattern);
119+
executor.addParameters("-run", pattern);
130120
}
131121
}
132122
}

src/com/goide/sdk/GoSdkUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ private static String suggestSdkDirectoryPathFromEnv() {
242242
@Nullable
243243
public static String retrieveGoVersion(@NotNull final String sdkPath) {
244244
ProcessOutput output = new ProcessOutput();
245-
if (new GoExecutor().withGoRoot(sdkPath).withProcessOutput(output).execute(false, "version")) {
245+
if (GoExecutor.empty().withGoRoot(sdkPath).withProcessOutput(output).addParameters("version").executeSilent()) {
246246
Matcher matcher = Pattern.compile(GO_VERSION_PATTERN).matcher(output.getStdout());
247247
if (matcher.find()) {
248248
return matcher.group(1);

0 commit comments

Comments
 (0)