Skip to content

Commit 8cf8401

Browse files
Merge pull request #1192 from makzef/1135-resolver-class-generation-issues
1135: Fixed issues with incorrect generation of resolver class
2 parents 31e26e2 + 2ddeeb6 commit 8cf8401

File tree

5 files changed

+67
-14
lines changed

5 files changed

+67
-14
lines changed

CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0).
66

77
## 4.4.1
88

9+
### Fixed
10+
11+
- Fixed wrong director(y|ies) generation for GraphQL resolver class [#1192](https://github.com/magento/magento2-phpstorm-plugin/pull/1192)
12+
- Fixed IndexOutOfBoundsException: CreateResolverClassQuickFix.applyFix(CreateResolverClassQuickFix.java:43) [#1192](https://github.com/magento/magento2-phpstorm-plugin/pull/1192)
13+
914
## 4.4.0
1015

1116
### Added

resources/magento2/inspection.properties

+4-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ inspection.plugin.duplicateInSameFile=The plugin name already used in this file.
1515
inspection.plugin.duplicateInOtherPlaces=The plugin name "{0}" for targeted "{1}" class is already used in the module "{2}" ({3} scope). For more details see Inspection Description.
1616
inspection.plugin.disabledPluginDoesNotExist=This plugin does not exist to be disabled.
1717
inspection.graphql.resolver.mustImplement=Class must implements any of the following interfaces: \\Magento\\Framework\\GraphQl\\Query\\ResolverInterface, \\Magento\\Framework\\GraphQl\\Query\\Resolver\\BatchResolverInterface, \\Magento\\Framework\\GraphQl\\Query\\Resolver\\BatchServiceContractResolverInterface
18-
inspection.graphql.resolver.notExist=Resolver class do not exist
18+
inspection.graphql.resolver.notExist=The GraphQL resolver class do not exist
1919
inspection.graphql.resolver.fix.family=Implement Resolver interface
2020
inspection.graphql.resolver.fix.title=Select one of the following interface
2121
inspection.graphql.schema.resolver.fix.family=Create GraphQL Resolver
@@ -39,3 +39,6 @@ inspection.warning.class.does.not.exist=The class "{0}" does not exist
3939
inspection.warning.method.does.not.exist=The method "{0}" does not exist in the service class
4040
inspection.warning.method.should.have.public.access=The method "{0}" should have public access
4141
inspection.warning.method.should.have.public.access.fix=Change the method access
42+
inspection.warning.class.invalidFormat=The class "{0}" has invalid format
43+
inspection.error.graphqlResolverClass.tooShortFormat=The target GraphQL resolver class format is incorrect.\nThe fully qualified name "{0}" should contain at least 3 parts.
44+
inspection.error.graphqlResolverClass.tooShortFormatTitle=The GraphQL resolver class format is incorrect

src/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGenerator.java

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
2626
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
2727
import com.magento.idea.magento2plugin.magento.files.GraphQlResolverPhp;
28-
import com.magento.idea.magento2plugin.magento.packages.File;
2928
import com.magento.idea.magento2plugin.magento.packages.MagentoPhpClass;
3029
import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
3130
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
@@ -34,6 +33,7 @@
3433
import org.jetbrains.annotations.NotNull;
3534

3635
public class ModuleGraphQlResolverClassGenerator extends FileGenerator {
36+
3737
private final GraphQlResolverFileData graphQlResolverFileData;
3838
private final Project project;
3939
private final ValidatorBundle validatorBundle;
@@ -132,15 +132,15 @@ private PhpClass createGraphQlResolverClass(final String actionName) {
132132
if (parentDirectory == null) {
133133
return null;
134134
}
135-
final String[] graphQlResolverDirectories = graphQlResolverFileData
136-
.getGraphQlResolverDirectory().split(File.separator);
137-
for (final String graphQlResolverDirectory: graphQlResolverDirectories) {
138-
parentDirectory = directoryGenerator.findOrCreateSubdirectory(
135+
final String graphQlResolverDirectory = graphQlResolverFileData
136+
.getGraphQlResolverDirectory();
137+
138+
if (!graphQlResolverDirectory.isBlank()) {
139+
parentDirectory = directoryGenerator.findOrCreateSubdirectories(
139140
parentDirectory,
140141
graphQlResolverDirectory
141142
);
142143
}
143-
144144
final Properties attributes = getAttributes();
145145
final PsiFile graphQlResolverFile = fileFromTemplateGenerator.generate(
146146
GraphQlResolverPhp.getInstance(

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

+29-6
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,66 @@
88
import com.intellij.codeInspection.LocalInspectionTool;
99
import com.intellij.codeInspection.ProblemHighlightType;
1010
import com.intellij.codeInspection.ProblemsHolder;
11+
import com.intellij.lang.jsgraphql.psi.GraphQLNamedElement;
1112
import com.intellij.lang.jsgraphql.psi.GraphQLValue;
1213
import com.intellij.lang.jsgraphql.psi.GraphQLVisitor;
14+
import com.intellij.psi.PsiElement;
1315
import com.jetbrains.php.lang.psi.elements.PhpClass;
1416
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
1517
import com.magento.idea.magento2plugin.inspections.graphqls.fix.CreateResolverClassQuickFix;
18+
import com.magento.idea.magento2plugin.magento.files.GraphQlResolver;
1619
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
20+
import com.magento.idea.magento2plugin.util.RegExUtil;
1721
import com.magento.idea.magento2plugin.util.magento.graphql.GraphQlUtil;
1822
import org.jetbrains.annotations.NotNull;
1923

2024
public class SchemaResolverInspection extends LocalInspectionTool {
2125

2226
private final InspectionBundle inspectionBundle = new InspectionBundle();
2327

24-
@NotNull
2528
@Override
26-
public GraphQLVisitor buildVisitor(
27-
@NotNull final ProblemsHolder holder,
29+
public @NotNull GraphQLVisitor buildVisitor(
30+
final @NotNull ProblemsHolder holder,
2831
final boolean isOnTheFly
2932
) {
3033
return new GraphQLVisitor() {
3134
@Override
32-
public void visitValue(@NotNull final GraphQLValue element) {
35+
public void visitValue(final @NotNull GraphQLValue element) {
3336
final String getVisitedElementValue = element.getText();
34-
if (getVisitedElementValue == null) {
37+
final PsiElement parentElementValue = element.getParent();
38+
39+
if (getVisitedElementValue == null
40+
|| !(parentElementValue instanceof GraphQLNamedElement)) {
3541
return;
3642
}
43+
final String attributeName = ((GraphQLNamedElement) parentElementValue).getName();
3744

45+
if (!GraphQlResolver.CLASS_ARGUMENT.equals(attributeName)) {
46+
return;
47+
}
3848
final String resolverFQN
3949
= GraphQlUtil.resolverStringToPhpFQN(getVisitedElementValue);
50+
51+
if (!resolverFQN.matches(RegExUtil.PhpRegex.FQN)) {
52+
holder.registerProblem(
53+
element,
54+
inspectionBundle.message(
55+
"inspection.warning.class.invalidFormat",
56+
resolverFQN
57+
),
58+
ProblemHighlightType.WARNING
59+
);
60+
return;
61+
}
4062
final GetPhpClassByFQN getPhpClassByFQN
4163
= GetPhpClassByFQN.getInstance(holder.getProject());
4264
final PhpClass resolverClass = getPhpClassByFQN.execute(resolverFQN);
65+
4366
if (resolverClass == null) {
4467
holder.registerProblem(
4568
element,
4669
inspectionBundle.message(
47-
"inspection.graphql.resolver.notExist"
70+
"inspection.graphql.resolver.notExist"
4871
),
4972
ProblemHighlightType.ERROR,
5073
new CreateResolverClassQuickFix());

src/com/magento/idea/magento2plugin/inspections/graphqls/fix/CreateResolverClassQuickFix.java

+23-1
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,19 @@
1414
import com.magento.idea.magento2plugin.actions.generation.data.GraphQlResolverFileData;
1515
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleGraphQlResolverClassGenerator;
1616
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
17+
import com.magento.idea.magento2plugin.magento.packages.File;
1718
import java.util.ArrayList;
1819
import java.util.Arrays;
1920
import java.util.List;
21+
import javax.swing.JOptionPane;
2022
import org.jetbrains.annotations.NotNull;
2123

2224
public class CreateResolverClassQuickFix implements LocalQuickFix {
25+
26+
private static final int CLASSPATH_MIN_DEPTH = 3;
27+
28+
private final InspectionBundle inspectionBundle = new InspectionBundle();
29+
2330
@Override
2431
public @NotNull String getFamilyName() {
2532
return new InspectionBundle().message(
@@ -39,10 +46,25 @@ public void applyFix(
3946

4047
fqnPartsList.removeIf(Strings::isNullOrEmpty);
4148

49+
if (fqnPartsList.size() < CLASSPATH_MIN_DEPTH) {
50+
JOptionPane.showMessageDialog(
51+
null,
52+
inspectionBundle.message(
53+
"inspection.error.graphqlResolverClass.tooShortFormat",
54+
resolverFqn
55+
),
56+
inspectionBundle.message(
57+
"inspection.error.graphqlResolverClass.tooShortFormatTitle"
58+
),
59+
JOptionPane.ERROR_MESSAGE
60+
);
61+
return;
62+
}
63+
4264
final int endIndex = fqnPartsList.size() - 1;
4365
final String moduleName = String.join("_", fqnPartsList.subList(0, 2));
4466
final String resolverName = fqnPartsList.get(endIndex);
45-
final String directory = fqnPartsList.get(2);
67+
final String directory = String.join(File.separator, fqnPartsList.subList(2, endIndex));
4668
final String namespace = String.join("\\", fqnPartsList.subList(0, endIndex));
4769

4870
final GraphQlResolverFileData graphQlResolverFileData = new GraphQlResolverFileData(

0 commit comments

Comments
 (0)