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
24+ import com.intellij.util.text.CharArrayUtil.isEmptyOrSpaces
2125import com.intellij.xdebugger.breakpoints.XLineBreakpointTypeBase
2226import com.tang.intellij.lua.lang.LuaFileType
27+ import com.tang.intellij.lua.lang.LuaParserDefinition
28+ import com.tang.intellij.lua.psi.LuaTypes
2329
2430/* *
2531 *
@@ -28,12 +34,34 @@ import com.tang.intellij.lua.lang.LuaFileType
2834class LuaLineBreakpointType : XLineBreakpointTypeBase (ID , NAME , LuaDebuggerEditorsProvider ()) {
2935
3036 override fun canPutAt (file : VirtualFile , line : Int , project : Project ): Boolean {
31- return file.fileType == = LuaFileType .INSTANCE
37+ if (file.fileType != = LuaFileType .INSTANCE ) return false
38+
39+ val psiFile = PsiManager .getInstance(project).findFile(file) ? : return false
40+ val doc = FileDocumentManager .getInstance().getDocument(file) ? : return false
41+
42+ val lineStartOffset = doc.getLineStartOffset(line)
43+ val lineEndOffset = doc.getLineEndOffset(line)
44+ if (isEmptyOrSpaces(doc.charsSequence, lineStartOffset, lineEndOffset)) return false
45+
46+ return generateSequence(psiFile.findElementAt(lineStartOffset)) { it.nextSibling }
47+ .takeWhile { it.textOffset < lineEndOffset }
48+ .map { it.node.elementType }
49+ .none {
50+ LuaParserDefinition .COMMENTS .contains(it) || INVALID_BREAKPOINT_ELEMENTS .contains(it)
51+ }
3252 }
3353
3454 companion object {
35-
3655 private const val ID = " lua-line"
3756 private const val NAME = " lua-line-breakpoint"
3857 }
3958}
59+
60+ private val INVALID_BREAKPOINT_ELEMENTS = TokenSet .create(
61+ LuaTypes .LCURLY ,
62+ LuaTypes .RCURLY ,
63+ LuaTypes .LPAREN ,
64+ LuaTypes .RPAREN ,
65+ LuaTypes .LBRACK ,
66+ LuaTypes .RBRACK
67+ )
0 commit comments