package fr.adrienbrault.idea.symfony2plugin.doctrine.metadata;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.patterns.PsiElementPattern;
import com.intellij.patterns.XmlAttributeValuePattern;
import com.intellij.patterns.XmlPatterns;
import com.intellij.psi.PsiElement;
import org.intellij.lang.annotations.RegExp;
import org.jetbrains.yaml.YAMLTokenTypes;
import org.jetbrains.yaml.psi.YAMLCompoundValue;
import org.jetbrains.yaml.psi.YAMLKeyValue;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class DoctrineMetadataPattern {
@RegExp
public static final String DOCTRINE_MAPPING = "doctrine-[\\w+-]*-*mapping";
/**
* <doctrine-mapping|doctrine-*-mapping>
* <entity name="Class\Name"/>
* </doctrine-mapping>
*
* <doctrine-mapping|doctrine-*-mapping>
* <document name="Class\Name"/>
* </doctrine-mapping>
*/
public static XmlAttributeValuePattern getXmlModelClass() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("name")
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().oneOf("document", "entity", "embedded-document", "embedded"))
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
);
}
public static XmlAttributeValuePattern getEmbeddableNameClassPattern() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("name")
.withParent(XmlPatterns
.xmlTag().withName("embeddable")
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
);
}
/**
* <doctrine-mapping|doctrine-*-mapping>
* <document repository-class="Class\Name"/>
* <entity repository-class="Class\Name"/>
* </doctrine-mapping>
*/
public static XmlAttributeValuePattern getXmlRepositoryClass() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("repository-class")
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().oneOf("document", "entity"))
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
);
}
/**
* <reference-one target-document="Foo"/>
* <reference-many target-document="Foo"/>
* <embed-many target-document="Foo"/>
* <embed-one target-document="Foo"/>
*/
public static XmlAttributeValuePattern getXmlTargetDocumentClass() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("target-document")
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().oneOf("reference-one", "reference-many", "embed-many", "embed-one"))
.withParent(
XmlPatterns.xmlTag().withName(XmlPatterns.string().oneOf("embedded-document", "embedded", "document")).withParent(
XmlPatterns.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
)
);
}
/**
* <one-to-one target-entity="Foo">
* <one-to-many target-entity="Foo">
* <many-to-one target-entity="Foo">
* <many-to-many target-entity="Foo">
*/
public static XmlAttributeValuePattern getXmlTargetEntityClass() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("target-entity")
.withParent(XmlPatterns
.xmlTag().withName(PlatformPatterns.string().oneOf("one-to-one", "one-to-many", "many-to-one", "many-to-many"))
.withParent(
XmlPatterns.xmlTag().withName("entity").withParent(
XmlPatterns.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
)
);
}
/**
* <doctrine-mapping|doctrine-*-mapping>
* <field type="Class\Name"/>
* </doctrine-mapping>
*/
public static XmlAttributeValuePattern getFieldType() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("type")
.withParent(XmlPatterns
.xmlTag().withName("field")
.withParent(
XmlPatterns.xmlTag().withName(XmlPatterns.string().oneOf("entity", "document", "embedded-document", "embedded")).withParent(
XmlPatterns.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
)
);
}
/**
* <doctrine-mapping|doctrine-*-mapping>
* <document><field name="Foo"/></document>
* <document><id name="Foo"/></document>
* </doctrine-mapping>
*/
public static XmlAttributeValuePattern getFieldName() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("name")
.withParent(XmlPatterns
.xmlTag().withName(XmlPatterns.string().oneOf("field", "id"))
.withParent(
XmlPatterns.xmlTag().withName(XmlPatterns.string().oneOf("entity", "document", "embedded-document", "embedded")).withParent(
XmlPatterns.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
)
);
}
/**
* <doctrine-mapping|doctrine-*-mapping>
* <document><embed-one field="Foo"/></document>
* </doctrine-mapping>
*/
public static XmlAttributeValuePattern getFieldNameRelation() {
return XmlPatterns
.xmlAttributeValue()
.withParent(XmlPatterns
.xmlAttribute("field")
.withParent(XmlPatterns
.xmlTag().withName(XmlPatterns.string().oneOf("embed-one", "embed-many", "reference-one", "reference-many", "one-to-one", "one-to-many", "many-to-one", "many-to-many"))
.withParent(
XmlPatterns.xmlTag().withName(XmlPatterns.string().oneOf("entity", "document", "embedded-document", "embedded")).withParent(
XmlPatterns.xmlTag().withName(PlatformPatterns.string().matches(DOCTRINE_MAPPING))
)
)
)
);
}
/**
* fields:
* i<caret>d: []
*
* embedOne:
* add<caret>ress: []
*/
public static PsiElementPattern.Capture<PsiElement> getYamlFieldName() {
return PlatformPatterns.psiElement(YAMLTokenTypes.SCALAR_KEY)
.withParent(
PlatformPatterns.psiElement(YAMLKeyValue.class).withParent(
PlatformPatterns.psiElement(YAMLCompoundValue.class).withParent(
PlatformPatterns.psiElement(YAMLKeyValue.class).withName(PlatformPatterns.string().oneOf(
"id", "fields", "embedOne", "embedMany", "referenceOne", "referenceMany", "oneToOne", "oneToMany", "manyToOne", "manyToMany"
))
)
)
);
}
}