Skip to content

Commit 9b5a3dc

Browse files
author
jantje
committed
#1268 Store sloeberProject in session property
This way a open and close takes case rereading the data from disk. Which is convenient for testing and users This should also handle project renames but not configuration renames
1 parent 0fedf55 commit 9b5a3dc

File tree

5 files changed

+118
-50
lines changed

5 files changed

+118
-50
lines changed

io.sloeber.core/src/io/sloeber/core/api/CodeDescription.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public void setReplacers(Map<String, String> myReplacers) {
7474
this.myReplacers = myReplacers;
7575
}
7676

77-
private CodeDescription(CodeTypes codeType) {
77+
public CodeDescription(CodeTypes codeType) {
7878
myCodeType = codeType;
7979
}
8080

io.sloeber.core/src/io/sloeber/core/api/CompileDescription.java

+18-6
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010

1111
public class CompileDescription {
1212

13-
private Boolean myWarningLevel = Boolean.TRUE;
13+
private boolean myWarningLevel = true;
1414
private boolean myAlternativeSizeCommand = false;
15+
private boolean myEnableParallelBuild = false;
1516
private String my_CPP_CompileOptions = new String();
1617
private String my_C_CompileOptions = new String();
1718
private String my_C_andCPP_CompileOptions = new String();
@@ -20,7 +21,7 @@ public class CompileDescription {
2021
private String my_Link_CompileOptions = new String();
2122
private String my_All_CompileOptions = new String();
2223

23-
private boolean myEnableParallelBuild = false;
24+
2425

2526
private static final String ENV_KEY_WARNING_LEVEL_OFF = "A.compiler.warning_flags"; //$NON-NLS-1$
2627
private static final String ENV_KEY_WARNING_LEVEL_ON = "${A.compiler.warning_flags_all}"; //$NON-NLS-1$
@@ -90,11 +91,11 @@ public class CompileDescription {
9091
// }
9192

9293
public boolean isWarningLevel() {
93-
return this.myWarningLevel.booleanValue();
94+
return this.myWarningLevel;
9495
}
9596

9697
public void setWarningLevel(boolean myWarningLevel) {
97-
this.myWarningLevel = Boolean.valueOf(myWarningLevel);
98+
this.myWarningLevel = myWarningLevel;
9899
}
99100

100101
public boolean isParallelBuildEnabled() {
@@ -177,7 +178,7 @@ public void set_All_CompileOptions(String my_All_CompileOptions) {
177178
public Map<String, String> getEnvVars() {
178179
Map<String, String> ret = getEnvVarsConfig();
179180

180-
ret.put(ENV_KEY_JANTJE_WARNING_LEVEL, this.myWarningLevel.toString());
181+
ret.put(ENV_KEY_JANTJE_WARNING_LEVEL, Boolean.valueOf(myWarningLevel).toString());
181182

182183
if (this.isWarningLevel()) {
183184
ret.put(ENV_KEY_WARNING_LEVEL_OFF, ENV_KEY_WARNING_LEVEL_ON);
@@ -254,8 +255,19 @@ public CompileDescription(TxtFile configFile) {
254255
public CompileDescription() {
255256
// no need to do anything
256257
// this will create default compile options
257-
// not that the Parallel build option is implemented at the ui level
258+
// note that the Parallel build option is implemented at the ui level
258259
// therefore this is not set here but in the ui before project creation
259260
}
260261

262+
public boolean isEqual(CompileDescription other) {
263+
return (myWarningLevel == other.myWarningLevel) && (myAlternativeSizeCommand == other.myAlternativeSizeCommand)
264+
&& (my_CPP_CompileOptions.equals(other.my_CPP_CompileOptions))
265+
&& (my_C_CompileOptions.equals(other.my_C_CompileOptions))
266+
&& (my_C_andCPP_CompileOptions.equals(other.my_C_andCPP_CompileOptions))
267+
&& (my_Assembly_CompileOptions.equals(other.my_Assembly_CompileOptions))
268+
&& (my_Archive_CompileOptions.equals(other.my_Archive_CompileOptions))
269+
&& (my_Link_CompileOptions.equals(other.my_Link_CompileOptions))
270+
&& (my_All_CompileOptions.equals(other.my_All_CompileOptions));
271+
272+
}
261273
}

io.sloeber.core/src/io/sloeber/core/api/SloeberProjectDescription.java

+83-39
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.eclipse.core.runtime.IProgressMonitor;
3333
import org.eclipse.core.runtime.IStatus;
3434
import org.eclipse.core.runtime.NullProgressMonitor;
35+
import org.eclipse.core.runtime.QualifiedName;
3536
import org.eclipse.core.runtime.Status;
3637
import org.eclipse.core.runtime.SubMonitor;
3738

@@ -47,19 +48,27 @@
4748
import io.sloeber.core.txt.TxtFile;
4849

4950
public class SloeberProjectDescription extends Common {
50-
static private Map<String, SloeberProjectDescription> ArduinoProjectList = new HashMap<>();
51+
private static QualifiedName sloeberQualifiedName = new QualifiedName(Activator.NODE_ARDUINO,
52+
"Sloeber_Project_Description"); //$NON-NLS-1$
5153
private Map<String, BoardDescription> myBoardDescriptions = new HashMap<>();
5254
private Map<String, CompileDescription> myCompileDescriptions = new HashMap<>();
53-
private IProject myProject = null;
54-
55+
5556
private static final String ENV_KEY_BUILD_SOURCE_PATH = ERASE_START + "build.source.path"; //$NON-NLS-1$
5657
private static final String ENV_KEY_BUILD_GENERIC_PATH = ERASE_START + "build.generic.path"; //$NON-NLS-1$
5758
private static final String ENV_KEY_COMPILER_PATH = ERASE_START + "compiler.path"; //$NON-NLS-1$
5859
private static final String ENV_KEY_JANTJE_MAKE_LOCATION = ENV_KEY_JANTJE_START + "make_location"; //$NON-NLS-1$
5960

60-
private SloeberProjectDescription(IProject project) {
61-
myProject = project;
62-
ICProjectDescription projDesc = CCorePlugin.getDefault().getProjectDescription(myProject);
61+
private SloeberProjectDescription(IProject project, boolean skipChildren) {
62+
try {
63+
project.setSessionProperty(sloeberQualifiedName, this);
64+
} catch (CoreException e) {
65+
// TODO Auto-generated catch block
66+
e.printStackTrace();
67+
}
68+
if (skipChildren) {
69+
return;
70+
}
71+
ICProjectDescription projDesc = CCorePlugin.getDefault().getProjectDescription(project);
6372
for (ICConfigurationDescription confDesc : projDesc.getConfigurations()) {
6473
readSloeberConfigFile(confDesc);
6574
setEnvVars(confDesc, getEnvVars(confDesc), true);
@@ -128,17 +137,17 @@ public void run(IProgressMonitor internalMonitor) throws CoreException {
128137
CCorePlugin cCorePlugin = CCorePlugin.getDefault();
129138
ICProjectDescription prjCDesc = cCorePlugin.getProjectDescription(newProjectHandle);
130139

131-
SloeberProjectDescription arduinoProjectDescriptor = getArduinoProjectDescription(newProjectHandle);
132-
140+
SloeberProjectDescription arduinoProjDesc = new SloeberProjectDescription(newProjectHandle, true);
133141
for (ICConfigurationDescription curConfig : prjCDesc.getConfigurations()) {
134142
// Even though we use the same boardDescriptor for all configurations during
135143
// project creation
136144
// we need to add them config per config because of the include linking
137145
Helpers.addArduinoCodeToProject(boardDescriptor, curConfig);
138146

139-
arduinoProjectDescriptor.setCompileDescription(curConfig, compileDescriptor);
140-
arduinoProjectDescriptor.setBoardDescription(curConfig, boardDescriptor);
141-
147+
arduinoProjDesc.putCompileDescription(curConfig, compileDescriptor);
148+
arduinoProjDesc.putBoardDescription(curConfig, boardDescriptor);
149+
arduinoProjDesc.saveConfig(curConfig);
150+
setEnvVars(curConfig, arduinoProjDesc.getEnvVars(curConfig), true);
142151
Libraries.addLibrariesToProject(newProjectHandle, curConfig, librariesToAdd);
143152
}
144153

@@ -177,13 +186,14 @@ private void saveConfig(ICConfigurationDescription confDesc) {
177186
}
178187

179188
private HashMap<String, String> getEnvVars(ICConfigurationDescription confDesc) {
189+
IProject project = confDesc.getProjectDescription().getProject();
180190

181-
BoardDescription boardDescription = myBoardDescriptions.get(confDesc.getName());
182-
CompileDescription compileOptions = myCompileDescriptions.get(confDesc.getName());
191+
BoardDescription boardDescription = getBoardDescription(confDesc);
192+
CompileDescription compileOptions = getCompileDescription(confDesc);
183193

184194
HashMap<String, String> allVars = new HashMap<>();
185195

186-
allVars.put(ENV_KEY_BUILD_SOURCE_PATH, myProject.getLocation().toOSString());
196+
allVars.put(ENV_KEY_BUILD_SOURCE_PATH, project.getLocation().toOSString());
187197

188198
if (boardDescription != null) {
189199
allVars.putAll(boardDescription.getEnvVars());
@@ -214,20 +224,27 @@ private HashMap<String, String> getEnvVars(ICConfigurationDescription confDesc)
214224

215225
private void readSloeberConfigFile(ICConfigurationDescription confDesc) {
216226
String confDescName = confDesc.getName();
217-
IFile file = myProject.getFile("sloeber." + confDescName + ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
227+
IProject project = confDesc.getProjectDescription().getProject();
228+
IFile file = project.getFile("sloeber." + confDescName + ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
218229
if (file.exists()) {
219230
TxtFile configFile = new TxtFile(file.getLocation().toFile());
220231
BoardDescription boardDescription = new BoardDescription(configFile);
221232
CompileDescription compileDescription = new CompileDescription(configFile);
222-
myBoardDescriptions.put(confDescName, boardDescription);
223-
myCompileDescriptions.put(confDescName, compileDescription);
233+
putBoardDescription(confDesc, boardDescription);
234+
putCompileDescription(confDesc, compileDescription);
235+
} else {
236+
if (!IndexerController.isPosponed(project)) {
237+
Common.log(new Status(IStatus.ERROR, io.sloeber.core.Activator.getId(),
238+
"failed to read file: " + file.getName()));
239+
}
224240
}
225241

226242
}
227243

228244
private void createSloeberConfigFile(ICConfigurationDescription confDesc) {
229-
BoardDescription boardDescription = myBoardDescriptions.get(confDesc.getName());
230-
CompileDescription compileDescription = myCompileDescriptions.get(confDesc.getName());
245+
IProject project = confDesc.getProjectDescription().getProject();
246+
BoardDescription boardDescription = getBoardDescription(confDesc);
247+
CompileDescription compileDescription = getCompileDescription(confDesc);
231248
Map<String, String> configVars = new HashMap<>();
232249
if (boardDescription != null) {
233250
configVars = boardDescription.getEnvVarsConfig();
@@ -240,7 +257,7 @@ private void createSloeberConfigFile(ICConfigurationDescription confDesc) {
240257
for (Entry<String, String> curLine : configVars.entrySet()) {
241258
newFileContent += curLine.getKey() + '=' + curLine.getValue() + '\n';
242259
}
243-
IFile file = myProject.getFile("sloeber." + confDesc.getName() + ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
260+
IFile file = project.getFile("sloeber." + confDesc.getName() + ".txt"); //$NON-NLS-1$ //$NON-NLS-2$
244261
try {
245262
file.refreshLocal(IResource.DEPTH_INFINITE, null);
246263
if (file.exists()) {
@@ -286,21 +303,22 @@ private static void removeAllEraseEnvironmentVariables(IContributedEnvironment c
286303
*/
287304
public void setBoardDescription(ICConfigurationDescription confDesc, BoardDescription boardDescription) {
288305
try {
306+
IProject project = confDesc.getProjectDescription().getProject();
289307
boolean isRebuildNeeded = true;
290-
BoardDescription oldBoardDescription = myBoardDescriptions.get(confDesc.getName());
308+
BoardDescription oldBoardDescription = getBoardDescription(confDesc);
291309
if (oldBoardDescription != null) {
292310
isRebuildNeeded = oldBoardDescription.needsRebuild(boardDescription);
293311
}
294312
Helpers.addArduinoCodeToProject(boardDescription, confDesc);
295313

296314
isRebuildNeeded = isRebuildNeeded || Helpers.removeInvalidIncludeFolders(confDesc);
297-
myBoardDescriptions.put(confDesc.getName(), boardDescription);
315+
putBoardDescription(confDesc, boardDescription);
298316
saveConfig(confDesc);
299317
if (isRebuildNeeded) {
300-
Helpers.setDirtyFlag(myProject, confDesc);
318+
Helpers.setDirtyFlag(project, confDesc);
301319
} else {
302320
Common.log(new Status(IStatus.INFO, io.sloeber.core.Activator.getId(),
303-
"Ignoring project update; clean may be required: " + myProject.getName())); //$NON-NLS-1$
321+
"Ignoring project update; clean may be required: " + project.getName())); //$NON-NLS-1$
304322
}
305323
} catch (Exception e) {
306324
e.printStackTrace();
@@ -338,14 +356,23 @@ private static void setEnvVars(ICConfigurationDescription confDesc, Map<String,
338356
* @param project
339357
* @return
340358
*/
341-
public static SloeberProjectDescription getArduinoProjectDescription(IProject project) {
359+
public static synchronized SloeberProjectDescription getArduinoProjectDescription(IProject project) {
360+
342361
if (project.isOpen() && project.getLocation().toFile().exists()) {
343362
if (Sketch.isSketch(project)) {
344-
SloeberProjectDescription ret = ArduinoProjectList.get(project.getName());
345-
if (null == ret) {
346-
ret = new SloeberProjectDescription(project);
363+
Object sessionProperty = null;
364+
try {
365+
sessionProperty = project.getSessionProperty(sloeberQualifiedName);
366+
if (null != sessionProperty) {
367+
SloeberProjectDescription ret = (SloeberProjectDescription) sessionProperty;
368+
return ret;
369+
}
370+
} catch (CoreException e) {
371+
// TODO Auto-generated catch block
372+
e.printStackTrace();
347373
}
348-
ArduinoProjectList.put(project.getName(), ret);
374+
375+
SloeberProjectDescription ret = new SloeberProjectDescription(project, false);
349376
return ret;
350377
}
351378
}
@@ -354,19 +381,20 @@ public static SloeberProjectDescription getArduinoProjectDescription(IProject pr
354381

355382
public void setCompileDescription(ICConfigurationDescription confDesc, CompileDescription compileDescription) {
356383
try {
384+
IProject project = confDesc.getProjectDescription().getProject();
357385
boolean isRebuildNeeded = true;
358-
CompileDescription oldCompileDescription = myCompileDescriptions.get(confDesc.getName());
386+
CompileDescription oldCompileDescription = getCompileDescription(confDesc);
359387
if (oldCompileDescription != null) {
360388
isRebuildNeeded = oldCompileDescription.needsRebuild(compileDescription);
361389
}
362390

363-
myCompileDescriptions.put(confDesc.getName(), compileDescription);
391+
putCompileDescription(confDesc, compileDescription);
364392
saveConfig(confDesc);
365393
if (isRebuildNeeded) {
366-
Helpers.setDirtyFlag(myProject, confDesc);
394+
Helpers.setDirtyFlag(project, confDesc);
367395
} else {
368396
Common.log(new Status(IStatus.INFO, io.sloeber.core.Activator.getId(),
369-
"Ignoring project update; clean may be required: " + myProject.getName())); //$NON-NLS-1$
397+
"Ignoring project update; clean may be required: " + project.getName())); //$NON-NLS-1$
370398
}
371399
} catch (Exception e) {
372400
e.printStackTrace();
@@ -376,17 +404,33 @@ public void setCompileDescription(ICConfigurationDescription confDesc, CompileDe
376404
}
377405

378406
public BoardDescription getBoardDescription(ICConfigurationDescription confDesc) {
379-
return myBoardDescriptions.get(confDesc.getName());
407+
BoardDescription ret = myBoardDescriptions.get(confDesc.getId());
408+
if (ret == null) {
409+
readSloeberConfigFile(confDesc);
410+
ret = myBoardDescriptions.get(confDesc.getId());
411+
}
412+
return ret;
413+
}
414+
415+
private void putBoardDescription(ICConfigurationDescription confDesc, BoardDescription boardDesc) {
416+
myBoardDescriptions.put(confDesc.getId(), boardDesc);
417+
}
418+
419+
private void putCompileDescription(ICConfigurationDescription confDesc, CompileDescription compDesc) {
420+
myCompileDescriptions.put(confDesc.getId(), compDesc);
380421
}
381422

382423
public CompileDescription getCompileDescription(ICConfigurationDescription confDesc) {
383-
return myCompileDescriptions.get(confDesc.getName());
424+
CompileDescription ret = myCompileDescriptions.get(confDesc.getId());
425+
if (ret == null) {
426+
readSloeberConfigFile(confDesc);
427+
ret = myCompileDescriptions.get(confDesc.getId());
428+
}
429+
return ret;
384430
}
385431

386-
public String getDecoratedText(String text) {
387-
ICProjectDescription projDesc = CCorePlugin.getDefault().getProjectDescription(myProject);
388-
ICConfigurationDescription configurationDescription = projDesc.getActiveConfiguration();
389-
BoardDescription boardDescriptor = getBoardDescription(configurationDescription);
432+
public String getDecoratedText(ICConfigurationDescription confDesc, String text) {
433+
BoardDescription boardDescriptor = getBoardDescription(confDesc);
390434
if (boardDescriptor == null) {
391435
return text + " Project needs to be configured";
392436
}

io.sloeber.core/src/io/sloeber/core/listeners/IndexerController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public boolean postponeIndexerSetup(ICProject cProject) {
3030
return ret;
3131
}
3232

33-
static boolean isPosponed(IProject project) {
33+
static public boolean isPosponed(IProject project) {
3434
return fProjects.contains(project);
3535
}
3636
public static void doNotIndex(IProject project) {

io.sloeber.ui/src/io/sloeber/ui/ExplorerLabelDecorator.java

+15-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package io.sloeber.ui;
22

3+
import org.eclipse.cdt.core.model.CoreModel;
4+
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
5+
import org.eclipse.cdt.core.settings.model.ICProjectDescription;
36
import org.eclipse.core.resources.IProject;
47
import org.eclipse.jface.viewers.ILabelDecorator;
58
import org.eclipse.jface.viewers.ILabelProviderListener;
@@ -40,9 +43,18 @@ public Image decorateImage(Image image, Object element) {
4043
@Override
4144
public String decorateText(String text, Object element) {
4245
IProject proj = (IProject) element;
43-
SloeberProjectDescription arduinoProject = SloeberProjectDescription.getArduinoProjectDescription(proj);
44-
if (arduinoProject != null) {
45-
return arduinoProject.getDecoratedText(text);
46+
if (proj != null) {
47+
ICProjectDescription prjDesc = CoreModel.getDefault().getProjectDescription(proj);
48+
if (prjDesc != null) {
49+
ICConfigurationDescription confDesc = prjDesc.getActiveConfiguration();
50+
if (confDesc != null) {
51+
SloeberProjectDescription arduinoProject = SloeberProjectDescription
52+
.getArduinoProjectDescription(proj);
53+
if (arduinoProject != null) {
54+
return arduinoProject.getDecoratedText(confDesc, text);
55+
}
56+
}
57+
}
4658
}
4759
return text;
4860
}

0 commit comments

Comments
 (0)