Skip to content
This repository was archived by the owner on Mar 25, 2019. It is now read-only.

Commit 841a6ec

Browse files
elmotIlia Motornyi
authored and
Ilia Motornyi
committed
Version advance, getting rid of deprecated API
1 parent f4a9470 commit 841a6ec

File tree

10 files changed

+79
-51
lines changed

10 files changed

+79
-51
lines changed

.idea/misc.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

resources/META-INF/plugin.xml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<idea-plugin>
22
<id>xyz.elmot.clion.armsupport.prj</id>
33
<name>OpenOCD + STM32CubeMX support for ARM embedded development</name>
4-
<version>1.1.alpha7</version>
4+
<version>1.2.alpha1</version>
55
<vendor email="me@elmot.xyz" url="http://elmot.xyz">Elmot</vendor>
66

77
<description><![CDATA[
@@ -37,13 +37,16 @@ The plugin is free, but if you like it, you may support my work with a PayPal do
3737

3838
<change-notes><![CDATA[
3939
<ul>
40-
<li>Improved CLion 2018.2 support</li>
40+
<li>CLion 2018.3 EAP support</li>
41+
<li>Memory statistics output</li>
42+
<li>C++ support in CMakeLists template</li>
43+
<li>Small fixes and improvements</li>
4144
</ul>
4245
]]>
4346
</change-notes>
4447

4548
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
46-
<idea-version since-build="182.3684" until-build="182.*"/>
49+
<idea-version since-build="182.9999" until-build="183.*"/>
4750

4851
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
4952
on how to target different products -->

src/xyz/elmot/clion/cubemx/ConvertProject.java

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,29 @@
33
import com.intellij.execution.RunManager;
44
import com.intellij.execution.RunnerAndConfigurationSettings;
55
import com.intellij.execution.configurations.ConfigurationFactory;
6+
import com.intellij.execution.configurations.ConfigurationTypeUtil;
67
import com.intellij.openapi.actionSystem.AnAction;
78
import com.intellij.openapi.actionSystem.AnActionEvent;
89
import com.intellij.openapi.application.Application;
910
import com.intellij.openapi.application.ApplicationManager;
1011
import com.intellij.openapi.project.Project;
12+
import com.intellij.openapi.project.ProjectUtil;
1113
import com.intellij.openapi.ui.MessageType;
1214
import com.intellij.openapi.ui.Messages;
1315
import com.intellij.openapi.util.ThrowableComputable;
1416
import com.intellij.openapi.util.io.FileUtil;
1517
import com.intellij.openapi.vfs.VfsUtil;
1618
import com.intellij.openapi.vfs.VirtualFile;
1719
import com.intellij.util.exception.RootRuntimeException;
20+
import com.jetbrains.cidr.cpp.cmake.model.CMakeTarget;
1821
import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace;
22+
import com.jetbrains.cidr.cpp.execution.CMakeBuildConfigurationHelper;
23+
import com.jetbrains.cidr.cpp.execution.CMakeRunConfigurationType;
24+
import com.jetbrains.cidr.execution.BuildTargetAndConfigurationData;
25+
import com.jetbrains.cidr.execution.BuildTargetData;
26+
import com.jetbrains.cidr.execution.ExecutableData;
1927
import org.apache.commons.lang.text.StrSubstitutor;
28+
import org.intellij.lang.annotations.MagicConstant;
2029
import org.jdom.Attribute;
2130
import org.jdom.Element;
2231
import org.jdom.JDOMException;
@@ -84,22 +93,23 @@ public static void updateProject(Project project) {
8493
application.runWriteAction(() -> {
8594
String fileName = null;
8695
try {
96+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(project);
97+
if (projectDir == null) return;
8798
fileName = ".gitignore";
8899
writeProjectFile(project,
89100
() -> FileUtil.loadTextAndClose(ConvertProject.class.getResourceAsStream("tmpl_gitignore.txt")),
90101
fileName, projectData, STRATEGY.CREATEONLY);
91102

92103
fileName = "CMakeLists_template.txt";
93-
VirtualFile cmakeTemplate = project.getBaseDir().findOrCreateChildData(project, fileName);
104+
VirtualFile cmakeTemplate = projectDir.findOrCreateChildData(project, fileName);
94105
String templateText;
95106
if (cmakeTemplate.getLength() <= 0) {
96107
templateText = loadCmakeTemplateFromResources();
97108
VfsUtil.saveText(cmakeTemplate, templateText);
98109
} else {
99110
templateText = VfsUtil.loadText(cmakeTemplate);
100111
}
101-
fileName = "CMakeLists.txt";
102-
writeProjectFile(project, () -> templateText, fileName, projectData, STRATEGY.OVERWRITE);
112+
writeProjectFile(project, () -> templateText, "CMakeLists.txt", projectData, STRATEGY.OVERWRITE);
103113
} catch (IOException e) {
104114
String msg = String.format("%s:\n %s ", fileName, e.getLocalizedMessage());
105115
application.invokeLater(() ->
@@ -110,7 +120,9 @@ public static void updateProject(Project project) {
110120

111121
CMakeWorkspace cMakeWorkspace = CMakeWorkspace.getInstance(project);
112122
if (cMakeWorkspace.getCMakeDependencyFiles().isEmpty()) {
113-
cMakeWorkspace.selectProjectDir(VfsUtil.virtualToIoFile(project.getBaseDir()));
123+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(project);
124+
if (projectDir != null)
125+
cMakeWorkspace.selectProjectDir(VfsUtil.virtualToIoFile(projectDir));
114126
}
115127
cMakeWorkspace.scheduleClearGeneratedFilesAndReload();
116128
ApplicationManager.getApplication().executeOnPooledThread(() ->
@@ -131,6 +143,7 @@ public static void updateProject(Project project) {
131143
);
132144
}
133145

146+
@SuppressWarnings("SpellCheckingInspection")
134147
@Nullable
135148
public static ProjectData loadProjectData(Project project) {
136149
Element cProject = detectAndLoadFile(project, CPROJECT_FILE_NAME);
@@ -161,9 +174,11 @@ private static String loadCmakeTemplateFromResources() throws IOException {
161174
private static void writeProjectFile(Project project, ThrowableComputable<String, IOException> template,
162175
String fileName, ProjectData projectData, STRATEGY strategy)
163176
throws IOException {
164-
VirtualFile projectFile = project.getBaseDir().findChild(fileName);
177+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(project);
178+
if (projectDir == null) return;
179+
VirtualFile projectFile = projectDir.findChild(fileName);
165180
if (projectFile == null) {
166-
projectFile = project.getBaseDir().createChildData(project, fileName);
181+
projectFile = projectDir.createChildData(project, fileName);
167182
} else if (strategy == STRATEGY.CREATEONLY) {
168183
return;
169184
}
@@ -174,14 +189,25 @@ private static void writeProjectFile(Project project, ThrowableComputable<String
174189
private static void modifyCMakeConfigs(Project project, ProjectData projectData) {
175190
RunManager runManager = RunManager.getInstance(project);
176191
@SuppressWarnings("ConstantConditions")
177-
ConfigurationFactory factory = runManager.getConfigurationType(OpenOcdConfigurationType.TYPE_ID)
178-
.getConfigurationFactories()[0];
192+
ConfigurationFactory factory =
193+
ConfigurationTypeUtil.findConfigurationType(OpenOcdConfigurationType.TYPE_ID).getConfigurationFactories()[0];
179194
String name = "OCD " + projectData.getProjectName();
180195
if (runManager.findConfigurationByTypeAndName(OpenOcdConfigurationType.TYPE_ID, name) == null) {
181-
RunnerAndConfigurationSettings newRunConfig = runManager.createRunConfiguration(name, factory);
182-
newRunConfig.setSingleton(true);
196+
RunnerAndConfigurationSettings newRunConfig = runManager.createConfiguration(name, factory);
197+
newRunConfig.setShared(true);
183198
OpenOcdConfiguration configuration = (OpenOcdConfiguration) newRunConfig.getConfiguration();
184-
configuration.setupDefaultTargetAndExecutable();
199+
configuration.setAllowRunningInParallel(false);
200+
final CMakeBuildConfigurationHelper helper = CMakeRunConfigurationType.getHelper(project);
201+
CMakeTarget target = helper.getDefaultTarget();
202+
if (target != null && !target.isExecutable()) {
203+
target = helper.getTargets().stream().filter(CMakeTarget::isExecutable).findFirst().orElse(null);
204+
}
205+
if (target != null) {
206+
final BuildTargetData buildTargetData = new BuildTargetData(project.getName(), target.getName());
207+
final BuildTargetAndConfigurationData data = new BuildTargetAndConfigurationData(buildTargetData, null);
208+
configuration.setTargetAndConfigurationData(data);
209+
configuration.setExecutableData(new ExecutableData(buildTargetData));
210+
}
185211
ApplicationManager.getApplication().invokeLater(() -> {
186212
configuration.setBoardConfigFile(SelectBoardDialog.selectBoardByPriority(projectData, project));
187213
ApplicationManager.getApplication().runWriteAction(() ->
@@ -223,14 +249,15 @@ private static String loadDefines(Context context) {
223249
.collect(Collectors.joining(" "));
224250
}
225251

226-
private static String fetchValueBySuperClass(Context context, String key) {
252+
private static String fetchValueBySuperClass(Context context, @MagicConstant String key) {
227253
XPathExpression<Attribute> xPath = XPathFactory.instance()
228254
.compile(".//*[@superClass='" + key + "']/@value", ATTRIBUTES_ONLY);
229255
return xPath.evaluateFirst(context.cProjectElement).getValue();
230256
}
231257

232258
private static Element detectAndLoadFile(Project project, String fileName) {
233-
VirtualFile child = project.getBaseDir().findChild(fileName);
259+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(project);
260+
VirtualFile child = projectDir == null ? null : projectDir.findChild(fileName);
234261
if (child == null || !child.exists() || child.isDirectory()) {
235262
Messages.showErrorDialog(
236263
String.format("File %s is not found in the project directory %s", fileName, project.getBasePath()),
@@ -249,7 +276,7 @@ private static Element detectAndLoadFile(Project project, String fileName) {
249276
}
250277

251278
@Override
252-
public void actionPerformed(AnActionEvent event) {
279+
public void actionPerformed(@NotNull AnActionEvent event) {
253280

254281
Project project = getEventProject(event);
255282
updateProject(project);

src/xyz/elmot/clion/cubemx/CubeFileListener.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
import com.intellij.icons.AllIcons;
44
import com.intellij.openapi.application.ApplicationManager;
5-
import com.intellij.openapi.components.ApplicationComponent;
5+
import com.intellij.openapi.components.BaseComponent;
66
import com.intellij.openapi.project.Project;
77
import com.intellij.openapi.project.ProjectManager;
8+
import com.intellij.openapi.project.ProjectUtil;
89
import com.intellij.openapi.ui.DialogWrapper;
910
import com.intellij.openapi.ui.Messages;
1011
import com.intellij.openapi.vfs.VfsUtilCore;
@@ -20,7 +21,7 @@
2021
/**
2122
* (c) elmot on 29.10.2017.
2223
*/
23-
public class CubeFileListener implements ApplicationComponent, BulkFileListener {
24+
public class CubeFileListener implements BaseComponent, BulkFileListener {
2425

2526
@Override
2627
public void initComponent() {
@@ -36,7 +37,8 @@ public void after(@NotNull List<? extends VFileEvent> events) {
3637
if (name.endsWith(ConvertProject.CPROJECT_FILE_NAME)) {
3738
Project[] openProjects = ProjectManager.getInstance().getOpenProjects();
3839
for (Project openProject : openProjects) {
39-
if (VfsUtilCore.isAncestor(openProject.getBaseDir(), file, true)) {
40+
final VirtualFile projectDir = ProjectUtil.guessProjectDir(openProject);
41+
if (projectDir!=null && VfsUtilCore.isAncestor(projectDir, file, true)) {
4042
ApplicationManager.getApplication().invokeLater(
4143
() -> askProjectUpdate(openProject)
4244
);

src/xyz/elmot/clion/cubemx/SelectBoardDialog.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import static xyz.elmot.clion.openocd.OpenOcdComponent.require;
2626

2727
public class SelectBoardDialog extends DialogWrapper {
28-
private static Logger LOGGER = Logger.getInstance(DialogWrapper.class);
28+
private static final Logger LOGGER = Logger.getInstance(DialogWrapper.class);
2929
private final String[] values;
3030
private int result = 0;
3131

src/xyz/elmot/clion/openocd/FileChooseInput.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ private VirtualFile findOcdScripts() {
154154

155155
}
156156

157+
@SuppressWarnings("unused")
158+
// Might be used in future
157159
public static class ExeFile extends FileChooseInput {
158160
@SuppressWarnings("WeakerAccess")
159161
public ExeFile(String valueName, VirtualFile defValue) {
@@ -166,6 +168,7 @@ public boolean validateFile(VirtualFile virtualFile) {
166168
&& VfsUtil.virtualToIoFile(virtualFile).canExecute();
167169
}
168170

171+
@Override
169172
protected FileChooserDescriptor createFileChooserDescriptor() {
170173
if (SystemInfo.isWindows) {
171174
return FileChooserDescriptorFactory.createSingleFileDescriptor("exe");

src/xyz/elmot/clion/openocd/Informational.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static void showMessage(Project project, MessageType messageType, String
3737
ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(project);
3838
if (toolWindowManager.canShowNotification(ToolWindowId.RUN)) {
3939
toolWindowManager.notifyByBalloon(ToolWindowId.RUN, messageType, message,
40-
OpenOcdConfigurationType.getPluginIcon(),
40+
OpenOcdConfigurationType.ICON.getValue(),
4141
new HyperlinkHandler(project)
4242
);
4343
}

src/xyz/elmot/clion/openocd/OpenOcdConfigurationType.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package xyz.elmot.clion.openocd;
22

3-
import com.intellij.execution.configuration.ConfigurationFactoryEx;
43
import com.intellij.execution.configurations.ConfigurationFactory;
54
import com.intellij.execution.configurations.RunConfiguration;
5+
import com.intellij.execution.configurations.RunConfigurationSingletonPolicy;
6+
import com.intellij.icons.AllIcons;
67
import com.intellij.openapi.project.Project;
78
import com.intellij.openapi.util.IconLoader;
9+
import com.intellij.openapi.util.NotNullLazyValue;
810
import com.jetbrains.cidr.cpp.execution.CMakeRunConfigurationType;
9-
import kotlin.Lazy;
1011
import org.jetbrains.annotations.NotNull;
1112

1213
import javax.swing.*;
@@ -18,6 +19,16 @@ public class OpenOcdConfigurationType extends CMakeRunConfigurationType {
1819

1920
private static final String FACTORY_ID = "elmot.embedded.openocd.conf.factory";
2021
public static final String TYPE_ID = "elmot.embedded.openocd.conf.type";
22+
public static final NotNullLazyValue<Icon> ICON = new NotNullLazyValue<Icon>() {
23+
24+
@NotNull
25+
@Override
26+
protected Icon compute() {
27+
final Icon icon = IconLoader.findIcon("ocd_run.png", OpenOcdConfigurationType.class);
28+
return icon == null ? AllIcons.Icon : icon;
29+
}
30+
31+
};
2132
private final ConfigurationFactory factory;
2233

2334
public OpenOcdConfigurationType() {
@@ -26,46 +37,29 @@ public OpenOcdConfigurationType() {
2637
FACTORY_ID,
2738
"OpenOCD Download & Run",
2839
"Downloads and Runs Embedded Applications using OpenOCD",
29-
new Lazy<Icon>() {
30-
Icon icon;
31-
32-
@Override
33-
public Icon getValue() {
34-
if (icon == null) {
35-
icon = getPluginIcon();
36-
}
37-
return icon;
38-
}
39-
40-
@Override
41-
public boolean isInitialized() {
42-
return icon != null;
43-
}
44-
}
40+
ICON
4541
);
46-
factory = new ConfigurationFactoryEx(this) {
42+
factory = new ConfigurationFactory(this) {
4743
@NotNull
4844
@Override
4945
public RunConfiguration createTemplateConfiguration(@NotNull Project project) {
5046
return new OpenOcdConfiguration(project, factory, "");
5147
}
5248

49+
@NotNull
5350
@Override
54-
public boolean isConfigurationSingletonByDefault() {
55-
return true;
51+
public RunConfigurationSingletonPolicy getSingletonPolicy() {
52+
return RunConfigurationSingletonPolicy.SINGLE_INSTANCE_ONLY;
5653
}
5754

55+
@NotNull
5856
@Override
5957
public String getId() {
6058
return FACTORY_ID;
6159
}
6260
};
6361
}
6462

65-
public static Icon getPluginIcon() {
66-
return IconLoader.findIcon("ocd_run.png", OpenOcdConfigurationType.class);
67-
}
68-
6963
@Override
7064
public OpenOcdConfigurationEditor createEditor(@NotNull Project project) {
7165
return new OpenOcdConfigurationEditor(project, getHelper(project));

src/xyz/elmot/clion/openocd/OpenOcdLauncher.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.intellij.execution.ui.ExecutionConsole;
1212
import com.intellij.openapi.actionSystem.AnAction;
1313
import com.intellij.openapi.actionSystem.AnActionEvent;
14-
import com.intellij.openapi.application.PathManager;
1514
import com.intellij.openapi.options.ConfigurationException;
1615
import com.intellij.openapi.progress.ProgressManager;
1716
import com.intellij.openapi.project.Project;
@@ -30,7 +29,6 @@
3029
import com.jetbrains.cidr.execution.debugger.remote.CidrRemoteDebugParameters;
3130
import com.jetbrains.cidr.execution.debugger.remote.CidrRemoteGDBDebugProcess;
3231
import com.jetbrains.cidr.execution.testing.CidrLauncher;
33-
import org.jdesktop.swingx.util.OS;
3432
import org.jetbrains.annotations.NotNull;
3533
import xyz.elmot.clion.openocd.OpenOcdComponent.STATUS;
3634
import xyz.elmot.clion.openocd.OpenOcdConfiguration.DownloadType;
@@ -122,7 +120,7 @@ public void processWillTerminate(@NotNull ProcessEvent event, boolean willBeDest
122120
debugProcess.getProcessHandler().putUserData(RESTART_KEY,
123121
new AnAction("Reset", "MCU Reset", IconLoader.findIcon("reset.png", OpenOcdLauncher.class)) {
124122
@Override
125-
public void actionPerformed(AnActionEvent e) {
123+
public void actionPerformed(@NotNull AnActionEvent e) {
126124
XDebugSession session = debugProcess.getSession();
127125
session.pause();
128126
debugProcess.postCommand(drv -> {

src/xyz/elmot/clion/openocd/OpenOcdSettingsState.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ protected String defOpenOcdLocation() {
8181
return "C:\\";
8282
}
8383

84+
@SuppressWarnings("SameParameterValue")
8485
@Nullable
8586
private File findExecutableInPath(String name) {
8687
if (SystemInfo.isWindows) {

0 commit comments

Comments
 (0)