frontend: implement basic scope analysis

This commit is contained in:
2023-09-14 14:16:08 -07:00
parent aadc8282a5
commit 821aa3563a
15 changed files with 172 additions and 45 deletions

View File

@ -1,7 +1,10 @@
package gay.pizza.pork.idea
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.TokenSet
import gay.pizza.pork.ast.Node
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.parser.TokenType

View File

@ -2,6 +2,7 @@ package gay.pizza.pork.idea
import com.intellij.lang.PsiBuilder
import gay.pizza.pork.ast.Node
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.parser.ParseError
import gay.pizza.pork.parser.ParserNodeAttribution
import java.util.IdentityHashMap
@ -9,14 +10,14 @@ import java.util.IdentityHashMap
class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution() {
private val map = IdentityHashMap<Node, Node>()
override fun <T : Node> guarded(block: () -> T): T {
override fun <T : Node> guarded(type: NodeType?, block: () -> T): T {
val marker = builder.mark()
val result = try {
val item = super.guarded(block)
val item = super.guarded(type, block)
marker.done(PorkElementTypes.elementTypeFor(item.type))
item
} catch (e: PsiBuilderTokenSource.BadCharacterError) {
marker.error("Bad character.")
marker.error("Invalid character")
while (!builder.eof()) {
builder.advanceLexer()
}