forked from sveltejs/language-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Initially support - rename (doesn't work properly for all kinds of renames yet; need to filter out references inside generated code) - diagnostics - find references (need to filter out references inside generated code) This makes all files TSX hardcoded for now, it seems the TS server is okay with importing tsx into js sveltejs#580 sveltejs#550 sveltejs#342 sveltejs#110
- Loading branch information
Simon Holthausen
committed
May 3, 2021
1 parent
c676a77
commit c947c7e
Showing
14 changed files
with
1,188 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,3 @@ | ||
src/**/*.js | ||
src/**/*.d.ts | ||
src/tsconfig.tsbuildinfo | ||
dist | ||
node_modules | ||
tsconfig.tsbuildinfo |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
packages/typescript-plugin/src/language-service/diagnostics.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import type ts from 'typescript/lib/tsserverlibrary'; | ||
import { Logger } from '../logger'; | ||
import { isSvelteFilePath } from '../utils'; | ||
|
||
export function decorateDiagnostics(ls: ts.LanguageService, logger: Logger) { | ||
decorateSyntacticDiagnostics(ls); | ||
decorateSemanticDiagnostics(ls); | ||
decorateSuggestionDiagnostics(ls); | ||
return ls; | ||
} | ||
|
||
function decorateSyntacticDiagnostics(ls: ts.LanguageService): void { | ||
const getSyntacticDiagnostics = ls.getSyntacticDiagnostics; | ||
ls.getSyntacticDiagnostics = (fileName: string) => { | ||
// Diagnostics inside Svelte files are done | ||
// by the svelte-language-server / Svelte for VS Code extension | ||
if (isSvelteFilePath(fileName)) { | ||
return []; | ||
} | ||
return getSyntacticDiagnostics(fileName); | ||
}; | ||
} | ||
|
||
function decorateSemanticDiagnostics(ls: ts.LanguageService): void { | ||
const getSemanticDiagnostics = ls.getSemanticDiagnostics; | ||
ls.getSemanticDiagnostics = (fileName: string) => { | ||
// Diagnostics inside Svelte files are done | ||
// by the svelte-language-server / Svelte for VS Code extension | ||
if (isSvelteFilePath(fileName)) { | ||
return []; | ||
} | ||
return getSemanticDiagnostics(fileName); | ||
}; | ||
} | ||
|
||
function decorateSuggestionDiagnostics(ls: ts.LanguageService): void { | ||
const getSuggestionDiagnostics = ls.getSuggestionDiagnostics; | ||
ls.getSuggestionDiagnostics = (fileName: string) => { | ||
// Diagnostics inside Svelte files are done | ||
// by the svelte-language-server / Svelte for VS Code extension | ||
if (isSvelteFilePath(fileName)) { | ||
return []; | ||
} | ||
return getSuggestionDiagnostics(fileName); | ||
}; | ||
} |
95 changes: 95 additions & 0 deletions
95
packages/typescript-plugin/src/language-service/find-references.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
import type ts from 'typescript/lib/tsserverlibrary'; | ||
import { Logger } from '../logger'; | ||
import { SvelteSnapshotManager } from '../svelte-snapshots'; | ||
import { isNotNullOrUndefined, isSvelteFilePath } from '../utils'; | ||
|
||
export function decorateFindReferences( | ||
ls: ts.LanguageService, | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
): void { | ||
decorateGetReferencesAtPosition(ls, snapshotManager, logger); | ||
_decorateFindReferences(ls, snapshotManager, logger); | ||
} | ||
|
||
function _decorateFindReferences( | ||
ls: ts.LanguageService, | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
) { | ||
const findReferences = ls.findReferences; | ||
ls.findReferences = (fileName, position) => { | ||
const references = findReferences(fileName, position); | ||
return references | ||
?.map((reference) => { | ||
const snapshot = snapshotManager.get(reference.definition.fileName); | ||
if (!isSvelteFilePath(reference.definition.fileName) || !snapshot) { | ||
return reference; | ||
} | ||
|
||
const textSpan = snapshot.getOriginalTextSpan(reference.definition.textSpan); | ||
if (!textSpan) { | ||
return null; | ||
} | ||
|
||
return { | ||
definition: { | ||
...reference.definition, | ||
textSpan, | ||
// Spare the work for now | ||
originalTextSpan: undefined | ||
}, | ||
references: mapReferences(reference.references, snapshotManager, logger) | ||
}; | ||
}) | ||
.filter(isNotNullOrUndefined); | ||
}; | ||
} | ||
|
||
function decorateGetReferencesAtPosition( | ||
ls: ts.LanguageService, | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
) { | ||
const getReferencesAtPosition = ls.getReferencesAtPosition; | ||
ls.getReferencesAtPosition = (fileName, position) => { | ||
const references = getReferencesAtPosition(fileName, position); | ||
return references && mapReferences(references, snapshotManager, logger); | ||
}; | ||
} | ||
|
||
function mapReferences( | ||
references: ts.ReferenceEntry[], | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
): ts.ReferenceEntry[] { | ||
return references | ||
.map((reference) => { | ||
const snapshot = snapshotManager.get(reference.fileName); | ||
if (!isSvelteFilePath(reference.fileName) || !snapshot) { | ||
return reference; | ||
} | ||
|
||
const textSpan = snapshot.getOriginalTextSpan(reference.textSpan); | ||
if (!textSpan) { | ||
return null; | ||
} | ||
|
||
logger.debug( | ||
'Find references; map textSpan: changed', | ||
reference.textSpan, | ||
'to', | ||
textSpan | ||
); | ||
|
||
return { | ||
...reference, | ||
textSpan, | ||
// Spare the work for now | ||
contextSpan: undefined, | ||
originalTextSpan: undefined, | ||
originalContextSpan: undefined | ||
}; | ||
}) | ||
.filter(isNotNullOrUndefined); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import type ts from 'typescript/lib/tsserverlibrary'; | ||
import { Logger } from '../logger'; | ||
import { SvelteSnapshotManager } from '../svelte-snapshots'; | ||
import { decorateDiagnostics } from './diagnostics'; | ||
import { decorateFindReferences } from './find-references'; | ||
import { decorateRename } from './rename'; | ||
|
||
export function decorateLanguageService( | ||
ls: ts.LanguageService, | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
): ts.LanguageService { | ||
decorateRename(ls, snapshotManager, logger); | ||
decorateDiagnostics(ls, logger); | ||
decorateFindReferences(ls, snapshotManager, logger); | ||
return ls; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import type ts from 'typescript/lib/tsserverlibrary'; | ||
import { Logger } from '../logger'; | ||
import { SvelteSnapshotManager } from '../svelte-snapshots'; | ||
import { isNotNullOrUndefined, isSvelteFilePath } from '../utils'; | ||
|
||
export function decorateRename( | ||
ls: ts.LanguageService, | ||
snapshotManager: SvelteSnapshotManager, | ||
logger: Logger | ||
): void { | ||
const findRenameLocations = ls.findRenameLocations; | ||
ls.findRenameLocations = ( | ||
fileName, | ||
position, | ||
findInStrings, | ||
findInComments, | ||
providePrefixAndSuffixTextForRename | ||
) => { | ||
const renameLocations = findRenameLocations( | ||
fileName, | ||
position, | ||
findInStrings, | ||
findInComments, | ||
providePrefixAndSuffixTextForRename | ||
); | ||
return renameLocations | ||
?.map((renameLocation) => { | ||
const snapshot = snapshotManager.get(renameLocation.fileName); | ||
if (!isSvelteFilePath(renameLocation.fileName) || !snapshot) { | ||
return renameLocation; | ||
} | ||
|
||
// TODO more needed to filter invalid locations, see RenameProvider | ||
const start = snapshot.getOriginalOffset(renameLocation.textSpan.start); | ||
if (start === -1) { | ||
return null; | ||
} | ||
|
||
const converted = { | ||
...renameLocation, | ||
textSpan: { | ||
start: start, | ||
length: renameLocation.textSpan.length | ||
} | ||
}; | ||
if (converted.contextSpan) { | ||
// Not important, spare the work | ||
converted.contextSpan = undefined; | ||
} | ||
logger.debug('Converted rename location ', converted); | ||
return converted; | ||
}) | ||
.filter(isNotNullOrUndefined); | ||
}; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import type ts from 'typescript/lib/tsserverlibrary'; | ||
|
||
export class Logger { | ||
constructor( | ||
private tsLogService: ts.server.Logger, | ||
surpressNonSvelteLogs = false, | ||
private logDebug = false | ||
) { | ||
if (surpressNonSvelteLogs) { | ||
const log = this.tsLogService.info.bind(this.tsLogService); | ||
this.tsLogService.info = (s: string) => { | ||
if (s.startsWith('-Svelte Plugin-')) { | ||
log(s); | ||
} | ||
}; | ||
} | ||
} | ||
|
||
log(...args: any[]) { | ||
const str = args | ||
.map((arg) => { | ||
if (typeof arg === 'object') { | ||
try { | ||
return JSON.stringify(arg); | ||
} catch (e) { | ||
return '[object that cannot by stringified]'; | ||
} | ||
} | ||
return arg; | ||
}) | ||
.join(' '); | ||
this.tsLogService.info('-Svelte Plugin- ' + str); | ||
} | ||
|
||
debug(...args: any[]) { | ||
if (!this.logDebug) { | ||
return; | ||
} | ||
this.log(...args); | ||
} | ||
} |
Oops, something went wrong.