99
1010import com .google .common .collect .Sets ;
1111import com .intellij .lang .javascript .JSTokenTypes ;
12+ import com .intellij .lang .javascript .patterns .JSPatterns ;
13+ import com .intellij .lang .javascript .psi .JSExpression ;
1214import com .intellij .lang .javascript .psi .JSReferenceExpression ;
1315import com .intellij .lang .javascript .psi .ecma6 .ES6TaggedTemplateExpression ;
1416import com .intellij .lang .javascript .psi .ecma6 .JSStringTemplateExpression ;
1517import com .intellij .lang .jsgraphql .ide .injection .GraphQLCommentBasedInjectionHelper ;
1618import com .intellij .openapi .util .TextRange ;
1719import com .intellij .openapi .util .text .StringUtil ;
20+ import com .intellij .patterns .ElementPattern ;
1821import com .intellij .psi .PsiElement ;
1922import com .intellij .psi .util .PsiTreeUtil ;
2023import com .intellij .psi .util .PsiUtilCore ;
@@ -38,6 +41,8 @@ public class GraphQLJavaScriptLanguageInjectionUtil {
3841 public static final String GQL_TEMPLATE_TAG = "gql" ;
3942 public static final String APOLLO_GQL_TEMPLATE_TAG = "Apollo.gql" ;
4043
44+ private static final ElementPattern <JSExpression > GRAPHQL_CALL_ARG_PATTERN = JSPatterns .jsArgument (GRAPHQL_TEMPLATE_TAG , 0 );
45+
4146 public final static Set <String > SUPPORTED_TAG_NAMES = Sets .newHashSet (
4247 RELAY_QL_TEMPLATE_TAG ,
4348 GRAPHQL_TEMPLATE_TAG ,
@@ -47,16 +52,19 @@ public class GraphQLJavaScriptLanguageInjectionUtil {
4752 );
4853
4954 public static boolean isGraphQLLanguageInjectionTarget (@ Nullable PsiElement host ) {
50- if (!(host instanceof JSStringTemplateExpression )) {
55+ if (!(host instanceof JSStringTemplateExpression template )) {
5156 return false ;
5257 }
5358
5459 // gql``, Relay.QL``, etc
55- JSStringTemplateExpression template = (JSStringTemplateExpression ) host ;
5660 if (isInjectedUsingTemplateTag (template )) {
5761 return true ;
5862 }
5963
64+ if (isInjectedInCallArgument (template )) {
65+ return true ;
66+ }
67+
6068 // built-in "language=GraphQL" injection comments
6169 if (isInjectedUsingBuiltInComments (template )) {
6270 return true ;
@@ -100,6 +108,12 @@ private static boolean isInjectedUsingTemplateTag(@NotNull JSStringTemplateExpre
100108 return builderTailName != null && SUPPORTED_TAG_NAMES .contains (builderTailName );
101109 }
102110
111+ private static boolean isInjectedInCallArgument (@ NotNull JSStringTemplateExpression template ) {
112+ PsiElement parent = template .getParent ();
113+ PsiElement expr = parent instanceof ES6TaggedTemplateExpression ? parent : template ;
114+ return GRAPHQL_CALL_ARG_PATTERN .accepts (expr );
115+ }
116+
103117 /**
104118 * Checks a case when the possible injection contains a EOL comment "# graphql".
105119 */
0 commit comments