Skip to content

Commit

Permalink
fix: Fix DrupalContainerTypeProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
nvelychenko committed May 20, 2024
1 parent 96851a5 commit 14f1d3b
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 37 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pluginGroup = com.github.nvelychenko.drupalextend
pluginName = drupal-extend
pluginRepositoryUrl = https://github.com/nvelychenko/drupal-extend
# SemVer format -> https://semver.org
pluginVersion = 0.6.2
pluginVersion = 0.6.3

# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
pluginSinceBuild = 233.13135.108
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,40 +1,99 @@
package com.github.nvelychenko.drupalextend.symfonyIntegration.type

import com.github.nvelychenko.drupalextend.project.drupalExtendSettings
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement
import com.jetbrains.php.PhpIndex
import com.jetbrains.php.lang.psi.elements.Method
import com.jetbrains.php.lang.psi.elements.MethodReference
import com.jetbrains.php.lang.psi.elements.PhpNamedElement
import com.jetbrains.php.lang.psi.resolve.types.PhpType
import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent
import fr.adrienbrault.idea.symfony2plugin.dic.SymfonyContainerTypeProvider
import com.jetbrains.php.lang.psi.resolve.types.PhpTypeProvider4
import fr.adrienbrault.idea.symfony2plugin.Settings
import fr.adrienbrault.idea.symfony2plugin.stubs.ContainerCollectionResolver
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher.CallToSignature
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil
import fr.adrienbrault.idea.symfony2plugin.util.PhpTypeProviderUtil


/**
* Add support for \Drupal::service('database')->|
*/
class DrupalContainerTypeProvider : SymfonyContainerTypeProvider() {
class DrupalContainerTypeProvider : PhpTypeProvider4 {

private val trimKey = '\u0182'
private val trimKey = '\u9956'

override fun getKey(): Char {
return '\u9955'
}

override fun getType(psiElement: PsiElement): PhpType? {
if (!Symfony2ProjectComponent.isEnabled(psiElement.project) || !psiElement.project.drupalExtendSettings.isEnabled) {
if (psiElement !is MethodReference) {
return null
}

if (psiElement !is MethodReference || !PhpElementsUtil.isMethodWithFirstStringOrFieldReference(
psiElement,
"service"
)
) {
val project = psiElement.project
if (!Settings.getInstance(project).pluginEnabled) {
return null
}

if (!PhpElementsUtil.isMethodWithFirstStringOrFieldReference(psiElement, "service")) {
return null
}

val signature = PhpTypeProviderUtil.getReferenceSignatureByFirstParameter(psiElement, trimKey)
return if (signature == null) null else PhpType().add("#" + this.key + signature)
}

override fun complete(s: String?, project: Project?): PhpType? {
return null
}

override fun getBySignature(
expression: String,
visited: Set<String?>,
depth: Int,
project: Project
): Collection<PhpNamedElement?> {
val endIndex = expression.lastIndexOf(trimKey)

if (endIndex == -1) {
return emptySet()
}

val originalSignature = expression.substring(0, endIndex)
var parameter: String = expression.substring(endIndex + 1)

// search for called method
val phpIndex: PhpIndex = PhpIndex.getInstance(project)
val phpNamedElementCollections: Collection<PhpNamedElement?> =
PhpTypeProviderUtil.getTypeSignature(phpIndex, originalSignature)

if (phpNamedElementCollections.isEmpty()) {
return emptySet()
}

// get first matched item
val phpNamedElement: PhpNamedElement = phpNamedElementCollections.iterator().next() as? Method
?: return phpNamedElementCollections

parameter = PhpTypeProviderUtil.getResolvedParameter(phpIndex, parameter) ?: return phpNamedElementCollections

// finally search the classes
if (!PhpElementsUtil.isMethodInstanceOf(
phpNamedElement as Method,
CallToSignature("\\Drupal", "service")
)
) {
return phpNamedElementCollections
}

val containerService =
ContainerCollectionResolver.getService(project, parameter) ?: return phpNamedElementCollections
val phpClasses: MutableCollection<PhpNamedElement?> = HashSet()

for (s in containerService.classNames) {
phpClasses.addAll(PhpIndex.getInstance(project).getAnyByFQN(s))
}

return phpClasses
}
}
4 changes: 2 additions & 2 deletions src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,6 @@
<depends>org.jetbrains.plugins.yaml</depends>
<depends>com.jetbrains.php.drupal</depends>

<depends optional="true">fr.adrienbrault.idea.symfony2plugin</depends>
<depends optional="true">de.espend.idea.php.annotation</depends>
<depends optional="true" config-file="symfony.xml">fr.adrienbrault.idea.symfony2plugin</depends>
<depends optional="true" config-file="annotation.xml">de.espend.idea.php.annotation</depends>
</idea-plugin>
7 changes: 1 addition & 6 deletions src/main/resources/META-INF/symfony.xml
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
<?xml version="1.0"?>
<idea-plugin>

<extensions defaultExtensionNs="com.intellij">
<postStartupActivity
implementation="com.github.nvelychenko.drupalextend.symfonyIntegration.SymfonyIntegrationStartupActivity"/>
</extensions>
<extensions defaultExtensionNs="com.jetbrains.php">
<typeProvider4
implementation="com.github.nvelychenko.drupalextend.symfonyIntegration.type.DrupalContainerTypeProvider"/>
<typeProvider4 implementation="com.github.nvelychenko.drupalextend.symfonyIntegration.type.DrupalContainerTypeProvider"/>
</extensions>

</idea-plugin>

0 comments on commit 14f1d3b

Please sign in to comment.