[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [cdt-dev] Programmatically setting indexer build configuration
|
2009/2/15 <gerhard@xxxxxxxxxxxxxxxxxxx>:
> I tried to set the project description but with no success. I have a build
> configuration specific define switch like "#ifdef XXXXX". In order to read
> programmatically the body within "#ifdef XXXXX" I need to set the indexer
> to automatically follow the build configuration.
> Do I need to build the workspace after changing the index preferences?
Most likely, no, you don't have to. I suppose, Indexer will
automatically re-index the project. But you will have to wait for it.
This is the most difficult part, on my mind. I found that the best way
is to use IndexerSetupParticipant.
Here is the snippet I'm using for this purpose.
class MyIndexerSetupParticipant extends IndexerSetupParticipant
{
private IProject myProject;
MyIndexerSetupParticipant(IProject project) { myProject = project; };
public boolean postponeIndexerSetup(ICProject cProject) {
return (myProject != null && myProject == cProject.getProject());
}
public void notify(ICProject cProject)
{
if(myProject != null && myProject == cProject.getProject())
{
notifyIndexerSetup(cProject);
myProject = null;
}
}
};
public void createProject() throws CoreException {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
final IProject newProjectHandle = root.getProject(DEF_PROJECT_NAME);
IIndexManager indexMgr = CCorePlugin.getIndexManager();
indexSetupParticipant = new MyIndexerSetupParticipant(newProjectHandle);
indexMgr.addIndexerSetupParticipant(indexSetupParticipant);
project = newProjectHandle;
if (!newProjectHandle.exists()) {
IProjectDescription description =
workspace.newProjectDescription(newProjectHandle.getName());
description.setLocationURI(URIUtil.toURI(this.root));
newProjectHandle.create(description, new NullProgressMonitor());
newProjectHandle.open(IResource.NONE, new NullProgressMonitor());
}
if( ! project.isOpen() )
project.open(IResource.NONE, new NullProgressMonitor());
if(! project.hasNature(CProjectNature.C_NATURE_ID) )
{
CProjectNature.addCNature(project, null);
}
MakeProjectNature.addNature(project, null);
ScannerConfigNature.addScannerConfigNature(project);
ScannerConfigNature.initializeDiscoveryOptions(project);
//IScannerConfigBuilderInfo2 scannerConfig =
ScannerConfigProfileManager.createScannerConfigBuildInfo2(project);
configureProject();
ICProject cProject =
CoreModel.getDefault().getCModel().getCProject(project.getName());
indexSetupParticipant.notify(cProject);
indexMgr.removeIndexerSetupParticipant(indexSetupParticipant);
indexSetupParticipant = null;
}
private void configureProject() throws CoreException {
ICProjectDescriptionManager mngr =
CoreModel.getDefault().getProjectDescriptionManager();
ICProjectDescription des = mngr.getProjectDescription(project, true);
ICConfigurationDescription confDes = des.getDefaultSettingConfiguration();
// Configure source paths
confDes.setSourceEntries(null);
ICSourceEntry[] sourceEntries = getModelSourceEntries(componentModel);
confDes.setSourceEntries(sourceEntries);
System.out.println("Configured " +
String.valueOf(sourceEntries.length) + " source directories");
// Configure include paths
ICFolderDescription folderDescription =
confDes.getRootFolderDescription(); // or use
getResourceDescription(IResource), or pick one from
getFolderDescriptions()
ICLanguageSetting[] languageSettings =
folderDescription.getLanguageSettings();
ICLanguageSettingEntry[] projectIncludes = getModelIncludes(componentModel);
ICLanguageSettingEntry[] projectDefines = getModelDefines(componentModel);
for(int idx = 0; idx < languageSettings.length; idx++)
{
ICLanguageSetting lang = languageSettings[idx];
lang.setSettingEntries(ICSettingEntry.INCLUDE_PATH, projectIncludes);
lang.setSettingEntries(ICSettingEntry.MACRO, projectDefines);
}
System.out.println("Configured " +
String.valueOf(projectIncludes.length) + " include directories");
System.out.println("Configured " +
String.valueOf(projectDefines.length) + " definitions");
des.setActiveConfiguration(confDes);
des.setCdtProjectCreated();
mngr.setProjectDescription(project, des, true, null);
// Configure indexer
IIndexManager indexMgr = CCorePlugin.getIndexManager();
ICProject cProject =
CoreModel.getDefault().getCModel().getCProject(project.getName());
indexMgr.setIndexerId(cProject, IPDOMManager.ID_FAST_INDEXER);
}
private void indexProject() throws CoreException, InterruptedException {
IIndexManager indexMgr = CCorePlugin.getIndexManager();
indexMgr.joinIndexer(IIndexManager.FOREVER, new NullProgressMonitor());
}
public void run() {
try {
createProject();
// Run indexer
indexProject();
// Traverse the DOM/AST
traverseIndex();
// Delete project
deleteProject();
}
catch (CoreException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
}
catch (IOException e)
{
}
}