blob: 04f27146ab58835f2562bae803e1ffbcd82161dc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2018 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.debug.ui.breakpoints;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.ILineBreakpoint;
import org.eclipse.dltk.core.DLTKLanguageManager;
import org.eclipse.dltk.core.IDLTKLanguageToolkit;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.debug.core.DLTKDebugPlugin;
import org.eclipse.dltk.debug.core.ScriptDebugManager;
import org.eclipse.dltk.debug.core.model.IScriptBreakpoint;
import org.eclipse.dltk.debug.core.model.IScriptMethodEntryBreakpoint;
import org.eclipse.dltk.debug.ui.DLTKDebugUIPlugin;
import org.eclipse.dltk.internal.debug.core.model.AbstractScriptBreakpoint;
import org.eclipse.dltk.internal.debug.core.model.ScriptDebugModel;
import org.eclipse.dltk.ui.DLTKUILanguageManager;
import org.eclipse.dltk.ui.IDLTKUILanguageToolkit;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
public class BreakpointUtils {
public static String getNatureId(IScriptBreakpoint breakpoint) {
ScriptDebugManager manager = ScriptDebugManager.getInstance();
return manager.getNatureByDebugModel(breakpoint.getModelIdentifier());
}
public static IDLTKLanguageToolkit getLanguageToolkit(
IScriptBreakpoint breakpoint) {
return DLTKLanguageManager.getLanguageToolkit(getNatureId(breakpoint));
}
public static IDLTKUILanguageToolkit getUILanguageToolkit(
IScriptBreakpoint breakpoint) {
return DLTKUILanguageManager
.getLanguageToolkit(getNatureId(breakpoint));
}
/**
* @since 2.0
*/
public static void addLineBreakpoint(ITextEditor textEditor, int lineNumber)
throws CoreException {
addLineBreakpoint(textEditor, lineNumber, null);
}
/**
* @since 2.0
*/
public static void addLineBreakpoint(ITextEditor textEditor, int lineNumber,
String debugModelId) throws CoreException {
IDocument document = textEditor.getDocumentProvider()
.getDocument(textEditor.getEditorInput());
IResource resource = getBreakpointResource(textEditor);
try {
IRegion line = document.getLineInformation(lineNumber - 1);
int start = line.getOffset();
int end = start + line.getLength();
if (debugModelId == null) {
debugModelId = getDebugModelId(textEditor, resource);
if (debugModelId == null) {
return;
}
}
IPath location = getBreakpointResourceLocation(textEditor);
ScriptDebugModel.createLineBreakpoint(debugModelId, resource,
location, lineNumber, start, end, true);
} catch (BadLocationException e) {
DLTKDebugPlugin.log(e);
}
}
public static void addSpawnpoint(ITextEditor textEditor, int lineNumber)
throws CoreException {
IDocument document = textEditor.getDocumentProvider()
.getDocument(textEditor.getEditorInput());
IResource resource = getBreakpointResource(textEditor);
try {
IRegion line = document.getLineInformation(lineNumber - 1);
int start = line.getOffset();
int end = start + line.getLength();
String debugModelId = getDebugModelId(textEditor, resource);
if (debugModelId == null)
return;
IPath location = getBreakpointResourceLocation(textEditor);
ScriptDebugModel.createSpawnpoint(debugModelId, resource, location,
lineNumber, start, end, true);
} catch (BadLocationException e) {
DLTKDebugPlugin.log(e);
}
}
public static IResource getBreakpointResource(ITextEditor textEditor) {
return getBreakpointResource(textEditor.getEditorInput());
}
public static IResource getBreakpointResource(
final IEditorInput editorInput) {
IResource resource = editorInput.getAdapter(IResource.class);
if (resource == null)
resource = getWorkspaceRoot();
return resource;
}
private static IWorkspaceRoot getWorkspaceRoot() {
return ResourcesPlugin.getWorkspace().getRoot();
}
/**
* @since 2.0
*/
public static interface IBreakpointLocationTester {
/**
* @param bpLocation
* @return
* @throws CoreException
*/
boolean evaluate(IBreakpoint breakpoint) throws CoreException;
}
private static class ResourceBreakpointLocationTester
implements IBreakpointLocationTester {
private final IResource resource;
/**
* @param resource
*/
public ResourceBreakpointLocationTester(IResource resource) {
this.resource = resource;
}
@Override
public boolean evaluate(IBreakpoint breakpoint) {
return resource.equals(breakpoint.getMarker().getResource());
}
}
private static class SimpleBreakpointLocationTester
implements IBreakpointLocationTester {
private final String path;
/**
* @param path
*/
public SimpleBreakpointLocationTester(IPath path) {
this.path = path.toPortableString();
}
@Override
public boolean evaluate(IBreakpoint breakpoint) throws CoreException {
final IResource bpResource = breakpoint.getMarker().getResource();
if (bpResource.equals(getWorkspaceRoot())) {
final String bpLocation = (String) breakpoint.getMarker()
.getAttribute(IMarker.LOCATION);
return path.equals(bpLocation);
}
return false;
}
}
/**
* @since 2.0
*/
public static IBreakpointLocationTester getBreakpointLocationTester(
IEditorInput editorInput) throws CoreException {
IResource resource = editorInput.getAdapter(IResource.class);
if (resource != null && !resource.equals(getWorkspaceRoot())) {
return new ResourceBreakpointLocationTester(resource);
}
// else
IModelElement element = editorInput.getAdapter(IModelElement.class);
if (element != null) {
return new SimpleBreakpointLocationTester(element.getPath());
}
return null;
}
public static IPath getBreakpointResourceLocation(ITextEditor textEditor)
throws CoreException {
IResource resource = textEditor.getEditorInput()
.getAdapter(IResource.class);
if (resource != null) {
return resource.getFullPath();
}
// else
IModelElement element = textEditor.getEditorInput()
.getAdapter(IModelElement.class);
if (element != null) {
return element.getPath();
}
return null;
}
private static String getDebugModelId(ITextEditor textEditor,
IResource resource) throws CoreException {
String debugModelId = ScriptDebugModel.getDebugModelId(resource);
if (debugModelId != null) {
return debugModelId;
}
// else
IModelElement element = textEditor.getEditorInput()
.getAdapter(IModelElement.class);
if (element != null) {
IDLTKLanguageToolkit toolkit = DLTKLanguageManager
.getLanguageToolkit(element);
if (toolkit != null) {
return ScriptDebugManager.getInstance()
.getDebugModelByNature(toolkit.getNatureId());
}
}
return null;
}
public static ILineBreakpoint findLineBreakpoint(ITextEditor editor,
int lineNumber) throws CoreException {
final IEditorInput editorInput = editor.getEditorInput();
final IResource resource = getBreakpointResource(editorInput);
final String debugModelId = getDebugModelId(editor, resource);
return findLineBreakpoint(editor, lineNumber, debugModelId);
}
/**
*
* ...assume we already know debugModelId
*
* @since 2.0
* @param editor
* @param lineNumber
* @return
* @throws CoreException
*/
public static ILineBreakpoint findLineBreakpoint(ITextEditor editor,
int lineNumber, String debugModelId) throws CoreException {
final IBreakpoint[] breakpoints = DebugPlugin.getDefault()
.getBreakpointManager().getBreakpoints(debugModelId);
final IBreakpointLocationTester tester = getBreakpointLocationTester(
editor.getEditorInput());
if (tester == null) {
return null;
}
for (int i = 0; i < breakpoints.length; i++) {
try {
if (tester.evaluate(breakpoints[i])) {
final ILineBreakpoint lineBreakpoint = (ILineBreakpoint) breakpoints[i];
if (lineBreakpoint.getLineNumber() == lineNumber) {
return lineBreakpoint;
}
}
} catch (CoreException e) {
DLTKDebugUIPlugin.log(e);
}
}
return null;
}
public static void addMethodEntryBreakpoint(ITextEditor textEditor,
int lineNumber, String methodName) throws CoreException {
IDocument document = textEditor.getDocumentProvider()
.getDocument(textEditor.getEditorInput());
IResource resource = textEditor.getEditorInput()
.getAdapter(IResource.class);
if (resource != null) {
try {
IRegion line = document.getLineInformation(lineNumber - 1);
int start = line.getOffset();
int end = start + line.getLength() - 1;
// TODO
IPath path = resource.getLocation();
IScriptMethodEntryBreakpoint methodEntryBreakpoint = ScriptDebugModel
.createMethodEntryBreakpoint(resource, path, lineNumber,
start, end, false, methodName);
methodEntryBreakpoint.setBreakOnEntry(true);
((AbstractScriptBreakpoint) methodEntryBreakpoint)
.register(true);
} catch (BadLocationException e) {
DebugPlugin.log(e);
}
}
}
public static void addWatchPoint(ITextEditor textEditor, int lineNumber,
String fieldName) throws CoreException {
IDocument document = textEditor.getDocumentProvider()
.getDocument(textEditor.getEditorInput());
IResource resource = textEditor.getEditorInput()
.getAdapter(IResource.class);
if (resource != null) {
try {
IRegion line = document.getLineInformation(lineNumber - 1);
int start = line.getOffset();
int end = start + line.getLength() - 1;
// TODO
IPath path = resource.getLocation();
/* ILineBreakpoint b = */ScriptDebugModel.createWatchPoint(
resource, path, lineNumber, start, end, fieldName);
} catch (BadLocationException e) {
DebugPlugin.log(e);
}
}
}
public static void addExceptionBreakpoint(String debugModelId,
boolean caught, final boolean uncaught, final IType type)
throws CoreException {
// TODO: Resource should refer to valid script type, so debug model id
// can be calculated from it
IResource resource = type.getResource();
if (resource == null || !resource.getProject().exists()) {
resource = getWorkspaceRoot();
}
if (resource != null) {
ScriptDebugModel.createExceptionBreakpoint(debugModelId, resource,
type.getTypeQualifiedName(), caught, uncaught, true, null);
}
}
}