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);
}
}
}
}
}
}
};
}
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());
}
}
};
}
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;
}
}
}
}
};
}
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;
}
}
};
}
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;
}
Aggregations