Skip to main content

[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;
 	}
 }

Back to the top