Declaration maps and transparent goto definition using them (#22658)

* Add compiler option to enable declaration sourcemaps

* Transparent goto definition for sourcemapped declaration files

* Post-rebase touchups

* Rename API methods

* Fix lints

* Fix typo in name XD

* Log sourcemap decode errors

* Share the cache more, but also invalidate it more

* Remove todo

* Enable mapping on go to implementation as well

* Allow fourslash to test declaration maps mroe easily

* more test

* Handle sourceRoot

* Add tests documenting current behavior with other sourcemapping flags

* Ignore inline options for declaration file maps, simplify dispatch in emitter

* Change program diagnostic

* Fix nit

* Use charCodeAt

* Rename internal methods + veriables

* Avoid filter

* span -> position

* Use character codes

* Dont parse our sourcemap names until we need to start using them

* zero-index parsed positions

* Handle sourceMappingURL comments, including base64 encoded ones

* Unittest b64 decoder, make mroe robust to handle unicode properly

* Fix lint

* declarationMaps -> declarationMap

* Even more feedback

* USE Mroe lenient combined regexp

* only match base64 characters

* Fix nit
This commit is contained in:
Wesley Wigham 2018-03-26 12:15:34 -07:00 committed by GitHub
parent fe8f239648
commit 6af764c560
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
83 changed files with 3473 additions and 87 deletions

View file

@ -115,6 +115,7 @@ var harnessCoreSources = [
});
var harnessSources = harnessCoreSources.concat([
"base64.ts",
"incrementalParser.ts",
"jsDocParsing.ts",
"services/colorization.ts",

View file

@ -194,6 +194,13 @@ namespace ts {
category: Diagnostics.Basic_Options,
description: Diagnostics.Generates_corresponding_d_ts_file,
},
{
name: "declarationMap",
type: "boolean",
showInSimplifiedHelpView: true,
category: Diagnostics.Basic_Options,
description: Diagnostics.Generates_a_sourcemap_for_each_corresponding_d_ts_file,
},
{
name: "emitDeclarationOnly",
type: "boolean",

View file

@ -2048,6 +2048,10 @@ namespace ts {
return moduleResolution;
}
export function getAreDeclarationMapsEnabled(options: CompilerOptions) {
return !!(options.declaration && options.declarationMap);
}
export function getAllowSyntheticDefaultImports(compilerOptions: CompilerOptions) {
const moduleKind = getEmitModuleKind(compilerOptions);
return compilerOptions.allowSyntheticDefaultImports !== undefined

View file

@ -2767,7 +2767,15 @@
"category": "Error",
"code": 5068
},
"Option '{0}' cannot be specified without specifying option '{1}' or option '{2}'.": {
"category": "Error",
"code": 5069
},
"Generates a sourcemap for each corresponding '.d.ts' file.": {
"category": "Message",
"code": 6000
},
"Concatenate and emit output to single file.": {
"category": "Message",
"code": 6001

View file

@ -49,7 +49,8 @@ namespace ts {
const jsFilePath = options.outFile || options.out;
const sourceMapFilePath = getSourceMapFilePath(jsFilePath, options);
const declarationFilePath = (forceDtsPaths || options.declaration) ? removeFileExtension(jsFilePath) + Extension.Dts : undefined;
return { jsFilePath, sourceMapFilePath, declarationFilePath };
const declarationMapPath = getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : undefined;
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath };
}
else {
const jsFilePath = getOwnEmitOutputFilePath(sourceFile, host, getOutputExtension(sourceFile, options));
@ -57,12 +58,13 @@ namespace ts {
// For legacy reasons (ie, we have baselines capturing the behavior), js files don't report a .d.ts output path - this would only matter if `declaration` and `allowJs` were both on, which is currently an error
const isJs = isSourceFileJavaScript(sourceFile);
const declarationFilePath = ((forceDtsPaths || options.declaration) && !isJs) ? getDeclarationEmitOutputFilePath(sourceFile, host) : undefined;
return { jsFilePath, sourceMapFilePath, declarationFilePath };
const declarationMapPath = getAreDeclarationMapsEnabled(options) ? declarationFilePath + ".map" : undefined;
return { jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath };
}
}
function getSourceMapFilePath(jsFilePath: string, options: CompilerOptions) {
return options.sourceMap ? jsFilePath + ".map" : undefined;
return (options.sourceMap && !options.inlineSourceMap) ? jsFilePath + ".map" : undefined;
}
// JavaScript files are always LanguageVariant.JSX, as JSX syntax is allowed in .js files also.
@ -88,12 +90,19 @@ namespace ts {
export function emitFiles(resolver: EmitResolver, host: EmitHost, targetSourceFile: SourceFile, emitOnlyDtsFiles?: boolean, transformers?: TransformerFactory<SourceFile>[]): EmitResult {
const compilerOptions = host.getCompilerOptions();
const moduleKind = getEmitModuleKind(compilerOptions);
const sourceMapDataList: SourceMapData[] = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
const sourceMapDataList: SourceMapData[] = (compilerOptions.sourceMap || compilerOptions.inlineSourceMap || getAreDeclarationMapsEnabled(compilerOptions)) ? [] : undefined;
const emittedFilesList: string[] = compilerOptions.listEmittedFiles ? [] : undefined;
const emitterDiagnostics = createDiagnosticCollection();
const newLine = host.getNewLine();
const writer = createTextWriter(newLine);
const sourceMap = createSourceMapWriter(host, writer);
const declarationSourceMap = createSourceMapWriter(host, writer, {
sourceMap: compilerOptions.declarationMap,
sourceRoot: compilerOptions.sourceRoot,
mapRoot: compilerOptions.mapRoot,
extendedDiagnostics: compilerOptions.extendedDiagnostics,
// Explicitly do not passthru either `inline` option
});
let currentSourceFile: SourceFile;
let bundledHelpers: Map<boolean>;
@ -113,9 +122,9 @@ namespace ts {
sourceMaps: sourceMapDataList
};
function emitSourceFileOrBundle({ jsFilePath, sourceMapFilePath, declarationFilePath }: EmitFileNames, sourceFileOrBundle: SourceFile | Bundle) {
function emitSourceFileOrBundle({ jsFilePath, sourceMapFilePath, declarationFilePath, declarationMapPath }: EmitFileNames, sourceFileOrBundle: SourceFile | Bundle) {
emitJsFileOrBundle(sourceFileOrBundle, jsFilePath, sourceMapFilePath);
emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath);
emitDeclarationFileOrBundle(sourceFileOrBundle, declarationFilePath, declarationMapPath);
if (!emitSkipped && emittedFilesList) {
if (!emitOnlyDtsFiles) {
@ -162,13 +171,13 @@ namespace ts {
onSetSourceFile: setSourceFile,
});
printSourceFileOrBundle(jsFilePath, sourceMapFilePath, isSourceFile(sourceFileOrBundle) ? transform.transformed[0] : createBundle(transform.transformed), printer);
printSourceFileOrBundle(jsFilePath, sourceMapFilePath, isSourceFile(sourceFileOrBundle) ? transform.transformed[0] : createBundle(transform.transformed), printer, sourceMap);
// Clean up emit nodes on parse tree
transform.dispose();
}
function emitDeclarationFileOrBundle(sourceFileOrBundle: SourceFile | Bundle, declarationFilePath: string | undefined) {
function emitDeclarationFileOrBundle(sourceFileOrBundle: SourceFile | Bundle, declarationFilePath: string | undefined, declarationMapPath: string | undefined) {
if (!(declarationFilePath && !isInJavaScriptFile(sourceFileOrBundle))) {
return;
}
@ -186,6 +195,12 @@ namespace ts {
// resolver hooks
hasGlobalName: resolver.hasGlobalName,
// sourcemap hooks
onEmitSourceMapOfNode: declarationSourceMap.emitNodeWithSourceMap,
onEmitSourceMapOfToken: declarationSourceMap.emitTokenWithSourceMap,
onEmitSourceMapOfPosition: declarationSourceMap.emitPos,
onSetSourceFile: setSourceFileForDeclarationSourceMaps,
// transform hooks
onEmitNode: declarationTransform.emitNodeWithNotification,
substituteNode: declarationTransform.substituteNode,
@ -193,18 +208,16 @@ namespace ts {
const declBlocked = (!!declarationTransform.diagnostics && !!declarationTransform.diagnostics.length) || !!host.isEmitBlocked(declarationFilePath) || !!compilerOptions.noEmit;
emitSkipped = emitSkipped || declBlocked;
if (!declBlocked || emitOnlyDtsFiles) {
const previousState = sourceMap.setState(/*disabled*/ true);
printSourceFileOrBundle(declarationFilePath, /*sourceMapFilePath*/ undefined, declarationTransform.transformed[0], declarationPrinter, /*shouldSkipSourcemap*/ true);
sourceMap.setState(previousState);
printSourceFileOrBundle(declarationFilePath, declarationMapPath, declarationTransform.transformed[0], declarationPrinter, declarationSourceMap);
}
declarationTransform.dispose();
}
function printSourceFileOrBundle(jsFilePath: string, sourceMapFilePath: string, sourceFileOrBundle: SourceFile | Bundle, printer: Printer, shouldSkipSourcemap = false) {
function printSourceFileOrBundle(jsFilePath: string, sourceMapFilePath: string | undefined, sourceFileOrBundle: SourceFile | Bundle, printer: Printer, mapRecorder: SourceMapWriter) {
const bundle = sourceFileOrBundle.kind === SyntaxKind.Bundle ? sourceFileOrBundle : undefined;
const sourceFile = sourceFileOrBundle.kind === SyntaxKind.SourceFile ? sourceFileOrBundle : undefined;
const sourceFiles = bundle ? bundle.sourceFiles : [sourceFile];
sourceMap.initialize(jsFilePath, sourceMapFilePath, sourceFileOrBundle);
mapRecorder.initialize(jsFilePath, sourceMapFilePath || "", sourceFileOrBundle, sourceMapDataList);
if (bundle) {
bundledHelpers = createMap<boolean>();
@ -218,26 +231,21 @@ namespace ts {
writer.writeLine();
const sourceMappingURL = sourceMap.getSourceMappingURL();
if (!shouldSkipSourcemap && sourceMappingURL) {
const sourceMappingURL = mapRecorder.getSourceMappingURL();
if (sourceMappingURL) {
writer.write(`//# ${"sourceMappingURL"}=${sourceMappingURL}`); // Sometimes tools can sometimes see this line as a source mapping url comment
}
// Write the source map
if (!shouldSkipSourcemap && compilerOptions.sourceMap && !compilerOptions.inlineSourceMap) {
writeFile(host, emitterDiagnostics, sourceMapFilePath, sourceMap.getText(), /*writeByteOrderMark*/ false, sourceFiles);
}
// Record source map data for the test harness.
if (!shouldSkipSourcemap && sourceMapDataList) {
sourceMapDataList.push(sourceMap.getSourceMapData());
if (sourceMapFilePath) {
writeFile(host, emitterDiagnostics, sourceMapFilePath, mapRecorder.getText(), /*writeByteOrderMark*/ false, sourceFiles);
}
// Write the output file
writeFile(host, emitterDiagnostics, jsFilePath, writer.getText(), compilerOptions.emitBOM, sourceFiles);
// Reset state
sourceMap.reset();
mapRecorder.reset();
writer.clear();
currentSourceFile = undefined;
@ -250,6 +258,11 @@ namespace ts {
sourceMap.setSourceFile(node);
}
function setSourceFileForDeclarationSourceMaps(node: SourceFile) {
currentSourceFile = node;
declarationSourceMap.setSourceFile(node);
}
function emitHelpers(node: Node, writeLines: (text: string) => void) {
let helpersEmitted = false;
const bundle = node.kind === SyntaxKind.Bundle ? <Bundle>node : undefined;

View file

@ -2113,9 +2113,9 @@ namespace ts {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "outFile");
}
if (options.mapRoot && !options.sourceMap) {
if (options.mapRoot && !(options.sourceMap || options.declarationMap)) {
// Error to specify --mapRoot without --sourcemap
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "mapRoot", "sourceMap");
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1_or_option_2, "mapRoot", "sourceMap", "declarationMap");
}
if (options.declarationDir) {
@ -2127,6 +2127,10 @@ namespace ts {
}
}
if (options.declarationMap && !options.declaration) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "declarationMap", "declaration");
}
if (options.lib && options.noLib) {
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_with_option_1, "lib", "noLib");
}
@ -2301,21 +2305,21 @@ namespace ts {
return emptyArray;
}
function createDiagnosticForOptionName(message: DiagnosticMessage, option1: string, option2?: string) {
createDiagnosticForOption(/*onKey*/ true, option1, option2, message, option1, option2);
function createDiagnosticForOptionName(message: DiagnosticMessage, option1: string, option2?: string, option3?: string) {
createDiagnosticForOption(/*onKey*/ true, option1, option2, message, option1, option2, option3);
}
function createOptionValueDiagnostic(option1: string, message: DiagnosticMessage, arg0: string) {
createDiagnosticForOption(/*onKey*/ false, option1, /*option2*/ undefined, message, arg0);
}
function createDiagnosticForOption(onKey: boolean, option1: string, option2: string, message: DiagnosticMessage, arg0: string | number, arg1?: string | number) {
function createDiagnosticForOption(onKey: boolean, option1: string, option2: string, message: DiagnosticMessage, arg0: string | number, arg1?: string | number, arg2?: string | number) {
const compilerOptionsObjectLiteralSyntax = getCompilerOptionsObjectLiteralSyntax();
const needCompilerDiagnostic = !compilerOptionsObjectLiteralSyntax ||
!createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, arg0, arg1);
!createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, arg0, arg1, arg2);
if (needCompilerDiagnostic) {
programDiagnostics.add(createCompilerDiagnostic(message, arg0, arg1));
programDiagnostics.add(createCompilerDiagnostic(message, arg0, arg1, arg2));
}
}
@ -2334,10 +2338,10 @@ namespace ts {
return _compilerOptionsObjectLiteralSyntax;
}
function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral: ObjectLiteralExpression, onKey: boolean, key1: string, key2: string, message: DiagnosticMessage, arg0: string | number, arg1?: string | number): boolean {
function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral: ObjectLiteralExpression, onKey: boolean, key1: string, key2: string, message: DiagnosticMessage, arg0: string | number, arg1?: string | number, arg2?: string | number): boolean {
const props = getPropertyAssignment(objectLiteral, key1, key2);
for (const prop of props) {
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, arg0, arg1));
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile, onKey ? prop.name : prop.initializer, message, arg0, arg1, arg2));
}
return !!props.length;
}

View file

@ -330,7 +330,7 @@ namespace ts {
return result;
}
export function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number {
export function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number {
return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character, sourceFile.text);
}

View file

@ -10,7 +10,7 @@ namespace ts {
* @param sourceMapFilePath The path to the output source map file.
* @param sourceFileOrBundle The input source file or bundle for the program.
*/
initialize(filePath: string, sourceMapFilePath: string, sourceFileOrBundle: SourceFile | Bundle): void;
initialize(filePath: string, sourceMapFilePath: string, sourceFileOrBundle: SourceFile | Bundle, sourceMapOutput?: SourceMapData[]): void;
/**
* Reset the SourceMapWriter to an empty state.
@ -62,16 +62,6 @@ namespace ts {
* Gets the SourceMappingURL for the source map.
*/
getSourceMappingURL(): string;
/**
* Gets test data for source maps.
*/
getSourceMapData(): SourceMapData;
/**
* @returns the previous disabled state
*/
setState(disabled: boolean): boolean;
}
// Used for initialize lastEncodedSourceMapSpan and reset lastEncodedSourceMapSpan when updateLastEncodedAndRecordedSpans
@ -83,8 +73,16 @@ namespace ts {
sourceIndex: 0
};
export function createSourceMapWriter(host: EmitHost, writer: EmitTextWriter): SourceMapWriter {
const compilerOptions = host.getCompilerOptions();
export interface SourceMapOptions {
sourceMap?: boolean;
inlineSourceMap?: boolean;
inlineSources?: boolean;
sourceRoot?: string;
mapRoot?: string;
extendedDiagnostics?: boolean;
}
export function createSourceMapWriter(host: EmitHost, writer: EmitTextWriter, compilerOptions: SourceMapOptions = host.getCompilerOptions()): SourceMapWriter {
const extendedDiagnostics = compilerOptions.extendedDiagnostics;
let currentSource: SourceMapSource;
let currentSourceText: string;
@ -100,27 +98,20 @@ namespace ts {
// Source map data
let sourceMapData: SourceMapData;
let sourceMapDataList: SourceMapData[];
let disabled: boolean = !(compilerOptions.sourceMap || compilerOptions.inlineSourceMap);
return {
initialize,
reset,
getSourceMapData: () => sourceMapData,
setSourceFile,
emitPos,
emitNodeWithSourceMap,
emitTokenWithSourceMap,
getText,
getSourceMappingURL,
setState,
};
function setState(state: boolean) {
const last = disabled;
disabled = state;
return last;
}
/**
* Skips trivia such as comments and white-space that can optionally overriden by the source map source
*/
@ -135,7 +126,7 @@ namespace ts {
* @param sourceMapFilePath The path to the output source map file.
* @param sourceFileOrBundle The input source file or bundle for the program.
*/
function initialize(filePath: string, sourceMapFilePath: string, sourceFileOrBundle: SourceFile | Bundle) {
function initialize(filePath: string, sourceMapFilePath: string, sourceFileOrBundle: SourceFile | Bundle, outputSourceMapDataList?: SourceMapData[]) {
if (disabled) {
return;
}
@ -143,6 +134,7 @@ namespace ts {
if (sourceMapData) {
reset();
}
sourceMapDataList = outputSourceMapDataList;
currentSource = undefined;
currentSourceText = undefined;
@ -211,6 +203,11 @@ namespace ts {
return;
}
// Record source map data for the test harness.
if (sourceMapDataList) {
sourceMapDataList.push(sourceMapData);
}
currentSource = undefined;
sourceMapDir = undefined;
sourceMapSourceIndex = undefined;
@ -218,6 +215,7 @@ namespace ts {
lastEncodedSourceMapSpan = undefined;
lastEncodedNameIndex = undefined;
sourceMapData = undefined;
sourceMapDataList = undefined;
}
// Encoding for sourcemap span
@ -477,7 +475,7 @@ namespace ts {
if (compilerOptions.inlineSourceMap) {
// Encode the sourceMap into the sourceMap url
const base64SourceMapText = convertToBase64(getText());
const base64SourceMapText = base64encode(sys, getText());
return sourceMapData.jsSourceMappingURL = `data:application/json;base64,${base64SourceMapText}`;
}
else {

View file

@ -457,6 +457,8 @@ namespace ts {
clearTimeout?(timeoutId: any): void;
clearScreen?(): void;
/*@internal*/ setBlocking?(): void;
base64decode?(input: string): string;
base64encode?(input: string): string;
}
export interface FileWatcher {
@ -528,6 +530,11 @@ namespace ts {
_crypto = undefined;
}
const Buffer: {
new (input: string, encoding?: string): any;
from?(input: string, encoding?: string): any;
} = require("buffer").Buffer;
const nodeVersion = getNodeMajorVersion();
const isNode4OrLater = nodeVersion >= 4;
@ -620,6 +627,16 @@ namespace ts {
if (process.stdout && process.stdout._handle && process.stdout._handle.setBlocking) {
process.stdout._handle.setBlocking(true);
}
},
base64decode: Buffer.from ? input => {
return Buffer.from(input, "base64").toString("utf8");
} : input => {
return new Buffer(input, "base64").toString("utf8");
},
base64encode: Buffer.from ? input => {
return Buffer.from(input).toString("base64");
} : input => {
return new Buffer(input).toString("base64");
}
};
return nodeSystem;

View file

@ -4105,6 +4105,7 @@ namespace ts {
/** configFile is set as non enumerable property so as to avoid checking of json source files */
/* @internal */ readonly configFile?: JsonSourceFile;
declaration?: boolean;
declarationMap?: boolean;
emitDeclarationOnly?: boolean;
declarationDir?: string;
/* @internal */ diagnostics?: boolean;

View file

@ -2834,8 +2834,9 @@ namespace ts {
export interface EmitFileNames {
jsFilePath: string;
sourceMapFilePath: string;
declarationFilePath: string;
sourceMapFilePath: string | undefined;
declarationFilePath: string | undefined;
declarationMapPath: string | undefined;
}
/**
@ -3413,7 +3414,7 @@ namespace ts {
for (let i = 0; i < length; i++) {
const charCode = input.charCodeAt(i);
// handel utf8
// handle utf8
if (charCode < 0x80) {
output.push(charCode);
}
@ -3478,6 +3479,82 @@ namespace ts {
return result;
}
function getStringFromExpandedCharCodes(codes: number[]): string {
let output = "";
let i = 0;
const length = codes.length;
while (i < length) {
const charCode = codes[i];
if (charCode < 0x80) {
output += String.fromCharCode(charCode);
i++;
}
else if ((charCode & 0B11000000) === 0B11000000) {
let value = charCode & 0B00111111;
i++;
let nextCode: number = codes[i];
while ((nextCode & 0B11000000) === 0B10000000) {
value = (value << 6) | (nextCode & 0B00111111);
i++;
nextCode = codes[i];
}
// `value` may be greater than 10FFFF (the maximum unicode codepoint) - JS will just make this into an invalid character for us
output += String.fromCharCode(value);
}
else {
// We don't want to kill the process when decoding fails (due to a following char byte not
// following a leading char), so we just print the (bad) value
output += String.fromCharCode(charCode);
i++;
}
}
return output;
}
export function base64encode(host: { base64encode?(input: string): string }, input: string): string {
if (host.base64encode) {
return host.base64encode(input);
}
return convertToBase64(input);
}
export function base64decode(host: { base64decode?(input: string): string }, input: string): string {
if (host.base64decode) {
return host.base64decode(input);
}
const length = input.length;
const expandedCharCodes: number[] = [];
let i = 0;
while (i < length) {
// Stop decoding once padding characters are present
if (input.charCodeAt(i) === base64Digits.charCodeAt(64)) {
break;
}
// convert 4 input digits into three characters, ignoring padding characters at the end
const ch1 = base64Digits.indexOf(input[i]);
const ch2 = base64Digits.indexOf(input[i + 1]);
const ch3 = base64Digits.indexOf(input[i + 2]);
const ch4 = base64Digits.indexOf(input[i + 3]);
const code1 = ((ch1 & 0B00111111) << 2) | ((ch2 >> 4) & 0B00000011);
const code2 = ((ch2 & 0B00001111) << 4) | ((ch3 >> 2) & 0B00001111);
const code3 = ((ch3 & 0B00000011) << 6) | (ch4 & 0B00111111);
if (code2 === 0 && ch3 !== 0) { // code2 decoded to zero, but ch3 was padding - elide code2 and code3
expandedCharCodes.push(code1);
}
else if (code3 === 0 && ch4 !== 0) { // code3 decoded to zero, but ch4 was padding, elide code3
expandedCharCodes.push(code1, code2);
}
else {
expandedCharCodes.push(code1, code2, code3);
}
i += 4;
}
return getStringFromExpandedCharCodes(expandedCharCodes);
}
const carriageReturnLineFeed = "\r\n";
const lineFeed = "\n";
export function getNewLineCharacter(options: CompilerOptions | PrinterOptions, getNewLine?: () => string): string {

View file

@ -148,7 +148,7 @@ class CompilerBaselineRunner extends RunnerBase {
// Source maps?
it("Correct sourcemap content for " + fileName, () => {
if (options.sourceMap || options.inlineSourceMap) {
if (options.sourceMap || options.inlineSourceMap || options.declarationMap) {
Harness.Baseline.runBaseline(justName.replace(/\.tsx?$/, ".sourcemap.txt"), () => {
const record = result.getSourceMapRecord();
if ((options.noEmitOnError && result.errors.length !== 0) || record === undefined) {

View file

@ -1600,7 +1600,7 @@ Actual: ${stringify(fullActual)}`);
});
}
public baselineGetEmitOutput() {
public baselineGetEmitOutput(insertResultsIntoVfs?: boolean) {
// Find file to be emitted
const emitFiles: FourSlashFile[] = []; // List of FourSlashFile that has emitThisFile flag on
@ -1649,6 +1649,9 @@ Actual: ${stringify(fullActual)}`);
for (const outputFile of emitOutput.outputFiles) {
const fileName = "FileName : " + outputFile.name + Harness.IO.newLine();
resultString = resultString + fileName + outputFile.text;
if (insertResultsIntoVfs) {
this.languageServiceAdapterHost.addScript(ts.getNormalizedAbsolutePath(outputFile.name, "/"), outputFile.text, /*isRootFile*/ true);
}
}
resultString += Harness.IO.newLine();
});
@ -4154,8 +4157,8 @@ namespace FourSlashInterface {
this.state.baselineCurrentFileNameOrDottedNameSpans();
}
public baselineGetEmitOutput() {
this.state.baselineGetEmitOutput();
public baselineGetEmitOutput(insertResultsIntoVfs?: boolean) {
this.state.baselineGetEmitOutput(insertResultsIntoVfs);
}
public baselineQuickInfo() {

View file

@ -1632,14 +1632,15 @@ namespace Harness {
}
export function doSourcemapBaseline(baselinePath: string, options: ts.CompilerOptions, result: CompilerResult, harnessSettings: TestCaseParser.CompilerSettings) {
const declMaps = ts.getAreDeclarationMapsEnabled(options);
if (options.inlineSourceMap) {
if (result.sourceMaps.length > 0) {
if (result.sourceMaps.length > 0 && !declMaps) {
throw new Error("No sourcemap files should be generated if inlineSourceMaps was set.");
}
return;
}
else if (options.sourceMap) {
if (result.sourceMaps.length !== result.files.length) {
else if (options.sourceMap || declMaps) {
if (result.sourceMaps.length !== (result.files.length * (declMaps && options.sourceMap ? 2 : 1))) {
throw new Error("Number of sourcemap files should be same as js files.");
}
@ -1806,6 +1807,10 @@ namespace Harness {
return ts.endsWith(fileName, ".js.map") || ts.endsWith(fileName, ".jsx.map");
}
export function isDTSMap(fileName: string) {
return ts.endsWith(fileName, ".d.ts.map");
}
/** Contains the code and errors of a compilation and some helper methods to check its status. */
export class CompilerResult {
public files: GeneratedFile[] = [];
@ -1826,7 +1831,7 @@ namespace Harness {
// .js file, add to files
this.files.push(emittedFile);
}
else if (isJSMap(emittedFile.fileName)) {
else if (isJSMap(emittedFile.fileName) || isDTSMap(emittedFile.fileName)) {
this.sourceMaps.push(emittedFile);
}
else {
@ -1839,7 +1844,7 @@ namespace Harness {
public getSourceMapRecord() {
if (this.sourceMapData && this.sourceMapData.length > 0) {
return SourceMapRecorder.getSourceMapRecord(this.sourceMapData, this.program, this.files);
return SourceMapRecorder.getSourceMapRecord(this.sourceMapData, this.program, this.files, this.declFilesCode);
}
}
}

View file

@ -434,14 +434,31 @@ namespace Harness.SourceMapRecorder {
}
}
export function getSourceMapRecord(sourceMapDataList: ts.SourceMapData[], program: ts.Program, jsFiles: Compiler.GeneratedFile[]) {
export function getSourceMapRecord(sourceMapDataList: ts.SourceMapData[], program: ts.Program, jsFiles: Compiler.GeneratedFile[], declarationFiles: Compiler.GeneratedFile[]) {
const sourceMapRecorder = new Compiler.WriterAggregator();
for (let i = 0; i < sourceMapDataList.length; i++) {
const sourceMapData = sourceMapDataList[i];
let prevSourceFile: ts.SourceFile;
let currentFile: Compiler.GeneratedFile;
if (ts.endsWith(sourceMapData.sourceMapFile, ts.Extension.Dts)) {
if (sourceMapDataList.length > jsFiles.length) {
currentFile = declarationFiles[Math.floor(i / 2)]; // When both kinds of source map are present, they alternate js/dts
}
else {
currentFile = declarationFiles[i];
}
}
else {
if (sourceMapDataList.length > jsFiles.length) {
currentFile = jsFiles[Math.floor(i / 2)];
}
else {
currentFile = jsFiles[i];
}
}
SourceMapSpanWriter.initializeSourceMapSpanWriter(sourceMapRecorder, sourceMapData, jsFiles[i]);
SourceMapSpanWriter.initializeSourceMapSpanWriter(sourceMapRecorder, sourceMapData, currentFile);
for (const decodedSourceMapping of sourceMapData.sourceMapDecodedMappings) {
const currentSourceFile = program.getSourceFile(sourceMapData.inputSourceFileNames[decodedSourceMapping.sourceIndex]);
if (currentSourceFile !== prevSourceFile) {

View file

@ -95,6 +95,7 @@
"../server/session.ts",
"../server/client.ts",
"../server/editorServices.ts",
"./unittests/base64.ts",
"./unittests/incrementalParser.ts",
"./unittests/jsDocParsing.ts",
"./unittests/services/colorization.ts",

View file

@ -0,0 +1,23 @@
/// <reference path="../harness.ts" />
namespace ts {
describe("base64", () => {
describe("base64decode", () => {
it("can decode input strings correctly without needing a host implementation", () => {
const tests = [
// "a",
// "this is a test",
// " !\"#$ %&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",
"日本語",
"🐱",
"\x00\x01",
"\t\n\r\\\"\'\u0062",
"====",
"",
];
for (const test of tests) {
assert.equal(base64decode({}, convertToBase64(test)), test);
}
});
});
});
}

View file

@ -30,6 +30,7 @@
/// <reference path='refactorProvider.ts' />
/// <reference path='codefixes\fixes.ts' />
/// <reference path='refactors\refactors.ts' />
/// <reference path="sourcemaps.ts" />
namespace ts {
/** The version of the language service API */
@ -1169,6 +1170,35 @@ namespace ts {
}
}
/* @internal */
export interface SourceFileLikeCache {
get(path: Path): SourceFileLike | undefined;
}
/* @internal */
export function createSourceFileLikeCache(host: { readFile?: (path: string) => string, fileExists?: (path: string) => boolean }): SourceFileLikeCache {
const cached = createMap<SourceFileLike>();
return {
get(path: Path) {
if (cached.has(path)) {
return cached.get(path);
}
if (!host.fileExists || !host.readFile || !host.fileExists(path)) return;
// And failing that, check the disk
const text = host.readFile(path);
const file: SourceFileLike = {
text,
lineMap: undefined,
getLineAndCharacterOfPosition(pos) {
return computeLineAndCharacterOfPosition(getLineStarts(this), pos);
}
};
cached.set(path, file);
return file;
}
};
}
export function createLanguageService(host: LanguageServiceHost,
documentRegistry: DocumentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory())): LanguageService {
@ -1186,6 +1216,8 @@ namespace ts {
localizedDiagnosticMessages = host.getLocalizedDiagnosticMessages();
}
let sourcemappedFileCache: SourceFileLikeCache;
function log(message: string) {
if (host.log) {
host.log(message);
@ -1293,6 +1325,11 @@ namespace ts {
// It needs to be cleared to allow all collected snapshots to be released
hostCache = undefined;
// We reset this cache on structure invalidation so we don't hold on to outdated files for long; however we can't use the `compilerHost` above,
// Because it only functions until `hostCache` is cleared, while we'll potentially need the functionality to lazily read sourcemap files during
// the course of whatever called `synchronizeHostData`
sourcemappedFileCache = createSourceFileLikeCache(host);
// Make sure all the nodes in the program are both bound, and have their parent
// pointers set property.
program.getTypeChecker();
@ -1543,26 +1580,168 @@ namespace ts {
return checker.getSymbolAtLocation(node);
}
const sourceMapCommentRegExp = /^\/\/[@#] sourceMappingURL=(.+)$/gm;
const base64UrlRegExp = /^data:(?:application\/json(?:;charset=[uU][tT][fF]-8);base64,([A-Za-z0-9+\/=]+)$)?/;
function scanForSourcemapURL(fileName: string) {
const mappedFile = sourcemappedFileCache.get(toPath(fileName, currentDirectory, getCanonicalFileName));
if (!mappedFile) {
return;
}
const starts = getLineStarts(mappedFile);
for (let index = starts.length - 1; index >= 0; index--) {
sourceMapCommentRegExp.lastIndex = starts[index];
const comment = sourceMapCommentRegExp.exec(mappedFile.text);
if (comment) {
return comment[1];
}
}
}
function convertDocumentToSourceMapper(file: { sourceMapper?: sourcemaps.SourceMapper }, contents: string, mapFileName: string) {
let maps: sourcemaps.SourceMapData;
try {
maps = JSON.parse(contents);
}
catch {
// swallow error
}
if (!maps || !maps.sources || !maps.file || !maps.mappings) {
// obviously invalid map
return file.sourceMapper = sourcemaps.identitySourceMapper;
}
return file.sourceMapper = sourcemaps.decode({
readFile: s => host.readFile(s),
fileExists: s => host.fileExists(s),
getCanonicalFileName,
log,
}, mapFileName, maps, program, sourcemappedFileCache);
}
function getSourceMapper(fileName: string, file: { sourceMapper?: sourcemaps.SourceMapper }) {
if (!host.readFile || !host.fileExists) {
return file.sourceMapper = sourcemaps.identitySourceMapper;
}
if (file.sourceMapper) {
return file.sourceMapper;
}
let mapFileName = scanForSourcemapURL(fileName);
if (mapFileName) {
const match = base64UrlRegExp.exec(mapFileName);
if (match) {
if (match[1]) {
const base64Object = match[1];
return convertDocumentToSourceMapper(file, base64decode(sys, base64Object), fileName);
}
// Not a data URL we can parse, skip it
mapFileName = undefined;
}
}
const possibleMapLocations: string[] = [];
if (mapFileName) {
possibleMapLocations.push(mapFileName);
}
possibleMapLocations.push(fileName + ".map");
for (const location of possibleMapLocations) {
const mapPath = toPath(location, getDirectoryPath(fileName), getCanonicalFileName);
if (host.fileExists(mapPath)) {
return convertDocumentToSourceMapper(file, host.readFile(mapPath), mapPath);
}
}
return file.sourceMapper = sourcemaps.identitySourceMapper;
}
function makeGetTargetOfMappedPosition<TIn>(
extract: (original: TIn) => sourcemaps.SourceMappableLocation,
create: (result: sourcemaps.SourceMappableLocation, original: TIn) => TIn
) {
return getTargetOfMappedPosition;
function getTargetOfMappedPosition(input: TIn): TIn {
const info = extract(input);
if (endsWith(info.fileName, Extension.Dts)) {
let file: SourceFileLike = program.getSourceFile(info.fileName);
if (!file) {
const path = toPath(info.fileName, currentDirectory, getCanonicalFileName);
file = sourcemappedFileCache.get(path);
}
if (!file) {
return input;
}
const mapper = getSourceMapper(info.fileName, file);
const newLoc = mapper.getOriginalPosition(info);
if (newLoc === info) return input;
return getTargetOfMappedPosition(create(newLoc, input));
}
return input;
}
}
const getTargetOfMappedDeclarationInfo = makeGetTargetOfMappedPosition(
(info: DefinitionInfo) => ({ fileName: info.fileName, position: info.textSpan.start }),
(newLoc, info) => ({
containerKind: info.containerKind,
containerName: info.containerName,
fileName: newLoc.fileName,
kind: info.kind,
name: info.name,
textSpan: {
start: newLoc.position,
length: info.textSpan.length
}
})
);
function getTargetOfMappedDeclarationFiles(infos: ReadonlyArray<DefinitionInfo>): DefinitionInfo[] {
return map(infos, getTargetOfMappedDeclarationInfo);
}
/// Goto definition
function getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] {
synchronizeHostData();
return GoToDefinition.getDefinitionAtPosition(program, getValidSourceFile(fileName), position);
return getTargetOfMappedDeclarationFiles(GoToDefinition.getDefinitionAtPosition(program, getValidSourceFile(fileName), position));
}
function getDefinitionAndBoundSpan(fileName: string, position: number): DefinitionInfoAndBoundSpan {
synchronizeHostData();
return GoToDefinition.getDefinitionAndBoundSpan(program, getValidSourceFile(fileName), position);
const result = GoToDefinition.getDefinitionAndBoundSpan(program, getValidSourceFile(fileName), position);
if (!result) return result;
const mappedDefs = getTargetOfMappedDeclarationFiles(result.definitions);
if (mappedDefs === result.definitions) {
return result;
}
return {
definitions: mappedDefs,
textSpan: result.textSpan
};
}
function getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] {
synchronizeHostData();
return GoToDefinition.getTypeDefinitionAtPosition(program.getTypeChecker(), getValidSourceFile(fileName), position);
return getTargetOfMappedDeclarationFiles(GoToDefinition.getTypeDefinitionAtPosition(program.getTypeChecker(), getValidSourceFile(fileName), position));
}
/// Goto implementation
const getTargetOfMappedImplementationLocation = makeGetTargetOfMappedPosition(
(info: ImplementationLocation) => ({ fileName: info.fileName, position: info.textSpan.start }),
(newLoc, info) => ({
fileName: newLoc.fileName,
kind: info.kind,
displayParts: info.displayParts,
textSpan: {
start: newLoc.position,
length: info.textSpan.length
}
})
);
function getTargetOfMappedImplementationLocations(infos: ReadonlyArray<ImplementationLocation>): ImplementationLocation[] {
return map(infos, getTargetOfMappedImplementationLocation);
}
function getImplementationAtPosition(fileName: string, position: number): ImplementationLocation[] {
synchronizeHostData();
return FindAllReferences.getImplementationsAtPosition(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position);
return getTargetOfMappedImplementationLocations(FindAllReferences.getImplementationsAtPosition(program, cancellationToken, program.getSourceFiles(), getValidSourceFile(fileName), position));
}
/// References and Occurrences

330
src/services/sourcemaps.ts Normal file
View file

@ -0,0 +1,330 @@
/* @internal */
namespace ts.sourcemaps {
export interface SourceMapData {
version?: number;
file?: string;
sourceRoot?: string;
sources: string[];
sourcesContent?: string[];
names?: string[];
mappings: string;
}
export interface SourceMappableLocation {
fileName: string;
position: number;
}
export interface SourceMapper {
getOriginalPosition(input: SourceMappableLocation): SourceMappableLocation;
getGeneratedPosition(input: SourceMappableLocation): SourceMappableLocation;
}
export const identitySourceMapper = { getOriginalPosition: identity, getGeneratedPosition: identity };
export interface SourceMapDecodeHost {
readFile(path: string): string;
fileExists(path: string): boolean;
getCanonicalFileName(path: string): string;
log(text: string): void;
}
export function decode(host: SourceMapDecodeHost, mapPath: string, map: SourceMapData, program?: Program, fallbackCache = createSourceFileLikeCache(host)): SourceMapper {
const currentDirectory = getDirectoryPath(mapPath);
const sourceRoot = map.sourceRoot || currentDirectory;
let decodedMappings: ProcessedSourceMapPosition[];
let generatedOrderedMappings: ProcessedSourceMapPosition[];
let sourceOrderedMappings: ProcessedSourceMapPosition[];
return {
getOriginalPosition,
getGeneratedPosition
};
function getGeneratedPosition(loc: SourceMappableLocation): SourceMappableLocation {
const maps = getGeneratedOrderedMappings();
if (!length(maps)) return loc;
let targetIndex = binarySearch(maps, { sourcePath: loc.fileName, sourcePosition: loc.position }, identity, compareProcessedPositionSourcePositions);
if (targetIndex < 0 && maps.length > 0) {
// if no exact match, closest is 2's compliment of result
targetIndex = ~targetIndex;
}
if (!maps[targetIndex] || comparePaths(loc.fileName, maps[targetIndex].sourcePath, sourceRoot) !== 0) {
return loc;
}
return { fileName: toPath(map.file, sourceRoot, host.getCanonicalFileName), position: maps[targetIndex].emittedPosition }; // Closest pos
}
function getOriginalPosition(loc: SourceMappableLocation): SourceMappableLocation {
const maps = getSourceOrderedMappings();
if (!length(maps)) return loc;
let targetIndex = binarySearch(maps, { emittedPosition: loc.position }, identity, compareProcessedPositionEmittedPositions);
if (targetIndex < 0 && maps.length > 0) {
// if no exact match, closest is 2's compliment of result
targetIndex = ~targetIndex;
}
return { fileName: toPath(maps[targetIndex].sourcePath, sourceRoot, host.getCanonicalFileName), position: maps[targetIndex].sourcePosition }; // Closest pos
}
function getSourceFileLike(fileName: string, location: string): SourceFileLike | undefined {
// Lookup file in program, if provided
const file: SourceFileLike = program && program.getSourceFile(fileName);
if (!file) {
// Otherwise check the cache (which may hit disk)
const path = toPath(fileName, location, host.getCanonicalFileName);
return fallbackCache.get(path);
}
return file;
}
function getPositionOfLineAndCharacterUsingName(fileName: string, directory: string, line: number, character: number) {
const file = getSourceFileLike(fileName, directory);
if (!file) {
return -1;
}
return getPositionOfLineAndCharacter(file, line, character);
}
function getDecodedMappings() {
return decodedMappings || (decodedMappings = calculateDecodedMappings());
}
function getSourceOrderedMappings() {
return sourceOrderedMappings || (sourceOrderedMappings = getDecodedMappings().slice().sort(compareProcessedPositionSourcePositions));
}
function getGeneratedOrderedMappings() {
return generatedOrderedMappings || (generatedOrderedMappings = getDecodedMappings().slice().sort(compareProcessedPositionEmittedPositions));
}
function calculateDecodedMappings(): ProcessedSourceMapPosition[] {
const state: DecoderState<ProcessedSourceMapPosition> = {
encodedText: map.mappings,
currentNameIndex: undefined,
sourceMapNamesLength: map.names ? map.names.length : undefined,
currentEmittedColumn: 0,
currentEmittedLine: 0,
currentSourceColumn: 0,
currentSourceLine: 0,
currentSourceIndex: 0,
positions: [],
decodingIndex: 0,
processPosition,
};
while (!hasCompletedDecoding(state)) {
decodeSinglePosition(state);
if (state.error) {
host.log(`Encountered error while decoding sourcemap found at ${mapPath}: ${state.error}`);
return [];
}
}
return state.positions;
}
function compareProcessedPositionSourcePositions(a: ProcessedSourceMapPosition, b: ProcessedSourceMapPosition) {
return comparePaths(a.sourcePath, b.sourcePath, sourceRoot) ||
compareValues(a.sourcePosition, b.sourcePosition);
}
function compareProcessedPositionEmittedPositions(a: ProcessedSourceMapPosition, b: ProcessedSourceMapPosition) {
return compareValues(a.emittedPosition, b.emittedPosition);
}
function processPosition(position: RawSourceMapPosition): ProcessedSourceMapPosition {
const sourcePath = map.sources[position.sourceIndex];
return {
emittedPosition: getPositionOfLineAndCharacterUsingName(map.file, currentDirectory, position.emittedLine, position.emittedColumn),
sourcePosition: getPositionOfLineAndCharacterUsingName(sourcePath, sourceRoot, position.sourceLine, position.sourceColumn),
sourcePath,
// TODO: Consider using `name` field to remap the expected identifier to scan for renames to handle another tool renaming oout output
// name: position.nameIndex ? map.names[position.nameIndex] : undefined
};
}
}
interface ProcessedSourceMapPosition {
emittedPosition: number;
sourcePosition: number;
sourcePath: string;
}
interface RawSourceMapPosition {
emittedLine: number;
emittedColumn: number;
sourceLine: number;
sourceColumn: number;
sourceIndex: number;
nameIndex?: number;
}
interface DecoderState<T> {
decodingIndex: number;
currentEmittedLine: number;
currentEmittedColumn: number;
currentSourceLine: number;
currentSourceColumn: number;
currentSourceIndex: number;
currentNameIndex: number;
encodedText: string;
sourceMapNamesLength?: number;
error?: string;
positions: T[];
processPosition: (position: RawSourceMapPosition) => T;
}
function hasCompletedDecoding(state: DecoderState<any>) {
return state.decodingIndex === state.encodedText.length;
}
function decodeSinglePosition<T>(state: DecoderState<T>): void {
while (state.decodingIndex < state.encodedText.length) {
const char = state.encodedText.charCodeAt(state.decodingIndex);
if (char === CharacterCodes.semicolon) {
// New line
state.currentEmittedLine++;
state.currentEmittedColumn = 0;
state.decodingIndex++;
continue;
}
if (char === CharacterCodes.comma) {
// Next entry is on same line - no action needed
state.decodingIndex++;
continue;
}
// Read the current position
// 1. Column offset from prev read jsColumn
state.currentEmittedColumn += base64VLQFormatDecode();
// Incorrect emittedColumn dont support this map
if (createErrorIfCondition(state.currentEmittedColumn < 0, "Invalid emittedColumn found")) {
return;
}
// Dont support reading mappings that dont have information about original source and its line numbers
if (createErrorIfCondition(isSourceMappingSegmentEnd(state.encodedText, state.decodingIndex), "Unsupported Error Format: No entries after emitted column")) {
return;
}
// 2. Relative sourceIndex
state.currentSourceIndex += base64VLQFormatDecode();
// Incorrect sourceIndex dont support this map
if (createErrorIfCondition(state.currentSourceIndex < 0, "Invalid sourceIndex found")) {
return;
}
// Dont support reading mappings that dont have information about original source position
if (createErrorIfCondition(isSourceMappingSegmentEnd(state.encodedText, state.decodingIndex), "Unsupported Error Format: No entries after sourceIndex")) {
return;
}
// 3. Relative sourceLine 0 based
state.currentSourceLine += base64VLQFormatDecode();
// Incorrect sourceLine dont support this map
if (createErrorIfCondition(state.currentSourceLine < 0, "Invalid sourceLine found")) {
return;
}
// Dont support reading mappings that dont have information about original source and its line numbers
if (createErrorIfCondition(isSourceMappingSegmentEnd(state.encodedText, state.decodingIndex), "Unsupported Error Format: No entries after emitted Line")) {
return;
}
// 4. Relative sourceColumn 0 based
state.currentSourceColumn += base64VLQFormatDecode();
// Incorrect sourceColumn dont support this map
if (createErrorIfCondition(state.currentSourceColumn < 0, "Invalid sourceLine found")) {
return;
}
// 5. Check if there is name:
if (!isSourceMappingSegmentEnd(state.encodedText, state.decodingIndex)) {
if (state.currentNameIndex === undefined) {
state.currentNameIndex = 0;
}
state.currentNameIndex += base64VLQFormatDecode();
// Incorrect nameIndex dont support this map
// TODO: If we start using `name`s, issue errors when they aren't correct in the sourcemap
// if (createErrorIfCondition(state.currentNameIndex < 0 || state.currentNameIndex >= state.sourceMapNamesLength, "Invalid name index for the source map entry")) {
// return;
// }
}
// Dont support reading mappings that dont have information about original source and its line numbers
if (createErrorIfCondition(!isSourceMappingSegmentEnd(state.encodedText, state.decodingIndex), "Unsupported Error Format: There are more entries after " + (state.currentNameIndex === undefined ? "sourceColumn" : "nameIndex"))) {
return;
}
// Entry should be complete
capturePosition();
return;
}
createErrorIfCondition(/*condition*/ true, "No encoded entry found");
return;
function capturePosition() {
state.positions.push(state.processPosition({
emittedColumn: state.currentEmittedColumn,
emittedLine: state.currentEmittedLine,
sourceColumn: state.currentSourceColumn,
sourceIndex: state.currentSourceIndex,
sourceLine: state.currentSourceLine,
nameIndex: state.currentNameIndex
}));
}
function createErrorIfCondition(condition: boolean, errormsg: string) {
if (state.error) {
// An error was already reported
return true;
}
if (condition) {
state.error = errormsg;
}
return condition;
}
function base64VLQFormatDecode() {
let moreDigits = true;
let shiftCount = 0;
let value = 0;
for (; moreDigits; state.decodingIndex++) {
if (createErrorIfCondition(state.decodingIndex >= state.encodedText.length, "Error in decoding base64VLQFormatDecode, past the mapping string")) {
return;
}
// 6 digit number
const currentByte = base64FormatDecode(state.encodedText.charAt(state.decodingIndex));
// If msb is set, we still have more bits to continue
moreDigits = (currentByte & 32) !== 0;
// least significant 5 bits are the next msbs in the final value.
value = value | ((currentByte & 31) << shiftCount);
shiftCount += 5;
}
// Least significant bit if 1 represents negative and rest of the msb is actual absolute value
if ((value & 1) === 0) {
// + number
value = value >> 1;
}
else {
// - number
value = value >> 1;
value = -value;
}
return value;
}
}
function base64FormatDecode(char: string) {
return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(char);
}
function isSourceMappingSegmentEnd(encodedText: string, pos: number) {
return (pos === encodedText.length ||
encodedText.charCodeAt(pos) === CharacterCodes.comma ||
encodedText.charCodeAt(pos) === CharacterCodes.semicolon);
}
}

View file

@ -72,6 +72,7 @@
"shims.ts",
"signatureHelp.ts",
"suggestionDiagnostics.ts",
"sourcemaps.ts",
"symbolDisplay.ts",
"textChanges.ts",
"refactorProvider.ts",

View file

@ -75,10 +75,13 @@ namespace ts {
getLineStarts(): ReadonlyArray<number>;
getPositionOfLineAndCharacter(line: number, character: number): number;
update(newText: string, textChangeRange: TextChangeRange): SourceFile;
/* @internal */ sourceMapper?: sourcemaps.SourceMapper;
}
export interface SourceFileLike {
getLineAndCharacterOfPosition(pos: number): LineAndCharacter;
/*@internal*/ sourceMapper?: sourcemaps.SourceMapper;
}
export interface SourceMapSource {

View file

@ -2307,6 +2307,7 @@ declare namespace ts {
charset?: string;
checkJs?: boolean;
declaration?: boolean;
declarationMap?: boolean;
emitDeclarationOnly?: boolean;
declarationDir?: string;
disableSizeLimit?: boolean;
@ -2897,6 +2898,8 @@ declare namespace ts {
setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
clearTimeout?(timeoutId: any): void;
clearScreen?(): void;
base64decode?(input: string): string;
base64encode?(input: string): string;
}
interface FileWatcher {
close(): void;
@ -3283,7 +3286,7 @@ declare namespace ts {
tryScan<T>(callback: () => T): T;
}
function tokenToString(t: SyntaxKind): string | undefined;
function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number;
function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number;
function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter;
function isWhiteSpaceLike(ch: number): boolean;
/** Does not include line breaks. For that, see isWhiteSpaceLike. */

View file

@ -2307,6 +2307,7 @@ declare namespace ts {
charset?: string;
checkJs?: boolean;
declaration?: boolean;
declarationMap?: boolean;
emitDeclarationOnly?: boolean;
declarationDir?: string;
disableSizeLimit?: boolean;
@ -2897,6 +2898,8 @@ declare namespace ts {
setTimeout?(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
clearTimeout?(timeoutId: any): void;
clearScreen?(): void;
base64decode?(input: string): string;
base64encode?(input: string): string;
}
interface FileWatcher {
close(): void;
@ -2938,7 +2941,7 @@ declare namespace ts {
tryScan<T>(callback: () => T): T;
}
function tokenToString(t: SyntaxKind): string | undefined;
function getPositionOfLineAndCharacter(sourceFile: SourceFile, line: number, character: number): number;
function getPositionOfLineAndCharacter(sourceFile: SourceFileLike, line: number, character: number): number;
function getLineAndCharacterOfPosition(sourceFile: SourceFileLike, position: number): LineAndCharacter;
function isWhiteSpaceLike(ch: number): boolean;
/** Does not include line breaks. For that, see isWhiteSpaceLike. */

View file

@ -0,0 +1,43 @@
//// [declarationMaps.ts]
module m2 {
export interface connectModule {
(res, req, next): void;
}
export interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;
//// [declarationMaps.js]
"use strict";
var m2;
module.exports = m2;
//// [declarationMaps.d.ts]
declare module m2 {
interface connectModule {
(res: any, req: any, next: any): void;
}
interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
declare var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;
//# sourceMappingURL=declarationMaps.d.ts.map

View file

@ -0,0 +1,2 @@
//// [declarationMaps.d.ts.map]
{"version":3,"file":"declarationMaps.d.ts","sourceRoot":"","sources":["declarationMaps.ts"],"names":[],"mappings":"AAAA,eAAO,EAAE,CAAC;IACN,UAAiB,aAAa;QAC1B,CAAC,GAAG,KAAA,EAAE,GAAG,KAAA,EAAE,IAAI,KAAA,GAAG,IAAI,CAAC;KAC1B;IACD,UAAiB,aAAa;QAC1B,GAAG,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,aAAa,CAAC;QAC3C,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;KAClC;CAEJ;AAED,QAAA,IAAI,EAAE,EAAE;IACJ,IAAI,EAAE,CAAC,aAAa,CAAC;IACrB,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC;IACxB,KAAK,IAAI,EAAE,CAAC,aAAa,CAAC;CAC7B,CAAC;AAEF,SAAS,EAAE,CAAC"}

View file

@ -0,0 +1,299 @@
===================================================================
JsFile: declarationMaps.d.ts
mapUrl: declarationMaps.d.ts.map
sourceRoot:
sources: declarationMaps.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/declarationMaps.d.ts
sourceFile:declarationMaps.ts
-------------------------------------------------------------------
>>>declare module m2 {
1 >
2 >^^^^^^^^^^^^^^^
3 > ^^
4 > ^
5 > ^^^^^^^^^^^^->
1 >
2 >module
3 > m2
4 >
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
2 >Emitted(1, 16) Source(1, 8) + SourceIndex(0)
3 >Emitted(1, 18) Source(1, 10) + SourceIndex(0)
4 >Emitted(1, 19) Source(1, 11) + SourceIndex(0)
---
>>> interface connectModule {
1->^^^^
2 > ^^^^^^^^^^
3 > ^^^^^^^^^^^^^
4 > ^^^^^^^^^^^^^^^^^^^^->
1->{
>
2 > export interface
3 > connectModule
1->Emitted(2, 5) Source(2, 5) + SourceIndex(0)
2 >Emitted(2, 15) Source(2, 22) + SourceIndex(0)
3 >Emitted(2, 28) Source(2, 35) + SourceIndex(0)
---
>>> (res: any, req: any, next: any): void;
1->^^^^^^^^
2 > ^
3 > ^^^
4 > ^^^^^
5 > ^^
6 > ^^^
7 > ^^^^^
8 > ^^
9 > ^^^^
10> ^^^^^
11> ^^^
12> ^^^^
13> ^
1-> {
>
2 > (
3 > res
4 >
5 > ,
6 > req
7 >
8 > ,
9 > next
10>
11> ):
12> void
13> ;
1->Emitted(3, 9) Source(3, 9) + SourceIndex(0)
2 >Emitted(3, 10) Source(3, 10) + SourceIndex(0)
3 >Emitted(3, 13) Source(3, 13) + SourceIndex(0)
4 >Emitted(3, 18) Source(3, 13) + SourceIndex(0)
5 >Emitted(3, 20) Source(3, 15) + SourceIndex(0)
6 >Emitted(3, 23) Source(3, 18) + SourceIndex(0)
7 >Emitted(3, 28) Source(3, 18) + SourceIndex(0)
8 >Emitted(3, 30) Source(3, 20) + SourceIndex(0)
9 >Emitted(3, 34) Source(3, 24) + SourceIndex(0)
10>Emitted(3, 39) Source(3, 24) + SourceIndex(0)
11>Emitted(3, 42) Source(3, 27) + SourceIndex(0)
12>Emitted(3, 46) Source(3, 31) + SourceIndex(0)
13>Emitted(3, 47) Source(3, 32) + SourceIndex(0)
---
>>> }
1 >^^^^^
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
> }
1 >Emitted(4, 6) Source(4, 6) + SourceIndex(0)
---
>>> interface connectExport {
1->^^^^
2 > ^^^^^^^^^^
3 > ^^^^^^^^^^^^^
4 > ^^^^^^^^^^^^^^^^^^^^^^^^^->
1->
>
2 > export interface
3 > connectExport
1->Emitted(5, 5) Source(5, 5) + SourceIndex(0)
2 >Emitted(5, 15) Source(5, 22) + SourceIndex(0)
3 >Emitted(5, 28) Source(5, 35) + SourceIndex(0)
---
>>> use: (mod: connectModule) => connectExport;
1->^^^^^^^^
2 > ^^^
3 > ^^
4 > ^
5 > ^^^
6 > ^^
7 > ^^^^^^^^^^^^^
8 > ^^^^^
9 > ^^^^^^^^^^^^^
10> ^
1-> {
>
2 > use
3 > :
4 > (
5 > mod
6 > :
7 > connectModule
8 > ) =>
9 > connectExport
10> ;
1->Emitted(6, 9) Source(6, 9) + SourceIndex(0)
2 >Emitted(6, 12) Source(6, 12) + SourceIndex(0)
3 >Emitted(6, 14) Source(6, 14) + SourceIndex(0)
4 >Emitted(6, 15) Source(6, 15) + SourceIndex(0)
5 >Emitted(6, 18) Source(6, 18) + SourceIndex(0)
6 >Emitted(6, 20) Source(6, 20) + SourceIndex(0)
7 >Emitted(6, 33) Source(6, 33) + SourceIndex(0)
8 >Emitted(6, 38) Source(6, 38) + SourceIndex(0)
9 >Emitted(6, 51) Source(6, 51) + SourceIndex(0)
10>Emitted(6, 52) Source(6, 52) + SourceIndex(0)
---
>>> listen: (port: number) => void;
1 >^^^^^^^^
2 > ^^^^^^
3 > ^^
4 > ^
5 > ^^^^
6 > ^^
7 > ^^^^^^
8 > ^^^^^
9 > ^^^^
10> ^
1 >
>
2 > listen
3 > :
4 > (
5 > port
6 > :
7 > number
8 > ) =>
9 > void
10> ;
1 >Emitted(7, 9) Source(7, 9) + SourceIndex(0)
2 >Emitted(7, 15) Source(7, 15) + SourceIndex(0)
3 >Emitted(7, 17) Source(7, 17) + SourceIndex(0)
4 >Emitted(7, 18) Source(7, 18) + SourceIndex(0)
5 >Emitted(7, 22) Source(7, 22) + SourceIndex(0)
6 >Emitted(7, 24) Source(7, 24) + SourceIndex(0)
7 >Emitted(7, 30) Source(7, 30) + SourceIndex(0)
8 >Emitted(7, 35) Source(7, 35) + SourceIndex(0)
9 >Emitted(7, 39) Source(7, 39) + SourceIndex(0)
10>Emitted(7, 40) Source(7, 40) + SourceIndex(0)
---
>>> }
1 >^^^^^
1 >
> }
1 >Emitted(8, 6) Source(8, 6) + SourceIndex(0)
---
>>>}
1 >^
2 > ^^^^^^^^^^^^^^^^^->
1 >
>
>}
1 >Emitted(9, 2) Source(10, 2) + SourceIndex(0)
---
>>>declare var m2: {
1->
2 >^^^^^^^^
3 > ^^^^
4 > ^^
5 > ^^
6 > ^^^^^^^^^^->
1->
>
>
2 >
3 > var
4 > m2
5 > :
1->Emitted(10, 1) Source(12, 1) + SourceIndex(0)
2 >Emitted(10, 9) Source(12, 1) + SourceIndex(0)
3 >Emitted(10, 13) Source(12, 5) + SourceIndex(0)
4 >Emitted(10, 15) Source(12, 7) + SourceIndex(0)
5 >Emitted(10, 17) Source(12, 9) + SourceIndex(0)
---
>>> (): m2.connectExport;
1->^^^^
2 > ^^^^
3 > ^^
4 > ^
5 > ^^^^^^^^^^^^^
6 > ^
7 > ^^^^->
1->{
>
2 > ():
3 > m2
4 > .
5 > connectExport
6 > ;
1->Emitted(11, 5) Source(13, 5) + SourceIndex(0)
2 >Emitted(11, 9) Source(13, 9) + SourceIndex(0)
3 >Emitted(11, 11) Source(13, 11) + SourceIndex(0)
4 >Emitted(11, 12) Source(13, 12) + SourceIndex(0)
5 >Emitted(11, 25) Source(13, 25) + SourceIndex(0)
6 >Emitted(11, 26) Source(13, 26) + SourceIndex(0)
---
>>> test1: m2.connectModule;
1->^^^^
2 > ^^^^^
3 > ^^
4 > ^^
5 > ^
6 > ^^^^^^^^^^^^^
7 > ^
8 > ^^^->
1->
>
2 > test1
3 > :
4 > m2
5 > .
6 > connectModule
7 > ;
1->Emitted(12, 5) Source(14, 5) + SourceIndex(0)
2 >Emitted(12, 10) Source(14, 10) + SourceIndex(0)
3 >Emitted(12, 12) Source(14, 12) + SourceIndex(0)
4 >Emitted(12, 14) Source(14, 14) + SourceIndex(0)
5 >Emitted(12, 15) Source(14, 15) + SourceIndex(0)
6 >Emitted(12, 28) Source(14, 28) + SourceIndex(0)
7 >Emitted(12, 29) Source(14, 29) + SourceIndex(0)
---
>>> test2(): m2.connectModule;
1->^^^^
2 > ^^^^^
3 > ^^^^
4 > ^^
5 > ^
6 > ^^^^^^^^^^^^^
7 > ^
1->
>
2 > test2
3 > ():
4 > m2
5 > .
6 > connectModule
7 > ;
1->Emitted(13, 5) Source(15, 5) + SourceIndex(0)
2 >Emitted(13, 10) Source(15, 10) + SourceIndex(0)
3 >Emitted(13, 14) Source(15, 14) + SourceIndex(0)
4 >Emitted(13, 16) Source(15, 16) + SourceIndex(0)
5 >Emitted(13, 17) Source(15, 17) + SourceIndex(0)
6 >Emitted(13, 30) Source(15, 30) + SourceIndex(0)
7 >Emitted(13, 31) Source(15, 31) + SourceIndex(0)
---
>>>};
1 >^
2 > ^
3 > ^^^^^^^^^^^->
1 >
>}
2 > ;
1 >Emitted(14, 2) Source(16, 2) + SourceIndex(0)
2 >Emitted(14, 3) Source(16, 3) + SourceIndex(0)
---
>>>export = m2;
1->
2 >^^^^^^^^^
3 > ^^
4 > ^
5 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1->
>
>
2 >export =
3 > m2
4 > ;
1->Emitted(15, 1) Source(18, 1) + SourceIndex(0)
2 >Emitted(15, 10) Source(18, 10) + SourceIndex(0)
3 >Emitted(15, 12) Source(18, 12) + SourceIndex(0)
4 >Emitted(15, 13) Source(18, 13) + SourceIndex(0)
---
>>>//# sourceMappingURL=declarationMaps.d.ts.map

View file

@ -0,0 +1,50 @@
=== tests/cases/compiler/declarationMaps.ts ===
module m2 {
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))
export interface connectModule {
>connectModule : Symbol(connectModule, Decl(declarationMaps.ts, 0, 11))
(res, req, next): void;
>res : Symbol(res, Decl(declarationMaps.ts, 2, 9))
>req : Symbol(req, Decl(declarationMaps.ts, 2, 13))
>next : Symbol(next, Decl(declarationMaps.ts, 2, 18))
}
export interface connectExport {
>connectExport : Symbol(connectExport, Decl(declarationMaps.ts, 3, 5))
use: (mod: connectModule) => connectExport;
>use : Symbol(connectExport.use, Decl(declarationMaps.ts, 4, 36))
>mod : Symbol(mod, Decl(declarationMaps.ts, 5, 14))
>connectModule : Symbol(connectModule, Decl(declarationMaps.ts, 0, 11))
>connectExport : Symbol(connectExport, Decl(declarationMaps.ts, 3, 5))
listen: (port: number) => void;
>listen : Symbol(connectExport.listen, Decl(declarationMaps.ts, 5, 51))
>port : Symbol(port, Decl(declarationMaps.ts, 6, 17))
}
}
var m2: {
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))
(): m2.connectExport;
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))
>connectExport : Symbol(m2.connectExport, Decl(declarationMaps.ts, 3, 5))
test1: m2.connectModule;
>test1 : Symbol(test1, Decl(declarationMaps.ts, 12, 25))
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))
>connectModule : Symbol(m2.connectModule, Decl(declarationMaps.ts, 0, 11))
test2(): m2.connectModule;
>test2 : Symbol(test2, Decl(declarationMaps.ts, 13, 28))
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))
>connectModule : Symbol(m2.connectModule, Decl(declarationMaps.ts, 0, 11))
};
export = m2;
>m2 : Symbol(m2, Decl(declarationMaps.ts, 0, 0), Decl(declarationMaps.ts, 11, 3))

View file

@ -0,0 +1,50 @@
=== tests/cases/compiler/declarationMaps.ts ===
module m2 {
>m2 : { (): connectExport; test1: connectModule; test2(): connectModule; }
export interface connectModule {
>connectModule : connectModule
(res, req, next): void;
>res : any
>req : any
>next : any
}
export interface connectExport {
>connectExport : connectExport
use: (mod: connectModule) => connectExport;
>use : (mod: connectModule) => connectExport
>mod : connectModule
>connectModule : connectModule
>connectExport : connectExport
listen: (port: number) => void;
>listen : (port: number) => void
>port : number
}
}
var m2: {
>m2 : { (): m2.connectExport; test1: m2.connectModule; test2(): m2.connectModule; }
(): m2.connectExport;
>m2 : any
>connectExport : m2.connectExport
test1: m2.connectModule;
>test1 : m2.connectModule
>m2 : any
>connectModule : m2.connectModule
test2(): m2.connectModule;
>test2 : () => m2.connectModule
>m2 : any
>connectModule : m2.connectModule
};
export = m2;
>m2 : { (): m2.connectExport; test1: m2.connectModule; test2(): m2.connectModule; }

View file

@ -0,0 +1,34 @@
EmitSkipped: false
FileName : ./dist/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.methodName = function (propName) { };
Foo.prototype.otherMethod = function () {
if (Math.random() > 0.5) {
return { x: 42 };
}
return { y: "yes" };
};
return Foo;
}());
exports.Foo = Foo;
FileName : ./dist/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../tests/cases/fourslash/index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}FileName : ./dist/index.d.ts
export declare class Foo {
member: string;
methodName(propName: SomeType): void;
otherMethod(): {
x: number;
y?: undefined;
} | {
y: string;
x?: undefined;
};
}
export interface SomeType {
member: number;
}
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,35 @@
EmitSkipped: false
FileName : ./dist/index.js.map
{"version":3,"file":"index.js","sourceRoot":"/tests/cases/fourslash/","sources":["index.ts"],"names":[],"mappings":";;AAAA;IAAA;IASA,CAAC;IAPG,wBAAU,GAAV,UAAW,QAAkB,IAAS,CAAC;IACvC,yBAAW,GAAX;QACI,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;YACrB,OAAO,EAAC,CAAC,EAAE,EAAE,EAAC,CAAC;SAClB;QACD,OAAO,EAAC,CAAC,EAAE,KAAK,EAAC,CAAC;IACtB,CAAC;IACL,UAAC;AAAD,CAAC,AATD,IASC;AATY,kBAAG"}FileName : ./dist/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.methodName = function (propName) { };
Foo.prototype.otherMethod = function () {
if (Math.random() > 0.5) {
return { x: 42 };
}
return { y: "yes" };
};
return Foo;
}());
exports.Foo = Foo;
//# sourceMappingURL=index.js.mapFileName : ./dist/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"/tests/cases/fourslash/","sources":["index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}FileName : ./dist/index.d.ts
export declare class Foo {
member: string;
methodName(propName: SomeType): void;
otherMethod(): {
x: number;
y?: undefined;
} | {
y: string;
x?: undefined;
};
}
export interface SomeType {
member: number;
}
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,34 @@
EmitSkipped: false
FileName : ./dist/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.methodName = function (propName) { };
Foo.prototype.otherMethod = function () {
if (Math.random() > 0.5) {
return { x: 42 };
}
return { y: "yes" };
};
return Foo;
}());
exports.Foo = Foo;
FileName : ./dist/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"/tests/cases/fourslash/","sources":["index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}FileName : ./dist/index.d.ts
export declare class Foo {
member: string;
methodName(propName: SomeType): void;
otherMethod(): {
x: number;
y?: undefined;
} | {
y: string;
x?: undefined;
};
}
export interface SomeType {
member: number;
}
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,34 @@
EmitSkipped: false
FileName : ./dist/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.methodName = function (propName) { };
Foo.prototype.otherMethod = function () {
if (Math.random() > 0.5) {
return { x: 42 };
}
return { y: "yes" };
};
return Foo;
}());
exports.Foo = Foo;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90ZXN0cy9jYXNlcy9mb3Vyc2xhc2gvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtJQUFBO0lBU0EsQ0FBQztJQVBHLHdCQUFVLEdBQVYsVUFBVyxRQUFrQixJQUFTLENBQUM7SUFDdkMseUJBQVcsR0FBWDtRQUNJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRTtZQUNyQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0wsVUFBQztBQUFELENBQUMsQUFURCxJQVNDO0FBVFksa0JBQUcifQ==FileName : ./dist/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../tests/cases/fourslash/index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}FileName : ./dist/index.d.ts
export declare class Foo {
member: string;
methodName(propName: SomeType): void;
otherMethod(): {
x: number;
y?: undefined;
} | {
y: string;
x?: undefined;
};
}
export interface SomeType {
member: number;
}
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,34 @@
EmitSkipped: false
FileName : ./dist/index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.methodName = function (propName) { };
Foo.prototype.otherMethod = function () {
if (Math.random() > 0.5) {
return { x: 42 };
}
return { y: "yes" };
};
return Foo;
}());
exports.Foo = Foo;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90ZXN0cy9jYXNlcy9mb3Vyc2xhc2gvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtJQUFBO0lBU0EsQ0FBQztJQVBHLHdCQUFVLEdBQVYsVUFBVyxRQUFrQixJQUFTLENBQUM7SUFDdkMseUJBQVcsR0FBWDtRQUNJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRTtZQUNyQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN0QixDQUFDO0lBQ0wsVUFBQztBQUFELENBQUMsQUFURCxJQVNDO0FBVFksa0JBQUciLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRm9vIHtcbiAgICBtZW1iZXI6IHN0cmluZztcbiAgICBtZXRob2ROYW1lKHByb3BOYW1lOiBTb21lVHlwZSk6IHZvaWQge31cbiAgICBvdGhlck1ldGhvZCgpIHtcbiAgICAgICAgaWYgKE1hdGgucmFuZG9tKCkgPiAwLjUpIHtcbiAgICAgICAgICAgIHJldHVybiB7eDogNDJ9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7eTogXCJ5ZXNcIn07XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvbWVUeXBlIHtcbiAgICBtZW1iZXI6IG51bWJlcjtcbn0iXX0=FileName : ./dist/index.d.ts.map
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../tests/cases/fourslash/index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}FileName : ./dist/index.d.ts
export declare class Foo {
member: string;
methodName(propName: SomeType): void;
otherMethod(): {
x: number;
y?: undefined;
} | {
y: string;
x?: undefined;
};
}
export interface SomeType {
member: number;
}
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,64 @@
//// [tests/cases/compiler/declarationMapsMultifile.ts] ////
//// [a.ts]
export class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
//// [index.ts]
import {Foo} from "./a";
const c = new Foo();
c.doThing({a: 42});
export let x = c.doThing({a: 12});
export { c, Foo };
//// [a.js]
"use strict";
exports.__esModule = true;
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.doThing = function (x) {
return { b: x.a };
};
Foo.make = function () {
return new Foo();
};
return Foo;
}());
exports.Foo = Foo;
//// [index.js]
"use strict";
exports.__esModule = true;
var a_1 = require("./a");
exports.Foo = a_1.Foo;
var c = new a_1.Foo();
exports.c = c;
c.doThing({ a: 42 });
exports.x = c.doThing({ a: 12 });
//// [a.d.ts]
export declare class Foo {
doThing(x: {
a: number;
}): {
b: number;
};
static make(): Foo;
}
//# sourceMappingURL=a.d.ts.map//// [index.d.ts]
import { Foo } from "./a";
declare const c: Foo;
export declare let x: {
b: number;
};
export { c, Foo };
//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,3 @@
//// [a.d.ts.map]
{"version":3,"file":"a.d.ts","sourceRoot":"","sources":["a.ts"],"names":[],"mappings":"AAAA;IACI,OAAO,CAAC,CAAC,EAAE;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC;;;IAGtB,MAAM,CAAC,IAAI;CAGd"}//// [index.d.ts.map]
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,CAAC,KAAY,CAAC;AAGpB,eAAO,IAAI,CAAC;;CAAqB,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC"}

View file

@ -0,0 +1,201 @@
===================================================================
JsFile: a.d.ts
mapUrl: a.d.ts.map
sourceRoot:
sources: a.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/a.d.ts
sourceFile:a.ts
-------------------------------------------------------------------
>>>export declare class Foo {
1 >
2 >^^^^^^^^^^^^^^^^^->
1 >
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
---
>>> doThing(x: {
1->^^^^
2 > ^^^^^^^
3 > ^
4 > ^
5 > ^^
6 > ^^^^->
1->export class Foo {
>
2 > doThing
3 > (
4 > x
5 > :
1->Emitted(2, 5) Source(2, 5) + SourceIndex(0)
2 >Emitted(2, 12) Source(2, 12) + SourceIndex(0)
3 >Emitted(2, 13) Source(2, 13) + SourceIndex(0)
4 >Emitted(2, 14) Source(2, 14) + SourceIndex(0)
5 >Emitted(2, 16) Source(2, 16) + SourceIndex(0)
---
>>> a: number;
1->^^^^^^^^
2 > ^
3 > ^^
4 > ^^^^^^
5 > ^
1->{
2 > a
3 > :
4 > number
5 >
1->Emitted(3, 9) Source(2, 17) + SourceIndex(0)
2 >Emitted(3, 10) Source(2, 18) + SourceIndex(0)
3 >Emitted(3, 12) Source(2, 20) + SourceIndex(0)
4 >Emitted(3, 18) Source(2, 26) + SourceIndex(0)
5 >Emitted(3, 19) Source(2, 26) + SourceIndex(0)
---
>>> }): {
1 >^^^^^
2 > ^^^^^^^^^^^^^^->
1 >}
1 >Emitted(4, 6) Source(2, 27) + SourceIndex(0)
---
>>> b: number;
>>> };
>>> static make(): Foo;
1->^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^
1->) {
> return {b: x.a};
> }
>
2 > static
3 >
4 > make
1->Emitted(7, 5) Source(5, 5) + SourceIndex(0)
2 >Emitted(7, 11) Source(5, 11) + SourceIndex(0)
3 >Emitted(7, 12) Source(5, 12) + SourceIndex(0)
4 >Emitted(7, 16) Source(5, 16) + SourceIndex(0)
---
>>>}
1 >^
2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1 >() {
> return new Foo();
> }
>}
1 >Emitted(8, 2) Source(8, 2) + SourceIndex(0)
---
>>>//# sourceMappingURL=a.d.ts.map===================================================================
JsFile: index.d.ts
mapUrl: index.d.ts.map
sourceRoot:
sources: index.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/index.d.ts
sourceFile:index.ts
-------------------------------------------------------------------
>>>import { Foo } from "./a";
1 >
2 >^^^^^^^
3 > ^^
4 > ^^^
5 > ^^
6 > ^^^^^^
7 > ^^^^^
8 > ^
1 >
2 >import
3 > {
4 > Foo
5 > }
6 > from
7 > "./a"
8 > ;
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
2 >Emitted(1, 8) Source(1, 8) + SourceIndex(0)
3 >Emitted(1, 10) Source(1, 9) + SourceIndex(0)
4 >Emitted(1, 13) Source(1, 12) + SourceIndex(0)
5 >Emitted(1, 15) Source(1, 13) + SourceIndex(0)
6 >Emitted(1, 21) Source(1, 19) + SourceIndex(0)
7 >Emitted(1, 26) Source(1, 24) + SourceIndex(0)
8 >Emitted(1, 27) Source(1, 25) + SourceIndex(0)
---
>>>declare const c: Foo;
1 >
2 >^^^^^^^^
3 > ^^^^^^
4 > ^
5 > ^^^^^
6 > ^
7 > ^^^->
1 >
>
>
2 >
3 > const
4 > c
5 > = new Foo()
6 > ;
1 >Emitted(2, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(2, 9) Source(3, 1) + SourceIndex(0)
3 >Emitted(2, 15) Source(3, 7) + SourceIndex(0)
4 >Emitted(2, 16) Source(3, 8) + SourceIndex(0)
5 >Emitted(2, 21) Source(3, 20) + SourceIndex(0)
6 >Emitted(2, 22) Source(3, 21) + SourceIndex(0)
---
>>>export declare let x: {
1->
2 >^^^^^^^^^^^^^^^
3 > ^^^^
4 > ^
1->
>c.doThing({a: 42});
>
>
2 >export
3 > let
4 > x
1->Emitted(3, 1) Source(6, 1) + SourceIndex(0)
2 >Emitted(3, 16) Source(6, 8) + SourceIndex(0)
3 >Emitted(3, 20) Source(6, 12) + SourceIndex(0)
4 >Emitted(3, 21) Source(6, 13) + SourceIndex(0)
---
>>> b: number;
>>>};
1 >^
2 > ^
3 > ^^^^^^^^^^^^^^^^^->
1 > = c.doThing({a: 12})
2 > ;
1 >Emitted(5, 2) Source(6, 34) + SourceIndex(0)
2 >Emitted(5, 3) Source(6, 35) + SourceIndex(0)
---
>>>export { c, Foo };
1->
2 >^^^^^^^
3 > ^^
4 > ^
5 > ^^
6 > ^^^
7 > ^^
8 > ^
9 > ^^^^^^^^^^^^^^^^->
1->
>
2 >export
3 > {
4 > c
5 > ,
6 > Foo
7 > }
8 > ;
1->Emitted(6, 1) Source(7, 1) + SourceIndex(0)
2 >Emitted(6, 8) Source(7, 8) + SourceIndex(0)
3 >Emitted(6, 10) Source(7, 10) + SourceIndex(0)
4 >Emitted(6, 11) Source(7, 11) + SourceIndex(0)
5 >Emitted(6, 13) Source(7, 13) + SourceIndex(0)
6 >Emitted(6, 16) Source(7, 16) + SourceIndex(0)
7 >Emitted(6, 18) Source(7, 18) + SourceIndex(0)
8 >Emitted(6, 19) Source(7, 19) + SourceIndex(0)
---
>>>//# sourceMappingURL=index.d.ts.map

View file

@ -0,0 +1,47 @@
=== tests/cases/compiler/a.ts ===
export class Foo {
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
doThing(x: {a: number}) {
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
return {b: x.a};
>b : Symbol(b, Decl(a.ts, 2, 16))
>x.a : Symbol(a, Decl(a.ts, 1, 16))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
}
static make() {
>make : Symbol(Foo.make, Decl(a.ts, 3, 5))
return new Foo();
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
}
}
=== tests/cases/compiler/index.ts ===
import {Foo} from "./a";
>Foo : Symbol(Foo, Decl(index.ts, 0, 8))
const c = new Foo();
>c : Symbol(c, Decl(index.ts, 2, 5))
>Foo : Symbol(Foo, Decl(index.ts, 0, 8))
c.doThing({a: 42});
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>c : Symbol(c, Decl(index.ts, 2, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>a : Symbol(a, Decl(index.ts, 3, 11))
export let x = c.doThing({a: 12});
>x : Symbol(x, Decl(index.ts, 5, 10))
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>c : Symbol(c, Decl(index.ts, 2, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>a : Symbol(a, Decl(index.ts, 5, 26))
export { c, Foo };
>c : Symbol(c, Decl(index.ts, 6, 8))
>Foo : Symbol(Foo, Decl(index.ts, 6, 11))

View file

@ -0,0 +1,56 @@
=== tests/cases/compiler/a.ts ===
export class Foo {
>Foo : Foo
doThing(x: {a: number}) {
>doThing : (x: { a: number; }) => { b: number; }
>x : { a: number; }
>a : number
return {b: x.a};
>{b: x.a} : { b: number; }
>b : number
>x.a : number
>x : { a: number; }
>a : number
}
static make() {
>make : () => Foo
return new Foo();
>new Foo() : Foo
>Foo : typeof Foo
}
}
=== tests/cases/compiler/index.ts ===
import {Foo} from "./a";
>Foo : typeof Foo
const c = new Foo();
>c : Foo
>new Foo() : Foo
>Foo : typeof Foo
c.doThing({a: 42});
>c.doThing({a: 42}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 42} : { a: number; }
>a : number
>42 : 42
export let x = c.doThing({a: 12});
>x : { b: number; }
>c.doThing({a: 12}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 12} : { a: number; }
>a : number
>12 : 12
export { c, Foo };
>c : Foo
>Foo : typeof Foo

View file

@ -0,0 +1,69 @@
//// [tests/cases/compiler/declarationMapsOutFile.ts] ////
//// [a.ts]
export class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
//// [index.ts]
import {Foo} from "./a";
const c = new Foo();
c.doThing({a: 42});
export let x = c.doThing({a: 12});
export { c, Foo };
//// [bundle.js]
define("a", ["require", "exports"], function (require, exports) {
"use strict";
exports.__esModule = true;
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.doThing = function (x) {
return { b: x.a };
};
Foo.make = function () {
return new Foo();
};
return Foo;
}());
exports.Foo = Foo;
});
define("index", ["require", "exports", "a"], function (require, exports, a_1) {
"use strict";
exports.__esModule = true;
exports.Foo = a_1.Foo;
var c = new a_1.Foo();
exports.c = c;
c.doThing({ a: 42 });
exports.x = c.doThing({ a: 12 });
});
//// [bundle.d.ts]
declare module "a" {
export class Foo {
doThing(x: {
a: number;
}): {
b: number;
};
static make(): Foo;
}
}
declare module "index" {
import { Foo } from "a";
const c: Foo;
export let x: {
b: number;
};
export { c, Foo };
}
//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,2 @@
//// [bundle.d.ts.map]
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["tests/cases/compiler/a.ts","tests/cases/compiler/index.ts"],"names":[],"mappings":";IAAA,MAAM;QACF,OAAO,CAAC,CAAC,EAAE;YAAC,CAAC,EAAE,MAAM,CAAA;SAAC;;;QAGtB,MAAM,CAAC,IAAI;KAGd;;;ICPD,OAAO,EAAC,GAAG,EAAC,UAAY;IAExB,MAAM,CAAC,KAAY,CAAC;IAGpB,MAAM,CAAC,IAAI,CAAC;;KAAqB,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC"}

View file

@ -0,0 +1,195 @@
===================================================================
JsFile: bundle.d.ts
mapUrl: bundle.d.ts.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/index.ts
===================================================================
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>declare module "a" {
>>> export class Foo {
1 >^^^^
2 > ^^^^^^
3 > ^^^^^^^^^^^->
1 >
2 > export
1 >Emitted(2, 5) Source(1, 1) + SourceIndex(0)
2 >Emitted(2, 11) Source(1, 7) + SourceIndex(0)
---
>>> doThing(x: {
1->^^^^^^^^
2 > ^^^^^^^
3 > ^
4 > ^
5 > ^^
6 > ^^^^->
1-> class Foo {
>
2 > doThing
3 > (
4 > x
5 > :
1->Emitted(3, 9) Source(2, 5) + SourceIndex(0)
2 >Emitted(3, 16) Source(2, 12) + SourceIndex(0)
3 >Emitted(3, 17) Source(2, 13) + SourceIndex(0)
4 >Emitted(3, 18) Source(2, 14) + SourceIndex(0)
5 >Emitted(3, 20) Source(2, 16) + SourceIndex(0)
---
>>> a: number;
1->^^^^^^^^^^^^
2 > ^
3 > ^^
4 > ^^^^^^
5 > ^
1->{
2 > a
3 > :
4 > number
5 >
1->Emitted(4, 13) Source(2, 17) + SourceIndex(0)
2 >Emitted(4, 14) Source(2, 18) + SourceIndex(0)
3 >Emitted(4, 16) Source(2, 20) + SourceIndex(0)
4 >Emitted(4, 22) Source(2, 26) + SourceIndex(0)
5 >Emitted(4, 23) Source(2, 26) + SourceIndex(0)
---
>>> }): {
1 >^^^^^^^^^
2 > ^^^^^^^^^^^^^^->
1 >}
1 >Emitted(5, 10) Source(2, 27) + SourceIndex(0)
---
>>> b: number;
>>> };
>>> static make(): Foo;
1->^^^^^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^
1->) {
> return {b: x.a};
> }
>
2 > static
3 >
4 > make
1->Emitted(8, 9) Source(5, 5) + SourceIndex(0)
2 >Emitted(8, 15) Source(5, 11) + SourceIndex(0)
3 >Emitted(8, 16) Source(5, 12) + SourceIndex(0)
4 >Emitted(8, 20) Source(5, 16) + SourceIndex(0)
---
>>> }
1 >^^^^^
1 >() {
> return new Foo();
> }
>}
1 >Emitted(9, 6) Source(8, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/index.ts
-------------------------------------------------------------------
>>>}
>>>declare module "index" {
>>> import { Foo } from "a";
1 >^^^^
2 > ^^^^^^^
3 > ^^
4 > ^^^
5 > ^^
6 > ^^^^^^^^^^
1 >
2 > import
3 > {
4 > Foo
5 > }
6 > from "./a";
1 >Emitted(12, 5) Source(1, 1) + SourceIndex(1)
2 >Emitted(12, 12) Source(1, 8) + SourceIndex(1)
3 >Emitted(12, 14) Source(1, 9) + SourceIndex(1)
4 >Emitted(12, 17) Source(1, 12) + SourceIndex(1)
5 >Emitted(12, 19) Source(1, 13) + SourceIndex(1)
6 >Emitted(12, 29) Source(1, 25) + SourceIndex(1)
---
>>> const c: Foo;
1 >^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^^
5 > ^
6 > ^^^->
1 >
>
>
2 > const
3 > c
4 > = new Foo()
5 > ;
1 >Emitted(13, 5) Source(3, 1) + SourceIndex(1)
2 >Emitted(13, 11) Source(3, 7) + SourceIndex(1)
3 >Emitted(13, 12) Source(3, 8) + SourceIndex(1)
4 >Emitted(13, 17) Source(3, 20) + SourceIndex(1)
5 >Emitted(13, 18) Source(3, 21) + SourceIndex(1)
---
>>> export let x: {
1->^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^
5 > ^
6 > ^^^->
1->
>c.doThing({a: 42});
>
>
2 > export
3 >
4 > let
5 > x
1->Emitted(14, 5) Source(6, 1) + SourceIndex(1)
2 >Emitted(14, 11) Source(6, 7) + SourceIndex(1)
3 >Emitted(14, 12) Source(6, 8) + SourceIndex(1)
4 >Emitted(14, 16) Source(6, 12) + SourceIndex(1)
5 >Emitted(14, 17) Source(6, 13) + SourceIndex(1)
---
>>> b: number;
>>> };
1->^^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^->
1-> = c.doThing({a: 12})
2 > ;
1->Emitted(16, 6) Source(6, 34) + SourceIndex(1)
2 >Emitted(16, 7) Source(6, 35) + SourceIndex(1)
---
>>> export { c, Foo };
1->^^^^
2 > ^^^^^^^
3 > ^^
4 > ^
5 > ^^
6 > ^^^
7 > ^^
8 > ^
1->
>
2 > export
3 > {
4 > c
5 > ,
6 > Foo
7 > }
8 > ;
1->Emitted(17, 5) Source(7, 1) + SourceIndex(1)
2 >Emitted(17, 12) Source(7, 8) + SourceIndex(1)
3 >Emitted(17, 14) Source(7, 10) + SourceIndex(1)
4 >Emitted(17, 15) Source(7, 11) + SourceIndex(1)
5 >Emitted(17, 17) Source(7, 13) + SourceIndex(1)
6 >Emitted(17, 20) Source(7, 16) + SourceIndex(1)
7 >Emitted(17, 22) Source(7, 18) + SourceIndex(1)
8 >Emitted(17, 23) Source(7, 19) + SourceIndex(1)
---
>>>}
>>>//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,47 @@
=== tests/cases/compiler/a.ts ===
export class Foo {
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
doThing(x: {a: number}) {
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
return {b: x.a};
>b : Symbol(b, Decl(a.ts, 2, 16))
>x.a : Symbol(a, Decl(a.ts, 1, 16))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
}
static make() {
>make : Symbol(Foo.make, Decl(a.ts, 3, 5))
return new Foo();
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
}
}
=== tests/cases/compiler/index.ts ===
import {Foo} from "./a";
>Foo : Symbol(Foo, Decl(index.ts, 0, 8))
const c = new Foo();
>c : Symbol(c, Decl(index.ts, 2, 5))
>Foo : Symbol(Foo, Decl(index.ts, 0, 8))
c.doThing({a: 42});
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>c : Symbol(c, Decl(index.ts, 2, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>a : Symbol(a, Decl(index.ts, 3, 11))
export let x = c.doThing({a: 12});
>x : Symbol(x, Decl(index.ts, 5, 10))
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>c : Symbol(c, Decl(index.ts, 2, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 18))
>a : Symbol(a, Decl(index.ts, 5, 26))
export { c, Foo };
>c : Symbol(c, Decl(index.ts, 6, 8))
>Foo : Symbol(Foo, Decl(index.ts, 6, 11))

View file

@ -0,0 +1,56 @@
=== tests/cases/compiler/a.ts ===
export class Foo {
>Foo : Foo
doThing(x: {a: number}) {
>doThing : (x: { a: number; }) => { b: number; }
>x : { a: number; }
>a : number
return {b: x.a};
>{b: x.a} : { b: number; }
>b : number
>x.a : number
>x : { a: number; }
>a : number
}
static make() {
>make : () => Foo
return new Foo();
>new Foo() : Foo
>Foo : typeof Foo
}
}
=== tests/cases/compiler/index.ts ===
import {Foo} from "./a";
>Foo : typeof Foo
const c = new Foo();
>c : Foo
>new Foo() : Foo
>Foo : typeof Foo
c.doThing({a: 42});
>c.doThing({a: 42}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 42} : { a: number; }
>a : number
>42 : 42
export let x = c.doThing({a: 12});
>x : { b: number; }
>c.doThing({a: 12}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 12} : { a: number; }
>a : number
>12 : 12
export { c, Foo };
>c : Foo
>Foo : typeof Foo

View file

@ -0,0 +1,49 @@
//// [tests/cases/compiler/declarationMapsOutFile2.ts] ////
//// [a.ts]
class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
//// [index.ts]
const c = new Foo();
c.doThing({a: 42});
let x = c.doThing({a: 12});
//// [bundle.js]
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.doThing = function (x) {
return { b: x.a };
};
Foo.make = function () {
return new Foo();
};
return Foo;
}());
var c = new Foo();
c.doThing({ a: 42 });
var x = c.doThing({ a: 12 });
//// [bundle.d.ts]
declare class Foo {
doThing(x: {
a: number;
}): {
b: number;
};
static make(): Foo;
}
declare const c: Foo;
declare let x: {
b: number;
};
//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,2 @@
//// [bundle.d.ts.map]
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["tests/cases/compiler/a.ts","tests/cases/compiler/index.ts"],"names":[],"mappings":"AAAA;IACI,OAAO,CAAC,CAAC,EAAE;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC;;;IAGtB,MAAM,CAAC,IAAI;CAGd;ACPD,QAAA,MAAM,CAAC,KAAY,CAAC;AAGpB,QAAA,IAAI,CAAC;;CAAqB,CAAC"}

View file

@ -0,0 +1,139 @@
===================================================================
JsFile: bundle.d.ts
mapUrl: bundle.d.ts.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/index.ts
===================================================================
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>declare class Foo {
1 >
2 >^^^^^^^^^^^^^^^^^->
1 >
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
---
>>> doThing(x: {
1->^^^^
2 > ^^^^^^^
3 > ^
4 > ^
5 > ^^
6 > ^^^^->
1->class Foo {
>
2 > doThing
3 > (
4 > x
5 > :
1->Emitted(2, 5) Source(2, 5) + SourceIndex(0)
2 >Emitted(2, 12) Source(2, 12) + SourceIndex(0)
3 >Emitted(2, 13) Source(2, 13) + SourceIndex(0)
4 >Emitted(2, 14) Source(2, 14) + SourceIndex(0)
5 >Emitted(2, 16) Source(2, 16) + SourceIndex(0)
---
>>> a: number;
1->^^^^^^^^
2 > ^
3 > ^^
4 > ^^^^^^
5 > ^
1->{
2 > a
3 > :
4 > number
5 >
1->Emitted(3, 9) Source(2, 17) + SourceIndex(0)
2 >Emitted(3, 10) Source(2, 18) + SourceIndex(0)
3 >Emitted(3, 12) Source(2, 20) + SourceIndex(0)
4 >Emitted(3, 18) Source(2, 26) + SourceIndex(0)
5 >Emitted(3, 19) Source(2, 26) + SourceIndex(0)
---
>>> }): {
1 >^^^^^
2 > ^^^^^^^^^^^^^^->
1 >}
1 >Emitted(4, 6) Source(2, 27) + SourceIndex(0)
---
>>> b: number;
>>> };
>>> static make(): Foo;
1->^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^
1->) {
> return {b: x.a};
> }
>
2 > static
3 >
4 > make
1->Emitted(7, 5) Source(5, 5) + SourceIndex(0)
2 >Emitted(7, 11) Source(5, 11) + SourceIndex(0)
3 >Emitted(7, 12) Source(5, 12) + SourceIndex(0)
4 >Emitted(7, 16) Source(5, 16) + SourceIndex(0)
---
>>>}
1 >^
2 > ^^^^^^^^^^^^^^^^^^^^^->
1 >() {
> return new Foo();
> }
>}
1 >Emitted(8, 2) Source(8, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/index.ts
-------------------------------------------------------------------
>>>declare const c: Foo;
1->
2 >^^^^^^^^
3 > ^^^^^^
4 > ^
5 > ^^^^^
6 > ^
1->
2 >
3 > const
4 > c
5 > = new Foo()
6 > ;
1->Emitted(9, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(9, 9) Source(1, 1) + SourceIndex(1)
3 >Emitted(9, 15) Source(1, 7) + SourceIndex(1)
4 >Emitted(9, 16) Source(1, 8) + SourceIndex(1)
5 >Emitted(9, 21) Source(1, 20) + SourceIndex(1)
6 >Emitted(9, 22) Source(1, 21) + SourceIndex(1)
---
>>>declare let x: {
1 >
2 >^^^^^^^^
3 > ^^^^
4 > ^
5 > ^^->
1 >
>c.doThing({a: 42});
>
>
2 >
3 > let
4 > x
1 >Emitted(10, 1) Source(4, 1) + SourceIndex(1)
2 >Emitted(10, 9) Source(4, 1) + SourceIndex(1)
3 >Emitted(10, 13) Source(4, 5) + SourceIndex(1)
4 >Emitted(10, 14) Source(4, 6) + SourceIndex(1)
---
>>> b: number;
>>>};
1->^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1-> = c.doThing({a: 12})
2 > ;
1->Emitted(12, 2) Source(4, 27) + SourceIndex(1)
2 >Emitted(12, 3) Source(4, 28) + SourceIndex(1)
---
>>>//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,40 @@
=== tests/cases/compiler/a.ts ===
class Foo {
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
doThing(x: {a: number}) {
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
return {b: x.a};
>b : Symbol(b, Decl(a.ts, 2, 16))
>x.a : Symbol(a, Decl(a.ts, 1, 16))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
}
static make() {
>make : Symbol(Foo.make, Decl(a.ts, 3, 5))
return new Foo();
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
}
}
=== tests/cases/compiler/index.ts ===
const c = new Foo();
>c : Symbol(c, Decl(index.ts, 0, 5))
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
c.doThing({a: 42});
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>c : Symbol(c, Decl(index.ts, 0, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>a : Symbol(a, Decl(index.ts, 1, 11))
let x = c.doThing({a: 12});
>x : Symbol(x, Decl(index.ts, 3, 3))
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>c : Symbol(c, Decl(index.ts, 0, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>a : Symbol(a, Decl(index.ts, 3, 19))

View file

@ -0,0 +1,49 @@
=== tests/cases/compiler/a.ts ===
class Foo {
>Foo : Foo
doThing(x: {a: number}) {
>doThing : (x: { a: number; }) => { b: number; }
>x : { a: number; }
>a : number
return {b: x.a};
>{b: x.a} : { b: number; }
>b : number
>x.a : number
>x : { a: number; }
>a : number
}
static make() {
>make : () => Foo
return new Foo();
>new Foo() : Foo
>Foo : typeof Foo
}
}
=== tests/cases/compiler/index.ts ===
const c = new Foo();
>c : Foo
>new Foo() : Foo
>Foo : typeof Foo
c.doThing({a: 42});
>c.doThing({a: 42}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 42} : { a: number; }
>a : number
>42 : 42
let x = c.doThing({a: 12});
>x : { b: number; }
>c.doThing({a: 12}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 12} : { a: number; }
>a : number
>12 : 12

View file

@ -0,0 +1,49 @@
//// [tests/cases/compiler/declarationMapsWithSourceMap.ts] ////
//// [a.ts]
class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
//// [index.ts]
const c = new Foo();
c.doThing({a: 42});
let x = c.doThing({a: 12});
//// [bundle.js]
var Foo = /** @class */ (function () {
function Foo() {
}
Foo.prototype.doThing = function (x) {
return { b: x.a };
};
Foo.make = function () {
return new Foo();
};
return Foo;
}());
var c = new Foo();
c.doThing({ a: 42 });
var x = c.doThing({ a: 12 });
//# sourceMappingURL=bundle.js.map
//// [bundle.d.ts]
declare class Foo {
doThing(x: {
a: number;
}): {
b: number;
};
static make(): Foo;
}
declare const c: Foo;
declare let x: {
b: number;
};
//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,3 @@
//// [bundle.js.map]
{"version":3,"file":"bundle.js","sourceRoot":"","sources":["tests/cases/compiler/a.ts","tests/cases/compiler/index.ts"],"names":[],"mappings":"AAAA;IAAA;IAOA,CAAC;IANG,qBAAO,GAAP,UAAQ,CAAc;QAClB,OAAO,EAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,CAAC;IACpB,CAAC;IACM,QAAI,GAAX;QACI,OAAO,IAAI,GAAG,EAAE,CAAC;IACrB,CAAC;IACL,UAAC;AAAD,CAAC,AAPD,IAOC;ACPD,IAAM,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC;AACpB,CAAC,CAAC,OAAO,CAAC,EAAC,CAAC,EAAE,EAAE,EAAC,CAAC,CAAC;AAEnB,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAC,CAAC,EAAE,EAAE,EAAC,CAAC,CAAC"}//// [bundle.d.ts.map]
{"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["tests/cases/compiler/a.ts","tests/cases/compiler/index.ts"],"names":[],"mappings":"AAAA;IACI,OAAO,CAAC,CAAC,EAAE;QAAC,CAAC,EAAE,MAAM,CAAA;KAAC;;;IAGtB,MAAM,CAAC,IAAI;CAGd;ACPD,QAAA,MAAM,CAAC,KAAY,CAAC;AAGpB,QAAA,IAAI,CAAC;;CAAqB,CAAC"}

View file

@ -0,0 +1,433 @@
===================================================================
JsFile: bundle.js
mapUrl: bundle.js.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/index.ts
===================================================================
-------------------------------------------------------------------
emittedFile:bundle.js
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>var Foo = /** @class */ (function () {
1 >
2 >^^^^^^^^^^^^^^^^^^^^^->
1 >
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
---
>>> function Foo() {
1->^^^^
2 > ^^->
1->
1->Emitted(2, 5) Source(1, 1) + SourceIndex(0)
---
>>> }
1->^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1->class Foo {
> doThing(x: {a: number}) {
> return {b: x.a};
> }
> static make() {
> return new Foo();
> }
>
2 > }
1->Emitted(3, 5) Source(8, 1) + SourceIndex(0)
2 >Emitted(3, 6) Source(8, 2) + SourceIndex(0)
---
>>> Foo.prototype.doThing = function (x) {
1->^^^^
2 > ^^^^^^^^^^^^^^^^^^^^^
3 > ^^^
4 > ^^^^^^^^^^
5 > ^
1->
2 > doThing
3 >
4 > doThing(
5 > x: {a: number}
1->Emitted(4, 5) Source(2, 5) + SourceIndex(0)
2 >Emitted(4, 26) Source(2, 12) + SourceIndex(0)
3 >Emitted(4, 29) Source(2, 5) + SourceIndex(0)
4 >Emitted(4, 39) Source(2, 13) + SourceIndex(0)
5 >Emitted(4, 40) Source(2, 27) + SourceIndex(0)
---
>>> return { b: x.a };
1 >^^^^^^^^
2 > ^^^^^^^
3 > ^^
4 > ^
5 > ^^
6 > ^
7 > ^
8 > ^
9 > ^^
10> ^
1 >) {
>
2 > return
3 > {
4 > b
5 > :
6 > x
7 > .
8 > a
9 > }
10> ;
1 >Emitted(5, 9) Source(3, 9) + SourceIndex(0)
2 >Emitted(5, 16) Source(3, 16) + SourceIndex(0)
3 >Emitted(5, 18) Source(3, 17) + SourceIndex(0)
4 >Emitted(5, 19) Source(3, 18) + SourceIndex(0)
5 >Emitted(5, 21) Source(3, 20) + SourceIndex(0)
6 >Emitted(5, 22) Source(3, 21) + SourceIndex(0)
7 >Emitted(5, 23) Source(3, 22) + SourceIndex(0)
8 >Emitted(5, 24) Source(3, 23) + SourceIndex(0)
9 >Emitted(5, 26) Source(3, 24) + SourceIndex(0)
10>Emitted(5, 27) Source(3, 25) + SourceIndex(0)
---
>>> };
1 >^^^^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^->
1 >
>
2 > }
1 >Emitted(6, 5) Source(4, 5) + SourceIndex(0)
2 >Emitted(6, 6) Source(4, 6) + SourceIndex(0)
---
>>> Foo.make = function () {
1->^^^^
2 > ^^^^^^^^
3 > ^^^
4 > ^^^^^^^^^^^->
1->
> static
2 > make
3 >
1->Emitted(7, 5) Source(5, 12) + SourceIndex(0)
2 >Emitted(7, 13) Source(5, 16) + SourceIndex(0)
3 >Emitted(7, 16) Source(5, 5) + SourceIndex(0)
---
>>> return new Foo();
1->^^^^^^^^
2 > ^^^^^^^
3 > ^^^^
4 > ^^^
5 > ^^
6 > ^
1->static make() {
>
2 > return
3 > new
4 > Foo
5 > ()
6 > ;
1->Emitted(8, 9) Source(6, 9) + SourceIndex(0)
2 >Emitted(8, 16) Source(6, 16) + SourceIndex(0)
3 >Emitted(8, 20) Source(6, 20) + SourceIndex(0)
4 >Emitted(8, 23) Source(6, 23) + SourceIndex(0)
5 >Emitted(8, 25) Source(6, 25) + SourceIndex(0)
6 >Emitted(8, 26) Source(6, 26) + SourceIndex(0)
---
>>> };
1 >^^^^
2 > ^
3 > ^^^^^^^^^^^->
1 >
>
2 > }
1 >Emitted(9, 5) Source(7, 5) + SourceIndex(0)
2 >Emitted(9, 6) Source(7, 6) + SourceIndex(0)
---
>>> return Foo;
1->^^^^
2 > ^^^^^^^^^^
1->
>
2 > }
1->Emitted(10, 5) Source(8, 1) + SourceIndex(0)
2 >Emitted(10, 15) Source(8, 2) + SourceIndex(0)
---
>>>}());
1 >
2 >^
3 >
4 > ^^^^
5 > ^^^^^^^^^^^^^^->
1 >
2 >}
3 >
4 > class Foo {
> doThing(x: {a: number}) {
> return {b: x.a};
> }
> static make() {
> return new Foo();
> }
> }
1 >Emitted(11, 1) Source(8, 1) + SourceIndex(0)
2 >Emitted(11, 2) Source(8, 2) + SourceIndex(0)
3 >Emitted(11, 2) Source(1, 1) + SourceIndex(0)
4 >Emitted(11, 6) Source(8, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:bundle.js
sourceFile:tests/cases/compiler/index.ts
-------------------------------------------------------------------
>>>var c = new Foo();
1->
2 >^^^^
3 > ^
4 > ^^^
5 > ^^^^
6 > ^^^
7 > ^^
8 > ^
9 > ^^^^->
1->
2 >const
3 > c
4 > =
5 > new
6 > Foo
7 > ()
8 > ;
1->Emitted(12, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(12, 5) Source(1, 7) + SourceIndex(1)
3 >Emitted(12, 6) Source(1, 8) + SourceIndex(1)
4 >Emitted(12, 9) Source(1, 11) + SourceIndex(1)
5 >Emitted(12, 13) Source(1, 15) + SourceIndex(1)
6 >Emitted(12, 16) Source(1, 18) + SourceIndex(1)
7 >Emitted(12, 18) Source(1, 20) + SourceIndex(1)
8 >Emitted(12, 19) Source(1, 21) + SourceIndex(1)
---
>>>c.doThing({ a: 42 });
1->
2 >^
3 > ^
4 > ^^^^^^^
5 > ^
6 > ^^
7 > ^
8 > ^^
9 > ^^
10> ^^
11> ^
12> ^
13> ^^^^^^^^^->
1->
>
2 >c
3 > .
4 > doThing
5 > (
6 > {
7 > a
8 > :
9 > 42
10> }
11> )
12> ;
1->Emitted(13, 1) Source(2, 1) + SourceIndex(1)
2 >Emitted(13, 2) Source(2, 2) + SourceIndex(1)
3 >Emitted(13, 3) Source(2, 3) + SourceIndex(1)
4 >Emitted(13, 10) Source(2, 10) + SourceIndex(1)
5 >Emitted(13, 11) Source(2, 11) + SourceIndex(1)
6 >Emitted(13, 13) Source(2, 12) + SourceIndex(1)
7 >Emitted(13, 14) Source(2, 13) + SourceIndex(1)
8 >Emitted(13, 16) Source(2, 15) + SourceIndex(1)
9 >Emitted(13, 18) Source(2, 17) + SourceIndex(1)
10>Emitted(13, 20) Source(2, 18) + SourceIndex(1)
11>Emitted(13, 21) Source(2, 19) + SourceIndex(1)
12>Emitted(13, 22) Source(2, 20) + SourceIndex(1)
---
>>>var x = c.doThing({ a: 12 });
1->
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^^
8 > ^
9 > ^^
10> ^
11> ^^
12> ^^
13> ^^
14> ^
15> ^
16> ^^^^->
1->
>
>
2 >let
3 > x
4 > =
5 > c
6 > .
7 > doThing
8 > (
9 > {
10> a
11> :
12> 12
13> }
14> )
15> ;
1->Emitted(14, 1) Source(4, 1) + SourceIndex(1)
2 >Emitted(14, 5) Source(4, 5) + SourceIndex(1)
3 >Emitted(14, 6) Source(4, 6) + SourceIndex(1)
4 >Emitted(14, 9) Source(4, 9) + SourceIndex(1)
5 >Emitted(14, 10) Source(4, 10) + SourceIndex(1)
6 >Emitted(14, 11) Source(4, 11) + SourceIndex(1)
7 >Emitted(14, 18) Source(4, 18) + SourceIndex(1)
8 >Emitted(14, 19) Source(4, 19) + SourceIndex(1)
9 >Emitted(14, 21) Source(4, 20) + SourceIndex(1)
10>Emitted(14, 22) Source(4, 21) + SourceIndex(1)
11>Emitted(14, 24) Source(4, 23) + SourceIndex(1)
12>Emitted(14, 26) Source(4, 25) + SourceIndex(1)
13>Emitted(14, 28) Source(4, 26) + SourceIndex(1)
14>Emitted(14, 29) Source(4, 27) + SourceIndex(1)
15>Emitted(14, 30) Source(4, 28) + SourceIndex(1)
---
>>>//# sourceMappingURL=bundle.js.map===================================================================
JsFile: bundle.d.ts
mapUrl: bundle.d.ts.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/index.ts
===================================================================
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>declare class Foo {
1 >
2 >^^^^^^^^^^^^^^^^^->
1 >
1 >Emitted(1, 1) Source(1, 1) + SourceIndex(0)
---
>>> doThing(x: {
1->^^^^
2 > ^^^^^^^
3 > ^
4 > ^
5 > ^^
6 > ^^^^->
1->class Foo {
>
2 > doThing
3 > (
4 > x
5 > :
1->Emitted(2, 5) Source(2, 5) + SourceIndex(0)
2 >Emitted(2, 12) Source(2, 12) + SourceIndex(0)
3 >Emitted(2, 13) Source(2, 13) + SourceIndex(0)
4 >Emitted(2, 14) Source(2, 14) + SourceIndex(0)
5 >Emitted(2, 16) Source(2, 16) + SourceIndex(0)
---
>>> a: number;
1->^^^^^^^^
2 > ^
3 > ^^
4 > ^^^^^^
5 > ^
1->{
2 > a
3 > :
4 > number
5 >
1->Emitted(3, 9) Source(2, 17) + SourceIndex(0)
2 >Emitted(3, 10) Source(2, 18) + SourceIndex(0)
3 >Emitted(3, 12) Source(2, 20) + SourceIndex(0)
4 >Emitted(3, 18) Source(2, 26) + SourceIndex(0)
5 >Emitted(3, 19) Source(2, 26) + SourceIndex(0)
---
>>> }): {
1 >^^^^^
2 > ^^^^^^^^^^^^^^->
1 >}
1 >Emitted(4, 6) Source(2, 27) + SourceIndex(0)
---
>>> b: number;
>>> };
>>> static make(): Foo;
1->^^^^
2 > ^^^^^^
3 > ^
4 > ^^^^
1->) {
> return {b: x.a};
> }
>
2 > static
3 >
4 > make
1->Emitted(7, 5) Source(5, 5) + SourceIndex(0)
2 >Emitted(7, 11) Source(5, 11) + SourceIndex(0)
3 >Emitted(7, 12) Source(5, 12) + SourceIndex(0)
4 >Emitted(7, 16) Source(5, 16) + SourceIndex(0)
---
>>>}
1 >^
2 > ^^^^^^^^^^^^^^^^^^^^^->
1 >() {
> return new Foo();
> }
>}
1 >Emitted(8, 2) Source(8, 2) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:bundle.d.ts
sourceFile:tests/cases/compiler/index.ts
-------------------------------------------------------------------
>>>declare const c: Foo;
1->
2 >^^^^^^^^
3 > ^^^^^^
4 > ^
5 > ^^^^^
6 > ^
1->
2 >
3 > const
4 > c
5 > = new Foo()
6 > ;
1->Emitted(9, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(9, 9) Source(1, 1) + SourceIndex(1)
3 >Emitted(9, 15) Source(1, 7) + SourceIndex(1)
4 >Emitted(9, 16) Source(1, 8) + SourceIndex(1)
5 >Emitted(9, 21) Source(1, 20) + SourceIndex(1)
6 >Emitted(9, 22) Source(1, 21) + SourceIndex(1)
---
>>>declare let x: {
1 >
2 >^^^^^^^^
3 > ^^^^
4 > ^
5 > ^^->
1 >
>c.doThing({a: 42});
>
>
2 >
3 > let
4 > x
1 >Emitted(10, 1) Source(4, 1) + SourceIndex(1)
2 >Emitted(10, 9) Source(4, 1) + SourceIndex(1)
3 >Emitted(10, 13) Source(4, 5) + SourceIndex(1)
4 >Emitted(10, 14) Source(4, 6) + SourceIndex(1)
---
>>> b: number;
>>>};
1->^
2 > ^
3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1-> = c.doThing({a: 12})
2 > ;
1->Emitted(12, 2) Source(4, 27) + SourceIndex(1)
2 >Emitted(12, 3) Source(4, 28) + SourceIndex(1)
---
>>>//# sourceMappingURL=bundle.d.ts.map

View file

@ -0,0 +1,40 @@
=== tests/cases/compiler/a.ts ===
class Foo {
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
doThing(x: {a: number}) {
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
return {b: x.a};
>b : Symbol(b, Decl(a.ts, 2, 16))
>x.a : Symbol(a, Decl(a.ts, 1, 16))
>x : Symbol(x, Decl(a.ts, 1, 12))
>a : Symbol(a, Decl(a.ts, 1, 16))
}
static make() {
>make : Symbol(Foo.make, Decl(a.ts, 3, 5))
return new Foo();
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
}
}
=== tests/cases/compiler/index.ts ===
const c = new Foo();
>c : Symbol(c, Decl(index.ts, 0, 5))
>Foo : Symbol(Foo, Decl(a.ts, 0, 0))
c.doThing({a: 42});
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>c : Symbol(c, Decl(index.ts, 0, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>a : Symbol(a, Decl(index.ts, 1, 11))
let x = c.doThing({a: 12});
>x : Symbol(x, Decl(index.ts, 3, 3))
>c.doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>c : Symbol(c, Decl(index.ts, 0, 5))
>doThing : Symbol(Foo.doThing, Decl(a.ts, 0, 11))
>a : Symbol(a, Decl(index.ts, 3, 19))

View file

@ -0,0 +1,49 @@
=== tests/cases/compiler/a.ts ===
class Foo {
>Foo : Foo
doThing(x: {a: number}) {
>doThing : (x: { a: number; }) => { b: number; }
>x : { a: number; }
>a : number
return {b: x.a};
>{b: x.a} : { b: number; }
>b : number
>x.a : number
>x : { a: number; }
>a : number
}
static make() {
>make : () => Foo
return new Foo();
>new Foo() : Foo
>Foo : typeof Foo
}
}
=== tests/cases/compiler/index.ts ===
const c = new Foo();
>c : Foo
>new Foo() : Foo
>Foo : typeof Foo
c.doThing({a: 42});
>c.doThing({a: 42}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 42} : { a: number; }
>a : number
>42 : 42
let x = c.doThing({a: 12});
>x : { b: number; }
>c.doThing({a: 12}) : { b: number; }
>c.doThing : (x: { a: number; }) => { b: number; }
>c : Foo
>doThing : (x: { a: number; }) => { b: number; }
>{a: 12} : { a: number; }
>a : number
>12 : 12

View file

@ -0,0 +1,23 @@
error TS5052: Option 'declarationMap' cannot be specified without specifying option 'declaration'.
!!! error TS5052: Option 'declarationMap' cannot be specified without specifying option 'declaration'.
==== tests/cases/compiler/declarationMapsWithoutDeclaration.ts (0 errors) ====
module m2 {
export interface connectModule {
(res, req, next): void;
}
export interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;

View file

@ -0,0 +1,24 @@
//// [declarationMapsWithoutDeclaration.ts]
module m2 {
export interface connectModule {
(res, req, next): void;
}
export interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;
//// [declarationMapsWithoutDeclaration.js]
"use strict";
var m2;
module.exports = m2;

View file

@ -0,0 +1,50 @@
=== tests/cases/compiler/declarationMapsWithoutDeclaration.ts ===
module m2 {
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))
export interface connectModule {
>connectModule : Symbol(connectModule, Decl(declarationMapsWithoutDeclaration.ts, 0, 11))
(res, req, next): void;
>res : Symbol(res, Decl(declarationMapsWithoutDeclaration.ts, 2, 9))
>req : Symbol(req, Decl(declarationMapsWithoutDeclaration.ts, 2, 13))
>next : Symbol(next, Decl(declarationMapsWithoutDeclaration.ts, 2, 18))
}
export interface connectExport {
>connectExport : Symbol(connectExport, Decl(declarationMapsWithoutDeclaration.ts, 3, 5))
use: (mod: connectModule) => connectExport;
>use : Symbol(connectExport.use, Decl(declarationMapsWithoutDeclaration.ts, 4, 36))
>mod : Symbol(mod, Decl(declarationMapsWithoutDeclaration.ts, 5, 14))
>connectModule : Symbol(connectModule, Decl(declarationMapsWithoutDeclaration.ts, 0, 11))
>connectExport : Symbol(connectExport, Decl(declarationMapsWithoutDeclaration.ts, 3, 5))
listen: (port: number) => void;
>listen : Symbol(connectExport.listen, Decl(declarationMapsWithoutDeclaration.ts, 5, 51))
>port : Symbol(port, Decl(declarationMapsWithoutDeclaration.ts, 6, 17))
}
}
var m2: {
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))
(): m2.connectExport;
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))
>connectExport : Symbol(m2.connectExport, Decl(declarationMapsWithoutDeclaration.ts, 3, 5))
test1: m2.connectModule;
>test1 : Symbol(test1, Decl(declarationMapsWithoutDeclaration.ts, 12, 25))
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))
>connectModule : Symbol(m2.connectModule, Decl(declarationMapsWithoutDeclaration.ts, 0, 11))
test2(): m2.connectModule;
>test2 : Symbol(test2, Decl(declarationMapsWithoutDeclaration.ts, 13, 28))
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))
>connectModule : Symbol(m2.connectModule, Decl(declarationMapsWithoutDeclaration.ts, 0, 11))
};
export = m2;
>m2 : Symbol(m2, Decl(declarationMapsWithoutDeclaration.ts, 0, 0), Decl(declarationMapsWithoutDeclaration.ts, 11, 3))

View file

@ -0,0 +1,50 @@
=== tests/cases/compiler/declarationMapsWithoutDeclaration.ts ===
module m2 {
>m2 : { (): connectExport; test1: connectModule; test2(): connectModule; }
export interface connectModule {
>connectModule : connectModule
(res, req, next): void;
>res : any
>req : any
>next : any
}
export interface connectExport {
>connectExport : connectExport
use: (mod: connectModule) => connectExport;
>use : (mod: connectModule) => connectExport
>mod : connectModule
>connectModule : connectModule
>connectExport : connectExport
listen: (port: number) => void;
>listen : (port: number) => void
>port : number
}
}
var m2: {
>m2 : { (): m2.connectExport; test1: m2.connectModule; test2(): m2.connectModule; }
(): m2.connectExport;
>m2 : any
>connectExport : m2.connectExport
test1: m2.connectModule;
>test1 : m2.connectModule
>m2 : any
>connectModule : m2.connectModule
test2(): m2.connectModule;
>test2 : () => m2.connectModule
>m2 : any
>connectModule : m2.connectModule
};
export = m2;
>m2 : { (): m2.connectExport; test1: m2.connectModule; test2(): m2.connectModule; }

View file

@ -1,8 +1,8 @@
error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
error TS5053: Option 'mapRoot' cannot be specified with option 'inlineSourceMap'.
error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
!!! error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
!!! error TS5053: Option 'mapRoot' cannot be specified with option 'inlineSourceMap'.
!!! error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
==== tests/cases/compiler/optionsInlineSourceMapMapRoot.ts (0 errors) ====
var a = 10;

View file

@ -1,9 +1,9 @@
error TS5051: Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.
error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
!!! error TS5051: Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.
!!! error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
!!! error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
==== m1.ts (0 errors) ====
var m1_a1 = 10;
class m1_c1 {

View file

@ -1,9 +1,9 @@
error TS5051: Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.
error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
!!! error TS5051: Option 'sourceRoot can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.
!!! error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
!!! error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
==== m1.ts (0 errors) ====
var m1_a1 = 10;
class m1_c1 {

View file

@ -1,7 +1,7 @@
error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
!!! error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
!!! error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
==== m1.ts (0 errors) ====
var m1_a1 = 10;
class m1_c1 {

View file

@ -1,7 +1,7 @@
error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
!!! error TS5052: Option 'mapRoot' cannot be specified without specifying option 'sourceMap'.
!!! error TS5069: Option 'mapRoot' cannot be specified without specifying option 'sourceMap' or option 'declarationMap'.
==== m1.ts (0 errors) ====
var m1_a1 = 10;
class m1_c1 {

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
"jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -8,6 +8,7 @@
// "checkJs": true, /* Report errors in .js files. */
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
// "declaration": true, /* Generates corresponding '.d.ts' file. */
// "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
// "sourceMap": true, /* Generates corresponding '.map' file. */
// "outFile": "./", /* Concatenate and emit output to single file. */
// "outDir": "./", /* Redirect output structure to the directory. */

View file

@ -0,0 +1,20 @@
// @declaration: true
// @declarationMap: true
module m2 {
export interface connectModule {
(res, req, next): void;
}
export interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;

View file

@ -0,0 +1,19 @@
// @declaration: true
// @declarationMap: true
// @filename: a.ts
export class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
// @filename: index.ts
import {Foo} from "./a";
const c = new Foo();
c.doThing({a: 42});
export let x = c.doThing({a: 12});
export { c, Foo };

View file

@ -0,0 +1,21 @@
// @declaration: true
// @declarationMap: true
// @module: amd
// @outFile: bundle.js
// @filename: a.ts
export class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
// @filename: index.ts
import {Foo} from "./a";
const c = new Foo();
c.doThing({a: 42});
export let x = c.doThing({a: 12});
export { c, Foo };

View file

@ -0,0 +1,17 @@
// @declaration: true
// @declarationMap: true
// @outFile: bundle.js
// @filename: a.ts
class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
// @filename: index.ts
const c = new Foo();
c.doThing({a: 42});
let x = c.doThing({a: 12});

View file

@ -0,0 +1,18 @@
// @declaration: true
// @declarationMap: true
// @outFile: bundle.js
// @sourceMap: true
// @filename: a.ts
class Foo {
doThing(x: {a: number}) {
return {b: x.a};
}
static make() {
return new Foo();
}
}
// @filename: index.ts
const c = new Foo();
c.doThing({a: 42});
let x = c.doThing({a: 12});

View file

@ -0,0 +1,19 @@
// @declarationMap: true
module m2 {
export interface connectModule {
(res, req, next): void;
}
export interface connectExport {
use: (mod: connectModule) => connectExport;
listen: (port: number) => void;
}
}
var m2: {
(): m2.connectExport;
test1: m2.connectModule;
test2(): m2.connectModule;
};
export = m2;

View file

@ -0,0 +1,40 @@
/// <reference path="fourslash.ts" />
// @Filename: index.ts
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: indexdef.d.ts.map
////{"version":3,"file":"indexdef.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;IACI,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IACpC,WAAW;;;;;;;CAMd;AAED,MAAM,WAAW,QAAQ;IACrB,MAAM,EAAE,MAAM,CAAC;CAClB"}
// @Filename: indexdef.d.ts
////export declare class Foo {
//// member: string;
//// methodName(propName: SomeType): void;
//// otherMethod(): {
//// x: number;
//// y?: undefined;
//// } | {
//// y: string;
//// x?: undefined;
//// };
////}
////export interface SomeType {
//// member: number;
////}
//////# sourceMappingURL=indexdef.d.ts.map
// @Filename: mymodule.ts
////import * as mod from "./indexdef";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.goToDefinition("1", "2");

View file

@ -0,0 +1,34 @@
/// <reference path="fourslash.ts" />
// @BaselineFile: declarationMapsGeneratedMapsEnableMapping_NoInline.baseline
// @outDir: ./dist
// @inlineSourceMap: true
// @declaration: true
// @declarationMap: true
// @Filename: index.ts
// @emitThisFile: true
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: mymodule.ts
////import * as mod from "/dist/index";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.baselineGetEmitOutput(/*insertResultIntoVfs*/ true);
verify.goToDefinition("1", "2"); // getDefinitionAndBoundSpan
verify.goToType("1", "2"); // getTypeDefinitionAtPosition
goTo.marker("1");
verify.goToDefinitionIs("2"); // getDefinitionAtPosition
goTo.implementation(); // getImplementationAtPosition
verify.caretAtMarker("2");

View file

@ -0,0 +1,35 @@
/// <reference path="fourslash.ts" />
// @BaselineFile: declarationMapsGeneratedMapsEnableMapping_NoInlineSources.baseline
// @outDir: ./dist
// @inlineSourceMap: true
// @inlineSources: true
// @declaration: true
// @declarationMap: true
// @Filename: index.ts
// @emitThisFile: true
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: mymodule.ts
////import * as mod from "/dist/index";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.baselineGetEmitOutput(/*insertResultIntoVfs*/ true);
verify.goToDefinition("1", "2"); // getDefinitionAndBoundSpan
verify.goToType("1", "2"); // getTypeDefinitionAtPosition
goTo.marker("1");
verify.goToDefinitionIs("2"); // getDefinitionAtPosition
goTo.implementation(); // getImplementationAtPosition
verify.caretAtMarker("2");

View file

@ -0,0 +1,33 @@
/// <reference path="fourslash.ts" />
// @BaselineFile: declarationMapsGeneratedMapsEnableMapping.baseline
// @outDir: ./dist
// @declaration: true
// @declarationMap: true
// @Filename: index.ts
// @emitThisFile: true
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: mymodule.ts
////import * as mod from "/dist/index";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.baselineGetEmitOutput(/*insertResultIntoVfs*/ true);
verify.goToDefinition("1", "2"); // getDefinitionAndBoundSpan
verify.goToType("1", "2"); // getTypeDefinitionAtPosition
goTo.marker("1");
verify.goToDefinitionIs("2"); // getDefinitionAtPosition
goTo.implementation(); // getImplementationAtPosition
verify.caretAtMarker("2");

View file

@ -0,0 +1,35 @@
/// <reference path="fourslash.ts" />
// @BaselineFile: declarationMapsGeneratedMapsEnableMapping2.baseline
// @outDir: ./dist
// @sourceMap: true
// @sourceRoot: /tests/cases/fourslash/
// @declaration: true
// @declarationMap: true
// @Filename: index.ts
// @emitThisFile: true
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: mymodule.ts
////import * as mod from "/dist/index";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.baselineGetEmitOutput(/*insertResultIntoVfs*/ true);
verify.goToDefinition("1", "2"); // getDefinitionAndBoundSpan
verify.goToType("1", "2"); // getTypeDefinitionAtPosition
goTo.marker("1");
verify.goToDefinitionIs("2"); // getDefinitionAtPosition
goTo.implementation(); // getImplementationAtPosition
verify.caretAtMarker("2");

View file

@ -0,0 +1,34 @@
/// <reference path="fourslash.ts" />
// @BaselineFile: declarationMapsGeneratedMapsEnableMapping3.baseline
// @outDir: ./dist
// @sourceRoot: /tests/cases/fourslash/
// @declaration: true
// @declarationMap: true
// @Filename: index.ts
// @emitThisFile: true
////export class Foo {
//// member: string;
//// /*2*/methodName(propName: SomeType): void {}
//// otherMethod() {
//// if (Math.random() > 0.5) {
//// return {x: 42};
//// }
//// return {y: "yes"};
//// }
////}
////
////export interface SomeType {
//// member: number;
////}
// @Filename: mymodule.ts
////import * as mod from "/dist/index";
////const instance = new mod.Foo();
////instance.[|/*1*/methodName|]({member: 12});
verify.baselineGetEmitOutput(/*insertResultIntoVfs*/ true);
verify.goToDefinition("1", "2"); // getDefinitionAndBoundSpan
verify.goToType("1", "2"); // getTypeDefinitionAtPosition
goTo.marker("1");
verify.goToDefinitionIs("2"); // getDefinitionAtPosition
goTo.implementation(); // getImplementationAtPosition
verify.caretAtMarker("2");

View file

@ -284,7 +284,7 @@ declare namespace FourSlashInterface {
numberOfErrorsInCurrentFile(expected: number): void;
baselineCurrentFileBreakpointLocations(): void;
baselineCurrentFileNameOrDottedNameSpans(): void;
baselineGetEmitOutput(): void;
baselineGetEmitOutput(insertResultsIntoVfs?: boolean): void;
baselineQuickInfo(): void;
nameOrDottedNameSpanTextIs(text: string): void;
outliningSpansInCurrentFile(spans: Range[]): void;