Added first stubbing and stub index for global labels.

This commit is contained in:
2021-07-25 19:53:06 +02:00
parent a800b13a3e
commit 83d2ca3304
60 changed files with 234 additions and 100 deletions
@@ -13,7 +13,8 @@ class M68kFileElementType private constructor() : IStubFileElementType<M68kFileS
@JvmField
val INSTANCE = M68kFileElementType()
const val STUB_VERSION = 1
const val STUB_VERSION = 2
const val STUB_EXTERNAL_ID_PREFIX = "MC68000."
}
override fun getStubVersion() = STUB_VERSION
@@ -2,6 +2,7 @@
parserClass="de.platon42.intellij.plugins.m68k.parser.M68kParser"
parserUtilClass="de.platon42.intellij.plugins.m68k.parser.M68kParserUtilBase"
implements = "de.platon42.intellij.plugins.m68k.psi.M68kPsiElement"
extends="com.intellij.extapi.psi.ASTWrapperPsiElement"
psiClassPrefix="M68k"
psiImplClassSuffix="Impl"
@@ -153,8 +154,8 @@ GlobalLabel ::= GLOBAL_LABEL_DEF COLON* {
extends = Label
implements = "de.platon42.intellij.plugins.m68k.psi.M68kNamedElement"
mixin = "de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabelMixin"
// elementTypeFactory = "de.platon42.intellij.plugins.m68k.stubs.M68kStubElementTypeFactory.stubFactory"
// stubClass = "de.platon42.intellij.plugins.m68k.stubs.M68kGlobalLabelStub"
elementTypeFactory = "de.platon42.intellij.plugins.m68k.stubs.M68kStubElementTypeFactory.stubFactory"
stubClass = "de.platon42.intellij.plugins.m68k.stubs.M68kGlobalLabelStub"
methods = [getName setName getNameIdentifier]
}
@@ -6,11 +6,11 @@ import com.intellij.lexer.Lexer
import com.intellij.openapi.project.Project
import com.intellij.psi.FileViewProvider
import com.intellij.psi.tree.TokenSet
import de.platon42.intellij.plugins.m68k.M68kFileElementType
import de.platon42.intellij.plugins.m68k.lexer.M68kLexer
import de.platon42.intellij.plugins.m68k.lexer.M68kLexerPrefs
import de.platon42.intellij.plugins.m68k.psi.M68kFile
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
import de.platon42.intellij.plugins.m68k.stubs.M68kElementTypes
class M68kParserDefinition : ParserDefinition {
@@ -23,7 +23,7 @@ class M68kParserDefinition : ParserDefinition {
override fun createParser(project: Project) = M68kParser()
override fun getFileNodeType() = M68kFileElementType.INSTANCE
override fun getFileNodeType() = M68kElementTypes.FILE
override fun getCommentTokens() = COMMENTS
@@ -1,19 +1,29 @@
package de.platon42.intellij.plugins.m68k.psi
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.extapi.psi.StubBasedPsiElementBase
import com.intellij.ide.projectView.PresentationData
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.stubs.IStubElementType
import de.platon42.intellij.plugins.m68k.M68kIcons
import de.platon42.intellij.plugins.m68k.stubs.M68kGlobalLabelStub
import javax.swing.Icon
abstract class M68kGlobalLabelMixin(node: ASTNode) : ASTWrapperPsiElement(node), M68kGlobalLabel {
abstract class M68kGlobalLabelMixin : StubBasedPsiElementBase<M68kGlobalLabelStub>, M68kGlobalLabel {
constructor(node: ASTNode) : super(node)
constructor(stub: M68kGlobalLabelStub, nodeType: IStubElementType<*, *>) : super(stub, nodeType)
override fun getPresentation(): ItemPresentation? {
return PresentationData(name, containingFile?.name, getIcon(0), null)
return PresentationData(name, containingFile.name, getIcon(0), null)
}
override fun getIcon(flags: Int): Icon? {
return M68kIcons.GLOBAL_LABEL
}
override fun toString(): String {
return javaClass.simpleName + "(GLOBAL_LABEL)"
}
}
@@ -3,4 +3,4 @@ package de.platon42.intellij.plugins.m68k.psi
import com.intellij.psi.NavigatablePsiElement
import com.intellij.psi.PsiNameIdentifierOwner
interface M68kNamedElement : PsiNameIdentifierOwner, NavigatablePsiElement
interface M68kNamedElement : M68kPsiElement, PsiNameIdentifierOwner, NavigatablePsiElement
@@ -0,0 +1,5 @@
package de.platon42.intellij.plugins.m68k.psi
import com.intellij.psi.PsiElement
interface M68kPsiElement : PsiElement
@@ -36,7 +36,7 @@ class M68kGlobalLabelSymbolReference(element: M68kSymbolReference) :
val project = ref.element.project
val targets: MutableList<PsiElement> = SmartList()
PsiSearchHelper.getInstance(project).processElementsWithWord(
{ elem, offset ->
{ elem, _ ->
when (elem) {
is M68kGlobalLabel, is M68kSymbolDefinition -> targets.add(elem)
}
@@ -0,0 +1,44 @@
package de.platon42.intellij.plugins.m68k.stubs
import com.intellij.lang.LighterAST
import com.intellij.lang.LighterASTNode
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.source.tree.LightTreeUtil
import com.intellij.psi.stubs.*
import com.intellij.psi.tree.ILightStubFileElementType
import de.platon42.intellij.plugins.m68k.MC68000Language.Companion.INSTANCE
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
import de.platon42.intellij.plugins.m68k.psi.M68kTypes
import de.platon42.intellij.plugins.m68k.psi.impl.M68kGlobalLabelImpl
import de.platon42.intellij.plugins.m68k.stubs.impl.M68kGlobalLabelStubImpl
import java.io.IOException
interface M68kElementTypes {
companion object {
@JvmField
val FILE = ILightStubFileElementType<M68kFileStub>(INSTANCE)
@JvmField
val GLOBAL_LABEL: IStubElementType<M68kGlobalLabelStub, M68kGlobalLabel> =
object : M68kStubElementType<M68kGlobalLabelStub, M68kGlobalLabel>("GLOBAL_LABEL") {
override fun createPsi(stub: M68kGlobalLabelStub): M68kGlobalLabel = M68kGlobalLabelImpl(stub, this)
override fun createStub(psi: M68kGlobalLabel, parentStub: StubElement<out PsiElement>): M68kGlobalLabelStub =
M68kGlobalLabelStubImpl(parentStub, this, psi.name!!)
override fun createStub(tree: LighterAST, node: LighterASTNode, parentStub: StubElement<*>): M68kGlobalLabelStub {
val idNode = LightTreeUtil.requiredChildOfType(tree, node, M68kTypes.GLOBAL_LABEL_DEF)
return M68kGlobalLabelStubImpl(parentStub, this, LightTreeUtil.toFilteredString(tree, idNode, null))
}
@Throws(IOException::class)
override fun serialize(stub: M68kGlobalLabelStub, dataStream: StubOutputStream) = dataStream.writeName(stub.name)
@Throws(IOException::class)
override fun deserialize(dataStream: StubInputStream, parentStub: StubElement<*>): M68kGlobalLabelStub =
M68kGlobalLabelStubImpl(parentStub, this, dataStream.readName()!!)
override fun indexStub(stub: M68kGlobalLabelStub, sink: IndexSink) = sink.occurrence(M68kGlobalLabelStubIndex.KEY, stub.name!!)
}
}
}
@@ -0,0 +1,6 @@
package de.platon42.intellij.plugins.m68k.stubs
import com.intellij.psi.stubs.NamedStub
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
interface M68kGlobalLabelStub : NamedStub<M68kGlobalLabel>
@@ -0,0 +1,16 @@
package de.platon42.intellij.plugins.m68k.stubs
import com.intellij.psi.stubs.StringStubIndexExtension
import com.intellij.psi.stubs.StubIndexKey
import de.platon42.intellij.plugins.m68k.M68kFileElementType
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
class M68kGlobalLabelStubIndex : StringStubIndexExtension<M68kGlobalLabel>() {
override fun getKey(): StubIndexKey<String, M68kGlobalLabel> = KEY
override fun getVersion(): Int = M68kFileElementType.STUB_VERSION
companion object {
val KEY = StubIndexKey.createIndexKey<String, M68kGlobalLabel>("mc68000.globallabel.index")
}
}
@@ -0,0 +1,13 @@
package de.platon42.intellij.plugins.m68k.stubs
import com.intellij.psi.stubs.ILightStubElementType
import com.intellij.psi.stubs.StubElement
import de.platon42.intellij.plugins.m68k.M68kFileElementType
import de.platon42.intellij.plugins.m68k.MC68000Language.Companion.INSTANCE
import de.platon42.intellij.plugins.m68k.psi.M68kPsiElement
abstract class M68kStubElementType<STUB : StubElement<out M68kPsiElement>, PSI_TYPE : M68kPsiElement>(debugName: String) :
ILightStubElementType<STUB, PSI_TYPE>(debugName, INSTANCE) {
override fun getExternalId(): String = M68kFileElementType.STUB_EXTERNAL_ID_PREFIX + this
}
@@ -0,0 +1,15 @@
package de.platon42.intellij.plugins.m68k.stubs
import com.intellij.psi.stubs.IStubElementType
import com.intellij.psi.stubs.StubElement
import de.platon42.intellij.plugins.m68k.psi.M68kPsiElement
object M68kStubElementTypeFactory {
@JvmStatic
fun stubFactory(name: String): IStubElementType<out StubElement<out M68kPsiElement>, out M68kPsiElement> {
when (name) {
"GLOBAL_LABEL" -> return M68kElementTypes.GLOBAL_LABEL
else -> throw RuntimeException("Unknown element type '$name'")
}
}
}
@@ -0,0 +1,13 @@
package de.platon42.intellij.plugins.m68k.stubs.impl
import com.intellij.psi.stubs.IStubElementType
import com.intellij.psi.stubs.NamedStubBase
import com.intellij.psi.stubs.StubElement
import com.intellij.util.io.StringRef
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
import de.platon42.intellij.plugins.m68k.stubs.M68kGlobalLabelStub
class M68kGlobalLabelStubImpl : NamedStubBase<M68kGlobalLabel>, M68kGlobalLabelStub {
constructor(parent: StubElement<*>, elementType: IStubElementType<*, *>, name: StringRef) : super(parent, elementType, name)
constructor(parent: StubElement<*>, elementType: IStubElementType<*, *>, name: String) : super(parent, elementType, name)
}