Search in sources :

Example 1 with Method

use of com.jetbrains.php.lang.psi.elements.Method in project phpinspectionsea by kalessil.

the class ClassMethodNameMatchesFieldNameInspector method buildVisitor.

@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
    return new BasePhpElementVisitor() {

        @Override
        public void visitPhpMethod(@NotNull Method method) {
            final PhpClass clazz = method.getContainingClass();
            if (clazz != null && !clazz.isInterface()) {
                final Field field = OpenapiResolveUtil.resolveField(clazz, method.getName());
                if (field != null) {
                    final PsiElement nameNode = NamedElementUtil.getNameIdentifier(method);
                    final PhpType resolvedType = OpenapiResolveUtil.resolveType(field, holder.getProject());
                    if (resolvedType != null && nameNode != null) {
                        final PhpType knownType = resolvedType.filterUnknown();
                        if (knownType.isEmpty()) {
                            holder.registerProblem(nameNode, messageFieldType);
                        } else {
                            final boolean isCallable = knownType.getTypes().stream().anyMatch(t -> Types.getType(t).equals(Types.strCallable));
                            if (isCallable) {
                                holder.registerProblem(nameNode, messageMatches);
                            }
                        }
                    }
                }
            }
        }
    };
}
Also used : BasePhpElementVisitor(com.kalessil.phpStorm.phpInspectionsEA.openApi.BasePhpElementVisitor) Field(com.jetbrains.php.lang.psi.elements.Field) PhpClass(com.jetbrains.php.lang.psi.elements.PhpClass) Method(com.jetbrains.php.lang.psi.elements.Method) NotNull(org.jetbrains.annotations.NotNull) PsiElement(com.intellij.psi.PsiElement) PhpType(com.jetbrains.php.lang.psi.resolve.types.PhpType) NotNull(org.jetbrains.annotations.NotNull)

Example 2 with Method

use of com.jetbrains.php.lang.psi.elements.Method in project phpinspectionsea by kalessil.

the class DeprecatedConstructorStyleInspector method buildVisitor.

@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
    return new BasePhpElementVisitor() {

        public void visitPhpMethod(Method method) {
            final PhpClass clazz = method.getContainingClass();
            final PsiElement nameNode = NamedElementUtil.getNameIdentifier(method);
            if (null == clazz || null == nameNode || clazz.isTrait() || clazz.isInterface()) {
                return;
            }
            final String className = clazz.getName();
            if (className.equals(method.getName()) && null == clazz.findOwnMethodByName("__construct")) {
                final String message = messagePattern.replace("%s%", className);
                holder.registerProblem(nameNode, message, ProblemHighlightType.LIKE_DEPRECATED, new TheLocalFix());
            }
        }
    };
}
Also used : BasePhpElementVisitor(com.kalessil.phpStorm.phpInspectionsEA.openApi.BasePhpElementVisitor) PhpClass(com.jetbrains.php.lang.psi.elements.PhpClass) Method(com.jetbrains.php.lang.psi.elements.Method) LeafPsiElement(com.intellij.psi.impl.source.tree.LeafPsiElement) PsiElement(com.intellij.psi.PsiElement) NotNull(org.jetbrains.annotations.NotNull)

Example 3 with Method

use of com.jetbrains.php.lang.psi.elements.Method in project phpinspectionsea by kalessil.

the class OverridingDeprecatedMethodInspector method buildVisitor.

@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
    return new BasePhpElementVisitor() {

        public void visitPhpMethod(Method method) {
            /* do not process un-reportable classes and interfaces - we are searching real tech. debt here */
            final PhpClass clazz = method.getContainingClass();
            final PsiElement methodName = NamedElementUtil.getNameIdentifier(method);
            if (null == methodName || null == clazz) {
                return;
            }
            final String searchMethodName = method.getName();
            /* search for deprecated parent methods */
            final PhpClass parent = OpenapiResolveUtil.resolveSuperClass(clazz);
            final Method parentMethod = null == parent ? null : OpenapiResolveUtil.resolveMethod(parent, searchMethodName);
            if (null != parentMethod) {
                if (!method.isDeprecated() && parentMethod.isDeprecated()) {
                    final String message = patternNeedsDeprecation.replace("%m%", searchMethodName);
                    holder.registerProblem(methodName, message, ProblemHighlightType.LIKE_DEPRECATED);
                    return;
                }
                if (method.isDeprecated() && !parentMethod.isDeprecated()) {
                    final String message = patternDeprecateParent.replace("%m%", searchMethodName);
                    holder.registerProblem(methodName, message, ProblemHighlightType.WEAK_WARNING);
                    return;
                }
            }
            /* search for deprecated interface methods */
            if (!method.isDeprecated()) {
                for (final PhpClass iface : OpenapiResolveUtil.resolveImplementedInterfaces(clazz)) {
                    final Method ifaceMethod = OpenapiResolveUtil.resolveMethod(iface, searchMethodName);
                    if (ifaceMethod != null && ifaceMethod.isDeprecated()) {
                        final String message = patternNeedsDeprecation.replace("%m%", searchMethodName);
                        holder.registerProblem(methodName, message, ProblemHighlightType.LIKE_DEPRECATED);
                        return;
                    }
                }
            }
        }
    };
}
Also used : BasePhpElementVisitor(com.kalessil.phpStorm.phpInspectionsEA.openApi.BasePhpElementVisitor) PhpClass(com.jetbrains.php.lang.psi.elements.PhpClass) Method(com.jetbrains.php.lang.psi.elements.Method) PsiElement(com.intellij.psi.PsiElement) NotNull(org.jetbrains.annotations.NotNull)

Example 4 with Method

use of com.jetbrains.php.lang.psi.elements.Method in project phpinspectionsea by kalessil.

the class MagicMethodsValidityInspector method buildVisitor.

@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly) {
    return new BasePhpElementVisitor() {

        @Override
        public void visitPhpMethod(@NotNull Method method) {
            final PhpClass clazz = method.getContainingClass();
            final String methodName = method.getName();
            final PsiElement nameNode = NamedElementUtil.getNameIdentifier(method);
            if (clazz == null || nameNode == null || !methodName.startsWith("_") || method.isAbstract()) {
                return;
            }
            switch(methodName) {
                case "__construct":
                    CanNotBeStaticStrategy.apply(method, holder);
                    CanNotReturnTypeStrategy.apply(method, holder);
                    if (!this.isTestContext(clazz)) {
                        NormallyCallsParentMethodStrategy.apply(method, holder);
                    }
                    break;
                case "__destruct":
                case "__clone":
                    CanNotBeStaticStrategy.apply(method, holder);
                    CanNotReturnTypeStrategy.apply(method, holder);
                    CanNotTakeArgumentsStrategy.apply(method, holder);
                    NormallyCallsParentMethodStrategy.apply(method, holder);
                    break;
                case "__get":
                case "__isset":
                case "__unset":
                    CanNotBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    TakesExactAmountOfArgumentsStrategy.apply(1, method, holder);
                    CanNotTakeArgumentsByReferenceStrategy.apply(method, holder);
                    HasAlsoMethodStrategy.apply(method, "__set", holder);
                    break;
                case "__set":
                case "__call":
                    CanNotBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    CanNotTakeArgumentsByReferenceStrategy.apply(method, holder);
                    TakesExactAmountOfArgumentsStrategy.apply(2, method, holder);
                    if (methodName.equals("__set")) {
                        HasAlsoMethodStrategy.apply(method, "__isset", holder);
                        HasAlsoMethodStrategy.apply(method, "__get", holder);
                    }
                    break;
                case "__callStatic":
                    MustBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    CanNotTakeArgumentsByReferenceStrategy.apply(method, holder);
                    TakesExactAmountOfArgumentsStrategy.apply(2, method, holder);
                    break;
                case "__toString":
                    CanNotBeStaticStrategy.apply(method, holder);
                    CanNotTakeArgumentsStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    MustNotThrowExceptionsStrategy.apply(method, holder);
                    MustReturnSpecifiedTypeStrategy.apply(stringType, method, holder);
                    break;
                case "__debugInfo":
                    CanNotBeStaticStrategy.apply(method, holder);
                    CanNotTakeArgumentsStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    MustReturnSpecifiedTypeStrategy.apply(arrayOrNullType, method, holder);
                    MinimalPhpVersionStrategy.apply(method, holder, PhpLanguageLevel.PHP560);
                    break;
                case "__set_state":
                    MustBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    TakesExactAmountOfArgumentsStrategy.apply(1, method, holder);
                    MustReturnSpecifiedTypeStrategy.apply((new PhpType()).add(clazz.getFQN()), method, holder);
                    break;
                case "__invoke":
                    CanNotBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    break;
                case "__wakeup":
                    CanNotBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    CanNotTakeArgumentsStrategy.apply(method, holder);
                    CanNotReturnTypeStrategy.apply(method, holder);
                    break;
                case "__sleep":
                    CanNotBeStaticStrategy.apply(method, holder);
                    MustBePublicStrategy.apply(method, holder);
                    CanNotTakeArgumentsStrategy.apply(method, holder);
                    MustReturnSpecifiedTypeStrategy.apply(arrayType, method, holder);
                    break;
                case "__autoload":
                    holder.registerProblem(nameNode, messageUseSplAutoloading, ProblemHighlightType.LIKE_DEPRECATED);
                    TakesExactAmountOfArgumentsStrategy.apply(1, method, holder);
                    break;
                default:
                    if (methodName.startsWith("__") && !knownNonMagic.contains(methodName)) {
                        holder.registerProblem(nameNode, messageNotMagic);
                    } else {
                        MissingUnderscoreStrategy.apply(method, holder);
                    }
                    break;
            }
        }
    };
}
Also used : BasePhpElementVisitor(com.kalessil.phpStorm.phpInspectionsEA.openApi.BasePhpElementVisitor) PhpClass(com.jetbrains.php.lang.psi.elements.PhpClass) Method(com.jetbrains.php.lang.psi.elements.Method) NotNull(org.jetbrains.annotations.NotNull) PsiElement(com.intellij.psi.PsiElement) PhpType(com.jetbrains.php.lang.psi.resolve.types.PhpType) NotNull(org.jetbrains.annotations.NotNull)

Example 5 with Method

use of com.jetbrains.php.lang.psi.elements.Method in project phpinspectionsea by kalessil.

the class MethodIdentityUtil method isReferencingMethod.

public static boolean isReferencingMethod(@Nullable MethodReference reference, @NotNull String classFqn, @NotNull String methodName) {
    boolean result = false;
    final String referenceName = (null == reference ? null : reference.getName());
    if (referenceName != null && referenceName.equals(methodName)) {
        final PsiElement resolved = OpenapiResolveUtil.resolveReference(reference);
        if (resolved instanceof Method) {
            final Method method = (Method) resolved;
            result = method.getFQN().equals(classFqn + "::" + methodName);
            if (!result) {
                final PhpClass clazz = method.getContainingClass();
                if (clazz != null && !clazz.isTrait()) {
                    final Set<PhpClass> parents = InterfacesExtractUtil.getCrawlInheritanceTree(clazz, true);
                    for (final PhpClass parent : parents) {
                        if (parent.getFQN().equals(classFqn)) {
                            result = true;
                            break;
                        }
                    }
                    parents.clear();
                }
            }
        }
    }
    return result;
}
Also used : PhpClass(com.jetbrains.php.lang.psi.elements.PhpClass) Method(com.jetbrains.php.lang.psi.elements.Method) PsiElement(com.intellij.psi.PsiElement)

Aggregations

Method (com.jetbrains.php.lang.psi.elements.Method)18 PsiElement (com.intellij.psi.PsiElement)14 PhpClass (com.jetbrains.php.lang.psi.elements.PhpClass)12 NotNull (org.jetbrains.annotations.NotNull)11 BasePhpElementVisitor (com.kalessil.phpStorm.phpInspectionsEA.openApi.BasePhpElementVisitor)9 LeafPsiElement (com.intellij.psi.impl.source.tree.LeafPsiElement)3 Field (com.jetbrains.php.lang.psi.elements.Field)3 PhpType (com.jetbrains.php.lang.psi.resolve.types.PhpType)3 ArrayList (java.util.ArrayList)3 PsiWhiteSpace (com.intellij.psi.PsiWhiteSpace)2 PhpDocComment (com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment)2 Function (com.jetbrains.php.lang.psi.elements.Function)2 Parameter (com.jetbrains.php.lang.psi.elements.Parameter)2 PhpModifierList (com.jetbrains.php.lang.psi.elements.PhpModifierList)2 LocalQuickFix (com.intellij.codeInspection.LocalQuickFix)1 ProblemDescriptor (com.intellij.codeInspection.ProblemDescriptor)1 ProblemHighlightType (com.intellij.codeInspection.ProblemHighlightType)1 ProblemsHolder (com.intellij.codeInspection.ProblemsHolder)1 Result (com.intellij.openapi.application.Result)1 WriteCommandAction (com.intellij.openapi.command.WriteCommandAction)1