From: Christophe Rhodes Date: Thu, 9 Sep 2010 09:38:53 +0000 (+0100) Subject: the beginnings of an inspector X-Git-Url: http://christophe.rhodes.io/gitweb/?p=swankr.git;a=commitdiff_plain;h=aa3a57d293ce702db333a322ca3676862846b602 the beginnings of an inspector Implement enough that C-c I begins to work, at least for values like list(1,2,3). The resulting inspector on the emacs side apparently has no features, and an error message results on quitting the inspector because I've only implemented `swank:init-inspector`, and not `swank:quit-inspector`. Still, good enough to checkpoint. --- diff --git a/swank.R b/swank.R index 22dd532..2d2bf77 100644 --- a/swank.R +++ b/swank.R @@ -460,3 +460,79 @@ withRetryRestart <- function(description, expr) { eval(parse(text=sprintf("%s <- %s", string, value)), envir = globalenv()) TRUE } + +resetInspector <- function(slimeConnection) { + assign("istate", list(), envir=slimeConnection) + assign("inspectorHistory", NULL, envir=slimeConnection) +} + +`swank:init-inspector` <- function(slimeConnection, sldbState, string) { + withRetryRestart("retry SLIME inspection request", + { resetInspector(slimeConnection) + value <- inspectObject(slimeConnection, eval(parse(text=string), envir=globalenv())) + }) + value +} + +inspectObject <- function(slimeConnection, object) { + slimeConnection$istate <- list(object=object, previous=slimeConnection$istate) + slimeConnection$istate$content <- emacsInspect(object) + if(!object %in% slimeConnection$inspectorHistory) { + slimeConnection$inspectorHistory <- c(slimeConnection$inspectorHistory, object) + } + if(!is.null(slimeConnection$istate$previous)) { + slimeConnection$istate$previous$`next` <- slimeConnection$istate + } + istateToElisp(slimeConnection$istate) +} + +valuePart <- function(istate, object, string) { + list(quote(`:value`), + if(is.null(string)) printToString(object) else string, + assignIndexInParts(object, istate)) +} + +preparePart <- function(istate, part) { + if(is.character(part)) { + list(part) + } else { + switch(as.character(part[[1]]), + `:newline` = list("\n"), + `:value` = valuePart(istate, part[[2]], part[[3]]), + `:line` = list(printToString(part[[2]]), ": ", + valuePart(istate, part[[3]], NULL), "\n")) + } +} + +prepareRange <- function(istate, start, end) { + range <- istate$content[start+1:min(end+1, length(istate$content))] + ps <- NULL + for(part in range) { + ps <- c(ps, preparePart(istate, part)) + } + list(ps, if(length(ps)