Skip to main content

[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)
		{
		}
	}


Back to the top