Call Word-Index for Global Labels and Symbols instead of iterating over the files. Removed unused file.
This commit is contained in:
parent
d872feeec4
commit
a800b13a3e
@ -8,6 +8,9 @@ import com.intellij.psi.PsiPolyVariantReferenceBase
|
|||||||
import com.intellij.psi.ResolveResult
|
import com.intellij.psi.ResolveResult
|
||||||
import com.intellij.psi.impl.source.resolve.ResolveCache
|
import com.intellij.psi.impl.source.resolve.ResolveCache
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
|
import com.intellij.psi.search.PsiSearchHelper
|
||||||
|
import com.intellij.psi.search.UsageSearchContext
|
||||||
|
import com.intellij.util.SmartList
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
import de.platon42.intellij.plugins.m68k.psi.M68kGlobalLabel
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
||||||
@ -19,28 +22,34 @@ class M68kGlobalLabelSymbolReference(element: M68kSymbolReference) :
|
|||||||
companion object {
|
companion object {
|
||||||
val INSTANCE = Resolver()
|
val INSTANCE = Resolver()
|
||||||
|
|
||||||
fun findGlobalLabels(element: M68kSymbolReference, predicate: (M68kGlobalLabel) -> Boolean): List<M68kGlobalLabel> {
|
fun findGlobalLabels(element: M68kSymbolReference, predicate: (M68kGlobalLabel) -> Boolean): List<M68kGlobalLabel> =
|
||||||
return M68kLookupUtil.findAllGlobalLabels(element.project).filter(predicate)
|
M68kLookupUtil.findAllGlobalLabels(element.project).filter(predicate)
|
||||||
}
|
|
||||||
|
|
||||||
fun findSymbolDefinitions(element: M68kSymbolReference, predicate: (M68kSymbolDefinition) -> Boolean): List<M68kSymbolDefinition> {
|
fun findSymbolDefinitions(element: M68kSymbolReference, predicate: (M68kSymbolDefinition) -> Boolean): List<M68kSymbolDefinition> =
|
||||||
return M68kLookupUtil.findAllSymbolDefinitions(element.project).filter(predicate)
|
M68kLookupUtil.findAllSymbolDefinitions(element.project).filter(predicate)
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCurrentFileSearchScope(element: PsiElement): GlobalSearchScope {
|
|
||||||
return GlobalSearchScope.fileScope(element.containingFile.originalFile)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Resolver : ResolveCache.PolyVariantResolver<M68kGlobalLabelSymbolReference> {
|
class Resolver : ResolveCache.PolyVariantResolver<M68kGlobalLabelSymbolReference> {
|
||||||
override fun resolve(ref: M68kGlobalLabelSymbolReference, incompleteCode: Boolean): Array<ResolveResult> {
|
override fun resolve(ref: M68kGlobalLabelSymbolReference, incompleteCode: Boolean): Array<ResolveResult> {
|
||||||
val refName = ref.element.symbolName
|
val refName = ref.element.symbolName
|
||||||
|
|
||||||
|
val project = ref.element.project
|
||||||
|
val targets: MutableList<PsiElement> = SmartList()
|
||||||
|
PsiSearchHelper.getInstance(project).processElementsWithWord(
|
||||||
|
{ elem, offset ->
|
||||||
|
when (elem) {
|
||||||
|
is M68kGlobalLabel, is M68kSymbolDefinition -> targets.add(elem)
|
||||||
|
}
|
||||||
|
true
|
||||||
|
}, GlobalSearchScope.allScope(project),
|
||||||
|
refName, UsageSearchContext.IN_CODE, true
|
||||||
|
)
|
||||||
|
|
||||||
val globalLabelMatches: Array<ResolveResult> = findGlobalLabels(ref.myElement) { it.name == refName }
|
val globalLabelMatches: Array<ResolveResult> = findGlobalLabels(ref.myElement) { it.name == refName }
|
||||||
.map { PsiElementResolveResult(it) }
|
.map { PsiElementResolveResult(it) }
|
||||||
.toTypedArray()
|
.toTypedArray()
|
||||||
if (globalLabelMatches.isNotEmpty()) return globalLabelMatches
|
if (globalLabelMatches.isNotEmpty()) return globalLabelMatches
|
||||||
return findSymbolDefinitions(ref.myElement) { it.name == refName }
|
return targets
|
||||||
.map { PsiElementResolveResult(it) }
|
.map { PsiElementResolveResult(it) }
|
||||||
.toTypedArray()
|
.toTypedArray()
|
||||||
}
|
}
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
package de.platon42.intellij.plugins.m68k.refs
|
|
||||||
|
|
||||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
|
||||||
import com.intellij.openapi.util.TextRange
|
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.PsiElementResolveResult
|
|
||||||
import com.intellij.psi.PsiPolyVariantReferenceBase
|
|
||||||
import com.intellij.psi.ResolveResult
|
|
||||||
import com.intellij.psi.impl.source.resolve.ResolveCache
|
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kLookupUtil
|
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolDefinition
|
|
||||||
import de.platon42.intellij.plugins.m68k.psi.M68kSymbolReference
|
|
||||||
|
|
||||||
class M68kSymbolDefinitionReference(element: M68kSymbolReference) :
|
|
||||||
PsiPolyVariantReferenceBase<M68kSymbolReference>(element, TextRange(0, element.textLength)) {
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
val INSTANCE = Resolver()
|
|
||||||
|
|
||||||
fun findSymbolDefinitions(element: M68kSymbolReference, predicate: (M68kSymbolDefinition) -> Boolean): List<M68kSymbolDefinition> {
|
|
||||||
return M68kLookupUtil.findAllSymbolDefinitions(element.project).filter(predicate)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCurrentFileSearchScope(element: PsiElement): GlobalSearchScope {
|
|
||||||
return GlobalSearchScope.fileScope(element.containingFile.originalFile)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Resolver : ResolveCache.PolyVariantResolver<M68kSymbolDefinitionReference> {
|
|
||||||
override fun resolve(ref: M68kSymbolDefinitionReference, incompleteCode: Boolean): Array<ResolveResult> {
|
|
||||||
val refName = ref.element.symbolName
|
|
||||||
|
|
||||||
return findSymbolDefinitions(ref.myElement) { it.name == refName }
|
|
||||||
.map { PsiElementResolveResult(it) }
|
|
||||||
.toTypedArray()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
|
|
||||||
return ResolveCache.getInstance(element.project)
|
|
||||||
.resolveWithCaching(this, INSTANCE, false, incompleteCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun resolve(): PsiElement? {
|
|
||||||
val resolveResults = multiResolve(false)
|
|
||||||
return resolveResults.singleOrNull()?.element
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getVariants(): Array<Any> {
|
|
||||||
return findSymbolDefinitions(element) { true }
|
|
||||||
.map { LookupElementBuilder.createWithIcon(it) }
|
|
||||||
.toTypedArray()
|
|
||||||
}
|
|
||||||
}
|
|
@ -19,7 +19,7 @@ class M68kFindUsagesProvider : FindUsagesProvider {
|
|||||||
M68kLexer(M68kLexerPrefs()), // FIXME Oh no! More Prefs!
|
M68kLexer(M68kLexerPrefs()), // FIXME Oh no! More Prefs!
|
||||||
TokenSet.create(M68kTypes.SYMBOLDEF, M68kTypes.GLOBAL_LABEL_DEF, M68kTypes.LOCAL_LABEL_DEF, M68kTypes.SYMBOL),
|
TokenSet.create(M68kTypes.SYMBOLDEF, M68kTypes.GLOBAL_LABEL_DEF, M68kTypes.LOCAL_LABEL_DEF, M68kTypes.SYMBOL),
|
||||||
TokenSet.create(M68kTypes.COMMENT),
|
TokenSet.create(M68kTypes.COMMENT),
|
||||||
TokenSet.create(M68kTypes.STRINGLIT),
|
TokenSet.create(M68kTypes.STRINGLIT, M68kTypes.DECIMAL, M68kTypes.HEXADECIMAL, M68kTypes.OCTAL, M68kTypes.BINARY),
|
||||||
TokenSet.EMPTY
|
TokenSet.EMPTY
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user