1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Per file scanner info collector and container now support -include and -imacros command line options.

Adding discovered include paths as system paths to so that they can be properly retrieved from IScannerInfo implementation.
Parser needs to be updated to ask IScannerInfoExtension implementation for both user and system include paths.
Fix for ClassCastException in CPPClassType binding.
This commit is contained in:
Vladimir Hirsl 2005-03-31 20:55:29 +00:00
parent cc1cf61ddf
commit 7abf1397a2
11 changed files with 133 additions and 88 deletions

View file

@ -147,7 +147,7 @@ public class MakeScannerProvider extends ScannerProvider {
} }
} }
for (int i = 0; i < includes.length; i++) { for (int i = 0; i < includes.length; i++) {
IIncludeEntry include = CoreModel.newIncludeEntry(info.getProject().getFullPath(), null, new Path(includes[i])); IIncludeEntry include = CoreModel.newIncludeEntry(info.getProject().getFullPath(), null, new Path(includes[i]), true);
if (!cPaths.contains(include)) { if (!cPaths.contains(include)) {
cPaths.add(include); cPaths.add(include);
} }

View file

@ -25,26 +25,31 @@ public interface IDiscoveredPathManager {
/** /**
* Get include paths for the whole project * Get include paths for the whole project
* @return
*/ */
IPath[] getIncludePaths(); IPath[] getIncludePaths();
/** /**
* Get defined symbols for the whole project * Get defined symbols for the whole project
* @return
*/ */
Map getSymbols(); Map getSymbols();
/** /**
* Get include paths for the specific path (file) * Get include paths for the specific path (file)
* @return
*/ */
IPath[] getIncludePaths(IPath path); IPath[] getIncludePaths(IPath path);
/** /**
* Get defined symbols for the specific path (file) * Get defined symbols for the specific path (file)
* @return
*/ */
Map getSymbols(IPath path); Map getSymbols(IPath path);
/**
* Get include files (gcc option -include) for the specific path (file)
*/
IPath[] getIncludeFiles(IPath path);
/**
* Get macro files (gcc option -imacros) for the specific path (file)
*/
IPath[] getMacroFiles(IPath path);
IDiscoveredScannerInfoSerializable getSerializable(); IDiscoveredScannerInfoSerializable getSerializable();
ScannerConfigScope getScope(); ScannerConfigScope getScope();

View file

@ -72,7 +72,7 @@ public abstract class AbstractDiscoveredPathContainer implements IPathEntryConta
Map syms = info.getSymbols(); Map syms = info.getSymbols();
List entries = new ArrayList(includes.length + syms.size()); List entries = new ArrayList(includes.length + syms.size());
for (int i = 0; i < includes.length; i++) { for (int i = 0; i < includes.length; i++) {
entries.add(CoreModel.newIncludeEntry(Path.EMPTY, Path.EMPTY, includes[i])); //$NON-NLS-1$ //$NON-NLS-2$ entries.add(CoreModel.newIncludeEntry(Path.EMPTY, Path.EMPTY, includes[i], true)); //$NON-NLS-1$ //$NON-NLS-2$
} }
Iterator iter = syms.entrySet().iterator(); Iterator iter = syms.entrySet().iterator();
while (iter.hasNext()) { while (iter.hasNext()) {

View file

@ -218,6 +218,20 @@ public class DiscoveredPathInfo implements IDiscoveredPathInfo, IDiscoveredScann
return new HashMap(0); return new HashMap(0);
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludeFiles(org.eclipse.core.runtime.IPath)
*/
public IPath[] getIncludeFiles(IPath path) {
return new IPath[0];
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getMacroFiles(org.eclipse.core.runtime.IPath)
*/
public IPath[] getMacroFiles(IPath path) {
return new IPath[0];
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable() * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable()
*/ */
@ -231,5 +245,5 @@ public class DiscoveredPathInfo implements IDiscoveredPathInfo, IDiscoveredScann
public ScannerConfigScope getScope() { public ScannerConfigScope getScope() {
return ScannerConfigScope.PROJECT_SCOPE; return ScannerConfigScope.PROJECT_SCOPE;
} }
} }

View file

@ -17,8 +17,6 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IIncludeEntry;
import org.eclipse.cdt.core.model.IMacroEntry;
import org.eclipse.cdt.core.model.IPathEntry; import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.core.model.IPathEntryContainerExtension; import org.eclipse.cdt.core.model.IPathEntryContainerExtension;
import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.MakeCorePlugin;
@ -71,40 +69,38 @@ public class PerFileDiscoveredPathContainer extends AbstractDiscoveredPathContai
public IPathEntry[] getPathEntries(IPath path, int mask) { public IPathEntry[] getPathEntries(IPath path, int mask) {
IDiscoveredPathInfo info; IDiscoveredPathInfo info;
ArrayList entries = new ArrayList(); ArrayList entries = new ArrayList();
if ((mask & IPathEntry.CDT_INCLUDE_FILE) != 0) { try {
// TODO: not implemented info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
} if ((mask & IPathEntry.CDT_INCLUDE) != 0) {
if ((mask & IPathEntry.CDT_INCLUDE) != 0) { // TODO: Vlad how do we differentiate local includes from system includes
// TODO: Vlad how do we differentiate local includes from system includes
try {
info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
IPath[] includes = info.getIncludePaths(path); IPath[] includes = info.getIncludePaths(path);
for (int i = 0; i < includes.length; i++) { for (int i = 0; i < includes.length; i++) {
entries.add(CoreModel.newIncludeEntry(path, Path.EMPTY, includes[i], true)); entries.add(CoreModel.newIncludeEntry(path, Path.EMPTY, includes[i], true));
} }
return (IIncludeEntry[])entries.toArray(new IIncludeEntry[entries.size()]); }
} if ((mask & IPathEntry.CDT_MACRO) != 0) {
catch (CoreException e) {
//
}
}
if ((mask & IPathEntry.CDT_MACRO_FILE) != 0) {
// TODO: not implemented
}
if ((mask & IPathEntry.CDT_MACRO) != 0) {
try {
info = MakeCorePlugin.getDefault().getDiscoveryManager().getDiscoveredInfo(fProject);
Map syms = info.getSymbols(path); Map syms = info.getSymbols(path);
for (Iterator iter = syms.entrySet().iterator(); iter.hasNext(); ) { for (Iterator iter = syms.entrySet().iterator(); iter.hasNext(); ) {
Entry entry = (Entry)iter.next(); Entry entry = (Entry)iter.next();
entries.add(CoreModel.newMacroEntry(path, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$ entries.add(CoreModel.newMacroEntry(path, (String)entry.getKey(), (String)entry.getValue())); //$NON-NLS-1$
} }
return (IMacroEntry[])entries.toArray(new IMacroEntry[entries.size()]); }
} if ((mask & IPathEntry.CDT_INCLUDE_FILE) != 0) {
catch (CoreException e) { IPath[] includeFiles = info.getIncludeFiles(path);
// for (int i = 0; i < includeFiles.length; i++) {
} entries.add(CoreModel.newIncludeFileEntry(path, includeFiles[i]));
} }
}
if ((mask & IPathEntry.CDT_MACRO_FILE) != 0) {
IPath[] imacrosFiles = info.getMacroFiles(path);
for (int i = 0; i < imacrosFiles.length; i++) {
entries.add(CoreModel.newMacroFileEntry(path, imacrosFiles[i]));
}
}
}
catch (CoreException e) {
//
}
return (IPathEntry[]) entries.toArray(new IPathEntry[entries.size()]); return (IPathEntry[]) entries.toArray(new IPathEntry[entries.size()]);
} }

View file

@ -14,6 +14,8 @@ 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;
@ -106,9 +108,10 @@ public class CCommandDSC {
commandAsString += optionPair.getValue() + SINGLE_SPACE; commandAsString += optionPair.getValue() + SINGLE_SPACE;
} }
else { else {
// if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString()) || // skip -include and -imacros options
// optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString())) if (optionPair.getKey().equals(SCDOptionsEnum.IMACROS_FILE.toString()) ||
// continue; optionPair.getKey().equals(SCDOptionsEnum.INCLUDE_FILE.toString()))
continue;
commandAsString += optionPair.getKey() + SINGLE_SPACE + commandAsString += optionPair.getKey() + SINGLE_SPACE +
optionPair.getValue() + SINGLE_SPACE; optionPair.getValue() + SINGLE_SPACE;
} }
@ -116,26 +119,26 @@ public class CCommandDSC {
return commandAsString.trim(); return commandAsString.trim();
} }
public String[] getImacrosFile() { public IPath[] 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(optionPair.getValue()); imacrosFiles.add(new Path(optionPair.getValue()));
} }
} }
return (String[]) imacrosFiles.toArray(new String[imacrosFiles.size()]); return (IPath[]) imacrosFiles.toArray(new IPath[imacrosFiles.size()]);
} }
public String[] getIncludeFile() { public IPath[] 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(optionPair.getValue()); includeFiles.add(new Path(optionPair.getValue()));
} }
} }
return (String[]) includeFiles.toArray(new String[includeFiles.size()]); return (IPath[]) includeFiles.toArray(new IPath[includeFiles.size()]);
} }
// public List getFilesList() { // public List getFilesList() {

View file

@ -549,21 +549,15 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
* @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)
*/ */
public IPath[] getIncludePaths(IPath path) { public IPath[] getIncludePaths(IPath path) {
IFile file = project.getWorkspace().getRoot().getFile(path); // get the command
if (file != null) { CCommandDSC cmd = getCommand(path);
Integer cmdId = (Integer) sid.fileToCommandIdMap.get(file); if (cmd != null && cmd.isDiscovered()) {
if (cmdId != null) { List includes = cmd.getIncludes();
// get the command List includePaths = new ArrayList(includes.size());
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId); for (Iterator i = includes.iterator(); i.hasNext(); ) {
if (cmd != null && cmd.isDiscovered()) { includePaths.add(new Path((String) i.next()));
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 (IPath[])includePaths.toArray(new IPath[includePaths.size()]);
} }
return new IPath[0]; return new IPath[0];
} }
@ -572,28 +566,46 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbols(org.eclipse.core.runtime.IPath) * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSymbols(org.eclipse.core.runtime.IPath)
*/ */
public Map getSymbols(IPath path) { public Map getSymbols(IPath path) {
IFile file = project.getFile(path); // get the command
if (file != null) { CCommandDSC cmd = getCommand(path);
Integer cmdId = (Integer) sid.fileToCommandIdMap.get(file); if (cmd != null && cmd.isDiscovered()) {
if (cmdId != null) { List symbols = cmd.getSymbols();
// get the command Map definedSymbols = new HashMap(symbols.size());
CCommandDSC cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId); for (Iterator i = symbols.iterator(); i.hasNext(); ) {
if (cmd != null && cmd.isDiscovered()) { String symbol = (String) i.next();
List symbols = cmd.getSymbols(); String key = ScannerConfigUtil.getSymbolKey(symbol);
Map definedSymbols = new HashMap(symbols.size()); String value = ScannerConfigUtil.getSymbolValue(symbol);
for (Iterator i = symbols.iterator(); i.hasNext(); ) { definedSymbols.put(key, value);
String symbol = (String) i.next();
String key = ScannerConfigUtil.getSymbolKey(symbol);
String value = ScannerConfigUtil.getSymbolValue(symbol);
definedSymbols.put(key, value);
}
return definedSymbols;
}
} }
return definedSymbols;
} }
return new HashMap(0); return new HashMap(0);
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getIncludeFiles(org.eclipse.core.runtime.IPath)
*/
public IPath[] getIncludeFiles(IPath path) {
// get the command
CCommandDSC cmd = getCommand(path);
if (cmd != null) {
return cmd.getIncludeFile();
}
return new IPath[0];
}
/* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getMacroFiles(org.eclipse.core.runtime.IPath)
*/
public IPath[] getMacroFiles(IPath path) {
// get the command
CCommandDSC cmd = getCommand(path);
if (cmd != null) {
return cmd.getImacrosFile();
}
return new IPath[0];
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable() * @see org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo#getSerializable()
*/ */
@ -608,6 +620,23 @@ public class PerFileSICollector implements IScannerInfoCollector2, IScannerInfoC
return ScannerConfigScope.FILE_SCOPE; return ScannerConfigScope.FILE_SCOPE;
} }
/**
* @param path
* @return
*/
private CCommandDSC getCommand(IPath path) {
CCommandDSC cmd = null;
IFile file = project.getWorkspace().getRoot().getFile(path);
if (file != null) {
Integer cmdId = (Integer) sid.fileToCommandIdMap.get(file);
if (cmdId != null) {
// get the command
cmd = (CCommandDSC) sid.commandIdCommandMap.get(cmdId);
}
}
return cmd;
}
} }
} }

View file

@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.IASTServiceProvider.UnsupportedDialectException;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition;
@ -41,15 +42,7 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
/** /**
* A DOMSourceIndexerRunner indexes source files using the DOMAST. The following items are indexed: * A DOMSourceIndexerRunner indexes source files using the DOM AST.
* Declarations:
* - Classes
* - Structs
* - Unions
* References:
* - Classes
* - Structs
* - Unions
* *
* @author vhirsl * @author vhirsl
*/ */
@ -221,6 +214,11 @@ public class DOMSourceIndexerRunner extends AbstractIndexer {
IProblemBinding problemBinding = (IProblemBinding) name.resolveBinding(); IProblemBinding problemBinding = (IProblemBinding) name.resolveBinding();
errorMessage = problemBinding.getMessage(); errorMessage = problemBinding.getMessage();
location = name.getNodeLocations()[0]; location = name.getNodeLocations()[0];
IASTNode node = problemBinding.getASTNode();
// if (node != null && !name.equals(node)) {
// // TODO may require further processing - looking at the IProblemBinding id
// location = node.getNodeLocations()[0];
// }
} }
} }
if (location != null) { if (location != null) {

View file

@ -217,7 +217,7 @@ public class PathEntryManager implements IPathEntryStoreListener, IElementChange
for (int i = 0; i < containers.length; ++i) { for (int i = 0; i < containers.length; ++i) {
if (containers[i] instanceof IPathEntryContainerExtension) { if (containers[i] instanceof IPathEntryContainerExtension) {
IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i]; IPathEntryContainerExtension extension = (IPathEntryContainerExtension)containers[i];
IMacroEntry[] incs = (IMacroEntry[])extension.getPathEntries(resPath, IPathEntry.CDT_MACRO); IPathEntry[] incs = (IPathEntry[])extension.getPathEntries(resPath, IPathEntry.CDT_MACRO);
macroList.addAll(Arrays.asList(incs)); macroList.addAll(Arrays.asList(incs));
} }
} }

View file

@ -582,7 +582,7 @@ public class CPPClassType implements ICPPClassType, ICPPInternalBinding {
} }
} }
} else if( members[i] instanceof IASTFunctionDefinition ){ } else if( members[i] instanceof IASTFunctionDefinition ){
ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration)members[i]).getDeclSpecifier(); ICPPASTDeclSpecifier declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition)members[i]).getDeclSpecifier();
if( declSpec.isFriend() ){ if( declSpec.isFriend() ){
IASTDeclarator dtor = ((IASTFunctionDefinition)members[i]).getDeclarator(); IASTDeclarator dtor = ((IASTFunctionDefinition)members[i]).getDeclarator();
resultSet.put( dtor.getName().resolveBinding() ); resultSet.put( dtor.getName().resolveBinding() );

View file

@ -98,11 +98,11 @@ public class ScannerProvider extends AbstractCExtension implements IScannerInfoP
} }
String[] localIncludes = new String[localCount]; String[] localIncludes = new String[localCount];
String[] systemIncludes = new String[systemCount]; String[] systemIncludes = new String[systemCount];
for (int i = 0; i < includeEntries.length; ++i) { for (int i = 0, j = 0, k = 0; i < includeEntries.length; ++i) {
if (includeEntries[i].isSystemInclude()) { if (includeEntries[i].isSystemInclude()) {
systemIncludes[i] = includeEntries[i].getFullIncludePath().toOSString(); systemIncludes[j++] = includeEntries[i].getFullIncludePath().toOSString();
} else { } else {
localIncludes[i] = includeEntries[i].getFullIncludePath().toOSString(); localIncludes[k++] = includeEntries[i].getFullIncludePath().toOSString();
} }
} }