package com.nvlad.yii2support.objectfactory; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElementVisitor; import com.jetbrains.php.lang.inspections.PhpInspection; import com.jetbrains.php.lang.psi.elements.ArrayCreationExpression; import com.jetbrains.php.lang.psi.elements.ArrayHashElement; import com.jetbrains.php.lang.psi.elements.PhpClass; import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor; import com.nvlad.yii2support.common.ClassUtils; import org.jetbrains.annotations.NotNull; /** * Created by oleg on 15.03.2017. */ public class ObjectFactoryMissedFieldInspection extends PhpInspection { @NotNull @Override public String getShortName() { return "MissedFieldInspection"; } @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder problemsHolder, boolean isOnTheFly) { return new PhpElementVisitor() { @Override public void visitPhpArrayCreationExpression(ArrayCreationExpression expression) { PsiDirectory dir = expression.getContainingFile().getContainingDirectory(); PhpClass phpClass = ObjectFactoryUtils.findClassByArrayCreation(expression, dir); if (phpClass != null) { for (ArrayHashElement elem: expression.getHashElements()) { String keyName = elem.getKey() != null ? elem.getKey().getText() : null; keyName = ClassUtils.removeQuotes(keyName); if ( keyName != null && ! keyName.equals("class") && ! keyName.startsWith("as ") && ! keyName.startsWith("on ") && ClassUtils.findWritableField(phpClass, keyName) == null) { final String descriptionTemplate = "Field '"+keyName+"' not exists in referenced class "+phpClass.getFQN(); problemsHolder.registerProblem(elem, descriptionTemplate); } } } super.visitPhpArrayCreationExpression(expression); } }; } }