| import * as ts from 'typescript/lib/tsserverlibrary'; |
| import * as pluginApi from '../tsc_wrapped/plugin_api'; |
| import {Checker} from './checker'; |
| import {registerRules} from './runner'; |
| |
| // Installs the Tsetse language server plugin, which checks Tsetse rules in your |
| // editor and shows issues as semantic errors (red squiggly underline). |
| |
| function init() { |
| return { |
| create(info: ts.server.PluginCreateInfo) { |
| const oldService = info.languageService; |
| const program = oldService.getProgram(); |
| |
| // Signature of `getProgram` is `getProgram(): Program | undefined;` in |
| // ts 3.1 so we must check if the return value is valid to compile with |
| // ts 3.1. |
| if (!program) { |
| throw new Error( |
| 'Failed to initialize tsetse language_service_plugin: program is undefined'); |
| } |
| |
| const checker = new Checker(program); |
| |
| // Add disabledRules to tsconfig to disable specific rules |
| // "plugins": [ |
| // {"name": "...", "disabledRules": ["equals-nan"]} |
| // ] |
| registerRules(checker, info.config.disabledRules || []); |
| |
| const proxy = pluginApi.createProxy(oldService); |
| proxy.getSemanticDiagnostics = (fileName: string) => { |
| const result = [...oldService.getSemanticDiagnostics(fileName)]; |
| // Note that this ignores suggested fixes. |
| result.push(...checker.execute(program.getSourceFile(fileName)!) |
| .map(failure => failure.toDiagnostic())); |
| return result; |
| }; |
| return proxy; |
| } |
| }; |
| } |
| |
| export = init; |