package fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.type.util;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import com.intellij.util.Processor;
import com.jetbrains.php.PhpIndex;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.dict.DoctrineManagerEnum;
import fr.adrienbrault.idea.symfony2plugin.doctrine.metadata.util.DoctrineMetadataUtil;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class DoctrineMetadataTypeUtil {
public static final String DBAL_TYPE = "Doctrine\\DBAL\\Types\\Type";
public static final String COUCHDB_TYPE = "Doctrine\\ODM\\CouchDB\\Types\\Type";
public static final String MONGODB_TYPE = "Doctrine\\ODM\\MongoDB\\Types\\Type";
@NotNull
public static Collection<String> getTypeClassesByScopeWithAllFallback(@NotNull PsiElement psiElement) {
DoctrineManagerEnum manager = DoctrineMetadataUtil.findManagerByScope(psiElement);
if(manager != null) {
return DoctrineMetadataTypeUtil.getTypeClassByManager(manager);
}
return getAllTypes();
}
@NotNull
private static Collection<String> getTypeClassByManager(@NotNull DoctrineManagerEnum managerEnum) {
if(managerEnum == DoctrineManagerEnum.ORM) {
return Collections.singleton(DBAL_TYPE);
} else if(managerEnum == DoctrineManagerEnum.COUCHDB) {
return Collections.singleton(COUCHDB_TYPE);
} else if(managerEnum == DoctrineManagerEnum.MONGODB) {
return Collections.singleton(MONGODB_TYPE);
} else if(managerEnum == DoctrineManagerEnum.ODM || managerEnum == DoctrineManagerEnum.DOCUMENT) {
return Arrays.asList(MONGODB_TYPE, COUCHDB_TYPE);
}
return Collections.emptyList();
}
@NotNull
private static Collection<String> getAllTypes() {
return Arrays.asList(
DBAL_TYPE,
COUCHDB_TYPE,
MONGODB_TYPE
);
}
public static void visitType(@NotNull Project project, @NotNull Collection<String> typeInterfaces, @NotNull Processor<Pair<PhpClass, String>> processor) {
for (String typeInterface : typeInterfaces) {
for (PhpClass phpClass : PhpIndex.getInstance(project).getAllSubclasses(typeInterface)) {
String name = PhpElementsUtil.getMethodReturnAsString(phpClass, "getName");
// non string value;
// Doctrine resolves also on class name
if(name == null) {
String className = phpClass.getName();
if(className.endsWith("Type")) {
name = className.substring(0, className.length() - 4).toLowerCase();
}
}
if(name == null) {
continue;
}
processor.process(Pair.create(phpClass, name));
}
}
}
}