Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions script/core/view/psi-select.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
local files = require("files")
local guide = require("parser.guide")
local converter = require("proto.converter")

return function(uri, position)
local state = files.getState(uri)
if not state then
return
end

local pos = converter.unpackPosition(uri, position)
return { data = guide.positionToOffset(state, pos) }
end
96 changes: 96 additions & 0 deletions script/core/view/psi-view.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
local files = require("files")
local guide = require("parser.guide")
local converter = require("proto.converter")
local subString = require 'core.substring'



---@class psi.view.node
---@field name string
---@field attr? psi.view.attr
---@field children? psi.view.node[]

---@class psi.view.attr
---@field range psi.view.range

---@class psi.view.range
---@field start integer
---@field end integer

---@param astNode parser.object
---@param state parser.state
---@return psi.view.node | nil
local function toPsiNode(astNode, state)
if not astNode then
return
end

local startOffset = guide.positionToOffset(state, astNode.start)
local finishOffset = guide.positionToOffset(state, astNode.finish)
local startPosition = converter.packPosition(state.uri, astNode.start)
local finishPosition = converter.packPosition(state.uri, astNode.finish)
return {
name = string.format("%s@[%d:%d .. %d:%d]",
astNode.type,
startPosition.line + 1, startPosition.character + 1,
finishPosition.line + 1, finishPosition.character + 1),
attr = {
range = {
start = startOffset,
["end"] = finishOffset
}
}
}
end

---@param astNode parser.object
---@return psi.view.node | nil
local function collectPsi(astNode, state)
local psiNode = toPsiNode(astNode, state)

if not psiNode then
return
end

guide.eachChild(astNode, function(child)
if psiNode.children == nil then
psiNode.children = {}
end

local psi = collectPsi(child, state)
if psi then
psiNode.children[#psiNode.children+1] = psi
end
end)

if psiNode.children and psiNode.attr then
local range = psiNode.attr.range
if range.start > psiNode.children[1].attr.range.start then
range.start = psiNode.children[1].attr.range.start
end
if range["end"] < psiNode.children[#psiNode.children].attr.range["end"] then
range["end"] = psiNode.children[#psiNode.children].attr.range["end"]
end
end

if not psiNode.children then
local subber = subString(state)
local showText = subber(astNode.start + 1, astNode.finish)
if string.len(showText) > 30 then
showText = showText:sub(0, 30).. " ... "
end

psiNode.name = psiNode.name .. " " .. showText
end

return psiNode
end

return function(uri)
local state = files.getState(uri)
if not state then
return
end

return { data = collectPsi(state.ast, state) }
end
31 changes: 31 additions & 0 deletions script/provider/provider.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,37 @@ m.register '$/api/report' {
end
}

m.register '$/psi/view' {
---@async
function (params)
local uri = files.getRealUri(params.uri)
workspace.awaitReady(uri)
local _ <close> = progress.create(uri, lang.script.WINDOW_PROCESSING_TYPE_FORMATTING, 0.5)
if not files.exists(uri) then
return nil
end
local core = require 'core.view.psi-view'
local result = core(uri)
return result
end
}

m.register '$/psi/select' {
---@async
function(params)
local uri = files.getRealUri(params.uri)
workspace.awaitReady(uri)
local _<close> = progress.create(uri, lang.script.WINDOW_PROCESSING_TYPE_FORMATTING, 0.5)
if not files.exists(uri) then
return nil
end
local core = require 'core.view.psi-select'
local result = core(uri, params.position)
return result
end
}


local function refreshStatusBar()
local valid = config.get(nil, 'Lua.window.statusBar')
for _, scp in ipairs(workspace.folders) do
Expand Down