1616
1717package com.tang.intellij.lua.debugger
1818
19+ import com.intellij.openapi.fileEditor.FileDocumentManager
1920import com.intellij.openapi.project.Project
2021import com.intellij.openapi.vfs.VirtualFile
22+ import com.intellij.psi.PsiManager
23+ import com.intellij.psi.tree.TokenSet
2124import com.intellij.xdebugger.breakpoints.XLineBreakpointTypeBase
2225import 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
2833class 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