1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for 95641: [Scanner Config] Per file scanner info not available for header files and not compiled source files.

Proposed solution 2 is implemented.
This commit is contained in:
Vladimir Hirsl 2005-05-18 17:32:49 +00:00
parent 1b02dd9ecf
commit ccddd79e27
2 changed files with 152 additions and 120 deletions

View file

@ -14,8 +14,6 @@ import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
@ -122,26 +120,32 @@ public class CCommandDSC {
return commandAsString.trim(); return commandAsString.trim();
} }
public IPath[] getImacrosFile() { /**
* @return list of strings
*/
public List getImacrosFile() {
List imacrosFiles = new ArrayList(); List imacrosFiles = new ArrayList();
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) { for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
KVStringPair optionPair = (KVStringPair)i.next(); KVStringPair optionPair = (KVStringPair)i.next();
if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString())) { if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString())) {
imacrosFiles.add(new Path(optionPair.getValue())); imacrosFiles.add(optionPair.getValue());
} }
} }
return (IPath[]) imacrosFiles.toArray(new IPath[imacrosFiles.size()]); return imacrosFiles;
} }
public IPath[] getIncludeFile() { /**
* @return list of strings
*/
public List getIncludeFile() {
List includeFiles = new ArrayList(); List includeFiles = new ArrayList();
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) { for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
KVStringPair optionPair = (KVStringPair)i.next(); KVStringPair optionPair = (KVStringPair)i.next();
if (optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString())) { if (optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString())) {
includeFiles.add(new Path(optionPair.getValue())); includeFiles.add(optionPair.getValue());
} }
} }
return (IPath[]) includeFiles.toArray(new IPath[includeFiles.size()]); return includeFiles;
} }
// public List getFilesList() { // public List getFilesList() {
@ -167,7 +171,7 @@ public class CCommandDSC {
} }
/** /**
* @return Returns the includes. * @return Returns the includes as strings.
*/ */
public List getIncludes() { public List getIncludes() {
return includes; return includes;
@ -179,13 +183,13 @@ public class CCommandDSC {
this.includes = includes; this.includes = includes;
} }
/** /**
* @return Returns the quote include paths (for #include "...") * @return Returns the quote include paths as strings (for #include "...")
*/ */
public List getQuoteIncludes() { public List getQuoteIncludes() {
return quoteIncludes; return quoteIncludes;
} }
/** /**
* @param includes. Quaote include paths (for #include "...") * @param includes. Quote include paths (for #include "...")
*/ */
public void setQuoteIncludes(List includes) { public void setQuoteIncludes(List includes) {
quoteIncludes = includes; quoteIncludes = includes;

View file

@ -55,6 +55,11 @@ import org.w3c.dom.NodeList;
* @author vhirsl * @author vhirsl
*/ */
public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoCollectorCleaner { public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoCollectorCleaner {
private static final int INCLUDE_PATH = 1;
private static final int QUOTE_INCLUDE_PATH = 2;
private static final int INCLUDE_FILE = 3;
private static final int MACROS_FILE = 4;
public class ScannerInfoData implements IDiscoveredScannerInfoSerializable { public class ScannerInfoData implements IDiscoveredScannerInfoSerializable {
private Map commandIdToFilesMap; // command id and set of files it applies to private Map commandIdToFilesMap; // command id and set of files it applies to
private Map fileToCommandIdMap; // maps each file to the corresponding command id private Map fileToCommandIdMap; // maps each file to the corresponding command id
@ -136,7 +141,15 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
return COLLECTOR_ID; return COLLECTOR_ID;
} }
}; }
private static class ProjectScannerInfo {
IPath[] includePaths;
IPath[] quoteIncludePaths;
IPath[] includeFiles;
IPath[] macrosFiles;
Map definedSymbols;
}
public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerFileSICollector"; //$NON-NLS-1$ public static final String COLLECTOR_ID = MakeCorePlugin.getUniqueIdentifier() + ".PerFileSICollector"; //$NON-NLS-1$
private static final String CC_ELEM = "compilerCommand"; //$NON-NLS-1$ private static final String CC_ELEM = "compilerCommand"; //$NON-NLS-1$
@ -146,9 +159,10 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
private static final String FILE_ELEM = "file"; //$NON-NLS-1$ private static final String FILE_ELEM = "file"; //$NON-NLS-1$
private static final String PATH_ATTR = "path"; //$NON-NLS-1$ private static final String PATH_ATTR = "path"; //$NON-NLS-1$
private IProject project; IProject project;
private ScannerInfoData sid; // scanner info data private ScannerInfoData sid; // scanner info data
private ProjectScannerInfo psi = null; // sum of all scanner info
// private List siChangedForFileList; // list of files for which scanner info has changed // private List siChangedForFileList; // list of files for which scanner info has changed
private Map siChangedForFileMap; // (file, comandId) map for deltas private Map siChangedForFileMap; // (file, comandId) map for deltas
@ -157,8 +171,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
private SortedSet freeCommandIdPool; // sorted set of free command ids private SortedSet freeCommandIdPool; // sorted set of free command ids
private int commandIdCounter = 0; private int commandIdCounter = 0;
private boolean siAvailable; // is there any scanner info discovered
/** /**
* *
*/ */
@ -170,7 +182,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
siChangedForCommandIdList = new ArrayList(); siChangedForCommandIdList = new ArrayList();
freeCommandIdPool = new TreeSet(); freeCommandIdPool = new TreeSet();
siAvailable = false;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -185,7 +196,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
} }
catch (CoreException e) { catch (CoreException e) {
MakeCorePlugin.log(e); MakeCorePlugin.log(e);
siAvailable = false;
} }
} }
@ -253,7 +263,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
* @param file * @param file
* @param object * @param object
*/ */
private void addCompilerCommand(IFile file, CCommandDSC cmd) { void addCompilerCommand(IFile file, CCommandDSC cmd) {
List existingCommands = new ArrayList(sid.commandIdCommandMap.values()); List existingCommands = new ArrayList(sid.commandIdCommandMap.values());
int index = existingCommands.indexOf(cmd); int index = existingCommands.indexOf(cmd);
if (index != -1) { if (index != -1) {
@ -274,38 +284,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
} }
generateFileDelta(file, cmd); generateFileDelta(file, cmd);
// updateFileForCommand(file, cmd);
// Integer commandId = cmd.getCommandIdAsInteger();
// // update sid.commandIdToFilesMap
// Set fileSet = (Set) sid.commandIdToFilesMap.get(commandId);
// if (fileSet == null) {
// fileSet = new HashSet();
// sid.commandIdToFilesMap.put(commandId, fileSet);
// }
// if (fileSet.add(file)) {
// // update fileToCommandIdsMap
// boolean change = true;
// Integer oldCommandId = (Integer) sid.fileToCommandIdMap.get(file);
// if (oldCommandId != null) {
// if (oldCommandId.equals(commandId)) {
// change = false;
// }
// else {
// Set oldFileSet = (Set) sid.commandIdToFilesMap.get(oldCommandId);
// oldFileSet.remove(file);
// }
// }
// if (change) {
// sid.fileToCommandIdMap.put(file, commandId);
// // TODO generate change event for this resource
// IPath path = file.getFullPath();
// if (!siChangedForFileList.contains(path)) {
// siChangedForFileList.add(path);
// }
// }
// }
} }
/** /**
@ -330,7 +308,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
* @param file * @param file
* @param cmd * @param cmd
*/ */
private void applyFileDeltas() { void applyFileDeltas() {
for (Iterator i = siChangedForFileMap.keySet().iterator(); i.hasNext(); ) { for (Iterator i = siChangedForFileMap.keySet().iterator(); i.hasNext(); ) {
IFile file = (IFile) i.next(); IFile file = (IFile) i.next();
Integer commandId = (Integer) siChangedForFileMap.get(file); Integer commandId = (Integer) siChangedForFileMap.get(file);
@ -366,6 +344,16 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
} }
} }
} }
generateProjectScannerInfo();
}
private void generateProjectScannerInfo() {
psi = new ProjectScannerInfo();
psi.includePaths = getAllIncludePaths(INCLUDE_PATH);
psi.quoteIncludePaths = getAllIncludePaths(QUOTE_INCLUDE_PATH);
psi.includeFiles = getAllIncludePaths(INCLUDE_FILE);
psi.macrosFiles = getAllIncludePaths(MACROS_FILE);
psi.definedSymbols = getAllSymbols();
} }
private void removeUnusedCommands() { private void removeUnusedCommands() {
@ -557,10 +545,10 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
} }
sid = new ScannerInfoData(); sid = new ScannerInfoData();
psi = null;
commandIdCounter = 0; commandIdCounter = 0;
freeCommandIdPool.clear(); freeCommandIdPool.clear();
siAvailable = false;
} }
} }
@ -582,33 +570,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
*/ */
public IPath[] getIncludePaths() { public IPath[] getIncludePaths() {
// return new IPath[0]; // return new IPath[0];
List includes = getAllIncludePaths(); return getAllIncludePaths(INCLUDE_PATH);
List finalIncludePaths = new ArrayList(includes.size());
for (Iterator i = includes.iterator(); i.hasNext(); ) {
finalIncludePaths.add(new Path((String) i.next()));
}
return (IPath[])finalIncludePaths.toArray(new IPath[finalIncludePaths.size()]);
}
/**
* @return list of IPath(s).
*/
private List getAllIncludePaths() {
List allIncludes = new ArrayList();
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
Integer cmdId = (Integer) i.next();
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
if (cmd.isDiscovered()) {
List discovered = cmd.getIncludes();
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
String include = (String) j.next();
if (!allIncludes.contains(include)) {
allIncludes.add(include);
}
}
}
}
return allIncludes;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -619,28 +581,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
return getAllSymbols(); return getAllSymbols();
} }
/**
* @return
*/
private Map getAllSymbols() {
Map symbols = new HashMap();
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
Integer cmdId = (Integer) i.next();
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
if (cmd.isDiscovered()) {
List discovered = cmd.getSymbols();
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
String symbol = (String) j.next();
String key = ScannerConfigUtil.getSymbolKey(symbol);
String value = ScannerConfigUtil.getSymbolValue(symbol);
symbols.put(key, value);
}
}
}
return symbols;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludePaths(org.eclipse.core.runtime.IPath) * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludePaths(org.eclipse.core.runtime.IPath)
*/ */
@ -648,14 +588,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command // get the command
CCommandDSC cmd = getCommand(path); CCommandDSC cmd = getCommand(path);
if (cmd != null && cmd.isDiscovered()) { if (cmd != null && cmd.isDiscovered()) {
List includes = cmd.getIncludes(); return stringListToPathArray(cmd.getIncludes());
List includePaths = new ArrayList(includes.size());
for (Iterator i = includes.iterator(); i.hasNext(); ) {
includePaths.add(new Path((String) i.next()));
}
return (IPath[])includePaths.toArray(new IPath[includePaths.size()]);
} }
return new IPath[0]; // use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.includePaths;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -665,14 +604,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command // get the command
CCommandDSC cmd = getCommand(path); CCommandDSC cmd = getCommand(path);
if (cmd != null && cmd.isDiscovered()) { if (cmd != null && cmd.isDiscovered()) {
List includes = cmd.getQuoteIncludes(); return stringListToPathArray(cmd.getQuoteIncludes());
List includePaths = new ArrayList(includes.size());
for (Iterator i = includes.iterator(); i.hasNext(); ) {
includePaths.add(new Path((String) i.next()));
}
return (IPath[])includePaths.toArray(new IPath[includePaths.size()]);
} }
return new IPath[0]; // use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.quoteIncludePaths;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -692,7 +630,11 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
} }
return definedSymbols; return definedSymbols;
} }
return new HashMap(0); // use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.definedSymbols;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -702,9 +644,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command // get the command
CCommandDSC cmd = getCommand(path); CCommandDSC cmd = getCommand(path);
if (cmd != null) { if (cmd != null) {
return cmd.getIncludeFile(); return stringListToPathArray(cmd.getIncludeFile());
} }
return new IPath[0]; // use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.includeFiles;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -714,9 +660,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command // get the command
CCommandDSC cmd = getCommand(path); CCommandDSC cmd = getCommand(path);
if (cmd != null) { if (cmd != null) {
return cmd.getImacrosFile(); return stringListToPathArray(cmd.getImacrosFile());
} }
return new IPath[0]; // use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.macrosFiles;
} }
/* (non-Javadoc) /* (non-Javadoc)
@ -749,4 +699,82 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
return cmd; return cmd;
} }
/**
* @param type can be one of the following:
* <li><code>INCLUDE_PATH</code>
* <li><code>QUOTE_INCLUDE_PATH</code>
* <li><code>INCLUDE_FILE</code>
* <li><code>MACROS_FILE</code>
*
* @return list of IPath(s).
*/
private IPath[] getAllIncludePaths(int type) {
List allIncludes = new ArrayList();
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
Integer cmdId = (Integer) i.next();
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
if (cmd.isDiscovered()) {
List discovered = null;
switch (type) {
case INCLUDE_PATH:
discovered = cmd.getIncludes();
break;
case QUOTE_INCLUDE_PATH:
discovered = cmd.getQuoteIncludes();
break;
case INCLUDE_FILE:
discovered = cmd.getIncludeFile();
break;
case MACROS_FILE:
discovered = cmd.getImacrosFile();
break;
}
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
String include = (String) j.next();
if (!allIncludes.contains(include)) {
allIncludes.add(include);
}
}
}
}
return stringListToPathArray(allIncludes);
}
/**
* @param discovered
* @param allIncludes
* @return
*/
private IPath[] stringListToPathArray(List discovered) {
List allIncludes = new ArrayList(discovered.size());
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
String include = (String) j.next();
if (!allIncludes.contains(include)) {
allIncludes.add(new Path(include));
}
}
return (IPath[])allIncludes.toArray(new IPath[allIncludes.size()]);
}
/**
* @return
*/
private Map getAllSymbols() {
Map symbols = new HashMap();
for (Iterator i = sid.commandIdCommandMap.keySet().iterator(); i.hasNext(); ) {
Integer cmdId = (Integer) i.next();
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
if (cmd.isDiscovered()) {
List discovered = cmd.getSymbols();
for (Iterator j = discovered.iterator(); j.hasNext(); ) {
String symbol = (String) j.next();
String key = ScannerConfigUtil.getSymbolKey(symbol);
String value = ScannerConfigUtil.getSymbolValue(symbol);
symbols.put(key, value);
}
}
}
return symbols;
}
} }