Skip to content

Instantly share code, notes, and snippets.

@zvirdaniel
Created April 27, 2017 15:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zvirdaniel/0672e96a8a736c4a7a6f19b64f74de72 to your computer and use it in GitHub Desktop.
Save zvirdaniel/0672e96a8a736c4a7a6f19b64f74de72 to your computer and use it in GitHub Desktop.
How do I get parameter data from Php method under current offset?
package cz.k2.eshop
import com.intellij.patterns.PlatformPatterns.psiElement
import com.intellij.patterns.PsiNamePatternCondition
import com.intellij.patterns.StandardPatterns
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReferenceContributor
import com.intellij.psi.PsiReferenceRegistrar
import com.jetbrains.php.lang.parser.PhpElementTypes
import com.jetbrains.php.lang.psi.elements.FunctionReference
class GetTemplateReferenceContributor : PsiReferenceContributor() {
override fun registerReferenceProviders(registrar: PsiReferenceRegistrar) {
val templateMethodPattern = object : PsiNamePatternCondition<PsiElement>("withFunctionName", StandardPatterns.string().matches("GetTemplate")) {
override fun getPropertyValue(o: Any): String? {
return if (o is FunctionReference) o.name else null
}
}
val elementPattern = psiElement().withElementType(PhpElementTypes.STRING).
withParent(psiElement().withElementType(PhpElementTypes.PARAMETER_LIST).withParent(psiElement().
withElementType(PhpElementTypes.FUNCTION_CALL).with(templateMethodPattern)))
registrar.registerReferenceProvider(elementPattern, GetTemplateReferenceProvider(), PsiReferenceRegistrar.DEFAULT_PRIORITY)
}
}
package cz.k2.eshop
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference
import com.intellij.psi.PsiReferenceProvider
import com.intellij.util.ProcessingContext
class GetTemplateReferenceProvider : PsiReferenceProvider() {
override fun getReferencesByElement(element: PsiElement, context: ProcessingContext): Array<PsiReference> {
val specialGetTemplateReference = SpecialGetTemplateReference(element)
val standardGetTemplateReference = StandardGetTemplateReference(element)
val result: MutableList<PsiReference> = mutableListOf<PsiReference>()
if (specialGetTemplateReference.psiFile != null) {
result.add(specialGetTemplateReference)
}
if (standardGetTemplateReference.psiFile != null) {
result.add(standardGetTemplateReference)
}
return if (result.size > 0) result.toTypedArray() else PsiReference.EMPTY_ARRAY
}
}
package cz.k2.eshop
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiReferenceBase
class SpecialGetTemplateReference internal constructor(element: PsiElement) : PsiReferenceBase<PsiElement>(element) {
val project = myElement.project
val parameterData = myElement.text.substring(1, myElement.textLength - 1)
val destinationString = "special/views/$parameterData.phtml"
val virtualFile = project.baseDir.findFileByRelativePath(destinationString)
val psiFile = virtualFile?.let { PsiManager.getInstance(project).findFile(it) }
override fun resolve(): PsiElement? = psiFile
override fun getVariants(): Array<Any?> {
return arrayOfNulls(0)
}
}
package cz.k2.eshop
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import com.intellij.psi.PsiReferenceBase
class StandardGetTemplateReference internal constructor(element: PsiElement) : PsiReferenceBase<PsiElement>(element) {
val project = myElement.project
val parameterData = myElement.text.substring(1, myElement.textLength - 1)
val destinationString = "standard/views/$parameterData.phtml"
val virtualFile = project.baseDir.findFileByRelativePath(destinationString)
val psiFile: PsiFile? = virtualFile?.let { PsiManager.getInstance(project).findFile(it) }
override fun resolve(): PsiElement? = psiFile
// Used for autocompletion
override fun getVariants(): Array<Any?> {
return arrayOfNulls(0)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment