Guest User

Untitled

a guest
Apr 24th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. package org.jetbrains.plugins.scala.findUsages
  2.  
  3. import com.intellij.lang.{ASTNode, Language}
  4. import com.intellij.openapi.application.QueryExecutorBase
  5. import com.intellij.openapi.project.Project
  6. import com.intellij.openapi.util.TextRange
  7. import com.intellij.openapi.vfs.{LocalFileSystem, VirtualFile}
  8. import com.intellij.psi._
  9. import com.intellij.psi.impl.PsiElementBase
  10. import com.intellij.psi.search.searches.ReferencesSearch
  11. import com.intellij.util.Processor
  12. import org.jetbrains.plugins.scala.ScalaLanguage
  13. import org.jetbrains.plugins.scala.extensions._
  14.  
  15. /**
  16. * In your plugin.xml:
  17. * <extensions defaultExtensionNs="com.intellij">
  18. * <referencesSearch implementation="org.jetbrains.plugins.scala.findUsages.LspUsageSearcher"/>
  19. * </extensions>
  20. */
  21. class LspUsageSearcher extends QueryExecutorBase[PsiReference, ReferencesSearch.SearchParameters] {
  22. import LspUsageSearcher._
  23.  
  24. private def lspUsages: Seq[LspUsage] = ???
  25.  
  26. override def processQuery(
  27. param: ReferencesSearch.SearchParameters,
  28. processor: Processor[PsiReference]
  29. ): Unit = {
  30. val elem = param.getElementToSearch
  31. val project = elem.getProject
  32.  
  33. val refs = lspUsages.map { usage =>
  34. val psiElement = FakeLspPsiElement(usage, project)
  35. FakeLspReference(psiElement, elem)
  36. }
  37. refs.foreach(processor.process)
  38. }
  39. }
  40.  
  41. object LspUsageSearcher {
  42. final case class LspUsage(vfile: VirtualFile, range: TextRange, text: String)
  43.  
  44. private def relativeRangeInElement(e: PsiElement): TextRange = {
  45. val range = e.getTextRange
  46. range.shiftLeft(range.getStartOffset)
  47. }
  48.  
  49. private final case class FakeLspReference(usage: PsiElement, refTo: PsiElement)
  50. extends PsiReferenceBase[PsiElement](usage, relativeRangeInElement(usage)) {
  51. override def resolve(): PsiElement = usage
  52. override def getVariants: Array[AnyRef] = Array.empty
  53. }
  54.  
  55. final case class FakeLspPsiElement(usage: LspUsage, project: Project) extends PsiElementBase {
  56. /* you might have to override some more methods if things end up breaking for you */
  57. override def getContainingFile: PsiFile = inReadAction(PsiManager.getInstance(project).findFile(usage.vfile))
  58. override def getProject: Project = project
  59. override def getLanguage: Language = ScalaLanguage.INSTANCE
  60. override def getChildren: Array[PsiElement] = Array.empty
  61. override def getParent: PsiElement = null
  62. override def getTextRange: TextRange = usage.range
  63. override def getStartOffsetInParent: Int = usage.range.getStartOffset
  64. override def getTextLength: Int = usage.text.length
  65. override def findElementAt(offset: Int): PsiElement = null
  66. override def getTextOffset: Int = usage.range.getStartOffset
  67. override def getText: String = usage.text
  68. override def textToCharArray(): Array[Char] = usage.text.toCharArray
  69. override def getNode: ASTNode = null
  70. override def isValid: Boolean = true
  71. }
  72. }
Add Comment
Please, Sign In to add comment