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

Merge remote-tracking branch 'cdt/master' into sd90

This commit is contained in:
Andrew Gvozdev 2012-04-26 09:04:09 -04:00
commit 2876909d25
90 changed files with 5620 additions and 563 deletions

View file

@ -1,3 +1,8 @@
2012-04-20 Jeff Johnston <jjohnstn@redhat.com>
* META-INF/MANIFEST.MF: Bump up version to 1.1.0.
* pom.xml: Ditto.
2012-04-11 Jeff Johnston <jjohnstn@redhat.com>
Bug #375007 fix from Anna Dushistova

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name.0
Bundle-SymbolicName: org.eclipse.cdt.autotools.core;singleton:=true
Bundle-Version: 1.0.2.qualifier
Bundle-Version: 1.1.0.qualifier
Bundle-Activator: org.eclipse.cdt.autotools.core.AutotoolsPlugin
Bundle-Localization: plugin
Require-Bundle: org.eclipse.ui;bundle-version="3.4.0",

View file

@ -11,7 +11,7 @@
<relativePath>../../pom.xml</relativePath>
</parent>
<version>1.0.2-SNAPSHOT</version>
<version>1.1.0-SNAPSHOT</version>
<artifactId>org.eclipse.cdt.autotools.core</artifactId>
<packaging>eclipse-plugin</packaging>
</project>
</project>

View file

@ -18,10 +18,9 @@
<build>
<plugins>
<plugin>
<!-- Change to groupId org.eclipse.tycho.extras after upgrade to Tycho 0.14 -->
<groupId>com.google.code.tycho-eclipserun-plugin</groupId>
<groupId>org.eclipse.tycho.extras</groupId>
<artifactId>tycho-eclipserun-plugin</artifactId>
<version>${tycho-version}</version>
<version>${tycho-extras-version}</version>
<configuration>
<appArgLine>-application org.eclipse.ant.core.antRunner -buildfile build-index.xml build.index</appArgLine>
<dependencies>

View file

@ -15,13 +15,14 @@
<artifactId>org.eclipse.cdt.autotools.tests</artifactId>
<packaging>eclipse-test-plugin</packaging>
<repositories>
<!-- Uncommenting this is useful when the repo is built first then you want to run tests on this plugin only -->
<!-- <repositories>
<repository>
<id>cdt.repo</id>
<url>file:/${basedir}/../../releng/org.eclipse.cdt.repo/target/repository</url>
<layout>p2</layout>
</repository>
</repositories>
</repositories>-->
<build>
<plugins>

View file

@ -15,13 +15,14 @@
<artifactId>org.eclipse.cdt.managedbuilder.core.tests</artifactId>
<packaging>eclipse-test-plugin</packaging>
<repositories>
<!-- Uncommenting this is useful when the repo is built first then you want to run tests on this plugin only -->
<!-- <repositories>
<repository>
<id>cdt.repo</id>
<url>file:/${basedir}/../../releng/org.eclipse.cdt.repo/target/repository</url>
<layout>p2</layout>
</repository>
</repositories>
</repositories>-->
<build>
<plugins>

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2011 Broadcom Corporation and others.
* Copyright (c) 2011, 2012 Broadcom Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -71,11 +71,13 @@ public abstract class AbstractBuilderTest extends TestCase {
Job.getJobManager().cancel(CCorePlugin.getPDOMManager());
Job.getJobManager().join(CCorePlugin.getPDOMManager(), null);
// Clean-up any projects we were using
for (IProject project : projects) {
project.delete(true, null);
if (projects != null) {
// Clean-up any projects we were using
for (IProject project : projects) {
project.delete(true, null);
}
projects.clear();
}
projects.clear();
}
/**

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2011 QNX Software Systems and others.
* Copyright (c) 2011, 2012 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -11,11 +11,9 @@
package org.eclipse.cdt.managedbuilder.core.tests;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.cdt.core.model.CoreModel;
@ -28,6 +26,7 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.core.FolderInfo;
import org.eclipse.cdt.managedbuilder.tcmodification.IConfigurationModification;
import org.eclipse.cdt.managedbuilder.tcmodification.IToolChainModificationManager;
import org.eclipse.cdt.managedbuilder.testplugin.AbstractBuilderTest;
import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
@ -39,11 +38,10 @@ import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
public class ManagedBuildDependencyLibsTests extends TestCase {
public class ManagedBuildDependencyLibsTests extends AbstractBuilderTest {
private static final String PROJ_PATH = "depLibsProjects";
private static final String MESSAGE_TAIL = " (see .log file for more details).";
@ -60,12 +58,12 @@ public class ManagedBuildDependencyLibsTests extends TestCase {
suite.addTest(new ManagedBuildDependencyLibsTests("testDepLibs"));
suite.addTest(new ManagedBuildDependencyLibsTests("testDepUObjs"));
suite.addTest(new ManagedBuildDependencyLibsTests("testGetArtifactTimeStampEscapeURI_bug377295"));
return suite;
}
private void buildProject(IProject curProject) {
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(curProject);
try {
IProject[] referencedProjects = curProject.getReferencedProjects();
for(int i = 0; i < referencedProjects.length; ++i)
@ -117,20 +115,6 @@ public class ManagedBuildDependencyLibsTests extends TestCase {
ManagedBuildTestHelper.removeProject(fTlib.getName());
ManagedBuildTestHelper.removeProject(fTobjs.getName());
}
private void deleteFiles(IFolder dir, String pattern, IProgressMonitor monitor) {
List<IFile> files = new ArrayList<IFile>();
findFiles(dir, pattern, files);
for(Iterator<IFile> i = files.iterator(); i.hasNext(); ) {
IFile file = i.next();
try {
file.delete(true, monitor);
} catch (CoreException e) {
e.printStackTrace();
fail("Error deleting file " + file.getFullPath().toString() + '.' + MESSAGE_TAIL);
}
}
}
private void findFiles(IResource dir, String pattern, List<IFile> files) {
IResource resource = null;
@ -146,7 +130,7 @@ public class ManagedBuildDependencyLibsTests extends TestCase {
for(int i = 0; i < members.length; ++i) {
resource = members[i];
if(resource.getType() == IResource.FOLDER)
findFiles((IFolder)resource, pattern, files);
findFiles(resource, pattern, files);
else {
if(resource.getName().matches(pattern))
files.add((IFile)resource);
@ -291,4 +275,20 @@ public class ManagedBuildDependencyLibsTests extends TestCase {
fail("Error. This time it should build application.");
}
}
// Tests that the URI used to get the time stamp of the artifact is escaped correctly
// See AdditionalInput.getArtifactTimeStamp(IToolChain toolChain)
public void testGetArtifactTimeStampEscapeURI_bug377295() throws CoreException {
setWorkspace("regressions");
final IProject project = loadProject("helloworldC");
IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(project);
IConfiguration[] configs = buildInfo.getManagedProject().getConfigurations();
for (IConfiguration configuration : configs) {
configuration.setArtifactName("test [377295]");
}
project.build(IncrementalProjectBuilder.FULL_BUILD, null);
// This will trigger AdditionalInput.getArtifactTimeStamp to get called, no IllegalArgumentException should be thrown
project.build(IncrementalProjectBuilder.FULL_BUILD, null);
}
}

View file

@ -1,13 +1,14 @@
/*******************************************************************************
* Copyright (c) 2005, 2011 Intel Corporation and others.
* Copyright (c) 2005, 2012 Intel Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Intel Corporation - Initial API and implementation
* IBM Corporation
* Intel Corporation - Initial API and implementation
* IBM Corporation
* Marc-Andre Laperle
*******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.core;
@ -40,6 +41,7 @@ import org.eclipse.cdt.managedbuilder.internal.macros.IMacroContextInfo;
import org.eclipse.cdt.managedbuilder.internal.macros.OptionContextData;
import org.eclipse.cdt.managedbuilder.macros.BuildMacroException;
import org.eclipse.cdt.managedbuilder.macros.IBuildMacroProvider;
import org.eclipse.cdt.utils.EFSExtensionManager;
import org.eclipse.cdt.utils.cdtvariables.CdtVariableResolver;
import org.eclipse.cdt.utils.cdtvariables.SupplierBasedCdtVariableSubstitutor;
import org.eclipse.core.filesystem.EFS;
@ -380,7 +382,7 @@ public class AdditionalInput implements IAdditionalInput {
} catch (BuildMacroException e) {
}
URI buildArtifactURI = buildLocationURI.resolve(artifactName);
URI buildArtifactURI = EFSExtensionManager.getDefault().append(buildLocationURI, artifactName);
try {
IFileStore artifact = EFS.getStore(buildArtifactURI);

View file

@ -10,8 +10,6 @@
*******************************************************************************/
package org.eclipse.cdt.codan.core.cxx.externaltool;
import static org.eclipse.cdt.core.ErrorParserContext.CODAN;
import java.net.URI;
import org.eclipse.cdt.codan.core.CodanRuntime;
@ -127,7 +125,7 @@ public abstract class AbstractExternalToolBasedChecker extends AbstractCheckerWi
private ErrorParserManager createErrorParserManager(InvocationParameters parameters) {
IProject project = parameters.getActualFile().getProject();
URI workingDirectory = URIUtil.toURI(parameters.getWorkingDirectory());
return new ErrorParserManager(project, workingDirectory, this, getParserIDs(), CODAN);
return new ErrorParserManager(project, workingDirectory, this, getParserIDs());
}
/**

View file

@ -9592,4 +9592,21 @@ public class AST2CPPTests extends AST2BaseTest {
assertSame(calls[calls.length - 1] + " and " + calls[calls.length - 2] + " resolve to different functions",
functions[calls.length - 1], functions[calls.length - 2]);
}
// void f(int x) try {
// } catch(...) {
// (void)x;
// }
public void testParentScopeOfCatchHandler_376246() throws Exception {
parseAndCheckBindings();
}
// struct MyClass {
// struct MyException {};
// void doSomething() throw(MyException);
// };
// void MyClass::doSomething() throw (MyException) {}
public void testScopeOfExceptionSpecification_377457() throws Exception {
parseAndCheckBindings();
}
}

View file

@ -15,13 +15,14 @@
<artifactId>org.eclipse.cdt.core.tests</artifactId>
<packaging>eclipse-test-plugin</packaging>
<repositories>
<!-- Uncommenting this is useful when the repo is built first then you want to run tests on this plugin only -->
<!-- <repositories>
<repository>
<id>cdt.repo</id>
<url>file:/${basedir}/../../releng/org.eclipse.cdt.repo/target/repository</url>
<layout>p2</layout>
</repository>
</repositories>
</repositories>-->
<build>
<plugins>

View file

@ -47,7 +47,8 @@ Export-Package: org.eclipse.cdt.core,
org.eclipse.cdt.managedbuilder.core,
org.eclipse.cdt.make.core,
org.eclipse.cdt.make.ui,
org.eclipse.cdt.codan.core.cxx",
org.eclipse.cdt.codan.core.cxx,
org.eclipse.cdt.dsf.gdb",
org.eclipse.cdt.internal.core.browser;x-friends:="org.eclipse.cdt.ui",
org.eclipse.cdt.internal.core.cdtvariables;x-internal:=true,
org.eclipse.cdt.internal.core.dom;x-internal:=true,

View file

@ -10,7 +10,6 @@
* Markus Schorn (Wind River Systems)
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.model;
import java.net.URI;
@ -41,7 +40,6 @@ import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.PlatformObject;
public abstract class CElement extends PlatformObject implements ICElement {
public static final char CEM_ESCAPE = '\\';
public static final char CEM_CPROJECT = '=';
public static final char CEM_SOURCEROOT = '/';
@ -51,11 +49,10 @@ public abstract class CElement extends PlatformObject implements ICElement {
public static final char CEM_PARAMETER = '(';
public static final char CEM_ELEMENTTYPE = '#';
protected static final CElement[] NO_ELEMENTS = new CElement[0];
protected static final CElement[] NO_ELEMENTS = {};
protected int fType;
protected ICElement fParent;
protected String fName;
protected CElement(ICElement parent, String name, int type) {
@ -80,7 +77,6 @@ public abstract class CElement extends PlatformObject implements ICElement {
return super.getAdapter(adapter);
}
// setters
public void setElementType (int type) {
@ -123,14 +119,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
@Override
public URI getLocationURI() {
IResource res = getUnderlyingResource();
if(res != null) {
return res.getLocationURI();
}
else {
return null;
}
return res == null ? null : res.getLocationURI();
}
@Override
@ -138,8 +127,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
try {
return getElementInfo() != null;
} catch (CModelException e) {
// Do not log it, it will fil the .log alarming the user.
//CCorePlugin.log(e);
// Do not log it, otherwise it would fill the .log alarming the user.
return false;
}
}
@ -153,7 +141,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
*/
protected ICElement getSourceElementAtOffset(int offset) throws CModelException {
if (this instanceof ISourceReference && this instanceof Parent) {
ICElement[] children = ((Parent)this).getChildren();
ICElement[] children = ((Parent) this).getChildren();
for (ICElement aChild : children) {
if (aChild instanceof ISourceReference) {
ISourceReference child = (ISourceReference) aChild;
@ -162,9 +150,9 @@ public abstract class CElement extends PlatformObject implements ICElement {
int endPos = startPos + range.getLength();
if (offset < endPos && offset >= startPos) {
if (child instanceof Parent) {
return ((Parent)child).getSourceElementAtOffset(offset);
return ((Parent) child).getSourceElementAtOffset(offset);
}
return (ICElement)child;
return (ICElement) child;
}
}
}
@ -185,7 +173,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
protected ICElement[] getSourceElementsAtOffset(int offset) throws CModelException {
if (this instanceof ISourceReference && this instanceof Parent) {
ArrayList<Object> list = new ArrayList<Object>();
ICElement[] children = ((Parent)this).getChildren();
ICElement[] children = ((Parent) this).getChildren();
for (ICElement aChild : children) {
if (aChild instanceof ISourceReference) {
ISourceReference child = (ISourceReference) aChild;
@ -194,7 +182,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
int endPos = startPos + range.getLength();
if (offset < endPos && offset >= startPos) {
if (child instanceof Parent) {
ICElement[] elements = ((Parent)child).getSourceElementsAtOffset(offset);
ICElement[] elements = ((Parent) child).getSourceElementsAtOffset(offset);
list.addAll(Arrays.asList(elements));
}
list.add(child);
@ -238,7 +226,8 @@ public abstract class CElement extends PlatformObject implements ICElement {
public ICProject getCProject() {
ICElement current = this;
do {
if (current instanceof ICProject) return (ICProject) current;
if (current instanceof ICProject)
return (ICProject) current;
} while ((current = current.getParent()) != null);
return null;
}
@ -285,7 +274,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
}
String lhsName= lhs.getElementName();
String rhsName= rhs.getElementName();
if( lhsName == null || rhsName == null || lhsName.length() != rhsName.length() ||
if (lhsName == null || rhsName == null || lhsName.length() != rhsName.length() ||
!lhsName.equals(rhsName)) {
return false;
}
@ -311,7 +300,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
public CElementInfo getElementInfo (IProgressMonitor monitor) throws CModelException {
CModelManager manager = CModelManager.getDefault();
CElementInfo info = (CElementInfo)manager.getInfo(this);
CElementInfo info = (CElementInfo) manager.getInfo(this);
if (info != null) {
return info;
}
@ -326,7 +315,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
}
public String toDebugString() {
return getElementName() + " " + getTypeString(); //$NON-NLS-1$
return getElementName() + " " + getTypeString(); //$NON-NLS-1$
}
// util
@ -367,11 +356,11 @@ public abstract class CElement extends PlatformObject implements ICElement {
case C_FIELD:
return "C_FIELD"; //$NON-NLS-1$
case C_METHOD:
return "C_METHOD"; //$NON-NLS-1$
return "C_METHOD"; //$NON-NLS-1$
case C_NAMESPACE:
return "C_NAMESPACE"; //$NON-NLS-1$
return "C_NAMESPACE"; //$NON-NLS-1$
case C_USING:
return "C_USING"; //$NON-NLS-1$
return "C_USING"; //$NON-NLS-1$
case C_VCONTAINER:
return "C_CONTAINER"; //$NON-NLS-1$
case C_BINARY:
@ -411,7 +400,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
*/
public IOpenable getOpenableParent() {
if (fParent instanceof IOpenable) {
return (IOpenable)fParent;
return (IOpenable) fParent;
}
return null;
}
@ -426,7 +415,8 @@ public abstract class CElement extends PlatformObject implements ICElement {
* if successful, or false if an error is encountered while determining
* the structure of this element.
*/
protected abstract void generateInfos(CElementInfo info, Map<ICElement, CElementInfo> newElements, IProgressMonitor monitor) throws CModelException;
protected abstract void generateInfos(CElementInfo info, Map<ICElement, CElementInfo> newElements,
IProgressMonitor monitor) throws CModelException;
/**
* Open a <code>IOpenable</code> that is known to be closed (no check for
@ -441,13 +431,14 @@ public abstract class CElement extends PlatformObject implements ICElement {
if (info == null) {
info = newElements.get(this);
}
if (info == null) { // a source ref element could not be opened
// close any buffer that was opened for the openable parent
if (info == null) {
// A source ref element could not be opened.
// Close any buffer that was opened for the openable parent.
Iterator<ICElement> iterator = newElements.keySet().iterator();
while (iterator.hasNext()) {
ICElement element = iterator.next();
if (element instanceof Openable) {
((Openable)element).closeBuffer();
((Openable) element).closeBuffer();
}
}
throw newNotPresentException();
@ -455,7 +446,6 @@ public abstract class CElement extends PlatformObject implements ICElement {
if (!hadTemporaryCache) {
manager.putInfos(this, newElements);
}
} finally {
if (!hadTemporaryCache) {
manager.resetTemporaryCache();
@ -463,7 +453,6 @@ public abstract class CElement extends PlatformObject implements ICElement {
}
}
/**
* @see ICElement
*/
@ -519,17 +508,14 @@ public abstract class CElement extends PlatformObject implements ICElement {
return Util.combineHashCodes(elem.getElementName().hashCode(), parent.hashCode());
}
/*
* Test to see if two objects are identical
/**
* Checks if two objects are identical
* Subclasses should override accordingly
*/
public boolean isIdentical(CElement otherElement){
return this.equals(otherElement);
}
/* (non-Javadoc)
* @see org.eclipse.cdt.core.model.ICElement#accept(org.eclipse.cdt.core.model.ICElementVisitor)
*/
@Override
public void accept(ICElementVisitor visitor) throws CoreException {
// Visit me, return right away if the visitor doesn't want to visit my children
@ -538,15 +524,13 @@ public abstract class CElement extends PlatformObject implements ICElement {
// If I am a Parent, visit my children
if (this instanceof IParent) {
ICElement [] children = ((IParent)this).getChildren();
for (int i = 0; i < children.length; ++i)
ICElement [] children = ((IParent) this).getChildren();
for (int i = 0; i < children.length; ++i) {
children[i].accept(visitor);
}
}
}
/*
* @see org.eclipse.cdt.core.model.ICElement#getHandleIdentifier()
*/
@Override
public String getHandleIdentifier() {
return getHandleMemento();
@ -569,7 +553,7 @@ public abstract class CElement extends PlatformObject implements ICElement {
* @param buff the buffer building the memento string
*/
public void getHandleMemento(StringBuilder buff) {
((CElement)getParent()).getHandleMemento(buff);
((CElement) getParent()).getHandleMemento(buff);
buff.append(getHandleMementoDelimiter());
escapeMementoName(buff, getElementName());
}

View file

@ -82,8 +82,7 @@ public interface IIndex {
* index.acquireReadLock();
* try {
* ....
* }
* finally {
* } finally {
* index.releaseReadLock();
* }
* </pre>
@ -113,8 +112,7 @@ public interface IIndex {
* try {
* timestamp= index.getLastWriteAccess();
* binding= index.findBinding(...);
* }
* finally {
* } finally {
* index.releaseReadLock();
* }
* ...
@ -126,8 +124,7 @@ public interface IIndex {
* }
* String name= binding.getName();
* ...
* }
* finally {
* } finally {
* index.releaseReadLock();
* }
*/

View file

@ -13,11 +13,7 @@
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.ALLCVQ;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getNestedType;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.getUltimateTypeUptoPointers;
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.*;
import java.util.ArrayList;
import java.util.Arrays;
@ -986,7 +982,8 @@ public class CPPVisitor extends ASTQueries {
node= node.getParent();
}
continue;
} else if (prop == ICPPASTFunctionDeclarator.TRAILING_RETURN_TYPE) {
} else if (prop == ICPPASTFunctionDeclarator.TRAILING_RETURN_TYPE ||
prop == ICPPASTFunctionDeclarator.EXCEPTION_TYPEID) {
IScope result = scopeViaFunctionDtor((ICPPASTFunctionDeclarator) node.getParent());
if (result != null)
return result;
@ -1264,7 +1261,11 @@ public class CPPVisitor extends ASTQueries {
} else if (parent instanceof IASTStatement) {
scope = getContainingScope((IASTStatement) parent);
} else if (parent instanceof IASTFunctionDefinition) {
IASTFunctionDeclarator fnDeclarator = ((IASTFunctionDefinition) parent).getDeclarator();
final IASTFunctionDefinition fdef = (IASTFunctionDefinition) parent;
if (statement instanceof ICPPASTCatchHandler)
return fdef.getScope();
IASTFunctionDeclarator fnDeclarator = fdef.getDeclarator();
IASTName name = findInnermostDeclarator(fnDeclarator).getName();
if (name instanceof ICPPASTQualifiedName) {
IASTName[] ns = ((ICPPASTQualifiedName) name).getNames();

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bryan Wilkinson (QNX) - Initial API and implementation
* Bryan Wilkinson (QNX) - Initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.internal.core.index;

View file

@ -336,7 +336,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return null;
if (binding instanceof ICPPSpecialization) {
IBinding specialized = ((ICPPSpecialization)binding).getSpecializedBinding();
IBinding specialized = ((ICPPSpecialization) binding).getSpecializedBinding();
PDOMBinding pdomSpecialized= addBinding(specialized, null);
if (pdomSpecialized == null)
return null;
@ -371,11 +371,11 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
}
} else if (binding instanceof ICPPConstructor) {
if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) {
pdomBinding = new PDOMCPPConstructor(this, parent, (ICPPConstructor)binding);
pdomBinding = new PDOMCPPConstructor(this, parent, (ICPPConstructor) binding);
}
} else if (binding instanceof ICPPMethod) {
if (parent instanceof PDOMCPPClassType || parent instanceof PDOMCPPClassSpecialization) {
pdomBinding = new PDOMCPPMethod(this, parent, (ICPPMethod)binding);
pdomBinding = new PDOMCPPMethod(this, parent, (ICPPMethod) binding);
}
} else if (binding instanceof ICPPFunction) {
pdomBinding = new PDOMCPPFunction(this, parent, (ICPPFunction) binding, true);
@ -397,7 +397,7 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
}
}
} else if (binding instanceof ITypedef) {
pdomBinding = new PDOMCPPTypedef(this, parent, (ITypedef)binding);
pdomBinding = new PDOMCPPTypedef(this, parent, (ITypedef) binding);
}
if (pdomBinding != null) {
@ -611,7 +611,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
return adaptBinding(null, inputBinding, includeLocal ? FILE_LOCAL_REC_DUMMY : null);
}
private final PDOMBinding adaptBinding(final PDOMNode parent, IBinding inputBinding, long[] fileLocalRecHolder) throws CoreException {
private final PDOMBinding adaptBinding(final PDOMNode parent, IBinding inputBinding, long[] fileLocalRecHolder)
throws CoreException {
if (cannotAdapt(inputBinding)) {
return null;
}
@ -639,7 +640,8 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
final Long key = record + CACHE_BASES;
PDOMCPPNamespace[] result= (PDOMCPPNamespace[]) getPDOM().getCachedResult(key);
if (result == null) {
List<PDOMCPPNamespace> nslist = PDOMCPPNamespace.collectInlineNamespaces(getDB(), getLinkage(), record+FIRST_NAMESPACE_CHILD_OFFSET);
List<PDOMCPPNamespace> nslist = PDOMCPPNamespace.collectInlineNamespaces(getDB(),
getLinkage(), record + FIRST_NAMESPACE_CHILD_OFFSET);
if (nslist == null) {
result= new PDOMCPPNamespace[0];
} else {
@ -651,9 +653,10 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
}
/**
* Find the equivalent binding, or binding place holder within this PDOM
* Finds the equivalent binding, or binding placeholder within this PDOM.
*/
private final PDOMBinding doAdaptBinding(PDOMNode parent, IBinding binding, long[] fileLocalRecHolder) throws CoreException {
private final PDOMBinding doAdaptBinding(PDOMNode parent, IBinding binding, long[] fileLocalRecHolder)
throws CoreException {
if (parent == null) {
parent= adaptOrAddParent(false, binding);
}
@ -935,9 +938,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
}
}
/* (non-Javadoc)
* @see org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage#getUsingDirectives()
*/
@Override
public ICPPUsingDirective[] getUsingDirectives(PDOMFile file) throws CoreException {
long rec= file.getLastUsingDirectiveRec();
@ -1025,7 +1025,6 @@ class PDOMCPPLinkage extends PDOMLinkage implements IIndexCPPBindingConstants {
public PDOMBinding addTypeBinding(IBinding type) throws CoreException {
return addBinding(type, null);
}
@Override
public IType unmarshalType(ITypeMarshalBuffer buffer) throws CoreException {

View file

@ -6,8 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Sergey Prigogin (Google) - initial API and implementation
* Markus Schorn (Wind River Systems)
* Sergey Prigogin (Google) - initial API and implementation
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -33,7 +33,6 @@ import org.eclipse.core.runtime.CoreException;
* @see ICPPUsingDeclaration
*/
class PDOMCPPUsingDeclaration extends PDOMCPPBinding implements ICPPUsingDeclaration {
private static final int TARGET_BINDING = PDOMCPPBinding.RECORD_SIZE + 0;
// Using declarations for functions may have multiple delegates. We model such case
// by creating a chain of PDOMCPPUsingDeclaration objects linked by NEXT_DELEGATE field.

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn (Wind River Systems)
* Markus Schorn (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.core.pdom.dom.cpp;
@ -67,7 +67,7 @@ class PDOMCPPUsingDeclarationSpecialization extends PDOMCPPSpecialization implem
@Override
public IBinding[] getDelegates() {
if (delegates == null) {
PDOMNodeLinkedList list= new PDOMNodeLinkedList(getLinkage(), record+TARGET_BINDINGS);
PDOMNodeLinkedList list= new PDOMNodeLinkedList(getLinkage(), record+ TARGET_BINDINGS);
final List<IBinding> result= new ArrayList<IBinding>();
try {
list.accept(new IPDOMVisitor() {
@ -78,6 +78,7 @@ class PDOMCPPUsingDeclarationSpecialization extends PDOMCPPSpecialization implem
}
return true;
}
@Override
public void leave(IPDOMNode node) {
}

View file

@ -153,24 +153,18 @@
<documentation>
Use this element to specify the context where an error parser can be used. If none is specified, a default context type will be &quot;build&quot;.
An error parser can be assigned to more than one context type. For example, an error parser can have two &quot;context&quot; elements, one for &quot;build&quot; and one for &quot;codan&quot;.
An example of context type is &quot;build&quot;. Only error parsers in this context are used to parse build output. You can see these error parsers in the &quot;C/C++&quot; &gt; &quot;Build&quot; &gt; &quot;Settings&quot; preference page.
An error parser can be assigned to more than one context type. Clients contributing error parsers are free to define their own context types.
</documentation>
</annotation>
<complexType>
<attribute name="type" use="required">
<attribute name="type" type="string" use="required">
<annotation>
<documentation>
The type of context where an error parser can be used. Valid values are &quot;build&quot; and &quot;codan&quot;.
The type of context where an error parser can be used.
</documentation>
</annotation>
<simpleType>
<restriction base="string">
<enumeration value="build">
</enumeration>
<enumeration value="codan">
</enumeration>
</restriction>
</simpleType>
</attribute>
</complexType>
</element>

View file

@ -1,32 +0,0 @@
/*******************************************************************************
* Copyright (c) 2012 Google, Inc and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Alex Ruiz (Google) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.core;
/**
* Indicates the context in which <code>{@link org.eclipse.cdt.core.IErrorParser}</code>s can be
* used.
*
* @since 5.4
*/
public class ErrorParserContext {
public static final int BUILD = 1 << 0;
public static final int CODAN = 1 << 1;
public static int getValue(String text) {
if ("build".equals(text)) { //$NON-NLS-1$
return BUILD;
}
if ("codan".equals(text)) { //$NON-NLS-1$
return CODAN;
}
throw new IllegalArgumentException("Unknown context value: " + text); //$NON-NLS-1$
}
}

View file

@ -11,11 +11,10 @@
* James Blackburn (Broadcom) - Bug 247838
* Andrew Gvozdev (Quoin Inc)
* Dmitry Kozlov (CodeSourcery) - Build error highlighting and navigation
* Alex Ruiz (Google)
*******************************************************************************/
package org.eclipse.cdt.core;
import static org.eclipse.cdt.core.ErrorParserContext.BUILD;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
@ -68,6 +67,11 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser,
*/
public final static char ERROR_PARSER_DELIMITER = ';';
/**
* @since 5.4
*/
public static final String BUILD_CONTEXT = "build"; //$NON-NLS-1$
private int nOpens;
private int lineCounter=0;
@ -75,7 +79,7 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser,
private final IMarkerGenerator fMarkerGenerator;
private Map<String, IErrorParser[]> fErrorParsers;
private final ArrayList<ProblemMarkerInfo> fErrors;
private final List<ProblemMarkerInfo> fErrors;
private final Vector<URI> fDirectoryStack;
private final URI fBaseDirectoryURI;
@ -149,28 +153,11 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser,
* @since 5.1
*/
public ErrorParserManager(IProject project, URI baseDirectoryURI, IMarkerGenerator markerGenerator, String[] parsersIDs) {
this(project, baseDirectoryURI, markerGenerator, parsersIDs, BUILD);
}
/**
* URI based constructor.
*
* @param project - project being built.
* @param baseDirectoryURI - absolute location URI of working directory of where the build is performed.
* @param markerGenerator - marker generator able to create markers.
* @param parsersIDs - array of error parsers' IDs.
* @param context - context where the error parser will be used. Valid values are defined by
* <code>{@link ErrorParserContext}</code>.
* @see ErrorParserContext
* @since 5.4
*/
public ErrorParserManager(IProject project, URI baseDirectoryURI,
IMarkerGenerator markerGenerator, String[] parsersIDs, int context) {
fProject = project;
fMarkerGenerator = markerGenerator;
fDirectoryStack = new Vector<URI>();
fErrors = new ArrayList<ProblemMarkerInfo>();
enableErrorParsers(parsersIDs, context);
enableErrorParsers(parsersIDs);
if (baseDirectoryURI != null) {
fBaseDirectoryURI = baseDirectoryURI;
@ -182,13 +169,13 @@ public class ErrorParserManager extends OutputStream implements IConsoleParser,
}
}
private void enableErrorParsers(String[] parsersIDs, int context) {
if (parsersIDs == null) {
parsersIDs = ErrorParserExtensionManager.getDefaultErrorParserIds();
private void enableErrorParsers(String[] parserIDs) {
if (parserIDs == null) {
parserIDs = ErrorParserExtensionManager.getDefaultErrorParserIds();
}
fErrorParsers = new LinkedHashMap<String, IErrorParser[]>(parsersIDs.length);
for (String parsersID : parsersIDs) {
IErrorParser errorParser = getErrorParserCopy(parsersID, context);
fErrorParsers = new LinkedHashMap<String, IErrorParser[]>(parserIDs.length);
for (String parsersID : parserIDs) {
IErrorParser errorParser = getErrorParserCopy(parsersID);
if (errorParser!=null) {
fErrorParsers.put(parsersID, new IErrorParser[] {errorParser} );
}
@ -375,7 +362,7 @@ outer:
} catch (Exception e){
String id = ""; //$NON-NLS-1$
if (parser instanceof IErrorParserNamed) {
id = ((IErrorParserNamed)parser).getId();
id = ((IErrorParserNamed) parser).getId();
}
@SuppressWarnings("nls")
String message = "Errorparser " + id + " failed parsing line [" + lineToParse + "]";
@ -832,6 +819,16 @@ outer:
return ErrorParserExtensionManager.getErrorParserAvailableIds();
}
/**
* @param context - indicates the context in which an error parser can be used.
* @return available error parsers ID, which include contributed through extension and user-
* defined ones from workspace, that can be used in the given context.
* @since 5.4
*/
public static String[] getErrorParserAvailableIdsInContext(String context) {
return ErrorParserExtensionManager.getErrorParserAvailableIdsInContext(context);
}
/**
* @return IDs of error parsers contributed through error parser extension point.
* @since 5.2
@ -870,20 +867,6 @@ outer:
return ErrorParserExtensionManager.getErrorParserCopy(id, false);
}
/**
* @param id - ID of error parser
* @param context - context where the error parser will be used. Valid values are defined by
* <code>{@link ErrorParserContext}</code>.
* @return cloned copy of error parser or {@code null}.
* Note that {@link ErrorParserNamedWrapper} returns shallow copy with the same instance
* of underlying error parser.
* @see ErrorParserContext
* @since 5.4
*/
public static IErrorParserNamed getErrorParserCopy(String id, int context) {
return ErrorParserExtensionManager.getErrorParserCopy(id, false, context);
}
/**
* @param id - ID of error parser
* @return cloned copy of error parser as defined by its extension point or {@code null}.

View file

@ -11,12 +11,14 @@
*******************************************************************************/
package org.eclipse.cdt.internal.errorparsers;
import static org.eclipse.cdt.core.ErrorParserContext.BUILD;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -25,7 +27,6 @@ import java.util.Set;
import java.util.TreeSet;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.ErrorParserContext;
import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.IErrorParser;
import org.eclipse.cdt.core.IErrorParserNamed;
@ -33,7 +34,6 @@ import org.eclipse.cdt.core.IMarkerGenerator;
import org.eclipse.cdt.core.errorparsers.ErrorParserNamedWrapper;
import org.eclipse.cdt.core.errorparsers.RegexErrorParser;
import org.eclipse.cdt.core.errorparsers.RegexErrorPattern;
import org.eclipse.cdt.internal.core.Pair;
import org.eclipse.cdt.internal.core.XmlUtil;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.runtime.CoreException;
@ -71,7 +71,6 @@ public class ErrorParserExtensionManager {
private static final String ATTR_POINT = "point"; //$NON-NLS-1$
private static final String ATTR_TYPE = "type"; //$NON-NLS-1$
private static final String ATTR_REGEX = "regex"; //$NON-NLS-1$
private static final String ATTR_SEVERITY = "severity"; //$NON-NLS-1$
private static final String ATTR_FILE = "file-expr"; //$NON-NLS-1$
@ -85,10 +84,9 @@ public class ErrorParserExtensionManager {
private static final String ATTR_VALUE_INFO = "Info"; //$NON-NLS-1$
private static final String ATTR_VALUE_IGNORE = "Ignore"; //$NON-NLS-1$
// Key: error parser id. Value: pair of error parser and contexts value
private static final LinkedHashMap<String, Pair<IErrorParserNamed, Integer>> fExtensionErrorParsers = new LinkedHashMap<String, Pair<IErrorParserNamed, Integer>>();
// Key: error parser id. Value: pair of error parser and contexts value
private static final LinkedHashMap<String, Pair<IErrorParserNamed, Integer>> fAvailableErrorParsers = new LinkedHashMap<String, Pair<IErrorParserNamed, Integer>>();
private static final LinkedHashMap<String, IErrorParserNamed> fExtensionErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
private static final LinkedHashMap<String, IErrorParserNamed> fAvailableErrorParsers = new LinkedHashMap<String, IErrorParserNamed>();
private static final Map<String, Set<String>> fErrorParserContexts = new HashMap<String, Set<String>>();
private static LinkedHashMap<String, IErrorParserNamed> fUserDefinedErrorParsers = null;
private static List<String> fDefaultErrorParserIds = null;
@ -121,18 +119,6 @@ public class ErrorParserExtensionManager {
}
}
private static class ErrorParserAndContextComparator implements Comparator<Pair<IErrorParserNamed, Integer>> {
private static final ErrorParserComparator DELEGATE = new ErrorParserComparator();
@Override
public int compare(Pair<IErrorParserNamed, Integer> pair1,
Pair<IErrorParserNamed, Integer> pair2) {
IErrorParserNamed parser1 = pair1.first;
IErrorParserNamed parser2 = pair2.first;
return DELEGATE.compare(parser1, parser2);
}
}
static {
loadUserDefinedErrorParsers();
loadDefaultErrorParserIds();
@ -223,13 +209,12 @@ public class ErrorParserExtensionManager {
* @noreference This method is not intended to be referenced by clients.
*/
synchronized public static void loadErrorParserExtensions() {
Set<Pair<IErrorParserNamed, Integer>> sortedErrorParsers =
new TreeSet<Pair<IErrorParserNamed, Integer>>(new ErrorParserAndContextComparator());
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
loadErrorParserExtensions(Platform.getExtensionRegistry(), sortedErrorParsers);
fExtensionErrorParsers.clear();
for (Pair<IErrorParserNamed, Integer> pair : sortedErrorParsers) {
fExtensionErrorParsers.put(pair.first.getId(), pair);
for (IErrorParserNamed errorParser : sortedErrorParsers) {
fExtensionErrorParsers.put(errorParser.getId(), errorParser);
}
recalculateAvailableErrorParsers();
}
@ -240,8 +225,7 @@ public class ErrorParserExtensionManager {
* @param registry - extension registry
* @param errorParsers - resulting set of error parsers
*/
private static void loadErrorParserExtensions(IExtensionRegistry registry,
Set<Pair<IErrorParserNamed, Integer>> errorParsers) {
private static void loadErrorParserExtensions(IExtensionRegistry registry, Set<IErrorParserNamed> errorParsers) {
errorParsers.clear();
IExtensionPoint extension = registry.getExtensionPoint(CCorePlugin.PLUGIN_ID, CCorePlugin.ERROR_PARSER_SIMPLE_ID);
if (extension != null) {
@ -255,9 +239,8 @@ public class ErrorParserExtensionManager {
if (cfgEl.getName().equals(ELEM_ERRORPARSER)) {
IErrorParserNamed errorParser = createErrorParserCarcass(oldStyleId, oldStyleName, cfgEl);
if (errorParser!=null) {
Pair<IErrorParserNamed, Integer> configured =
configureErrorParser(errorParser, cfgEl);
errorParsers.add(configured);
configureErrorParser(errorParser, cfgEl);
errorParsers.add(errorParser);
}
}
}
@ -278,50 +261,42 @@ public class ErrorParserExtensionManager {
List<String> ids = new ArrayList<String>();
if (fDefaultErrorParserIds!=null) {
for (String id : fDefaultErrorParserIds) {
Pair<IErrorParserNamed, Integer> pair = null;
IErrorParserNamed errorParser = null;
if (fUserDefinedErrorParsers!=null) {
errorParser = fUserDefinedErrorParsers.get(id);
}
if (errorParser != null) {
pair = errorParserForBuild(errorParser);
} else {
pair = fExtensionErrorParsers.get(id);
if (errorParser==null) {
errorParser = fExtensionErrorParsers.get(id);
}
if (pair != null) {
fAvailableErrorParsers.put(id, pair);
if (errorParser!=null) {
fAvailableErrorParsers.put(id, errorParser);
ids.add(id);
}
}
}
// then the rest in the order defined by comparator
Set<Pair<IErrorParserNamed, Integer>> sortedErrorParsers =
new TreeSet<Pair<IErrorParserNamed, Integer>>(new ErrorParserAndContextComparator());
Set<IErrorParserNamed> sortedErrorParsers = new TreeSet<IErrorParserNamed>(new ErrorParserComparator());
if (fUserDefinedErrorParsers!=null) {
for (String id : fUserDefinedErrorParsers.keySet()) {
if (!ids.contains(id)) {
IErrorParserNamed errorParser = fUserDefinedErrorParsers.get(id);
sortedErrorParsers.add(errorParserForBuild(errorParser));
sortedErrorParsers.add(errorParser);
}
}
}
for (String id : fExtensionErrorParsers.keySet()) {
if (!ids.contains(id)) {
Pair<IErrorParserNamed, Integer> pair = fExtensionErrorParsers.get(id);
sortedErrorParsers.add(pair);
IErrorParserNamed errorParser = fExtensionErrorParsers.get(id);
sortedErrorParsers.add(errorParser);
}
}
for (Pair<IErrorParserNamed, Integer> pairs : sortedErrorParsers) {
fAvailableErrorParsers.put(pairs.first.getId(), pairs);
for (IErrorParserNamed errorParser : sortedErrorParsers) {
fAvailableErrorParsers.put(errorParser.getId(), errorParser);
}
}
private static Pair<IErrorParserNamed, Integer> errorParserForBuild(IErrorParserNamed errorParser) {
return new Pair<IErrorParserNamed, Integer>(errorParser, ErrorParserContext.BUILD);
}
/**
* Serialize error parsers in workspace level storage.
*
@ -576,8 +551,7 @@ public class ErrorParserExtensionManager {
* @param cfgEl - extension configuration element
* @throws CoreException
*/
private static Pair<IErrorParserNamed, Integer> configureErrorParser(
IErrorParserNamed errorParser, IConfigurationElement cfgEl) throws CoreException {
private static void configureErrorParser(IErrorParserNamed errorParser, IConfigurationElement cfgEl) throws CoreException {
String id = cfgEl.getAttribute(ATTR_ID);
if (id!=null && id.length()>0)
errorParser.setId(id);
@ -602,33 +576,39 @@ public class ErrorParserExtensionManager {
}
}
}
int contexts = contextTypes(cfgEl);
return new Pair<IErrorParserNamed, Integer>(errorParser, contexts);
findContexts(id, cfgEl);
}
/**
* Returns a bit mask of contexts where an error parser can be used. Valid values for context
* are defined in <code>{@link ErrorParserContext}</code>.
* Finds the contexts where an error parser can be used. Clients determine whether the found
* context values are valid.
*
* @param errorParserId the error parser id.
* @param errorParserElement represents an "errorparser" element in the extension point
* "org.eclipse.cdt.core.ErrorParser".
* @return the contexts in which an error parser can be used, or
* <code>{@link ErrorParserContext#BUILD BUILD}</code> is none is specified.
* @see ErrorParserContext
*/
private static int contextTypes(IConfigurationElement errorParserElement) {
private static void findContexts(String errorParserId, IConfigurationElement errorParserElement) {
Set<String> contexts = fErrorParserContexts.get(errorParserId);
IConfigurationElement[] contextElements = errorParserElement.getChildren(ELEM_CONTEXT);
if (contextElements.length == 0) {
return BUILD;
return;
}
boolean newContextCreated = false;
if (contexts == null) {
contexts = new HashSet<String>();
newContextCreated = true;
}
int contexts = 0;
for (IConfigurationElement contextElement : contextElements) {
String contextType = contextElement.getAttribute(ATTR_TYPE);
contexts = contexts | ErrorParserContext.getValue(contextType);
String context = contextElement.getAttribute(ATTR_TYPE);
if (context != null) {
contexts.add(context);
}
}
if (newContextCreated && !contexts.isEmpty()) {
fErrorParserContexts.put(errorParserId, contexts);
}
return contexts;
}
/**
* Return error parser as stored in internal list.
*
@ -639,8 +619,7 @@ public class ErrorParserExtensionManager {
* @return internal instance of error parser
*/
public static IErrorParser getErrorParserInternal(String id) {
Pair<IErrorParserNamed, Integer> pair = fAvailableErrorParsers.get(id);
IErrorParserNamed errorParser = pair.first;
IErrorParserNamed errorParser = fAvailableErrorParsers.get(id);
if (errorParser instanceof ErrorParserNamedWrapper)
return ((ErrorParserNamedWrapper) errorParser).getErrorParser();
return errorParser;
@ -685,25 +664,14 @@ public class ErrorParserExtensionManager {
* from workspace
*/
public static String[] getErrorParserAvailableIds() {
return getErrorParserIds(fAvailableErrorParsers, BUILD);
return fAvailableErrorParsers.keySet().toArray(new String[fAvailableErrorParsers.size()]);
}
/**
* @return IDs of error parsers contributed through error parser extension point.
*/
public static String[] getErrorParserExtensionIds() {
return getErrorParserIds(fExtensionErrorParsers, BUILD);
}
private static String[] getErrorParserIds(
Map<String, Pair<IErrorParserNamed, Integer>> parsers, int context) {
List<String> ids = new ArrayList<String>();
for (Map.Entry<String, Pair<IErrorParserNamed, Integer>> entry : parsers.entrySet()) {
if (isInContext(entry.getValue(), context)) {
ids.add(entry.getKey());
}
}
return ids.toArray(new String[ids.size()]);
return fExtensionErrorParsers.keySet().toArray(new String[fExtensionErrorParsers.size()]);
}
/**
@ -748,7 +716,7 @@ public class ErrorParserExtensionManager {
*/
public static String[] getDefaultErrorParserIds() {
if (fDefaultErrorParserIds == null) {
return getErrorParserIds(fAvailableErrorParsers, BUILD);
return fAvailableErrorParsers.keySet().toArray(new String[fAvailableErrorParsers.size()]);
}
return fDefaultErrorParserIds.toArray(new String[fDefaultErrorParserIds.size()]);
}
@ -760,26 +728,8 @@ public class ErrorParserExtensionManager {
* shallow copy with the same instance of underlying error parser.
*/
public static IErrorParserNamed getErrorParserCopy(String id, boolean isExtension) {
return getErrorParserCopy(id, isExtension, BUILD);
}
IErrorParserNamed errorParser = isExtension ? fExtensionErrorParsers.get(id) : fAvailableErrorParsers.get(id);
/**
* @param id - ID of error parser
* @param isExtension - if {@code true} get unmodified copy of error parser defined as extension
* @param context - context where the error parser will be used. Valid values are defined by
* <code>{@link ErrorParserContext}</code>.
* @return cloned copy of error parser. Note that {@link ErrorParserNamedWrapper} returns
* shallow copy with the same instance of underlying error parser.
* @see ErrorParserContext
*/
public static IErrorParserNamed getErrorParserCopy(String id, boolean isExtension,
int context) {
Pair<IErrorParserNamed, Integer> pair =
isExtension ? fExtensionErrorParsers.get(id) : fAvailableErrorParsers.get(id);
if (pair == null || !isInContext(pair, context)) {
return null;
}
IErrorParserNamed errorParser = pair.first;
try {
if (errorParser instanceof RegexErrorParser) {
return (RegexErrorParser) ((RegexErrorParser) errorParser).clone();
@ -791,8 +741,38 @@ public class ErrorParserExtensionManager {
}
return errorParser;
}
private static boolean isInContext(Pair<IErrorParserNamed, Integer> pair, int context) {
return (pair.second & context) != 0;
/**
* @param context - indicates the context in which an error parser can be used.
* @return available error parsers ID, which include contributed through extension and user-
* defined ones from workspace, that can be used in the given context.
*/
public static String[] getErrorParserAvailableIdsInContext(String context) {
List<String> ids = new ArrayList<String>();
for (String id : fAvailableErrorParsers.keySet()) {
if (getErrorParserContexts(id).contains(context)) {
ids.add(id);
}
}
return ids.toArray(new String[ids.size()]);
}
/**
* Returns all the contexts of the error parser with the given ID. Contexts are {@code String}
* values belonging to an error parser, defined as part the "errorparser" extension point
* element.
* <p>
* If an error parser does not have an explicit context, it is assumed that the error parser
* can be used in the "build" context.
* </p>
* @param id the id of the error parser.
* @return the contexts of the error parser with the given ID.
*/
private static Collection<String> getErrorParserContexts(String id) {
Set<String> contexts = fErrorParserContexts.get(id);
if (contexts == null) {
return Collections.singletonList(ErrorParserManager.BUILD_CONTEXT);
}
return contexts;
}
}

View file

@ -15,13 +15,14 @@
<artifactId>org.eclipse.cdt.ui.tests</artifactId>
<packaging>eclipse-test-plugin</packaging>
<repositories>
<!-- Uncommenting this is useful when the repo is built first then you want to run tests on this plugin only -->
<!-- <repositories>
<repository>
<id>cdt.repo</id>
<url>file:/${basedir}/../../releng/org.eclipse.cdt.repo/target/repository</url>
<layout>p2</layout>
</repository>
</repositories>
</repositories>-->
<build>
<plugins>

View file

@ -49,7 +49,7 @@ public class RefactoringTests extends BaseTestFramework {
super.setUp();
CCorePlugin.getIndexManager().setIndexerId(cproject, IPDOMManager.ID_FAST_INDEXER);
fBufferSize= FileCharSequenceProvider.BUFFER_SIZE;
FileCharSequenceProvider.BUFFER_SIZE= 1024*4;
FileCharSequenceProvider.BUFFER_SIZE= 1024 * 4;
}
@Override
@ -65,7 +65,7 @@ public class RefactoringTests extends BaseTestFramework {
protected void assertTotalChanges(int numChanges, int potChanges, int commentCh,
Change changes) throws Exception {
int count[]= {0,0,0};
int count[]= { 0, 0, 0 };
if (changes != null) {
countChanges(changes, count);
}

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
@ -21,12 +21,14 @@ import org.eclipse.ltk.core.refactoring.RefactoringStatus;
public class RenameFunctionTests extends RenameTests {
public RenameFunctionTests(String name) {
public RenameFunctionTests(String name) {
super(name);
}
public static Test suite(){
return suite(true);
}
public static Test suite( boolean cleanup ) {
TestSuite suite = new TestSuite(RenameFunctionTests.class);

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
@ -24,9 +24,11 @@ public class RenameMacroTests extends RenameTests {
public RenameMacroTests(String name) {
super(name);
}
public static Test suite(){
return suite(true);
}
public static Test suite( boolean cleanup ) {
TestSuite suite = new TestSuite(RenameMacroTests.class);
if (cleanup) {
@ -34,8 +36,7 @@ public class RenameMacroTests extends RenameTests {
}
return suite;
}
public void testMacroRename() throws Exception {
StringWriter writer = new StringWriter();
writer.write("#define HALLO x \n"); //$NON-NLS-1$

View file

@ -6,9 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
import java.io.StringWriter;
@ -28,9 +27,11 @@ public class RenameTemplatesTests extends RenameTests {
public RenameTemplatesTests(String name) {
super(name);
}
public static Test suite(){
return suite(true);
}
public static Test suite( boolean cleanup ) {
TestSuite suite = new TestSuite(RenameTemplatesTests.class);
if (cleanup) {
@ -39,7 +40,6 @@ public class RenameTemplatesTests extends RenameTests {
return suite;
}
public void testClassTemplate() throws Exception {
StringWriter writer = new StringWriter();
writer.write("template <class Type> \n"); //$NON-NLS-1$

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
@ -31,7 +31,6 @@ import org.eclipse.cdt.internal.ui.refactoring.rename.TextSearchWrapper;
* @author markus.schorn@windriver.com
*/
public class RenameTests extends RefactoringTests {
private static final IProgressMonitor NPM = new NullProgressMonitor();
public RenameTests(String name) {
@ -58,7 +57,7 @@ public class RenameTests extends RefactoringTests {
return change;
}
fail ("Input check on "+ newName + " failed. "+rs.getEntryMatchingSeverity(RefactoringStatus.ERROR) ); //$NON-NLS-1$ //$NON-NLS-2$
fail ("Input check on " + newName + " failed. "+rs.getEntryMatchingSeverity(RefactoringStatus.ERROR) ); //$NON-NLS-1$ //$NON-NLS-2$
//rs.getFirstMessage(RefactoringStatus.ERROR) is not the message displayed in
//the UI for renaming a method to a constructor, the first message which is only
//a warning is shown in the UI. If you click preview, then the error and the warning
@ -153,8 +152,7 @@ public class RenameTests extends RefactoringTests {
}
@Override
protected IFile importFile(String fileName, String contents)
throws Exception {
protected IFile importFile(String fileName, String contents) throws Exception {
IFile result= super.importFile(fileName, contents);
waitForIndexer();
return result;

View file

@ -1,14 +1,14 @@
/*******************************************************************************
* Copyright (c) 2005, 2008 Wind River Systems, Inc.
* Copyright (c) 2005, 2012 Wind River Systems, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
import java.io.StringWriter;
@ -28,18 +28,19 @@ public class RenameTypeTests extends RenameTests {
public RenameTypeTests(String name) {
super(name);
}
public static Test suite(){
public static Test suite() {
return suite(true);
}
public static Test suite( boolean cleanup ) {
public static Test suite(boolean cleanup) {
TestSuite suite = new TestSuite(RenameTypeTests.class);
if (cleanup) {
suite.addTest( new RefactoringTests("cleanupProject") ); //$NON-NLS-1$
suite.addTest(new RefactoringTests("cleanupProject")); //$NON-NLS-1$
}
return suite;
}
public void testClassNameConflicts() throws Exception {
createCppFwdDecls("cpp_fwd.hh"); //$NON-NLS-1$
createCppDefs("cpp_def.hh"); //$NON-NLS-1$
@ -75,7 +76,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -417,7 +418,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -755,7 +756,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -1079,7 +1080,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
@ -1176,7 +1177,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -1493,7 +1494,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" int w1; vv1.v++; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.c", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.c", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
@ -1580,7 +1581,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" int w3; v3 v; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -1837,7 +1838,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" int w1; enum v1 v; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.c", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.c", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
@ -1925,7 +1926,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" } \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
int offset2= contents.indexOf("v2"); //$NON-NLS-1$
@ -2176,7 +2177,7 @@ public class RenameTypeTests extends RenameTests {
writer.write(" int w1; v1 v; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.c", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.c", contents); //$NON-NLS-1$
int offset1= contents.indexOf("v1"); //$NON-NLS-1$
@ -2248,7 +2249,7 @@ public class RenameTypeTests extends RenameTests {
status= checkConditions(cpp, offset1, "un_member"); //$NON-NLS-1$
assertRefactoringOk(status);
}
public void testRenameClass() throws Exception {
StringWriter writer = new StringWriter();
writer.write("class String \n"); //$NON-NLS-1$
@ -2257,42 +2258,61 @@ public class RenameTypeTests extends RenameTests {
writer.write(" String(); \n"); //$NON-NLS-1$
writer.write(" String(const String &other); \n"); //$NON-NLS-1$
writer.write(" ~String(); \n"); //$NON-NLS-1$
writer.write(" String &operator=( const String &other ); \n"); //$NON-NLS-1$
writer.write(" String &operator=(const String &other); \n"); //$NON-NLS-1$
writer.write("}; \n"); //$NON-NLS-1$
writer.write(" String::String(){} \n"); //$NON-NLS-1$
writer.write(" String::String(const String &other){}; \n"); //$NON-NLS-1$
writer.write(" String::~String(){}; \n"); //$NON-NLS-1$
writer.write(" String& String::operator=( const String &other ) \n"); //$NON-NLS-1$
writer.write(" {return *this;} \n"); //$NON-NLS-1$
writer.write(" String::String() {} \n"); //$NON-NLS-1$
writer.write(" String::String(const String &other) {}; \n"); //$NON-NLS-1$
writer.write(" String::~String() {}; \n"); //$NON-NLS-1$
writer.write(" String& String::operator=(const String &other) \n"); //$NON-NLS-1$
writer.write(" {return *this;} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset1= contents.indexOf("String"); //$NON-NLS-1$
int offset= contents.indexOf("String"); //$NON-NLS-1$
// conflicting renamings
RefactoringStatus status= checkConditions(cpp, offset1, "CString"); //$NON-NLS-1$
RefactoringStatus status= checkConditions(cpp, offset, "CString"); //$NON-NLS-1$
assertRefactoringOk(status);
Change ch= getRefactorChanges(cpp, offset1, "CString"); //$NON-NLS-1$
Change ch= getRefactorChanges(cpp, offset, "CString"); //$NON-NLS-1$
assertTotalChanges(countOccurrences(contents, "String"), ch); //$NON-NLS-1$
}
public void testUsingDeclaration_332895() throws Exception {
StringWriter writer = new StringWriter();
writer.write("namespace ns { \n"); //$NON-NLS-1$
writer.write("typedef int MyType; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
writer.write(" \n"); //$NON-NLS-1$
writer.write("using ns::MyType; \n"); //$NON-NLS-1$
writer.write("MyType a; \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset= contents.indexOf("MyType"); //$NON-NLS-1$
RefactoringStatus status= checkConditions(cpp, offset, "YourType"); //$NON-NLS-1$
assertRefactoringOk(status);
Change ch= getRefactorChanges(cpp, offset, "YourType"); //$NON-NLS-1$
assertTotalChanges(countOccurrences(contents, "MyType"), ch); //$NON-NLS-1$
}
public void testBug72888() throws Exception {
StringWriter writer = new StringWriter();
writer.write("class MyEx {}; \n"); //$NON-NLS-1$
writer.write("void someFunc() { \n"); //$NON-NLS-1$
writer.write(" throw MyEx(); \n"); //$NON-NLS-1$
writer.write(" throw MyEx(); \n"); //$NON-NLS-1$
writer.write("}; \n"); //$NON-NLS-1$
writer.write("int main(){ \n"); //$NON-NLS-1$
writer.write(" try{ \n"); //$NON-NLS-1$
writer.write(" try { \n"); //$NON-NLS-1$
writer.write(" someFunc(); \n"); //$NON-NLS-1$
writer.write(" } catch(MyEx &e) {} \n"); //$NON-NLS-1$
writer.write(" return 0; \n"); //$NON-NLS-1$
writer.write("} \n"); //$NON-NLS-1$
String contents = writer.toString();
IFile cpp= importFile("test.cpp", contents ); //$NON-NLS-1$
IFile cpp= importFile("test.cpp", contents); //$NON-NLS-1$
int offset = contents.indexOf("MyEx") ; //$NON-NLS-1$
Change changes = getRefactorChanges(cpp, offset, "xx"); //$NON-NLS-1$
assertTotalChanges( 3, changes );
assertTotalChanges(3, changes);
}
}

View file

@ -6,9 +6,8 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
import java.io.StringWriter;
@ -28,9 +27,11 @@ public class RenameVariableTests extends RenameTests {
public RenameVariableTests(String name) {
super(name);
}
public static Test suite(){
return suite(true);
}
public static Test suite( boolean cleanup ) {
TestSuite suite = new TestSuite(RenameVariableTests.class);

View file

@ -6,20 +6,24 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.ui.tests.refactoring.rename;
import org.eclipse.core.runtime.*;
import org.eclipse.ltk.core.refactoring.*;
import org.eclipse.ltk.core.refactoring.participants.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RenameArguments;
import org.eclipse.ltk.core.refactoring.participants.RenameParticipant;
public class TestRenameParticipant extends RenameParticipant {
private static Object sElement= null;
private static RenameArguments sArguments= null;
private static int sConditionCheck= 0;
private static int sCreateChange= 0;
private static Object sElement;
private static RenameArguments sArguments;
private static int sConditionCheck;
private static int sCreateChange;
public static int getConditionCheckCount() {
return sConditionCheck;
@ -40,7 +44,8 @@ public class TestRenameParticipant extends RenameParticipant {
public static void reset() {
sElement= null;
sArguments= null;
sConditionCheck= sCreateChange= 0;
sConditionCheck= 0;
sCreateChange= 0;
}
@Override

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2011 Wind River Systems, Inc. and others.
* Copyright (c) 2005, 2012 Wind River Systems, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -97,6 +97,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration;
import org.eclipse.cdt.core.index.IIndex;
import org.eclipse.cdt.core.index.IIndexBinding;
import org.eclipse.cdt.core.index.IIndexName;
@ -1208,18 +1209,27 @@ public class ASTManager implements IDisposable {
} else {
final IASTTranslationUnit tu = name.getTranslationUnit();
final IIndex index= tu != null ? tu.getIndex() : null;
for (IBinding renameBinding : fValidBindings) {
try {
int cmp0= isSameBinding(index, binding, renameBinding);
if (cmp0 != FALSE) {
cmp= cmp0;
}
if (cmp0 == TRUE) {
break;
}
} catch (DOMException e) {
handleDOMException(name.getTranslationUnit(), e, status);
cmp= UNKNOWN;
IBinding[] bindings = binding instanceof ICPPUsingDeclaration ?
((ICPPUsingDeclaration) binding).getDelegates() : new IBinding[] { binding };
// When a 'using' declaration has multiple delegate bindings and only some of them
// are being renamed, to preserve correctness of the code we would have to split
// the 'using' declaration into two separate ones. We currently don't do that and
// rename the 'using' declaration if at least one of its delegate bindings is being
// renamed.
outer: for (IBinding b : bindings) {
for (IBinding renameBinding : fValidBindings) {
try {
int cmp0= isSameBinding(index, b, renameBinding);
if (cmp0 != FALSE) {
cmp= cmp0;
}
if (cmp0 == TRUE) {
break outer;
}
} catch (DOMException e) {
handleDOMException(name.getTranslationUnit(), e, status);
cmp= UNKNOWN;
}
}
}
}

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -63,7 +63,7 @@ public class CRefactoringMatch {
return fFile;
}
public void setASTInformation(int val) {
switch(fAstInformation) {
switch (fAstInformation) {
case AST_REFERENCE:
case AST_REFERENCE_OTHER:
case AST_REFEREENCE_CONFLICTING:

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;
@ -20,7 +20,6 @@ import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor;
/**
* Processor adding constructor and destructor to the bindings to be renamed.
*/

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Schorn - initial API and implementation
* Markus Schorn - initial API and implementation
******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring.rename;

View file

@ -244,7 +244,7 @@ public class ErrorParsTab extends AbstractCPropertyTab {
}
fAvailableErrorParsers.clear();
fOptionsPageMap.clear();
for (String id : ErrorParserManager.getErrorParserAvailableIds()) {
for (String id : ErrorParserManager.getErrorParserAvailableIdsInContext(ErrorParserManager.BUILD_CONTEXT)) {
IErrorParserNamed errorParser = ErrorParserManager.getErrorParserCopy(id);
fAvailableErrorParsers.put(id, errorParser);
initializeOptionsPage(id);

View file

@ -4,9 +4,7 @@
label="%featureName"
version="1.1.0.qualifier"
provider-name="%providerName"
plugin="org.eclipse.cdt.build.crossgcc"
license-feature="org.eclipse.cdt.license"
license-feature-version="1.0.0.qualifier">
plugin="org.eclipse.cdt.build.crossgcc">
<description>
%description

View file

@ -3,9 +3,7 @@
id="org.eclipse.cdt.launch.remote"
label="%featureName"
version="6.0.0.qualifier"
provider-name="%providerName"
license-feature="org.eclipse.cdt.license"
license-feature-version="1.0.0.qualifier">
provider-name="%providerName">
<description>
%description

View file

@ -18,7 +18,6 @@ bin.includes = META-INF/,\
about.ini,\
about.mappings,\
about.properties,\
eclipse32.png,\
plugin.properties,\
plugin.xml,\
remotecdt.html,\

View file

@ -22,7 +22,12 @@ Export-Package: org.eclipse.cdt.debug.core,
org.eclipse.cdt.debug.internal.core.breakpoints;x-friends:="org.eclipse.cdt.debug.edc,org.eclipse.cdt.dsf.gdb",
org.eclipse.cdt.debug.internal.core.executables;x-internal:=true,
org.eclipse.cdt.debug.internal.core.model;x-internal:=true,
org.eclipse.cdt.debug.internal.core.sourcelookup;x-friends:="org.eclipse.cdt.dsf.ui,org.eclipse.cdt.debug.edc,org.eclipse.cdt.debug.gdbjtag.core"
org.eclipse.cdt.debug.internal.core.sourcelookup;
x-friends:="org.eclipse.cdt.dsf.ui,
org.eclipse.cdt.debug.edc,
org.eclipse.cdt.debug.gdbjtag.core,
org.eclipse.cdt.dsf.gdb,
org.eclipse.cdt.dsf"
Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
org.eclipse.debug.core;bundle-version="[3.2.0,4.0.0)",
org.eclipse.cdt.core;bundle-version="[5.0.0,6.0.0)",

View file

@ -10,9 +10,9 @@ Export-Package:
org.eclipse.cdt.debug.internal.ui;x-internal:x-friends:="org.eclipse.cdt.dsf.ui";x-friends:="org.eclipse.cdt.dsf.ui",
org.eclipse.cdt.debug.internal.ui.actions;x-friends:="org.eclipse.cdt.dsf.ui,org.eclipse.cdt.debug.ui.memory.memorybrowser",
org.eclipse.cdt.debug.internal.ui.actions.breakpoints;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.breakpoints;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.breakpoints;x-friends:="org.eclipse.cdt.dsf.ui",
org.eclipse.cdt.debug.internal.ui.commands;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.dialogfields;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.dialogfields;x-friends:="org.eclipse.cdt.dsf.gdb.ui",
org.eclipse.cdt.debug.internal.ui.dialogs;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.disassembly.commands;x-internal:=true,
org.eclipse.cdt.debug.internal.ui.disassembly.dsf;x-friends:="org.eclipse.cdt.dsf.ui",

View file

@ -32,10 +32,9 @@
</executions>
</plugin>
<plugin>
<!-- Change to groupId org.eclipse.tycho.extra after upgrade to Tycho 0.14 -->
<groupId>com.google.code.tycho-eclipserun-plugin</groupId>
<groupId>org.eclipse.tycho.extras</groupId>
<artifactId>tycho-eclipserun-plugin</artifactId>
<version>${tycho-version}</version>
<version>${tycho-extras-version}</version>
<configuration>
<appArgLine>-application org.eclipse.ant.core.antRunner -buildfile buildDoc.xml</appArgLine>
<dependencies>

View file

@ -32,10 +32,9 @@
</executions>
</plugin>
<plugin>
<!-- Change to groupId org.eclipse.tycho.extra after upgrade to Tycho 0.14 -->
<groupId>com.google.code.tycho-eclipserun-plugin</groupId>
<groupId>org.eclipse.tycho.extras</groupId>
<artifactId>tycho-eclipserun-plugin</artifactId>
<version>${tycho-version}</version>
<version>${tycho-extras-version}</version>
<configuration>
<appArgLine>-application org.eclipse.ant.core.antRunner -buildfile customBuildCallbacks.xml build.index</appArgLine>
<dependencies>

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.tracepointactions;
@ -14,9 +15,16 @@ import org.eclipse.cdt.debug.core.breakpointactions.IBreakpointAction;
import org.eclipse.cdt.debug.ui.breakpointactions.IBreakpointActionPage;
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.CollectAction;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
@ -26,7 +34,20 @@ import org.eclipse.swt.widgets.Text;
*/
public class CollectActionPage extends PlatformObject implements IBreakpointActionPage {
/**
* An exception to indicate that the user-specified string limit is invalid
*/
private class IllegalCollectStringLimitException extends Exception {
private static final long serialVersionUID = -2087722354642237691L;
public IllegalCollectStringLimitException(String message) {
super(message);
}
}
private Text fCollectString;
private Button fTreatCharPtrAsStrings;
private Text fTreatCharPtrAsStringsLimit;
private CollectAction fCollectAction;
/**
@ -36,14 +57,73 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi
Composite composite = new Composite(parent, style);
composite.setLayout(new GridLayout(2, false));
// The label asking for what to collect
final Label collectLabel = new Label(composite, SWT.NONE);
collectLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
collectLabel.setText(MessagesForTracepointActions.TracepointActions_Collect_Label);
// The user-specified string of what to collect
fCollectString = new Text(composite, SWT.BORDER);
fCollectString.setText(fCollectAction.getCollectString());
fCollectString.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fCollectString.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
// An option to collect character pointers as strings
fTreatCharPtrAsStrings = new Button(composite, SWT.CHECK);
GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1);
gd.verticalIndent = 15;
// Store the button width before we add the text as we only care about the checkbox width
int buttonWidth = fTreatCharPtrAsStrings.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
fTreatCharPtrAsStrings.setText(MessagesForTracepointActions.TracepointActions_Collect_Strings_Label);
fTreatCharPtrAsStrings.setLayoutData(gd);
fTreatCharPtrAsStrings.setSelection(fCollectAction.getCharPtrAsStrings());
fTreatCharPtrAsStrings.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
// Disable/enable the limit field
fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
// Disable/enable the limit field
fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection());
}
});
// A label asking for an optional limit of bytes of collected strings
final Label limitLabel = new Label(composite, SWT.NONE);
gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
gd.horizontalIndent = buttonWidth;
limitLabel.setLayoutData(gd);
limitLabel.setText(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Label);
// A user-specified limit of bytes
fTreatCharPtrAsStringsLimit = new Text(composite, SWT.BORDER);
fTreatCharPtrAsStringsLimit.setText(getCharPtrAsStringLimit(fCollectAction.getCharPtrAsStringsLimit()));
gd = new GridData(SWT.FILL, SWT.CENTER, false, false);
gd.horizontalIndent = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth();
fTreatCharPtrAsStringsLimit.setLayoutData(gd);
fTreatCharPtrAsStringsLimit.setEnabled(fTreatCharPtrAsStrings.getSelection());
final ControlDecoration decoration = new ControlDecoration(fTreatCharPtrAsStringsLimit, SWT.TOP | SWT.LEFT, composite );
decoration.hide();
fTreatCharPtrAsStringsLimit.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
try {
getCharPtrAsStringLimit(fTreatCharPtrAsStringsLimit.getText());
decoration.hide();
} catch (IllegalCollectStringLimitException exception) {
decoration.setImage(
FieldDecorationRegistry.getDefault().getFieldDecoration(
FieldDecorationRegistry.DEC_ERROR).getImage());
decoration.setDescriptionText(exception.getMessage());
decoration.show();
}
}
});
return composite;
}
@ -58,6 +138,14 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi
@Override
public void actionDialogOK() {
fCollectAction.setCollectString(fCollectString.getText());
fCollectAction.setCharPtrAsStrings(fTreatCharPtrAsStrings.getSelection());
try {
Integer limit = getCharPtrAsStringLimit(fTreatCharPtrAsStringsLimit.getText());
fCollectAction.setCharPtrAsStringsLimit(limit);
} catch (IllegalCollectStringLimitException e) {
// ignore and keep old value
}
}
@Override
@ -66,4 +154,37 @@ public class CollectActionPage extends PlatformObject implements IBreakpointActi
return createCollectActionComposite(composite, style);
}
/**
* Convert the user-specified string into an integer.
* If the string is not valid, disable the limit by using null.
* @param limitStr The string provided by the user
* @return An non-negative integer limit, or null for no limit.
*/
private Integer getCharPtrAsStringLimit(String limitStr) throws IllegalCollectStringLimitException {
limitStr = limitStr.trim();
Integer limit = null;
try {
limit = Integer.parseInt(limitStr);
if (limit < 0) {
throw new IllegalCollectStringLimitException(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Error);
}
} catch (NumberFormatException e) {
if (!limitStr.isEmpty()) {
// We only accept an empty string, which means no limit
throw new IllegalCollectStringLimitException(MessagesForTracepointActions.TracepointActions_Collect_Strings_Limit_Error);
}
}
return limit;
}
/**
* Convert the integer limit into a string.
* If the string is not valid, disable the limit by using null.
* @param limit The integer limit to convert. Can be null for no limit.
* @return The limit as a string, where no limit or a negative limit is the empty string.
*/
private String getCharPtrAsStringLimit(Integer limit) {
if (limit == null || limit < 0) return ""; //$NON-NLS-1$
return Integer.toString(limit);
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.ui.tracepointactions;
@ -39,6 +40,9 @@ class MessagesForTracepointActions extends NLS {
public static String TracepointActions_Collect_Label;
public static String TracepointActions_Evaluate_Label;
public static String TracepointActions_WhileStepping_Sub_Actions;
public static String TracepointActions_Collect_Strings_Label;
public static String TracepointActions_Collect_Strings_Limit_Label;
public static String TracepointActions_Collect_Strings_Limit_Error;
static {
// initialize resource bundle

View file

@ -1,5 +1,5 @@
###############################################################################
# Copyright (c) 2010 Ericsson and others.
# Copyright (c) 2010, 2012 Ericsson and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
#
# Contributors:
# Ericsson - initial API and implementation
# Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707)
###############################################################################
TracepointActions_Actions_for_this_tracepoint=Actions for this tracepoint:
@ -29,3 +30,6 @@ TracepointActions_ActionDialog_Type=Action type:
TracepointActions_Collect_Label=Data to collect (comma-separated list):
TracepointActions_Evaluate_Label=Expressions to evaluate (comma-separated list):
TracepointActions_WhileStepping_Sub_Actions=Sub-actions for While-stepping
TracepointActions_Collect_Strings_Label=Collect all character pointers as strings
TracepointActions_Collect_Strings_Limit_Label=with optional string size limit (bytes):
TracepointActions_Collect_Strings_Limit_Error=Only non-negative integers can be used. Current value will be ignored.

View file

@ -20,10 +20,10 @@ Export-Package: org.eclipse.cdt.dsf.gdb,
org.eclipse.cdt.dsf.gdb.actions,
org.eclipse.cdt.dsf.gdb.breakpoints,
org.eclipse.cdt.dsf.gdb.internal;x-friends:="org.eclipse.cdt.dsf.gdb.ui,org.eclipse.cdt.debug.gdbjtag.ui",
org.eclipse.cdt.dsf.gdb.internal.commands;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.commands;x-friends:="org.eclipse.cdt.dsf.gdb.ui",
org.eclipse.cdt.dsf.gdb.internal.memory;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.service.command.events;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.tracepointactions;x-internal:=true,
org.eclipse.cdt.dsf.gdb.internal.tracepointactions;x-friends:="org.eclipse.cdt.dsf.gdb.ui",
org.eclipse.cdt.dsf.gdb.launching,
org.eclipse.cdt.dsf.gdb.service,
org.eclipse.cdt.dsf.gdb.service.command,

View file

@ -159,4 +159,45 @@ public class GdbPlugin extends Plugin {
return traceBuilder.toString();
}
/**
* Convenience method which returns the unique identifier of this plugin.
*/
public static String getUniqueIdentifier() {
if (getDefault() == null) {
// If the default instance is not yet initialized,
// return a static identifier. This identifier must
// match the plugin id defined in plugin.xml
return PLUGIN_ID;
}
return getDefault().getBundle().getSymbolicName();
}
/**
* Logs the specified status with this plug-in's log.
*
* @param status
* status to log
*/
public static void log(IStatus status) {
getDefault().getLog().log(status);
}
/**
* Logs an internal error with the specified message.
*
* @param message
* the error message to log
*/
public static void logErrorMessage(String message) {
log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, message, null));
}
/**
* Logs an internal error with the specified throwable
*
* @param e
* the exception to be logged
*/
public static void log(Throwable e) {
log(new Status(IStatus.ERROR, getUniqueIdentifier(), IStatus.ERROR, e.getMessage(), e));
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for collecting char pointers as strings (bug 373707)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.tracepointactions;
@ -21,21 +22,43 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import com.ibm.icu.text.MessageFormat;
/**
* Action used to tell GDB to collect different values from a tracepoint.
* It corresponds to GDB's 'collect' action.
*
* As for GDB 7.4:
* collect[/s] EXPRESSIONS
* The tracepoint collect command now takes an optional modifier "/s"
* that directs it to dereference pointer-to-character types and
* collect the bytes of memory up to a zero byte. The behavior is
* similar to what you see when you use the regular print command on a
* string. An optional integer following the "/s" sets a bound on the
* number of bytes that will be collected.
*
* @since 3.0
*/
public class CollectAction extends AbstractTracepointAction {
private static final String COLLECT_ACTION_ID = "org.eclipse.cdt.dsf.gdb.tracepointactions.CollectAction"; //$NON-NLS-1$
private static final String COLLECT_ACTION_ELEMENT_NAME = "collectData"; //$NON-NLS-1$
private static final String COLLECT_STRING_ATTR = "collectString"; //$NON-NLS-1$
private static final String COLLECT_AS_STRING_ATTR = "collectAsString"; //$NON-NLS-1$
private static final String COLLECT_AS_STRING_LIMIT_ATTR = "collectAsStringLimit"; //$NON-NLS-1$
private String fCollectString = ""; //$NON-NLS-1$
/** Indicates if we should ask GDB to collect character pointers as strings */
private boolean fCharPtrAsStrings;
/**
* Optional limit of the size of the string to collect for character pointers.
* Null will indicate that no limit is to be used.
* This value should be non-negative. */
private Integer fCharPtrAsStringsLimit;
@Override
public String getDefaultName() {
@ -50,6 +73,45 @@ public class CollectAction extends AbstractTracepointAction {
fCollectString = str;
}
/**
* Indicates if this collect action will treat character pointers as strings.
* @since 4.1
*/
public boolean getCharPtrAsStrings() {
return fCharPtrAsStrings;
}
/**
* Specify if this collect action should treat character pointers as strings.
* @since 4.1
*/
public void setCharPtrAsStrings(boolean enable) {
fCharPtrAsStrings = enable;
}
/**
* Indicates the maximum number of bytes that should be collected
* when treating character pointers as strings
* @return null if no limit is to be used
* @return a non-negative integer indicating the limit
*
* @since 4.1
*/
public Integer getCharPtrAsStringsLimit() {
return fCharPtrAsStringsLimit;
}
/**
* Specify the maximum number of bytes that should be collected when
* when treating character pointers as strings.
* @param limit A non-negative integer, or null of no limit should be used.
*
* @since 4.1
*/
public void setCharPtrAsStringsLimit(Integer limit) {
fCharPtrAsStringsLimit = limit;
}
@Override
public String getIdentifier() {
return COLLECT_ACTION_ID;
@ -65,8 +127,12 @@ public class CollectAction extends AbstractTracepointAction {
docBuilder = dfactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("collectData"); //$NON-NLS-1$
rootElement.setAttribute("collectString", fCollectString); //$NON-NLS-1$
Element rootElement = doc.createElement(COLLECT_ACTION_ELEMENT_NAME);
// Store the different attributes of this collect action
rootElement.setAttribute(COLLECT_STRING_ATTR, fCollectString);
rootElement.setAttribute(COLLECT_AS_STRING_ATTR, Boolean.toString(fCharPtrAsStrings));
rootElement.setAttribute(COLLECT_AS_STRING_LIMIT_ATTR, fCharPtrAsStringsLimit == null ? "" : fCharPtrAsStringsLimit.toString()); //$NON-NLS-1$
doc.appendChild(rootElement);
@ -84,14 +150,29 @@ public class CollectAction extends AbstractTracepointAction {
collectData = s.toString("UTF8"); //$NON-NLS-1$
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
return collectData;
}
@Override
public String getSummary() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Collect_text, new Object[] { fCollectString });
// Return the exact format that will be sent to GDB.
StringBuffer collectCmd = new StringBuffer("collect "); //$NON-NLS-1$
if (fCharPtrAsStrings) {
collectCmd.append("/s"); //$NON-NLS-1$
if (fCharPtrAsStringsLimit != null) {
// No space between /s and the limit
collectCmd.append(fCharPtrAsStringsLimit.toString());
}
// Now add the space before we append what to collect.
collectCmd.append(" "); //$NON-NLS-1$
}
// Finally, actually add what to collect
collectCmd.append(fCollectString);
return collectCmd.toString();
}
@Override
@ -107,16 +188,33 @@ public class CollectAction extends AbstractTracepointAction {
parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler(new DefaultHandler());
root = parser.parse(new InputSource(new StringReader(data))).getDocumentElement();
fCollectString = root.getAttribute("collectString"); //$NON-NLS-1$
if (fCollectString == null)
throw new Exception();
fCollectString = root.getAttribute(COLLECT_STRING_ATTR);
if (fCollectString == null) fCollectString = ""; //$NON-NLS-1$
String asStrings = root.getAttribute(COLLECT_AS_STRING_ATTR);
if (asStrings != null) {
fCharPtrAsStrings = Boolean.valueOf(asStrings);
} else {
fCharPtrAsStrings = false;
}
fCharPtrAsStringsLimit = null;
String asStringsLimit = root.getAttribute(COLLECT_AS_STRING_LIMIT_ATTR);
if (asStringsLimit != null) {
try {
fCharPtrAsStringsLimit = Integer.valueOf(asStringsLimit);
} catch (NumberFormatException e) {
// leave as null to disable
}
}
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
}
@Override
public String toString() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Collect_text, new Object[] { fCollectString });
return getSummary();
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,8 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Don't use translatable strings for the command summary
* since it will be send directly to GDB
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.tracepointactions;
@ -21,13 +23,12 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import com.ibm.icu.text.MessageFormat;
/**
* @since 3.0
*/
@ -83,14 +84,15 @@ public class EvaluateAction extends AbstractTracepointAction {
collectData = s.toString("UTF8"); //$NON-NLS-1$
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
return collectData;
}
@Override
public String getSummary() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Evaluate_text, new Object[] { fEvalString });
// Create command to be sent to GDB
return String.format("teval %s", fEvalString); //$NON-NLS-1$
}
@Override
@ -110,12 +112,12 @@ public class EvaluateAction extends AbstractTracepointAction {
if (fEvalString == null)
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
}
@Override
public String toString() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_Evaluate_text, new Object[] { fEvalString });
return getSummary();
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,7 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Remove strings that should not be translated
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.tracepointactions;
@ -25,9 +26,6 @@ class MessagesForTracepointActions extends NLS {
public static String TracepointActions_Collect_Name;
public static String TracepointActions_Evaluate_Name;
public static String TracepointActions_WhileStepping_Name;
public static String TracepointActions_Collect_text;
public static String TracepointActions_Evaluate_text;
public static String TracepointActions_WhileStepping_text;
static {
// initialize resource bundle

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010 Ericsson and others.
* Copyright (c) 2010, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,6 +7,8 @@
*
* Contributors:
* Ericsson - initial API and implementation
* Marc Khouzam (Ericsson) - Don't use translatable strings for the command summary
* since it will be send directly to GDB
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.internal.tracepointactions;
@ -21,13 +23,12 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import com.ibm.icu.text.MessageFormat;
/**
* @since 3.0
*/
@ -120,14 +121,15 @@ public class WhileSteppingAction extends AbstractTracepointAction {
collectData = s.toString("UTF8"); //$NON-NLS-1$
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
return collectData;
}
@Override
public String getSummary() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_WhileStepping_text, new Object[] { fStepCount, fSubActionContent });
// Create command to be sent to GDB
return String.format("while-stepping %s %s", fStepCount, fSubActionContent); //$NON-NLS-1$
}
@Override
@ -149,12 +151,12 @@ public class WhileSteppingAction extends AbstractTracepointAction {
throw new Exception();
setSubActionsContent(fSubActionNames);
} catch (Exception e) {
e.printStackTrace();
GdbPlugin.log(e);
}
}
@Override
public String toString() {
return MessageFormat.format(MessagesForTracepointActions.TracepointActions_WhileStepping_text, new Object[] { fStepCount, fSubActionContent });
return getSummary();
}
}

View file

@ -1,5 +1,5 @@
###############################################################################
# Copyright (c) 2010 Ericsson and others.
# Copyright (c) 2010, 2012 Ericsson and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
@ -16,8 +16,3 @@ TracepointActions_Untitled_WhileStepping=Untitled While-Stepping Action
TracepointActions_Collect_Name=Collect Action
TracepointActions_Evaluate_Name=Evaluate Action
TracepointActions_WhileStepping_Name=While-Stepping Action
# START NON-TRANSLATABLE
TracepointActions_Collect_text=collect {0}
TracepointActions_Evaluate_text=teval {0}
TracepointActions_WhileStepping_text=while-stepping {0} {1}
# END NON-TRANSLATABLE

View file

@ -9,14 +9,18 @@
* Wind River Systems - initial API and implementation
* Ericsson AB - Modified for handling of multiple threads
* Indel AG - [369622] fixed moveToLine using MinGW
* Marc Khouzam (Ericsson) - Support for operations on multiple execution contexts (bug 330974)
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -42,6 +46,7 @@ import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpointsExtension.IBreakpointHitDMEvent;
import org.eclipse.cdt.dsf.debug.service.ICachingService;
import org.eclipse.cdt.dsf.debug.service.IMultiRunControl;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
@ -104,7 +109,7 @@ import org.osgi.framework.BundleContext;
* sync with the service state.
* @since 1.1
*/
public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunControl, ICachingService
public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunControl, IMultiRunControl, ICachingService
{
@Immutable
private static class ExecutionData implements IExecutionDMData2 {
@ -396,7 +401,8 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
private void doInitialize(final RequestMonitor rm) {
register(new String[]{ IRunControl.class.getName(),
IRunControl2.class.getName(),
IMIRunControl.class.getName()},
IMIRunControl.class.getName(),
IMultiRunControl.class.getName() },
new Hashtable<String,String>());
fConnection = getServicesTracker().getService(ICommandControlService.class);
fCommandFactory = getServicesTracker().getService(IMICommandControl.class).getCommandFactory();
@ -1878,4 +1884,293 @@ public class GDBRunControl_7_0_NS extends AbstractDsfService implements IMIRunCo
}
return result;
}
///////////////////////////////////////////////////////////////////////////
// IMultiRunControl implementation
///////////////////////////////////////////////////////////////////////////
// Although multi-process in only supported for GDB >= 7.2, it is simpler
// to code for the multi-process case all the time, since it is a superset
// of the single-process case.
///////////////////////////////////////////////////////////////////////////
// Multi-resume implementation:
//
// If one or more more threads of one or many processes are selected, we want to
// resume each thread (once).
//
// If one or more more processes are selected, we want to resume each process (once).
//
// If a process is selected along with one or more threads of that same process,
// what does the user want us to do? Selecting the process will resume all its
// threads, but what do we do with the selected threads? Why are they
// selected? In an attempt to be user friendly, lets assume that the user
// wants to resume the entire process, so we ignore the selected threads part of that
// process since they will be resumed anyway.
//
// The same logic applies to multi-suspend.
///////////////////////////////////////////////////////////////////////////
/** @since 4.1 */
@Override
public void canResumeSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
if (fRunControlOperationsEnabled == false) {
rm.done(false);
return;
}
List<IExecutionDMContext> execDmcToResumeList = extractContextsForOperation(contexts);
// If any of the threads or processes can be resumed, we allow
// the user to perform the operation.
for (IExecutionDMContext execDmc : execDmcToResumeList) {
if (doCanResume(execDmc)) {
rm.done(true);
return;
}
}
// Didn't find anything that could be resumed.
rm.done(false);
}
/** @since 4.1 */
@Override
public void canResumeAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
if (fRunControlOperationsEnabled == false) {
rm.done(false);
return;
}
List<IExecutionDMContext> execDmcToResumeList = extractContextsForOperation(contexts);
// If any of the threads or processes cannot be resumed, we don't allow
// the user to perform the operation.
for (IExecutionDMContext execDmc : execDmcToResumeList) {
if (!doCanResume(execDmc)) {
rm.done(false);
return;
}
}
// Everything can be resumed
rm.done(true);
}
/**
* {@inheritDoc}
*
* For GDB, a separate resume command will be sent, one for each context
* that can be resumed.
* @since 4.1
*/
@Override
public void resume(IExecutionDMContext[] contexts, RequestMonitor rm) {
assert contexts != null;
List<IExecutionDMContext> execDmcToResumeList = extractContextsForOperation(contexts);
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
int count = 0;
// Perform resume operation on each thread or process that can be resumed
for (IExecutionDMContext execDmc : execDmcToResumeList) {
if (doCanResume(execDmc)) {
count++;
resume(execDmc, crm);
}
}
crm.setDoneCount(count);
}
///////////////////////////////////////////////////////////////////////////
// Multi-suspend implementation:
// see details of the multi-resume implementation above.
///////////////////////////////////////////////////////////////////////////
/** @since 4.1 */
@Override
public void canSuspendSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
if (fRunControlOperationsEnabled == false) {
rm.done(false);
return;
}
List<IExecutionDMContext> execDmcToSuspendList = extractContextsForOperation(contexts);
// If any of the threads or processes can be suspended, we allow
// the user to perform the operation.
for (IExecutionDMContext execDmc : execDmcToSuspendList) {
if (doCanSuspend(execDmc)) {
rm.done(true);
return;
}
}
// Didn't find anything that could be suspended.
rm.done(false);
}
/** @since 4.1 */
@Override
public void canSuspendAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
if (fRunControlOperationsEnabled == false) {
rm.done(false);
return;
}
List<IExecutionDMContext> execDmcToSuspendList = extractContextsForOperation(contexts);
// If any of the threads or processes cannot be suspended, we don't allow
// the user to perform the operation.
for (IExecutionDMContext execDmc : execDmcToSuspendList) {
if (!doCanSuspend(execDmc)) {
rm.done(false);
return;
}
}
// Everything can be suspended
rm.done(true);
}
/** @since 4.1 */
@Override
public void isSuspendedSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
List<IExecutionDMContext> execDmcSuspendedList = extractContextsForOperation(contexts);
// Look for any thread or process that is suspended
for (IExecutionDMContext execDmc : execDmcSuspendedList) {
if (isSuspended(execDmc)) {
rm.done(true);
return;
}
}
// Didn't find anything that was suspended.
rm.done(false);
}
/** @since 4.1 */
@Override
public void isSuspendedAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
assert contexts != null;
List<IExecutionDMContext> execDmcSuspendedList = extractContextsForOperation(contexts);
// Look for any thread or process that is not suspended
for (IExecutionDMContext execDmc : execDmcSuspendedList) {
if (!isSuspended(execDmc)) {
rm.done(false);
return;
}
}
// Everything is suspended.
rm.done(true);
}
/**
* {@inheritDoc}
*
* For GDB, a separate suspend command will be sent, one for each context
* that can be suspended.
* @since 4.1
*/
@Override
public void suspend(IExecutionDMContext[] contexts, RequestMonitor rm) {
assert contexts != null;
List<IExecutionDMContext> execDmcToSuspendList = extractContextsForOperation(contexts);
CountingRequestMonitor crm = new CountingRequestMonitor(getExecutor(), rm);
int count = 0;
// Perform resume operation on each thread or process that can be resumed
for (IExecutionDMContext execDmc : execDmcToSuspendList) {
if (doCanSuspend(execDmc)) {
count++;
suspend(execDmc, crm);
}
}
crm.setDoneCount(count);
}
///////////////////////////////////////////////////////////////////////////
// Multi-step implementation. Not implemented yet. See bug 330974.
///////////////////////////////////////////////////////////////////////////
/** @since 4.1 */
@Override
public void canStepSome(IExecutionDMContext[] contexts, StepType stepType, DataRequestMonitor<Boolean> rm) {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "Not implemented.", null)); //$NON-NLS-1$
}
/** @since 4.1 */
@Override
public void canStepAll(IExecutionDMContext[] contexts, StepType stepType, DataRequestMonitor<Boolean> rm) {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "Not implemented.", null)); //$NON-NLS-1$
}
/** @since 4.1 */
@Override
public void isSteppingSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "Not implemented.", null)); //$NON-NLS-1$
}
/** @since 4.1 */
@Override
public void isSteppingAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm) {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "Not implemented.", null)); //$NON-NLS-1$
}
/** @since 4.1 */
@Override
public void step(IExecutionDMContext[] contexts, StepType stepType, RequestMonitor rm) {
rm.done(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, IDsfStatusConstants.NOT_SUPPORTED, "Not implemented.", null)); //$NON-NLS-1$
}
/**
* Removes duplicates from the list of execution contexts, in case the same thread
* or process is present more than once.
*
* Also, remove any thread that is part of a process that is also present. This is
* because an operation on the process will affect all its threads anyway.
*/
private List<IExecutionDMContext> extractContextsForOperation(IExecutionDMContext[] contexts) {
// Remove duplicate contexts by using a set
Set<IExecutionDMContext> specifiedExedDmcSet = new HashSet<IExecutionDMContext>(Arrays.asList(contexts));
// A list that ignores threads for which the process is also present
List<IExecutionDMContext> execDmcForOperationList = new ArrayList<IExecutionDMContext>(specifiedExedDmcSet.size());
// Check for the case of a process selected along with some of its threads
for (IExecutionDMContext execDmc : specifiedExedDmcSet) {
if (execDmc instanceof IContainerDMContext) {
// This is a process: it is automatically part of our list
execDmcForOperationList.add(execDmc);
} else {
// Get the process for this thread
IContainerDMContext containerDmc = DMContexts.getAncestorOfType(execDmc, IContainerDMContext.class);
// Check if that process is also present
if (specifiedExedDmcSet.contains(containerDmc) == false) {
// This thread does not belong to a process that is selected, so we keep it.
execDmcForOperationList.add(execDmc);
}
}
}
return execDmcForOperationList;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2011 Ericsson and others.
* Copyright (c) 2011, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -18,6 +18,7 @@ import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.debug.service.IMultiRunControl;
import org.eclipse.cdt.dsf.debug.service.IRunControl;
import org.eclipse.cdt.dsf.debug.service.IRunControl2;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
@ -72,6 +73,7 @@ public class GDBRunControl_7_2_NS extends GDBRunControl_7_0_NS
register(new String[]{ IRunControl.class.getName(),
IRunControl2.class.getName(),
IMIRunControl.class.getName(),
IMultiRunControl.class.getName(),
GDBRunControl_7_0_NS.class.getName(),
GDBRunControl_7_2_NS.class.getName(),
},

View file

@ -0,0 +1,76 @@
#ifdef __MINGW32__
#include <process.h> // MinGW has no POSIX support; use MSVC runtime
#else
#include <pthread.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "Sleep.h"
#ifdef __MINGW32__
typedef unsigned int TID;
#else
typedef pthread_t TID;
#endif
// Set a breakpoint here so that both threads stop.
void firstBreakpoint(int id)
{
printf("First breakpoint method from thread %d\n", id);
}
#ifdef __MINGW32__
unsigned int __stdcall PrintHello(void *threadid)
#else
void *PrintHello(void *threadId)
#endif
{
int tId = (int)threadId;
firstBreakpoint(tId); // Stop a first time
SLEEP(1); // Keep state running a little
firstBreakpoint(tId); // Stop a second time
SLEEP(3); // Resuming past this will give us a running thread
#ifdef __MINGW32__
return 0;
#else
pthread_exit(NULL);
#endif
}
int main(int argc, char *argv[])
{
TID thread;
int tId = 1; // Break at main will stop here: we have a single thread stopped
SLEEP(1); // When resuming past here, we have a single thread running
#ifdef __MINGW32__
uintptr_t rc = _beginthreadex(NULL, 0, PrintHello, (void*)tId, 0, &thread);
if (rc == 0)
{
printf("ERROR; _beginthreadex() failed. errno = %d\n", errno);
exit(-1);
}
#else
int rc = pthread_create(&thread, NULL, PrintHello, (void *)tId);
if (rc)
{
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
#endif
firstBreakpoint(0);
SLEEP(1); // Resuming past this will make this thread run, while we stop the second thread
SLEEP(3); // Resuming past this will make this thread run, while we also run the second thread
return 0;
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2010 Ericsson and others.
* Copyright (c) 2007, 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,9 +7,13 @@
*
* Contributors:
* Ericsson - Initial Implementation
* Marc Khouzam (Ericsson) - Add support to receive multiple events
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.gdb.framework;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
@ -17,7 +21,7 @@ import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.cdt.tests.dsf.gdb.launching.TestsPlugin;
import org.eclipse.core.runtime.Platform;
/*
/**
* This class provides a way to wait for an asynchronous ServerEvent
* to occur. The user of this class specifies which event is of
* interest . waitForEvent() can then be called to block until the event occurs or
@ -40,7 +44,9 @@ public class ServiceEventWaitor<V> {
/* The type of event to wait for */
private Class<V> fEventTypeClass;
private DsfSession fSession;
private V fEvent;
// Queue of events. This allows to receive multiple events and keep them.
private List<V> fEventQueue = Collections.synchronizedList(new LinkedList<V>());
/**
* Trace option for wait metrics
@ -59,7 +65,6 @@ public class ServiceEventWaitor<V> {
assert eventClass != null;
fSession = session;
fEventTypeClass = eventClass;
fEvent = null;
Runnable runnable = new Runnable() {
@Override
public void run() {
@ -102,10 +107,9 @@ public class ServiceEventWaitor<V> {
long startMs = System.currentTimeMillis();
// The event might have already been received
if (fEvent == null) {
if (fEventQueue.isEmpty()) {
wait(timeout);
if (fEvent == null) {
if (fEventQueue.isEmpty()) {
throw new Exception("Timed out waiting for ServiceEvent: " + fEventTypeClass.getName());
}
}
@ -159,14 +163,7 @@ public class ServiceEventWaitor<V> {
}
}
// Mark that we have consumed the event.
// This will allow to wait for the next similar event.
// For example, for a restart, there could be more than one
// stopped event, and we need to wait for the second one.
V event = fEvent;
fEvent = null;
return event;
return fEventQueue.remove(0);
}
/*
@ -177,7 +174,7 @@ public class ServiceEventWaitor<V> {
public void eventDispatched(V event) {
if (fEventTypeClass.isAssignableFrom(event.getClass())) {
synchronized(this) {
fEvent = event;
fEventQueue.add(event);
notifyAll();
}
}

View file

@ -593,17 +593,17 @@ public class SyncUtil {
}
/**
* Utility method to return the execution DM context.
* Utility method to return all thread execution contexts.
*/
@ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()")
public static IMIExecutionDMContext getExecutionContext(final int threadIndex) throws InterruptedException {
public static IMIExecutionDMContext[] getExecutionContexts() throws InterruptedException {
assert !fProcessesService.getExecutor().isInExecutorThread();
final IContainerDMContext containerDmc = SyncUtil.getContainerContext();
Query<IMIExecutionDMContext> query = new Query<IMIExecutionDMContext>() {
Query<IMIExecutionDMContext[]> query = new Query<IMIExecutionDMContext[]>() {
@Override
protected void execute(final DataRequestMonitor<IMIExecutionDMContext> rm) {
protected void execute(final DataRequestMonitor<IMIExecutionDMContext[]> rm) {
fProcessesService.getProcessesBeingDebugged(
containerDmc,
new ImmediateDataRequestMonitor<IDMContext[]>() {
@ -612,10 +612,7 @@ public class SyncUtil {
if (isSuccess()) {
IDMContext[] threads = getData();
Assert.assertNotNull("invalid return value from service", threads);
Assert.assertTrue("unexpected number of threads", threadIndex < threads.length);
IDMContext thread = threads[threadIndex];
Assert.assertNotNull("unexpected thread context type ", thread);
rm.setData((IMIExecutionDMContext)thread);
rm.setData((IMIExecutionDMContext[])threads);
} else {
rm.setStatus(getStatus());
}
@ -633,6 +630,16 @@ public class SyncUtil {
}
return null;
}
/**
* Utility method to return a specific execution DM context.
*/
@ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()")
public static IMIExecutionDMContext getExecutionContext(int threadIndex) throws InterruptedException {
IMIExecutionDMContext[] threads = getExecutionContexts();
Assert.assertTrue("unexpected number of threads", threadIndex < threads.length);
Assert.assertNotNull("unexpected thread context type ", threads[threadIndex]);
return threads[threadIndex];
}
/**
* Check if the restart operation is supported

View file

@ -68,33 +68,33 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL);
}
private DsfSession fSession;
private DsfServicesTracker fServicesTracker;
private IBreakpoints fBreakpointService;
protected DsfSession fSession;
protected DsfServicesTracker fServicesTracker;
protected IBreakpoints fBreakpointService;
// private ITraceControl fTraceService;
private IBreakpointsTargetDMContext fBreakpointsDmc;
protected IBreakpointsTargetDMContext fBreakpointsDmc;
// private ITraceTargetDMContext fTraceTargetDmc;
// private int fTotalTracingBufferSize = 0;
private static final String SOURCE_FILE = "TracepointTestApp.cc";
private static final String METHOD_NAME = "testTracepoints";
private static final int LINE_NUMBER_1 = 97;
private static final int LINE_NUMBER_2 = 75;
private static final int LINE_NUMBER_3 = 76;
private static final int LINE_NUMBER_4 = 85;
private static final int LINE_LOOP_2 = 109;
private static final String NO_CONDITION = "";
private static final String NO_COMMANDS = "";
protected static final String SOURCE_FILE = "TracepointTestApp.cc";
protected static final String METHOD_NAME = "testTracepoints";
protected static final int LINE_NUMBER_1 = 97;
protected static final int LINE_NUMBER_2 = 75;
protected static final int LINE_NUMBER_3 = 76;
protected static final int LINE_NUMBER_4 = 85;
protected static final int LINE_LOOP_2 = 109;
protected static final String NO_CONDITION = "";
protected static final String NO_COMMANDS = "";
// private static final int LAST_LINE_NUMBER = 94;
//
// private static final int TOTAL_FRAMES_TO_BE_COLLECTED = 1 + 1 + 10 + 1 + 10000;
private final static int[] PASS_COUNTS = {12, 2, 32, 6, 128, 0, 0, 0, 0, 0, 0, 0};
private final static String[] CONDITIONS = {"gIntVar == 543", "gBoolVar == false", "counter == 3", "counter > 4", "counter > 2 && lIntVar == 12345"};
protected final static int[] PASS_COUNTS = {12, 2, 32, 6, 128, 0, 0, 0, 0, 0, 0, 0};
protected final static String[] CONDITIONS = {"gIntVar == 543", "gBoolVar == false", "counter == 3", "counter > 4", "counter > 2 && lIntVar == 12345"};
private static CollectAction[] COLLECT_ACTIONS = new CollectAction[10];
private static EvaluateAction[] EVAL_ACTIONS = new EvaluateAction[10];
protected static CollectAction[] COLLECT_ACTIONS = new CollectAction[10];
protected static EvaluateAction[] EVAL_ACTIONS = new EvaluateAction[10];
// private static WhileSteppingAction[] STEPPING_ACTION_1 = new WhileSteppingAction[3];
static {
@ -248,7 +248,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
}
// Clears the counters
private void clearEventCounters() {
protected void clearEventCounters() {
synchronized (lock) {
for (int i = 0; i < fBreakpointEvents.length; i++) {
fBreakpointEvents[i] = 0;
@ -259,7 +259,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
}
// Get the breakpoint hit count
private int getBreakpointEventCount(int event) {
protected int getBreakpointEventCount(int event) {
int count = 0;
synchronized (lock) {
count = fBreakpointEvents[event];
@ -269,7 +269,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
// Suspends the thread until an event is flagged
// NOTE: too simple for real life but good enough for this test suite
private void waitForBreakpointEvent() {
protected void waitForBreakpointEvent() {
synchronized (lock) {
while (!fBreakpointEvent) {
try {
@ -291,7 +291,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
// Breakpoint service methods (to use with tracepoints).
// *********************************************************************
private IBreakpointDMContext insertBreakpoint(final IBreakpointsTargetDMContext context,
protected IBreakpointDMContext insertBreakpoint(final IBreakpointsTargetDMContext context,
final Map<String,Object> attributes) throws InterruptedException
{
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
@ -317,7 +317,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
return (IBreakpointDMContext)wait.getReturnInfo();
}
private void removeBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException
protected void removeBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException
{
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
@ -338,7 +338,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
assertTrue(wait.getMessage(), wait.isOK());
}
private void updateBreakpoint(final IBreakpointDMContext breakpoint,
protected void updateBreakpoint(final IBreakpointDMContext breakpoint,
final Map<String, Object> delta) throws InterruptedException
{
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
@ -360,7 +360,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
assertTrue(wait.getMessage(), wait.isOK());
}
private IBreakpointDMData getBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException
protected IBreakpointDMData getBreakpoint(final IBreakpointDMContext breakpoint) throws InterruptedException
{
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
@ -384,7 +384,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
return (IBreakpointDMData)wait.getReturnInfo();
}
private IBreakpointDMContext[] getBreakpoints(final IBreakpointsTargetDMContext context) throws InterruptedException
protected IBreakpointDMContext[] getBreakpoints(final IBreakpointsTargetDMContext context) throws InterruptedException
{
final AsyncCompletionWaitor wait = new AsyncCompletionWaitor();
@ -550,7 +550,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
// Below are the tests for the control of tracepoints.
// *********************************************************************
private IBreakpointDMContext[] fTracepoints = null;
protected IBreakpointDMContext[] fTracepoints = null;
// private void checkTraceStatus(boolean supported, boolean active, int frames,
// STOP_REASON_ENUM reason, Integer stoppingTracepoint) throws Throwable {
@ -592,7 +592,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
// GDB 7.0 does not support fast tracepoints, but GDB 7.2 will
protected boolean fastTracepointsSupported() { return false; }
private class TracepointData {
protected class TracepointData {
String sourceFile;
int lineNumber;
String condition;
@ -616,7 +616,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
}
}
private void checkTracepoints(TracepointData[] dataArray) throws Throwable {
protected void checkTracepoints(TracepointData[] dataArray) throws Throwable {
int numTracepoints = dataArray.length;
// Fetch the tp list from the backend

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
PostMortemCoreTest_7_0.class,
CommandTimeoutTest_7_0.class,
GDBMultiNonStopRunControlTest_7_0.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningTest_7_0.class,
OperationsWhileTargetIsRunningNonStopTest_7_0.class,
CommandTimeoutTest_7_0.class,
GDBMultiNonStopRunControlTest_7_0.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - Initial implementation of Test cases
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_1;
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_0.GDBMultiNonStopRunControlTest_7_0;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
/**
* Tests IMultiRunControl class for Non-stop multi-threaded application.
*/
@RunWith(BackgroundRunner.class)
public class GDBMultiNonStopRunControlTest_7_1 extends GDBMultiNonStopRunControlTest_7_0 {
@BeforeClass
public static void beforeClassMethod_7_1() {
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_1);
}
}

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
PostMortemCoreTest_7_1.class,
CommandTimeoutTest_7_1.class,
GDBMultiNonStopRunControlTest_7_1.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningTest_7_1.class,
OperationsWhileTargetIsRunningNonStopTest_7_1.class,
CommandTimeoutTest_7_1.class,
GDBMultiNonStopRunControlTest_7_1.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - Initial implementation of Test cases
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_2;
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_1.GDBMultiNonStopRunControlTest_7_1;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
/**
* Tests IMultiRunControl class for Non-stop multi-threaded application.
*/
@RunWith(BackgroundRunner.class)
public class GDBMultiNonStopRunControlTest_7_2 extends GDBMultiNonStopRunControlTest_7_1 {
@BeforeClass
public static void beforeClassMethod_7_2() {
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_2);
}
}

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
PostMortemCoreTest_7_2.class,
CommandTimeoutTest_7_2.class,
GDBMultiNonStopRunControlTest_7_2.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningTest_7_2.class,
OperationsWhileTargetIsRunningNonStopTest_7_2.class,
CommandTimeoutTest_7_2.class,
GDBMultiNonStopRunControlTest_7_2.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - Initial implementation of Test cases
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_3;
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_2.GDBMultiNonStopRunControlTest_7_2;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
/**
* Tests IMultiRunControl class for Non-stop multi-threaded application.
*/
@RunWith(BackgroundRunner.class)
public class GDBMultiNonStopRunControlTest_7_3 extends GDBMultiNonStopRunControlTest_7_2 {
@BeforeClass
public static void beforeClassMethod_7_3() {
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_3);
}
}

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
PostMortemCoreTest_7_3.class,
CommandTimeoutTest_7_3.class,
GDBMultiNonStopRunControlTest_7_3.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningTest_7_3.class,
OperationsWhileTargetIsRunningNonStopTest_7_3.class,
CommandTimeoutTest_7_3.class,
GDBMultiNonStopRunControlTest_7_3.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -0,0 +1,30 @@
/*******************************************************************************
* Copyright (c) 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - Initial implementation of Test cases
*******************************************************************************/
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4;
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_3.GDBMultiNonStopRunControlTest_7_3;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
/**
* Tests IMultiRunControl class for Non-stop multi-threaded application.
*/
@RunWith(BackgroundRunner.class)
public class GDBMultiNonStopRunControlTest_7_4 extends GDBMultiNonStopRunControlTest_7_3 {
@BeforeClass
public static void beforeClassMethod_7_4() {
setGdbProgramNamesLaunchAttributes(ITestConstants.SUFFIX_GDB_7_4);
}
}

View file

@ -11,10 +11,18 @@
package org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_4;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.CollectAction;
import org.eclipse.cdt.dsf.gdb.internal.tracepointactions.TracepointActionManager;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.tests.ITestConstants;
import org.eclipse.cdt.tests.dsf.gdb.tests.tests_7_3.GDBRemoteTracepointsTest_7_3;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(BackgroundRunner.class)
@ -30,4 +38,46 @@ public class GDBRemoteTracepointsTest_7_4 extends GDBRemoteTracepointsTest_7_3 {
// instruction of 4 bytes or more, instead of 5.
return true;
}
/**
* This test sets the different types of tracepoints and then sets some string collection actions
*/
@Test
public void tracepointActionsWithCollectStrings() throws Throwable {
TracepointActionManager tracepointActionMgr = TracepointActionManager.getInstance();
CollectAction action1 = new CollectAction();
action1.setCollectString("/s $locals");
action1.setName("Collect string locals");
tracepointActionMgr.addAction(action1);
CollectAction action2 = new CollectAction();
action2.setCollectString("/s3 $locals, $reg");
action2.setName("Collect string locals, reg");
tracepointActionMgr.addAction(action2);
createTracepoints();
Map<String, Object> delta = new HashMap<String, Object>();
// Set conditions for all tracepoints
delta.put(MIBreakpoints.COMMANDS, action1.getName());
updateBreakpoint(fTracepoints[0], delta);
delta.put(MIBreakpoints.COMMANDS, action2.getName());
updateBreakpoint(fTracepoints[1], delta);
delta.put(MIBreakpoints.COMMANDS, action1.getName());
updateBreakpoint(fTracepoints[2], delta);
delta.put(MIBreakpoints.COMMANDS, action1.getName());
updateBreakpoint(fTracepoints[3], delta);
delta.put(MIBreakpoints.COMMANDS, action2.getName());
updateBreakpoint(fTracepoints[4], delta);
ArrayList<TracepointData> dataArray = new ArrayList<TracepointData>();
dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_2, NO_CONDITION, 0, true, action1.toString(), false));
dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_3, NO_CONDITION, 0, true, action2.toString(), false));
dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_4, NO_CONDITION, 0, true, action1.toString(), true));
dataArray.add(new TracepointData(SOURCE_FILE, LINE_NUMBER_1, NO_CONDITION, 0, true, action1.toString(), true));
dataArray.add(new TracepointData(SOURCE_FILE, LINE_LOOP_2, NO_CONDITION, 0, true, action2.toString(), acceptsFastTpOnFourBytes()));
checkTracepoints(dataArray.toArray(new TracepointData[dataArray.size()]));
}
}

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
PostMortemCoreTest_7_4.class,
CommandTimeoutTest_7_4.class,
GDBMultiNonStopRunControlTest_7_4.class,
Suite_Sessionless_Tests.class,
/* Add your test class here */
})

View file

@ -41,6 +41,7 @@ import org.junit.runners.Suite;
OperationsWhileTargetIsRunningTest_7_4.class,
OperationsWhileTargetIsRunningNonStopTest_7_4.class,
CommandTimeoutTest_7_4.class,
GDBMultiNonStopRunControlTest_7_4.class,
Suite_Sessionless_Tests.class
/* Add your test class here */
})

View file

@ -34,7 +34,7 @@ Export-Package: org.eclipse.cdt.dsf.debug.internal.ui;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.disassembly.util;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.preferences;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.viewmodel;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.actions;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.actions;x-friends:="org.eclipse.cdt.dsf.gdb.ui",
org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.detailsupport;x-internal:=true,
org.eclipse.cdt.dsf.debug.internal.ui.viewmodel.numberformat.detail;x-internal:=true,
org.eclipse.cdt.dsf.debug.ui,

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems and others.
* Copyright (c) 2006, 2012 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,9 +7,13 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for multiple selection (bug 330974)
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.actions;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.cdt.dsf.concurrent.DsfRunnable;
import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
@ -29,11 +33,18 @@ import org.eclipse.debug.core.commands.IDebugCommandRequest;
*/
@Immutable
public abstract class DsfCommandRunnable extends DsfRunnable {
private final IExecutionDMContext fContext;
private final IExecutionDMContext[] fContexts;
private final DsfServicesTracker fTracker;
private final IDebugCommandRequest fRequest;
public IExecutionDMContext getContext() { return fContext; }
// For backwards compatibility, keep this method that returns the first selection. This method
// is meaningful when we only support a single selection.
public IExecutionDMContext getContext() { return (fContexts != null && fContexts.length > 0) ? fContexts[0] : null; }
/**
* Return all selected contexts.
* @since 2.3
*/
public IExecutionDMContext[] getContexts() { return fContexts; }
public IRunControl getRunControl() {
return fTracker.getService(IRunControl.class);
}
@ -42,8 +53,8 @@ public abstract class DsfCommandRunnable extends DsfRunnable {
* @since 1.1
*/
public SteppingController getSteppingController() {
if (fContext != null) {
return (SteppingController) fContext.getAdapter(SteppingController.class);
if (fContexts != null && fContexts.length > 0) {
return (SteppingController) fContexts[0].getAdapter(SteppingController.class);
}
return null;
}
@ -56,15 +67,33 @@ public abstract class DsfCommandRunnable extends DsfRunnable {
}
public DsfCommandRunnable(DsfServicesTracker servicesTracker, Object element, IDebugCommandRequest request) {
fTracker = servicesTracker;
if (element instanceof IDMVMContext) {
IDMVMContext vmc = (IDMVMContext)element;
fContext = DMContexts.getAncestorOfType(vmc.getDMContext(), IExecutionDMContext.class);
} else {
fContext = null;
}
fRequest = request;
this(servicesTracker, new Object[] { element }, request);
}
/** @since 2.3 */
public DsfCommandRunnable(DsfServicesTracker servicesTracker, Object[] elements, IDebugCommandRequest request) {
fTracker = servicesTracker;
fRequest = request;
// Extract all selected execution contexts, using a set to avoid duplicates. Duplicates will
// happen if multiple stack frames of the same thread are selected.
Set<IExecutionDMContext> execDmcSet = new HashSet<IExecutionDMContext>(request.getElements().length);
for (Object element : request.getElements()) {
if (element instanceof IDMVMContext) {
IDMVMContext vmc = (IDMVMContext)element;
IExecutionDMContext execDmc = DMContexts.getAncestorOfType(vmc.getDMContext(), IExecutionDMContext.class);
if (execDmc != null) {
// We have a thread or a process
execDmcSet.add(execDmc);
}
}
}
if (execDmcSet.size() == 0) {
fContexts = null;
} else {
fContexts = execDmcSet.toArray(new IExecutionDMContext[execDmcSet.size()]);
}
}
@Override
@ -73,8 +102,8 @@ public abstract class DsfCommandRunnable extends DsfRunnable {
fRequest.done();
return;
}
if (getContext() == null) {
fRequest.setStatus(makeError("Selected object does not support run control.", null)); //$NON-NLS-1$
if (getContexts() == null || getContexts().length == 0) {
fRequest.setStatus(makeError("Selected objects do not support run control.", null)); //$NON-NLS-1$
} else if (getRunControl() == null || getSteppingController() == null) {
fRequest.setStatus(makeError("Run Control not available", null)); //$NON-NLS-1$
} else {

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems and others.
* Copyright (c) 2006, 2012 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,14 +7,16 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for multi-selection (Bug 330974)
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.actions;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.IMultiRunControl;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -43,17 +45,42 @@ public class DsfResumeCommand implements IResumeHandler {
@Override
public void canExecute(final IEnabledStateRequest request) {
if (request.getElements().length != 1) {
request.setEnabled(false);
request.done();
if (request.getElements().length == 1) {
canExecuteSingle(request);
return;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.setEnabled(false);
request.done();
return;
}
// Check if some of the selections can be resumed
multiRun.canResumeSome(
getContexts(),
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
request.done();
}
});
}
});
}
private void canExecuteSingle(final IEnabledStateRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().canResume(
getContext(),
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), null) {
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
@ -66,17 +93,32 @@ public class DsfResumeCommand implements IResumeHandler {
@Override
public boolean execute(final IDebugCommandRequest request) {
if (request.getElements().length != 1) {
request.done();
return false;
if (request.getElements().length == 1) {
executeSingle(request);
return false;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.done();
return;
}
multiRun.resume(getContexts(), new ImmediateRequestMonitor());
}
});
return false;
}
private void executeSingle(IDebugCommandRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().resume(getContext(), new RequestMonitor(fExecutor, null));
}
});
return false;
}
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2006, 2009 Wind River Systems and others.
* Copyright (c) 2006, 2012 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -7,14 +7,16 @@
*
* Contributors:
* Wind River Systems - initial API and implementation
* Marc Khouzam (Ericsson) - Added support for multi-selection (Bug 330974)
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.ui.actions;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.DsfExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateDataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Immutable;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.IMultiRunControl;
import org.eclipse.cdt.dsf.internal.ui.DsfUIPlugin;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -42,17 +44,42 @@ public class DsfSuspendCommand implements ISuspendHandler {
@Override
public void canExecute(final IEnabledStateRequest request) {
if (request.getElements().length != 1) {
request.setEnabled(false);
request.done();
if (request.getElements().length == 1) {
canExecuteSingle(request);
return;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.setEnabled(false);
request.done();
return;
}
// Check if some of the selections can be suspended
multiRun.canSuspendSome(
getContexts(),
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
request.done();
}
});
}
});
}
private void canExecuteSingle(final IEnabledStateRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().canSuspend(
getContext(),
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), null) {
new ImmediateDataRequestMonitor<Boolean>() {
@Override
protected void handleCompleted() {
request.setEnabled(isSuccess() && getData());
@ -65,17 +92,32 @@ public class DsfSuspendCommand implements ISuspendHandler {
@Override
public boolean execute(final IDebugCommandRequest request) {
if (request.getElements().length != 1) {
request.done();
return false;
if (request.getElements().length == 1) {
executeSingle(request);
return false;
}
// Handle multi-selection
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements(), request) {
@Override public void doExecute() {
final IMultiRunControl multiRun = fTracker.getService(IMultiRunControl.class);
if (multiRun == null) {
// No multi run control service: multi selection not allowed
request.done();
return;
}
multiRun.suspend(getContexts(), new ImmediateRequestMonitor());
}
});
return false;
}
private void executeSingle(IDebugCommandRequest request) {
fExecutor.submit(new DsfCommandRunnable(fTracker, request.getElements()[0], request) {
@Override public void doExecute() {
getRunControl().suspend(getContext(), new RequestMonitor(fExecutor, null));
}
});
return false;
}
}

View file

@ -0,0 +1,134 @@
/*******************************************************************************
* Copyright (c) 2012 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc Khouzam (Ericsson) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.dsf.debug.service;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
/**
* This interface provides the ability to perform run control operations on multiple contexts.
*
* @see org.eclipse.cdt.dsf.debug.service.IRunControl
*
* @since 2.3
*/
public interface IMultiRunControl extends IRunControl
{
/**
* Check if at least one of the specified contexts can be resumed
* @param context List of execution contexts that want to be resumed
* @param rm Request monitor returning:
* true if at least one of the specified contexts can be resumed
* false if none of the specified contexts can be resumed
*/
void canResumeSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if all of the specified contexts can be resumed
* @param context List of execution contexts that want to be resumed
* @param rm Request monitor returning:
* true if all of the specified contexts can be resumed
* false if any of the specified contexts cannot be resumed
*/
void canResumeAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if at least one of the specified contexts can be suspended
* @param context List of execution contexts that want to be suspended
* @param rm Request monitor returning:
* true if at least one of the specified contexts can be suspended
* false if none of the specified contexts can be suspended
*/
void canSuspendSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if all of the specified contexts can be suspended
* @param context List of execution contexts that want to be suspended
* @param rm Request monitor returning:
* true if all of the specified contexts can be suspended
* false if any of the specified contexts cannot be suspended
*/
void canSuspendAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if any of the specified contexts is suspended.
* @param context List of execution contexts that are to be checked for being suspended
* @param rm Request monitor returning:
* true if any of the specified contexts is suspended, false otherwise
*/
void isSuspendedSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if all of the specified contexts are suspended.
* @param context List of execution contexts that are to be checked for being suspended
* @param rm Request monitor returning:
* true if all of the specified contexts are suspended, false otherwise
*/
void isSuspendedAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if any of the specified contexts can be stepped using stepType
* @param context List of execution contexts that want to be stepped
* @param stepStype The type of step to be used.
* @param rm Request monitor returning:
* true if any of the specified contexts can be stepped
* false if none of the specified contexts can be stepped
*/
void canStepSome(IExecutionDMContext[] contexts, StepType stepType, DataRequestMonitor<Boolean> rm);
/**
* Check if all of the specified contexts can be stepped using stepType
* @param context List of execution contexts that want to be stepped
* @param stepStype The type of step to be used.
* @param rm Request monitor returning:
* true if all of the specified contexts can be stepped
* false if any of the specified contexts cannot be stepped
*/
void canStepAll(IExecutionDMContext[] contexts, StepType stepType, DataRequestMonitor<Boolean> rm);
/**
* Check if any of the specified contexts is currently stepping.
* @param context List of execution contexts that are to be checked for stepping
* @param rm Request monitor returning:
* true if any of the specified contexts is stepping, false otherwise
*/
void isSteppingSome(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Check if all of the specified contexts are currently stepping.
* @param context List of execution contexts that are to be checked for stepping
* @param rm Request monitor returning:
* true if all of the specified contexts are stepping, false otherwise
*/
void isSteppingAll(IExecutionDMContext[] contexts, DataRequestMonitor<Boolean> rm);
/**
* Request that all specified contexts be resumed. Only contexts that are in a
* state that can be resumed will be affected, others will be ignored.
* @param context List of execution contexts that are to be resumed
*/
void resume(IExecutionDMContext[] contexts, RequestMonitor rm);
/**
* Request that all specified contexts be suspended. Only contexts that are in a
* state that can be suspended will be affected, others will be ignored.
* @param context List of execution contexts that are to be suspended
*/
void suspend(IExecutionDMContext[] contexts, RequestMonitor rm);
/**
* Request that all specified context be stepped using stepType. Only contexts
* that are in a state that can be stepped will be affected, others will be ignored.
* @param context List of execution contexts that are to be stepped
* @param stepStype The type of step to be used.
*/
void step(IExecutionDMContext[] contexts, StepType stepType, RequestMonitor rm);
}

View file

@ -4,9 +4,7 @@
label="%featureName"
version="7.0.0.qualifier"
provider-name="%providerName"
image="eclipse_update_120.jpg"
license-feature="org.eclipse.cdt.license"
license-feature-version="1.0.0.qualifier">
image="eclipse_update_120.jpg">
<description>
%description

View file

@ -15,6 +15,5 @@ bin.includes = META-INF/,\
plugin.properties,\
.,\
plugin.xml,\
about.html,\
icons/
about.html
src.includes = about.html

View file

@ -15,7 +15,8 @@
<name>CDT Parent</name>
<properties>
<tycho-version>0.13.0</tycho-version>
<tycho-version>0.14.1</tycho-version>
<tycho-extras-version>0.14.0</tycho-extras-version>
<platform-version>3.8milestones</platform-version>
<platform-site>http://download.eclipse.org/eclipse/updates/${platform-version}</platform-site>
<orbit-version>R20110523182458</orbit-version>

View file

@ -16,5 +16,5 @@ bin.includes = META-INF/,\
OSGI-INF/,\
test.xml,\
about.html
jre.compilation.profile = J2SE-1.5
src.includes = about.html

View file

@ -15,13 +15,14 @@
<artifactId>org.eclipse.cdt.testsrunner.test</artifactId>
<packaging>eclipse-test-plugin</packaging>
<repositories>
<!-- Uncommenting this is useful when the repo is built first then you want to run tests on this plugin only -->
<!-- <repositories>
<repository>
<id>cdt.repo</id>
<url>file:/${basedir}/../../releng/org.eclipse.cdt.repo/target/repository</url>
<layout>p2</layout>
</repository>
</repositories>
</repositories>-->
<build>
<plugins>

View file

@ -4,9 +4,7 @@
label="%featureName"
version="1.0.3.qualifier"
provider-name="%providerName"
plugin="org.eclipse.cdt.managedbuilder.bupc.ui"
license-feature="org.eclipse.cdt.license"
license-feature-version="1.0.0.qualifier">
plugin="org.eclipse.cdt.managedbuilder.bupc.ui">
<description>
%description

View file

@ -13,5 +13,5 @@ bin.includes = feature.xml,\
license.html,\
epl-v10.html,\
eclipse_update_120.jpg,\
About.txt
ABOUT.txt

View file

@ -3,9 +3,7 @@
id="org.eclipse.cdt.msw"
label="CDT Visual C++ Support"
version="1.0.0.qualifier"
provider-name="Eclipse CDT"
license-feature="org.eclipse.cdt.license"
license-feature-version="1.0.0.qualifier">
provider-name="Eclipse CDT">
<description>
%description