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

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

This commit is contained in:
Andrew Gvozdev 2012-03-25 07:05:16 -04:00
commit 14b3dc054b
47 changed files with 1399 additions and 1057 deletions

View file

@ -40,60 +40,62 @@ import org.eclipse.core.runtime.Path;
*/ */
public class ScannerInfoConsoleParserFactory { public class ScannerInfoConsoleParserFactory {
/**
* Creates a ConsoleOutputStreamSniffer, make builder scanner info console parser
* and a utility.
*/
public static ConsoleOutputSniffer getESIProviderOutputSniffer(
OutputStream outputStream,
OutputStream errorStream,
IProject currentProject,
String providerId,
IScannerConfigBuilderInfo2 scBuildInfo,
IScannerInfoCollector collector,
IMarkerGenerator markerGenerator) {
return getESIProviderOutputSniffer(outputStream, errorStream, currentProject, new InfoContext(currentProject), providerId, scBuildInfo, collector, markerGenerator);
}
/**
* Creates a ConsoleOutputStreamSniffer, make builder scanner info console parser
* and a utility.
*/
public static ConsoleOutputSniffer getESIProviderOutputSniffer(
OutputStream outputStream,
OutputStream errorStream,
IProject currentProject,
InfoContext context,
String providerId,
IScannerConfigBuilderInfo2 scBuildInfo,
IScannerInfoCollector collector,
IMarkerGenerator markerGenerator) {
if (scBuildInfo.isProviderOutputParserEnabled(providerId)) {
// get the ESIProvider console parser
SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
getSCProfileInstance(currentProject, context, scBuildInfo.getSelectedProfileId());
IScannerInfoConsoleParser clParser = profileInstance.createExternalScannerInfoParser(providerId);
IPath buildDirectory = MakeBuilderUtil.getBuildDirectory(currentProject, MakeBuilder.BUILDER_ID);
clParser.startup(currentProject, buildDirectory, collector, markerGenerator);
// create an output stream sniffer
return new ConsoleOutputSniffer(outputStream, errorStream, new
IScannerInfoConsoleParser[] {clParser});
}
return null;
}
/** /**
* Creates a ConsoleOutputStreamSniffer, ESI provider scanner info console parser * Creates a ConsoleOutputStreamSniffer, make builder scanner info console parser
* and a utility. * and a utility.
*/ */
public static ConsoleOutputSniffer getMakeBuilderOutputSniffer( public static ConsoleOutputSniffer getESIProviderOutputSniffer(OutputStream outputStream,
OutputStream outputStream, OutputStream errorStream,
OutputStream errorStream, IProject project,
IProject currentProject, String id,
IPath workingDirectory, IScannerConfigBuilderInfo2 info2,
IScannerConfigBuilderInfo2 scBuildInfo, IScannerInfoCollector collector,
IMarkerGenerator markerGenerator, IMarkerGenerator markerGenerator) {
IScannerInfoCollector collector) {
return getMakeBuilderOutputSniffer(outputStream, errorStream, currentProject, new InfoContext(currentProject), workingDirectory, scBuildInfo, markerGenerator, collector); return getESIProviderOutputSniffer(outputStream, errorStream, project, new InfoContext(project), id, info2, collector, markerGenerator);
}
/**
* Creates a ConsoleOutputStreamSniffer, make builder scanner info console parser
* and a utility.
*/
public static ConsoleOutputSniffer getESIProviderOutputSniffer(OutputStream outputStream,
OutputStream errorStream,
IProject project,
InfoContext infoContext,
String id,
IScannerConfigBuilderInfo2 info2,
IScannerInfoCollector collector,
IMarkerGenerator markerGenerator) {
IScannerInfoConsoleParser parser = getESIConsoleParser(project, infoContext, id, info2, collector, markerGenerator);
if (parser != null) {
return new ConsoleOutputSniffer(outputStream, errorStream, new IScannerInfoConsoleParser[] { parser });
}
return null;
}
/**
/* Get the ESIProvider console parser.
*/
public static IScannerInfoConsoleParser getESIConsoleParser(IProject project,
InfoContext infoContext,
String id,
IScannerConfigBuilderInfo2 info2,
IScannerInfoCollector collector,
IMarkerGenerator markerGenerator) {
if (info2.isProviderOutputParserEnabled(id)) {
SCProfileInstance profileInstance = ScannerConfigProfileManager.getInstance().
getSCProfileInstance(project, infoContext, info2.getSelectedProfileId());
IScannerInfoConsoleParser parser = profileInstance.createExternalScannerInfoParser(id);
IPath buildDirectory = MakeBuilderUtil.getBuildDirectory(project, MakeBuilder.BUILDER_ID);
parser.startup(project, buildDirectory, collector, markerGenerator);
return parser;
}
return null;
} }
/** /**
@ -101,14 +103,30 @@ public class ScannerInfoConsoleParserFactory {
* and a utility. * and a utility.
*/ */
public static ConsoleOutputSniffer getMakeBuilderOutputSniffer( public static ConsoleOutputSniffer getMakeBuilderOutputSniffer(
OutputStream outputStream, OutputStream outputStream,
OutputStream errorStream, OutputStream errorStream,
IProject project, IProject project,
InfoContext infoContext, IPath workingDirectory,
IPath workingDirectory, IScannerConfigBuilderInfo2 info2,
IScannerConfigBuilderInfo2 info2, IMarkerGenerator markerGenerator,
IMarkerGenerator markerGenerator, IScannerInfoCollector collector) {
IScannerInfoCollector collector) {
return getMakeBuilderOutputSniffer(outputStream, errorStream, project, new InfoContext(project), workingDirectory, info2, markerGenerator, collector);
}
/**
* Creates a ConsoleOutputStreamSniffer, ESI provider scanner info console parser
* and a utility.
*/
public static ConsoleOutputSniffer getMakeBuilderOutputSniffer(
OutputStream outputStream,
OutputStream errorStream,
IProject project,
InfoContext infoContext,
IPath workingDirectory,
IScannerConfigBuilderInfo2 info2,
IMarkerGenerator markerGenerator,
IScannerInfoCollector collector) {
IScannerInfoConsoleParser parser = getScannerInfoConsoleParserInternal(project, infoContext, workingDirectory, info2, markerGenerator, collector); IScannerInfoConsoleParser parser = getScannerInfoConsoleParserInternal(project, infoContext, workingDirectory, info2, markerGenerator, collector);
if (parser != null) { if (parser != null) {
@ -119,8 +137,12 @@ public class ScannerInfoConsoleParserFactory {
return null; return null;
} }
private static IScannerInfoConsoleParser getScannerInfoConsoleParserInternal(IProject project, InfoContext infoContext, IPath workingDirectory, private static IScannerInfoConsoleParser getScannerInfoConsoleParserInternal(IProject project,
IScannerConfigBuilderInfo2 info2, IMarkerGenerator markerGenerator, IScannerInfoCollector collector) { InfoContext infoContext,
IPath workingDirectory,
IScannerConfigBuilderInfo2 info2,
IMarkerGenerator markerGenerator,
IScannerInfoCollector collector) {
IScannerInfoConsoleParser parser = null; IScannerInfoConsoleParser parser = null;
// try { // try {
@ -166,8 +188,12 @@ public class ScannerInfoConsoleParserFactory {
} }
// TODO - perhaps this be unified with the other one? // TODO - perhaps this be unified with the other one?
public static IScannerInfoConsoleParser getScannerInfoConsoleParser(IProject project, InfoContext infoContext, IPath workingDirectory, public static IScannerInfoConsoleParser getScannerInfoConsoleParser(IProject project,
IScannerConfigBuilderInfo2 info2, IMarkerGenerator markerGenerator, IScannerInfoCollector collector) { InfoContext infoContext,
IPath workingDirectory,
IScannerConfigBuilderInfo2 info2,
IMarkerGenerator markerGenerator,
IScannerInfoCollector collector) {
IScannerInfoConsoleParser parser = null; IScannerInfoConsoleParser parser = null;
if (info2 != null && info2.isAutoDiscoveryEnabled() && info2.isBuildOutputParserEnabled()) { if (info2 != null && info2.isAutoDiscoveryEnabled() && info2.isBuildOutputParserEnabled()) {

View file

@ -94,6 +94,10 @@ public abstract class AbstractGCCBOPConsoleParser implements IScannerInfoConsole
*/ */
@Override @Override
public boolean processLine(String line) { public boolean processLine(String line) {
line= line.trim();
if (line.length() == 0) {
return false;
}
boolean rc = false; boolean rc = false;
int lineBreakPos = line.length()-1; int lineBreakPos = line.length()-1;
char[] lineChars = line.toCharArray(); char[] lineChars = line.toCharArray();

View file

@ -15,12 +15,14 @@ import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List;
import java.util.Properties; import java.util.Properties;
import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CommandLauncher; import org.eclipse.cdt.core.CommandLauncher;
import org.eclipse.cdt.core.ErrorParserManager; import org.eclipse.cdt.core.ErrorParserManager;
import org.eclipse.cdt.core.ICommandLauncher; import org.eclipse.cdt.core.ICommandLauncher;
import org.eclipse.cdt.core.IConsoleParser;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.resources.IConsole; import org.eclipse.cdt.core.resources.IConsole;
import org.eclipse.cdt.internal.core.BuildRunnerHelper; import org.eclipse.cdt.internal.core.BuildRunnerHelper;
@ -33,6 +35,7 @@ import org.eclipse.cdt.make.core.scannerconfig.IScannerInfoCollector;
import org.eclipse.cdt.make.core.scannerconfig.InfoContext; import org.eclipse.cdt.make.core.scannerconfig.InfoContext;
import org.eclipse.cdt.make.internal.core.MakeMessages; import org.eclipse.cdt.make.internal.core.MakeMessages;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil; import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerConfigUtil;
import org.eclipse.cdt.make.internal.core.scannerconfig.ScannerInfoConsoleParserFactory;
import org.eclipse.cdt.utils.EFSExtensionManager; import org.eclipse.cdt.utils.EFSExtensionManager;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
@ -123,8 +126,14 @@ public class DefaultRunSIProvider implements IExternalScannerInfoProvider {
ErrorParserManager epm = new ErrorParserManager(project, markerGenerator, new String[] {GMAKE_ERROR_PARSER_ID}); ErrorParserManager epm = new ErrorParserManager(project, markerGenerator, new String[] {GMAKE_ERROR_PARSER_ID});
List<IConsoleParser> parsers = new ArrayList<IConsoleParser>();
IConsoleParser parser = ScannerInfoConsoleParserFactory.getESIConsoleParser(project, context, providerId, buildInfo, collector, markerGenerator);
if (parser != null) {
parsers.add(parser);
}
buildRunnerHelper.setLaunchParameters(launcher, program, comandLineOptions, workingDirectoryURI, envp ); buildRunnerHelper.setLaunchParameters(launcher, program, comandLineOptions, workingDirectoryURI, envp );
buildRunnerHelper.prepareStreams(epm, null, console, new SubProgressMonitor(monitor, 1 * MONITOR_SCALE, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); buildRunnerHelper.prepareStreams(epm, parsers, console, new SubProgressMonitor(monitor, 1 * MONITOR_SCALE, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));
buildRunnerHelper.greeting(MakeMessages.getFormattedString("ExternalScannerInfoProvider.Greeting", project.getName())); //$NON-NLS-1$ buildRunnerHelper.greeting(MakeMessages.getFormattedString("ExternalScannerInfoProvider.Greeting", project.getName())); //$NON-NLS-1$
buildRunnerHelper.build(new SubProgressMonitor(monitor, 1 * MONITOR_SCALE, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK)); buildRunnerHelper.build(new SubProgressMonitor(monitor, 1 * MONITOR_SCALE, SubProgressMonitor.PREPEND_MAIN_LABEL_TO_SUBTASK));

View file

@ -25,7 +25,6 @@ import org.eclipse.cdt.core.dom.ast.IType;
public interface ICPPASTFieldReference extends IASTFieldReference, IASTImplicitNameOwner { public interface ICPPASTFieldReference extends IASTFieldReference, IASTImplicitNameOwner {
/** /**
* Was template keyword used? * Was template keyword used?
*
*/ */
public boolean isTemplate(); public boolean isTemplate();

View file

@ -6,7 +6,7 @@
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* John Camelon (IBM) - Initial API and implementation * John Camelon (IBM) - Initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.core.dom.ast.cpp; package org.eclipse.cdt.core.dom.ast.cpp;
@ -22,7 +22,6 @@ import org.eclipse.cdt.core.dom.ast.IScope;
* @noimplement This interface is not intended to be implemented by clients. * @noimplement This interface is not intended to be implemented by clients.
*/ */
public interface ICPPASTWhileStatement extends IASTWhileStatement { public interface ICPPASTWhileStatement extends IASTWhileStatement {
/** /**
* In C++ conditions can be declarations w/side effects. * In C++ conditions can be declarations w/side effects.
*/ */

View file

@ -819,6 +819,38 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
assertRefactoringSuccess(); assertRefactoringSuccess();
} }
//A.h
//class A {
//public:
// A(int i, const char* s);
// int method();
//};
//A.cpp
//#include "A.h"
//
//void test(int i, const char* s) {
// /*$*/A a(i, s);/*$$*/
// if (i != 0)
// a.method();
//}
//====================
//#include "A.h"
//
//A extracted(int i, const char* s) {
// A a(i, s);
// return a;
//}
//
//void test(int i, const char* s) {
// A a = extracted(i, s);
// if (i != 0)
// a.method();
//}
public void testReturnValueWithCtorInitializer() throws Exception {
assertRefactoringSuccess();
}
//A.h //A.h
//#ifndef A_H_ //#ifndef A_H_
//#define A_H_ //#define A_H_
@ -1775,9 +1807,8 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
//test.c //test.c
//void test() { //void test() {
// int i = 0; // int i = 0;
// while (i <= 10) { // while (i <= 10)
// /*$*/i++;/*$$*/ // /*$*/i++;/*$$*/
// }
//} //}
//==================== //====================
//int extracted(int i) { //int extracted(int i) {
@ -1787,9 +1818,8 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
// //
//void test() { //void test() {
// int i = 0; // int i = 0;
// while (i <= 10) { // while (i <= 10)
// i = extracted(i); // i = extracted(i);
// }
//} //}
public void testOutputParametersDetectionInWhileLoop() throws Exception { public void testOutputParametersDetectionInWhileLoop() throws Exception {
assertRefactoringSuccess(); assertRefactoringSuccess();
@ -1887,7 +1917,7 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
//void method() { //void method() {
// loop(); // loop();
//} //}
public void testDontReturnVariablesThatArentUsed() throws Exception { public void testDoNotReturnVariablesThatAreNotUsed() throws Exception {
extractedFunctionName = "loop"; extractedFunctionName = "loop";
assertRefactoringSuccess(); assertRefactoringSuccess();
} }
@ -1898,7 +1928,7 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
// return;/*$$*/ // return;/*$$*/
// //unreachable // //unreachable
//} //}
public void testDontExtractCodeContainingReturn() throws Exception { public void testDoNotExtractCodeContainingReturn() throws Exception {
assertRefactoringFailure(); assertRefactoringFailure();
} }
@ -1909,7 +1939,7 @@ public class ExtractFunctionRefactoringTest extends RefactoringTestBase {
// continue;/*$$*/ // continue;/*$$*/
// } // }
//} //}
public void testDontExtractCodeContainingContinue() throws Exception { public void testDoNotExtractCodeContainingContinue() throws Exception {
assertRefactoringFailure(); assertRefactoringFailure();
} }

View file

@ -1737,13 +1737,6 @@
id="org.eclipse.cdt.ui.actions.HideMethod" id="org.eclipse.cdt.ui.actions.HideMethod"
retarget="true"> retarget="true">
</action> </action>
<action
definitionId="org.eclipse.cdt.ui.refactor.extract.function"
label="%Refactoring.extractFunction.label"
menubarPath="org.eclipse.jdt.ui.refactoring.menu/codingGroup"
id="org.eclipse.cdt.ui.actions.ExtractMethod"
retarget="true">
</action>
<action <action
definitionId="org.eclipse.cdt.ui.refactor.toggle.function" definitionId="org.eclipse.cdt.ui.refactor.toggle.function"
label="%Refactoring.toggleFunction.label" label="%Refactoring.toggleFunction.label"
@ -1751,6 +1744,13 @@
id="org.eclipse.cdt.ui.actions.ToggleFunction" id="org.eclipse.cdt.ui.actions.ToggleFunction"
retarget="true"> retarget="true">
</action> </action>
<action
definitionId="org.eclipse.cdt.ui.refactor.extract.function"
label="%Refactoring.extractFunction.label"
menubarPath="org.eclipse.jdt.ui.refactoring.menu/codingGroup"
id="org.eclipse.cdt.ui.actions.ExtractMethod"
retarget="true">
</action>
<action <action
definitionId="org.eclipse.cdt.ui.refactor.extract.constant" definitionId="org.eclipse.cdt.ui.refactor.extract.constant"
label="%Refactoring.extractConstant.label" label="%Refactoring.extractConstant.label"

View file

@ -79,10 +79,12 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTRangeBasedForStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTRangeBasedForStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTryBlockStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTryBlockStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVariableReadWriteFlags;
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
/** /**
* Special flow analyzer to determine the return value of the extracted method * Special flow analyzer to determine the return value of the extracted method
@ -668,6 +670,10 @@ abstract class FlowAnalyzer extends ASTGenericVisitor {
WhileFlowInfo info= createWhile(); WhileFlowInfo info= createWhile();
setFlowInfo(node, info); setFlowInfo(node, info);
info.mergeCondition(getFlowInfo(node.getCondition()), fFlowContext); info.mergeCondition(getFlowInfo(node.getCondition()), fFlowContext);
if (node instanceof ICPPASTWhileStatement) {
info.mergeCondition(getFlowInfo(((ICPPASTWhileStatement) node).getConditionDeclaration()),
fFlowContext);
}
info.mergeAction(getFlowInfo(node.getBody()), fFlowContext); info.mergeAction(getFlowInfo(node.getBody()), fFlowContext);
info.removeLabel(null); info.removeLabel(null);
return PROCESS_SKIP; return PROCESS_SKIP;
@ -914,7 +920,21 @@ abstract class FlowAnalyzer extends ASTGenericVisitor {
int index = fFlowContext.getIndexFromLocal(variable); int index = fFlowContext.getIndexFromLocal(variable);
if (index >= 0) { if (index >= 0) {
int accessMode = CPPVariableReadWriteFlags.getReadWriteFlags(node); int accessMode = CPPVariableReadWriteFlags.getReadWriteFlags(node);
setFlowInfo(node, new LocalFlowInfo(variable, index, accessMode, fFlowContext)); if (accessMode != 0) {
int flowInfoMode = FlowInfo.UNUSED;
switch (accessMode) {
case PDOMName.READ_ACCESS:
flowInfoMode = FlowInfo.READ;
break;
case PDOMName.WRITE_ACCESS:
flowInfoMode = FlowInfo.WRITE;
break;
case PDOMName.READ_ACCESS | PDOMName.WRITE_ACCESS:
flowInfoMode = FlowInfo.UNKNOWN;
break;
}
setFlowInfo(node, new LocalFlowInfo(variable, index, flowInfoMode, fFlowContext));
}
} }
} }
} }
@ -1005,9 +1025,9 @@ abstract class FlowAnalyzer extends ASTGenericVisitor {
return; return;
FunctionCallFlowInfo info= createFunctionCallFlowInfo(); FunctionCallFlowInfo info= createFunctionCallFlowInfo();
setFlowInfo(node, info); setFlowInfo(node, info);
info.mergeReceiver(getFlowInfo(functionNameExpression), fFlowContext);
for (IASTInitializerClause arg : arguments) { for (IASTInitializerClause arg : arguments) {
info.mergeArgument(getFlowInfo(arg), fFlowContext); info.mergeArgument(getFlowInfo(arg), fFlowContext);
} }
info.mergeReceiver(getFlowInfo(functionNameExpression), fFlowContext);
} }
} }

View file

@ -19,8 +19,6 @@ import java.util.Set;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
public abstract class FlowInfo { public abstract class FlowInfo {
// Return statement handling. // Return statement handling.
protected static final int NOT_POSSIBLE= 0; protected static final int NOT_POSSIBLE= 0;
@ -32,12 +30,12 @@ public abstract class FlowInfo {
protected static final int THROW= 6; protected static final int THROW= 6;
// Local access handling. // Local access handling.
public static final int READ= PDOMName.READ_ACCESS; // 1 << 9
public static final int WRITE= PDOMName.WRITE_ACCESS; // 1 << 10
public static final int UNUSED= 1 << 0; public static final int UNUSED= 1 << 0;
public static final int READ_POTENTIAL= 1 << 1; public static final int READ= 1 << 1;
public static final int WRITE_POTENTIAL= 1 << 2; public static final int READ_POTENTIAL= 1 << 2;
public static final int UNKNOWN= 1 << 3; public static final int WRITE= 1 << 3;
public static final int WRITE_POTENTIAL= 1 << 4;
public static final int UNKNOWN= 1 << 5;
// Table to merge access modes for condition statements (e.g branch[x] || branch[y]). // Table to merge access modes for condition statements (e.g branch[x] || branch[y]).
private static final int[][] ACCESS_MODE_CONDITIONAL_TABLE= { private static final int[][] ACCESS_MODE_CONDITIONAL_TABLE= {
@ -236,8 +234,7 @@ public abstract class FlowInfo {
} }
/** /**
* Checks whether the given local variable binding has the given access * Checks whether the given local variable binding has the given access mode.
* mode.
* *
* @param context the flow context used during flow analysis * @param context the flow context used during flow analysis
* @param local local variable of interest * @param local local variable of interest
@ -374,9 +371,9 @@ public abstract class FlowInfo {
return; return;
} else { } else {
if (others == null) { if (others == null) {
int index_unused= getIndex(UNUSED);
for (int i= 0; i < fAccessModes.length; i++) { for (int i= 0; i < fAccessModes.length; i++) {
int unused_index= getIndex(UNUSED); fAccessModes[i]= ACCESS_MODE_CONDITIONAL_TABLE[getIndex(fAccessModes[i])][index_unused];
fAccessModes[i]= ACCESS_MODE_CONDITIONAL_TABLE[getIndex(fAccessModes[i])][unused_index];
} }
} else { } else {
for (int i= 0; i < fAccessModes.length; i++) { for (int i= 0; i < fAccessModes.length; i++) {
@ -398,14 +395,13 @@ public abstract class FlowInfo {
return; return;
} }
int unused_index= getIndex(UNUSED); int index_unused= getIndex(UNUSED);
for (int i= 0; i < fAccessModes.length; i++) { for (int i= 0; i < fAccessModes.length; i++) {
fAccessModes[i]= ACCESS_MODE_CONDITIONAL_TABLE[getIndex(fAccessModes[i])][unused_index]; fAccessModes[i]= ACCESS_MODE_CONDITIONAL_TABLE[getIndex(fAccessModes[i])][index_unused];
} }
} }
private static int getIndex(int accessMode) { private static int getIndex(int accessMode) {
// Fast log function
switch (accessMode) { switch (accessMode) {
case UNUSED: case UNUSED:
return 0; return 0;
@ -414,7 +410,6 @@ public abstract class FlowInfo {
case READ_POTENTIAL: case READ_POTENTIAL:
return 2; return 2;
case WRITE: case WRITE:
case READ | WRITE:
return 3; return 3;
case WRITE_POTENTIAL: case WRITE_POTENTIAL:
return 4; return 4;

View file

@ -248,7 +248,7 @@ public class InputFlowAnalyzer extends FlowAnalyzer {
@Override @Override
protected boolean traverseNode(IASTNode node) { protected boolean traverseNode(IASTNode node) {
return !isBefore(node, loopRegion.firstLabelStatement) && return !selection.covers(node) && !isBefore(node, loopRegion.firstLabelStatement) &&
!isBefore(loopRegion.lastGotoStatement, node); !isBefore(loopRegion.lastGotoStatement, node);
} }
@ -299,15 +299,17 @@ public class InputFlowAnalyzer extends FlowAnalyzer {
@Override @Override
protected boolean traverseNode(IASTNode node) { protected boolean traverseNode(IASTNode node) {
if (fSelection.covers(node))
return false;
if (node instanceof IASTLabelStatement) if (node instanceof IASTLabelStatement)
return true; return true;
return ASTNodes.endOffset(node) > fSelection.getEnd(); return ASTNodes.endOffset(node) >= fSelection.getEnd();
} }
@Override @Override
protected boolean shouldCreateReturnFlowInfo(IASTReturnStatement node) { protected boolean shouldCreateReturnFlowInfo(IASTReturnStatement node) {
// Make sure that the whole return statement is located after the selection. // Make sure that the whole return statement is located after the selection.
// There can be cases like return i + [x + 10] * 10; In this case we must not create // There can be cases like return i + (x + 10) * 10; In this case we must not create
// a return info node. // a return info node.
return ASTNodes.offset(node) >= fSelection.getEnd(); return ASTNodes.offset(node) >= fSelection.getEnd();
} }

View file

@ -108,7 +108,7 @@ public class Selection {
return INTERSECTS; return INTERSECTS;
} }
public int getEndVisitSelectionMode(IASTNode node) { public int getLeaveSelectionMode(IASTNode node) {
IASTFileLocation location = node.getFileLocation(); IASTFileLocation location = node.getFileLocation();
int nodeStart= location.getNodeOffset(); int nodeStart= location.getNodeOffset();
int nodeEnd= nodeStart + location.getNodeLength(); int nodeEnd= nodeStart + location.getNodeLength();
@ -116,7 +116,7 @@ public class Selection {
return BEFORE; return BEFORE;
} else if (covers(node)) { } else if (covers(node)) {
return SELECTED; return SELECTED;
} else if (nodeEnd >= fEnd) { } else if (fEnd <= nodeEnd) {
return AFTER; return AFTER;
} }
return INTERSECTS; return INTERSECTS;

View file

@ -15,6 +15,7 @@ package org.eclipse.cdt.internal.ui.refactoring;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
@ -72,6 +73,7 @@ public abstract class CRefactoring extends Refactoring {
protected Region selectedRegion; protected Region selectedRegion;
protected final RefactoringStatus initStatus; protected final RefactoringStatus initStatus;
protected CRefactoringContext refactoringContext; protected CRefactoringContext refactoringContext;
private ModificationCollector modificationCollector;
public CRefactoring(ICElement element, ISelection selection, ICProject project) { public CRefactoring(ICElement element, ISelection selection, ICProject project) {
this.project = project; this.project = project;
@ -107,10 +109,15 @@ public abstract class CRefactoring extends Refactoring {
throws CoreException, OperationCanceledException { throws CoreException, OperationCanceledException {
if (pm == null) if (pm == null)
pm = new NullProgressMonitor(); pm = new NullProgressMonitor();
pm.beginTask(Messages.CRefactoring_checking_final_conditions, 6); pm.beginTask(Messages.CRefactoring_checking_final_conditions, 10);
CheckConditionsContext context = createCheckConditionsContext(); CheckConditionsContext context= new CheckConditionsContext();
RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 5), context); context.add(new ValidateEditChecker(getValidationContext()));
ResourceChangeChecker resourceChecker = new ResourceChangeChecker();
IResourceChangeDescriptionFactory deltaFactory = resourceChecker.getDeltaFactory();
context.add(resourceChecker);
RefactoringStatus result = checkFinalConditions(new SubProgressMonitor(pm, 8), context);
if (result.hasFatalError()) { if (result.hasFatalError()) {
pm.done(); pm.done();
return result; return result;
@ -118,7 +125,11 @@ public abstract class CRefactoring extends Refactoring {
if (pm.isCanceled()) if (pm.isCanceled())
throw new OperationCanceledException(); throw new OperationCanceledException();
result.merge(context.check(new SubProgressMonitor(pm, 1))); modificationCollector = new ModificationCollector(deltaFactory);
collectModifications(pm, modificationCollector);
result.merge(context.check(new SubProgressMonitor(pm, 2)));
pm.done(); pm.done();
return result; return result;
} }
@ -162,9 +173,7 @@ public abstract class CRefactoring extends Refactoring {
@Override @Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException { public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
ModificationCollector collector = new ModificationCollector(); CCompositeChange finalChange = modificationCollector.createFinalChange();
collectModifications(pm, collector);
CCompositeChange finalChange = collector.createFinalChange();
finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor())); finalChange.setDescription(new RefactoringChangeDescriptor(getRefactoringDescriptor()));
return finalChange; return finalChange;
} }
@ -222,13 +231,6 @@ public abstract class CRefactoring extends Refactoring {
return names; return names;
} }
private CheckConditionsContext createCheckConditionsContext() throws CoreException {
CheckConditionsContext result= new CheckConditionsContext();
result.add(new ValidateEditChecker(getValidationContext()));
result.add(new ResourceChangeChecker());
return result;
}
private class ProblemFinder extends ASTVisitor { private class ProblemFinder extends ASTVisitor {
private boolean problemFound = false; private boolean problemFound = false;
private final RefactoringStatus status; private final RefactoringStatus status;

View file

@ -8,6 +8,7 @@
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -16,6 +17,7 @@ import java.io.InputStream;
import java.net.URI; import java.net.URI;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
@ -24,6 +26,7 @@ import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
import org.eclipse.osgi.util.NLS; import org.eclipse.osgi.util.NLS;
/** /**
@ -31,7 +34,7 @@ import org.eclipse.osgi.util.NLS;
* *
* @author Emanuel Graf * @author Emanuel Graf
*/ */
public class CreateFileChange extends Change { public class CreateFileChange extends ResourceChange {
private String name; private String name;
private final IPath path; private final IPath path;
private final String source; private final String source;
@ -50,7 +53,7 @@ public class CreateFileChange extends Change {
} }
@Override @Override
public Object getModifiedElement() { public IResource getModifiedResource() {
return ResourcesPlugin.getWorkspace().getRoot().getFile(path); return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
} }

View file

@ -8,6 +8,7 @@
* *
* Contributors: * Contributors:
* Institute for Software - initial API and implementation * Institute for Software - initial API and implementation
* Sergey Prigogin (Google)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.refactoring; package org.eclipse.cdt.internal.ui.refactoring;
@ -16,6 +17,8 @@ import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.CompositeChange;
@ -29,15 +32,27 @@ import org.eclipse.cdt.core.dom.rewrite.ASTRewrite;
* @author Mirko Stocker * @author Mirko Stocker
*/ */
public class ModificationCollector { public class ModificationCollector {
private final IResourceChangeDescriptionFactory deltaFactory;
// Each translation unit can have only one ASTRewrite // Each translation unit can have only one ASTRewrite
private final Map<IASTTranslationUnit, ASTRewrite> rewriters = private final Map<IASTTranslationUnit, ASTRewrite> rewriters =
new HashMap<IASTTranslationUnit, ASTRewrite>(); new HashMap<IASTTranslationUnit, ASTRewrite>();
private Collection<CreateFileChange> changes; private Collection<CreateFileChange> changes;
public ModificationCollector() {
this(null);
}
public ModificationCollector(IResourceChangeDescriptionFactory deltaFactory) {
this.deltaFactory = deltaFactory;
}
public ASTRewrite rewriterForTranslationUnit(IASTTranslationUnit ast) { public ASTRewrite rewriterForTranslationUnit(IASTTranslationUnit ast) {
if (!rewriters.containsKey(ast)) { if (!rewriters.containsKey(ast)) {
rewriters.put(ast, ASTRewrite.create(ast)); rewriters.put(ast, ASTRewrite.create(ast));
if (deltaFactory != null)
deltaFactory.change((IFile) ast.getOriginatingTranslationUnit().getResource());
} }
return rewriters.get(ast); return rewriters.get(ast);
} }
@ -48,6 +63,8 @@ public class ModificationCollector {
changes = new ArrayList<CreateFileChange>(); changes = new ArrayList<CreateFileChange>();
} }
changes.add(change); changes.add(change);
if (deltaFactory != null)
deltaFactory.create(change.getModifiedResource());
} }
public CCompositeChange createFinalChange() { public CCompositeChange createFinalChange() {

View file

@ -129,7 +129,7 @@ public class ParameterNamesInputPage extends UserInputWizardPage {
public String createFunctionDefinitionSignature(IProgressMonitor monitor) { public String createFunctionDefinitionSignature(IProgressMonitor monitor) {
try { try {
ModificationCollector collector = new ModificationCollector(); ModificationCollector collector = new ModificationCollector();
ImplementMethodRefactoring implementMethodRefactoring = (ImplementMethodRefactoring)wizard.getRefactoring(); ImplementMethodRefactoring implementMethodRefactoring = (ImplementMethodRefactoring) wizard.getRefactoring();
CCompositeChange finalChange = null; CCompositeChange finalChange = null;
// We can have multiple preview jobs. We don't // We can have multiple preview jobs. We don't
// want multiple jobs concurrently using the same ASTs // want multiple jobs concurrently using the same ASTs

View file

@ -19,6 +19,7 @@
* Anna Dushistova (Mentor Graphics) - adapted from RemoteCMainTab * Anna Dushistova (Mentor Graphics) - adapted from RemoteCMainTab
* Anna Dushistova (Mentor Graphics) - moved to org.eclipse.cdt.launch.remote.tabs * Anna Dushistova (Mentor Graphics) - moved to org.eclipse.cdt.launch.remote.tabs
* Anna Dushistova (Mentor Graphics) - [318052] [remote launch] Properties are not saved/used * Anna Dushistova (Mentor Graphics) - [318052] [remote launch] Properties are not saved/used
* Anna Dushistova (MontaVista) - [375067] [remote] Automated remote launch does not support project-less debug
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.launch.remote.tabs; package org.eclipse.cdt.launch.remote.tabs;
@ -31,6 +32,7 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.Dialog;
@ -540,8 +542,7 @@ public class RemoteCDSFMainTab extends CMainTab {
remoteProgText.setText(remoteWsRoot); remoteProgText.setText(remoteWsRoot);
} else { } else {
// try to use remote path // try to use remote path
IPath wsRoot = getCProject().getProject().getWorkspace() IPath wsRoot = Platform.getLocation();
.getRoot().getLocation();
IPath remotePath = makeRelativeToWSRootLocation(new Path( IPath remotePath = makeRelativeToWSRootLocation(new Path(
remoteName), remoteWsRoot, wsRoot); remoteName), remoteWsRoot, wsRoot);
remoteProgText.setText(remotePath.toString()); remoteProgText.setText(remotePath.toString());

View file

@ -0,0 +1,58 @@
/*******************************************************************************
* Copyright (c) 2010 Freescale Semiconductor 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:
* Freescale Semiconductor - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.core;
import org.eclipse.debug.core.IRequest;
/**
* View model types for which the "Add Watchpoint (C/C++)" action is applicable
* should implement this interface. The action is a popupMenu/objectContribution
* that targets this type.
*
* @since 7.2
*/
public interface ICWatchpointTarget {
/** IRequest object used in the asynchronous method {@link ICWatchpointTarget#getSize()} */
interface GetSizeRequest extends IRequest {
int getSize(); // returns -1 if size not available
void setSize(int size);
};
interface CanCreateWatchpointRequest extends IRequest {
boolean getCanCreate();
void setCanCreate(boolean value);
};
/**
* Determine if a watchpoint can be set on the element. The result does not
* guarantee an attempt to set such a watchpoint will succeed. This is
* merely a way to find out whether it makes sense to even attempt it. For
* example, an expression that's not an l-value should return false. The
* implementation may choose to go even further and check that the target
* supports watchpoints (at all or at that particular location).
*/
void canSetWatchpoint(CanCreateWatchpointRequest request);
/**
* Get the expression or the name of the variable
*/
String getExpression();
/**
* Asynchronous method to retrieve the size of the variable/expression, in
* bytes.
*
* @param request
* the async request object
*/
void getSize(GetSizeRequest request);
}

View file

@ -1,60 +1,19 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2010 Freescale Semiconductor and others. * Copyright (c) 2012 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at * which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html * http://www.eclipse.org/legal/epl-v10.html
* *
* Contributors: * Contributors:
* Freescale Semiconductor - initial API and implementation * Wind River Systems - initial API and implementation
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.debug.internal.core; package org.eclipse.cdt.debug.internal.core;
import org.eclipse.debug.core.IRequest;
/** /**
* View model types for which the "Add Watchpoint (C/C++)" action is applicable * @deprecated This interface has been moved to a public package. Use
* should implement this interface. The action is a popupMenu/objectContribution * {@link org.eclipse.cdt.debug.core.ICWatchpointTarget} instead.
* that targets this type.
*
* <p>
* Note that the action is particular to CBreakpoint, and not all CDT debugger
* solutions use CBreakpoint.
*/ */
public interface ICWatchpointTarget { public interface ICWatchpointTarget extends org.eclipse.cdt.debug.core.ICWatchpointTarget {
/** IRequest object used in the asynchronous method {@link ICWatchpointTarget#getSize()} */
interface GetSizeRequest extends IRequest {
int getSize(); // returns -1 if size not available
void setSize(int size);
};
interface CanCreateWatchpointRequest extends IRequest {
boolean getCanCreate();
void setCanCreate(boolean value);
};
/**
* Determine if a watchpoint can be set on the element. The result does not
* guarantee an attempt to set such a watchpoint will succeed. This is
* merely a way to find out whether it makes sense to even attempt it. For
* example, an expression that's not an l-value should return false. The
* implementation may choose to go even further and check that the target
* supports watchpoints (at all or at that particular location).
*/
void canSetWatchpoint(CanCreateWatchpointRequest request);
/**
* Get the expression or the name of the variable
*/
String getExpression();
/**
* Asynchronous method to retrieve the size of the variable/expression, in
* bytes.
*
* @param request
* the async request object
*/
void getSize(GetSizeRequest request);
} }

View file

@ -15,6 +15,7 @@ import com.ibm.icu.text.MessageFormat;
import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.CDebugCorePlugin;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.ICDebugConstants; import org.eclipse.cdt.debug.core.ICDebugConstants;
import org.eclipse.cdt.debug.core.ICWatchpointTarget;
import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIChangedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIDestroyedEvent;
import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent; import org.eclipse.cdt.debug.core.cdi.event.ICDIEvent;
@ -33,7 +34,6 @@ import org.eclipse.cdt.debug.core.model.ICDebugElementStatus;
import org.eclipse.cdt.debug.core.model.ICType; import org.eclipse.cdt.debug.core.model.ICType;
import org.eclipse.cdt.debug.core.model.ICValue; import org.eclipse.cdt.debug.core.model.ICValue;
import org.eclipse.cdt.debug.internal.core.CSettingsManager; import org.eclipse.cdt.debug.internal.core.CSettingsManager;
import org.eclipse.cdt.debug.internal.core.ICWatchpointTarget;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugEvent; import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;

View file

@ -636,7 +636,7 @@
objectClass="org.eclipse.cdt.debug.internal.core.ICWatchpointTarget" objectClass="org.eclipse.cdt.debug.internal.core.ICWatchpointTarget"
id="org.eclipse.cdt.debug.ui.WatchpointActions"> id="org.eclipse.cdt.debug.ui.WatchpointActions">
<action <action
class="org.eclipse.cdt.debug.internal.ui.actions.breakpoints.AddWatchpointOnVariableActionDelegate" class="org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointOnVariableActionDelegate"
enablesFor="1" enablesFor="1"
icon="icons/elcl16/watchpoint_co.gif" icon="icons/elcl16/watchpoint_co.gif"
id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnVariableActionDelegate" id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnVariableActionDelegate"
@ -861,7 +861,7 @@
id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.popupMenu.1" id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.popupMenu.1"
targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.1"> targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.1">
<action <action
class="org.eclipse.cdt.debug.internal.ui.actions.breakpoints.AddWatchpointOnMemoryActionDelegate" class="org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointActionDelegate"
enablesFor="1" enablesFor="1"
icon="icons/elcl16/watchpoint_co.gif" icon="icons/elcl16/watchpoint_co.gif"
id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnMemoryActionDelegate.1" id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnMemoryActionDelegate.1"
@ -874,7 +874,7 @@
id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.popupMenu.2" id="org.eclipse.debug.ui.MemoryView.RenderingViewPane.popupMenu.2"
targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.2"> targetID="org.eclipse.debug.ui.MemoryView.RenderingViewPane.2">
<action <action
class="org.eclipse.cdt.debug.internal.ui.actions.breakpoints.AddWatchpointOnMemoryActionDelegate" class="org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointActionDelegate"
enablesFor="1" enablesFor="1"
icon="icons/elcl16/watchpoint_co.gif" icon="icons/elcl16/watchpoint_co.gif"
id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnMemoryActionDelegate.2" id="org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointOnMemoryActionDelegate.2"
@ -953,7 +953,7 @@
</enablement> </enablement>
</action> </action>
<action <action
class="org.eclipse.cdt.debug.internal.ui.actions.breakpoints.AddWatchpointActionDelegate" class="org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointActionDelegate"
icon="icons/elcl16/watchpoint_co.gif" icon="icons/elcl16/watchpoint_co.gif"
id="org.eclipse.cdt.debug.ui.addWatchpoint" id="org.eclipse.cdt.debug.ui.addWatchpoint"
label="%AddWatchpoint.label" label="%AddWatchpoint.label"

View file

@ -10,20 +10,427 @@
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions; package org.eclipse.cdt.debug.internal.ui.actions;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement; import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
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.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/** /**
* This class was moved to the org.eclipse.cdt.debug.internal.ui.actions.breakpoints * The "Add Watchpoint" dialog of the "Toggle watchpoint" action.
* package. This class is left here for backward compatibility for extenders that
* reference this internal class (see Bug 374983).
*
* @deprecated Replaced by opening a properties dialog on a new breakpoint. * @deprecated Replaced by opening a properties dialog on a new breakpoint.
*/ */
public class AddWatchpointDialog extends org.eclipse.cdt.debug.internal.ui.actions.breakpoints.AddWatchpointDialog { public class AddWatchpointDialog extends Dialog implements ModifyListener, SelectionListener {
private Combo fExpressionInput;
private String fExpression;
private static List<String> sExpressionHistory = new ArrayList<String>();
private boolean fHasMemorySpaceControls;
private Button fMemorySpaceEnableButton;
private Combo fMemorySpaceInput;
private String fMemorySpace;
private boolean fRangeInitialEnable;
private Button fRangeEnableButton;
private Text fRangeField;
private String fRange = ""; //$NON-NLS-1$
private Button fChkBtnWrite;
private Button fChkBtnRead;
private boolean fRead;
private boolean fWrite;
private ICDIMemorySpaceManagement fMemManagement;
/**
* Constructor for AddWatchpointDialog.
*
* @param parentShell
*/
public AddWatchpointDialog( Shell parentShell, ICDIMemorySpaceManagement memMgmt ) { public AddWatchpointDialog( Shell parentShell, ICDIMemorySpaceManagement memMgmt ) {
super(parentShell, memMgmt); super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
fMemManagement = memMgmt;
} }
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea( Composite parent ) {
// The button bar will work better if we make the parent composite
// a single column grid layout. For the widgets we add, we want a
// a two-column grid, so we just create a sub composite for that.
GridLayout gridLayout = new GridLayout();
parent.setLayout( gridLayout );
GridData gridData = new GridData( GridData.FILL_BOTH );
parent.setLayoutData( gridData );
Composite composite = new Composite( parent, SWT.None );
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
composite.setLayout( gridLayout );
parent = composite;
// Create the controls
createExpressionControl( parent );
boolean hasDebugContext = DebugUITools.getDebugContext() != null;
boolean hasMemorySpaces = hasDebugContext && fMemManagement != null && fMemManagement.getMemorySpaces() != null && fMemManagement.getMemorySpaces().length > 0;
fHasMemorySpaceControls = !hasDebugContext || hasMemorySpaces;
if ( fHasMemorySpaceControls ) {
createMemorySpaceControl( parent, hasMemorySpaces );
}
createCountField( parent );
createAccessWidgets( parent );
// Initialize the inter-control state
if ( fExpression != null && fExpression.length() > 0 ) {
fExpressionInput.add( fExpression, 0 );
fExpressionInput.select( 0 );
}
fExpressionInput.setFocus();
if ( fHasMemorySpaceControls ) {
fMemorySpaceInput.setEnabled( fMemorySpaceEnableButton.getEnabled() );
}
fRangeField.setEnabled( fRangeEnableButton.getEnabled() );
updateUI();
return parent;
}
private void createExpressionControl(Composite parent ) {
Label l = new Label( parent, GridData.FILL_HORIZONTAL );
l.setText( ActionMessages.getString( "AddWatchpointDialog.1" ) ); //$NON-NLS-1$
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 2;
l.setLayoutData( gridData );
fExpressionInput = new Combo( parent, SWT.BORDER );
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 2;
fExpressionInput.setLayoutData( gridData );
fExpressionInput.addModifyListener( this );
for (String expression : sExpressionHistory) {
fExpressionInput.add( expression );
}
}
private void createMemorySpaceControl( Composite parent, boolean hasMemorySpaces ) {
fMemorySpaceEnableButton = new Button( parent, SWT.CHECK );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fMemorySpaceEnableButton.setLayoutData( gridData );
fMemorySpaceEnableButton.setText( ActionMessages.getString( "AddWatchpointDialog.5" ) ); //$NON-NLS-1$
fMemorySpaceEnableButton.setSelection( false );
fMemorySpaceEnableButton.addSelectionListener( this );
if ( hasMemorySpaces ) {
fMemorySpaceInput = new Combo( parent, SWT.BORDER | SWT.READ_ONLY );
} else {
fMemorySpaceInput = new Combo( parent, SWT.BORDER );
}
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fMemorySpaceInput.setLayoutData( gridData );
fMemorySpaceInput.addSelectionListener( this );
if ( fMemManagement != null ) {
String [] memorySpaces = fMemManagement.getMemorySpaces();
for ( int i = 0; i < memorySpaces.length; i++ ) {
fMemorySpaceInput.add( memorySpaces[i] );
}
}
if ( fMemorySpace != null && fMemorySpace.length() > 0 ) {
int i = fMemorySpaceInput.indexOf( fMemorySpace );
if ( i >= 0 ) {
fMemorySpaceInput.select( i );
fMemorySpaceEnableButton.setSelection( true );
} else {
fMemorySpaceInput.add( fMemorySpace );
}
}
fMemorySpaceInput.addModifyListener( this );
//234909 - for accessibility
fMemorySpaceInput.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
@Override
public void getName(AccessibleEvent e) {
e.result = ActionMessages.getString( "AddWatchpointDialog.5" ); //$NON-NLS-1$
}
});
}
/**
* @param text
* @param c
* @return true if the concatenation of text + c results
* in a valid string representation of an integer
* @see verifyIntegerText()
*/
private static boolean verifyIntegerTextAddition( String text, char c ) {
// pass through all control characters
if ( Character.isISOControl( c ) ) {
return true;
}
// case-insensitive
c = Character.toLowerCase( c );
text = text.toLowerCase();
// first character has to be 0-9
if ( text.length() == 0 ) {
return Character.isDigit( c );
}
// second character must be x if preceded by a 0, otherwise 0-9 will do
if ( text.length() == 1 ) {
if ( text.equals( "0" ) ) { //$NON-NLS-1$
return c == 'x';
}
return Character.isDigit( c );
}
// all subsequent characters must be 0-9 or a-f if started with 0x
return Character.isDigit( c )
|| text.startsWith( "0x" ) && 'a' <= c && c <= 'f'; //$NON-NLS-1$
}
/**
* @param text integer string built up using verifyIntegerTextAddition()
* @return true if text represents a valid string representation of
* an integer
*/
private static boolean verifyIntegerText( String text ) {
if ( text.length() == 0 ) {
return false;
}
if ( text.length() == 1 ) {
return true;
}
if ( text.length() == 2 ) {
return !text.equals("0x"); //$NON-NLS-1$
}
return true;
}
private void createCountField( Composite parent ) {
fRangeEnableButton = new Button( parent, SWT.CHECK );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fRangeEnableButton.setLayoutData( gridData );
fRangeEnableButton.setText( ActionMessages.getString( "AddWatchpointDialog.6" ) ); //$NON-NLS-1$
fRangeEnableButton.setSelection( fRangeInitialEnable && fRange.length() > 0 );
fRangeEnableButton.addSelectionListener( this );
fRangeField = new Text( parent, SWT.BORDER );
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
GC gc = new GC( fRangeField );
FontMetrics fm = gc.getFontMetrics();
gridData.minimumWidth = 8 * fm.getAverageCharWidth();
fRangeField.setLayoutData( gridData );
fRangeField.setText( fRange );
fRangeField.addVerifyListener( new VerifyListener() {
@Override
public void verifyText( VerifyEvent e ) {
e.doit = verifyIntegerTextAddition( fRangeField.getText(), e.character );
}
});
fRangeField.addModifyListener( this );
//234909 - for accessibility
fRangeField.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
@Override
public void getName(AccessibleEvent e) {
e.result = ActionMessages.getString( "AddWatchpointDialog.6" ); //$NON-NLS-1$
}
});
}
private void createAccessWidgets( Composite parent ) {
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 3;
Group group = new Group( parent, SWT.NONE );
group.setLayout( new GridLayout() );
group.setLayoutData( gridData );
group.setText( ActionMessages.getString( "AddWatchpointDialog.2" ) ); //$NON-NLS-1$
fChkBtnWrite = new Button( group, SWT.CHECK );
fChkBtnWrite.setText( ActionMessages.getString( "AddWatchpointDialog.3" ) ); //$NON-NLS-1$
fChkBtnWrite.setSelection( true );
fChkBtnWrite.addSelectionListener( this );
fChkBtnRead = new Button( group, SWT.CHECK );
fChkBtnRead.setText( ActionMessages.getString( "AddWatchpointDialog.4" ) ); //$NON-NLS-1$
fChkBtnRead.setSelection( false );
fChkBtnRead.addSelectionListener( this );
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell( Shell newShell ) {
super.configureShell( newShell );
// use the same title used by the platform dialog
newShell.setText( ActionMessages.getString( "AddWatchpointDialog.0" ) ); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
fExpression = fExpressionInput.getText().trim();
if ( fExpression.length() > 0 ) {
addHistory( fExpression );
}
if ( fHasMemorySpaceControls ) {
fMemorySpace = fMemorySpaceEnableButton.getSelection() ? fMemorySpaceInput.getText().trim() : ""; //$NON-NLS-1$
}
fRange = fRangeEnableButton.getSelection() ? fRangeField.getText().trim() : "0"; //$NON-NLS-1$
fRead = fChkBtnRead.getSelection();
fWrite = fChkBtnWrite.getSelection();
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText( ModifyEvent e ) {
updateUI();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createButtonBar( Composite parent ) {
return super.createButtonBar( parent );
}
public String getExpression() {
return fExpression;
}
public String getMemorySpace() {
return fMemorySpace;
}
private static void addHistory( String item ) {
if ( !sExpressionHistory.contains( item ) ) {
sExpressionHistory.add( 0, item );
if ( sExpressionHistory.size() > 5 )
sExpressionHistory.remove( sExpressionHistory.size() - 1 );
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetDefaultSelected( SelectionEvent e ) {
// ignore
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected( SelectionEvent e ) {
updateUI();
}
private void updateUI() {
if ( fHasMemorySpaceControls ) {
fMemorySpaceInput.setEnabled( fMemorySpaceEnableButton.getSelection() );
}
fRangeField.setEnabled( fRangeEnableButton.getSelection() );
Button b = getButton( IDialogConstants.OK_ID );
if ( b == null ) {
return;
}
b.setEnabled( okayEnabled() );
}
private boolean okayEnabled() {
if ( !fChkBtnRead.getSelection() && !fChkBtnWrite.getSelection() ) {
return false ;
}
if ( fExpressionInput.getText().length() == 0 ) {
return false;
}
if ( fHasMemorySpaceControls && fMemorySpaceInput.getEnabled() && fMemorySpaceInput.getText().length() == 0 ) {
return false;
}
if ( fRangeField.getEnabled()
&& ( fRangeField.getText().length() == 0 || !verifyIntegerText( fRangeField.getText() ) ) ) {
return false;
}
return true;
}
public boolean getWriteAccess() {
return fWrite;
}
public boolean getReadAccess() {
return fRead;
}
public void setExpression(String expressionString ) {
fExpression = expressionString;
}
public BigInteger getRange() {
return BigInteger.valueOf( Long.decode(fRange).longValue() );
}
public void initializeRange( boolean enable, String range ) {
fRangeInitialEnable = enable;
fRange = range;
}
public void initializeMemorySpace( String memorySpace ) {
fMemorySpace = memorySpace;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
// override so we can change the initial okay enabled state
createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true ).setEnabled( okayEnabled() );
createButton( parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false );
}
} }

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions;
/**
* This class was moved to a public package and this implementation is left here
* for backward compatibility for clients that used this internal class.
*
* @deprecated Use the {@link org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointOnVariableActionDelegate}
* class instead.
*/
public class AddWatchpointOnVariableActionDelegate extends org.eclipse.cdt.debug.ui.breakpoints.AddWatchpointOnVariableActionDelegate{
}

View file

@ -1,439 +0,0 @@
/*******************************************************************************
* Copyright (c) 2004, 2008, 2008 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems - Initial API and implementation
* Freescale Semiconductor - Address watchpoints, https://bugs.eclipse.org/bugs/show_bug.cgi?id=118299
* IBM Corporation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions.breakpoints;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement;
import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
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.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.FontMetrics;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* The "Add Watchpoint" dialog of the "Toggle watchpoint" action.
* @deprecated Replaced by opening a properties dialog on a new breakpoint.
*/
public class AddWatchpointDialog extends Dialog implements ModifyListener, SelectionListener {
private Combo fExpressionInput;
private String fExpression;
private static List<String> sExpressionHistory = new ArrayList<String>();
private boolean fHasMemorySpaceControls;
private Button fMemorySpaceEnableButton;
private Combo fMemorySpaceInput;
private String fMemorySpace;
private boolean fRangeInitialEnable;
private Button fRangeEnableButton;
private Text fRangeField;
private String fRange = ""; //$NON-NLS-1$
private Button fChkBtnWrite;
private Button fChkBtnRead;
private boolean fRead;
private boolean fWrite;
private ICDIMemorySpaceManagement fMemManagement;
/**
* Constructor for AddWatchpointDialog.
*
* @param parentShell
*/
public AddWatchpointDialog( Shell parentShell, ICDIMemorySpaceManagement memMgmt ) {
super( parentShell );
setShellStyle( getShellStyle() | SWT.RESIZE );
fMemManagement = memMgmt;
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea( Composite parent ) {
// The button bar will work better if we make the parent composite
// a single column grid layout. For the widgets we add, we want a
// a two-column grid, so we just create a sub composite for that.
GridLayout gridLayout = new GridLayout();
parent.setLayout( gridLayout );
GridData gridData = new GridData( GridData.FILL_BOTH );
parent.setLayoutData( gridData );
Composite composite = new Composite( parent, SWT.None );
gridLayout = new GridLayout();
gridLayout.numColumns = 2;
composite.setLayout( gridLayout );
parent = composite;
// Create the controls
createExpressionControl( parent );
boolean hasDebugContext = DebugUITools.getDebugContext() != null;
boolean hasMemorySpaces = hasDebugContext && fMemManagement != null && fMemManagement.getMemorySpaces() != null && fMemManagement.getMemorySpaces().length > 0;
fHasMemorySpaceControls = !hasDebugContext || hasMemorySpaces;
if ( fHasMemorySpaceControls ) {
createMemorySpaceControl( parent, hasMemorySpaces );
}
createCountField( parent );
createAccessWidgets( parent );
// Initialize the inter-control state
if ( fExpression != null && fExpression.length() > 0 ) {
fExpressionInput.add( fExpression, 0 );
fExpressionInput.select( 0 );
}
fExpressionInput.setFocus();
if ( fHasMemorySpaceControls ) {
fMemorySpaceInput.setEnabled( fMemorySpaceEnableButton.getEnabled() );
}
fRangeField.setEnabled( fRangeEnableButton.getEnabled() );
updateUI();
return parent;
}
private void createExpressionControl(Composite parent ) {
Label l = new Label( parent, GridData.FILL_HORIZONTAL );
l.setText( ActionMessages.getString( "AddWatchpointDialog.1" ) ); //$NON-NLS-1$
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 2;
l.setLayoutData( gridData );
fExpressionInput = new Combo( parent, SWT.BORDER );
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 2;
fExpressionInput.setLayoutData( gridData );
fExpressionInput.addModifyListener( this );
for (String expression : sExpressionHistory) {
fExpressionInput.add( expression );
}
}
private void createMemorySpaceControl( Composite parent, boolean hasMemorySpaces ) {
fMemorySpaceEnableButton = new Button( parent, SWT.CHECK );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fMemorySpaceEnableButton.setLayoutData( gridData );
fMemorySpaceEnableButton.setText( ActionMessages.getString( "AddWatchpointDialog.5" ) ); //$NON-NLS-1$
fMemorySpaceEnableButton.setSelection( false );
fMemorySpaceEnableButton.addSelectionListener( this );
if ( hasMemorySpaces ) {
fMemorySpaceInput = new Combo( parent, SWT.BORDER | SWT.READ_ONLY );
} else {
fMemorySpaceInput = new Combo( parent, SWT.BORDER );
}
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fMemorySpaceInput.setLayoutData( gridData );
fMemorySpaceInput.addSelectionListener( this );
if ( fMemManagement != null ) {
String [] memorySpaces = fMemManagement.getMemorySpaces();
for ( int i = 0; i < memorySpaces.length; i++ ) {
fMemorySpaceInput.add( memorySpaces[i] );
}
}
if ( fMemorySpace != null && fMemorySpace.length() > 0 ) {
int i = fMemorySpaceInput.indexOf( fMemorySpace );
if ( i >= 0 ) {
fMemorySpaceInput.select( i );
fMemorySpaceEnableButton.setSelection( true );
} else {
fMemorySpaceInput.add( fMemorySpace );
}
}
fMemorySpaceInput.addModifyListener( this );
//234909 - for accessibility
fMemorySpaceInput.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
@Override
public void getName(AccessibleEvent e) {
e.result = ActionMessages.getString( "AddWatchpointDialog.5" ); //$NON-NLS-1$
}
});
}
/**
* @param text
* @param c
* @return true if the concatenation of text + c results
* in a valid string representation of an integer
* @see verifyIntegerText()
*/
private static boolean verifyIntegerTextAddition( String text, char c ) {
// pass through all control characters
if ( Character.isISOControl( c ) ) {
return true;
}
// case-insensitive
c = Character.toLowerCase( c );
text = text.toLowerCase();
// first character has to be 0-9
if ( text.length() == 0 ) {
return Character.isDigit( c );
}
// second character must be x if preceded by a 0, otherwise 0-9 will do
if ( text.length() == 1 ) {
if ( text.equals( "0" ) ) { //$NON-NLS-1$
return c == 'x';
}
return Character.isDigit( c );
}
// all subsequent characters must be 0-9 or a-f if started with 0x
return Character.isDigit( c )
|| text.startsWith( "0x" ) && 'a' <= c && c <= 'f'; //$NON-NLS-1$
}
/**
* @param text integer string built up using verifyIntegerTextAddition()
* @return true if text represents a valid string representation of
* an integer
*/
private static boolean verifyIntegerText( String text ) {
if ( text.length() == 0 ) {
return false;
}
if ( text.length() == 1 ) {
return true;
}
if ( text.length() == 2 ) {
return !text.equals("0x"); //$NON-NLS-1$
}
return true;
}
private void createCountField( Composite parent ) {
fRangeEnableButton = new Button( parent, SWT.CHECK );
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
fRangeEnableButton.setLayoutData( gridData );
fRangeEnableButton.setText( ActionMessages.getString( "AddWatchpointDialog.6" ) ); //$NON-NLS-1$
fRangeEnableButton.setSelection( fRangeInitialEnable && fRange.length() > 0 );
fRangeEnableButton.addSelectionListener( this );
fRangeField = new Text( parent, SWT.BORDER );
gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 1;
GC gc = new GC( fRangeField );
FontMetrics fm = gc.getFontMetrics();
gridData.minimumWidth = 8 * fm.getAverageCharWidth();
fRangeField.setLayoutData( gridData );
fRangeField.setText( fRange );
fRangeField.addVerifyListener( new VerifyListener() {
@Override
public void verifyText( VerifyEvent e ) {
e.doit = verifyIntegerTextAddition( fRangeField.getText(), e.character );
}
});
fRangeField.addModifyListener( this );
//234909 - for accessibility
fRangeField.getAccessible().addAccessibleListener(
new AccessibleAdapter() {
@Override
public void getName(AccessibleEvent e) {
e.result = ActionMessages.getString( "AddWatchpointDialog.6" ); //$NON-NLS-1$
}
});
}
private void createAccessWidgets( Composite parent ) {
GridData gridData = new GridData( GridData.FILL_HORIZONTAL );
gridData.horizontalSpan = 3;
Group group = new Group( parent, SWT.NONE );
group.setLayout( new GridLayout() );
group.setLayoutData( gridData );
group.setText( ActionMessages.getString( "AddWatchpointDialog.2" ) ); //$NON-NLS-1$
fChkBtnWrite = new Button( group, SWT.CHECK );
fChkBtnWrite.setText( ActionMessages.getString( "AddWatchpointDialog.3" ) ); //$NON-NLS-1$
fChkBtnWrite.setSelection( true );
fChkBtnWrite.addSelectionListener( this );
fChkBtnRead = new Button( group, SWT.CHECK );
fChkBtnRead.setText( ActionMessages.getString( "AddWatchpointDialog.4" ) ); //$NON-NLS-1$
fChkBtnRead.setSelection( false );
fChkBtnRead.addSelectionListener( this );
}
/* (non-Javadoc)
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell( Shell newShell ) {
super.configureShell( newShell );
// use the same title used by the platform dialog
newShell.setText( ActionMessages.getString( "AddWatchpointDialog.0" ) ); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.Dialog#okPressed()
*/
@Override
protected void okPressed() {
fExpression = fExpressionInput.getText().trim();
if ( fExpression.length() > 0 ) {
addHistory( fExpression );
}
if ( fHasMemorySpaceControls ) {
fMemorySpace = fMemorySpaceEnableButton.getSelection() ? fMemorySpaceInput.getText().trim() : ""; //$NON-NLS-1$
}
fRange = fRangeEnableButton.getSelection() ? fRangeField.getText().trim() : "0"; //$NON-NLS-1$
fRead = fChkBtnRead.getSelection();
fWrite = fChkBtnWrite.getSelection();
super.okPressed();
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.ModifyListener#modifyText(org.eclipse.swt.events.ModifyEvent)
*/
@Override
public void modifyText( ModifyEvent e ) {
updateUI();
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createButtonBar( Composite parent ) {
return super.createButtonBar( parent );
}
public String getExpression() {
return fExpression;
}
public String getMemorySpace() {
return fMemorySpace;
}
private static void addHistory( String item ) {
if ( !sExpressionHistory.contains( item ) ) {
sExpressionHistory.add( 0, item );
if ( sExpressionHistory.size() > 5 )
sExpressionHistory.remove( sExpressionHistory.size() - 1 );
}
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetDefaultSelected( SelectionEvent e ) {
// ignore
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
@Override
public void widgetSelected( SelectionEvent e ) {
updateUI();
}
private void updateUI() {
if ( fHasMemorySpaceControls ) {
fMemorySpaceInput.setEnabled( fMemorySpaceEnableButton.getSelection() );
}
fRangeField.setEnabled( fRangeEnableButton.getSelection() );
Button b = getButton( IDialogConstants.OK_ID );
if ( b == null ) {
return;
}
b.setEnabled( okayEnabled() );
}
private boolean okayEnabled() {
if ( !fChkBtnRead.getSelection() && !fChkBtnWrite.getSelection() ) {
return false ;
}
if ( fExpressionInput.getText().length() == 0 ) {
return false;
}
if ( fHasMemorySpaceControls && fMemorySpaceInput.getEnabled() && fMemorySpaceInput.getText().length() == 0 ) {
return false;
}
if ( fRangeField.getEnabled()
&& ( fRangeField.getText().length() == 0 || !verifyIntegerText( fRangeField.getText() ) ) ) {
return false;
}
return true;
}
public boolean getWriteAccess() {
return fWrite;
}
public boolean getReadAccess() {
return fRead;
}
public void setExpression(String expressionString ) {
fExpression = expressionString;
}
public BigInteger getRange() {
return BigInteger.valueOf( Long.decode(fRange).longValue() );
}
public void initializeRange( boolean enable, String range ) {
fRangeInitialEnable = enable;
fRange = range;
}
public void initializeMemorySpace( String memorySpace ) {
fMemorySpace = memorySpace;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
// override so we can change the initial okay enabled state
createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
true ).setEnabled( okayEnabled() );
createButton( parent, IDialogConstants.CANCEL_ID,
IDialogConstants.CANCEL_LABEL, false );
}
}

View file

@ -1,129 +0,0 @@
/*******************************************************************************
* Copyright (c) 2007, 2008 Nokia 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:
* Nokia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions.breakpoints;
import java.math.BigInteger;
import org.eclipse.cdt.debug.internal.core.model.CMemoryBlockExtension;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.eclipse.debug.core.model.MemoryByte;
import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IActionDelegate;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
public class AddWatchpointOnMemoryActionDelegate extends AddWatchpointActionDelegate {
/**
* Constructor for Action1.
*/
public AddWatchpointOnMemoryActionDelegate() {
super();
}
/**
* @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart) {}
/**
* @see IActionDelegate#run(IAction)
*/
@Override
public void run(IAction action) {
IStructuredSelection selection = getSelection();
if (selection == null || selection.isEmpty()) {
return;
}
Object obj = selection.getFirstElement();
if (obj != null) {
String memorySpace = null;
String address = ""; //$NON-NLS-1$
String range = "1"; //$NON-NLS-1$
if (obj instanceof IAdaptable) {
IRepositionableMemoryRendering rendering = (IRepositionableMemoryRendering) ((IAdaptable)obj).getAdapter(IRepositionableMemoryRendering.class);
if (rendering != null) {
int addressableSize = 1;
IMemoryBlock memblock = rendering.getMemoryBlock();
if (memblock instanceof IMemoryBlockExtension) {
try {
addressableSize = ((IMemoryBlockExtension)memblock).getAddressableSize();
} catch (DebugException e) {
CDebugUIPlugin.log(e);
}
}
memorySpace = getMemorySpace(rendering.getMemoryBlock(), memorySpace);
address = getSelectedAddress(rendering.getSelectedAddress(), address);
range = getRange(rendering.getSelectedAsBytes(), addressableSize, range);
}
}
AddWatchpointDialog dlg = new AddWatchpointDialog(CDebugUIPlugin.getActiveWorkbenchShell(),
getMemorySpaceManagement());
dlg.initializeMemorySpace(memorySpace);
dlg.setExpression(address);
dlg.initializeRange(true, range);
if (dlg.open() == Window.OK) {
addWatchpoint(dlg.getWriteAccess(), dlg.getReadAccess(), dlg.getExpression(), dlg.getMemorySpace(), dlg.getRange());
}
}
}
private String getMemorySpace(IMemoryBlock memBlock, String def) {
if (memBlock != null && memBlock instanceof CMemoryBlockExtension) {
return ((CMemoryBlockExtension)memBlock).getMemorySpaceID();
}
return def;
}
private String getSelectedAddress(BigInteger selectedAddress, String def) {
if (selectedAddress != null) {
return "0x" + selectedAddress.toString(16); //$NON-NLS-1$
}
return def;
}
private String getRange(MemoryByte[] selectedBytes, int addressableSize, String def) {
if (selectedBytes != null && selectedBytes.length > 0) {
return Integer.toString(selectedBytes.length / addressableSize);
}
return def;
}
/**
* @see IActionDelegate#selectionChanged(IAction, ISelection)
*/
/* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {}
private IStructuredSelection getSelection() {
return (IStructuredSelection)getView().getViewSite().getSelectionProvider().getSelection();
}
}

View file

@ -1,179 +0,0 @@
/*******************************************************************************
* Copyright (c) 2007, 2010 Nokia 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:
* Nokia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions.breakpoints;
import org.eclipse.cdt.debug.internal.core.CRequest;
import org.eclipse.cdt.debug.internal.core.ICWatchpointTarget;
import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.progress.WorkbenchJob;
/**
* Invoked when user right clicks on an element in the Variables or Expressions
* view and selects 'Add Watchpoint (C/C++)'
*/
public class AddWatchpointOnVariableActionDelegate extends AddWatchpointActionDelegate implements IObjectActionDelegate {
/** The target variable/expression */
private ICWatchpointTarget fVar;
/** The view where fVar was selected */
private IWorkbenchPart fActivePart;
/**
* Constructor
*/
public AddWatchpointOnVariableActionDelegate() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)
*/
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
fActivePart = targetPart;
}
private static class GetSizeRequest extends CRequest implements ICWatchpointTarget.GetSizeRequest {
int fSize = -1;
@Override
public int getSize() {
return fSize;
}
@Override
public void setSize(int size) {
fSize = size;
}
};
/* (non-Javadoc)
* @see org.eclipse.cdt.debug.internal.ui.actions.AddWatchpointActionDelegate#run(org.eclipse.jface.action.IAction)
*/
@Override
public void run(IAction action) {
if (fVar == null) {
return;
}
final String expr = fVar.getExpression();
if (expr == null) {
assert false : "how are we getting an empty expression?"; //$NON-NLS-1$
return;
}
// Getting the size of the variable/expression is an asynchronous
// operation...or at least the API is (the CDI implementation reacts
// synchronously)
final ICWatchpointTarget.GetSizeRequest request = new GetSizeRequest() {
@Override
public void done() {
if (isSuccess()) {
// Now that we have the size, put up a dialog to create the watchpoint
final int size = getSize();
assert size > 0 : "unexpected variale/expression size"; //$NON-NLS-1$
WorkbenchJob job = new WorkbenchJob("open watchpoint dialog") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
AddWatchpointDialog dlg = new AddWatchpointDialog(CDebugUIPlugin.getActiveWorkbenchShell(),
getMemorySpaceManagement());
dlg.setExpression(expr);
dlg.initializeRange(false, Integer.toString(size));
if (dlg.open() == Window.OK) {
addWatchpoint(dlg.getWriteAccess(), dlg.getReadAccess(), dlg.getExpression(), dlg.getMemorySpace(), dlg.getRange());
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
else {
WorkbenchJob job = new WorkbenchJob("watchpoint error") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if (fActivePart != null) {
ErrorDialog.openError( fActivePart.getSite().getWorkbenchWindow().getShell(), ActionMessages.getString( "AddWatchpointOnVariableActionDelegate.Error_Dlg_Title" ), ActionMessages.getString( "AddWatchpointOnVariableActionDelegate.No_Element_Size" ), getStatus() ); //$NON-NLS-1$ //$NON-NLS-2$
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
}
};
fVar.getSize(request);
}
private class CanCreateWatchpointRequest extends CRequest implements ICWatchpointTarget.CanCreateWatchpointRequest {
boolean fCanCreate;
@Override
public boolean getCanCreate() {
return fCanCreate;
}
@Override
public void setCanCreate(boolean value) {
fCanCreate = value;
}
};
/**
* Record the target variable/expression
*
* @see org.eclipse.ui.actions.ActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
* org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(final IAction action, ISelection selection) {
fVar = null;
if (selection == null || selection.isEmpty()) {
action.setEnabled(false);
return;
}
if (selection instanceof TreeSelection) {
Object obj = ((TreeSelection)selection).getFirstElement();
fVar = (ICWatchpointTarget)DebugPlugin.getAdapter(obj, ICWatchpointTarget.class);
if (fVar != null) {
final ICWatchpointTarget.CanCreateWatchpointRequest request = new CanCreateWatchpointRequest() {
@Override
public void done() {
action.setEnabled(getCanCreate());
}
};
fVar.canSetWatchpoint(request);
return;
}
assert false : "action should not have been available for object " + obj; //$NON-NLS-1$
}
else if (selection instanceof StructuredSelection) {
// Not sure why, but sometimes we get an extraneous empty StructuredSelection. Seems harmless enough
assert ((StructuredSelection)selection).getFirstElement() == null : "action installed in unexpected type of view/part"; //$NON-NLS-1$
}
else {
assert false : "action installed in unexpected type of view/part"; //$NON-NLS-1$
}
action.setEnabled(false);
}
}

View file

@ -89,12 +89,12 @@ public class ToggleBreakpointAdapter extends AbstractToggleBreakpointAdapter {
@Override @Override
protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource, protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource,
int charStart, int charEnd, int lineNumber, String expression) throws CoreException int charStart, int charEnd, int lineNumber, String expression, String memorySpace, String range) throws CoreException
{ {
ICWatchpoint bp = CDIDebugModel.createBlankWatchpoint(); ICWatchpoint bp = CDIDebugModel.createBlankWatchpoint();
Map<String, Object> attributes = new HashMap<String, Object>(); Map<String, Object> attributes = new HashMap<String, Object>();
CDIDebugModel.setWatchPointAttributes(attributes, sourceHandle, resource, true, false, CDIDebugModel.setWatchPointAttributes(attributes, sourceHandle, resource, true, false,
expression, "", new BigInteger("0"), true, 0, ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ expression, memorySpace, new BigInteger(range), true, 0, ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
openBreakpointPropertiesDialog(bp, part, resource, attributes); openBreakpointPropertiesDialog(bp, part, resource, attributes);
} }

View file

@ -81,7 +81,7 @@ public class ToggleTracepointAdapter extends AbstractToggleBreakpointAdapter {
} }
protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource, protected void createWatchpoint( boolean interactive, IWorkbenchPart part, String sourceHandle, IResource resource,
int charStart, int charEnd, int lineNumber, String expression) throws CoreException int charStart, int charEnd, int lineNumber, String expression, String memorySpace, String range) throws CoreException
{ {
} }

View file

@ -31,6 +31,8 @@ CBreakpointPropertyPage.watchpointType_read_label=Read
CBreakpointPropertyPage.watchpointType_write_label=Write CBreakpointPropertyPage.watchpointType_write_label=Write
CBreakpointPropertyPage.watchpoint_expression_label=Expression to watch: CBreakpointPropertyPage.watchpoint_expression_label=Expression to watch:
CBreakpointPropertyPage.watchpoint_expression_errorMessage=Enter the expression to watch: CBreakpointPropertyPage.watchpoint_expression_errorMessage=Enter the expression to watch:
CBreakpointPropertyPage.watchpoint_range_label=Range:
CBreakpointPropertyPage.watchpoint_memorySpace_label=Memory Space:
CBreakpointPropertyPage.condition_label=&Condition: CBreakpointPropertyPage.condition_label=&Condition:
CBreakpointPropertyPage.condition_invalidValue_message=Invalid condition. CBreakpointPropertyPage.condition_invalidValue_message=Invalid condition.
CBreakpointPropertyPage.ignoreCount_label=&Ignore count: CBreakpointPropertyPage.ignoreCount_label=&Ignore count:

View file

@ -52,7 +52,6 @@ public class CBreakpointPreferenceStore implements IPersistentPreferenceStore {
private ListenerList fListeners; private ListenerList fListeners;
private final CBreakpointContext fContext; private final CBreakpointContext fContext;
// TODO: remove after fixing add event breapoint dialog.
public CBreakpointPreferenceStore() { public CBreakpointPreferenceStore() {
this (null, null); this (null, null);
} }
@ -220,7 +219,7 @@ public class CBreakpointPreferenceStore implements IPersistentPreferenceStore {
} }
public String getString(String name) { public String getString(String name) {
String retVal = null; String retVal = ""; //$NON-NLS-1$
Object o = fProperties.get(name); Object o = fProperties.get(name);
if (o instanceof String) { if (o instanceof String) {
retVal = (String)o; retVal = (String)o;

View file

@ -13,11 +13,16 @@
package org.eclipse.cdt.debug.internal.ui.breakpoints; package org.eclipse.cdt.debug.internal.ui.breakpoints;
import org.eclipse.cdt.debug.core.CDIDebugModel; import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint; import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
import org.eclipse.cdt.debug.core.model.ICBreakpoint; import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint; import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint; import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint2;
import org.eclipse.cdt.debug.internal.ui.preferences.ComboFieldEditor;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.breakpoints.CBreakpointUIContributionFactory; import org.eclipse.cdt.debug.ui.breakpoints.CBreakpointUIContributionFactory;
import org.eclipse.cdt.debug.ui.breakpoints.ICBreakpointContext; import org.eclipse.cdt.debug.ui.breakpoints.ICBreakpointContext;
@ -28,14 +33,25 @@ import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.ILineBreakpoint; import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.contexts.IDebugContextProvider;
import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.BooleanFieldEditor;
import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.FieldEditorPreferencePage;
import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.IntegerFieldEditor; import org.eclipse.jface.preference.IntegerFieldEditor;
import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPropertyPage; import org.eclipse.ui.IWorkbenchPropertyPage;
import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.model.IWorkbenchAdapter;
@ -164,6 +180,227 @@ public class CBreakpointPropertyPage extends FieldEditorPreferencePage implement
} }
} }
class WatchpointRangeFieldEditor extends IntegerFieldEditor {
private static final String DISABLED_VALUE = "0"; //$NON-NLS-1$
private Button fCheckbox;
private boolean fWasSelected;
public WatchpointRangeFieldEditor( String name, String labelText, Composite parent ) {
super( name, labelText, parent );
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
getCheckboxControl(parent);
super.doFillIntoGrid(parent, numColumns);
}
private Button getCheckboxControl(Composite parent) {
if (fCheckbox == null) {
Composite inner= new Composite(parent, SWT.NULL);
final GridLayout layout= new GridLayout(2, false);
layout.marginWidth = 0;
inner.setLayout(layout);
fCheckbox= new Button(inner, SWT.CHECK);
fCheckbox.setFont(parent.getFont());
fCheckbox.setText(getLabelText());
// create and hide label from base class
Label label = getLabelControl(inner);
label.setText(""); //$NON-NLS-1$
label.setVisible(false);
fCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean isSelected = fCheckbox.getSelection();
valueChanged(fWasSelected, isSelected);
fWasSelected = isSelected;
}
});
} else {
checkParent(fCheckbox.getParent(), parent);
}
return fCheckbox;
}
@Override
protected boolean checkState() {
if (fCheckbox != null && !fCheckbox.getSelection()) {
clearErrorMessage();
return true;
}
return super.checkState();
}
@Override
public Label getLabelControl(Composite parent) {
final Label label= getLabelControl();
if (label == null) {
return super.getLabelControl(parent);
} else {
checkParent(label.getParent(), parent);
}
return label;
}
@Override
protected void doLoad() {
if (getTextControl() != null && fCheckbox != null && getLabelControl() != null) {
oldValue = getPreferenceStore().getString(getPreferenceName());
boolean enabled = !DISABLED_VALUE.equals(oldValue);
getTextControl().setText(enabled ? oldValue : ""); //$NON-NLS-1$
fCheckbox.setSelection(enabled);
fWasSelected = enabled;
getTextControl().setEnabled(enabled);
getLabelControl().setEnabled(enabled);
}
}
@Override
protected void doStore() {
if (fCheckbox != null && !fCheckbox.getSelection()) {
getPreferenceStore().setValue(getPreferenceName(), DISABLED_VALUE);
} else {
Text text = getTextControl();
if (text != null) {
getPreferenceStore().setValue(getPreferenceName(), text.getText().trim());
}
}
}
@Override
public int getIntValue() throws NumberFormatException {
if (fCheckbox != null && !fCheckbox.getSelection()) {
return 0;
} else {
return super.getIntValue();
}
}
protected void valueChanged(boolean oldValue, boolean newValue) {
if (oldValue != newValue) {
valueChanged();
fireStateChanged(VALUE, oldValue, newValue);
getTextControl().setEnabled(newValue);
getLabelControl().setEnabled(newValue);
}
}
}
class WatchpointMemorySpaceFieldEditor extends ComboFieldEditor {
private static final String DISABLED_VALUE = ""; //$NON-NLS-1$
private Button fCheckbox;
private boolean fWasSelected;
public WatchpointMemorySpaceFieldEditor( String name, String labelText, String[] memorySpaces, Composite parent ) {
super( name, labelText, makeArray2D(memorySpaces), parent );
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
getCheckboxControl(parent);
super.doFillIntoGrid(parent, numColumns);
}
private Button getCheckboxControl(Composite parent) {
if (fCheckbox == null) {
Composite inner= new Composite(parent, SWT.NULL);
final GridLayout layout= new GridLayout(2, false);
layout.marginWidth = 0;
inner.setLayout(layout);
fCheckbox= new Button(inner, SWT.CHECK);
fCheckbox.setFont(parent.getFont());
fCheckbox.setText(getLabelText());
// create and hide label from base class
Label label = getLabelControl(inner);
label.setText(""); //$NON-NLS-1$
label.setVisible(false);
fCheckbox.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
boolean isSelected = fCheckbox.getSelection();
valueChanged(fWasSelected, isSelected);
fWasSelected = isSelected;
}
});
} else {
checkParent(fCheckbox.getParent(), parent);
}
return fCheckbox;
}
@Override
public Label getLabelControl(Composite parent) {
final Label label= getLabelControl();
if (label == null) {
return super.getLabelControl(parent);
} else {
checkParent(label.getParent(), parent);
}
return label;
}
@Override
protected void doLoad() {
super.doLoad();
if (fCheckbox != null && getLabelControl() != null) {
String value = getPreferenceStore().getString(getPreferenceName());
boolean enabled = !DISABLED_VALUE.equals(value);
fCheckbox.setSelection(enabled);
fWasSelected = enabled;
getComboBoxControl().setEnabled(enabled);
getLabelControl().setEnabled(enabled);
}
}
@Override
protected void doStore() {
if (fCheckbox != null && !fCheckbox.getSelection()) {
getPreferenceStore().setValue(getPreferenceName(), DISABLED_VALUE);
} else {
super.doStore();
}
}
protected void valueChanged(boolean oldValue, boolean newValue) {
if (oldValue != newValue) {
fireStateChanged(VALUE, oldValue, newValue);
getComboBoxControl().setEnabled(newValue);
getLabelControl().setEnabled(newValue);
}
}
}
private String[][] makeArray2D(String[] array) {
String[][] array2d = new String[array.length][];
for (int i = 0; i < array.length; i++) {
array2d[i] = new String[2];
array2d[i][0] = array2d[i][1] = array[i];
}
return array2d;
}
private ICDIMemorySpaceManagement getMemorySpaceManagement(){
Object debugViewElement = getDebugContext();
ICDIMemorySpaceManagement memMgr = null;
if ( debugViewElement != null ) {
ICDebugTarget debugTarget = (ICDebugTarget)DebugPlugin.getAdapter(debugViewElement, ICDebugTarget.class);
if ( debugTarget != null ){
ICDITarget target = (ICDITarget)debugTarget.getAdapter(ICDITarget.class);
if (target instanceof ICDIMemorySpaceManagement)
memMgr = (ICDIMemorySpaceManagement)target;
}
}
return memMgr;
}
class LabelFieldEditor extends ReadOnlyFieldEditor { class LabelFieldEditor extends ReadOnlyFieldEditor {
private String fValue; private String fValue;
@ -272,6 +509,8 @@ public class CBreakpointPropertyPage extends FieldEditorPreferencePage implement
addField( createLabelEditor( getFieldEditorParent(), BreakpointsMessages.getString( "CBreakpointPropertyPage.sourceHandle_label" ), filename ) ); //$NON-NLS-1$ addField( createLabelEditor( getFieldEditorParent(), BreakpointsMessages.getString( "CBreakpointPropertyPage.sourceHandle_label" ), filename ) ); //$NON-NLS-1$
} }
createWatchExpressionEditor(getFieldEditorParent()); createWatchExpressionEditor(getFieldEditorParent());
createWatchMemorySpaceEditor(getFieldEditorParent());
createWatchRangeEditor(getFieldEditorParent());
createWatchTypeEditors(getFieldEditorParent()); createWatchTypeEditors(getFieldEditorParent());
} }
@ -355,6 +594,46 @@ public class CBreakpointPropertyPage extends FieldEditorPreferencePage implement
} }
} }
protected void createWatchMemorySpaceEditor( Composite parent ) {
ICBreakpoint breakpoint = getBreakpoint();
if (breakpoint == null || breakpoint.getMarker() == null) {
ICDIMemorySpaceManagement memSpaceMgmt = getMemorySpaceManagement();
if (memSpaceMgmt != null) {
String[] memorySpaces = memSpaceMgmt.getMemorySpaces();
if (memorySpaces != null && memorySpaces.length != 0) {
addField( new WatchpointMemorySpaceFieldEditor(
ICWatchpoint2.MEMORYSPACE,
BreakpointsMessages.getString("CBreakpointPropertyPage.watchpoint_memorySpace_label"), //$NON-NLS-1$
memorySpaces,
parent) );
}
}
} else {
String memorySpace = getPreferenceStore().getString(ICWatchpoint2.MEMORYSPACE);
if (memorySpace != null && memorySpace.length() != 0) {
addField(createLabelEditor(
parent,
BreakpointsMessages.getString("CBreakpointPropertyPage.watchpoint_memorySpace_label"), //$NON-NLS-1$
getPreferenceStore().getString(ICWatchpoint2.MEMORYSPACE) ));
}
}
}
protected void createWatchRangeEditor( Composite parent ) {
ICBreakpoint breakpoint = getBreakpoint();
if (breakpoint == null || breakpoint.getMarker() == null) {
addField( new WatchpointRangeFieldEditor(
ICWatchpoint2.RANGE,
BreakpointsMessages.getString("CBreakpointPropertyPage.watchpoint_range_label"), //$NON-NLS-1$
parent) );
} else {
addField(createLabelEditor(
parent,
BreakpointsMessages.getString("CBreakpointPropertyPage.watchpoint_range_label"), //$NON-NLS-1$
getPreferenceStore().getString(ICWatchpoint2.RANGE) ));
}
}
protected void createWatchTypeEditors( Composite parent ) { protected void createWatchTypeEditors( Composite parent ) {
// Edit read/write options only when creating the breakpoint. // Edit read/write options only when creating the breakpoint.
ICBreakpoint breakpoint = getBreakpoint(); ICBreakpoint breakpoint = getBreakpoint();
@ -404,6 +683,19 @@ public class CBreakpointPropertyPage extends FieldEditorPreferencePage implement
return (ICBreakpoint)element.getAdapter(ICBreakpoint.class); return (ICBreakpoint)element.getAdapter(ICBreakpoint.class);
} }
} }
protected Object getDebugContext() {
IDebugContextProvider provider = (IDebugContextProvider)getElement().getAdapter(IDebugContextProvider.class);
if (provider != null) {
ISelection selection = provider.getActiveContext();
if (selection instanceof IStructuredSelection) {
return ((IStructuredSelection) selection).getFirstElement();
}
return null;
}
return DebugUITools.getDebugContext();
}
protected IResource getResource() { protected IResource getResource() {
IAdaptable element = getElement(); IAdaptable element = getElement();

View file

@ -139,7 +139,7 @@ public class ComboFieldEditor extends FieldEditor {
/** /**
* Lazily create and return the Combo control. * Lazily create and return the Combo control.
*/ */
public Combo getComboBoxControl(Composite parent) { protected Combo getComboBoxControl(Composite parent) {
if (fCombo == null) { if (fCombo == null) {
fCombo = new Combo(parent, SWT.READ_ONLY); fCombo = new Combo(parent, SWT.READ_ONLY);
for (int i = 0; i < fEntryNamesAndValues.length; i++) { for (int i = 0; i < fEntryNamesAndValues.length; i++) {
@ -160,6 +160,10 @@ public class ComboFieldEditor extends FieldEditor {
return fCombo; return fCombo;
} }
protected Combo getComboBoxControl() {
return fCombo;
}
/** /**
* Given the name (label) of an entry, return the corresponding value. * Given the name (label) of an entry, return the corresponding value.
*/ */

View file

@ -11,6 +11,7 @@
package org.eclipse.cdt.debug.ui.breakpoints; package org.eclipse.cdt.debug.ui.breakpoints;
import java.math.BigInteger;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
@ -24,10 +25,13 @@ import org.eclipse.cdt.core.model.IMethod;
import org.eclipse.cdt.core.model.ISourceRange; import org.eclipse.cdt.core.model.ISourceRange;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IVariable; import org.eclipse.cdt.core.model.IVariable;
import org.eclipse.cdt.debug.core.ICWatchpointTarget;
import org.eclipse.cdt.debug.core.model.ICBreakpoint; import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint; import org.eclipse.cdt.debug.core.model.ICFunctionBreakpoint;
import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
import org.eclipse.cdt.debug.core.model.ICWatchpoint; import org.eclipse.cdt.debug.core.model.ICWatchpoint;
import org.eclipse.cdt.debug.internal.core.CRequest;
import org.eclipse.cdt.debug.internal.core.model.CMemoryBlockExtension;
import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils; import org.eclipse.cdt.debug.internal.ui.CDebugUIUtils;
import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants; import org.eclipse.cdt.debug.internal.ui.IInternalCDebugUIConstants;
import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages; import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages;
@ -43,13 +47,20 @@ import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.eclipse.debug.core.model.MemoryByte;
import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension2; import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension2;
import org.eclipse.debug.ui.memory.IRepositionableMemoryRendering;
import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IDocument;
@ -68,6 +79,7 @@ import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.dialogs.PreferencesUtil;
import org.eclipse.ui.editors.text.ILocationProvider; import org.eclipse.ui.editors.text.ILocationProvider;
import org.eclipse.ui.progress.WorkbenchJob;
import org.eclipse.ui.texteditor.IEditorStatusLine; import org.eclipse.ui.texteditor.IEditorStatusLine;
import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.SimpleMarkerAnnotation; import org.eclipse.ui.texteditor.SimpleMarkerAnnotation;
@ -131,11 +143,19 @@ abstract public class AbstractToggleBreakpointAdapter
if ( variable != null ) { if ( variable != null ) {
updateVariableWatchpoint(true, false, part, variable); updateVariableWatchpoint(true, false, part, variable);
} }
IRepositionableMemoryRendering rendering = getMemoryRendering(part, selection);
if (rendering != null) {
updateMemoryWatchpoint(true, false, part, rendering);
}
} }
@Override @Override
public boolean canToggleWatchpoints( IWorkbenchPart part, ISelection selection ) { public boolean canToggleWatchpoints( IWorkbenchPart part, ISelection selection ) {
return getVariableFromSelection( part, selection ) != null; return getVariableFromSelection( part, selection ) != null ||
getMemoryRendering(part, selection) != null ||
getWatchpointTarget(part, selection) != null;
} }
@Override @Override
@ -171,13 +191,26 @@ abstract public class AbstractToggleBreakpointAdapter
ICElement element = getCElementFromSelection( part, selection ); ICElement element = getCElementFromSelection( part, selection );
if (element instanceof IVariable) { if (element instanceof IVariable) {
updateVariableWatchpoint(false, true, part, (IVariable)element); updateVariableWatchpoint(false, true, part, (IVariable)element);
} else { return;
String text = ""; //$NON-NLS-1$ }
if (selection instanceof ITextSelection) {
text = ((ITextSelection)selection).getText(); IRepositionableMemoryRendering rendering = getMemoryRendering(part, selection);
} if (rendering != null) {
createWatchpoint(true, part, null, ResourcesPlugin.getWorkspace().getRoot(), -1, -1, -1, text); updateMemoryWatchpoint(false, true, part, rendering);
return;
}
ICWatchpointTarget watchpointTarget = getWatchpointTarget(part, selection);
if (watchpointTarget != null) {
updateTargetWatchpoint(false, true, part, watchpointTarget);
return;
} }
String text = ""; //$NON-NLS-1$
if (selection instanceof ITextSelection) {
text = ((ITextSelection)selection).getText();
}
createWatchpoint(true, part, null, ResourcesPlugin.getWorkspace().getRoot(), -1, -1, -1, text, null, "0"); //$NON-NLS-1$
} }
@Override @Override
@ -366,10 +399,107 @@ abstract public class AbstractToggleBreakpointAdapter
} catch (CModelException e) { } catch (CModelException e) {
CDebugUIPlugin.log(e); CDebugUIPlugin.log(e);
} }
createWatchpoint(interactive, part, sourceHandle, resource, charStart, charEnd, lineNumber, expression); createWatchpoint(interactive, part, sourceHandle, resource, charStart, charEnd, lineNumber, expression, null, "0"); //$NON-NLS-1$
} }
} }
private void updateMemoryWatchpoint(boolean toggle, boolean interactive, IWorkbenchPart part,
IRepositionableMemoryRendering rendering) throws CoreException
{
int addressableSize = 1;
IMemoryBlock memblock = rendering.getMemoryBlock();
if (memblock instanceof IMemoryBlockExtension) {
try {
addressableSize = ((IMemoryBlockExtension)memblock).getAddressableSize();
} catch (DebugException e) {
CDebugUIPlugin.log(e);
}
}
String memorySpace = getMemorySpace(rendering.getMemoryBlock(), null);
String address = getSelectedAddress(rendering.getSelectedAddress(), ""); //$NON-NLS-1$
String range = getRange(rendering.getSelectedAsBytes(), addressableSize, "1"); //$NON-NLS-1$
createWatchpoint(interactive, part, "", ResourcesPlugin.getWorkspace().getRoot(), -1, -1, -1, address, //$NON-NLS-1$
memorySpace, range);
}
private String getMemorySpace(IMemoryBlock memBlock, String def) {
if (memBlock != null && memBlock instanceof CMemoryBlockExtension) {
return ((CMemoryBlockExtension)memBlock).getMemorySpaceID();
}
return def;
}
private String getSelectedAddress(BigInteger selectedAddress, String def) {
if (selectedAddress != null) {
return "0x" + selectedAddress.toString(16); //$NON-NLS-1$
}
return def;
}
private String getRange(MemoryByte[] selectedBytes, int addressableSize, String def) {
if (selectedBytes != null && selectedBytes.length > 0) {
return Integer.toString(selectedBytes.length / addressableSize);
}
return def;
}
private void updateTargetWatchpoint(boolean toggle, final boolean interactive, final IWorkbenchPart part,
ICWatchpointTarget watchpointTarget) throws CoreException
{
String _expr = watchpointTarget.getExpression();
if (_expr == null) {
_expr = ""; //$NON-NLS-1$
}
final String expr = _expr;
// Getting the size of the variable/expression is an asynchronous
// operation...or at least the API is (the CDI implementation reacts
// synchronously)
class GetSizeRequest extends CRequest implements ICWatchpointTarget.GetSizeRequest {
int fSize = -1;
@Override
public int getSize() {
return fSize;
}
@Override
public void setSize(int size) {
fSize = size;
}
@Override
public void done() {
int _size = 0;
if (isSuccess()) {
// Now that we have the size, put up a dialog to create the watchpoint
_size = getSize();
assert _size > 0 : "unexpected variale/expression size"; //$NON-NLS-1$
}
final int size = _size;
WorkbenchJob job = new WorkbenchJob("open watchpoint dialog") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
try {
createWatchpoint(interactive, part, "", ResourcesPlugin.getWorkspace().getRoot(), //$NON-NLS-1$
-1, -1, -1, expr, null, Integer.toString(size));
} catch (CoreException e) {
return e.getStatus();
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
};
watchpointTarget.getSize(new GetSizeRequest());
}
/** /**
* Returns the C model element at the given selection. * Returns the C model element at the given selection.
* @param part Workbench part where the selection is. * @param part Workbench part where the selection is.
@ -440,7 +570,37 @@ abstract public class AbstractToggleBreakpointAdapter
} }
return null; return null;
} }
protected IRepositionableMemoryRendering getMemoryRendering( IWorkbenchPart part, ISelection selection ) {
if (selection != null && selection instanceof IStructuredSelection && !selection.isEmpty()) {
Object obj = ((IStructuredSelection)selection).getFirstElement();
if (obj != null) {
if (obj instanceof IAdaptable) {
return (IRepositionableMemoryRendering) ((IAdaptable)obj).getAdapter(IRepositionableMemoryRendering.class);
}
}
}
return null;
}
protected ICWatchpointTarget getWatchpointTarget( IWorkbenchPart part, ISelection selection ) {
if (selection != null && selection instanceof IStructuredSelection && !selection.isEmpty()) {
Object obj = ((IStructuredSelection)selection).getFirstElement();
if (obj != null) {
if (obj instanceof IAdaptable) {
ICWatchpointTarget target = (ICWatchpointTarget) ((IAdaptable)obj).getAdapter(ICWatchpointTarget.class);
if (target == null) {
target = (ICWatchpointTarget) ((IAdaptable)obj).getAdapter(
org.eclipse.cdt.debug.internal.core.ICWatchpointTarget.class);
}
return target;
}
}
}
return null;
}
/** /**
* Reports the given error message to the user. * Reports the given error message to the user.
* @param message Message to report. * @param message Message to report.
@ -747,6 +907,7 @@ abstract public class AbstractToggleBreakpointAdapter
* @throws CoreException Exception while creating breakpoint. * @throws CoreException Exception while creating breakpoint.
*/ */
protected abstract void createWatchpoint(boolean interactive, IWorkbenchPart part, String sourceHandle, protected abstract void createWatchpoint(boolean interactive, IWorkbenchPart part, String sourceHandle,
IResource resource, int charStart, int charEnd, int lineNumber, String expression) throws CoreException; IResource resource, int charStart, int charEnd, int lineNumber, String expression, String memorySpace,
String range) throws CoreException;
} }

View file

@ -1,4 +1,4 @@
/******************************************************************************* /*******************************************************************************sb
* Copyright (c) 2004, 2007-7 QNX Software Systems and others. * Copyright (c) 2004, 2007-7 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials * All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0 * are made available under the terms of the Eclipse Public License v1.0
@ -9,35 +9,32 @@
* QNX Software Systems - Initial API and implementation * QNX Software Systems - Initial API and implementation
* Freescale Semiconductor - Address watchpoints, https://bugs.eclipse.org/bugs/show_bug.cgi?id=118299 * Freescale Semiconductor - Address watchpoints, https://bugs.eclipse.org/bugs/show_bug.cgi?id=118299
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.debug.internal.ui.actions.breakpoints; package org.eclipse.cdt.debug.ui.breakpoints;
import java.math.BigInteger;
import org.eclipse.cdt.debug.core.CDIDebugModel;
import org.eclipse.cdt.debug.core.cdi.model.ICDIMemorySpaceManagement;
import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
import org.eclipse.cdt.debug.core.model.ICDebugTarget;
import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages; import org.eclipse.cdt.debug.internal.ui.actions.ActionMessages;
import org.eclipse.cdt.debug.internal.ui.actions.breakpoints.ToggleBreakpointAdapter;
import org.eclipse.cdt.debug.ui.CDebugUIPlugin; import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
import org.eclipse.cdt.debug.ui.breakpoints.IToggleBreakpointsTargetCExtension;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.debug.ui.DebugUITools; import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget; import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IViewActionDelegate; import org.eclipse.ui.IViewActionDelegate;
import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.actions.ActionDelegate; import org.eclipse.ui.actions.ActionDelegate;
/** /**
* A delegate for the "Add Watchpoint" action. * A delegate for the "Add Watchpoint" action. Clients can register this object on
* a model-specific element which supports a toggle breakpoints target.
*
* @noextend This class is not intended to be subclassed by clients.
* @since 7.2
*/ */
public class AddWatchpointActionDelegate extends ActionDelegate implements IViewActionDelegate { public class AddWatchpointActionDelegate extends ActionDelegate implements IViewActionDelegate, IObjectActionDelegate {
private IViewPart fView; private IWorkbenchPart fPart;
private ISelection fSelection; private ISelection fSelection;
private ToggleBreakpointAdapter fDefaultToggleTarget = new ToggleBreakpointAdapter(); private ToggleBreakpointAdapter fDefaultToggleTarget = new ToggleBreakpointAdapter();
@ -50,11 +47,11 @@ public class AddWatchpointActionDelegate extends ActionDelegate implements IView
} }
private void setView(IViewPart view) { private void setView(IViewPart view) {
fView = view; fPart = view;
} }
protected IViewPart getView() { protected IWorkbenchPart getPart() {
return fView; return fPart;
} }
@Override @Override
@ -62,12 +59,17 @@ public class AddWatchpointActionDelegate extends ActionDelegate implements IView
fSelection = selection; fSelection = selection;
} }
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
fPart = targetPart;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction) * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
*/ */
@Override @Override
public void run( IAction action ) { public void run( IAction action ) {
IToggleBreakpointsTarget toggleTarget = DebugUITools.getToggleBreakpointsTargetManager().getToggleBreakpointsTarget(fView, fSelection); IToggleBreakpointsTarget toggleTarget = DebugUITools.getToggleBreakpointsTargetManager().getToggleBreakpointsTarget(fPart, fSelection);
IToggleBreakpointsTargetCExtension cToggleTarget = null; IToggleBreakpointsTargetCExtension cToggleTarget = null;
if (toggleTarget instanceof IToggleBreakpointsTargetCExtension) { if (toggleTarget instanceof IToggleBreakpointsTargetCExtension) {
cToggleTarget = (IToggleBreakpointsTargetCExtension)toggleTarget; cToggleTarget = (IToggleBreakpointsTargetCExtension)toggleTarget;
@ -76,46 +78,9 @@ public class AddWatchpointActionDelegate extends ActionDelegate implements IView
} }
try { try {
cToggleTarget.createWatchpointsInteractive(fView, fSelection); cToggleTarget.createWatchpointsInteractive(fPart, fSelection);
} catch (CoreException e) { } catch (CoreException e) {
CDebugUIPlugin.errorDialog( ActionMessages.getString( "AddWatchpointActionDelegate1.0" ), e ); //$NON-NLS-1$ CDebugUIPlugin.errorDialog( ActionMessages.getString( "AddWatchpointActionDelegate1.0" ), e ); //$NON-NLS-1$
} }
} }
protected void addWatchpoint(boolean write, boolean read, String expression, String memorySpace, BigInteger range) {
if ( getResource() == null )
return;
try {
CDIDebugModel.createWatchpoint( getSourceHandle(), getResource(), write, read, expression, memorySpace, range, true, 0, "", true ); //$NON-NLS-1$
}
catch( CoreException ce ) {
CDebugUIPlugin.errorDialog( ActionMessages.getString( "AddWatchpointActionDelegate1.0" ), ce ); //$NON-NLS-1$
}
}
private IResource getResource() {
return ResourcesPlugin.getWorkspace().getRoot();
}
private String getSourceHandle() {
return ""; //$NON-NLS-1$
}
public static ICDIMemorySpaceManagement getMemorySpaceManagement(){
IAdaptable debugViewElement = DebugUITools.getDebugContext();
ICDIMemorySpaceManagement memMgr = null;
if ( debugViewElement != null ) {
ICDebugTarget debugTarget = (ICDebugTarget)debugViewElement.getAdapter(ICDebugTarget.class);
if ( debugTarget != null ){
ICDITarget target = (ICDITarget)debugTarget.getAdapter(ICDITarget.class);
if (target instanceof ICDIMemorySpaceManagement)
memMgr = (ICDIMemorySpaceManagement)target;
}
}
return memMgr;
}
} }

View file

@ -0,0 +1,93 @@
/*******************************************************************************
* Copyright (c) 2007, 2010 Nokia 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:
* Nokia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.debug.ui.breakpoints;
import org.eclipse.cdt.debug.core.ICWatchpointTarget;
import org.eclipse.cdt.debug.internal.core.CRequest;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;
/**
* Invoked when user right clicks on an element in the Variables or Expressions
* view and selects 'Add Watchpoint (C/C++)' Clients can register this action for
* their specific element type which adapts to {@link ICWatchpointTarget}.
*
*
* @noextend This class is not intended to be subclassed by clients.
* @since 7.2
*/
public class AddWatchpointOnVariableActionDelegate extends AddWatchpointActionDelegate {
/** The target variable/expression */
private ICWatchpointTarget fVar;
/**
* Constructor
*/
public AddWatchpointOnVariableActionDelegate() {
super();
}
private class CanCreateWatchpointRequest extends CRequest implements ICWatchpointTarget.CanCreateWatchpointRequest {
boolean fCanCreate;
@Override
public boolean getCanCreate() {
return fCanCreate;
}
@Override
public void setCanCreate(boolean value) {
fCanCreate = value;
}
};
/**
* Record the target variable/expression
*
* @see org.eclipse.ui.actions.ActionDelegate#selectionChanged(org.eclipse.jface.action.IAction,
* org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(final IAction action, ISelection selection) {
super.selectionChanged(action, selection);
fVar = null;
if (selection == null || selection.isEmpty()) {
action.setEnabled(false);
return;
}
if (selection instanceof TreeSelection) {
Object obj = ((TreeSelection)selection).getFirstElement();
fVar = (ICWatchpointTarget)DebugPlugin.getAdapter(obj, ICWatchpointTarget.class);
if (fVar != null) {
final ICWatchpointTarget.CanCreateWatchpointRequest request = new CanCreateWatchpointRequest() {
@Override
public void done() {
action.setEnabled(getCanCreate());
}
};
fVar.canSetWatchpoint(request);
return;
}
assert false : "action should not have been available for object " + obj; //$NON-NLS-1$
}
else if (selection instanceof StructuredSelection) {
// Not sure why, but sometimes we get an extraneous empty StructuredSelection. Seems harmless enough
assert ((StructuredSelection)selection).getFirstElement() == null : "action installed in unexpected type of view/part"; //$NON-NLS-1$
}
else {
assert false : "action installed in unexpected type of view/part"; //$NON-NLS-1$
}
action.setEnabled(false);
}
}

View file

@ -469,7 +469,7 @@
definitionId="org.eclipse.cdt.debug.ui.testIsTracepointActionSetActive"> definitionId="org.eclipse.cdt.debug.ui.testIsTracepointActionSetActive">
</reference> </reference>
<test <test
property="org.eclipse.cdt.dsf.debug.ui.isCLaunchTypeDisassembly"> property="org.eclipse.cdt.dsf.debug.ui.isDisassemblyViewSupportsCBreakpoint">
</test> </test>
</and> </and>
</enablement> </enablement>

View file

@ -62,7 +62,7 @@ public class GdbDebuggerPage extends AbstractCDebuggerPage implements Observer {
*/ */
protected Combo fTracepointModeCombo; protected Combo fTracepointModeCombo;
protected static final String TP_FAST_ONLY = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_fast"); //$NON-NLS-1$ protected static final String TP_FAST_ONLY = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_fast"); //$NON-NLS-1$
protected static final String TP_SLOW_ONLY = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_slow"); //$NON-NLS-1$ protected static final String TP_NORMAL_ONLY = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_normal"); //$NON-NLS-1$
protected static final String TP_AUTOMATIC = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_auto"); //$NON-NLS-1$ protected static final String TP_AUTOMATIC = LaunchUIMessages.getString("GDBDebuggerPage.tracepoint_mode_auto"); //$NON-NLS-1$
private IMILaunchConfigurationComponent fSolibBlock; private IMILaunchConfigurationComponent fSolibBlock;
@ -168,15 +168,20 @@ public class GdbDebuggerPage extends AbstractCDebuggerPage implements Observer {
String tracepointMode = getStringAttr(config, IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_TRACEPOINT_MODE, String tracepointMode = getStringAttr(config, IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_TRACEPOINT_MODE,
IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_MODE_DEFAULT); IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_MODE_DEFAULT);
if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_SLOW_ONLY)) { if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_NORMAL_ONLY)) {
fTracepointModeCombo.setText(TP_SLOW_ONLY); fTracepointModeCombo.setText(TP_NORMAL_ONLY);
} else if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY)) { } else if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY)) {
fTracepointModeCombo.setText(TP_FAST_ONLY); fTracepointModeCombo.setText(TP_FAST_ONLY);
} else if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_SLOW)) { } else if (tracepointMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL)) {
fTracepointModeCombo.setText(TP_AUTOMATIC); fTracepointModeCombo.setText(TP_AUTOMATIC);
} else { } else {
assert false : "Unknown Tracepoint Mode: " + tracepointMode; //$NON-NLS-1$ // Comment out assertion in the short term to allow for existing launches
fTracepointModeCombo.setText(TP_SLOW_ONLY); // that used the old names to migrate to the new names.
// It can be uncommented after we have released Juno.
// Bug 375256
//
// assert false : "Unknown Tracepoint Mode: " + tracepointMode; //$NON-NLS-1$
fTracepointModeCombo.setText(TP_NORMAL_ONLY);
} }
} }
} }
@ -184,12 +189,12 @@ public class GdbDebuggerPage extends AbstractCDebuggerPage implements Observer {
protected String getSelectedTracepointMode() { protected String getSelectedTracepointMode() {
if (fTracepointModeCombo != null) { if (fTracepointModeCombo != null) {
int selectedIndex = fTracepointModeCombo.getSelectionIndex(); int selectedIndex = fTracepointModeCombo.getSelectionIndex();
if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_SLOW_ONLY)) { if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_NORMAL_ONLY)) {
return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_SLOW_ONLY; return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_NORMAL_ONLY;
} else if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_FAST_ONLY)) { } else if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_FAST_ONLY)) {
return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY; return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY;
} else if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_AUTOMATIC)) { } else if (fTracepointModeCombo.getItem(selectedIndex).equals(TP_AUTOMATIC)) {
return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_SLOW; return IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL;
} else { } else {
assert false : "Unknown Tracepoint mode: " + fTracepointModeCombo.getItem(selectedIndex); //$NON-NLS-1$ assert false : "Unknown Tracepoint mode: " + fTracepointModeCombo.getItem(selectedIndex); //$NON-NLS-1$
} }
@ -379,7 +384,7 @@ public class GdbDebuggerPage extends AbstractCDebuggerPage implements Observer {
fTracepointModeCombo = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN); fTracepointModeCombo = new Combo(parent, SWT.READ_ONLY | SWT.DROP_DOWN);
fTracepointModeCombo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1)); fTracepointModeCombo.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
fTracepointModeCombo.add(TP_SLOW_ONLY); fTracepointModeCombo.add(TP_NORMAL_ONLY);
fTracepointModeCombo.add(TP_FAST_ONLY); fTracepointModeCombo.add(TP_FAST_ONLY);
fTracepointModeCombo.add(TP_AUTOMATIC); fTracepointModeCombo.add(TP_AUTOMATIC);

View file

@ -28,7 +28,7 @@ GDBDebuggerPage.update_thread_list_on_suspend=Force thread list update on suspen
GDBDebuggerPage.Automatically_debug_forked_processes=Automatically debug forked processes (Note: Requires Multi Process GDB) GDBDebuggerPage.Automatically_debug_forked_processes=Automatically debug forked processes (Note: Requires Multi Process GDB)
GDBDebuggerPage.tracepoint_mode_label=Tracepoint mode: GDBDebuggerPage.tracepoint_mode_label=Tracepoint mode:
GDBDebuggerPage.tracepoint_mode_fast=Fast GDBDebuggerPage.tracepoint_mode_fast=Fast
GDBDebuggerPage.tracepoint_mode_slow=Slow GDBDebuggerPage.tracepoint_mode_normal=Normal
GDBDebuggerPage.tracepoint_mode_auto=Automatic GDBDebuggerPage.tracepoint_mode_auto=Automatic
StandardGDBDebuggerPage.0=Debugger executable must be specified. StandardGDBDebuggerPage.0=Debugger executable must be specified.
StandardGDBDebuggerPage.1=GDB Debugger Options StandardGDBDebuggerPage.1=GDB Debugger Options

View file

@ -16,7 +16,7 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import org.eclipse.cdt.debug.internal.core.ICWatchpointTarget; import org.eclipse.cdt.debug.core.ICWatchpointTarget;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts; import org.eclipse.cdt.dsf.datamodel.DMContexts;

View file

@ -185,10 +185,10 @@ public class IGDBLaunchConfigurationConstants {
/** /**
* Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE. * Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE.
* Indicates that only slow tracepoints should be used. * Indicates that only normal tracepoints should be used.
* @since 4.1 * @since 4.1
*/ */
public static final String DEBUGGER_TRACEPOINT_SLOW_ONLY = "TP_SLOW_ONLY"; //$NON-NLS-1$ public static final String DEBUGGER_TRACEPOINT_NORMAL_ONLY = "TP_NORMAL_ONLY"; //$NON-NLS-1$
/** /**
* Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE. * Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE.
@ -199,17 +199,17 @@ public class IGDBLaunchConfigurationConstants {
/** /**
* Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE. * Possible attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE.
* Indicates that slow tracepoints should be used whenever a fast tracepoint * Indicates that normal tracepoints should be used whenever a fast tracepoint
* cannot be inserted. * cannot be inserted.
* @since 4.1 * @since 4.1
*/ */
public static final String DEBUGGER_TRACEPOINT_FAST_THEN_SLOW = "TP_FAST_THEN_SLOW"; //$NON-NLS-1$ public static final String DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL = "TP_FAST_THEN_NORMAL"; //$NON-NLS-1$
/** /**
* Default attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE. * Default attribute value for the key is ATTR_DEBUGGER_TRACEPOINT_MODE.
* @since 4.1 * @since 4.1
*/ */
public static final String DEBUGGER_TRACEPOINT_MODE_DEFAULT = DEBUGGER_TRACEPOINT_SLOW_ONLY; public static final String DEBUGGER_TRACEPOINT_MODE_DEFAULT = DEBUGGER_TRACEPOINT_NORMAL_ONLY;
/** /**
* The default value of DebugPlugin.ATTR_PROCESS_FACTORY_ID. * The default value of DebugPlugin.ATTR_PROCESS_FACTORY_ID.

View file

@ -37,7 +37,7 @@ import org.eclipse.debug.core.ILaunch;
/** /**
* Breakpoint service for GDB 7.2. * Breakpoint service for GDB 7.2.
* It support MI for tracepoints. * It support MI for tracepoints.
* It also support for fast vs slow tracepoints. * It also support for fast vs normal tracepoints.
* *
* @since 4.1 * @since 4.1
*/ */
@ -45,9 +45,9 @@ public class GDBBreakpoints_7_2 extends GDBBreakpoints_7_0
{ {
private IMICommandControl fConnection; private IMICommandControl fConnection;
private enum TracepointMode { FAST_THEN_SLOW, FAST_ONLY, SLOW_ONLY }; private enum TracepointMode { FAST_THEN_NORMAL, FAST_ONLY, NORMAL_ONLY };
private TracepointMode fTracepointMode = TracepointMode.SLOW_ONLY; private TracepointMode fTracepointMode = TracepointMode.NORMAL_ONLY;
public GDBBreakpoints_7_2(DsfSession session) { public GDBBreakpoints_7_2(DsfSession session) {
super(session); super(session);
@ -100,13 +100,13 @@ public class GDBBreakpoints_7_2 extends GDBBreakpoints_7_0
if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY)) { if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_ONLY)) {
fTracepointMode = TracepointMode.FAST_ONLY; fTracepointMode = TracepointMode.FAST_ONLY;
} else if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_SLOW_ONLY)) { } else if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_NORMAL_ONLY)) {
fTracepointMode = TracepointMode.SLOW_ONLY; fTracepointMode = TracepointMode.NORMAL_ONLY;
} else if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_SLOW)) { } else if (tpMode.equals(IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL)) {
fTracepointMode = TracepointMode.FAST_THEN_SLOW; fTracepointMode = TracepointMode.FAST_THEN_NORMAL;
} else { } else {
assert false : "Invalid tracepoint mode: " + tpMode; //$NON-NLS-1$ assert false : "Invalid tracepoint mode: " + tpMode; //$NON-NLS-1$
fTracepointMode = TracepointMode.SLOW_ONLY; fTracepointMode = TracepointMode.NORMAL_ONLY;
} }
} }
@ -178,14 +178,14 @@ public class GDBBreakpoints_7_2 extends GDBBreakpoints_7_0
} }
/** /**
* Add a tracepoint using MI. We have three settings: * Add a tracepoint using MI. We have three settings:
* 1- set only a fast tracepoint but if it fails, set a slow tracepoint * 1- set only a fast tracepoint but if it fails, set a normal tracepoint
* 2- only set a fast tracepoint even if it fails * 2- only set a fast tracepoint even if it fails
* 3- only set a slow tracepoint even if a fast tracepoint could have been used * 3- only set a normal tracepoint even if a fast tracepoint could have been used
*/ */
@Override @Override
protected void addTracepoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm) { protected void addTracepoint(final IBreakpointsTargetDMContext context, final Map<String, Object> attributes, final DataRequestMonitor<IBreakpointDMContext> drm) {
// Unless we should only set slow tracepoints, we try to set a fast tracepoint. // Unless we should only set normal tracepoints, we try to set a fast tracepoint.
boolean isFastTracepoint = fTracepointMode != TracepointMode.SLOW_ONLY; boolean isFastTracepoint = fTracepointMode != TracepointMode.NORMAL_ONLY;
sendTracepointCommand(context, attributes, isFastTracepoint, new ImmediateDataRequestMonitor<IBreakpointDMContext>(drm) { sendTracepointCommand(context, attributes, isFastTracepoint, new ImmediateDataRequestMonitor<IBreakpointDMContext>(drm) {
@Override @Override
@ -197,12 +197,12 @@ public class GDBBreakpoints_7_2 extends GDBBreakpoints_7_0
@Override @Override
protected void handleError() { protected void handleError() {
// Tracepoint failed to be set. // Tracepoint failed to be set.
if (fTracepointMode == TracepointMode.FAST_THEN_SLOW) { if (fTracepointMode == TracepointMode.FAST_THEN_NORMAL) {
// In this case, we failed to set a fast tracepoint, but we should try to set a slow one. // In this case, we failed to set a fast tracepoint, but we should try to set a normal one.
sendTracepointCommand(context, attributes, false, drm); sendTracepointCommand(context, attributes, false, drm);
} else { } else {
// We either failed to set a fast tracepoint and we should not try to set a slow one, // We either failed to set a fast tracepoint and we should not try to set a normal one,
// or we failed to set a slow one. Either way, we are done. // or we failed to set a normal one. Either way, we are done.
drm.setStatus(getStatus()); drm.setStatus(getStatus());
drm.done(); drm.done();
} }

View file

@ -311,6 +311,8 @@ public class GDBControl extends AbstractMIControl implements IGDBControl {
if (!isCanceled()) { if (!isCanceled()) {
// Only set the status if the user has not cancelled the operation already. // Only set the status if the user has not cancelled the operation already.
rm.setStatus(getStatus()); rm.setStatus(getStatus());
} else {
rm.cancel();
} }
rm.done(); rm.done();
} }

View file

@ -88,7 +88,7 @@ public class MIBreakpoint {
boolean isHdw = false; boolean isHdw = false;
// Indicate if we are dealing with a tracepoint. // Indicate if we are dealing with a tracepoint.
// (if its a fast or slow tracepoint can be known through the 'type' field) // (if its a fast or normal tracepoint can be known through the 'type' field)
boolean isTpt = false; boolean isTpt = false;
/** See {@link #isCatchpoint()} */ /** See {@link #isCatchpoint()} */
@ -343,8 +343,8 @@ public class MIBreakpoint {
/** /**
* Return whether this breakpoint is actually a tracepoint. * Return whether this breakpoint is actually a tracepoint.
* This method will return true for both fast and slow tracepoints. * This method will return true for both fast and normal tracepoints.
* To know of fast vs slow tracepoint use {@link getType()} and look * To know of fast vs normal tracepoint use {@link getType()} and look
* for "tracepoint" or "fast tracepoint" * for "tracepoint" or "fast tracepoint"
* *
* @since 3.0 * @since 3.0

View file

@ -58,7 +58,7 @@ public class BaseTestCase {
@Rule public TestName testName = new TestName(); @Rule public TestName testName = new TestName();
public static final String ATTR_DEBUG_SERVER_NAME = TestsPlugin.PLUGIN_ID + ".DEBUG_SERVER_NAME"; public static final String ATTR_DEBUG_SERVER_NAME = TestsPlugin.PLUGIN_ID + ".DEBUG_SERVER_NAME";
private static final String DEFAULT_TEST_APP = "data/launch/bin/GDBMIGenericTestApp"; private static final String DEFAULT_TEST_APP = "data/launch/bin/GDBMIGenericTestApp.exe";
private static GdbLaunch fLaunch; private static GdbLaunch fLaunch;

View file

@ -63,9 +63,9 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE, setLaunchAttribute(ICDTLaunchConfigurationConstants.ATTR_DEBUGGER_START_MODE,
IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE); IGDBLaunchConfigurationConstants.DEBUGGER_MODE_REMOTE);
// To test both fast and slow tracepoint we just the FAST_THEN_SLOW setting // To test both fast and normal tracepoints, we use the FAST_THEN_NORMAL setting
setLaunchAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_TRACEPOINT_MODE, setLaunchAttribute(IGDBLaunchConfigurationConstants.ATTR_DEBUGGER_TRACEPOINT_MODE,
IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_SLOW); IGDBLaunchConfigurationConstants.DEBUGGER_TRACEPOINT_FAST_THEN_NORMAL);
} }
private DsfSession fSession; private DsfSession fSession;
@ -631,7 +631,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
MIBreakpointDMData tp = (MIBreakpointDMData) getBreakpoint(fTracepoints[i]); MIBreakpointDMData tp = (MIBreakpointDMData) getBreakpoint(fTracepoints[i]);
assertTrue("tracepoint "+i+" is not a tracepoint but a " + tp.getBreakpointType(), assertTrue("tracepoint "+i+" is not a tracepoint but a " + tp.getBreakpointType(),
tp.getBreakpointType().equals(MIBreakpoints.TRACEPOINT)); tp.getBreakpointType().equals(MIBreakpoints.TRACEPOINT));
assertTrue("tracepoint "+i+" should be a " + (data.isFastTp?"fast":"slow")+" tracepoint but is not", assertTrue("tracepoint "+i+" should be a " + (data.isFastTp?"fast":"normal")+" tracepoint but is not",
tp.getType().equals("fast tracepoint") == data.isFastTp); tp.getType().equals("fast tracepoint") == data.isFastTp);
assertTrue("tracepoint "+i+" mismatch (wrong file name) got " + tp.getFileName(), assertTrue("tracepoint "+i+" mismatch (wrong file name) got " + tp.getFileName(),
tp.getFileName().equals(data.sourceFile)); tp.getFileName().equals(data.sourceFile));
@ -677,7 +677,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint (will be a slow tracepoint) // First tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FUNCTION, "*"+METHOD_NAME); attributes.put(MIBreakpoints.FUNCTION, "*"+METHOD_NAME);
@ -690,7 +690,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Second tracepoint (will be a slow tracepoint) // Second tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -732,7 +732,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Fifth tracepoint (will be a slow tracepoint) // Fifth tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -912,7 +912,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -942,7 +942,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -973,7 +973,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1003,7 +1003,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1034,7 +1034,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1064,7 +1064,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1095,7 +1095,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1125,7 +1125,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1156,7 +1156,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1198,7 +1198,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1235,7 +1235,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1271,7 +1271,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1305,7 +1305,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
Map<String, Object> attributes = null; Map<String, Object> attributes = null;
int index = 0; int index = 0;
// First tracepoint will be a slow tracepoint // First tracepoint will be a normal tracepoint
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);
@ -1341,7 +1341,7 @@ public class GDBRemoteTracepointsTest_7_0 extends BaseTestCase {
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1); + getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
clearEventCounters(); clearEventCounters();
// Third tracepoint (will be a slow tracepoint) // Third tracepoint (will be a normal tracepoint)
attributes = new HashMap<String, Object>(); attributes = new HashMap<String, Object>();
attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT); attributes.put(MIBreakpoints.BREAKPOINT_TYPE, MIBreakpoints.TRACEPOINT);
attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE); attributes.put(MIBreakpoints.FILE_NAME, SOURCE_FILE);

View file

@ -8,6 +8,9 @@
<feature url="features/org.eclipse.cdt.sdk_0.0.0.qualifier.jar" id="org.eclipse.cdt.sdk" version="0.0.0"> <feature url="features/org.eclipse.cdt.sdk_0.0.0.qualifier.jar" id="org.eclipse.cdt.sdk" version="0.0.0">
<category name="main"/> <category name="main"/>
</feature> </feature>
<feature url="features/org.eclipse.cdt.core.lrparser.feature_0.0.0.qualifier.jar" id="org.eclipse.cdt.core.lrparser.feature" version="0.0.0">
<category name="extra"/>
</feature>
<feature url="features/org.eclipse.cdt.core.lrparser.sdk_0.0.0.qualifier.jar" id="org.eclipse.cdt.core.lrparser.sdk" version="0.0.0"> <feature url="features/org.eclipse.cdt.core.lrparser.sdk_0.0.0.qualifier.jar" id="org.eclipse.cdt.core.lrparser.sdk" version="0.0.0">
<category name="extra"/> <category name="extra"/>
</feature> </feature>

View file

@ -110,6 +110,11 @@ public abstract class AbstractXLCBuildOutputParser implements IScannerInfoConsol
*/ */
@Override @Override
public boolean processLine(String line) { public boolean processLine(String line) {
line= line.trim();
if (line.length() == 0) {
return false;
}
boolean rc = false; boolean rc = false;
int lineBreakPos = line.length() - 1; int lineBreakPos = line.length() - 1;
char[] lineChars = line.toCharArray(); char[] lineChars = line.toCharArray();

View file

@ -97,6 +97,11 @@ public class XlCSpecsConsoleParser implements IScannerInfoConsoleParser {
TraceUtil.outputTrace( TraceUtil.outputTrace(
"XLCSpecsConsoleParser parsing line: [", line, "]"); //$NON-NLS-1$ //$NON-NLS-2$ "XLCSpecsConsoleParser parsing line: [", line, "]"); //$NON-NLS-1$ //$NON-NLS-2$
line= line.trim();
if (line.length() == 0) {
return false;
}
// testing the output line against the pattern of interest // testing the output line against the pattern of interest
Matcher lineMatcher = linePattern.matcher(line); Matcher lineMatcher = linePattern.matcher(line);
if (lineMatcher.matches()) { if (lineMatcher.matches()) {