From d0edd93d650f295bd68f4ca097d5c66d423bed12 Mon Sep 17 00:00:00 2001 From: Quramy Date: Fri, 15 Mar 2024 20:31:21 +0900 Subject: [PATCH] feat: Resolve interpolation referring call expression --- .../template-expression-resolver.test.ts.snap | 17 +++++++++ .../template-expression-resolver.test.ts | 38 +++++++++++++++++++ .../template-expression-resolver.ts | 7 ++++ 3 files changed, 62 insertions(+) diff --git a/src/ts-ast-util/__snapshots__/template-expression-resolver.test.ts.snap b/src/ts-ast-util/__snapshots__/template-expression-resolver.test.ts.snap index 873615eb4..35f9966a0 100644 --- a/src/ts-ast-util/__snapshots__/template-expression-resolver.test.ts.snap +++ b/src/ts-ast-util/__snapshots__/template-expression-resolver.test.ts.snap @@ -68,3 +68,20 @@ exports[`resolve string combinination pattern should return combined string with ...Foo }" `; + +exports[`resolve string combinination pattern should return combined string with template in call expression 1`] = ` +" + + + fragment Foo on Hoge { + name + } + + fragment Piyo on Hoge { + ...Foo + } + + query { + ...Piyo + }" +`; diff --git a/src/ts-ast-util/template-expression-resolver.test.ts b/src/ts-ast-util/template-expression-resolver.test.ts index 729f26601..14c4df483 100644 --- a/src/ts-ast-util/template-expression-resolver.test.ts +++ b/src/ts-ast-util/template-expression-resolver.test.ts @@ -505,6 +505,44 @@ describe(TemplateExpressionResolver.prototype.resolve, () => { expect(actual?.combinedText).toMatchSnapshot(); }); + it('should return combined string with template in call expression', () => { + const langService = createTestingLanguageService({ + files: [ + { + fileName: 'main.ts', + content: ` + const fragment1 = gql(\` + fragment Foo on Hoge { + name + } + \`); + const fragment2 = gql(\` + \${fragment1} + fragment Piyo on Hoge { + ...Foo + } + \`); + const query = \` + \${fragment2} + query { + ...Piyo + }\`; + `, + }, + ], + }); + const source = langService.getProgram()!.getSourceFile('main.ts'); + if (!source) return fail(); + const [, node] = findAllNodes(source, node => ts.isTemplateExpression(node)); + const resolver = new TemplateExpressionResolver( + langService, + () => '', + () => false, + ); + const actual = resolver.resolve('main.ts', node as ts.TemplateExpression).resolvedInfo; + expect(actual?.combinedText).toMatchSnapshot(); + }); + it('should return combined string with hopping reference', () => { const langService = createTestingLanguageService({ files: [ diff --git a/src/ts-ast-util/template-expression-resolver.ts b/src/ts-ast-util/template-expression-resolver.ts index 87b448814..6f0e3c81e 100644 --- a/src/ts-ast-util/template-expression-resolver.ts +++ b/src/ts-ast-util/template-expression-resolver.ts @@ -371,6 +371,13 @@ export class TemplateExpressionResolver { } else { return setValueToCache(getValueForTemplateExpression(node.template, dependencies)); } + } else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.arguments.length > 0) { + const firstArgNode = node.arguments[0]; + if (ts.isNoSubstitutionTemplateLiteral(firstArgNode)) { + return setValueToCache({ text: firstArgNode.text, dependencies }); + } else if (ts.isTemplateExpression(firstArgNode)) { + return setValueToCache(getValueForTemplateExpression(firstArgNode, dependencies)); + } } else if (ts.isTemplateExpression(node)) { return setValueToCache(getValueForTemplateExpression(node, dependencies)); }