Skip to content

907: Fix class cast exception #927

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

Merged
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,39 @@
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/

package com.magento.idea.magento2plugin.stubs.indexes.graphql;

import com.intellij.lang.jsgraphql.GraphQLFileType;
import com.intellij.lang.jsgraphql.psi.*;
import com.intellij.lang.jsgraphql.psi.GraphQLArgument;
import com.intellij.lang.jsgraphql.psi.GraphQLArguments;
import com.intellij.lang.jsgraphql.psi.GraphQLDirective;
import com.intellij.lang.jsgraphql.psi.GraphQLFieldDefinition;
import com.intellij.lang.jsgraphql.psi.GraphQLFieldsDefinition;
import com.intellij.lang.jsgraphql.psi.GraphQLFile;
import com.intellij.lang.jsgraphql.psi.GraphQLInterfaceTypeDefinition;
import com.intellij.lang.jsgraphql.psi.GraphQLObjectTypeDefinition;
import com.intellij.lang.jsgraphql.psi.GraphQLQuotedString;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.util.indexing.*;
import com.intellij.util.indexing.DataIndexer;
import com.intellij.util.indexing.FileBasedIndex;
import com.intellij.util.indexing.FileContent;
import com.intellij.util.indexing.ID;
import com.intellij.util.indexing.ScalarIndexExtension;
import com.intellij.util.io.EnumeratorStringDescriptor;
import com.intellij.util.io.KeyDescriptor;
import com.jetbrains.php.lang.psi.elements.PhpClass;
import com.magento.idea.magento2plugin.util.magento.graphql.GraphQlUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jetbrains.annotations.NotNull;
import java.util.*;

public class GraphQlResolverIndex extends ScalarIndexExtension<String> {
public static final ID<String, Void> KEY
Expand All @@ -30,50 +48,57 @@ public ID<String, Void> getName() {

@NotNull
@Override
@SuppressWarnings({"PMD.CognitiveComplexity", "PMD.NPathComplexity"})
public DataIndexer<String, Void, FileContent> getIndexer() {
return inputData -> {
Map<String, Void> map = new HashMap<>();
final Map<String, Void> map = new HashMap<>();

GraphQLFile graphQLFile = (GraphQLFile) inputData.getPsiFile();
PsiElement[] children = graphQLFile.getChildren();
for (PsiElement child : children) {
if (!(child instanceof GraphQLObjectTypeDefinition) && !(child instanceof GraphQLInterfaceTypeDefinition)) {
final GraphQLFile graphQLFile = (GraphQLFile) inputData.getPsiFile();
final PsiElement[] children = graphQLFile.getChildren();
for (final PsiElement child : children) {
if (!(child instanceof GraphQLObjectTypeDefinition)
&& !(child instanceof GraphQLInterfaceTypeDefinition)) {
continue;
}
PsiElement[] objectChildren = child.getChildren();
for (PsiElement objectChild : objectChildren) {
final PsiElement[] objectChildren = child.getChildren();
for (final PsiElement objectChild : objectChildren) {
if (!(objectChild instanceof GraphQLFieldsDefinition)) {
continue;
}
PsiElement[] fieldsChildren = objectChild.getChildren();
for (PsiElement fieldsChild : fieldsChildren) {
final PsiElement[] fieldsChildren = objectChild.getChildren();
for (final PsiElement fieldsChild : fieldsChildren) {
if (!(fieldsChild instanceof GraphQLFieldDefinition)) {
continue;
}
PsiElement[] fieldChildren = fieldsChild.getChildren();
for (PsiElement fieldChild : fieldChildren) {
final PsiElement[] fieldChildren = fieldsChild.getChildren();
for (final PsiElement fieldChild : fieldChildren) {
if (!(fieldChild instanceof GraphQLDirective)) {
continue;
}
if (!fieldChild.getText().startsWith("@resolver")) {
continue;
}

PsiElement[] directiveChildren = fieldChild.getChildren();
final PsiElement[] directiveChildren = fieldChild.getChildren();

for (PsiElement directiveChild : directiveChildren) {
for (final PsiElement directiveChild : directiveChildren) {
if (!(directiveChild instanceof GraphQLArguments)) {
continue;
}

PsiElement[] argumentsChildren = directiveChild.getChildren();
for (PsiElement argumentsChild : argumentsChildren) {
final PsiElement[] argumentsChildren = directiveChild.getChildren();
for (final PsiElement argumentsChild : argumentsChildren) {
if (!(argumentsChild instanceof GraphQLArgument)) {
continue;
}

PsiElement argumentStringValue = GraphQlUtil.fetchResolverQuotedStringFromArgument(argumentsChild);
if (argumentStringValue == null) continue;
final PsiElement argumentStringValue =
GraphQlUtil.fetchResolverQuotedStringFromArgument(
argumentsChild
);
if (argumentStringValue == null) {
continue;
}

String resolverFQN = argumentStringValue.getText();
if (resolverFQN == null) {
Expand Down Expand Up @@ -103,8 +128,8 @@ public KeyDescriptor<String> getKeyDescriptor() {
@NotNull
@Override
public FileBasedIndex.InputFilter getInputFilter() {
return virtualFile -> (virtualFile.getFileType() == GraphQLFileType.INSTANCE
&& virtualFile.getName().equals("schema.graphqls"));
return virtualFile -> virtualFile.getFileType() == GraphQLFileType.INSTANCE
&& "schema.graphqls".equals(virtualFile.getName());
}

@Override
Expand All @@ -117,28 +142,44 @@ public int getVersion() {
return 1;
}


public static List<GraphQLQuotedString> getGraphQLUsages(@NotNull PhpClass phpClass) {
List<GraphQLQuotedString> quotedStrings = new ArrayList<>();

String classFqn = phpClass.getFQN();
Collection<VirtualFile> containingFiles = FileBasedIndex
.getInstance().getContainingFiles(KEY, classFqn, GlobalSearchScope.allScope(phpClass.getProject()));

PsiManager psiManager = PsiManager.getInstance(phpClass.getProject());
for (VirtualFile virtualFile : containingFiles) {
GraphQLFile file = (GraphQLFile) psiManager.findFile(virtualFile);
if (file == null) {
/**
* Get GraphQL Usages.
*
* @param phpClass PhpClass
*
* @return List[GraphQLQuotedString]
*/
public static List<GraphQLQuotedString> getGraphQLUsages(final @NotNull PhpClass phpClass) {
final List<GraphQLQuotedString> quotedStrings = new ArrayList<>();

final String classFqn = phpClass.getFQN();
final Collection<VirtualFile> containingFiles = FileBasedIndex
.getInstance().getContainingFiles(
KEY,
classFqn,
GlobalSearchScope.allScope(phpClass.getProject())
);

final PsiManager psiManager = PsiManager.getInstance(phpClass.getProject());
for (final VirtualFile virtualFile : containingFiles) {
final PsiFile fileCandidate = psiManager.findFile(virtualFile);

if (!(fileCandidate instanceof GraphQLFile)) {
continue;
}
PsiElement[] children = file.getChildren();
final GraphQLFile file = (GraphQLFile) fileCandidate;
final PsiElement[] children = file.getChildren();
findMatchingQuotedString(children, classFqn, quotedStrings);
}
return quotedStrings;
}

private static PsiElement findMatchingQuotedString(PsiElement[] psiElements, String classFqn, List<GraphQLQuotedString> quotedStrings) {
for (PsiElement element: psiElements) {
private static PsiElement findMatchingQuotedString(
final PsiElement[] psiElements,
final String classFqn,
final List<GraphQLQuotedString> quotedStrings
) {
for (final PsiElement element: psiElements) {
if (!(element instanceof GraphQLArgument) && element.getChildren().length == 0) {
continue;
}
Expand All @@ -147,16 +188,19 @@ private static PsiElement findMatchingQuotedString(PsiElement[] psiElements, Str
continue;
}

PsiElement argumentStringValue = GraphQlUtil.fetchResolverQuotedStringFromArgument(element);
if (argumentStringValue == null) continue;
final PsiElement argumentStringValue =
GraphQlUtil.fetchResolverQuotedStringFromArgument(element);
if (argumentStringValue == null) {
continue;
}

String resolverFQN = argumentStringValue.getText();
if (resolverFQN == null) {
return null;
}

resolverFQN = GraphQlUtil.resolverStringToPhpFQN(resolverFQN);

if (!resolverFQN.equals(classFqn)) {
continue;
}
Expand Down