[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Scanner config discovery, bug fixes and improvements
|
This patch contains several bug fixes and improvements:
Fix for PR 60018: [Scanner Config] Empty -I in Makefile causes trouble,
Fix for PR 60152: [Scanner Config] Disabling Build output parser also
disables scanner info command,
Fix for PR 60180: [Scanner Config] Rejects IncludePaths with periods,
Added Up and Down buttons to Discovered include paths part of
ManageIncludePaths dialog,
Fixed Delete discovered include path or symbol definition.
Thanks,
Vmir
Index: src/org/eclipse/cdt/make/core/scannerconfig/IExternalScannerInfoProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/IExternalScannerInfoProvider.java,v
retrieving revision 1.1
diff -u -r1.1 IExternalScannerInfoProvider.java
--- src/org/eclipse/cdt/make/core/scannerconfig/IExternalScannerInfoProvider.java 16 Mar 2004 20:35:25 -0000 1.1
+++ src/org/eclipse/cdt/make/core/scannerconfig/IExternalScannerInfoProvider.java 29 Apr 2004 21:07:46 -0000
@@ -10,6 +10,7 @@
**********************************************************************/
package org.eclipse.cdt.make.core.scannerconfig;
+import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -31,5 +32,5 @@
public boolean invokeProvider(IProgressMonitor monitor,
IProject currentProject,
IScannerConfigBuilderInfo buildInfo,
- String[] targetSpecificOptions);
+ List targetSpecificOptions);
}
Index: src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigBuilder.java,v
retrieving revision 1.2
diff -u -r1.2 ScannerConfigBuilder.java
--- src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigBuilder.java 20 Apr 2004 19:02:50 -0000 1.2
+++ src/org/eclipse/cdt/make/core/scannerconfig/ScannerConfigBuilder.java 29 Apr 2004 21:07:46 -0000
@@ -10,11 +10,11 @@
**********************************************************************/
package org.eclipse.cdt.make.core.scannerconfig;
+import java.util.Map;
import org.eclipse.cdt.core.resources.ACBuilder;
import org.eclipse.cdt.make.core.MakeCorePlugin;
-import org.eclipse.cdt.make.internal.core.scannerconfig.*;
+import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
import org.eclipse.core.resources.IProject;
-import java.util.Map;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.SubProgressMonitor;
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java,v
retrieving revision 1.3
diff -u -r1.3 DefaultExternalScannerInfoProvider.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java 15 Apr 2004 19:02:00 -0000 1.3
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/DefaultExternalScannerInfoProvider.java 29 Apr 2004 21:07:46 -0000
@@ -14,10 +14,13 @@
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.List;
import java.util.Properties;
import java.util.StringTokenizer;
+import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.CommandLauncher;
import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.model.ICModelMarker;
@@ -26,6 +29,7 @@
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo;
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
import org.eclipse.cdt.make.internal.core.StreamMonitor;
+import org.eclipse.cdt.make.internal.core.scannerconfig.gnu.GCCScannerConfigUtil;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@@ -51,10 +55,13 @@
private String fCompileArguments;
/* (non-Javadoc)
- * @see org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider#invokeProvider(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.resources.IProject, org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo, java.lang.String[])
+ * @see org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider#invokeProvider(org.eclipse.core.runtime.IProgressMonitor, org.eclipse.core.resources.IProject, org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo, java.util.List)
*/
- public boolean invokeProvider(IProgressMonitor monitor, IProject currentProject, IScannerConfigBuilderInfo buildInfo, String[] targetSpecificOptions) {
- if (!initialize(currentProject, buildInfo)) {
+ public boolean invokeProvider(IProgressMonitor monitor, IProject currentProject, IScannerConfigBuilderInfo buildInfo, List targetSpecificOptions) {
+ if (targetSpecificOptions == null) {
+ targetSpecificOptions = new ArrayList();
+ }
+ if (!initialize(currentProject, buildInfo, targetSpecificOptions)) {
return false;
}
if (monitor == null) {
@@ -125,12 +132,31 @@
/**
* @param currentProject
* @param buildInfo
+ * @param targetSpecificOptions
* @return boolean
*/
- private boolean initialize(IProject currentProject, IScannerConfigBuilderInfo buildInfo) {
+ private boolean initialize(IProject currentProject, IScannerConfigBuilderInfo buildInfo, List targetSpecificOptions) {
boolean rc = false;
+
if (buildInfo.isDefaultESIProviderCmd()) {
fWorkingDirectory = MakeCorePlugin.getWorkingDirectory();
+ String targetFile = "dummy"; //$NON-NLS-1$
+ try {
+ if (currentProject.hasNature(CCProjectNature.CC_NATURE_ID)) {
+ targetFile = GCCScannerConfigUtil.CPP_SPECS_FILE;
+ }
+ else if (currentProject.hasNature(CProjectNature.C_NATURE_ID)) {
+ targetFile = GCCScannerConfigUtil.C_SPECS_FILE;
+ }
+ } catch (CoreException e) {
+ //TODO VMIR better error handling
+ MakeCorePlugin.log(e.getStatus());
+ }
+ IPath path2File = fWorkingDirectory.append(targetFile);
+ if (!path2File.toFile().exists()) {
+ GCCScannerConfigUtil.createSpecs();
+ }
+ targetSpecificOptions.add(targetFile);
}
else {
fWorkingDirectory = currentProject.getLocation();
@@ -144,10 +170,10 @@
}
/**
- * @param tso
+ * @param tso - target specific options
* @return
*/
- private String[] prepareArguments(String[] tso) {
+ private String[] prepareArguments(List tso) {
String[] rv = null;
// commandArguments may have multiple arguments; tokenizing
int nTokens = 0;
@@ -155,17 +181,17 @@
StringTokenizer tokenizer = new StringTokenizer(fCompileArguments, " ");//$NON-NLS-1$
nTokens = tokenizer.countTokens();
if (nTokens > 0) {
- rv = new String[nTokens + tso.length];
+ rv = new String[nTokens + tso.size()];
for (int i = 0; tokenizer.hasMoreTokens(); ++i) {
rv[i] = tokenizer.nextToken();
}
}
}
if (rv == null) {
- rv = new String[tso.length];
+ rv = new String[tso.size()];
}
- for (int i = 0; i < tso.length; ++i) {
- rv[nTokens + i] = tso[i];
+ for (int i = 0; i < tso.size(); ++i) {
+ rv[nTokens + i] = (String) tso.get(i);
}
return rv;
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java,v
retrieving revision 1.4
diff -u -r1.4 ScannerInfoCollector.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java 22 Apr 2004 13:07:10 -0000 1.4
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/ScannerInfoCollector.java 29 Apr 2004 21:07:47 -0000
@@ -96,9 +96,9 @@
project.hasNature(CCProjectNature.CC_NATURE_ID))) {
String projectName = project.getName();
- contribute(projectName, discoveredIncludes, includes);
- contribute(projectName, discoveredSymbols, symbols);
- contribute(projectName, discoveredTSO, targetSpecificOptions);
+ contribute(projectName, discoveredIncludes, includes, true);
+ contribute(projectName, discoveredSymbols, symbols, false);
+ contribute(projectName, discoveredTSO, targetSpecificOptions, false);
}
}
catch (CoreException e) {
@@ -110,9 +110,10 @@
* @param project
* @param discovered symbols | includes | targetSpecificOptions
* @param delta symbols | includes | targetSpecificOptions
+ * @param ordered - to preserve order or append at the end
* @return true if there is a change in discovered symbols | includes | targetSpecificOptions
*/
- private boolean contribute(String projectName, Map discovered, List delta) {
+ private boolean contribute(String projectName, Map discovered, List delta, boolean ordered) {
if (delta == null || delta.isEmpty())
return false;
List projectDiscovered = (List) discovered.get(projectName);
@@ -121,14 +122,29 @@
discovered.put(projectName, projectDiscovered);
return true;
}
- boolean added = false;
- for (Iterator i = delta.iterator(); i.hasNext(); ) {
+ return addItemsWithOrder(delta, projectDiscovered, ordered);
+ }
+
+ /**
+ * Adds new items to the already accumulated ones preserving order
+ *
+ * @param includes - items to be added
+ * @param sumIncludes - previously accumulated items
+ * @param ordered - to preserve order or append at the end
+ * @return boolean - true if added
+ */
+ private boolean addItemsWithOrder(List includes, List sumIncludes, boolean ordered) {
+ boolean addedIncludes = false;
+ int prev = sumIncludes.size() - 1; // index of previously added/found contribution in already discovered list
+ for (Iterator i = includes.iterator(); i.hasNext(); ) {
String item = (String) i.next();
- if (!projectDiscovered.contains(item)) {
- added |= projectDiscovered.add(item);
+ if (!sumIncludes.contains(item)) {
+ sumIncludes.add(prev + 1, item);
+ addedIncludes = true;
}
+ prev = ordered ? sumIncludes.indexOf(item) : sumIncludes.size() - 1;
}
- return added;
+ return addedIncludes;
}
/**
@@ -200,12 +216,7 @@
addedIncludes = true;
}
else {
- for (Iterator i = includes.iterator(); i.hasNext(); ) {
- String include = (String) i.next();
- if (!sumIncludes.contains(include)) {
- addedIncludes |= sumIncludes.add(include);
- }
- }
+ addedIncludes = addItemsWithOrder(includes, sumIncludes, true);
}
// try to translate cygpaths to absolute paths
List finalSumIncludes = translateIncludePaths(sumIncludes);
@@ -214,17 +225,30 @@
LinkedHashMap persistedIncludes = discScanInfo.getDiscoveredIncludePaths();
// Step 3. Merge scanner config from steps 1 and 2
- for (Iterator i = finalSumIncludes.iterator(); i.hasNext(); ) {
- String include = (String) i.next();
- if (!persistedIncludes.containsKey(include)) {
- persistedIncludes.put(include,
- ((new Path(include)).toFile().exists()) ? Boolean.FALSE : Boolean.TRUE);
- addedIncludes |= true;
+ // order is important, use list to preserve it
+ ArrayList persistedKeyList = new ArrayList(persistedIncludes.keySet());
+ addedIncludes = addItemsWithOrder(finalSumIncludes, persistedKeyList, true);
+
+ LinkedHashMap newPersistedIncludes;
+ if (addedIncludes) {
+ newPersistedIncludes = new LinkedHashMap(persistedKeyList.size());
+ for (Iterator i = persistedKeyList.iterator(); i.hasNext(); ) {
+ String include = (String) i.next();
+ if (persistedIncludes.containsKey(include)) {
+ newPersistedIncludes.put(include, persistedIncludes.get(include));
+ }
+ else {
+ newPersistedIncludes.put(include,
+ ((new Path(include)).toFile().exists()) ? Boolean.FALSE : Boolean.TRUE);
+ }
}
}
+ else {
+ newPersistedIncludes = persistedIncludes;
+ }
// Step 4. Set resulting scanner config
- discScanInfo.setDiscoveredIncludePaths(persistedIncludes);
+ discScanInfo.setDiscoveredIncludePaths(newPersistedIncludes);
// Step 5. Invalidate discovered include paths and symbol definitions
discoveredIncludes.put(projectName, null);
@@ -331,14 +355,7 @@
if (esiProvider != null) {
ISafeRunnable runnable = new ISafeRunnable() {
public void run() {
- String[] tsoArray;
- if (tso == null) {
- tsoArray = new String[0];
- }
- else {
- tsoArray = (String[])tso.toArray(new String[tso.size()]);
- }
- esiProvider.invokeProvider(monitor, project, buildInfo, tsoArray);
+ esiProvider.invokeProvider(monitor, project, buildInfo, tso);
}
public void handleException(Throwable exception) {
@@ -390,5 +407,36 @@
sumDiscoveredSymbols.put(project.getName(), null);
}
// TODO VMIR define error message
+ }
+
+ /**
+ * Delete a specific include path
+ *
+ * @param project
+ * @param path
+ */
+ public void deletePath(IProject project, String path) {
+ if (project != null) {
+ List sumIncludes = (List) sumDiscoveredIncludes.get(project.getName());
+ if (sumIncludes != null) {
+ sumIncludes.remove(path);
+ }
+ }
+ }
+
+ /**
+ * Delete a specific symbol definition
+ *
+ * @param project
+ * @param path
+ */
+ public void deleteSymbol(IProject project, String symbol) {
+ if (project != null) {
+ Map sumSymbols = (Map) sumDiscoveredSymbols.get(project.getName());
+ if (sumSymbols != null) {
+ // remove it from the Map of SymbolEntries
+ ScannerConfigUtil.removeSymbolEntryValue(symbol, sumSymbols);
+ }
+ }
}
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java,v
retrieving revision 1.3
diff -u -r1.3 GCCScannerInfoConsoleParser.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java 20 Apr 2004 19:02:50 -0000 1.3
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/gnu/GCCScannerInfoConsoleParser.java 29 Apr 2004 21:07:47 -0000
@@ -12,13 +12,8 @@
import java.util.StringTokenizer;
-import org.eclipse.cdt.core.CCProjectNature;
-import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoConsoleParser;
import org.eclipse.cdt.make.internal.core.scannerconfig.IScannerInfoConsoleParserUtility;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
@@ -43,29 +38,6 @@
public void startup(IProject project, IScannerInfoConsoleParserUtility util) {
fProject = project;
fUtil = util;
-
- IPath workingDirectory = MakeCorePlugin.getWorkingDirectory();
- String targetFile = "dummy"; //$NON-NLS-1$
- try {
- if (project.hasNature(CCProjectNature.CC_NATURE_ID)) {
- targetFile = GCCScannerConfigUtil.CPP_SPECS_FILE;
- }
- else if (project.hasNature(CProjectNature.C_NATURE_ID)) {
- targetFile = GCCScannerConfigUtil.C_SPECS_FILE;
- }
- } catch (CoreException e) {
- //TODO VMIR better error handling
- MakeCorePlugin.log(e.getStatus());
- }
- IPath path2File = workingDirectory.append(targetFile);
- if (!path2File.toFile().exists()) {
- GCCScannerConfigUtil.createSpecs();
- }
- List targetSpecificOptions = new ArrayList();
- targetSpecificOptions.add(targetFile);
-
- ScannerInfoCollector.getInstance().
- contributeToScannerConfig(project, null, null, targetSpecificOptions);
}
/* (non-Javadoc)
@@ -104,13 +76,24 @@
rc = true;
String fileName = null;
+ String cashedToken = null;
while (scanner.hasMoreTokens()) {
- token = scanner.nextToken();
+ if (cashedToken == null) {
+ token = scanner.nextToken();
+ }
+ else {
+ token = cashedToken;
+ cashedToken = null;
+ }
if (token.startsWith("-D")) {//$NON-NLS-1$
String symbol = token.substring(2);
if (symbol.length() == 0) {
if (scanner.hasMoreTokens()) {
symbol = scanner.nextToken();
+ if (symbol.startsWith("-")) { // $NON-NLS-1$
+ cashedToken = symbol;
+ continue;
+ }
}
else {
continue;
@@ -124,6 +107,10 @@
if (iPath.length() == 0) {
if (scanner.hasMoreTokens()) {
iPath = scanner.nextToken();
+ if (iPath.startsWith("-")) { // $NON-NLS-1$
+ cashedToken = iPath;
+ continue;
+ }
}
else {
continue;
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java,v
retrieving revision 1.3
diff -u -r1.3 ScannerConfigUtil.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java 15 Apr 2004 19:02:00 -0000 1.3
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerConfigUtil.java 29 Apr 2004 21:07:48 -0000
@@ -13,6 +13,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -168,5 +169,83 @@
}
}
return rc;
+ }
+
+ /**
+ * Returns a symbol key (i.e. for DEF=1 returns DEF)
+ *
+ * @param symbol - in
+ * @param key - out
+ */
+ public static String getSymbolKey(String symbol) {
+ int index = symbol.indexOf('=');
+ if (index != -1) {
+ return symbol.substring(0, index);
+ }
+ return symbol;
+ }
+
+ /**
+ * Returns a symbol value (i.e. for DEF=1 returns 1)
+ *
+ * @param symbol - in
+ * @param key - out (may be null)
+ */
+ public static String getSymbolValue(String symbol) {
+ int index = symbol.indexOf('=');
+ if (index != -1) {
+ return symbol.substring(index+1);
+ }
+ return null;
+ }
+
+ /**
+ * Removes a symbol value from the symbol entry. If it was an only value than
+ * it symbol entry will be removed alltogether.
+ *
+ * @param symbol
+ * @param symbolEntryMap map of [symbol's key, symbolEntry]
+ */
+ public static void removeSymbolEntryValue(String symbol, Map symbolEntryMap) {
+ String key = getSymbolKey(symbol);
+ String value = getSymbolValue(symbol);
+ // find it in the discoveredSymbols Map of SymbolEntries
+ SymbolEntry se = (SymbolEntry) symbolEntryMap.get(key);
+ if (se != null) {
+ se.remove(value);
+ if (se.numberOfValues() == 0) {
+ symbolEntryMap.remove(key);
+ }
+ }
+ }
+
+ /**
+ * Swaps two include paths in the include paths Map.
+ * Used by Up/Down discovered paths
+ *
+ * @param sumPaths
+ * @param index1
+ * @param index2
+ * @return new map of include paths
+ */
+ public static LinkedHashMap swapIncludePaths(LinkedHashMap sumPaths, int index1, int index2) {
+ int size = sumPaths.size();
+ if (index1 == index2 ||
+ !(index1 >= 0 && index1 < size &&
+ index2 >= 0 && index2 < size)) {
+ return sumPaths;
+ }
+ ArrayList pathKeyList = new ArrayList(sumPaths.keySet());
+ String temp1 = (String) pathKeyList.get(index1);
+ String temp2 = (String) pathKeyList.get(index2);
+ pathKeyList.set(index1, temp2);
+ pathKeyList.set(index2, temp1);
+
+ LinkedHashMap newSumPaths = new LinkedHashMap(sumPaths.size());
+ for (Iterator i = pathKeyList.iterator(); i.hasNext(); ) {
+ String key = (String) i.next();
+ newSumPaths.put(key, sumPaths.get(key));
+ }
+ return newSumPaths;
}
}
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java,v
retrieving revision 1.2
diff -u -r1.2 ScannerInfoConsoleParserUtility.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java 15 Apr 2004 19:02:00 -0000 1.2
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/util/ScannerInfoConsoleParserUtility.java 29 Apr 2004 21:07:48 -0000
@@ -372,33 +372,43 @@
StringBuffer buf = new StringBuffer(path);
int len = buf.length();
StringBuffer newBuf = new StringBuffer(buf.length());
- int i = 0;
- int sp = 0;
+ int scp = 0; // starting copy point
+ int ssp = 0; // starting search point
int sdot;
- while (sp < len && (sdot = buf.indexOf(".", sp)) != -1) { //$NON-NLS-1$
- int ddot = buf.indexOf("..", sp);//$NON-NLS-1$
+ boolean validPrefix;
+ while (ssp < len && (sdot = buf.indexOf(".", ssp)) != -1) { //$NON-NLS-1$
+ validPrefix = false;
+ int ddot = buf.indexOf("..", ssp);//$NON-NLS-1$
if (sdot < ddot || ddot == -1) {
- newBuf.append(buf.substring(i, sdot));
- i = sdot + 1;
- if (i < len) {
- char nextChar = buf.charAt(i);
- if (nextChar == '/') {
- ++i;
+ newBuf.append(buf.substring(scp, sdot));
+ ssp = sdot + 1;
+ if (ssp < len) {
+ if (sdot == 0 || buf.charAt(sdot - 1) == '/' || buf.charAt(sdot - 1) == '\\') {
+ validPrefix = true;
}
- else if (nextChar == '\\') {
- ++i;
- if (i < len - 1 && buf.charAt(i) == '\\') {
- ++i;
+ char nextChar = buf.charAt(ssp);
+ if (validPrefix && nextChar == '/') {
+ ++ssp;
+ scp = ssp;
+ }
+ else if (validPrefix && nextChar == '\\') {
+ ++ssp;
+ if (ssp < len - 1 && buf.charAt(ssp) == '\\') {
+ ++ssp;
}
+ scp = ssp;
+ }
+ else {
+ // no path delimiter, must be '.' inside the path
+ scp = ssp - 1;
}
}
- sp = i;
}
else if (sdot == ddot) {
- sp = sdot + 2;
+ ssp = sdot + 2;
}
}
- newBuf.append(buf.substring(i, len));
+ newBuf.append(buf.substring(scp, len));
IPath orgPath = new Path(newBuf.toString());
return orgPath.toString();
Index: src/org/eclipse/cdt/make/internal/core/scannerconfig/util/SymbolEntry.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/internal/core/scannerconfig/util/SymbolEntry.java,v
retrieving revision 1.2
diff -u -r1.2 SymbolEntry.java
--- src/org/eclipse/cdt/make/internal/core/scannerconfig/util/SymbolEntry.java 15 Apr 2004 19:02:00 -0000 1.2
+++ src/org/eclipse/cdt/make/internal/core/scannerconfig/util/SymbolEntry.java 29 Apr 2004 21:07:48 -0000
@@ -139,4 +139,8 @@
}
return rv;
}
+
+ public int numberOfValues() {
+ return values.size();
+ }
}
Index: src/org/eclipse/cdt/make/internal/ui/MakeResources.properties
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/MakeResources.properties,v
retrieving revision 1.18
diff -u -r1.18 MakeResources.properties
--- src/org/eclipse/cdt/make/internal/ui/MakeResources.properties 28 Apr 2004 14:02:38 -0000 1.18
+++ src/org/eclipse/cdt/make/internal/ui/MakeResources.properties 29 Apr 2004 21:08:10 -0000
@@ -206,6 +206,8 @@
ManageScannerConfigDialogCommon.discoveredGroup.selected.label=Selected:
ManageScannerConfigDialogCommon.discoveredGroup.removed.label=Removed:
+ManageScannerConfigDialogCommon.discoveredGroup.buttons.up.label=Up
+ManageScannerConfigDialogCommon.discoveredGroup.buttons.down.label=Down
ManageScannerConfigDialogCommon.discoveredGroup.buttons.remove.label=Remove
ManageScannerConfigDialogCommon.discoveredGroup.buttons.restore.label=Restore
ManageScannerConfigDialogCommon.discoveredGroup.buttons.delete.label=Delete
Index: src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java,v
retrieving revision 1.15
diff -u -r1.15 MakefileEditor.java
--- src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java 6 Apr 2004 14:24:12 -0000 1.15
+++ src/org/eclipse/cdt/make/internal/ui/editor/MakefileEditor.java 29 Apr 2004 21:08:10 -0000
@@ -197,7 +197,7 @@
if (len > 0) {
var = var.substring(0, len);
}
- IRegion region = getFindRepalceDocumentAdapter().search(start, var, true, true, true, false);
+ IRegion region = getFindRepalceDocumentAdapter().find(start, var, true, true, true, false);
if (region != null) {
len = region.getOffset();
Index: src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java,v
retrieving revision 1.1
diff -u -r1.1 ManageDefinedSymbolsDialog.java
--- src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java 15 Apr 2004 19:01:33 -0000 1.1
+++ src/org/eclipse/cdt/make/ui/dialogs/ManageDefinedSymbolsDialog.java 29 Apr 2004 21:08:11 -0000
@@ -23,6 +23,7 @@
import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfo;
import org.eclipse.cdt.make.core.scannerconfig.DiscoveredScannerInfoProvider;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoCollector;
+import org.eclipse.cdt.make.internal.core.scannerconfig.util.ScannerConfigUtil;
import org.eclipse.cdt.make.internal.core.scannerconfig.util.SymbolEntry;
import org.eclipse.cdt.make.internal.ui.MakeUIPlugin;
import org.eclipse.cdt.make.internal.ui.MessageLine;
@@ -94,6 +95,7 @@
boolean alreadyCreated; // Set when dialog is created for the first time (vs. reopened)
private ArrayList returnSymbols;
private ArrayList userSymbols;
+ private ArrayList deletedDiscoveredSymbols;
private LinkedHashMap discoveredSymbols;
private LinkedHashMap workingDiscoveredSymbols; // working copy of discoveredSymbols, until either OK or CANCEL is pressed
private boolean fDirty;
@@ -497,8 +499,8 @@
int id = discList.getSelectionIndex();
if (id != -1) {
String symbol = discList.getItem(id);
- String key = getSymbolKey(symbol);
- String value = getSymbolValue(symbol);
+ String key = ScannerConfigUtil.getSymbolKey(symbol);
+ String value = ScannerConfigUtil.getSymbolValue(symbol);
// find it in the discoveredSymbols Map of SymbolEntries
SymbolEntry se = (SymbolEntry) workingDiscoveredSymbols.get(key);
if (se != null) {
@@ -535,17 +537,14 @@
int id = discList.getSelectionIndex();
if (id >= 0) {
String symbol = discList.getItem(id);
- // remove it from the Map of SymbolEntries
- String key = getSymbolKey(symbol);
- String value = getSymbolValue(symbol);
- // find it in the discoveredSymbols Map of SymbolEntries
- SymbolEntry se = (SymbolEntry) workingDiscoveredSymbols.get(key);
- if (se != null) {
- se.remove(value);
- }
- else {
- //TODO VMIR generate an error
+ // add it to the deleted list
+ if (deletedDiscoveredSymbols == null) {
+ deletedDiscoveredSymbols = new ArrayList();
}
+ deletedDiscoveredSymbols.add(symbol);
+
+ // remove it from the Map of SymbolEntries
+ ScannerConfigUtil.removeSymbolEntryValue(symbol, workingDiscoveredSymbols);
int items = discList.getItemCount();
discList.setItems(getDiscDefinedSymbols(workingDiscoveredSymbols, type));
@@ -561,34 +560,6 @@
}
/**
- * Returns a symbol key (i.e. for DEF=1 returns DEF)
- *
- * @param symbol - in
- * @param key - out
- */
- private String getSymbolKey(String symbol) {
- int index = symbol.indexOf('=');
- if (index != -1) {
- return symbol.substring(0, index);
- }
- return symbol;
- }
-
- /**
- * Returns a symbol value (i.e. for DEF=1 returns 1)
- *
- * @param symbol - in
- * @param key - out (may be null)
- */
- private String getSymbolValue(String symbol) {
- int index = symbol.indexOf('=');
- if (index != -1) {
- return symbol.substring(index+1);
- }
- return null;
- }
-
- /**
*
*/
protected void handleDeleteAllDiscSymbols() {
@@ -671,6 +642,7 @@
fDirty = fWorkingDirty;
}
else if (IDialogConstants.CANCEL_ID == buttonId) {
+ deletedDiscoveredSymbols = null;
workingDiscoveredSymbols = null;
setDirty(false);
}
@@ -689,6 +661,13 @@
if (fDirty || (fProject == null && fContainer.getProject() != null)) {// New Standard Make project wizard
info.setUserDefinedSymbols(userSymbols);
info.setDiscoveredSymbolDefinitions(discoveredSymbols);
+ // remove deleted symbols from discovered SC
+ if (deletedDiscoveredSymbols != null) {
+ for (Iterator i = deletedDiscoveredSymbols.iterator(); i.hasNext(); ) {
+ ScannerInfoCollector.getInstance().deleteSymbol(fProject, (String) i.next());
+ }
+ deletedDiscoveredSymbols = null;
+ }
}
setDirty(false);
fDirty = false;
@@ -701,11 +680,14 @@
if (fProject != null) {
userSymbols = new ArrayList(Arrays.asList(BuildPathInfoBlock.getSymbols(
MakeCorePlugin.getDefault().getPluginPreferences())));
+ // remove discovered symbols
+ ScannerInfoCollector.getInstance().deleteAllSymbols(fProject);
}
else {
userSymbols = new ArrayList();
}
discoveredSymbols = new LinkedHashMap();
+ deletedDiscoveredSymbols = null;
fDirty = true;
}
}
Index: src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.make.ui/src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java,v
retrieving revision 1.1
diff -u -r1.1 ManageIncludePathsDialog.java
--- src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java 15 Apr 2004 19:01:33 -0000 1.1
+++ src/org/eclipse/cdt/make/ui/dialogs/ManageIncludePathsDialog.java 29 Apr 2004 21:08:12 -0000
@@ -75,6 +75,8 @@
private static final String DISC_COMMON_PREFIX = "ManageScannerConfigDialogCommon"; //$NON-NLS-1$
private static final String SELECTED_LABEL = DISC_COMMON_PREFIX + ".discoveredGroup.selected.label"; //$NON-NLS-1$
private static final String REMOVED_LABEL = DISC_COMMON_PREFIX + ".discoveredGroup.removed.label"; //$NON-NLS-1$
+ private static final String UP_DISCOVERED = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.up.label"; //$NON-NLS-1$
+ private static final String DOWN_DISCOVERED = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.down.label"; //$NON-NLS-1$
private static final String REMOVE_DISCOVERED = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.remove.label"; //$NON-NLS-1$
private static final String RESTORE_DISCOVERED = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.restore.label"; //$NON-NLS-1$
private static final String DELETE_DISCOVERED = DISC_COMMON_PREFIX + ".discoveredGroup.buttons.delete.label"; //$NON-NLS-1$
@@ -89,8 +91,12 @@
private static final int DO_REMOVE = 0;
private static final int DO_RESTORE = 1;
+ private static final int DISC_UP = 0;
+ private static final int DISC_DOWN = 1;
+
private ArrayList returnPaths;
private ArrayList userPaths;
+ private ArrayList deletedDiscoveredPaths;
private LinkedHashMap discoveredPaths;
private LinkedHashMap workingDiscoveredPaths; // working copy of discoveredPaths, until either OK or CANCEL is pressed
private boolean fDirty;
@@ -113,6 +119,8 @@
private Label removedLabel;
private List discActiveList;
private List discRemovedList;
+ private Button upDiscPath;
+ private Button downDiscPath;
private Button removeDiscPath;
private Button restoreDiscPath;
private Button deleteDiscPath;
@@ -181,8 +189,10 @@
setListContents();
userList.select(0);
+ userList.setFocus();
enableUserButtons();
discActiveList.select(0);
+ discActiveList.setFocus();
enableDiscoveredButtons();
return composite;
@@ -475,6 +485,24 @@
Composite pathButtonComp = ControlFactory.createComposite(discoveredGroup, 1);
// Add the buttons
+ upDiscPath = ControlFactory.createPushButton(pathButtonComp, getTitle(UP_DISCOVERED));
+ upDiscPath.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleUpDownDiscPath(DISC_UP);
+ }
+ });
+ upDiscPath.setEnabled(true);
+ SWTUtil.setButtonDimensionHint(upDiscPath);
+
+ downDiscPath = ControlFactory.createPushButton(pathButtonComp, getTitle(DOWN_DISCOVERED));
+ downDiscPath.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleUpDownDiscPath(DISC_DOWN);
+ }
+ });
+ downDiscPath.setEnabled(true);
+ SWTUtil.setButtonDimensionHint(downDiscPath);
+
removeDiscPath = ControlFactory.createPushButton(pathButtonComp, getTitle(REMOVE_DISCOVERED));
removeDiscPath.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
@@ -531,6 +559,58 @@
}
/**
+ * @param direction (DISC_UP or DISC_DOWN)
+ */
+ protected void handleUpDownDiscPath(int direction) {
+ int delta = (direction == DISC_UP) ? -1 : 1;
+ List selectedList;
+ boolean removed;
+ int selectedSet;
+ if (discActiveList.getSelectionIndex() == -1) {
+ selectedList = discRemovedList;
+ removed = true;
+ selectedSet = REMOVED;
+ }
+ else {
+ selectedList = discActiveList;
+ removed = false;
+ selectedSet = ACTIVE;
+ }
+ int selectedItem = selectedList.getFocusIndex();
+ String selected = selectedList.getItem(selectedItem);
+ ArrayList pathKeyList = new ArrayList(workingDiscoveredPaths.keySet());
+ int curIndex = pathKeyList.indexOf(selected);
+ int otherIndex = curIndex + delta;
+ boolean found = false;
+ for (; otherIndex >= 0 && otherIndex < pathKeyList.size(); otherIndex+=delta) {
+ Boolean val = (Boolean) workingDiscoveredPaths.get((String) pathKeyList.get(otherIndex));
+ if (val != null && val.booleanValue() == removed) {
+ found = true;
+ break;
+ }
+ }
+ if (found) {
+ // swap the entries in the working copy
+ String temp = (String) pathKeyList.get(curIndex);
+ pathKeyList.add(curIndex, (String) pathKeyList.get(otherIndex));
+ pathKeyList.add(otherIndex, temp);
+
+ LinkedHashMap newWorkingDiscoveredPaths = new LinkedHashMap(workingDiscoveredPaths.size());
+ for (Iterator i = pathKeyList.iterator(); i.hasNext(); ) {
+ String key = (String) i.next();
+ newWorkingDiscoveredPaths.put(key, (Boolean) workingDiscoveredPaths.get(key));
+ }
+ workingDiscoveredPaths = newWorkingDiscoveredPaths;
+ // update UI
+ selectedList.setItems(getDiscIncludePaths(workingDiscoveredPaths, selectedSet));
+ selectedList.setSelection(selectedItem + delta);
+ selectedList.setFocus();
+ enableDiscoveredButtons();
+ setDirty(true);
+ }
+ }
+
+ /**
*
*/
protected void handleRemoveRestoreDiscPath(int type) {
@@ -584,6 +664,12 @@
int id = discList.getSelectionIndex();
if (id >= 0) {
String path = discList.getItem(id);
+ // add it to the deleted list
+ if (deletedDiscoveredPaths == null) {
+ deletedDiscoveredPaths = new ArrayList();
+ }
+ deletedDiscoveredPaths.add(path);
+
workingDiscoveredPaths.remove(path);
discList.setItems(getDiscIncludePaths(workingDiscoveredPaths, type));
int items = discList.getItemCount();
@@ -621,19 +707,17 @@
discRemovedList.setEnabled(fProject != null);
int activeItems = discActiveList.getItemCount();
- int activeSeclection = discActiveList.getSelectionIndex();
+ int activeSelection = discActiveList.getSelectionIndex();
int removedItems = discRemovedList.getItemCount();
int removedSelection = discRemovedList.getSelectionIndex();
- // To maintain the proper TAB order of enabled buttons
- if (activeItems > 0 && activeSeclection >= 0) {
- removeDiscPath.setEnabled(activeItems > 0 && activeSeclection >= 0);
- restoreDiscPath.setEnabled(removedItems > 0 && removedSelection >= 0);
- }
- else {
- restoreDiscPath.setEnabled(removedItems > 0 && removedSelection >= 0);
- removeDiscPath.setEnabled(activeItems > 0 && activeSeclection >= 0);
- }
- deleteDiscPath.setEnabled((activeItems > 0 && activeSeclection >= 0) ||
+ // To maintain the proper TAB order of enabled buttons
+ upDiscPath.setEnabled((activeItems > 0 && activeSelection > 0) ||
+ (removedItems > 0 && removedSelection > 0));
+ downDiscPath.setEnabled((activeItems > 0 && activeSelection >= 0 && activeSelection < activeItems-1) ||
+ (removedItems > 0 && removedSelection >= 0 && removedSelection < removedItems-1));
+ removeDiscPath.setEnabled(activeItems > 0 && activeSelection >= 0);
+ restoreDiscPath.setEnabled(removedItems > 0 && removedSelection >= 0);
+ deleteDiscPath.setEnabled((activeItems > 0 && activeSelection >= 0) ||
(removedItems > 0 && removedSelection >= 0));
deleteAllDiscPaths.setEnabled(activeItems > 0 || removedItems > 0);
}
@@ -681,6 +765,7 @@
fDirty = fWorkingDirty;
}
else if (IDialogConstants.CANCEL_ID == buttonId) {
+ deletedDiscoveredPaths = null;
workingDiscoveredPaths = null;
setDirty(false);
}
@@ -699,6 +784,13 @@
if (fDirty || (fProject == null && fContainer.getProject() != null)) {// New Standard Make project wizard
info.setUserIncludePaths(userPaths);
info.setDiscoveredIncludePaths(discoveredPaths);
+ // remove deleted paths from discovered SC
+ if (deletedDiscoveredPaths != null) {
+ for (Iterator i = deletedDiscoveredPaths.iterator(); i.hasNext(); ) {
+ ScannerInfoCollector.getInstance().deletePath(fProject, (String) i.next());
+ }
+ deletedDiscoveredPaths = null;
+ }
}
setDirty(false);
fDirty = false;
@@ -711,11 +803,14 @@
if (fProject != null) {
userPaths = new ArrayList(Arrays.asList(BuildPathInfoBlock.getIncludes(
MakeCorePlugin.getDefault().getPluginPreferences())));
+ // remove discovered paths
+ ScannerInfoCollector.getInstance().deleteAllPaths(fProject);
}
else {
userPaths = new ArrayList();
}
discoveredPaths = new LinkedHashMap();
+ deletedDiscoveredPaths = null;
fDirty = true;
}
}