Skip to content

Commit a383f5e

Browse files
committed
Support injection in gatsby's "graphql(...)" #294
1 parent 1e65849 commit a383f5e

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

src/main/com/intellij/lang/jsgraphql/javascript/injection/GraphQLJavaScriptLanguageInjectionUtil.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99

1010
import com.google.common.collect.Sets;
1111
import com.intellij.lang.javascript.JSTokenTypes;
12+
import com.intellij.lang.javascript.patterns.JSPatterns;
13+
import com.intellij.lang.javascript.psi.JSExpression;
1214
import com.intellij.lang.javascript.psi.JSReferenceExpression;
1315
import com.intellij.lang.javascript.psi.ecma6.ES6TaggedTemplateExpression;
1416
import com.intellij.lang.javascript.psi.ecma6.JSStringTemplateExpression;
1517
import com.intellij.lang.jsgraphql.ide.injection.GraphQLCommentBasedInjectionHelper;
1618
import com.intellij.openapi.util.TextRange;
1719
import com.intellij.openapi.util.text.StringUtil;
20+
import com.intellij.patterns.ElementPattern;
1821
import com.intellij.psi.PsiElement;
1922
import com.intellij.psi.util.PsiTreeUtil;
2023
import 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
*/

src/test/com/intellij/lang/jsgraphql/injection/GraphQLInjectionHighlightingTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,10 @@ public void testInjectedWithCStyleCommentMultipleVars() {
110110
doTestInjectedFile("cStyleCommentMultipleVars.js");
111111
}
112112

113+
public void testInjectedInCallArgument() {
114+
doTestInjectedFile("callArgument.js");
115+
}
116+
113117
private @NotNull PsiFile doTestInjectedFile(@NotNull String sourcePath) {
114118
myFixture.configureByFile(sourcePath);
115119

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const QUERY = graphql(`
2+
query {
3+
field
4+
}
5+
`);

0 commit comments

Comments
 (0)