Skip to content

Commit 3225ea7

Browse files
author
roman.vasilev
committed
fix: getSourceFile fail fixed if file is not defined in tsconfig
fixes palantir/tslint#4135
1 parent deed444 commit 3225ea7

File tree

5 files changed

+26
-22
lines changed

5 files changed

+26
-22
lines changed

src/create-program.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type CreateProgramArgument = {
88
projectDirectory?: string;
99
};
1010

11-
export function createProgram({ configFile, projectDirectory = path.dirname(configFile), compilerOptions = {} }: CreateProgramArgument): ts.Program {
11+
export function createProgram({ configFile, projectDirectory = path.dirname(configFile), compilerOptions = {} }: CreateProgramArgument) {
1212
const { config, error } = ts.readConfigFile(configFile, ts.sys.readFile);
1313
if (error !== undefined) {
1414
throw new Error(ts.formatDiagnostics([error], {
@@ -48,5 +48,5 @@ export function createProgram({ configFile, projectDirectory = path.dirname(conf
4848
const host = ts.createCompilerHost(parsed.options, true);
4949
const program = ts.createProgram(parsed.fileNames, parsed.options, host);
5050

51-
return program;
51+
return { program, host };
5252
}

src/get-source-file.ts

-14
This file was deleted.

src/index.spec.ts

+10
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,16 @@ describe('tsconfig-files', () => {
3131
const sourceFile = service.getSourceFile(testFile);
3232
assert(sourceFile);
3333
});
34+
35+
it('typescript checker (file which is not defined in tsconfig)', () => {
36+
const testFile = `${root}/test-project/file.spec.ts`;
37+
const sourceFile = service.getSourceFile(testFile);
38+
const checker = service.getProgram().getTypeChecker();
39+
const [itstmt] = sourceFile.statements.filter(x => x.getText() === `it('example test');`);
40+
const itid = (itstmt as any).expression.expression;
41+
const symbol = checker.getSymbolAtLocation(itid);
42+
assert(symbol);
43+
});
3444
});
3545

3646
describe('create service', () => {

src/index.ts

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,32 @@
11
import * as ts from 'typescript';
22
import { createProgram } from './create-program';
3-
import { getSourceFile } from './get-source-file';
43

54
type createServiceOptions = {
65
configFile: string;
76
compilerOptions?: ts.CompilerOptions;
87
};
98

109
export function createService({ compilerOptions, configFile }: createServiceOptions) {
11-
const program = createProgram({ configFile, compilerOptions });
12-
return {
10+
let { program, host } = createProgram({ configFile, compilerOptions });
11+
const api = {
1312
getProgram: () => program,
14-
getSourceFile: (fileName: string, sourceText: string | undefined = ts.sys.readFile(fileName)) => {
15-
return getSourceFile(program, fileName, sourceText);
13+
getSourceFile: (fileName: string, sourceText?: string) => {
14+
// todo: fix me optimization sourceText is not used
15+
let sourceFile = program.getSourceFile(fileName);
16+
if (sourceFile === undefined) {
17+
const rootFileNames = [...program.getRootFileNames(), fileName];
18+
program = ts.createProgram(rootFileNames, program.getCompilerOptions(), host, program);
19+
sourceFile = program.getSourceFile(fileName);
20+
}
21+
return sourceFile;
1622
},
1723
getDiagnostics: (fileName: string, sourceText?: string) => {
18-
const sourceFile = getSourceFile(program, fileName, sourceText);
24+
const sourceFile = api.getSourceFile(fileName, sourceText);
1925
return [
2026
...program.getSyntacticDiagnostics(sourceFile),
2127
...program.getSemanticDiagnostics(sourceFile),
2228
];
2329
},
2430
};
31+
return api;
2532
}

test-project/file.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
import { x } from './file';
2+
it('example test');
23
console.assert(x);

0 commit comments

Comments
 (0)