Added first stubbing and stub index for global labels.
This commit is contained in:
@@ -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
|
||||
+1
-1
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user