Skip to content

Commit d4803e9

Browse files
[WIP]Graphql resolver inspection added
1 parent cd4a9f9 commit d4803e9

File tree

6 files changed

+96
-3
lines changed

6 files changed

+96
-3
lines changed

resources/META-INF/withJsGraphQl.xml

+13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
<!--
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
-->
7+
18
<idea-plugin>
29
<extensions defaultExtensionNs="com.intellij">
310
<fileBasedIndex implementation="com.magento.idea.magento2plugin.stubs.indexes.graphql.GraphQlResolverIndex" />
@@ -9,5 +16,11 @@
916
enabledByDefault="true"
1017
level="ERROR"
1118
implementationClass="com.magento.idea.magento2plugin.inspections.php.GraphQlResolverInspection"/>
19+
<localInspection language="GraphQL" groupPath="GraphQL"
20+
shortName="SchemaResolverInspection" displayName="Schema Resolver must implements ResolverInterface"
21+
groupName="Magento 2"
22+
enabledByDefault="true"
23+
level="ERROR"
24+
implementationClass="com.magento.idea.magento2plugin.inspections.graphqls.SchemaResolverInspection"/>
1225
</extensions>
1326
</idea-plugin>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!--
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
-->
7+
<html>
8+
<body>
9+
<p>
10+
This inspection detects the invalid resolver interface in schema.graphqls files
11+
</p>
12+
</body>
13+
</html>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright © Magento, Inc. All rights reserved.
3+
* See COPYING.txt for license details.
4+
*/
5+
6+
package com.magento.idea.magento2plugin.inspections.graphqls;
7+
8+
import com.intellij.codeInspection.LocalInspectionTool;
9+
import com.intellij.codeInspection.ProblemHighlightType;
10+
import com.intellij.codeInspection.ProblemsHolder;
11+
import com.intellij.lang.jsgraphql.psi.GraphQLArgument;
12+
import com.intellij.lang.jsgraphql.psi.GraphQLArguments;
13+
import com.intellij.psi.PsiElement;
14+
import com.intellij.psi.PsiElementVisitor;
15+
import com.jetbrains.php.lang.psi.elements.PhpClass;
16+
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
17+
import com.magento.idea.magento2plugin.util.magento.graphql.GraphQlUtil;
18+
import org.jetbrains.annotations.NotNull;
19+
20+
public class SchemaResolverInspection extends LocalInspectionTool {
21+
22+
public static final String GraphQlResolverProblemDescription = "Class must implements \\Magento\\Framework\\GraphQl\\Query\\ResolverInterface";
23+
24+
@NotNull
25+
@Override
26+
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
27+
return new PsiElementVisitor() {
28+
@Override
29+
public void visitElement(PsiElement element) {
30+
PsiElement[] directiveChildren = element.getChildren();
31+
32+
for (PsiElement directiveChild : directiveChildren) {
33+
if (!(directiveChild instanceof GraphQLArguments)) {
34+
continue;
35+
}
36+
37+
PsiElement[] argumentsChildren = directiveChild.getChildren();
38+
for (PsiElement argumentsChild : argumentsChildren) {
39+
if (!(argumentsChild instanceof GraphQLArgument)) {
40+
continue;
41+
}
42+
43+
PsiElement argumentStringValue = GraphQlUtil.fetchResolverQuotedStringFromArgument(argumentsChild);
44+
if (argumentStringValue == null) continue;
45+
46+
String resolverFQN = argumentStringValue.getText();
47+
if (resolverFQN == null) {
48+
continue;
49+
}
50+
51+
resolverFQN = GraphQlUtil.resolverStringToPhpFQN(resolverFQN);
52+
GetPhpClassByFQN getPhpClassByFQN = GetPhpClassByFQN.getInstance(holder.getProject());
53+
PhpClass resolverClass = getPhpClassByFQN.execute(resolverFQN);
54+
if (resolverClass == null) {
55+
continue;
56+
}
57+
if (GraphQlUtil.isNotResolver(resolverClass)) {
58+
holder.registerProblem(argumentStringValue,
59+
GraphQlResolverProblemDescription,
60+
ProblemHighlightType.ERROR);
61+
}
62+
}
63+
}
64+
}
65+
};
66+
}
67+
}

src/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspection.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void visitPhpClass(PhpClass resolverClass) {
3232
GraphQlUsagesCollector collector = new GraphQlUsagesCollector();
3333
results = collector.getGraphQLUsages(resolverClass);
3434
if (results.size() > 0 ) {
35-
if (GraphQlUtil.isResolver(resolverClass)) {
35+
if (GraphQlUtil.isNotResolver(resolverClass)) {
3636
PsiElement currentClassNameIdentifier = resolverClass.getNameIdentifier();
3737
assert currentClassNameIdentifier != null;
3838
problemsHolder.registerProblem(currentClassNameIdentifier,

src/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLineMarkerProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void collectSlowLineMarkers(@NotNull List<PsiElement> psiElements, @NotNu
3939
if (psiElement instanceof PhpClass) {
4040
List<? extends PsiElement> results;
4141

42-
if (GraphQlUtil.isResolver((PhpClass) psiElement)) {
42+
if (GraphQlUtil.isNotResolver((PhpClass) psiElement)) {
4343
return;
4444
}
4545
GraphQlUsagesCollector collector = new GraphQlUsagesCollector();

src/com/magento/idea/magento2plugin/util/magento/graphql/GraphQlUtil.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static GraphQLStringValue fetchResolverQuotedStringFromArgument(PsiElemen
4444
return argumentStringValue;
4545
}
4646

47-
public static boolean isResolver(PhpClass psiElement) {
47+
public static boolean isNotResolver(PhpClass psiElement) {
4848
PhpClass[] implementedInterfaces = psiElement.getImplementedInterfaces();
4949
for (PhpClass implementedInterface: implementedInterfaces) {
5050
if (!implementedInterface.getFQN().equals(GraphQlResolver.RESOLVER_INTERFACE)) {

0 commit comments

Comments
 (0)