···
import { findAllCallExpressions, findAllImports, getSource } from './ast';
import { resolveTemplate } from './ast/resolve';
10
+
} from 'typescript';
export const MISSING_FRAGMENT_CODE = 52003;
···
{ start: number; length: number; fragments: Array<string> }
const imports = findAllImports(source);
22
+
const typeChecker = info.languageService.getProgram()?.getTypeChecker();
const importSpecifierToFragments: Record<
{ start: number; length: number; fragments: Array<string> }
29
+
if (!typeChecker) return importSpecifierToFragments;
···
const externalSource = getSource(info, def.fileName);
if (!externalSource) return;
38
-
const fragmentsForImport = getFragmentsInSource(externalSource, info);
47
+
const fragmentsForImport = getFragmentsInSource(
const names = fragmentsForImport.map(fragment => fragment.name.value);
···
const externalSource = getSource(info, def.fileName);
if (!externalSource) return;
76
-
const fragmentsForImport = getFragmentsInSource(externalSource, info);
89
+
const fragmentsForImport = getFragmentsInSource(
const names = fragmentsForImport.map(fragment => fragment.name.value);
···
const fragmentsForImport = getFragmentsInSource(
const names = fragmentsForImport.map(
···
function getFragmentsInSource(
165
+
typeChecker: ts.TypeChecker,
info: ts.server.PluginCreateInfo
): Array<FragmentDefinitionNode> {
let fragments: Array<FragmentDefinitionNode> = [];
const callExpressions = findAllCallExpressions(src, info, false);
152
-
callExpressions.nodes.forEach(node => {
171
+
const symbol = typeChecker.getSymbolAtLocation(src);
172
+
if (!symbol) return [];
174
+
const exports = typeChecker.getExportsOfModule(symbol);
175
+
const exportedNames = exports.map(symb => symb.name);
176
+
const nodes = callExpressions.nodes.filter(x => {
177
+
let parent = x.parent;
180
+
!ts.isSourceFile(parent) &&
181
+
!ts.isVariableDeclaration(parent)
183
+
parent = parent.parent;
186
+
if (ts.isVariableDeclaration(parent)) {
187
+
return exportedNames.includes(parent.name.getText());
193
+
nodes.forEach(node => {
const text = resolveTemplate(node, src.fileName, info).combinedText;
const parsed = parse(text, { noLocation: true });