Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1135: Fixed issues with incorrect generation of resolver class #1192

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0).

## 4.4.1

### Fixed

- Fixed wrong director(y|ies) generation for GraphQL resolver class [#1192](https://github.com/magento/magento2-phpstorm-plugin/pull/1192)
- Fixed IndexOutOfBoundsException: CreateResolverClassQuickFix.applyFix(CreateResolverClassQuickFix.java:43) [#1192](https://github.com/magento/magento2-phpstorm-plugin/pull/1192)

## 4.4.0

### Added
Expand Down
5 changes: 4 additions & 1 deletion resources/magento2/inspection.properties
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ inspection.plugin.duplicateInSameFile=The plugin name already used in this file.
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.
inspection.plugin.disabledPluginDoesNotExist=This plugin does not exist to be disabled.
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
inspection.graphql.resolver.notExist=Resolver class do not exist
inspection.graphql.resolver.notExist=The GraphQL resolver class do not exist
inspection.graphql.resolver.fix.family=Implement Resolver interface
inspection.graphql.resolver.fix.title=Select one of the following interface
inspection.graphql.schema.resolver.fix.family=Create GraphQL Resolver
Expand All @@ -39,3 +39,6 @@ inspection.warning.class.does.not.exist=The class "{0}" does not exist
inspection.warning.method.does.not.exist=The method "{0}" does not exist in the service class
inspection.warning.method.should.have.public.access=The method "{0}" should have public access
inspection.warning.method.should.have.public.access.fix=Change the method access
inspection.warning.class.invalidFormat=The class "{0}" has invalid format
inspection.error.graphqlResolverClass.tooShortFormat=The target GraphQL resolver class format is incorrect.\nThe fully qualified name "{0}" should contain at least 3 parts.
inspection.error.graphqlResolverClass.tooShortFormatTitle=The GraphQL resolver class format is incorrect
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import com.magento.idea.magento2plugin.bundles.ValidatorBundle;
import com.magento.idea.magento2plugin.indexes.ModuleIndex;
import com.magento.idea.magento2plugin.magento.files.GraphQlResolverPhp;
import com.magento.idea.magento2plugin.magento.packages.File;
import com.magento.idea.magento2plugin.magento.packages.MagentoPhpClass;
import com.magento.idea.magento2plugin.util.GetFirstClassOfFile;
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
Expand All @@ -34,6 +33,7 @@
import org.jetbrains.annotations.NotNull;

public class ModuleGraphQlResolverClassGenerator extends FileGenerator {

private final GraphQlResolverFileData graphQlResolverFileData;
private final Project project;
private final ValidatorBundle validatorBundle;
Expand Down Expand Up @@ -132,15 +132,15 @@ private PhpClass createGraphQlResolverClass(final String actionName) {
if (parentDirectory == null) {
return null;
}
final String[] graphQlResolverDirectories = graphQlResolverFileData
.getGraphQlResolverDirectory().split(File.separator);
for (final String graphQlResolverDirectory: graphQlResolverDirectories) {
parentDirectory = directoryGenerator.findOrCreateSubdirectory(
final String graphQlResolverDirectory = graphQlResolverFileData
.getGraphQlResolverDirectory();

if (!graphQlResolverDirectory.isBlank()) {
parentDirectory = directoryGenerator.findOrCreateSubdirectories(
parentDirectory,
graphQlResolverDirectory
);
}

final Properties attributes = getAttributes();
final PsiFile graphQlResolverFile = fileFromTemplateGenerator.generate(
GraphQlResolverPhp.getInstance(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,66 @@
import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.lang.jsgraphql.psi.GraphQLNamedElement;
import com.intellij.lang.jsgraphql.psi.GraphQLValue;
import com.intellij.lang.jsgraphql.psi.GraphQLVisitor;
import com.intellij.psi.PsiElement;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
import com.magento.idea.magento2plugin.inspections.graphqls.fix.CreateResolverClassQuickFix;
import com.magento.idea.magento2plugin.magento.files.GraphQlResolver;
import com.magento.idea.magento2plugin.util.GetPhpClassByFQN;
import com.magento.idea.magento2plugin.util.RegExUtil;
import com.magento.idea.magento2plugin.util.magento.graphql.GraphQlUtil;
import org.jetbrains.annotations.NotNull;

public class SchemaResolverInspection extends LocalInspectionTool {

private final InspectionBundle inspectionBundle = new InspectionBundle();

@NotNull
@Override
public GraphQLVisitor buildVisitor(
@NotNull final ProblemsHolder holder,
public @NotNull GraphQLVisitor buildVisitor(
final @NotNull ProblemsHolder holder,
final boolean isOnTheFly
) {
return new GraphQLVisitor() {
@Override
public void visitValue(@NotNull final GraphQLValue element) {
public void visitValue(final @NotNull GraphQLValue element) {
final String getVisitedElementValue = element.getText();
if (getVisitedElementValue == null) {
final PsiElement parentElementValue = element.getParent();

if (getVisitedElementValue == null
|| !(parentElementValue instanceof GraphQLNamedElement)) {
return;
}
final String attributeName = ((GraphQLNamedElement) parentElementValue).getName();

if (!GraphQlResolver.CLASS_ARGUMENT.equals(attributeName)) {
return;
}
final String resolverFQN
= GraphQlUtil.resolverStringToPhpFQN(getVisitedElementValue);

if (!resolverFQN.matches(RegExUtil.PhpRegex.FQN)) {
holder.registerProblem(
element,
inspectionBundle.message(
"inspection.warning.class.invalidFormat",
resolverFQN
),
ProblemHighlightType.WARNING
);
return;
}
final GetPhpClassByFQN getPhpClassByFQN
= GetPhpClassByFQN.getInstance(holder.getProject());
final PhpClass resolverClass = getPhpClassByFQN.execute(resolverFQN);

if (resolverClass == null) {
holder.registerProblem(
element,
inspectionBundle.message(
"inspection.graphql.resolver.notExist"
"inspection.graphql.resolver.notExist"
),
ProblemHighlightType.ERROR,
new CreateResolverClassQuickFix());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,19 @@
import com.magento.idea.magento2plugin.actions.generation.data.GraphQlResolverFileData;
import com.magento.idea.magento2plugin.actions.generation.generator.ModuleGraphQlResolverClassGenerator;
import com.magento.idea.magento2plugin.bundles.InspectionBundle;
import com.magento.idea.magento2plugin.magento.packages.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JOptionPane;
import org.jetbrains.annotations.NotNull;

public class CreateResolverClassQuickFix implements LocalQuickFix {

private static final int CLASSPATH_MIN_DEPTH = 3;

private final InspectionBundle inspectionBundle = new InspectionBundle();

@Override
public @NotNull String getFamilyName() {
return new InspectionBundle().message(
Expand All @@ -39,10 +46,25 @@ public void applyFix(

fqnPartsList.removeIf(Strings::isNullOrEmpty);

if (fqnPartsList.size() < CLASSPATH_MIN_DEPTH) {
JOptionPane.showMessageDialog(
null,
inspectionBundle.message(
"inspection.error.graphqlResolverClass.tooShortFormat",
resolverFqn
),
inspectionBundle.message(
"inspection.error.graphqlResolverClass.tooShortFormatTitle"
),
JOptionPane.ERROR_MESSAGE
);
return;
}

final int endIndex = fqnPartsList.size() - 1;
final String moduleName = String.join("_", fqnPartsList.subList(0, 2));
final String resolverName = fqnPartsList.get(endIndex);
final String directory = fqnPartsList.get(2);
final String directory = String.join(File.separator, fqnPartsList.subList(2, endIndex));
final String namespace = String.join("\\", fqnPartsList.subList(0, endIndex));

final GraphQlResolverFileData graphQlResolverFileData = new GraphQlResolverFileData(
Expand Down