diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/doctrine/DoctrineUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/doctrine/DoctrineUtil.java index bb22e0d20..a57253294 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/doctrine/DoctrineUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/doctrine/DoctrineUtil.java @@ -14,12 +14,10 @@ import com.jetbrains.php.lang.psi.PhpFile; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.elements.PhpPsiElement; -import com.jetbrains.php.lang.psi.stubs.indexes.expectedArguments.PhpExpectedFunctionArgument; -import com.jetbrains.php.lang.psi.stubs.indexes.expectedArguments.PhpExpectedFunctionClassConstantArgument; import de.espend.idea.php.annotation.util.AnnotationUtil; import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.visitor.AnnotationElementWalkingVisitor; import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.visitor.AttributeElementWalkingVisitor; -import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil; +import fr.adrienbrault.idea.symfony2plugin.util.PhpPsiAttributesUtil; import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils; import fr.adrienbrault.idea.symfony2plugin.util.yaml.YamlHelper; import org.apache.commons.lang.ArrayUtils; @@ -141,15 +139,7 @@ public static Collection> getClassRepositoryPair(@NotNull P // Attributes: // #[Entity(repositoryClass: UserRepository::class)] phpFile.acceptChildren(new AttributeElementWalkingVisitor(pair -> { - String repositoryClass = null; - - PhpExpectedFunctionArgument argument = PhpElementsUtil.findAttributeArgumentByName("repositoryClass", pair.getFirst()); - if (argument instanceof PhpExpectedFunctionClassConstantArgument) { - String repositoryClassRaw = ((PhpExpectedFunctionClassConstantArgument) argument).getClassFqn(); - if (StringUtils.isNotBlank(repositoryClassRaw)) { - repositoryClass = repositoryClassRaw; - } - } + String repositoryClass = PhpPsiAttributesUtil.getAttributeValueByNameAsString(pair.getFirst(), "repositoryClass"); pairs.add(Pair.create( StringUtils.stripStart(pair.getSecond().getFQN(), "\\"), diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java index 285928e93..d31864ef5 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/util/PhpPsiAttributesUtil.java @@ -180,29 +180,36 @@ private static PsiElementPattern.Capture getAttributeColonPattern(St @Nullable private static String resolveLocalValue(@NotNull PhpAttribute attribute, @NotNull ClassConstantReference nextSibling) { PhpExpression classReference = nextSibling.getClassReference(); - if (classReference != null) { + if (classReference instanceof ClassReference) { String name = classReference.getName(); if (name != null && (name.equals("self") || name.equals("static"))) { PsiElement phpAttributesList = attribute.getParent(); if (phpAttributesList instanceof PhpAttributesList) { PsiElement method = phpAttributesList.getParent(); - if (method instanceof Method) { - PsiElement phpClass = method.getParent(); - if (phpClass instanceof PhpClass) { - String fieldName = nextSibling.getName(); - Field ownFieldByName = ((PhpClass) phpClass).findOwnFieldByName(fieldName, true); - if (ownFieldByName != null) { - PsiElement defaultValue = ownFieldByName.getDefaultValue(); - if (defaultValue instanceof StringLiteralExpression) { - String contents = ((StringLiteralExpression) defaultValue).getContents(); - if (StringUtils.isNotBlank(contents)) { - return contents; - } + + PsiElement phpClass = method instanceof Method ? ((Method) method).getContainingClass() : method; + if (phpClass instanceof PhpClass) { + String fieldName = nextSibling.getName(); + Field ownFieldByName = ((PhpClass) phpClass).findOwnFieldByName(fieldName, true); + if (ownFieldByName != null) { + PsiElement defaultValue = ownFieldByName.getDefaultValue(); + if (defaultValue instanceof StringLiteralExpression) { + String contents = ((StringLiteralExpression) defaultValue).getContents(); + if (StringUtils.isNotBlank(contents)) { + return contents; } } } } } + } else { + String s = nextSibling.getText().toLowerCase(); + if (s.endsWith("::class")) { + String fqn = ((ClassReference) classReference).getFQN(); + if (StringUtils.isNotBlank(fqn)) { + return fqn; + } + } } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/DoctrineMetadataFileStubIndexTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/DoctrineMetadataFileStubIndexTest.java index e5d50bf82..abfc789b6 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/DoctrineMetadataFileStubIndexTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/DoctrineMetadataFileStubIndexTest.java @@ -148,6 +148,11 @@ public void testPhpOrmAnnotationMetadata() { assertIndexContainsKeyWithValue(DoctrineMetadataFileStubIndex.KEY, "Doctrine\\Orm\\Annotation", new IndexValueRepositoryClassEquals("Doctrine\\Orm\\Foo")); } + public void testPhpOrmAttributeMetadata() { + assertIndexContains(DoctrineMetadataFileStubIndex.KEY, "Doctrine\\Orm\\AttributeEntity"); + assertIndexContainsKeyWithValue(DoctrineMetadataFileStubIndex.KEY, "Doctrine\\Orm\\AttributeEntity", new IndexValueRepositoryClassEquals("Doctrine\\OrmRepository\\AttributeEntityRepository")); + } + /** * @see fr.adrienbrault.idea.symfony2plugin.doctrine.DoctrineUtil#getClassRepositoryPair */ diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/fixtures/doctrine.php b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/fixtures/doctrine.php index de04a7ffc..82a25056e 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/fixtures/doctrine.php +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/fixtures/doctrine.php @@ -19,12 +19,19 @@ class Document {}; namespace Doctrine\Orm { use Doctrine\ORM\Mapping AS ORM; + use Doctrine\OrmRepository\AttributeEntityRepository; /** * @ORM\Entity(repositoryClass="Foo") */ - class Annotation {}; + class Annotation {} + + #[ORM\Entity(repositoryClass: AttributeEntityRepository::class)] + class AttributeEntity {} +} +namespace Doctrine\OrmRepository { + class AttributeEntityRepository {}; } namespace Doctrine\Flow\Orm { diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/PhpPsiAttributesUtilTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/PhpPsiAttributesUtilTest.java new file mode 100644 index 000000000..fcd20def4 --- /dev/null +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/util/PhpPsiAttributesUtilTest.java @@ -0,0 +1,82 @@ +package fr.adrienbrault.idea.symfony2plugin.tests.util; + +import com.jetbrains.php.lang.psi.PhpPsiElementFactory; +import com.jetbrains.php.lang.psi.elements.PhpAttribute; +import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase; +import fr.adrienbrault.idea.symfony2plugin.util.PhpPsiAttributesUtil; + +/** + * @author Daniel Espendiller + */ +public class PhpPsiAttributesUtilTest extends SymfonyLightCodeInsightFixtureTestCase { + public void testGetAttributeValueByNameAsStringForDirectResolve() { + PhpAttribute phpAttribute1 = PhpPsiElementFactory.createFromText(getProject(), PhpAttribute.class, "