1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-19 06:55:23 +02:00

Patch for Sean Evoy

In order to work through CExtensionPoint mechanism, I have to change the 
existing extension point entries for the Managed and Standard builders to 
the following (all future builders will have to conform to this as well):
   <extension
         id="ManagedBuildManager"
         point="org.eclipse.cdt.core.ScannerInfoProvider">
      <cextension>
         <run
 class="org.eclipse.cdt.core.build.managed.ManagedBuildManager">
         </run>
      </cextension>
   </extension>

   <extension
         id="StandardBuildManager"
         point="org.eclipse.cdt.core.ScannerInfoProvider">
      <cextension>
         <run
 class="org.eclipse.cdt.core.build.standard.StandardBuildManager">
         </run>
      </cextension>
   </extension>

As well, the ManagedBuildManager and StandardBuildManager must extend 
AbstractCExtension.

The new project wizards for managed and standard projects have to be 
modified to register the right class as the scanner info providers for the 
project. The example below shows the managed project wizard code, but the 
standard project wizard is similar.
try {
        ICDescriptor desc = 
CCorePlugin.getDefault().getCProjectDescription(project);
        desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
        desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, 
ManagedBuildManager.INTERFACE_IDENTITY);
} <snip>


Clients use a new method defined in CCorePlugin 

public IScannerInfoProvider getScannerInfoProvider(IProject project) {
        IScannerInfoProvider provider = null;
        if (project != null) {
                try {
                        ICDescriptor desc = (ICDescriptor) 
getCProjectDescription(project);
                        ICExtensionReference[] extensions = 
desc.get(BUILD_SCANNER_INFO_UNIQ_ID);
                        if (extensions.length > 0)
                                provider = (IScannerInfoProvider) 
extensions[0].createExtension();
                } catch (CoreException e) {
                }
        }
        return provider;
}

to get the information provider as shown in the updated JUnit test code 
below:
// Find the first IScannerInfoProvider that supplies build info for the 
project
IScannerInfoProvider provider = 
CCorePlugin.getDefault().getScannerInfoProvider(project);
assertNotNull(provider);

As is the case now, clients implement the IScannerInfoChangeListener 
interface and pass themselves to the provider in a subscription message. 
There is also a new method on the IScannerInfoProvider interface that 
allows the client to get information immediately as shown below:
IScannerInfo currentSettings = provider.getScannerInformation(project); 

The ManagedBuildManager::getScannerInfo(IResource) method will be 
deprecated, then removed before the end of this release cycle.
This commit is contained in:
John Camelon 2003-08-13 17:45:38 +00:00
parent fbd1af4e45
commit df11a294b8
15 changed files with 253 additions and 300 deletions

View file

@ -1,3 +1,16 @@
2003-08-13 Sean Evoy
Renamed the 'AllBuildTest' class to 'ManagedBuildTest' and updated the
integration suite class.
* suite/org/eclipse/cdt/core/suite/AutomatedIntegrationSuite.java
This class is renamed. It also has a renamed method 'testProjectCreation'
that creates a project the same way the new project wizard does. It uses
the new discovery mechanism to find the scanner info provider.
* build/org/eclipse/cdt/core/build/managed/tests/ManagedBuildTests.java
Uses the new discovery mechanism to find the scanner info provider.
* build/org/eclipse/cdt/core/build/managed/tests/StandardBuildTests.java
2003-08-12 Bogdan Gheorghe
Changed the order of tests in AutomatedIntegrationSuite to have
the indexing tests run last (the last indexing test shuts down
@ -819,4 +832,3 @@
src/org/eclipse/cdt/testplugin/CProjectHelper.jada
Cleanup of the CProjectHelper file to remove unused imports, commeted out code etc.
>>>>>>> 1.36

View file

@ -19,11 +19,13 @@ import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ManagedCProjectNature;
import org.eclipse.cdt.core.build.managed.BuildException;
import org.eclipse.cdt.core.build.managed.IConfiguration;
import org.eclipse.cdt.core.build.managed.IManagedBuildInfo;
import org.eclipse.cdt.core.build.managed.IOption;
import org.eclipse.cdt.core.build.managed.IOptionCategory;
import org.eclipse.cdt.core.build.managed.IManagedBuildInfo;
import org.eclipse.cdt.core.build.managed.ITarget;
import org.eclipse.cdt.core.build.managed.ITool;
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
@ -32,16 +34,18 @@ import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.internal.core.build.managed.ToolReference;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.NullProgressMonitor;
public class AllBuildTests extends TestCase {
public class ManagedBuildTests extends TestCase {
private static final boolean boolVal = true;
private static final String PROJECT_ID = CCorePlugin.PLUGIN_ID + ".make";
private static final String testConfigName = "test.config.override";
private static final String enumVal = "Another Enum";
private static final String[] listVal = {"_DEBUG", "/usr/include", "libglade.a"};
@ -50,19 +54,19 @@ public class AllBuildTests extends TestCase {
private static final String stringVal = "-c -Wall";
private static final String subExt = "bus";
public AllBuildTests(String name) {
public ManagedBuildTests(String name) {
super(name);
}
public static Test suite() {
TestSuite suite = new TestSuite(AllBuildTests.class.getName());
TestSuite suite = new TestSuite(ManagedBuildTests.class.getName());
suite.addTest(new AllBuildTests("testExtensions"));
suite.addTest(new AllBuildTests("testProject"));
suite.addTest(new AllBuildTests("testConfigurations"));
suite.addTest(new AllBuildTests("testTargetArtifacts"));
suite.addTest(new AllBuildTests("testScannerInfoInterface"));
suite.addTest(new AllBuildTests("cleanup"));
suite.addTest(new ManagedBuildTests("testExtensions"));
suite.addTest(new ManagedBuildTests("testProjectCreation"));
suite.addTest(new ManagedBuildTests("testConfigurations"));
suite.addTest(new ManagedBuildTests("testTargetArtifacts"));
suite.addTest(new ManagedBuildTests("testScannerInfoInterface"));
suite.addTest(new ManagedBuildTests("cleanup"));
return suite;
}
@ -109,6 +113,9 @@ public class AllBuildTests extends TestCase {
* @throws CoreException
*/
public void testScannerInfoInterface(){
// These are the expected path settings
final String[] expectedPaths = {"/usr/include", "/opt/gnome/include", "/home/tester/include"};
// Open the test project
IProject project = null;
try {
@ -144,29 +151,19 @@ public class AllBuildTests extends TestCase {
if (extensionPoint == null) {
fail("Failed to retrieve the extension point ScannerInfoProvider.");
}
IExtension[] extensions = extensionPoint.getExtensions();
IScannerInfoProvider provider = null;
// Find the first IScannerInfoProvider that supplies build info for the project
for (int i = 0; i < extensions.length && provider == null; i++) {
IExtension extension = extensions[i];
IConfigurationElement[] elements = extension.getConfigurationElements();
for (int j = 0; j < elements.length; ++j) {
IConfigurationElement element = elements[j];
if (element.getName().equals("provider")) {
// Check if it handles the info for the project
try {
IScannerInfoProvider temp = (IScannerInfoProvider)element.createExecutableExtension("class");
if (temp.managesResource(project)) {
provider = temp;
break;
}
} catch (CoreException e) {
fail("Failed retrieving scanner info provider from plugin: " + e.getLocalizedMessage());
}
}
}
}
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
assertNotNull(provider);
// Check the build information right away
IScannerInfo currentSettings = provider.getScannerInformation(project);
Map currentSymbols = currentSettings.getDefinedSymbols();
assertTrue(currentSymbols.isEmpty());
String[] currentPaths = currentSettings.getIncludePaths();
assertTrue(Arrays.equals(expectedPaths, currentPaths));
// Now subscribe (note that the method will be called after a change
provider.subscribe(project, new IScannerInfoChangeListener () {
public void changeNotification(IResource project, IScannerInfo info) {
// Test the symbols
@ -177,7 +174,6 @@ public class AllBuildTests extends TestCase {
assertEquals((String)definedSymbols.get("DEBUG"), "");
assertEquals((String)definedSymbols.get("GNOME"), "ME");
// Test the includes path
String[] expectedPaths = {"/usr/include", "/opt/gnome/include", "/home/tester/include"};
String[] actualPaths = info.getIncludePaths();
assertTrue(Arrays.equals(expectedPaths, actualPaths));
}
@ -269,11 +265,13 @@ public class AllBuildTests extends TestCase {
* @throws CoreException
* @throws BuildException
*/
public void testProject() throws BuildException {
public void testProjectCreation() throws BuildException {
// Create new project
IProject project = null;
try {
project = createProject(projectName);
// Now associate the builder with the project
addManagedBuildNature(project);
} catch (CoreException e) {
fail("Test failed on project creation: " + e.getLocalizedMessage());
}
@ -354,6 +352,24 @@ public class AllBuildTests extends TestCase {
ManagedBuildManager.removeBuildInfo(project);
}
private void addManagedBuildNature (IProject project) {
// Add the managed build nature
try {
ManagedCProjectNature.addManagedNature(project, new NullProgressMonitor());
} catch (CoreException e) {
fail("Test failed on adding managed build nature: " + e.getLocalizedMessage());
}
// Associate the project with the managed builder so the clients can get proper information
try {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(project);
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY);
} catch (CoreException e) {
fail("Test failed on adding managed builder as scanner info provider: " + e.getLocalizedMessage());
}
}
/**
* Tests the tool settings through the interface the makefile generator
* uses.
@ -672,19 +688,23 @@ public class AllBuildTests extends TestCase {
*/
private IProject createProject(String name) throws CoreException {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject(name);
if (!project.exists()) {
project.create(null);
IProject newProjectHandle = root.getProject(name);
IProject project = null;
if (!newProjectHandle.exists()) {
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName());
//description.setLocation(root.getLocation());
project = CCorePlugin.getDefault().createCProject(description, newProjectHandle, new NullProgressMonitor(), PROJECT_ID);
} else {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
newProjectHandle.refreshLocal(IResource.DEPTH_INFINITE, null);
project = newProjectHandle;
}
if (!project.isOpen()) {
project.open(null);
}
//CCorePlugin.getDefault().convertProjectToC(project, null, CCorePlugin.PLUGIN_ID + ".make", true);
return project;
}

View file

@ -10,6 +10,7 @@ import junit.framework.TestSuite;
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.build.standard.StandardBuildManager;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
@ -20,9 +21,6 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.NullProgressMonitor;
/**********************************************************************
@ -175,38 +173,6 @@ public class StandardBuildTests extends TestCase {
return project;
}
private IScannerInfoProvider findInfoProvider(IProject project) {
// Use the plugin mechanism to discover the supplier of the path information
IExtensionPoint extensionPoint = CCorePlugin.getDefault().getDescriptor().getExtensionPoint("ScannerInfoProvider");
if (extensionPoint == null) {
fail("StandardBuildTest testScannerListernerInterface failed to retrieve the extension point ScannerInfoProvider.");
}
IExtension[] extensions = extensionPoint.getExtensions();
IScannerInfoProvider provider = null;
// Find the first IScannerInfoProvider that supplies build info for the project
for (int i = 0; i < extensions.length && provider == null; i++) {
IExtension extension = extensions[i];
IConfigurationElement[] elements = extension.getConfigurationElements();
for (int j = 0; j < elements.length; ++j) {
IConfigurationElement element = elements[j];
if (element.getName().equals("provider")) {
// Check if it handles the info for the project
try {
IScannerInfoProvider temp = (IScannerInfoProvider)element.createExecutableExtension("class");
if (temp.managesResource(project)) {
provider = temp;
break;
}
} catch (CoreException e) {
fail("Failed retrieving scanner info provider from plugin: " + e.getLocalizedMessage());
}
}
}
}
return provider;
}
/**
* Remove the <code>IProject</code> with the name specified in the argument from the
* receiver's workspace.
@ -299,6 +265,15 @@ public class StandardBuildTests extends TestCase {
fail("StandardBuildTest testProjectCreation failed getting nature: " + e.getLocalizedMessage());
}
// Associate the project with the standard builder so the clients can get proper information
try {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(project);
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, StandardBuildManager.INTERFACE_IDENTITY);
} catch (CoreException e) {
fail("StandardBuildTest testProjectCreation failed setting the StandardBuildManager: " + e.getLocalizedMessage());
}
// Check the default settings
checkDefaultProjectSettings(project);
}
@ -353,9 +328,21 @@ public class StandardBuildTests extends TestCase {
assertNotNull(project);
// Find the scanner info provider for this project
IScannerInfoProvider provider = findInfoProvider(project);
IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(project);
assertNotNull(provider);
// Check out the information we can get through the interface
IScannerInfo currentSettings = provider.getScannerInformation(project);
Map currentSymbols = currentSettings.getDefinedSymbols();
assertTrue(currentSymbols.containsKey("_RELEASE"));
assertEquals("", currentSymbols.get("_RELEASE"));
assertTrue(currentSymbols.containsKey("YES"));
assertEquals("1", currentSymbols.get("YES"));
assertTrue(currentSymbols.containsKey("NO"));
assertEquals("", currentSymbols.get("NO"));
String[] currentPaths = currentSettings.getIncludePaths();
assertTrue(Arrays.equals(OVR_INC_PATHS, currentPaths));
// Remove what's there
StandardBuildManager.setIncludePaths(project, new String[0]);
StandardBuildManager.setPreprocessorSymbols(project, new String[0]);

View file

@ -17,7 +17,7 @@ import junit.framework.TestResult;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import org.eclipse.cdt.core.build.managed.tests.AllBuildTests;
import org.eclipse.cdt.core.build.managed.tests.ManagedBuildTests;
import org.eclipse.cdt.core.build.managed.tests.StandardBuildTests;
import org.eclipse.cdt.core.codeassist.tests.CompletionProposalsTest;
import org.eclipse.cdt.core.indexer.tests.IndexManagerTests;
@ -80,7 +80,7 @@ public class AutomatedIntegrationSuite extends TestSuite
suite.addTest(suite.new GenerateReport("startSuccessTests"));
// Add all success tests
suite.addTest(AllBuildTests.suite());
suite.addTest(ManagedBuildTests.suite());
suite.addTest(StandardBuildTests.suite());
suite.addTest(ParserTestSuite.suite());
suite.addTest(AllCoreTests.suite());

View file

@ -1,12 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="build/"/>
<classpathentry kind="src" path="index/"/>
<classpathentry kind="src" path="model/"/>
<classpathentry kind="src" path="src/"/>
<classpathentry kind="src" path="utils/"/>
<classpathentry kind="src" path="build"/>
<classpathentry kind="src" path="dom"/>
<classpathentry kind="src" path="parser"/>
<classpathentry kind="src" path="parser/"/>
<classpathentry kind="src" path="dom/"/>
<classpathentry kind="src" path="search/"/>
<classpathentry kind="src" path="dependency/"/>
<classpathentry kind="src" path="/org.eclipse.core.resources"/>
<classpathentry kind="src" path="/org.eclipse.core.runtime"/>
<classpathentry kind="src" path="/org.apache.xerces"/>
@ -14,8 +16,6 @@
<classpathentry kind="src" path="/org.eclipse.compare"/>
<classpathentry kind="src" path="/org.eclipse.debug.core"/>
<classpathentry kind="src" path="/org.eclipse.core.boot"/>
<classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
<classpathentry kind="src" path="search"/>
<classpathentry kind="src" path="dependency"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View file

@ -1,3 +1,31 @@
2003-08-13 Sean Evoy
The major change in the increment of work is the new discovery mechanism
that clients will use to find the IScannerInfoProvider for a project.
Rather than a simple extension point which requires the client to iterate
over all registered providers, the CExtension feature will be used to
register the provider at project creation time, and to find the provider
at runtime.
Changed the plugin entries for the two builders currently described. The
schema for the ScannerInfoProvider was removed, and the plugin description
was converted to work with the CExtension feature.
* plugin.xml
* schema/ScannerInfoProvider.exsd (removed)
Added a method to find and create the provider described in the extension point.
Used by clients at runtime to discover the provider.
* src/org/eclipse/cdt/core/CCorePlugin.java
Changed the IScannerInfoProvider interface by removing the 'managesResource'
method (no more iteration required) and adding a method so clients can get
build information as soon as they get the provider and before they subscribe.
* parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java
Updated the two classes that implemet the interface and made them inherit from
AbstractCExtension in order to be managed by the CExtension feature.
* build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
* build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java
2003-08-12 Hoda Amer
Moved CharOperations and Utils from internal.core.search to internal.core
Added CConventions class to validate class names

View file

@ -28,6 +28,7 @@ import org.apache.xml.serialize.Method;
import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.Serializer;
import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.parser.*;
import org.eclipse.cdt.internal.core.build.managed.ManagedBuildInfo;
@ -48,13 +49,13 @@ import org.w3c.dom.Node;
* This is the main entry point for getting at the build information
* for the managed build system.
*/
public class ManagedBuildManager implements IScannerInfoProvider {
public class ManagedBuildManager extends AbstractCExtension implements IScannerInfoProvider {
private static final QualifiedName buildInfoProperty
= new QualifiedName(CCorePlugin.PLUGIN_ID, "managedBuildInfo");
private static final QualifiedName buildInfoProperty = new QualifiedName(CCorePlugin.PLUGIN_ID, "managedBuildInfo");
private static final String ROOT_ELEM_NAME = "ManagedProjectBuildInfo";
private static final String FILE_NAME = ".cdtbuild";
private static final ITarget[] emptyTargets = new ITarget[0];
public static final String INTERFACE_IDENTITY = CCorePlugin.PLUGIN_ID + "." + "ManagedBuildManager";
// Targets defined by extensions (i.e., not associated with a resource)
private static boolean extensionTargetsLoaded = false;
@ -450,10 +451,9 @@ public class ManagedBuildManager implements IScannerInfoProvider {
* Answers with an interface to the parse information that has been
* associated with the resource specified in the argument.
*
* NOTE: This method is not part of the registration interface. It has
* been made public as a short-term workaround for the clients of the
* scanner information until the redesign of the build information management
* occurs.
* @deprecated This method is not part of the registration interface.
* Clients of build information should now use getScannerInformation(IResource)
* for one-time information requests.
*
* @param resource
* @return
@ -462,6 +462,13 @@ public class ManagedBuildManager implements IScannerInfoProvider {
return (IScannerInfo) getBuildInfo(resource, false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#getScannerInformation(org.eclipse.core.resources.IResource)
*/
public IScannerInfo getScannerInformation(IResource resource) {
return (IScannerInfo) getBuildInfo(resource, false);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
*/
@ -488,41 +495,6 @@ public class ManagedBuildManager implements IScannerInfoProvider {
}
}
// TODO Remove all of the IScannerInfoProvider interface methods when
// the discovery mechanism is solidified
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#managesResource(org.eclipse.core.resources.IResource)
*/
public boolean managesResource(IResource resource) {
// The managed build manager manages build information for the
// resource IFF it it is a project and has a build file with the proper
// root element
IProject project = null;
if (resource instanceof IProject){
project = (IProject)resource;
} else if (resource instanceof IFile) {
project = ((IFile)resource).getProject();
} else {
return false;
}
IFile file = project.getFile(FILE_NAME);
if (file.exists()) {
try {
InputStream stream = file.getContents();
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(stream);
Node rootElement = document.getFirstChild();
if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
return true;
}
} catch (Exception e) {
return false;
}
}
return false;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
*/
@ -544,6 +516,4 @@ public class ManagedBuildManager implements IScannerInfoProvider {
map.put(project, list);
}
}
}

View file

@ -7,6 +7,7 @@ import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import org.eclipse.cdt.core.AbstractCExtension;
import org.eclipse.cdt.core.BuildInfoFactory;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
@ -21,7 +22,6 @@ import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.QualifiedName;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
@ -34,11 +34,13 @@ import org.w3c.dom.NodeList;
* IBM Rational Software - Initial API and implementation
***********************************************************************/
public class StandardBuildManager implements IScannerInfoProvider {
public class StandardBuildManager extends AbstractCExtension implements IScannerInfoProvider {
// Name we will use to store build property with the project
private static final QualifiedName buildInfoProperty
= new QualifiedName(CCorePlugin.PLUGIN_ID, "standardBuildInfo");
private static final String ID = CCorePlugin.PLUGIN_ID + ".standardBuildInfo";
// This is the id of the IScannerInfoProvider extension point entry
public static final String INTERFACE_IDENTITY = CCorePlugin.PLUGIN_ID + "." + "StandardBuildManager";
// Listeners interested in build model changes
private static Map buildModelListeners;
@ -91,30 +93,6 @@ public class StandardBuildManager implements IScannerInfoProvider {
return buildModelListeners;
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#managesResource(org.eclipse.core.resources.IResource)
*/
public boolean managesResource(IResource resource) throws CoreException {
/*
* Answers true if this project has a build info associated with it
*/
IProject project = null;
if (resource instanceof IProject) {
project = (IProject)resource;
} else if (resource instanceof IFile) {
project = ((IFile)resource).getProject();
} else {
return false;
}
// Look for (but do not create) the build information
IStandardBuildInfo info = getBuildInfo(project);
// If there's info, I manage the resource
return info == null ? false : true;
}
public static void setPreprocessorSymbols(IProject project, String[] symbols)
throws CoreException
{
@ -162,6 +140,19 @@ public class StandardBuildManager implements IScannerInfoProvider {
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.parser.IScannerInfoProvider#getScannerInformation(org.eclipse.core.resources.IResource)
*/
public IScannerInfo getScannerInformation(IResource resource) {
IStandardBuildInfo info;
try {
info = getBuildInfo((IProject)resource);
} catch (CoreException e) {
return null;
}
return (IScannerInfo)info;
}
/*
* Loads the build file and parses the nodes for build information. The
* information is then associated with the resource for the duration of
@ -266,4 +257,5 @@ public class StandardBuildManager implements IScannerInfoProvider {
map.put(project, list);
}
}
}

View file

@ -1,7 +1,6 @@
package org.eclipse.cdt.core.parser;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
@ -16,6 +15,15 @@ import org.eclipse.core.runtime.CoreException;
public interface IScannerInfoProvider {
/**
* The receiver will answer the current state of the build information for the
* resource specified in the argument.
*
* @param resource
* @return
*/
public IScannerInfo getScannerInformation(IResource resource);
/**
* The receiver will register the listener specified in the argument
* to receive change notifications when the information for the
@ -25,15 +33,6 @@ public interface IScannerInfoProvider {
*/
public void subscribe(IResource resource, IScannerInfoChangeListener listener);
/**
* Answers <code>true</code> if the receiver has information for
* the resource specified in the argument, else <code>false</code>.
*
* @param resource
* @return
*/
public boolean managesResource(IResource resource) throws CoreException;
/**
* The receiver will no longer notify the listener specified in
* the argument when information about the reource it is responsible

View file

@ -33,7 +33,7 @@
<extension-point id="CBuildVariable" name="C/C++ Build Variable" schema="schema/CBuildVariable.exsd"/>
<extension-point id="CToolType" name="C/C++ Tool Type" schema="schema/CToolType.exsd"/>
<extension-point id="ManagedBuildInfo" name="Managed Build Tools" schema="schema/ManagedBuildTools.exsd"/>
<extension-point id="ScannerInfoProvider" name="Scanner Information Provider" schema="schema/ScannerInfoProvider.exsd"/>
<extension-point id="ScannerInfoProvider" name="Scanner Information Provider"/>
<extension
point="org.eclipse.cdt.core.CToolType">
@ -281,19 +281,24 @@
</ignore>
</extension>
<extension
id="org.eclipse.cdt.core.ScannerInfoProvider"
name="Scanner Information Provider"
id="ManagedBuildManager"
point="org.eclipse.cdt.core.ScannerInfoProvider">
<provider
class="org.eclipse.cdt.core.build.managed.ManagedBuildManager"
id="org.eclipse.cdt.core.provider.managed">
</provider>
<provider
class="org.eclipse.cdt.core.build.standard.StandardBuildManager"
id="org.eclipse.cdt.core.provider.standard">
</provider>
<cextension>
<run
class="org.eclipse.cdt.core.build.managed.ManagedBuildManager">
</run>
</cextension>
</extension>
<extension
id="StandardBuildManager"
point="org.eclipse.cdt.core.ScannerInfoProvider">
<cextension>
<run
class="org.eclipse.cdt.core.build.standard.StandardBuildManager">
</run>
</cextension>
</extension>
<extension id="task" name="%CTaskName" point="org.eclipse.core.resources.markers">
<super type="org.eclipse.core.resources.taskmarker"/>
<persistent value="true"/>

View file

@ -1,121 +0,0 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Schema file written by PDE -->
<schema targetNamespace="org.eclipse.cdt.core">
<annotation>
<appInfo>
<meta.schema plugin="org.eclipse.cdt.core" id="ScannerInfoProvider" name="Scanner Information Provider"/>
</appInfo>
<documentation>
This extension point provides a mechanism for the clients of the scanner to discover providers of information the scanner requires to function properly. This information is usually provided by a build system.
</documentation>
</annotation>
<element name="extension">
<complexType>
<sequence>
<element ref="provider" minOccurs="1" maxOccurs="unbounded"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="provider">
<complexType>
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
A unique name that will be used to reference this parser.
</documentation>
</annotation>
</attribute>
<attribute name="class" type="string">
<annotation>
<documentation>
A fully qualified name of the Java class that implements &lt;samp&gt;org.eclipse.cdt.core.parser.IScannerProviderInfo&lt;/samp&gt; interface
</documentation>
<appInfo>
<meta.attribute kind="java" basedOn="org.eclipse.cdt.core.parser.IScannerProviderInfo"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
<annotation>
<appInfo>
<meta.section type="since"/>
</appInfo>
<documentation>
1.2
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="examples"/>
</appInfo>
<documentation>
[Enter extension point usage example here.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="apiInfo"/>
</appInfo>
<documentation>
The following is an example of the extension point usage:
&lt;p&gt;
&lt;pre&gt;
&lt;extension
id=&quot;org.eclipse.cdt.core.ScannerInfoProvider&quot;
name=&quot;Scanner Information Provider&quot;
point=&quot;org.eclipse.cdt.core.ScannerInfoProvider&quot;&gt;
&lt;provider
id=&quot;org.eclipse.cdt.core.provider.managed&quot;
class=&quot;org.eclipse.cdt.core.build.managed.ManagedBuildManager&quot;&gt;
&lt;/provider&gt;
&lt;/extension&gt;
&lt;/pre&gt;
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="implementation"/>
</appInfo>
<documentation>
[Enter information about supplied implementation of this extension point.]
</documentation>
</annotation>
<annotation>
<appInfo>
<meta.section type="copyright"/>
</appInfo>
<documentation>
</documentation>
</annotation>
</schema>

View file

@ -16,6 +16,7 @@ import java.util.ResourceBundle;
import org.eclipse.cdt.core.index.IndexModel;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.internal.core.CDescriptorManager;
import org.eclipse.cdt.internal.core.CPathEntry;
@ -58,6 +59,11 @@ public class CCorePlugin extends Plugin {
public final static String DEFAULT_BINARY_PARSER_UNIQ_ID = PLUGIN_ID + "." + DEFAULT_BINARY_PARSER_SIMPLE_ID;
public final static String PREF_USE_NEW_PARSER = "useNewParser";
// Build Model Interface Discovery
public final static String BUILD_SCANNER_INFO_SIMPLE_ID = "ScannerInfoProvider";
public final static String BUILD_SCANNER_INFO_UNIQ_ID = PLUGIN_ID + "." + BUILD_SCANNER_INFO_SIMPLE_ID;
/**
* Possible configurable option ID.
* @see #getDefaultOptions
@ -697,6 +703,21 @@ public class CCorePlugin extends Plugin {
return null;
}
public IScannerInfoProvider getScannerInfoProvider(IProject project) {
IScannerInfoProvider provider = null;
if (project != null) {
try {
ICDescriptor desc = (ICDescriptor) getCProjectDescription(project);
ICExtensionReference[] extensions = desc.get(BUILD_SCANNER_INFO_UNIQ_ID);
if (extensions.length > 0)
provider = (IScannerInfoProvider) extensions[0].createExtension();
} catch (CoreException e) {
}
}
return provider;
}
// Preference to turn on/off the new parser
public void setUseNewParser(boolean useNewParser) {
getPluginPreferences().setValue(PREF_USE_NEW_PARSER, useNewParser);

View file

@ -1,3 +1,19 @@
2003-08-13 Sean Evoy
A simple change to add transparency information to the build property page
GIFs. They were not being drawn properly on Solaris/Motif and would probably
have shown the same behaviour on Linux. Now, they all get blitted correctly
even with a different widget background colour.
* icons/full/build16/build_configs.gif
* icons/full/build16/config-category.gif
* icons/full/build16/config-tool.gif
Updated the new project wizard to register the correct build manager at
project creation time. We have switched to using the CDescriptor mechanism
for provider discovery. In order for the to work, the project has to be updated
properly and the only time it can be easily done is at creation time.
* build/org/eclipse/cdt/ui/build/wizards/ManagedProjectWizard.java
* src/org/eclipse/cdt/ui/wizards/CProjectWizard.java
2003-08-13 John Camelon
Fixed Bug 41480 - ceditor extension point is not default editor for C++ file extensions

View file

@ -12,6 +12,7 @@ package org.eclipse.cdt.ui.build.wizards;
***********************************************************************/
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.ManagedCProjectNature;
import org.eclipse.cdt.core.build.managed.BuildException;
import org.eclipse.cdt.core.build.managed.IConfiguration;
@ -108,6 +109,16 @@ public abstract class ManagedProjectWizard extends CProjectWizard {
} catch (BuildException e) {
e.printStackTrace();
}
// Associate the project with the managed builder so the clients can get proper information
try {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(project);
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY);
} catch (CoreException e) {
// TODO Flag the error to the user
}
// Save the build options
monitor.subTask("Saving new build options.");
ManagedBuildManager.saveBuildInfo(project);

View file

@ -10,6 +10,8 @@ import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ICDescriptor;
import org.eclipse.cdt.core.build.standard.StandardBuildManager;
import org.eclipse.cdt.internal.ui.CPluginImages;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.utils.ui.swt.IValidation;
@ -59,6 +61,7 @@ public abstract class CProjectWizard extends BasicNewResourceWizard implements I
private static final String WINDOW_TITLE = "CProjectWizard.windowTitle"; //$NON-NLS-1$
private String wz_title;
private String wz_desc;
private String op_error;
@ -279,6 +282,16 @@ public abstract class CProjectWizard extends BasicNewResourceWizard implements I
protected void doRun(IProgressMonitor monitor) throws CoreException {
createNewProject(monitor);
// Associate the project with the standard builder so the clients can get proper information
try {
ICDescriptor desc = CCorePlugin.getDefault().getCProjectDescription(newProject);
desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID);
desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, StandardBuildManager.INTERFACE_IDENTITY);
} catch (CoreException e) {
// TODO Flag the error to the user
}
}
/**