Skip to content

Commit 2ac1de8

Browse files
committed
add doctrine metadata support for target-entity and target-document #319
1 parent 3d657a5 commit 2ac1de8

File tree

3 files changed

+88
-3
lines changed

3 files changed

+88
-3
lines changed

src/fr/adrienbrault/idea/symfony2plugin/doctrine/metadata/DoctrineMetadataPattern.java

+46-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
import com.intellij.patterns.PlatformPatterns;
44
import com.intellij.patterns.XmlAttributeValuePattern;
55
import com.intellij.patterns.XmlPatterns;
6+
import org.intellij.lang.annotations.RegExp;
67

78
/**
89
* @author Daniel Espendiller <daniel@espendiller.net>
910
*/
1011
public class DoctrineMetadataPattern {
1112

13+
@RegExp
14+
private static final String DOCTRINE_MAPPING = "doctrine-[\\w+-]*-*mapping";
15+
1216
/**
1317
* <doctrine-mapping|doctrine-*-mapping>
1418
* <entity name="Class\Name"/>
@@ -26,7 +30,7 @@ public static XmlAttributeValuePattern getXmlModelClass() {
2630
.withParent(XmlPatterns
2731
.xmlTag().withName(PlatformPatterns.string().oneOf("document", "entity"))
2832
.withParent(XmlPatterns
29-
.xmlTag().withName(PlatformPatterns.string().matches("doctrine-[\\w+-]*-*mapping"))
33+
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
3034
)
3135
)
3236
);
@@ -46,7 +50,47 @@ public static XmlAttributeValuePattern getXmlRepositoryClass() {
4650
.withParent(XmlPatterns
4751
.xmlTag().withName(PlatformPatterns.string().oneOf("document", "entity"))
4852
.withParent(XmlPatterns
49-
.xmlTag().withName(PlatformPatterns.string().matches("doctrine-[\\w+-]*-*mapping"))
53+
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
54+
)
55+
)
56+
);
57+
}
58+
59+
/**
60+
* <reference-one target-document="Foo"/>
61+
* <reference-many target-document="Foo"/>
62+
* <embed-many target-document="Foo"/>
63+
* <embed-one target-document="Foo"/>
64+
*/
65+
public static XmlAttributeValuePattern getXmlTargetDocumentClass() {
66+
return XmlPatterns
67+
.xmlAttributeValue()
68+
.withParent(XmlPatterns
69+
.xmlAttribute("target-document")
70+
.withParent(XmlPatterns
71+
.xmlTag().withName(PlatformPatterns.string().oneOf("reference-one", "reference-many", "embed-many", "embed-one"))
72+
.withParent(XmlPatterns
73+
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
74+
)
75+
)
76+
);
77+
}
78+
79+
/**
80+
* <one-to-one target-entity="Foo">
81+
* <one-to-many target-entity="Foo">
82+
* <many-to-one target-entity="Foo">
83+
* <many-to-many target-entity="Foo">
84+
*/
85+
public static XmlAttributeValuePattern getXmlTargetEntityClass() {
86+
return XmlPatterns
87+
.xmlAttributeValue()
88+
.withParent(XmlPatterns
89+
.xmlAttribute("target-entity")
90+
.withParent(XmlPatterns
91+
.xmlTag().withName(PlatformPatterns.string().oneOf("one-to-one", "one-to-many", "many-to-one", "many-to-many"))
92+
.withParent(XmlPatterns
93+
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
5094
)
5195
)
5296
);

src/fr/adrienbrault/idea/symfony2plugin/doctrine/metadata/DoctrineXmlGotoCompletionRegistrar.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@ public void register(GotoCompletionRegistrarParameter registrar) {
2929

3030
registrar.register(XmlPatterns.psiElement().withParent(PlatformPatterns.or(
3131
DoctrineMetadataPattern.getXmlModelClass(),
32-
DoctrineMetadataPattern.getXmlRepositoryClass()
32+
DoctrineMetadataPattern.getXmlRepositoryClass(),
33+
DoctrineMetadataPattern.getXmlTargetDocumentClass(),
34+
DoctrineMetadataPattern.getXmlTargetEntityClass()
3335
)), new GotoCompletionContributor() {
3436
@Nullable
3537
@Override

tests/fr/adrienbrault/idea/symfony2plugin/tests/doctrine/metadata/DoctrineXmlGotoCompletionRegistrarTest.java

+39
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.intellij.ide.highlighter.XmlFileType;
44
import com.intellij.patterns.PlatformPatterns;
55
import com.jetbrains.php.lang.psi.elements.PhpClass;
6+
import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.DoctrineMetadataPattern;
67
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
78

89
import java.io.File;
@@ -65,4 +66,42 @@ public void testDocumentRepositoryClassNavigation() {
6566
PlatformPatterns.psiElement(PhpClass.class)
6667
);
6768
}
69+
70+
/**
71+
* @see DoctrineMetadataPattern#getXmlTargetDocumentClass()
72+
*/
73+
public void testTargetDocumentNavigation() {
74+
for(String s : new String[] {"reference-one", "reference-many", "embed-many", "embed-one"}) {
75+
assertNavigationMatch(
76+
XmlFileType.INSTANCE,
77+
"<doctrine-mapping><" + s + " target-document=\"Foo\\Bar\\Ns<caret>\\BarRepo\"/></doctrine-mapping>",
78+
PlatformPatterns.psiElement(PhpClass.class)
79+
);
80+
81+
assertNavigationMatch(
82+
XmlFileType.INSTANCE,
83+
"<doctrine-foo-mapping><" + s + " target-document=\"Foo\\Bar\\Ns<caret>\\BarRepo\"/></doctrine-foo-mapping>",
84+
PlatformPatterns.psiElement(PhpClass.class)
85+
);
86+
}
87+
}
88+
89+
/**
90+
* @see DoctrineMetadataPattern#getXmlTargetEntityClass()
91+
*/
92+
public void testTargetEntityNavigation() {
93+
for(String s : new String[] {"one-to-one", "one-to-many", "many-to-one", "many-to-many"}) {
94+
assertNavigationMatch(
95+
XmlFileType.INSTANCE,
96+
"<doctrine-mapping><" + s + " target-entity=\"Foo\\Bar\\Ns<caret>\\BarRepo\"/></doctrine-mapping>",
97+
PlatformPatterns.psiElement(PhpClass.class)
98+
);
99+
100+
assertNavigationMatch(
101+
XmlFileType.INSTANCE,
102+
"<doctrine-foo-mapping><" + s + " target-entity=\"Foo\\Bar\\Ns<caret>\\BarRepo\"/></doctrine-mapping>",
103+
PlatformPatterns.psiElement(PhpClass.class)
104+
);
105+
}
106+
}
68107
}

0 commit comments

Comments
 (0)