-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathhieararchicalPackageNodeData.lua
More file actions
120 lines (105 loc) · 3.53 KB
/
Copy pathhieararchicalPackageNodeData.lua
File metadata and controls
120 lines (105 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
local _n = require("java-deps.java.nodeData")
local _ipkg = require("java-deps.java.IPackageRootNodeData")
local INodeData = _n.INodeData
local IPackageRootNodeData = _ipkg.IPackageRootNodeData
local M = {}
---@class HierarchicalPackageNodeData: INodeData
---@field displayName string
---@field name string
---@field _nodeData? INodeData
---@field children HierarchicalPackageNodeData[]
local HierarchicalPackageNodeData = INodeData:new()
HierarchicalPackageNodeData.__index = HierarchicalPackageNodeData
---@param displayName string
---@param parentName? string
---@return HierarchicalPackageNodeData
function HierarchicalPackageNodeData:new(displayName, parentName)
local name = (parentName == nil or parentName == "") and displayName or parentName .. "." .. displayName
return setmetatable({
displayName = displayName,
name = name,
children = {},
}, self)
end
function HierarchicalPackageNodeData:compressTree()
while self.name ~= "" and #self.children == 1 and not self:isPackage() do
local child = self.children[1]
self.name = self.name .. "." .. child.displayName
self.displayName = self.displayName .. "." .. child.displayName
self.children = child.children
self._nodeData = child._nodeData
end
for _, child in ipairs(self.children) do
child:compressTree()
end
end
---@param packages string[]
---@param nodeData INodeData
function HierarchicalPackageNodeData:addSubPackage(packages, nodeData)
if #packages == 0 then
self._nodeData = nodeData
return
end
local subPackageDisplayName = table.remove(packages, 1)
---@type HierarchicalPackageNodeData?
local childNode
for _, child in ipairs(self.children) do
if child.displayName == subPackageDisplayName then
childNode = child
break
end
end
if childNode then
childNode:addSubPackage(packages, nodeData)
else
local newNode = HierarchicalPackageNodeData:new(subPackageDisplayName, self.name)
newNode:addSubPackage(packages, nodeData)
table.insert(self.children, newNode)
end
end
function HierarchicalPackageNodeData:isPackage()
return self._nodeData ~= nil
end
function HierarchicalPackageNodeData:getDisplayName()
return self.displayName
end
function HierarchicalPackageNodeData:getName()
return self.name
end
function HierarchicalPackageNodeData:getModuleName()
return self._nodeData and self._nodeData.moduleName
end
function HierarchicalPackageNodeData:getPath()
return self._nodeData and self._nodeData.path
end
function HierarchicalPackageNodeData:getHandlerIdentifier()
return self._nodeData and self._nodeData.handlerIdentifier
end
function HierarchicalPackageNodeData:getUri()
return self._nodeData and self._nodeData.uri
end
function HierarchicalPackageNodeData:getKind()
return self._nodeData and self._nodeData.kind
end
function HierarchicalPackageNodeData:getChildren()
return self.children
end
function HierarchicalPackageNodeData:getMetaData()
return self._nodeData and self._nodeData.metaData
end
function HierarchicalPackageNodeData:getEntryKind()
return self._nodeData and IPackageRootNodeData:form(self._nodeData):getEntryKind()
end
M.HierarchicalPackageNodeData = HierarchicalPackageNodeData
---@param packageList INodeData[]
---@return HierarchicalPackageNodeData
M.createHierarchicalNodeDataByPackageList = function(packageList)
local result = HierarchicalPackageNodeData:new("", "")
for _, nodeData in ipairs(packageList) do
local packages = vim.split(nodeData.name, "%.")
result:addSubPackage(packages, nodeData)
end
result:compressTree()
return result
end
return M