diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/utils/ConfigUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/utils/ConfigUtil.java index f3f5b46ad..dd396bde1 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/utils/ConfigUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/utils/ConfigUtil.java @@ -8,9 +8,7 @@ import com.intellij.psi.util.*; import com.intellij.util.containers.ContainerUtil; 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.PhpClass; +import com.jetbrains.php.lang.psi.elements.*; import fr.adrienbrault.idea.symfony2plugin.util.FilesystemUtil; import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; import org.apache.commons.lang.StringUtils; @@ -107,12 +105,28 @@ private static void visitTreeSignatures(@NotNull Collection classes, @ continue; } + Collection parameterOwners = new ArrayList<>(); + + // Symfony < 4.1: (new TreeBuilder())->root('foobar') for(MethodReference methodReference: PsiTreeUtil.findChildrenOfType(method, MethodReference.class)) { if(!PhpElementsUtil.isMethodReferenceInstanceOf(methodReference, "Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder", "root")) { continue; } - PsiElement[] parameters = methodReference.getParameters(); + parameterOwners.add(methodReference); + } + + // Symfony >= 4.1: new TreeBuilder('foobar') + for(NewExpression methodReference: PsiTreeUtil.findChildrenOfType(method, NewExpression.class)) { + if(!PhpElementsUtil.isNewExpressionPhpClassWithInstance(methodReference, "Symfony\\Component\\Config\\Definition\\Builder\\TreeBuilder")) { + continue; + } + + parameterOwners.add(methodReference); + } + + for (ParameterListOwner ownerParameters : parameterOwners) { + PsiElement[] parameters = ownerParameters.getParameters(); if (parameters.length == 0) { continue; } diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlElementPatternHelper.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlElementPatternHelper.java index e6a079696..588c3b262 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlElementPatternHelper.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/config/yaml/YamlElementPatternHelper.java @@ -2,6 +2,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.patterns.*; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiWhiteSpace; @@ -43,6 +44,8 @@ public class YamlElementPatternHelper { * * /../config/packages/doctrine.yml * /../config/packages/test/doctrine.yml + * + * /../config/packages/doctrine.yaml */ private static final PatternCondition CONFIG_YAML_PATTERN = new PatternCondition("Yaml Configuration") { @Override @@ -55,12 +58,19 @@ public boolean accepts(@NotNull PsiFile psiFile, ProcessingContext processingCon return true; } - VirtualFile virtualFile = psiFile.getVirtualFile(); - if(virtualFile == null) { + // psiFile.virtualFile is empty; check via folder structure + PsiDirectory containingDirectory = psiFile.getContainingDirectory(); + if (containingDirectory == null) { return false; } - String relativePath = VfsExUtil.getRelativeProjectPath(psiFile.getProject(), virtualFile); + if ("packages".equals(containingDirectory.getName())) { + return true; + } + + VirtualFile virtualDirectoryFile = containingDirectory.getVirtualFile(); + + String relativePath = VfsExUtil.getRelativeProjectPath(psiFile.getProject(), virtualDirectoryFile); return relativePath != null && relativePath.contains("config/packages/"); } }; diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/ConfigUtilTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/ConfigUtilTest.java index 6fe5d5eaf..a7450d514 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/ConfigUtilTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/ConfigUtilTest.java @@ -31,6 +31,7 @@ public void testGetTreeSignatures() { assertContainsElements(signatures.get("foobar_root"), "\\Foo\\Bar\\MyConfiguration"); assertContainsElements(signatures.get("foobar_root"), "\\Foo\\Bar\\MyNextConfiguration"); + assertContainsElements(signatures.get("foobar_root_11"), "\\Foo\\Bar\\MyNextConfiguration"); } /** diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/fixtures/ConfigUtilTest.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/fixtures/ConfigUtilTest.php index 6ff051585..373103d74 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/fixtures/ConfigUtilTest.php +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/config/utils/fixtures/ConfigUtilTest.php @@ -43,6 +43,7 @@ public function getConfigTreeBuilder() if(true) { foreach([] as $_) { (new TreeBuilder())->root('foobar_root'); + (new TreeBuilder('foobar_root_11')); } } }