mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 05:10:55 +00:00
parser: lazy support
This commit is contained in:
@ -10,8 +10,4 @@ class PorkFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, PorkL
|
||||
}
|
||||
|
||||
override fun toString(): String = "Pork"
|
||||
|
||||
override fun isPhysical(): Boolean {
|
||||
return super.isPhysical()
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,15 @@
|
||||
package gay.pizza.pork.idea
|
||||
|
||||
import com.intellij.lexer.LexerBase
|
||||
import com.intellij.openapi.diagnostic.Logger
|
||||
import com.intellij.openapi.progress.ProcessCanceledException
|
||||
import com.intellij.psi.tree.IElementType
|
||||
import gay.pizza.pork.parser.*
|
||||
import gay.pizza.pork.parser.BadCharacterError
|
||||
import gay.pizza.pork.parser.StringCharSource
|
||||
import gay.pizza.pork.parser.Tokenizer
|
||||
import gay.pizza.pork.parser.UnterminatedTokenError
|
||||
import com.intellij.psi.TokenType as PsiTokenType
|
||||
|
||||
class PorkLexer : LexerBase() {
|
||||
private val log: Logger = Logger.getInstance(PorkLexer::class.java)
|
||||
|
||||
private lateinit var source: StringCharSource
|
||||
private lateinit var tokenizer: Tokenizer
|
||||
private var internalTokenStart: Int = 0
|
||||
|
@ -0,0 +1,27 @@
|
||||
package gay.pizza.pork.idea
|
||||
|
||||
import com.intellij.codeInspection.ProblemHighlightType
|
||||
import com.intellij.lang.annotation.AnnotationHolder
|
||||
import com.intellij.lang.annotation.Annotator
|
||||
import com.intellij.lang.annotation.HighlightSeverity
|
||||
import com.intellij.psi.PsiElement
|
||||
import gay.pizza.pork.idea.psi.gen.PorkElement
|
||||
|
||||
class PorkReferenceAnnotator : Annotator {
|
||||
override fun annotate(element: PsiElement, holder: AnnotationHolder) {
|
||||
if (element !is PorkElement) {
|
||||
return
|
||||
}
|
||||
|
||||
val reference = element.reference ?: return
|
||||
val resolved = reference.resolve()
|
||||
if (resolved != null) {
|
||||
return
|
||||
}
|
||||
|
||||
holder.newAnnotation(HighlightSeverity.ERROR, "Unresolved reference")
|
||||
.range(element.textRange)
|
||||
.highlightType(ProblemHighlightType.LIKE_UNKNOWN_SYMBOL)
|
||||
.create()
|
||||
}
|
||||
}
|
@ -7,10 +7,10 @@ import gay.pizza.pork.parser.ParseError
|
||||
import gay.pizza.pork.parser.ParserNodeAttribution
|
||||
|
||||
class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution() {
|
||||
override fun <T : Node> guarded(type: NodeType?, block: () -> T): T {
|
||||
override fun <T : Node> produce(type: NodeType, block: () -> T): T {
|
||||
val marker = builder.mark()
|
||||
val result = try {
|
||||
val item = super.guarded(type, block)
|
||||
val item = super.produce(type, block)
|
||||
marker.done(PorkElementTypes.elementTypeFor(item.type))
|
||||
item
|
||||
} catch (e: PsiBuilderTokenSource.BadCharacterError) {
|
||||
|
@ -1,14 +1,11 @@
|
||||
package gay.pizza.pork.idea
|
||||
|
||||
import com.intellij.lang.PsiBuilder
|
||||
import gay.pizza.pork.parser.SourceIndex
|
||||
import gay.pizza.pork.parser.Token
|
||||
import gay.pizza.pork.parser.TokenSource
|
||||
import gay.pizza.pork.parser.TokenType
|
||||
import gay.pizza.pork.parser.*
|
||||
import com.intellij.psi.TokenType as PsiTokenType
|
||||
|
||||
@Suppress("UnstableApiUsage")
|
||||
class PsiBuilderTokenSource(val builder: PsiBuilder) : TokenSource {
|
||||
class PsiBuilderTokenSource(val builder: PsiBuilder) : ParserAwareTokenSource {
|
||||
override val currentIndex: Int = 0
|
||||
|
||||
override fun next(): Token {
|
||||
@ -41,7 +38,5 @@ class PsiBuilderTokenSource(val builder: PsiBuilder) : TokenSource {
|
||||
return PorkElementTypes.tokenTypeFor(elementType) ?: TokenType.EndOfFile
|
||||
}
|
||||
|
||||
override fun ignoringParserIgnoredTypes(): TokenSource = this
|
||||
|
||||
class BadCharacterError(error: String) : RuntimeException(error)
|
||||
}
|
||||
|
@ -3,6 +3,7 @@ package gay.pizza.pork.idea.psi
|
||||
import com.intellij.lang.ASTNode
|
||||
import com.intellij.model.Symbol
|
||||
import com.intellij.navigation.ItemPresentation
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiFileFactory
|
||||
import com.intellij.psi.PsiReference
|
||||
@ -51,7 +52,7 @@ object PorkElementHelpers {
|
||||
unused(type)
|
||||
|
||||
if (element is ImportPathElement) {
|
||||
return PorkFileReference(element, element.textRange)
|
||||
return PorkFileReference(element, TextRange(0, element.textLength))
|
||||
}
|
||||
|
||||
val symbols = element.childrenOfType<SymbolElement>()
|
||||
@ -77,7 +78,7 @@ object PorkElementHelpers {
|
||||
}
|
||||
|
||||
if (element is LetAssignmentElement || element is VarAssignmentElement) {
|
||||
return PorkPresentable(element.name, icon)
|
||||
return PorkPresentable(element.name, icon, element.containingFile.virtualFile?.name)
|
||||
}
|
||||
|
||||
return null
|
||||
|
@ -6,5 +6,5 @@ import javax.swing.Icon
|
||||
class PorkPresentable(val porkText: String?, val porkIcon: Icon? = null, val porkLocation: String? = null) : ItemPresentation {
|
||||
override fun getPresentableText(): String? = porkText
|
||||
override fun getIcon(unused: Boolean): Icon? = porkIcon
|
||||
override fun getLocationString(): String? = porkLocation
|
||||
override fun getLocationString(): String? = porkLocation
|
||||
}
|
||||
|
@ -32,6 +32,9 @@
|
||||
<lang.quoteHandler
|
||||
language="Pork"
|
||||
implementationClass="gay.pizza.pork.idea.PorkQuoteHandler"/>
|
||||
<annotator
|
||||
language="Pork"
|
||||
implementationClass="gay.pizza.pork.idea.PorkReferenceAnnotator"/>
|
||||
<!-- <codeInsight.parameterInfo
|
||||
language="Pork"
|
||||
implementationClass="gay.pizza.pork.idea.PorkParameterInfoHandler"/>-->
|
||||
|
Reference in New Issue
Block a user