parser: fix bug in ide support

This commit is contained in:
2023-09-13 19:50:23 -07:00
parent 2307fdc0ed
commit 63e7203db9
6 changed files with 25 additions and 18 deletions

View File

@ -4,14 +4,17 @@ import com.intellij.lang.PsiBuilder
import gay.pizza.pork.ast.Node
import gay.pizza.pork.parser.ParseError
import gay.pizza.pork.parser.ParserNodeAttribution
import java.util.IdentityHashMap
class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution() {
private val map = IdentityHashMap<Node, Node>()
override fun <T : Node> guarded(block: () -> T): T {
val marker = builder.mark()
try {
val result = try {
val item = super.guarded(block)
marker.done(PorkElementTypes.elementTypeFor(item.type))
return item
item
} catch (e: PsiBuilderTokenSource.BadCharacterError) {
marker.error("Bad character.")
while (!builder.eof()) {
@ -32,5 +35,10 @@ class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution
}
throw PorkParser.ExitParser()
}
if (map[result] != null) {
marker.drop()
}
map[result] = result
return result
}
}