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

Utility function added: PerProjectSICollector.calculateCompilerBuiltins(IProject)

Static method to return compiler built-in scanner info.
This commit is contained in:
Vladimir Hirsl 2005-04-18 18:40:44 +00:00
parent 03c02af46b
commit f91d763e74
3 changed files with 162 additions and 0 deletions

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.make.internal.core.scannerconfig2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
@ -19,14 +20,22 @@ import java.util.Map;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.IPathEntry;
import org.eclipse.cdt.make.core.MakeCorePlugin;
import org.eclipse.cdt.make.core.MakeProjectNature;
import org.eclipse.cdt.make.core.scannerconfig.IExternalScannerInfoProvider;
import org.eclipse.cdt.make.core.scannerconfig.IScannerConfigBuilderInfo2;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector2;
import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollectorCleaner;
import org.eclipse.cdt.make.core.scannerconfig.ScannerInfoTypes;
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IDiscoveredPathInfo;
import org.eclipse.cdt.make.core.scannerconfig.IDiscoveredPathManager.IPerProjectDiscoveredPathInfo;
import org.eclipse.cdt.make.internal.core.MakeMessages;
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathContainer;
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredPathInfo;
import org.eclipse.cdt.make.internal.core.scannerconfig.DiscoveredScannerInfoStore;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
@ -36,8 +45,11 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.w3c.dom.Element;
/**
@ -424,4 +436,62 @@ public class PerProjectSICollector implements IScannerInfoCollector2, IScannerIn
return pathInfo;
}
/**
* Static method to return compiler built-in scanner info.
* Preconditions: resource has to be contained by a project that has following natures:
* C nature, CC nature (for C++ projects), Make nature and ScannerConfig nature
*
* @param project
* @throws CModelException
*/
public static void calculateCompilerBuiltins(final IProject project) throws CModelException {
createDiscoveredPathContainer(project, new NullProgressMonitor());
String scdProfileId = ScannerConfigProfileManager.PER_PROJECT_PROFILE_ID;
SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
getSCProfileInstance(project, scdProfileId);
final IScannerConfigBuilderInfo2 buildInfo = ScannerConfigProfileManager.
createScannerConfigBuildInfo2(MakeCorePlugin.getDefault().getPluginPreferences(),
scdProfileId, true);
final IScannerInfoCollector collector = profileInstance.getScannerInfoCollector();
if (collector instanceof IScannerInfoCollectorCleaner) {
((IScannerInfoCollectorCleaner) collector).deleteAll(project);
}
final IExternalScannerInfoProvider esiProvider = profileInstance.createExternalScannerInfoProvider("specsFile");//$NON-NLS-1$
// Set the arguments for the provider
ISafeRunnable runnable = new ISafeRunnable() {
public void run() throws CoreException {
IProgressMonitor monitor = new NullProgressMonitor();
esiProvider.invokeProvider(monitor, project, "specsFile", buildInfo, collector);//$NON-NLS-1$
if (collector instanceof IScannerInfoCollector2) {
IScannerInfoCollector2 collector2 = (IScannerInfoCollector2) collector;
collector2.updateScannerConfiguration(monitor);
}
}
public void handleException(Throwable exception) {
if (exception instanceof OperationCanceledException) {
throw (OperationCanceledException) exception;
}
}
};
Platform.run(runnable);
}
private static void createDiscoveredPathContainer(IProject project, IProgressMonitor monitor) throws CModelException {
IPathEntry container = CoreModel.newContainerEntry(DiscoveredPathContainer.CONTAINER_ID);
ICProject cProject = CoreModel.getDefault().create(project);
if (cProject != null) {
IPathEntry[] entries = cProject.getRawPathEntries();
List newEntries = new ArrayList(Arrays.asList(entries));
if (!newEntries.contains(container)) {
newEntries.add(container);
cProject.setRawPathEntries((IPathEntry[])newEntries.toArray(new IPathEntry[newEntries.size()]), monitor);
}
}
// create a new discovered scanner config store
MakeCorePlugin.getDefault().getDiscoveryManager().removeDiscoveredInfo(project);
}
}

View file

@ -35,6 +35,7 @@ public class AllStandardBuildTests extends TestSuite {
TestSuite suite = new AllStandardBuildTests("Test for org.eclipse.cdt.standardbuild.core.tests");
//$JUnit-BEGIN$
suite.addTestSuite(ScannerConfigConsoleParserTests.class);
suite.addTestSuite(ScannerConfigDiscoveryTests.class);
//$JUnit-END$
return suite;
}

View file

@ -0,0 +1,91 @@
/**********************************************************************
* Copyright (c) 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
**********************************************************************/
package org.eclipse.cdt.standardbuilder.core.tests;
import java.io.ByteArrayInputStream;
import java.util.Map;
import junit.framework.TestCase;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.make.core.MakeProjectNature;
import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature;
import org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector;
import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
/**
* Scanner configuration discovery tests
*
* @author vhirsl
*/
public class ScannerConfigDiscoveryTests extends TestCase {
private IProject fCProject = null;
private IFile fCFile = null;
IProgressMonitor fMonitor = null;
/**
* @param name
*/
public ScannerConfigDiscoveryTests(String name) {
super(name);
}
protected void setUp() throws Exception {
fMonitor = new NullProgressMonitor();
fCProject = ManagedBuildTestHelper.createProject("SCD");
fCFile = fCProject.getProject().getFile("main.c");
if (!fCFile.exists()) {
fCFile.create(new ByteArrayInputStream(" \n".getBytes()), false, fMonitor);
}
}
protected void tearDown() throws Exception {
ManagedBuildTestHelper.removeProject("SCDC");
}
public void testGetCCompilerBuiltins() throws CoreException {
MakeProjectNature.addNature(fCProject, fMonitor);
ScannerConfigNature.addScannerConfigNature(fCProject);
PerProjectSICollector.calculateCompilerBuiltins(fCProject);
IScannerInfo scInfo = CCorePlugin.getDefault().getScannerInfoProvider(fCProject).
getScannerInformation(fCFile);
assertNotNull(scInfo);
String[] includes = scInfo.getIncludePaths();
assertTrue(includes.length > 0);
Map symbols = scInfo.getDefinedSymbols();
assertFalse(symbols.isEmpty());
}
public void testGetCCCompilerBuiltins() throws CoreException {
CCProjectNature.addCCNature(fCProject, fMonitor);
MakeProjectNature.addNature(fCProject, fMonitor);
ScannerConfigNature.addScannerConfigNature(fCProject);
PerProjectSICollector.calculateCompilerBuiltins(fCProject);
IScannerInfo scInfo = CCorePlugin.getDefault().getScannerInfoProvider(fCProject).
getScannerInformation(fCFile);
assertNotNull(scInfo);
String[] includes = scInfo.getIncludePaths();
assertTrue(includes.length > 0);
Map symbols = scInfo.getDefinedSymbols();
assertFalse(symbols.isEmpty());
}
}