| package org.eclipse.dltk.ruby.debug; |
| |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.debug.core.DebugException; |
| import org.eclipse.debug.core.DebugPlugin; |
| import org.eclipse.dltk.dbgp.commands.IDbgpExtendedCommands; |
| import org.eclipse.dltk.dbgp.exceptions.DbgpException; |
| import org.eclipse.dltk.debug.core.DLTKDebugPlugin; |
| import org.eclipse.dltk.debug.core.IHotCodeReplaceProvider; |
| import org.eclipse.dltk.debug.core.model.IScriptDebugTarget; |
| import org.eclipse.dltk.debug.core.model.IScriptThread; |
| |
| public class RubyHotCodeReplaceProvider implements |
| IHotCodeReplaceProvider { |
| |
| public RubyHotCodeReplaceProvider() { |
| } |
| |
| @Override |
| public void performCodeReplace(IScriptDebugTarget target, |
| IResource[] resources) throws DebugException { |
| IScriptThread[] threads = (IScriptThread[]) target.getThreads(); |
| |
| if (threads.length > 0) { |
| IScriptThread thread = threads[0]; |
| IDbgpExtendedCommands extCmds = thread.getDbgpSession().getExtendedCommands(); |
| try { |
| extCmds.evaluate(getReplacementCode(resources)); |
| } catch (DbgpException e) { |
| fail(e); |
| } |
| } |
| } |
| |
| private String getReplacementCode(IResource[] resources) throws DebugException { |
| StringBuffer builder = new StringBuffer(); |
| getResourceReplacementCode(resources[0]); |
| for (int i=0; i<resources.length; i++) { |
| builder.append('\n'); |
| builder.append(getResourceReplacementCode(resources[i])); |
| } |
| return builder.toString(); |
| } |
| |
| private String getResourceReplacementCode(IResource resource) throws DebugException { |
| IPath path = resource.getProjectRelativePath(); |
| if (path == null) { |
| fail(Messages.RubyHotCodeReplaceProvider_unableToComputeSourceFilePath); |
| } |
| return "load '" + path.toOSString() + "'"; //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| private void fail(String message) throws DebugException { |
| fail(message, null); |
| } |
| |
| private void fail(Throwable e) throws DebugException { |
| fail(e.getMessage(), e); |
| } |
| |
| private void fail(String message, Throwable e) throws DebugException { |
| throw new DebugException(new Status(IStatus.ERROR, |
| DLTKDebugPlugin.PLUGIN_ID, DebugPlugin.INTERNAL_ERROR, message, |
| e)); |
| } |
| } |