Skip to content

Commit 11b6fa9

Browse files
authored
Merge pull request #400 from drpayyne/issue-217
Added QuickFix for missing GraphQL resolver
2 parents 5a6a0ea + f971b00 commit 11b6fa9

File tree

3 files changed

+90
-19
lines changed

3 files changed

+90
-19
lines changed

resources/magento2/inspection.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inspection.graphql.resolver.mustImplement=Class must implements any of the follo
55
inspection.graphql.resolver.notExist=Resolver class do not exist
66
inspection.graphql.resolver.fix.family=Implement Resolver interface
77
inspection.graphql.resolver.fix.title=Select one of the following interface
8+
inspection.graphql.schema.resolver.fix.family=Create GraphQL Resolver
89
inspection.plugin.error.nonPublicMethod=You can't declare a plugin for a not public method.
910
inspection.plugin.error.finalClass=You can't declare a plugin for a final class.
1011
inspection.plugin.error.finalMethod=You can't declare a plugin for a final method.

src/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspection.java

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.intellij.lang.jsgraphql.psi.GraphQLVisitor;
1313
import com.jetbrains.php.lang.psi.elements.PhpClass;
1414
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
15+
import com.magento.idea.magento2plugin.inspections.graphqls.fix.CreateResolverClassQuickFix;
1516
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
1617
import com.magento.idea.magento2plugin.util.magento.graphql.GraphQlUtil;
1718
import org.jetbrains.annotations.NotNull;
@@ -22,32 +23,39 @@ public class SchemaResolverInspection extends LocalInspectionTool {
2223

2324
@NotNull
2425
@Override
25-
public GraphQLVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
26+
public GraphQLVisitor buildVisitor(
27+
@NotNull final ProblemsHolder holder,
28+
final boolean isOnTheFly
29+
) {
2630
return new GraphQLVisitor() {
2731
@Override
28-
public void visitValue(@NotNull GraphQLValue element) {
29-
String getVisitedElementValue = element.getText();
32+
public void visitValue(@NotNull final GraphQLValue element) {
33+
final String getVisitedElementValue = element.getText();
3034
if (getVisitedElementValue == null) {
3135
return;
3236
}
3337

34-
String resolverFQN = GraphQlUtil.resolverStringToPhpFQN(getVisitedElementValue);
35-
GetPhpClassByFQN getPhpClassByFQN = GetPhpClassByFQN.getInstance(holder.getProject());
36-
PhpClass resolverClass = getPhpClassByFQN.execute(resolverFQN);
38+
final String resolverFQN
39+
= GraphQlUtil.resolverStringToPhpFQN(getVisitedElementValue);
40+
final GetPhpClassByFQN getPhpClassByFQN
41+
= GetPhpClassByFQN.getInstance(holder.getProject());
42+
final PhpClass resolverClass = getPhpClassByFQN.execute(resolverFQN);
3743
if (resolverClass == null) {
38-
holder.registerProblem(element,
39-
inspectionBundle.message(
40-
"inspection.graphql.resolver.notExist"
41-
),
42-
ProblemHighlightType.ERROR);
43-
return;
44-
}
45-
if (!GraphQlUtil.isResolver(resolverClass)) {
46-
holder.registerProblem(element,
47-
inspectionBundle.message(
48-
"inspection.graphql.resolver.mustImplement"
49-
),
50-
ProblemHighlightType.ERROR);
44+
holder.registerProblem(
45+
element,
46+
inspectionBundle.message(
47+
"inspection.graphql.resolver.notExist"
48+
),
49+
ProblemHighlightType.ERROR,
50+
new CreateResolverClassQuickFix());
51+
} else if (!GraphQlUtil.isResolver(resolverClass)) {
52+
holder.registerProblem(
53+
element,
54+
inspectionBundle.message(
55+
"inspection.graphql.resolver.mustImplement"
56+
),
57+
ProblemHighlightType.ERROR
58+
);
5159
}
5260
}
5361
};
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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.fix;
7+
8+
import com.google.common.base.Strings;
9+
import com.intellij.codeInspection.LocalQuickFix;
10+
import com.intellij.codeInspection.ProblemDescriptor;
11+
import com.intellij.openapi.project.Project;
12+
import com.intellij.openapi.util.text.StringUtil;
13+
import com.magento.idea.magento2plugin.actions.generation.NewGraphQlResolverAction;
14+
import com.magento.idea.magento2plugin.actions.generation.data.GraphQlResolverFileData;
15+
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleGraphQlResolverClassGenerator;
16+
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
17+
import java.util.ArrayList;
18+
import java.util.Arrays;
19+
import java.util.List;
20+
import org.jetbrains.annotations.Nls;
21+
import org.jetbrains.annotations.NotNull;
22+
23+
public class CreateResolverClassQuickFix implements LocalQuickFix {
24+
@Override
25+
public @Nls(capitalization = Nls.Capitalization.Sentence) @NotNull String getFamilyName() {
26+
return new InspectionBundle().message(
27+
"inspection.graphql.schema.resolver.fix.family"
28+
);
29+
}
30+
31+
@Override
32+
public void applyFix(
33+
@NotNull final Project project,
34+
@NotNull final ProblemDescriptor descriptor
35+
) {
36+
final String resolverFqn = StringUtil.unquoteString(descriptor.getPsiElement().getText())
37+
.replace("\\\\", "\\");
38+
final List<String> fqnPartsList
39+
= new ArrayList<>(Arrays.asList(resolverFqn.split("\\\\")));
40+
41+
fqnPartsList.removeIf(Strings::isNullOrEmpty);
42+
43+
final int endIndex = fqnPartsList.size() - 1;
44+
final String moduleName = String.join("_", fqnPartsList.subList(0, 2));
45+
final String resolverName = fqnPartsList.get(endIndex);
46+
final String directory = fqnPartsList.get(2);
47+
final String namespace = String.join("\\", fqnPartsList.subList(0, endIndex));
48+
49+
final GraphQlResolverFileData graphQlResolverFileData = new GraphQlResolverFileData(
50+
directory,
51+
resolverName,
52+
moduleName,
53+
resolverFqn,
54+
namespace
55+
);
56+
57+
final ModuleGraphQlResolverClassGenerator generator
58+
= new ModuleGraphQlResolverClassGenerator(graphQlResolverFileData, project);
59+
60+
generator.generate(NewGraphQlResolverAction.ACTION_NAME, true);
61+
}
62+
}

0 commit comments

Comments
 (0)