diff --git a/snapshots/output/diagnostics/index.ts b/snapshots/output/diagnostics/index.ts index a13960dd..72da397e 100644 --- a/snapshots/output/diagnostics/index.ts +++ b/snapshots/output/diagnostics/index.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition diagnostics 0.0.1 `index.ts`/ /** @deprecated This class is deprecated */ diff --git a/snapshots/output/enclosing-ranges-ts/index.ts b/snapshots/output/enclosing-ranges-ts/index.ts index 430c1451..803f49cb 100644 --- a/snapshots/output/enclosing-ranges-ts/index.ts +++ b/snapshots/output/enclosing-ranges-ts/index.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition enclosing-ranges-ts 1.0.0 `index.ts`/ // format-options: showRanges diff --git a/snapshots/output/enclosing-ranges/range.js b/snapshots/output/enclosing-ranges/range.js index 4684c559..c42206e1 100644 --- a/snapshots/output/enclosing-ranges/range.js +++ b/snapshots/output/enclosing-ranges/range.js @@ -1,3 +1,4 @@ +// language JavaScript // < definition enclosing-ranges 0.0.1 `range.js`/ // format-options: showRanges diff --git a/snapshots/output/invalid-package-json/packages/a/src/a.ts b/snapshots/output/invalid-package-json/packages/a/src/a.ts index 78323324..c21d0223 100644 --- a/snapshots/output/invalid-package-json/packages/a/src/a.ts +++ b/snapshots/output/invalid-package-json/packages/a/src/a.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition @example/a HEAD src/`a.ts`/ export function a(): string { diff --git a/snapshots/output/multi-project/packages/a/src/index.ts b/snapshots/output/multi-project/packages/a/src/index.ts index 9597c70a..f5ace936 100644 --- a/snapshots/output/multi-project/packages/a/src/index.ts +++ b/snapshots/output/multi-project/packages/a/src/index.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition @example/a 1.0.0 src/`index.ts`/ //documentation ```ts // > module "index.ts" diff --git a/snapshots/output/multi-project/packages/b/src/b.ts b/snapshots/output/multi-project/packages/b/src/b.ts index 430946cc..e992caf3 100644 --- a/snapshots/output/multi-project/packages/b/src/b.ts +++ b/snapshots/output/multi-project/packages/b/src/b.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition @example/b 1.0.0 src/`b.ts`/ import { a } from '@example/a/src' diff --git a/snapshots/output/pnpm-workspaces/packages/a/src/a.ts b/snapshots/output/pnpm-workspaces/packages/a/src/a.ts index 9183bd3d..b04e75fd 100644 --- a/snapshots/output/pnpm-workspaces/packages/a/src/a.ts +++ b/snapshots/output/pnpm-workspaces/packages/a/src/a.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition @example/a 1.0.0 src/`a.ts`/ export function a(): string { diff --git a/snapshots/output/pnpm-workspaces/packages/b/src/b.ts b/snapshots/output/pnpm-workspaces/packages/b/src/b.ts index 6a975141..b5efc02a 100644 --- a/snapshots/output/pnpm-workspaces/packages/b/src/b.ts +++ b/snapshots/output/pnpm-workspaces/packages/b/src/b.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition @example/b 1.0.0 src/`b.ts`/ import { a } from '@example/a' diff --git a/snapshots/output/pure-js/src/main.js b/snapshots/output/pure-js/src/main.js index 614be4fa..5d853161 100644 --- a/snapshots/output/pure-js/src/main.js +++ b/snapshots/output/pure-js/src/main.js @@ -1,3 +1,4 @@ +// language JavaScript // < definition pure-js 1.0.0 src/`main.js`/ function fib(n) { diff --git a/snapshots/output/react/src/LoaderInput.tsx b/snapshots/output/react/src/LoaderInput.tsx index 09d95a30..957ddbb1 100644 --- a/snapshots/output/react/src/LoaderInput.tsx +++ b/snapshots/output/react/src/LoaderInput.tsx @@ -1,3 +1,4 @@ +// language TypeScriptReact // < definition react-example 1.0.0 src/`LoaderInput.tsx`/ import React from 'react' diff --git a/snapshots/output/react/src/MyTSXElement.tsx b/snapshots/output/react/src/MyTSXElement.tsx index ec63c2cf..7e8fb4a7 100644 --- a/snapshots/output/react/src/MyTSXElement.tsx +++ b/snapshots/output/react/src/MyTSXElement.tsx @@ -1,3 +1,4 @@ +// language TypeScriptReact // < definition react-example 1.0.0 src/`MyTSXElement.tsx`/ import React from 'react' diff --git a/snapshots/output/react/src/UseMyTSXElement.tsx b/snapshots/output/react/src/UseMyTSXElement.tsx index c3690187..f6970da1 100644 --- a/snapshots/output/react/src/UseMyTSXElement.tsx +++ b/snapshots/output/react/src/UseMyTSXElement.tsx @@ -1,3 +1,4 @@ +// language TypeScriptReact // < definition react-example 1.0.0 src/`UseMyTSXElement.tsx`/ import React from "react"; diff --git a/snapshots/output/syntax/src/ClassWithPrivate.ts b/snapshots/output/syntax/src/ClassWithPrivate.ts index 66e5c025..4701245d 100644 --- a/snapshots/output/syntax/src/ClassWithPrivate.ts +++ b/snapshots/output/syntax/src/ClassWithPrivate.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`ClassWithPrivate.ts`/ export class ClassWithPrivate { diff --git a/snapshots/output/syntax/src/accessors.ts b/snapshots/output/syntax/src/accessors.ts index d41606c1..bb46bf5f 100644 --- a/snapshots/output/syntax/src/accessors.ts +++ b/snapshots/output/syntax/src/accessors.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`accessors.ts`/ class C { diff --git a/snapshots/output/syntax/src/class.ts b/snapshots/output/syntax/src/class.ts index 0ac9ef3f..8530826a 100644 --- a/snapshots/output/syntax/src/class.ts +++ b/snapshots/output/syntax/src/class.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`class.ts`/ export class Class { diff --git a/snapshots/output/syntax/src/conflicting-const-interface.ts b/snapshots/output/syntax/src/conflicting-const-interface.ts index acfa5b2d..735b776c 100644 --- a/snapshots/output/syntax/src/conflicting-const-interface.ts +++ b/snapshots/output/syntax/src/conflicting-const-interface.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`conflicting-const-interface.ts`/ export const ConflictingConst = 42 diff --git a/snapshots/output/syntax/src/constructor.ts b/snapshots/output/syntax/src/constructor.ts index 0f69f95d..bfb730f1 100644 --- a/snapshots/output/syntax/src/constructor.ts +++ b/snapshots/output/syntax/src/constructor.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`constructor.ts`/ namespace Yay { diff --git a/snapshots/output/syntax/src/decorators.ts b/snapshots/output/syntax/src/decorators.ts index 0abc6d30..8aa71b40 100644 --- a/snapshots/output/syntax/src/decorators.ts +++ b/snapshots/output/syntax/src/decorators.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`decorators.ts`/ import { Configuration } from './reusable-types' diff --git a/snapshots/output/syntax/src/destructuring.ts b/snapshots/output/syntax/src/destructuring.ts index 617bdaaf..11c9d709 100644 --- a/snapshots/output/syntax/src/destructuring.ts +++ b/snapshots/output/syntax/src/destructuring.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`destructuring.ts`/ interface Props { diff --git a/snapshots/output/syntax/src/enum.ts b/snapshots/output/syntax/src/enum.ts index 24d52ed9..c4cc4d7d 100644 --- a/snapshots/output/syntax/src/enum.ts +++ b/snapshots/output/syntax/src/enum.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`enum.ts`/ export enum Enum { diff --git a/snapshots/output/syntax/src/function.ts b/snapshots/output/syntax/src/function.ts index bd2835d7..e1ea57fa 100644 --- a/snapshots/output/syntax/src/function.ts +++ b/snapshots/output/syntax/src/function.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`function.ts`/ export function newFunction(): void {} diff --git a/snapshots/output/syntax/src/import.ts b/snapshots/output/syntax/src/import.ts index 40664fbc..93024918 100644 --- a/snapshots/output/syntax/src/import.ts +++ b/snapshots/output/syntax/src/import.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`import.ts`/ import * as namespace from './namespace' diff --git a/snapshots/output/syntax/src/inheritance.ts b/snapshots/output/syntax/src/inheritance.ts index 596614ec..f67e636b 100644 --- a/snapshots/output/syntax/src/inheritance.ts +++ b/snapshots/output/syntax/src/inheritance.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`inheritance.ts`/ import { Superinterface } from './reusable-types' diff --git a/snapshots/output/syntax/src/interface.ts b/snapshots/output/syntax/src/interface.ts index 3ea6368b..04b69fa5 100644 --- a/snapshots/output/syntax/src/interface.ts +++ b/snapshots/output/syntax/src/interface.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`interface.ts`/ export interface Interface { diff --git a/snapshots/output/syntax/src/issue-45.d.ts b/snapshots/output/syntax/src/issue-45.d.ts index 20fe2bbb..7354b111 100644 --- a/snapshots/output/syntax/src/issue-45.d.ts +++ b/snapshots/output/syntax/src/issue-45.d.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`issue-45.d.ts`/ export namespace example { diff --git a/snapshots/output/syntax/src/local.ts b/snapshots/output/syntax/src/local.ts index 0d688856..ea9aa8be 100644 --- a/snapshots/output/syntax/src/local.ts +++ b/snapshots/output/syntax/src/local.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`local.ts`/ export function local(): string { diff --git a/snapshots/output/syntax/src/module.d.ts b/snapshots/output/syntax/src/module.d.ts index 5e455a8e..31dd0dc7 100644 --- a/snapshots/output/syntax/src/module.d.ts +++ b/snapshots/output/syntax/src/module.d.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`module.d.ts`/ declare module 'a:b' { diff --git a/snapshots/output/syntax/src/namespace.ts b/snapshots/output/syntax/src/namespace.ts index 5633f648..d0d9cb42 100644 --- a/snapshots/output/syntax/src/namespace.ts +++ b/snapshots/output/syntax/src/namespace.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`namespace.ts`/ export declare namespace a { diff --git a/snapshots/output/syntax/src/object-literals-arrow-function.ts b/snapshots/output/syntax/src/object-literals-arrow-function.ts index 57a67dd0..0f77d535 100644 --- a/snapshots/output/syntax/src/object-literals-arrow-function.ts +++ b/snapshots/output/syntax/src/object-literals-arrow-function.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`object-literals-arrow-function.ts`/ import { Option } from './reusable-types' diff --git a/snapshots/output/syntax/src/object-literals-call-signatures.ts b/snapshots/output/syntax/src/object-literals-call-signatures.ts index ba1b8b3e..d3b5a099 100644 --- a/snapshots/output/syntax/src/object-literals-call-signatures.ts +++ b/snapshots/output/syntax/src/object-literals-call-signatures.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`object-literals-call-signatures.ts`/ import { diff --git a/snapshots/output/syntax/src/object-literals-nested.ts b/snapshots/output/syntax/src/object-literals-nested.ts index d7cca547..608f8bb7 100644 --- a/snapshots/output/syntax/src/object-literals-nested.ts +++ b/snapshots/output/syntax/src/object-literals-nested.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`object-literals-nested.ts`/ import { Option } from './reusable-types' diff --git a/snapshots/output/syntax/src/object-literals.ts b/snapshots/output/syntax/src/object-literals.ts index f7df0b2c..0aed7922 100644 --- a/snapshots/output/syntax/src/object-literals.ts +++ b/snapshots/output/syntax/src/object-literals.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`object-literals.ts`/ import { Configuration } from './reusable-types' diff --git a/snapshots/output/syntax/src/overload.d.ts b/snapshots/output/syntax/src/overload.d.ts index e57eedd9..a9749c98 100644 --- a/snapshots/output/syntax/src/overload.d.ts +++ b/snapshots/output/syntax/src/overload.d.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`overload.d.ts`/ export interface Overloader { diff --git a/snapshots/output/syntax/src/property-assignment-reference.ts b/snapshots/output/syntax/src/property-assignment-reference.ts index 06cfa23c..812a3ae1 100644 --- a/snapshots/output/syntax/src/property-assignment-reference.ts +++ b/snapshots/output/syntax/src/property-assignment-reference.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`property-assignment-reference.ts`/ import { diff --git a/snapshots/output/syntax/src/property-assignment.ts b/snapshots/output/syntax/src/property-assignment.ts index ce5a8531..26656820 100644 --- a/snapshots/output/syntax/src/property-assignment.ts +++ b/snapshots/output/syntax/src/property-assignment.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`property-assignment.ts`/ export function propertyAssignment() { diff --git a/snapshots/output/syntax/src/reusable-types.ts b/snapshots/output/syntax/src/reusable-types.ts index 38515b5c..d6884129 100644 --- a/snapshots/output/syntax/src/reusable-types.ts +++ b/snapshots/output/syntax/src/reusable-types.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`reusable-types.ts`/ // Reusable types for other snapshot tests diff --git a/snapshots/output/syntax/src/string-literals.ts b/snapshots/output/syntax/src/string-literals.ts index 90b385e9..165f6827 100644 --- a/snapshots/output/syntax/src/string-literals.ts +++ b/snapshots/output/syntax/src/string-literals.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`string-literals.ts`/ interface SomeInterface { diff --git a/snapshots/output/syntax/src/structural-type.ts b/snapshots/output/syntax/src/structural-type.ts index 54ac91c3..f1d2d440 100644 --- a/snapshots/output/syntax/src/structural-type.ts +++ b/snapshots/output/syntax/src/structural-type.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`structural-type.ts`/ export function foo(): Promise<{ member: number }> { diff --git a/snapshots/output/syntax/src/symbol-kinds.ts b/snapshots/output/syntax/src/symbol-kinds.ts index 5bfbd942..61c1716f 100644 --- a/snapshots/output/syntax/src/symbol-kinds.ts +++ b/snapshots/output/syntax/src/symbol-kinds.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`symbol-kinds.ts`/ //kind File diff --git a/snapshots/output/syntax/src/type-alias.ts b/snapshots/output/syntax/src/type-alias.ts index 0f23f64a..458fc140 100644 --- a/snapshots/output/syntax/src/type-alias.ts +++ b/snapshots/output/syntax/src/type-alias.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`type-alias.ts`/ type S = string diff --git a/snapshots/output/syntax/src/type-parameter.ts b/snapshots/output/syntax/src/type-parameter.ts index 99c7c5dd..e9e014ae 100644 --- a/snapshots/output/syntax/src/type-parameter.ts +++ b/snapshots/output/syntax/src/type-parameter.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`type-parameter.ts`/ export function typeParameter(parameter: A, parameter2: B): [A, B] { diff --git a/snapshots/output/syntax/src/typings.ts b/snapshots/output/syntax/src/typings.ts index 37cc4198..2e37cb69 100644 --- a/snapshots/output/syntax/src/typings.ts +++ b/snapshots/output/syntax/src/typings.ts @@ -1,3 +1,4 @@ +// language TypeScript // < definition syntax 1.0.0 src/`typings.ts`/ export function process() { diff --git a/src/ProjectIndexer.test.ts b/src/ProjectIndexer.test.ts index cfe61c1f..93848ba3 100644 --- a/src/ProjectIndexer.test.ts +++ b/src/ProjectIndexer.test.ts @@ -1,7 +1,7 @@ import { test } from 'uvu' import * as assert from 'uvu/assert' -import { prettyMilliseconds } from './ProjectIndexer' +import { languageForFileName, prettyMilliseconds } from './ProjectIndexer' function minute(x: number): number { return x * 60 * 1000 @@ -24,4 +24,17 @@ test('prettyMilliseconds', () => { assert.is(prettyMilliseconds(minute(5) + second(8) + 999), '5m 8s 999ms') }) +test('languageForFileName', () => { + assert.is(languageForFileName('index.ts'), 'TypeScript') + assert.is(languageForFileName('index.mts'), 'TypeScript') + assert.is(languageForFileName('index.cts'), 'TypeScript') + assert.is(languageForFileName('index.tsx'), 'TypeScriptReact') + assert.is(languageForFileName('index.js'), 'JavaScript') + assert.is(languageForFileName('index.mjs'), 'JavaScript') + assert.is(languageForFileName('index.cjs'), 'JavaScript') + assert.is(languageForFileName('index.jsx'), 'JavaScriptReact') + assert.is(languageForFileName('package.json'), 'JSON') + assert.is(languageForFileName('Component.svelte'), '') +}) + test.run() diff --git a/src/ProjectIndexer.ts b/src/ProjectIndexer.ts index b31b6455..d73ebb2f 100644 --- a/src/ProjectIndexer.ts +++ b/src/ProjectIndexer.ts @@ -130,6 +130,7 @@ export class ProjectIndexer { } } const document = new scip.scip.Document({ + language: languageForFileName(sourceFile.fileName), relative_path: path.relative(this.options.cwd, sourceFile.fileName), occurrences: [], }) @@ -171,6 +172,22 @@ export class ProjectIndexer { } } +export function languageForFileName(fileName: string): string { + // Document.language uses the exact names from SCIP's Language enum, not the + // lowercase language identifiers used by editors. + const extension = path.extname(fileName).toLowerCase() + if (extension === '.tsx') return 'TypeScriptReact' + if (extension === '.ts' || extension === '.mts' || extension === '.cts') { + return 'TypeScript' + } + if (extension === '.jsx') return 'JavaScriptReact' + if (extension === '.js' || extension === '.mjs' || extension === '.cjs') { + return 'JavaScript' + } + if (extension === '.json') return 'JSON' + return '' +} + export function prettyMilliseconds(milliseconds: number): string { let ms = Math.floor(milliseconds) let result = '' diff --git a/src/SnapshotTesting.ts b/src/SnapshotTesting.ts index 89e5c300..da810e8e 100644 --- a/src/SnapshotTesting.ts +++ b/src/SnapshotTesting.ts @@ -61,7 +61,7 @@ export function formatSnapshot( doc: scip.Document, externalSymbols: scip.SymbolInformation[] = [] ): string { - const out: string[] = [] + const out: string[] = [`${commentSyntax} language ${doc.language}\n`] const symbolTable = getSymbolTable(doc) const externalSymbolTable: Map = new Map() diff --git a/src/main.test.ts b/src/main.test.ts index 23b8b263..d0d9a887 100644 --- a/src/main.test.ts +++ b/src/main.test.ts @@ -75,6 +75,10 @@ for (const snapshotDirectory of snapshotDirectories) { throw new Error('empty LSIF index') } for (const document of index.documents) { + assert.ok( + document.language, + `${document.relative_path} should have a SCIP document language` + ) if (document.relative_path === 'src/symbol-kinds.ts') { assert.equal( document.symbols