Skip to content

Commit fb4c65a

Browse files
committed
complete inline values support
1 parent ebf79de commit fb4c65a

File tree

1 file changed

+64
-11
lines changed

1 file changed

+64
-11
lines changed

src/main/java/com/tang/intellij/lua/debugger/LuaPsiDebugVariablePositionProvider.kt

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,22 @@ package com.tang.intellij.lua.debugger
1818

1919
import com.intellij.openapi.application.ReadAction
2020
import com.intellij.openapi.editor.Document
21+
import com.intellij.openapi.util.TextRange
2122
import com.intellij.psi.PsiElement
2223
import com.intellij.psi.PsiFile
2324
import com.intellij.psi.util.PsiTreeUtil
2425
import com.intellij.xdebugger.XSourcePosition
2526
import com.tang.intellij.lua.debugger.emmy.value.LuaXValue
2627
import com.tang.intellij.lua.psi.LuaFuncBody
2728
import com.tang.intellij.lua.psi.LuaNameExpr
29+
import com.tang.intellij.lua.psi.LuaNameDef
30+
import com.tang.intellij.lua.psi.LuaParamNameDef
2831
import com.tang.intellij.lua.psi.LuaPsiFile
2932

3033
/**
3134
* Provider that uses PSI tree to find variable positions
32-
* Collects all NameExpr from current position up to the first FuncBody or file root
35+
* Collects all NameExpr, NameDef (local variables), and ParamNameDef (function parameters)
36+
* from current position up to the first FuncBody or file root
3337
*/
3438
class LuaPsiDebugVariablePositionProvider : LuaDebugVariablePositionProvider {
3539

@@ -92,22 +96,30 @@ class LuaPsiDebugVariablePositionProvider : LuaDebugVariablePositionProvider {
9296
}
9397

9498
/**
95-
* Collect all NameExpr in the scope up to the specified line end offset
99+
* Collect all NameExpr, NameDef, and ParamNameDef in the scope up to the specified line end offset
96100
*/
97101
private fun collectNameExprsInScope(
98102
scopeElement: PsiElement,
99103
lineEndOffset: Int,
100104
document: Document,
101105
context: LuaDebugVariableContext
102106
) {
103-
// Find all NameExpr within the scope element
107+
// Find all NameExpr (variable usages) within the scope element
104108
val nameExprs = PsiTreeUtil.findChildrenOfType(scopeElement, LuaNameExpr::class.java)
105109

106-
println("LuaPsiDebugVariablePositionProvider: Found ${nameExprs.size} NameExpr in scope")
110+
// Find all NameDef (local variable definitions) within the scope element
111+
val nameDefs = PsiTreeUtil.findChildrenOfType(scopeElement, LuaNameDef::class.java)
107112

108-
// For each variable, we want to keep track of ALL occurrences before or on current line
109-
// This allows inline values to be shown at each usage location
110-
var addedCount = 0
113+
// Find all ParamNameDef (function parameter definitions) within the scope element
114+
val paramNameDefs = PsiTreeUtil.findChildrenOfType(scopeElement, LuaParamNameDef::class.java)
115+
116+
println("LuaPsiDebugVariablePositionProvider: Found ${nameExprs.size} NameExpr, ${nameDefs.size} NameDef, ${paramNameDefs.size} ParamNameDef in scope")
117+
118+
// Collect all elements with their positions into a single list
119+
data class ElementWithPosition(val name: String, val offset: Int, val textRange: TextRange, val type: String)
120+
val allElements = mutableListOf<ElementWithPosition>()
121+
122+
// Collect NameExpr (variable usages)
111123
for (nameExpr in nameExprs) {
112124
val textRange = nameExpr.textRange
113125

@@ -116,14 +128,55 @@ class LuaPsiDebugVariablePositionProvider : LuaDebugVariablePositionProvider {
116128
val variableName = nameExpr.text.trim()
117129

118130
if (variableName.isNotBlank() && !isKeyword(variableName)) {
119-
println("LuaPsiDebugVariablePositionProvider: Adding variable '$variableName' at ${textRange.startOffset}")
120-
// Use a composite key (variable name + offset) to store multiple occurrences
121-
context.addVariableRange(variableName, textRange)
122-
addedCount++
131+
allElements.add(ElementWithPosition(variableName, textRange.startOffset, textRange, "NameExpr"))
132+
}
133+
}
134+
}
135+
136+
// Collect NameDef (local variable definitions)
137+
for (nameDef in nameDefs) {
138+
// Skip if this is a ParamNameDef (already handled below)
139+
if (nameDef is LuaParamNameDef) continue
140+
141+
val textRange = nameDef.textRange
142+
143+
// Only include NameDef that appear before or on the current line
144+
if (textRange.startOffset <= lineEndOffset) {
145+
val variableName = nameDef.text.trim()
146+
147+
if (variableName.isNotBlank() && !isKeyword(variableName)) {
148+
allElements.add(ElementWithPosition(variableName, textRange.startOffset, textRange, "NameDef"))
123149
}
124150
}
125151
}
126152

153+
// Collect ParamNameDef (function parameter definitions)
154+
for (paramNameDef in paramNameDefs) {
155+
val textRange = paramNameDef.textRange
156+
157+
// Only include ParamNameDef that appear before or on the current line
158+
if (textRange.startOffset <= lineEndOffset) {
159+
val variableName = paramNameDef.text.trim()
160+
161+
if (variableName.isNotBlank() && !isKeyword(variableName)) {
162+
allElements.add(ElementWithPosition(variableName, textRange.startOffset, textRange, "ParamNameDef"))
163+
}
164+
}
165+
}
166+
167+
// Sort all elements by their start offset to ensure correct order
168+
allElements.sortBy { it.offset }
169+
170+
println("LuaPsiDebugVariablePositionProvider: Collected ${allElements.size} total elements, sorted by position")
171+
172+
// Add them to context in sorted order
173+
var addedCount = 0
174+
for (element in allElements) {
175+
println("LuaPsiDebugVariablePositionProvider: Adding ${element.type} variable '${element.name}' at ${element.offset}")
176+
context.addVariableRange(element.name, element.textRange)
177+
addedCount++
178+
}
179+
127180
println("LuaPsiDebugVariablePositionProvider: Added $addedCount variables to context")
128181
}
129182

0 commit comments

Comments
 (0)