Skip to content

Commit

Permalink
Generate and send introspection data
Browse files Browse the repository at this point in the history
  • Loading branch information
davidgranstrom committed Jun 18, 2020
1 parent d32debc commit 5159f7e
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 2 deletions.
2 changes: 1 addition & 1 deletion ftplugin/supercollider/supercollider.vim
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ if enable_arghints
autocmd! * <buffer>
" autocmd InsertCharPre <buffer> call scnvim#util#echo_args_insert()
" autocmd InsertCharPre <buffer> call luaeval('require("scnvim").introspection.highlight_arg()')
autocmd InsertCharPre <buffer> call luaeval('require("scnvim/introspection").echo_args()')
" autocmd InsertCharPre <buffer> call luaeval('require("scnvim/introspection").echo_args()')
augroup END
" for argument hints
let no_float = get(g:, 'scnvim_arghints_float', 1)
Expand Down
2 changes: 2 additions & 0 deletions lua/scnvim.lua
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ end
--- Public interface

function scnvim.init()
-- udp setup must come first
udp.start_server(on_receive)
introspection.create()
end

function scnvim.deinit()
Expand Down
13 changes: 13 additions & 0 deletions lua/scnvim/introspection.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
local M = {}
local utils = require('scnvim/utils')
local api = vim.api
local scnvim

M.float_id = 0
M.introspection = {}

local function call(fn, args)
return utils.vimcall(fn, args or {})
Expand Down Expand Up @@ -118,4 +120,15 @@ function M.try_close_float()
end
end

function M.create()
local tmppath = call('tempname')
local expr = string.format('SCNvim.createIntrospection(\\"%s\\")', tmppath)
scnvim = scnvim or require 'scnvim'
scnvim.eval(expr, function()
utils.readFile(tmppath, vim.schedule_wrap(function(data)
M.introspection = utils.json_decode(data)
end))
end)
end

return M
18 changes: 18 additions & 0 deletions lua/scnvim/utils.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
local M = {}
local uv = vim.loop

------------------
--- Compat
Expand Down Expand Up @@ -29,6 +30,23 @@ function M.send_to_sc(args)
M.vimcall('scnvim#sclang#send_silent', {args})
end

--- Read a file from disk
function M.readFile(path, callback)
uv.fs_open(path, "r", 438, function(err, fd)
assert(not err, err)
uv.fs_fstat(fd, function(err, stat)
assert(not err, err)
uv.fs_read(fd, stat.size, 0, function(err, data)
assert(not err, err)
uv.fs_close(fd, function(err)
assert(not err, err)
return callback(data)
end)
end)
end)
end)
end

------------------
--- String
------------------
Expand Down
54 changes: 53 additions & 1 deletion scide_scnvim/Classes/SCNvimDoc/extSCNvim.sc
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
SCDoc.renderer = SCNvimDocRenderer;

urlString = SCNvimDoc.findHelpFile(text);
url = URI(urlString);
url = URI(urlString);
brokenAction = {
"Sorry no help for %".format(text).postln;
^nil;
Expand Down Expand Up @@ -69,4 +69,56 @@
var name = PathName(uri).fileNameWithoutExtension;
SCNvim.openHelpFor(name, pattern, renderPrg, renderArgs);
}

*createIntrospection {|path|
var file, size;
var res = [];
Class.allClasses.do { |class|
var classData;
classData = [
class.name.asString,
class.class.name.asString,
class.superclass !? {class.superclass.name.asString},
class.filenameSymbol.asString,
class.charPos,
class.methods.collect { |m| this.serializeMethodDetailed(m) };
];
res = res.add(classData);
};
size = res.size;
file = File.open(path, "w");
file.write("[");
res.do {|item, i|
item = item.collect {|x| if (x.isNil) { "null" } { x } };
file.write(item.cs);
if (i < (size - 1)) {
file.write(",");
}
};
file.write("]");
file.close;
}

*serializeMethodDetailed { arg method;
var args, data;
args = [];
if (method.argNames.size > 1) {
args = args ++ [
method.argNames.as(Array).asString,
method.prototypeFrame.collect { |val|
val !? {
if (val.class === Float) { val.asString } { val.cs }
}
};
].lace [2..];
};
data = [
method.ownerClass.name.asString,
method.name.asString,
method.filenameSymbol.asString,
method.charPos,
args
];
^data;
}
}

0 comments on commit 5159f7e

Please sign in to comment.