Skip to content

Commit e8790f0

Browse files
committed
disable breakpoint placement at invalid locations
1 parent d6676a7 commit e8790f0

File tree

1 file changed

+31
-2
lines changed

1 file changed

+31
-2
lines changed

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@
1616

1717
package com.tang.intellij.lua.debugger
1818

19+
import com.intellij.openapi.fileEditor.FileDocumentManager
1920
import com.intellij.openapi.project.Project
2021
import com.intellij.openapi.vfs.VirtualFile
22+
import com.intellij.psi.PsiManager
23+
import com.intellij.psi.tree.TokenSet
2124
import com.intellij.xdebugger.breakpoints.XLineBreakpointTypeBase
2225
import com.tang.intellij.lua.lang.LuaFileType
26+
import com.tang.intellij.lua.lang.LuaParserDefinition
27+
import com.tang.intellij.lua.psi.LuaTypes
2328

2429
/**
2530
*
@@ -28,12 +33,36 @@ import com.tang.intellij.lua.lang.LuaFileType
2833
class LuaLineBreakpointType : XLineBreakpointTypeBase(ID, NAME, LuaDebuggerEditorsProvider()) {
2934

3035
override fun canPutAt(file: VirtualFile, line: Int, project: Project): Boolean {
31-
return file.fileType === LuaFileType.INSTANCE
36+
if (file.fileType !== LuaFileType.INSTANCE) return false
37+
38+
val psiFile = PsiManager.getInstance(project).findFile(file) ?: return false
39+
val doc = FileDocumentManager.getInstance().getDocument(file) ?: return false
40+
41+
val lineStartOffset = doc.getLineStartOffset(line)
42+
val lineEndOffset = doc.getLineEndOffset(line)
43+
val lineText = doc.text.substring(lineStartOffset, lineEndOffset).trim()
44+
45+
if (lineText.isEmpty()) return false
46+
47+
return generateSequence(psiFile.findElementAt(lineStartOffset)) { it.nextSibling }
48+
.takeWhile { it.textOffset < lineEndOffset }
49+
.map { it.node.elementType }
50+
.none {
51+
LuaParserDefinition.COMMENTS.contains(it) || INVALID_BREAKPOINT_ELEMENTS.contains(it)
52+
}
3253
}
3354

3455
companion object {
35-
3656
private const val ID = "lua-line"
3757
private const val NAME = "lua-line-breakpoint"
3858
}
3959
}
60+
61+
private val INVALID_BREAKPOINT_ELEMENTS = TokenSet.create(
62+
LuaTypes.LCURLY,
63+
LuaTypes.RCURLY,
64+
LuaTypes.LPAREN,
65+
LuaTypes.RPAREN,
66+
LuaTypes.LBRACK,
67+
LuaTypes.RBRACK
68+
)

0 commit comments

Comments
 (0)