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.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@ -122,26 +120,32 @@ public class CCommandDSC {
return commandAsString.trim();
}
public IPath[] getImacrosFile() {
/**
* @return list of strings
*/
public List getImacrosFile() {
List imacrosFiles = new ArrayList();
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
KVStringPair optionPair = (KVStringPair)i.next();
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();
for (Iterator i = compilerCommand.iterator(); i.hasNext(); ) {
KVStringPair optionPair = (KVStringPair)i.next();
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() {
@ -167,7 +171,7 @@ public class CCommandDSC {
}
/**
* @return Returns the includes.
* @return Returns the includes as strings.
*/
public List getIncludes() {
return includes;
@ -179,13 +183,13 @@ public class CCommandDSC {
this.includes = includes;
}
/**
* @return Returns the quote include paths (for #include "...")
* @return Returns the quote include paths as strings (for #include "...")
*/
public List getQuoteIncludes() {
return quoteIncludes;
}
/**
* @param includes. Quaote include paths (for #include "...")
* @param includes. Quote include paths (for #include "...")
*/
public void setQuoteIncludes(List includes) {
quoteIncludes = includes;

View file

@ -55,6 +55,11 @@ import org.w3c.dom.NodeList;
* @author vhirsl
*/
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 {
private Map commandIdToFilesMap; // command id and set of files it applies to
private Map fileToCommandIdMap; // maps each file to the corresponding command id
@ -136,7 +141,15 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
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$
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 PATH_ATTR = "path"; //$NON-NLS-1$
private IProject project;
IProject project;
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 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 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();
freeCommandIdPool = new TreeSet();
siAvailable = false;
}
/* (non-Javadoc)
@ -185,7 +196,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
}
catch (CoreException e) {
MakeCorePlugin.log(e);
siAvailable = false;
}
}
@ -253,7 +263,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
* @param file
* @param object
*/
private void addCompilerCommand(IFile file, CCommandDSC cmd) {
void addCompilerCommand(IFile file, CCommandDSC cmd) {
List existingCommands = new ArrayList(sid.commandIdCommandMap.values());
int index = existingCommands.indexOf(cmd);
if (index != -1) {
@ -274,38 +284,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
}
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 cmd
*/
private void applyFileDeltas() {
void applyFileDeltas() {
for (Iterator i = siChangedForFileMap.keySet().iterator(); i.hasNext(); ) {
IFile file = (IFile) i.next();
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() {
@ -557,10 +545,10 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
}
sid = new ScannerInfoData();
psi = null;
commandIdCounter = 0;
freeCommandIdPool.clear();
siAvailable = false;
}
}
@ -582,33 +570,7 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
*/
public IPath[] getIncludePaths() {
// return new IPath[0];
List includes = getAllIncludePaths();
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;
return getAllIncludePaths(INCLUDE_PATH);
}
/* (non-Javadoc)
@ -619,28 +581,6 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
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)
* @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
CCommandDSC cmd = getCommand(path);
if (cmd != null && cmd.isDiscovered()) {
List includes = 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 stringListToPathArray(cmd.getIncludes());
}
return new IPath[0];
// use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.includePaths;
}
/* (non-Javadoc)
@ -665,14 +604,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command
CCommandDSC cmd = getCommand(path);
if (cmd != null && cmd.isDiscovered()) {
List includes = 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 stringListToPathArray(cmd.getQuoteIncludes());
}
return new IPath[0];
// use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.quoteIncludePaths;
}
/* (non-Javadoc)
@ -692,7 +630,11 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
}
return definedSymbols;
}
return new HashMap(0);
// use project scope scanner info
if (psi == null) {
generateProjectScannerInfo();
}
return psi.definedSymbols;
}
/* (non-Javadoc)
@ -702,9 +644,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command
CCommandDSC cmd = getCommand(path);
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)
@ -714,9 +660,13 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
// get the command
CCommandDSC cmd = getCommand(path);
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)
@ -749,4 +699,82 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
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;
}
}