mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge branch 'master' into diagnosticsCleanup
This commit is contained in:
@@ -35,7 +35,7 @@ var compilerSources = [
|
||||
"checker.ts",
|
||||
"emitter.ts",
|
||||
"commandLineParser.ts",
|
||||
"tc.ts",
|
||||
"tsc.ts",
|
||||
"diagnosticInformationMap.generated.ts"
|
||||
].map(function (f) {
|
||||
return path.join(compilerDirectory, f);
|
||||
@@ -134,7 +134,7 @@ var useDebugMode = false;
|
||||
function compileFile(outFile, sources, prereqs, prefixes, useBuiltCompiler, noOutFile) {
|
||||
file(outFile, prereqs, function() {
|
||||
var dir = useBuiltCompiler ? builtLocalDirectory : LKGDirectory;
|
||||
var compilerFilename = "tc.js";
|
||||
var compilerFilename = "tsc.js";
|
||||
var options = "-removeComments --module commonjs -noImplicitAny "; //" -propagateEnumConstants "
|
||||
|
||||
var cmd = (process.env.host || process.env.TYPESCRIPT_HOST || "node") + " " + dir + compilerFilename + " " + options + " ";
|
||||
@@ -230,15 +230,15 @@ task("generate-diagnostics", [diagnosticInfoMapTs])
|
||||
|
||||
|
||||
// Local target to build the compiler and services
|
||||
var tcFile = path.join(builtLocalDirectory, "tc.js");
|
||||
compileFile(tcFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), [copyright], /*useBuiltCompiler:*/ false);
|
||||
var tscFile = path.join(builtLocalDirectory, "tsc.js");
|
||||
compileFile(tscFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), [copyright], /*useBuiltCompiler:*/ false);
|
||||
|
||||
var tcServicesFile = path.join(builtLocalDirectory, "typescriptServices.js");
|
||||
compileFile(tcServicesFile, servicesSources, [builtLocalDirectory, copyright].concat(servicesSources), [copyright], /*useBuiltCompiler:*/ true);
|
||||
var servicesFile = path.join(builtLocalDirectory, "typescriptServices.js");
|
||||
compileFile(servicesFile, servicesSources, [builtLocalDirectory, copyright].concat(servicesSources), [copyright], /*useBuiltCompiler:*/ true);
|
||||
|
||||
// Local target to build the compiler and services
|
||||
desc("Builds the full compiler and services");
|
||||
task("local", ["generate-diagnostics", "lib", tcFile, tcServicesFile]);
|
||||
task("local", ["generate-diagnostics", "lib", tscFile, servicesFile]);
|
||||
|
||||
|
||||
// Local target to build the compiler and services
|
||||
@@ -261,7 +261,7 @@ task("clean", function() {
|
||||
// Makes a new LKG. This target does not build anything, but errors if not all the outputs are present in the built/local directory
|
||||
desc("Makes a new LKG out of the built js files");
|
||||
task("LKG", libraryTargets, function() {
|
||||
var expectedFiles = [tcFile, tcServicesFile].concat(libraryTargets);
|
||||
var expectedFiles = [tscFile, servicesFile].concat(libraryTargets);
|
||||
var missingFiles = expectedFiles.filter(function (f) {
|
||||
return !fs.existsSync(f);
|
||||
});
|
||||
@@ -285,7 +285,7 @@ directory(builtLocalDirectory);
|
||||
|
||||
// Task to build the tests infrastructure using the built compiler
|
||||
var run = path.join(builtLocalDirectory, "run.js");
|
||||
compileFile(run, harnessSources, [builtLocalDirectory, tcFile].concat(libraryTargets).concat(harnessSources), [], /*useBuiltCompiler:*/ true);
|
||||
compileFile(run, harnessSources, [builtLocalDirectory, tscFile].concat(libraryTargets).concat(harnessSources), [], /*useBuiltCompiler:*/ true);
|
||||
|
||||
var localBaseline = "tests/baselines/local/";
|
||||
var refBaseline = "tests/baselines/reference/";
|
||||
@@ -385,7 +385,7 @@ task("generate-code-coverage", ["tests", builtLocalDirectory], function () {
|
||||
// Browser tests
|
||||
var nodeServerOutFile = 'tests/webTestServer.js'
|
||||
var nodeServerInFile = 'tests/webTestServer.ts'
|
||||
compileFile(nodeServerOutFile, [nodeServerInFile], [builtLocalDirectory, tcFile], [], true, true);
|
||||
compileFile(nodeServerOutFile, [nodeServerInFile], [builtLocalDirectory, tscFile], [], true, true);
|
||||
|
||||
desc("Runs browserify on run.js to produce a file suitable for running tests in the browser");
|
||||
task("browserify", ["tests", builtLocalDirectory, nodeServerOutFile], function() {
|
||||
@@ -460,7 +460,7 @@ task("baseline-accept-rwc", function() {
|
||||
// Webhost
|
||||
var webhostPath = "tests/webhost/webtsc.ts";
|
||||
var webhostJsPath = "tests/webhost/webtsc.js";
|
||||
compileFile(webhostJsPath, [webhostPath], [tcFile, webhostPath].concat(libraryTargets), [], true);
|
||||
compileFile(webhostJsPath, [webhostPath], [tscFile, webhostPath].concat(libraryTargets), [], true);
|
||||
|
||||
desc("Builds the tsc web host");
|
||||
task("webhost", [webhostJsPath], function() {
|
||||
@@ -468,8 +468,8 @@ task("webhost", [webhostJsPath], function() {
|
||||
});
|
||||
|
||||
// Perf compiler
|
||||
var perftcPath = "tests/perftc.ts";
|
||||
var perftcJsPath = "built/local/perftc.js";
|
||||
compileFile(perftcJsPath, [perftcPath], [tcFile, perftcPath, "tests/perfsys.ts"].concat(libraryTargets), [], true);
|
||||
var perftscPath = "tests/perftsc.ts";
|
||||
var perftscJsPath = "built/local/perftsc.js";
|
||||
compileFile(perftscJsPath, [perftscPath], [tscFile, perftscPath, "tests/perfsys.ts"].concat(libraryTargets), [], true);
|
||||
desc("Builds augmented version of the compiler for perf tests");
|
||||
task("perftc", [perftcJsPath]);
|
||||
task("perftsc", [perftscJsPath]);
|
||||
|
||||
@@ -63,7 +63,7 @@ jake -T # List the above commands.
|
||||
## Usage
|
||||
|
||||
```shell
|
||||
node built/local/tc.js hello.ts
|
||||
node built/local/tsc.js hello.ts
|
||||
```
|
||||
|
||||
|
||||
|
||||
Vendored
+9
-32
@@ -317,13 +317,13 @@ interface String {
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A variable name or string literal containing the regular expression pattern and flags.
|
||||
*/
|
||||
match(regexp: string): string[];
|
||||
match(regexp: string): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A regular expression object that contains the regular expression pattern and applicable flags.
|
||||
*/
|
||||
match(regexp: RegExp): string[];
|
||||
match(regexp: RegExp): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Replaces text in a string, using a regular expression or search string.
|
||||
@@ -790,38 +790,15 @@ declare var Date: {
|
||||
now(): number;
|
||||
}
|
||||
|
||||
interface RegExpExecArray {
|
||||
[index: number]: string;
|
||||
length: number;
|
||||
|
||||
index: number;
|
||||
input: string;
|
||||
|
||||
toString(): string;
|
||||
toLocaleString(): string;
|
||||
concat(...items: string[][]): string[];
|
||||
join(separator?: string): string;
|
||||
pop(): string;
|
||||
push(...items: string[]): number;
|
||||
reverse(): string[];
|
||||
shift(): string;
|
||||
slice(start?: number, end?: number): string[];
|
||||
sort(compareFn?: (a: string, b: string) => number): string[];
|
||||
splice(start: number): string[];
|
||||
splice(start: number, deleteCount: number, ...items: string[]): string[];
|
||||
unshift(...items: string[]): number;
|
||||
|
||||
indexOf(searchElement: string, fromIndex?: number): number;
|
||||
lastIndexOf(searchElement: string, fromIndex?: number): number;
|
||||
every(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
some(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
forEach(callbackfn: (value: string, index: number, array: string[]) => void, thisArg?: any): void;
|
||||
map(callbackfn: (value: string, index: number, array: string[]) => any, thisArg?: any): any[];
|
||||
filter(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): string[];
|
||||
reduce(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
reduceRight(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
interface RegExpMatchArray extends Array<string> {
|
||||
index?: number;
|
||||
input?: string;
|
||||
}
|
||||
|
||||
interface RegExpExecArray extends Array<string> {
|
||||
index: number;
|
||||
input: string;
|
||||
}
|
||||
|
||||
interface RegExp {
|
||||
/**
|
||||
|
||||
Vendored
+9
-32
@@ -317,13 +317,13 @@ interface String {
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A variable name or string literal containing the regular expression pattern and flags.
|
||||
*/
|
||||
match(regexp: string): string[];
|
||||
match(regexp: string): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A regular expression object that contains the regular expression pattern and applicable flags.
|
||||
*/
|
||||
match(regexp: RegExp): string[];
|
||||
match(regexp: RegExp): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Replaces text in a string, using a regular expression or search string.
|
||||
@@ -790,38 +790,15 @@ declare var Date: {
|
||||
now(): number;
|
||||
}
|
||||
|
||||
interface RegExpExecArray {
|
||||
[index: number]: string;
|
||||
length: number;
|
||||
|
||||
index: number;
|
||||
input: string;
|
||||
|
||||
toString(): string;
|
||||
toLocaleString(): string;
|
||||
concat(...items: string[][]): string[];
|
||||
join(separator?: string): string;
|
||||
pop(): string;
|
||||
push(...items: string[]): number;
|
||||
reverse(): string[];
|
||||
shift(): string;
|
||||
slice(start?: number, end?: number): string[];
|
||||
sort(compareFn?: (a: string, b: string) => number): string[];
|
||||
splice(start: number): string[];
|
||||
splice(start: number, deleteCount: number, ...items: string[]): string[];
|
||||
unshift(...items: string[]): number;
|
||||
|
||||
indexOf(searchElement: string, fromIndex?: number): number;
|
||||
lastIndexOf(searchElement: string, fromIndex?: number): number;
|
||||
every(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
some(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
forEach(callbackfn: (value: string, index: number, array: string[]) => void, thisArg?: any): void;
|
||||
map(callbackfn: (value: string, index: number, array: string[]) => any, thisArg?: any): any[];
|
||||
filter(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): string[];
|
||||
reduce(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
reduceRight(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
interface RegExpMatchArray extends Array<string> {
|
||||
index?: number;
|
||||
input?: string;
|
||||
}
|
||||
|
||||
interface RegExpExecArray extends Array<string> {
|
||||
index: number;
|
||||
input: string;
|
||||
}
|
||||
|
||||
interface RegExp {
|
||||
/**
|
||||
|
||||
+1121
-358
File diff suppressed because it is too large
Load Diff
+1130
-480
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -25,7 +25,7 @@
|
||||
"url" : "https://github.com/Microsoft/TypeScript.git"
|
||||
},
|
||||
"preferGlobal" : true,
|
||||
"main" : "./bin/tc.js",
|
||||
"main" : "./bin/tsc.js",
|
||||
"bin" : {
|
||||
"tsc" : "./bin/tsc"
|
||||
},
|
||||
|
||||
+20
-25
@@ -46,6 +46,8 @@ module ts {
|
||||
|
||||
var globals: SymbolTable = {};
|
||||
|
||||
var globalArraySymbol: Symbol;
|
||||
|
||||
var globalObjectType: ObjectType;
|
||||
var globalFunctionType: ObjectType;
|
||||
var globalArrayType: ObjectType;
|
||||
@@ -616,8 +618,6 @@ module ts {
|
||||
members, callSignatures, constructSignatures, stringIndexType, numberIndexType);
|
||||
}
|
||||
|
||||
// Takes a VariableDeclaration because it could be an exported var from a module (VariableDeclaration),
|
||||
// a class or object type property (PropertyDeclaration), or a parameter property (ParameterDeclaration)
|
||||
function isOptionalProperty(propertySymbol: Symbol): boolean {
|
||||
if (propertySymbol.flags & SymbolFlags.Prototype) {
|
||||
return false;
|
||||
@@ -2069,7 +2069,7 @@ module ts {
|
||||
return links.resolvedType;
|
||||
}
|
||||
|
||||
function getGlobalType(name: string, arity: number = 0): ObjectType {
|
||||
function getTypeOfGlobalSymbol(symbol: Symbol, arity: number): ObjectType {
|
||||
|
||||
function getTypeDeclaration(symbol: Symbol): Declaration {
|
||||
var declarations = symbol.declarations;
|
||||
@@ -2079,14 +2079,11 @@ module ts {
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
case SyntaxKind.EnumDeclaration:
|
||||
case SyntaxKind.TypeLiteral:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
return declaration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var symbol = resolveName(undefined, name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0, name);
|
||||
if (!symbol) {
|
||||
return emptyObjectType;
|
||||
}
|
||||
@@ -2102,29 +2099,26 @@ module ts {
|
||||
return <ObjectType>type;
|
||||
}
|
||||
|
||||
// arrayType argument is used as a backup in case if globalArrayType is not defined
|
||||
function createArrayType(elementType: Type, arrayType?: ObjectType): Type {
|
||||
var rootType = globalArrayType || arrayType;
|
||||
return rootType !== emptyObjectType ? createTypeReference(<GenericType>rootType, [elementType]) : emptyObjectType;
|
||||
function getGlobalSymbol(name: string): Symbol {
|
||||
return resolveName(undefined, name, SymbolFlags.Type, Diagnostics.Cannot_find_global_type_0, name);
|
||||
}
|
||||
|
||||
function getGlobalType(name: string): ObjectType {
|
||||
return getTypeOfGlobalSymbol(getGlobalSymbol(name), 0);
|
||||
}
|
||||
|
||||
function createArrayType(elementType: Type): Type {
|
||||
// globalArrayType will be undefined if we get here during creation of the Array type. This for example happens if
|
||||
// user code augments the Array type with call or construct signatures that have an array type as the return type.
|
||||
// We instead use globalArraySymbol to obtain the (not yet fully constructed) Array type.
|
||||
var arrayType = globalArrayType || getDeclaredTypeOfSymbol(globalArraySymbol);
|
||||
return arrayType !== emptyObjectType ? createTypeReference(<GenericType>arrayType, [elementType]) : emptyObjectType;
|
||||
}
|
||||
|
||||
function getTypeFromArrayTypeNode(node: ArrayTypeNode): Type {
|
||||
var links = getNodeLinks(node);
|
||||
if (!links.resolvedType) {
|
||||
var arrayType = globalArrayType;
|
||||
if (!arrayType) {
|
||||
// if user code contains augmentation for Array type that includes call\construct signatures with arrays as parameter\return types,
|
||||
// then we might step here then during initialization of the global Array type when globalArrayType is not yet set.
|
||||
// CODE: interface Array<T> { (): number[] }
|
||||
// in this case just resolve name 'Array' again and get declared type of symbol.
|
||||
// this type is the one that eventually should be set as 'globalArrayType'.
|
||||
// NOTE: this is specific to signatures since got signatures we realize parameter\return types.
|
||||
var arrayTypeSymbol = resolveName(node, "Array", SymbolFlags.Type, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
|
||||
Debug.assert(arrayTypeSymbol);
|
||||
arrayType = getDeclaredTypeOfSymbol(arrayTypeSymbol);
|
||||
Debug.assert(arrayType);
|
||||
}
|
||||
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType), arrayType);
|
||||
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
|
||||
}
|
||||
return links.resolvedType;
|
||||
}
|
||||
@@ -6791,7 +6785,8 @@ module ts {
|
||||
getSymbolLinks(unknownSymbol).type = unknownType;
|
||||
globals[undefinedSymbol.name] = undefinedSymbol;
|
||||
// Initialize special types
|
||||
globalArrayType = getGlobalType("Array", 1);
|
||||
globalArraySymbol = getGlobalSymbol("Array");
|
||||
globalArrayType = getTypeOfGlobalSymbol(globalArraySymbol, 1);
|
||||
globalObjectType = getGlobalType("Object");
|
||||
globalFunctionType = getGlobalType("Function");
|
||||
globalStringType = getGlobalType("String");
|
||||
|
||||
@@ -89,7 +89,7 @@ module ts {
|
||||
description: Diagnostics.Do_not_emit_comments_to_output,
|
||||
},
|
||||
{
|
||||
name: "sourcemap",
|
||||
name: "sourceMap",
|
||||
type: "boolean",
|
||||
description: Diagnostics.Generates_corresponding_map_file,
|
||||
},
|
||||
|
||||
@@ -174,7 +174,7 @@ module ts {
|
||||
var result: Map<T> = {};
|
||||
|
||||
forEach(array, value => {
|
||||
result[makeKey(value)] = value
|
||||
result[makeKey(value)] = value;
|
||||
});
|
||||
|
||||
return result;
|
||||
|
||||
@@ -354,6 +354,80 @@ module ts {
|
||||
}
|
||||
}
|
||||
|
||||
// Extract comments from the given source text starting at the given position. If trailing is false, whitespace is skipped until
|
||||
// the first line break and comments between that location and the next token are returned. If trailing is true, comments occurring
|
||||
// between the given position and the next line break are returned. The return value is an array containing a TextRange for each
|
||||
// comment. Single-line comment ranges include the the beginning '//' characters but not the ending line break. Multi-line comment
|
||||
// ranges include the beginning '/* and ending '*/' characters. The return value is undefined if no comments were found.
|
||||
function getCommentRanges(text: string, pos: number, trailing: boolean): TextRange[] {
|
||||
var result: TextRange[];
|
||||
var collecting = trailing;
|
||||
while (true) {
|
||||
var ch = text.charCodeAt(pos);
|
||||
switch (ch) {
|
||||
case CharacterCodes.carriageReturn:
|
||||
if (text.charCodeAt(pos + 1) === CharacterCodes.lineFeed) pos++;
|
||||
case CharacterCodes.lineFeed:
|
||||
pos++;
|
||||
if (trailing) {
|
||||
return result;
|
||||
}
|
||||
collecting = true;
|
||||
continue;
|
||||
case CharacterCodes.tab:
|
||||
case CharacterCodes.verticalTab:
|
||||
case CharacterCodes.formFeed:
|
||||
case CharacterCodes.space:
|
||||
pos++;
|
||||
continue;
|
||||
case CharacterCodes.slash:
|
||||
var nextChar = text.charCodeAt(pos + 1);
|
||||
if (nextChar === CharacterCodes.slash || nextChar === CharacterCodes.asterisk) {
|
||||
var startPos = pos;
|
||||
pos += 2;
|
||||
if (nextChar === CharacterCodes.slash) {
|
||||
while (pos < text.length) {
|
||||
if (isLineBreak(text.charCodeAt(pos))) {
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
while (pos < text.length) {
|
||||
if (text.charCodeAt(pos) === CharacterCodes.asterisk && text.charCodeAt(pos + 1) === CharacterCodes.slash) {
|
||||
pos += 2;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if (collecting) {
|
||||
if (!result) result = [];
|
||||
result.push({ pos: startPos, end: pos });
|
||||
}
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (ch > CharacterCodes.maxAsciiCharacter && (isWhiteSpace(ch) || isLineBreak(ch))) {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
export function getLeadingComments(text: string, pos: number): TextRange[] {
|
||||
return getCommentRanges(text, pos, /*trailing*/ false);
|
||||
}
|
||||
|
||||
export function getTrailingComments(text: string, pos: number): TextRange[] {
|
||||
return getCommentRanges(text, pos, /*trailing*/ true);
|
||||
}
|
||||
|
||||
export function createScanner(languageVersion: ScriptTarget, text?: string, onError?: ErrorCallback, onComment?: CommentCallback): Scanner {
|
||||
var pos: number; // Current position (end position of text of current token)
|
||||
var len: number; // Length of text
|
||||
|
||||
@@ -362,8 +362,8 @@ module ts {
|
||||
var output = "";
|
||||
|
||||
// We want to align our "syntax" and "examples" commands to a certain margin.
|
||||
var syntaxLength = getDiagnosticText(Diagnostics.Syntax_Colon_0, "").length
|
||||
var examplesLength = getDiagnosticText(Diagnostics.Examples_Colon_0, "").length
|
||||
var syntaxLength = getDiagnosticText(Diagnostics.Syntax_Colon_0, "").length;
|
||||
var examplesLength = getDiagnosticText(Diagnostics.Examples_Colon_0, "").length;
|
||||
var marginLength = Math.max(syntaxLength, examplesLength);
|
||||
|
||||
// Build up the syntactic skeleton.
|
||||
@@ -635,8 +635,8 @@ module ts {
|
||||
|
||||
export interface SymbolAccessiblityResult {
|
||||
accessibility: SymbolAccessibility;
|
||||
errorSymbolName?: string // Optional symbol name that results in error
|
||||
errorModuleName?: string // If the symbol is not visibile from module, module's name
|
||||
errorSymbolName?: string; // Optional symbol name that results in error
|
||||
errorModuleName?: string; // If the symbol is not visibile from module, module's name
|
||||
}
|
||||
|
||||
export interface EmitResolver {
|
||||
|
||||
@@ -365,7 +365,7 @@ class CompilerBaselineRunner extends RunnerBase {
|
||||
walker.results.forEach(result => {
|
||||
var formattedLine = result.identifierName + " : " + result.type;
|
||||
if (!typeMap[file.unitName]) {
|
||||
typeMap[file.unitName] = {}
|
||||
typeMap[file.unitName] = {};
|
||||
}
|
||||
|
||||
var typeInfo = [formattedLine];
|
||||
@@ -386,7 +386,7 @@ class CompilerBaselineRunner extends RunnerBase {
|
||||
walker.results.forEach(result => {
|
||||
var formattedLine = result.identifierName + " : " + result.type;
|
||||
if (!typeMap[file.unitName]) {
|
||||
typeMap[file.unitName] = {}
|
||||
typeMap[file.unitName] = {};
|
||||
} else {
|
||||
typeLines.push('No type information for this code.');
|
||||
}
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ class WindowsScriptHostExec implements IExec {
|
||||
var process = shell.Exec(fileName + ' ' + cmdLineArgs.join(' '));
|
||||
} catch(e) {
|
||||
result.stderr = e.message;
|
||||
result.exitCode = 1
|
||||
result.exitCode = 1;
|
||||
handleResult(result);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ module FourSlash {
|
||||
}
|
||||
});
|
||||
|
||||
this.languageServiceShimHost.addScript('lib.d.ts', Harness.Compiler.libTextMinimal);
|
||||
this.languageServiceShimHost.addDefaultLibrary();
|
||||
|
||||
|
||||
// Sneak into the language service and get its compiler so we can examine the syntax trees
|
||||
@@ -466,7 +466,7 @@ module FourSlash {
|
||||
this.assertItemInCompletionList(members.entries, symbol, type, docComment, fullSymbolName, kind);
|
||||
}
|
||||
else {
|
||||
throw new Error("Expected a member list, but none was provided")
|
||||
throw new Error("Expected a member list, but none was provided");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1419,8 +1419,8 @@ module FourSlash {
|
||||
for (var i = 0; i < spans.length; i++) {
|
||||
var expectedSpan = spans[i];
|
||||
var actualSpan = actual[i];
|
||||
if (expectedSpan.start !== actualSpan.start() || expectedSpan.end !== actualSpan.end()) {
|
||||
throw new Error('verifyOutliningSpans failed - span ' + (i + 1) + ' expected: (' + expectedSpan.start + ',' + expectedSpan.end + '), actual: (' + actualSpan.start() + ',' + actualSpan.end() + ')');
|
||||
if (expectedSpan.start !== actualSpan.textSpan.start() || expectedSpan.end !== actualSpan.textSpan.end()) {
|
||||
throw new Error('verifyOutliningSpans failed - span ' + (i + 1) + ' expected: (' + expectedSpan.start + ',' + expectedSpan.end + '), actual: (' + actualSpan.textSpan.start() + ',' + actualSpan.textSpan.end() + ')');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1467,7 +1467,7 @@ module FourSlash {
|
||||
var referenceLanguageService = referenceLanguageServiceShim.languageService;
|
||||
|
||||
// Add lib.d.ts to the reference language service
|
||||
referenceLanguageServiceShimHost.addScript('lib.d.ts', Harness.Compiler.libTextMinimal);
|
||||
referenceLanguageServiceShimHost.addDefaultLibrary();
|
||||
|
||||
for (var i = 0; i < this.testData.files.length; i++) {
|
||||
var file = this.testData.files[i];
|
||||
@@ -1885,7 +1885,7 @@ module FourSlash {
|
||||
|
||||
// Cache these between executions so we don't have to re-parse them for every test
|
||||
var fourslashSourceFile: ts.SourceFile = undefined;
|
||||
var libdtsSourceFile: ts.SourceFile = undefined;
|
||||
|
||||
export function runFourSlashTestContent(content: string, fileName: string): TestXmlData {
|
||||
// Parse out the files and their metadata
|
||||
var testData = parseTestData(content, fileName);
|
||||
@@ -1896,12 +1896,11 @@ module FourSlash {
|
||||
var fourslashFilename = 'fourslash.ts';
|
||||
var tsFn = 'tests/cases/fourslash/' + fourslashFilename;
|
||||
fourslashSourceFile = fourslashSourceFile || ts.createSourceFile(tsFn, Harness.IO.readFile(tsFn), ts.ScriptTarget.ES5, /*version*/ 0, /*isOpen*/ false);
|
||||
libdtsSourceFile = libdtsSourceFile || ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, ts.ScriptTarget.ES3, /*version*/ 0, /*isOpen*/ false);
|
||||
|
||||
var files: { [filename: string]: ts.SourceFile; } = {};
|
||||
files[fourslashFilename] = fourslashSourceFile;
|
||||
files[fileName] = ts.createSourceFile(fileName, content, ts.ScriptTarget.ES5, /*version*/ 0, /*isOpen*/ false);
|
||||
files['lib.d.ts'] = libdtsSourceFile;
|
||||
files[Harness.Compiler.defaultLibFileName] = Harness.Compiler.defaultLibSourceFile;
|
||||
|
||||
var host = Harness.Compiler.createCompilerHost(files, (fn, contents) => result = contents);
|
||||
var program = ts.createProgram([fileName, fourslashFilename], {}, host);
|
||||
@@ -2040,7 +2039,7 @@ module FourSlash {
|
||||
globalOptions: opts,
|
||||
files: files,
|
||||
ranges: ranges
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
enum State {
|
||||
|
||||
+14
-14
@@ -107,7 +107,7 @@ module Utils {
|
||||
} else {
|
||||
return cache[key] = f.apply(this, arguments);
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -434,15 +434,15 @@ module Harness {
|
||||
export var libFolder: string;
|
||||
switch (Utils.getExecutionEnvironment()) {
|
||||
case Utils.ExecutionEnvironment.CScript:
|
||||
libFolder = Path.filePath(global['WScript'].ScriptFullName);
|
||||
libFolder = "built/local/";
|
||||
tcServicesFilename = "built/local/typescriptServices.js";
|
||||
break;
|
||||
case Utils.ExecutionEnvironment.Node:
|
||||
libFolder = (__dirname + '/');
|
||||
libFolder = "built/local/";
|
||||
tcServicesFilename = "built/local/typescriptServices.js";
|
||||
break;
|
||||
case Utils.ExecutionEnvironment.Browser:
|
||||
libFolder = "bin/";
|
||||
libFolder = "built/local/";
|
||||
tcServicesFilename = "built/local/typescriptServices.js";
|
||||
break;
|
||||
default:
|
||||
@@ -531,8 +531,8 @@ module Harness {
|
||||
}
|
||||
}
|
||||
|
||||
export var libText = IO.readFile(libFolder + "lib.d.ts");
|
||||
export var libTextMinimal = IO.readFile('bin/lib.core.d.ts');
|
||||
export var defaultLibFileName = 'lib.d.ts';
|
||||
export var defaultLibSourceFile = ts.createSourceFile(defaultLibFileName, IO.readFile(libFolder + 'lib.core.d.ts'), /*languageVersion*/ ts.ScriptTarget.ES5);
|
||||
|
||||
export function createCompilerHost(filemap: { [filename: string]: ts.SourceFile; }, writeFile: (fn: string, contents: string, writeByteOrderMark:boolean) => void): ts.CompilerHost {
|
||||
return {
|
||||
@@ -542,20 +542,20 @@ module Harness {
|
||||
if (fn in filemap) {
|
||||
return filemap[fn];
|
||||
} else {
|
||||
var lib = 'lib.d.ts';
|
||||
if (fn.substr(fn.length - lib.length) === lib) {
|
||||
return filemap[fn] = ts.createSourceFile('lib.d.ts', libTextMinimal, languageVersion);
|
||||
var lib = defaultLibFileName;
|
||||
if (fn === defaultLibFileName) {
|
||||
return defaultLibSourceFile;
|
||||
}
|
||||
// Don't throw here -- the compiler might be looking for a test that actually doesn't exist as part of the TC
|
||||
return null;
|
||||
}
|
||||
},
|
||||
getDefaultLibFilename: () => 'lib.d.ts',
|
||||
getDefaultLibFilename: () => defaultLibFileName,
|
||||
writeFile: writeFile,
|
||||
getCanonicalFileName: ts.getCanonicalFileName,
|
||||
useCaseSensitiveFileNames: () => sys.useCaseSensitiveFileNames,
|
||||
getNewLine: ()=> sys.newLine
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
export class HarnessCompiler {
|
||||
@@ -1018,7 +1018,7 @@ module Harness {
|
||||
}
|
||||
}
|
||||
|
||||
var fileCache: { [idx: string]: boolean } = {}
|
||||
var fileCache: { [idx: string]: boolean } = {};
|
||||
function generateActual(actualFilename: string, generateContent: () => string): string {
|
||||
// For now this is written using TypeScript, because sys is not available when running old test cases.
|
||||
// But we need to move to sys once we have
|
||||
@@ -1083,8 +1083,8 @@ module Harness {
|
||||
var lineEndingSensitive = opts && opts.LineEndingSensitive;
|
||||
|
||||
if (!lineEndingSensitive) {
|
||||
expected = expected.replace(/\r\n?/g, '\n')
|
||||
actual = actual.replace(/\r\n?/g, '\n')
|
||||
expected = expected.replace(/\r\n?/g, '\n');
|
||||
actual = actual.replace(/\r\n?/g, '\n');
|
||||
}
|
||||
|
||||
return { expected: expected, actual: actual };
|
||||
|
||||
@@ -91,7 +91,7 @@ module Harness.LanguageService {
|
||||
}
|
||||
|
||||
class CancellationToken {
|
||||
public static None: CancellationToken = new CancellationToken(null)
|
||||
public static None: CancellationToken = new CancellationToken(null);
|
||||
|
||||
constructor(private cancellationToken: ts.CancellationToken) {
|
||||
}
|
||||
@@ -175,7 +175,7 @@ module Harness.LanguageService {
|
||||
}
|
||||
|
||||
public addDefaultLibrary() {
|
||||
this.addScript("lib.d.ts", Harness.Compiler.libText);
|
||||
this.addScript(Harness.Compiler.defaultLibFileName, Harness.Compiler.defaultLibSourceFile.text);
|
||||
}
|
||||
|
||||
public getHostIdentifier(): string {
|
||||
@@ -283,7 +283,7 @@ module Harness.LanguageService {
|
||||
|
||||
/** Parse a file on disk given its fileName */
|
||||
public parseFile(fileName: string) {
|
||||
var sourceText = TypeScript.ScriptSnapshot.fromString(Harness.IO.readFile(fileName))
|
||||
var sourceText = TypeScript.ScriptSnapshot.fromString(Harness.IO.readFile(fileName));
|
||||
return this.parseSourceText(fileName, sourceText);
|
||||
}
|
||||
|
||||
|
||||
@@ -136,8 +136,8 @@ class ProjectRunner extends RunnerBase {
|
||||
|
||||
function getSourceFile(filename: string, languageVersion: ts.ScriptTarget): ts.SourceFile {
|
||||
var sourceFile: ts.SourceFile = undefined;
|
||||
if (filename === 'lib.d.ts') {
|
||||
sourceFile = ts.createSourceFile('lib.d.ts', Harness.Compiler.libTextMinimal, languageVersion);
|
||||
if (filename === Harness.Compiler.defaultLibFileName) {
|
||||
sourceFile = Harness.Compiler.defaultLibSourceFile;
|
||||
}
|
||||
else {
|
||||
assert.isTrue(!ts.filter(readInputFiles, sourceFile => sourceFile.filename == filename).length, "Compiler trying to read same file again: " + filename);
|
||||
@@ -217,7 +217,7 @@ class ProjectRunner extends RunnerBase {
|
||||
function createCompilerHost(): ts.CompilerHost {
|
||||
return {
|
||||
getSourceFile: getSourceFile,
|
||||
getDefaultLibFilename: () => "lib.d.ts",
|
||||
getDefaultLibFilename: () => Harness.Compiler.defaultLibFileName,
|
||||
writeFile: writeFile,
|
||||
getCurrentDirectory: getCurrentDirectory,
|
||||
getCanonicalFileName: ts.getCanonicalFileName,
|
||||
|
||||
@@ -41,7 +41,7 @@ var mytestconfig = 'mytest.config';
|
||||
var testconfig = 'test.config';
|
||||
var testConfigFile =
|
||||
Harness.IO.fileExists(mytestconfig) ? Harness.IO.readFile(mytestconfig) :
|
||||
(Harness.IO.fileExists(testconfig) ? Harness.IO.readFile(testconfig) : '')
|
||||
(Harness.IO.fileExists(testconfig) ? Harness.IO.readFile(testconfig) : '');
|
||||
|
||||
if (testConfigFile !== '') {
|
||||
// TODO: not sure why this is crashing mocha
|
||||
|
||||
Vendored
+22
-46
@@ -302,13 +302,13 @@ interface String {
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A variable name or string literal containing the regular expression pattern and flags.
|
||||
*/
|
||||
match(regexp: string): string[];
|
||||
match(regexp: string): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Matches a string with a regular expression, and returns an array containing the results of that search.
|
||||
* @param regexp A regular expression object that contains the regular expression pattern and applicable flags.
|
||||
*/
|
||||
match(regexp: RegExp): string[];
|
||||
match(regexp: RegExp): RegExpMatchArray;
|
||||
|
||||
/**
|
||||
* Replaces text in a string, using a regular expression or search string.
|
||||
@@ -775,38 +775,15 @@ declare var Date: {
|
||||
now(): number;
|
||||
}
|
||||
|
||||
interface RegExpExecArray {
|
||||
[index: number]: string;
|
||||
length: number;
|
||||
|
||||
index: number;
|
||||
input: string;
|
||||
|
||||
toString(): string;
|
||||
toLocaleString(): string;
|
||||
concat(...items: string[][]): string[];
|
||||
join(separator?: string): string;
|
||||
pop(): string;
|
||||
push(...items: string[]): number;
|
||||
reverse(): string[];
|
||||
shift(): string;
|
||||
slice(start?: number, end?: number): string[];
|
||||
sort(compareFn?: (a: string, b: string) => number): string[];
|
||||
splice(start: number): string[];
|
||||
splice(start: number, deleteCount: number, ...items: string[]): string[];
|
||||
unshift(...items: string[]): number;
|
||||
|
||||
indexOf(searchElement: string, fromIndex?: number): number;
|
||||
lastIndexOf(searchElement: string, fromIndex?: number): number;
|
||||
every(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
some(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): boolean;
|
||||
forEach(callbackfn: (value: string, index: number, array: string[]) => void, thisArg?: any): void;
|
||||
map(callbackfn: (value: string, index: number, array: string[]) => any, thisArg?: any): any[];
|
||||
filter(callbackfn: (value: string, index: number, array: string[]) => boolean, thisArg?: any): string[];
|
||||
reduce(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
reduceRight(callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: string[]) => any, initialValue?: any): any;
|
||||
interface RegExpMatchArray extends Array<string> {
|
||||
index?: number;
|
||||
input?: string;
|
||||
}
|
||||
|
||||
interface RegExpExecArray extends Array<string> {
|
||||
index: number;
|
||||
input: string;
|
||||
}
|
||||
|
||||
interface RegExp {
|
||||
/**
|
||||
@@ -964,11 +941,24 @@ declare var JSON: JSON;
|
||||
/////////////////////////////
|
||||
|
||||
interface Array<T> {
|
||||
/**
|
||||
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
|
||||
*/
|
||||
length: number;
|
||||
/**
|
||||
* Returns a string representation of an array.
|
||||
*/
|
||||
toString(): string;
|
||||
toLocaleString(): string;
|
||||
/**
|
||||
* Appends new elements to an array, and returns the new length of the array.
|
||||
* @param items New elements of the Array.
|
||||
*/
|
||||
push(...items: T[]): number;
|
||||
/**
|
||||
* Removes the last element from an array and returns it.
|
||||
*/
|
||||
pop(): T;
|
||||
/**
|
||||
* Combines two or more arrays.
|
||||
* @param items Additional items to add to the end of array1.
|
||||
@@ -984,15 +974,6 @@ interface Array<T> {
|
||||
* @param separator A string used to separate one element of an array from the next in the resulting String. If omitted, the array elements are separated with a comma.
|
||||
*/
|
||||
join(separator?: string): string;
|
||||
/**
|
||||
* Removes the last element from an array and returns it.
|
||||
*/
|
||||
pop(): T;
|
||||
/**
|
||||
* Appends new elements to an array, and returns the new length of the array.
|
||||
* @param items New elements of the Array.
|
||||
*/
|
||||
push(...items: T[]): number;
|
||||
/**
|
||||
* Reverses the elements in an Array.
|
||||
*/
|
||||
@@ -1109,11 +1090,6 @@ interface Array<T> {
|
||||
*/
|
||||
reduceRight<U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U;
|
||||
|
||||
/**
|
||||
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
|
||||
*/
|
||||
length: number;
|
||||
|
||||
[n: number]: T;
|
||||
}
|
||||
declare var Array: {
|
||||
|
||||
@@ -36,7 +36,7 @@ module TypeScript.Services {
|
||||
if (start(currentToken) === position) {
|
||||
var closingBraceKind = BraceMatcher.getMatchingCloseBraceTokenKind(currentToken);
|
||||
if (closingBraceKind !== null) {
|
||||
var parentElement = currentToken.parent
|
||||
var parentElement = currentToken.parent;
|
||||
var currentPosition = fullStart(currentToken.parent);
|
||||
for (var i = 0, n = childCount(parentElement); i < n; i++) {
|
||||
var element = childAt(parentElement, i);
|
||||
@@ -87,7 +87,7 @@ module TypeScript.Services {
|
||||
var element = positionedElement !== null && positionedElement;
|
||||
switch (element.kind()) {
|
||||
case TypeScript.SyntaxKind.OpenBraceToken:
|
||||
return TypeScript.SyntaxKind.CloseBraceToken
|
||||
return TypeScript.SyntaxKind.CloseBraceToken;
|
||||
case TypeScript.SyntaxKind.OpenParenToken:
|
||||
return TypeScript.SyntaxKind.CloseParenToken;
|
||||
case TypeScript.SyntaxKind.OpenBracketToken:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
///<reference path='references.ts' />
|
||||
|
||||
module TypeScript {
|
||||
var proto = "__proto__"
|
||||
var proto = "__proto__";
|
||||
|
||||
class BlockIntrinsics<T> {
|
||||
public prototype: T = undefined;
|
||||
|
||||
@@ -155,7 +155,7 @@ module TypeScript {
|
||||
|
||||
config.name = name;
|
||||
config.short = short;
|
||||
config.flag = true
|
||||
config.flag = true;
|
||||
|
||||
this.options.push(config);
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ module TypeScript {
|
||||
var noDefaultLib = false;
|
||||
var diagnostics: Diagnostic[] = [];
|
||||
var referencedFiles: IFileReference[] = [];
|
||||
var lineMap = text.lineMap()
|
||||
var lineMap = text.lineMap();
|
||||
|
||||
for (var i = 0, n = leadingTrivia.count(); i < n; i++) {
|
||||
var trivia = leadingTrivia.syntaxTriviaAt(i);
|
||||
|
||||
@@ -94,9 +94,9 @@ module TypeScript {
|
||||
var expectedAst = this.mappingLevel.pop();
|
||||
if (ast !== expectedAst) {
|
||||
var expectedAstInfo: any = (<any>expectedAst).kind ? SyntaxKind[(<any>expectedAst).kind] : [expectedAst.start(), expectedAst.end()];
|
||||
var astInfo: any = (<any>ast).kind ? SyntaxKind[(<any>ast).kind] : [ast.start(), ast.end()]
|
||||
var astInfo: any = (<any>ast).kind ? SyntaxKind[(<any>ast).kind] : [ast.start(), ast.end()];
|
||||
Debug.fail(
|
||||
"Provided ast is not the expected ISyntaxElement, Expected: " + expectedAstInfo + " Given: " + astInfo)
|
||||
"Provided ast is not the expected ISyntaxElement, Expected: " + expectedAstInfo + " Given: " + astInfo);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ module TypeScript {
|
||||
|
||||
export class CancellationToken {
|
||||
|
||||
public static None: CancellationToken = new CancellationToken(null)
|
||||
public static None: CancellationToken = new CancellationToken(null);
|
||||
|
||||
constructor(private cancellationToken: ICancellationToken) {
|
||||
}
|
||||
@@ -237,7 +237,7 @@ module TypeScript {
|
||||
};
|
||||
});
|
||||
documents.sort((x, y) => y.refCount - x.refCount);
|
||||
return { bucket: name, documents: documents }
|
||||
return { bucket: name, documents: documents };
|
||||
});
|
||||
return JSON.stringify(bucketInfoArray, null, 2);
|
||||
}
|
||||
@@ -705,7 +705,7 @@ module TypeScript {
|
||||
//
|
||||
|
||||
public getSyntacticDiagnostics(fileName: string): Diagnostic[] {
|
||||
fileName = TypeScript.switchToForwardSlashes(fileName)
|
||||
fileName = TypeScript.switchToForwardSlashes(fileName);
|
||||
return this.getDocument(fileName).diagnostics();
|
||||
}
|
||||
|
||||
@@ -724,7 +724,7 @@ module TypeScript {
|
||||
var document = this.getDocument(fileName);
|
||||
|
||||
var startTime = (new Date()).getTime();
|
||||
PullTypeResolver.typeCheck(this.compilationSettings(), this.semanticInfoChain, document)
|
||||
PullTypeResolver.typeCheck(this.compilationSettings(), this.semanticInfoChain, document);
|
||||
var endTime = (new Date()).getTime();
|
||||
|
||||
typeCheckTime += endTime - startTime;
|
||||
@@ -1464,7 +1464,7 @@ module TypeScript {
|
||||
// shared emitter (and we'll take care of it after all the files are done.
|
||||
this._sharedEmitter = this.compiler._emitDocument(
|
||||
document, this._emitOptions,
|
||||
outputFiles => { this._current = CompileResult.fromOutputFiles(outputFiles) },
|
||||
outputFiles => { this._current = CompileResult.fromOutputFiles(outputFiles); },
|
||||
this._sharedEmitter);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ module TypeScript.Services {
|
||||
var secondSymbolDecl = secondSymbol.getDeclarations()[0];
|
||||
|
||||
var firstParentDecl = firstSymbolDecl.getParentDecl();
|
||||
var secondParentDecl = secondSymbolDecl.getParentDecl()
|
||||
var secondParentDecl = secondSymbolDecl.getParentDecl();
|
||||
|
||||
if (firstParentDecl.kind === TypeScript.PullElementKind.ObjectLiteral &&
|
||||
secondParentDecl.kind === TypeScript.PullElementKind.ObjectLiteral) {
|
||||
|
||||
@@ -22,7 +22,7 @@ module TypeScript.Services.Formatting {
|
||||
constructor(private syntaxTree: SyntaxTree, private snapshot: ITextSnapshot, private rulesProvider: RulesProvider, editorOptions: ts.EditorOptions) {
|
||||
//
|
||||
// TODO: convert to use FormattingOptions instead of EditorOptions
|
||||
this.options = new FormattingOptions(!editorOptions.ConvertTabsToSpaces, editorOptions.TabSize, editorOptions.IndentSize, editorOptions.NewLineCharacter)
|
||||
this.options = new FormattingOptions(!editorOptions.ConvertTabsToSpaces, editorOptions.TabSize, editorOptions.IndentSize, editorOptions.NewLineCharacter);
|
||||
}
|
||||
|
||||
public formatSelection(minChar: number, limChar: number): ts.TextEdit[] {
|
||||
|
||||
@@ -26,7 +26,7 @@ module TypeScript.Services.Formatting {
|
||||
}
|
||||
|
||||
static create1(left: SyntaxKind, right: SyntaxKind): RuleDescriptor {
|
||||
return RuleDescriptor.create4(Shared.TokenRange.FromToken(left), Shared.TokenRange.FromToken(right))
|
||||
return RuleDescriptor.create4(Shared.TokenRange.FromToken(left), Shared.TokenRange.FromToken(right));
|
||||
}
|
||||
|
||||
static create2(left: Shared.TokenRange, right: SyntaxKind): RuleDescriptor {
|
||||
|
||||
@@ -15,95 +15,75 @@
|
||||
|
||||
///<reference path='references.ts' />
|
||||
|
||||
module TypeScript.Services {
|
||||
export class OutliningElementsCollector extends TypeScript.DepthLimitedWalker {
|
||||
// The maximum depth for collecting spans; this will cause us to miss deeply nested function/modules spans,
|
||||
// but will guarantee performance will not be closely tied to tree depth.
|
||||
private static MaximumDepth: number = 10;
|
||||
private inObjectLiteralExpression: boolean = false;
|
||||
module ts {
|
||||
|
||||
private elements: TypeScript.TextSpan[] = [];
|
||||
export interface OutliningSpan {
|
||||
/**
|
||||
* @param textSpan The span of the document to actually collapse.
|
||||
* @param hintSpan The span of the document to display when the user hovers over the
|
||||
* collapsed span.
|
||||
* @param bannerText The text to display in the editor for the collapsed region.
|
||||
* @param autoCollapse Whether or not this region should be automatically collapsed when
|
||||
* the 'Collapse to Definitions' command is invoked.
|
||||
*/
|
||||
textSpan: TypeScript.TextSpan;
|
||||
hintSpan: TypeScript.TextSpan;
|
||||
bannerText: string;
|
||||
autoCollapse: boolean;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super(OutliningElementsCollector.MaximumDepth);
|
||||
}
|
||||
export module OutliningElementsCollector {
|
||||
export function collectElements(sourceFile: SourceFile): OutliningSpan[] {
|
||||
var elements: OutliningSpan[] = [];
|
||||
|
||||
public visitClassDeclaration(node: TypeScript.ClassDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.openBraceToken, node.closeBraceToken);
|
||||
super.visitClassDeclaration(node);
|
||||
}
|
||||
|
||||
public visitInterfaceDeclaration(node: TypeScript.InterfaceDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.body.openBraceToken, node.body.closeBraceToken);
|
||||
super.visitInterfaceDeclaration(node);
|
||||
}
|
||||
|
||||
public visitModuleDeclaration(node: TypeScript.ModuleDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.openBraceToken, node.closeBraceToken);
|
||||
super.visitModuleDeclaration(node);
|
||||
}
|
||||
|
||||
public visitEnumDeclaration(node: TypeScript.EnumDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.openBraceToken, node.closeBraceToken);
|
||||
super.visitEnumDeclaration(node);
|
||||
}
|
||||
|
||||
public visitFunctionDeclaration(node: TypeScript.FunctionDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
super.visitFunctionDeclaration(node);
|
||||
}
|
||||
|
||||
public visitFunctionExpression(node: TypeScript.FunctionExpressionSyntax): void {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
super.visitFunctionExpression(node);
|
||||
}
|
||||
|
||||
public visitConstructorDeclaration(node: TypeScript.ConstructorDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
super.visitConstructorDeclaration(node);
|
||||
}
|
||||
|
||||
public visitMemberFunctionDeclaration(node: TypeScript.MemberFunctionDeclarationSyntax): void {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
super.visitMemberFunctionDeclaration(node);
|
||||
}
|
||||
|
||||
public visitGetAccessor(node: TypeScript.GetAccessorSyntax): void {
|
||||
if (!this.inObjectLiteralExpression) {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
function addOutlineRange(node: Node, startElement: Node, endElement: Node) {
|
||||
if (node && startElement && endElement) {
|
||||
var span: OutliningSpan = {
|
||||
textSpan: TypeScript.TextSpan.fromBounds(startElement.pos, endElement.end),
|
||||
hintSpan: TypeScript.TextSpan.fromBounds(node.getStart(), node.end),
|
||||
bannerText: "...",
|
||||
autoCollapse: false
|
||||
};
|
||||
elements.push(span);
|
||||
}
|
||||
}
|
||||
super.visitGetAccessor(node);
|
||||
}
|
||||
|
||||
public visitSetAccessor(node: TypeScript.SetAccessorSyntax): void {
|
||||
if (!this.inObjectLiteralExpression) {
|
||||
this.addOutlineRange(node, node.block, node.block);
|
||||
var depth = 0;
|
||||
var maxDepth = 10;
|
||||
function walk(n: Node): void {
|
||||
if (depth >= maxDepth) {
|
||||
return;
|
||||
}
|
||||
switch (n.kind) {
|
||||
case SyntaxKind.ClassDeclaration:
|
||||
case SyntaxKind.InterfaceDeclaration:
|
||||
case SyntaxKind.ModuleDeclaration:
|
||||
case SyntaxKind.EnumDeclaration:
|
||||
case SyntaxKind.ObjectLiteral:
|
||||
var openBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.OpenBraceToken && c);
|
||||
var closeBrace = forEach(n.getChildren(), c => c.kind === SyntaxKind.CloseBraceToken && c);
|
||||
addOutlineRange(n, openBrace, closeBrace);
|
||||
break;
|
||||
case SyntaxKind.Constructor:
|
||||
case SyntaxKind.FunctionDeclaration:
|
||||
case SyntaxKind.Method:
|
||||
case SyntaxKind.GetAccessor:
|
||||
case SyntaxKind.SetAccessor:
|
||||
var body = (<FunctionDeclaration>n).body;
|
||||
if (body) {
|
||||
var openBrace = forEach(body.getChildren(), c => c.kind === SyntaxKind.OpenBraceToken && c);
|
||||
var closeBrace = forEach(body.getChildren(), c => c.kind === SyntaxKind.CloseBraceToken && c);
|
||||
addOutlineRange(n, openBrace, closeBrace);
|
||||
}
|
||||
break;
|
||||
}
|
||||
depth++;
|
||||
forEachChild(n, walk);
|
||||
depth--;
|
||||
}
|
||||
super.visitSetAccessor(node);
|
||||
}
|
||||
|
||||
public visitObjectLiteralExpression(node: TypeScript.ObjectLiteralExpressionSyntax): void {
|
||||
var savedInObjectLiteralExpression = this.inObjectLiteralExpression;
|
||||
this.inObjectLiteralExpression = true;
|
||||
super.visitObjectLiteralExpression(node);
|
||||
this.inObjectLiteralExpression = savedInObjectLiteralExpression;
|
||||
}
|
||||
|
||||
private addOutlineRange(node: TypeScript.ISyntaxNode, startElement: TypeScript.ISyntaxNodeOrToken, endElement: TypeScript.ISyntaxNodeOrToken) {
|
||||
if (startElement && endElement && !isShared(startElement) && !isShared(endElement)) {
|
||||
// Compute the position
|
||||
var start = TypeScript.start(startElement);
|
||||
var end = TypeScript.end(endElement);
|
||||
|
||||
// Push the new range
|
||||
this.elements.push(TypeScript.TextSpan.fromBounds(start, end));
|
||||
}
|
||||
}
|
||||
|
||||
public static collectElements(node: TypeScript.SourceUnitSyntax): TypeScript.TextSpan[] {
|
||||
var collector = new OutliningElementsCollector();
|
||||
visitNodeOrToken(collector, node);
|
||||
return collector.elements;
|
||||
walk(sourceFile);
|
||||
return elements;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+65
-15
@@ -420,10 +420,10 @@ module ts {
|
||||
}
|
||||
|
||||
public static createSourceFileObject(languageVersion: ScriptTarget, filename: string, scriptSnapshot: TypeScript.IScriptSnapshot, version: number, isOpen: boolean, syntaxTree: TypeScript.SyntaxTree) {
|
||||
var newSoruceFile = <SourceFileObject><any>createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, version, isOpen);
|
||||
newSoruceFile.scriptSnapshot = scriptSnapshot;
|
||||
newSoruceFile.syntaxTree = syntaxTree;
|
||||
return newSoruceFile;
|
||||
var newSourceFile = <SourceFileObject><any>createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), languageVersion, version, isOpen);
|
||||
newSourceFile.scriptSnapshot = scriptSnapshot;
|
||||
newSourceFile.syntaxTree = syntaxTree;
|
||||
return newSourceFile;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -482,7 +482,7 @@ module ts {
|
||||
getNavigateToItems(searchValue: string): NavigateToItem[];
|
||||
getScriptLexicalStructure(fileName: string): NavigateToItem[];
|
||||
|
||||
getOutliningRegions(fileName: string): TypeScript.TextSpan[];
|
||||
getOutliningRegions(fileName: string): OutliningSpan[];
|
||||
getBraceMatchingAtPosition(fileName: string, position: number): TypeScript.TextSpan[];
|
||||
getIndentationAtPosition(fileName: string, position: number, options: EditorOptions): number;
|
||||
|
||||
@@ -697,7 +697,7 @@ module ts {
|
||||
referencedFiles: string[]): SourceFile;
|
||||
|
||||
updateDocument(
|
||||
soruceFile: SourceFile,
|
||||
sourceFile: SourceFile,
|
||||
filename: string,
|
||||
compilationSettings: CompilerOptions,
|
||||
scriptSnapshot: TypeScript.IScriptSnapshot,
|
||||
@@ -962,6 +962,7 @@ module ts {
|
||||
// currently edited file.
|
||||
private currentfilename: string = "";
|
||||
private currentFileVersion: number = -1;
|
||||
private currentSourceFile: SourceFile = null;
|
||||
private currentFileSyntaxTree: TypeScript.SyntaxTree = null;
|
||||
private currentFileScriptSnapshot: TypeScript.IScriptSnapshot = null;
|
||||
|
||||
@@ -969,32 +970,71 @@ module ts {
|
||||
this.hostCache = new HostCache(host);
|
||||
}
|
||||
|
||||
public getCurrentFileSyntaxTree(filename: string): TypeScript.SyntaxTree {
|
||||
private initialize(filename: string) {
|
||||
// ensure that both source file and syntax tree are either initialized or not initialized
|
||||
Debug.assert(!!this.currentFileSyntaxTree === !!this.currentSourceFile);
|
||||
this.hostCache = new HostCache(this.host);
|
||||
|
||||
var version = this.hostCache.getVersion(filename);
|
||||
var syntaxTree: TypeScript.SyntaxTree = null;
|
||||
var sourceFile: SourceFile;
|
||||
|
||||
if (this.currentFileSyntaxTree === null || this.currentfilename !== filename) {
|
||||
var scriptSnapshot = this.hostCache.getScriptSnapshot(filename);
|
||||
syntaxTree = this.createSyntaxTree(filename, scriptSnapshot);
|
||||
sourceFile = createSourceFileFromScriptSnapshot(filename, scriptSnapshot, getDefaultCompilerOptions(), version, /*isOpen*/ true);
|
||||
|
||||
fixupParentReferences(sourceFile);
|
||||
}
|
||||
else if (this.currentFileVersion !== version) {
|
||||
var scriptSnapshot = this.hostCache.getScriptSnapshot(filename);
|
||||
syntaxTree = this.updateSyntaxTree(filename, scriptSnapshot, this.currentFileSyntaxTree, this.currentFileVersion);
|
||||
|
||||
var editRange = this.hostCache.getScriptTextChangeRangeSinceVersion(filename, this.currentFileVersion);
|
||||
sourceFile = !editRange
|
||||
? createSourceFileFromScriptSnapshot(filename, scriptSnapshot, getDefaultCompilerOptions(), version, /*isOpen*/ true)
|
||||
: this.currentSourceFile.update(scriptSnapshot, version, /*isOpen*/ true, editRange);
|
||||
|
||||
fixupParentReferences(sourceFile);
|
||||
}
|
||||
|
||||
if (syntaxTree !== null) {
|
||||
Debug.assert(sourceFile);
|
||||
// All done, ensure state is up to date
|
||||
this.currentFileScriptSnapshot = scriptSnapshot;
|
||||
this.currentFileVersion = version;
|
||||
this.currentfilename = filename;
|
||||
this.currentFileSyntaxTree = syntaxTree;
|
||||
this.currentSourceFile = sourceFile;
|
||||
}
|
||||
|
||||
function fixupParentReferences(sourceFile: SourceFile) {
|
||||
// normally parent references are set during binding.
|
||||
// however here SourceFile data is used only for syntactic features so running the whole binding process is an overhead.
|
||||
// walk over the nodes and set parent references
|
||||
var parent: Node = sourceFile;
|
||||
function walk(n: Node): void {
|
||||
n.parent = parent;
|
||||
|
||||
var saveParent = parent;
|
||||
parent = n;
|
||||
forEachChild(n, walk);
|
||||
parent = saveParent;
|
||||
}
|
||||
forEachChild(sourceFile, walk);
|
||||
}
|
||||
}
|
||||
|
||||
public getCurrentFileSyntaxTree(filename: string): TypeScript.SyntaxTree {
|
||||
this.initialize(filename);
|
||||
return this.currentFileSyntaxTree;
|
||||
}
|
||||
|
||||
public getCurrentSourceFile(filename: string): SourceFile {
|
||||
this.initialize(filename);
|
||||
return this.currentSourceFile;
|
||||
}
|
||||
|
||||
public getCurrentScriptSnapshot(filename: string): TypeScript.IScriptSnapshot {
|
||||
// update currentFileScriptSnapshot as a part of 'getCurrentFileSyntaxTree' call
|
||||
this.getCurrentFileSyntaxTree(filename);
|
||||
@@ -1093,6 +1133,10 @@ module ts {
|
||||
}
|
||||
}
|
||||
|
||||
function createSourceFileFromScriptSnapshot(filename: string, scriptSnapshot: TypeScript.IScriptSnapshot, settings: CompilerOptions, version: number, isOpen: boolean) {
|
||||
return createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), settings.target, version, isOpen);
|
||||
}
|
||||
|
||||
export function createDocumentRegistry(): DocumentRegistry {
|
||||
var buckets: Map<Map<DocumentRegistryEntry>> = {};
|
||||
|
||||
@@ -1112,19 +1156,19 @@ module ts {
|
||||
function reportStats() {
|
||||
var bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === '_').map(name => {
|
||||
var entries = lookUp(buckets, name);
|
||||
var soruceFiles: { name: string; refCount: number; references: string[]; }[] = [];
|
||||
var sourceFiles: { name: string; refCount: number; references: string[]; }[] = [];
|
||||
for (var i in entries) {
|
||||
var entry = entries[i];
|
||||
soruceFiles.push({
|
||||
sourceFiles.push({
|
||||
name: i,
|
||||
refCount: entry.refCount,
|
||||
references: entry.owners.slice(0)
|
||||
});
|
||||
}
|
||||
soruceFiles.sort((x, y) => y.refCount - x.refCount);
|
||||
sourceFiles.sort((x, y) => y.refCount - x.refCount);
|
||||
return {
|
||||
bucket: name,
|
||||
sourceFiles: soruceFiles
|
||||
sourceFiles: sourceFiles
|
||||
};
|
||||
});
|
||||
return JSON.stringify(bucketInfoArray, null, 2);
|
||||
@@ -1140,7 +1184,7 @@ module ts {
|
||||
var bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true);
|
||||
var entry = lookUp(bucket, filename);
|
||||
if (!entry) {
|
||||
var sourceFile = createSourceFile(filename, scriptSnapshot.getText(0, scriptSnapshot.getLength()), compilationSettings.target, version, isOpen);
|
||||
var sourceFile = createSourceFileFromScriptSnapshot(filename, scriptSnapshot, compilationSettings, version, isOpen);
|
||||
|
||||
bucket[filename] = entry = {
|
||||
sourceFile: sourceFile,
|
||||
@@ -2024,6 +2068,12 @@ module ts {
|
||||
return syntaxTreeCache.getCurrentFileSyntaxTree(filename);
|
||||
}
|
||||
|
||||
function getCurrentSourceFile(filename: string): SourceFile {
|
||||
filename = TypeScript.switchToForwardSlashes(filename);
|
||||
var currentSourceFile = syntaxTreeCache.getCurrentSourceFile(filename);
|
||||
return currentSourceFile;
|
||||
}
|
||||
|
||||
function getNameOrDottedNameSpan(filename: string, startPos: number, endPos: number): SpanInfo {
|
||||
function getTypeInfoEligiblePath(filename: string, position: number, isConstructorValidPosition: boolean) {
|
||||
var sourceUnit = syntaxTreeCache.getCurrentFileSyntaxTree(filename).sourceUnit();
|
||||
@@ -2097,11 +2147,11 @@ module ts {
|
||||
return items;
|
||||
}
|
||||
|
||||
function getOutliningRegions(filename: string) {
|
||||
function getOutliningRegions(filename: string): OutliningSpan[] {
|
||||
// doesn't use compiler - no need to synchronize with host
|
||||
filename = TypeScript.switchToForwardSlashes(filename);
|
||||
var syntaxTree = getSyntaxTree(filename);
|
||||
return TypeScript.Services.OutliningElementsCollector.collectElements(syntaxTree.sourceUnit());
|
||||
var sourceFile = getCurrentSourceFile(filename);
|
||||
return OutliningElementsCollector.collectElements(sourceFile);
|
||||
}
|
||||
|
||||
function getBraceMatchingAtPosition(filename: string, position: number) {
|
||||
|
||||
@@ -726,7 +726,10 @@ module ts {
|
||||
"getOutliningRegions(\"" + fileName + "\")",
|
||||
() => {
|
||||
var items = this.languageService.getOutliningRegions(fileName);
|
||||
return items;
|
||||
// return just the part of data that language service v2 can understand
|
||||
// language service v2 will use the entire OutliningSpan
|
||||
var spans = forEach(items, i => i.textSpan);
|
||||
return spans;
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -128,25 +128,25 @@
|
||||
arr_any = f1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '() => C1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '() => C1'.
|
||||
!!! Property 'push' is missing in type '() => C1'.
|
||||
arr_any = o1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '{ one: number; }' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '{ one: number; }'.
|
||||
!!! Property 'length' is missing in type '{ one: number; }'.
|
||||
arr_any = a1; // should be ok - is
|
||||
arr_any = c1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C1'.
|
||||
!!! Property 'length' is missing in type 'C1'.
|
||||
arr_any = c2; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C2' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C2'.
|
||||
!!! Property 'length' is missing in type 'C2'.
|
||||
arr_any = c3; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C3' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C3'.
|
||||
!!! Property 'length' is missing in type 'C3'.
|
||||
arr_any = i1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'I1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'I1'.
|
||||
!!! Property 'length' is missing in type 'I1'.
|
||||
@@ -64,30 +64,30 @@
|
||||
arr_any = f1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '() => C1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '() => C1'.
|
||||
!!! Property 'push' is missing in type '() => C1'.
|
||||
arr_any = function () { return null;} // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '() => any' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '() => any'.
|
||||
!!! Property 'push' is missing in type '() => any'.
|
||||
arr_any = o1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '{ one: number; }' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '{ one: number; }'.
|
||||
!!! Property 'length' is missing in type '{ one: number; }'.
|
||||
arr_any = a1; // should be ok - is
|
||||
arr_any = c1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C1'.
|
||||
!!! Property 'length' is missing in type 'C1'.
|
||||
arr_any = c2; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C2' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C2'.
|
||||
!!! Property 'length' is missing in type 'C2'.
|
||||
arr_any = c3; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C3' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C3'.
|
||||
!!! Property 'length' is missing in type 'C3'.
|
||||
arr_any = i1; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'I1' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'I1'.
|
||||
!!! Property 'length' is missing in type 'I1'.
|
||||
|
||||
@@ -25,9 +25,9 @@
|
||||
arr_any = function () { return null;} // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type '() => any' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type '() => any'.
|
||||
!!! Property 'push' is missing in type '() => any'.
|
||||
arr_any = c3; // should be an error - is
|
||||
~~~~~~~
|
||||
!!! Type 'C3' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'C3'.
|
||||
!!! Property 'length' is missing in type 'C3'.
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
!!! Type 'number[][]' is not assignable to type 'number[][][]':
|
||||
!!! Type 'number[]' is not assignable to type 'number[][]':
|
||||
!!! Type 'number' is not assignable to type 'number[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
|
||||
function isEmpty(l: { length: number }) {
|
||||
return l.length === 0;
|
||||
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: any[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ two: any[]; }':
|
||||
!!! Types of property 'two' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'any[]':
|
||||
!!! Property 'join' is missing in type 'String'.
|
||||
!!! Property 'push' is missing in type 'String'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: number[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'number[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,7 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ two: number[]; }':
|
||||
!!! Types of property 'two' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'number[]':
|
||||
!!! Types of property 'concat' are incompatible:
|
||||
!!! Type '(...strings: string[]) => string' is not assignable to type '{ <U extends number[]>(...items: U[]): number[]; (...items: number[]): number[]; }':
|
||||
!!! Types of parameters 'strings' and 'items' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'number'.
|
||||
!!! Property 'push' is missing in type 'String'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: string[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'string[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ two: string[]; }':
|
||||
!!! Types of property 'two' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'string[]':
|
||||
!!! Property 'join' is missing in type 'String'.
|
||||
!!! Property 'push' is missing in type 'String'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: boolean[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'boolean[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,7 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ two: boolean[]; }':
|
||||
!!! Types of property 'two' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'boolean[]':
|
||||
!!! Types of property 'concat' are incompatible:
|
||||
!!! Type '(...strings: string[]) => string' is not assignable to type '{ <U extends boolean[]>(...items: U[]): boolean[]; (...items: boolean[]): boolean[]; }':
|
||||
!!! Types of parameters 'strings' and 'items' are incompatible:
|
||||
!!! Type 'string' is not assignable to type 'boolean'.
|
||||
!!! Property 'push' is missing in type 'String'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: any[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'any[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: number[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'number[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: string[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'string[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -12,4 +12,4 @@
|
||||
!!! Type 'interfaceWithPublicAndOptional<number, string>' is not assignable to type '{ one: boolean[]; }':
|
||||
!!! Types of property 'one' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'boolean[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
@@ -1,138 +1,47 @@
|
||||
==== tests/cases/conformance/types/members/duplicateStringIndexers.ts (52 errors) ====
|
||||
==== tests/cases/conformance/types/members/duplicateStringIndexers.ts (6 errors) ====
|
||||
// it is an error to have duplicate index signatures of the same kind in a type
|
||||
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toExponential' of type '(fractionDigits?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toFixed' of type '(fractionDigits?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toPrecision' of type '(precision?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toString' of type '(radix?: number) => string' is not assignable to string index type 'string'.
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
module test {
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'charAt' of type '(pos: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'charCodeAt' of type '(index: number) => number' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'concat' of type '(...strings: string[]) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'indexOf' of type '(searchString: string, position?: number) => number' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'lastIndexOf' of type '(searchString: string, position?: number) => number' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'length' of type 'number' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'localeCompare' of type '(that: string) => number' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'match' of type '{ (regexp: string): string[]; (regexp: RegExp): string[]; }' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'replace' of type '{ (searchValue: string, replaceValue: string): string; (searchValue: string, replaceValue: (substring: string, ...args: any[]) => string): string; (searchValue: RegExp, replaceValue: string): string; (searchValue: RegExp, replaceValue: (substring: string, ...args: any[]) => string): string; }' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'search' of type '{ (regexp: string): number; (regexp: RegExp): number; }' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'slice' of type '(start?: number, end?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'split' of type '{ (separator: string, limit?: number): string[]; (separator: RegExp, limit?: number): string[]; }' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'substr' of type '(from: number, length?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'substring' of type '(start: number, end?: number) => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toLocaleLowerCase' of type '() => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toLocaleUpperCase' of type '() => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toLowerCase' of type '() => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toString' of type '() => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'toUpperCase' of type '() => string' is not assignable to string index type 'string'.
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Property 'trim' of type '() => string' is not assignable to string index type 'string'.
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'concat' of type '{ <U extends T[]>(...items: U[]): T[]; (...items: T[]): T[]; }' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'every' of type '(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any) => boolean' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'filter' of type '(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any) => T[]' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'forEach' of type '(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any) => void' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'indexOf' of type '(searchElement: T, fromIndex?: number) => number' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'join' of type '(separator?: string) => string' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'lastIndexOf' of type '(searchElement: T, fromIndex?: number) => number' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'length' of type 'number' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'map' of type '<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any) => U[]' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'pop' of type '() => T' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'push' of type '(...items: T[]) => number' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'reduce' of type '{ (callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; <U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; }' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'reduceRight' of type '{ (callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T; <U>(callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => U, initialValue: U): U; }' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'reverse' of type '() => T[]' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'shift' of type '() => T' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'slice' of type '(start?: number, end?: number) => T[]' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'some' of type '(callbackfn: (value: T, index: number, array: T[]) => boolean, thisArg?: any) => boolean' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'sort' of type '(compareFn?: (a: T, b: T) => number) => T[]' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'splice' of type '{ (start: number): T[]; (start: number, deleteCount: number, ...items: T[]): T[]; }' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'toLocaleString' of type '() => string' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'toString' of type '() => string' is not assignable to string index type 'T'.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Property 'unshift' of type '(...items: T[]) => number' is not assignable to string index type 'T'.
|
||||
[x: string]: T;
|
||||
~~~~~~~~~~~~~~~
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
[x: string]: T;
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Duplicate string index signature.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,42 +1,46 @@
|
||||
//// [duplicateStringIndexers.ts]
|
||||
// it is an error to have duplicate index signatures of the same kind in a type
|
||||
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
module test {
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
[x: string]: T;
|
||||
}
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
[x: string]: T;
|
||||
}
|
||||
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//// [duplicateStringIndexers.js]
|
||||
var C = (function () {
|
||||
function C() {
|
||||
}
|
||||
return C;
|
||||
})();
|
||||
var a;
|
||||
var test;
|
||||
(function (test) {
|
||||
var C = (function () {
|
||||
function C() {
|
||||
}
|
||||
return C;
|
||||
})();
|
||||
var a;
|
||||
})(test || (test = {}));
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
var m: number[] = e;
|
||||
~
|
||||
!!! Type 'E' is not assignable to type 'number[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
var n: { foo: string } = e;
|
||||
~
|
||||
!!! Type 'E' is not assignable to type '{ foo: string; }':
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
!!! Cannot compile external modules unless the '--module' flag is provided.
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! Class 'ObservableArray<T>' incorrectly implements interface 'T[]':
|
||||
!!! Property 'join' is missing in type 'ObservableArray<T>'.
|
||||
!!! Property 'length' is missing in type 'ObservableArray<T>'.
|
||||
concat<U extends T[]>(...items: U[]): T[];
|
||||
concat(...items: T[]): T[];
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
==== tests/cases/compiler/invalidReferenceSyntax1.ts (1 errors) ====
|
||||
/// <reference path="missingquote.ts />
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! Invalid reference comment.
|
||||
!!! Invalid 'reference' directive syntax.
|
||||
class C {
|
||||
|
||||
}
|
||||
@@ -56,7 +56,7 @@
|
||||
var v3:K1.I3[]=v1;
|
||||
~~
|
||||
!!! Type 'I4' is not assignable to type 'I3[]':
|
||||
!!! Property 'concat' is missing in type 'I4'.
|
||||
!!! Property 'length' is missing in type 'I4'.
|
||||
var v4:()=>K1.I3=v1;
|
||||
~~
|
||||
!!! Type 'I4' is not assignable to type '() => I3'.
|
||||
|
||||
@@ -10,6 +10,6 @@
|
||||
!!! Type '(...x: number[]) => void' is not assignable to type '(x: number[], y: string) => void':
|
||||
!!! Types of parameters 'x' and 'x' are incompatible:
|
||||
!!! Type 'number' is not assignable to type 'number[]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
n([4], 'foo');
|
||||
|
||||
@@ -46,15 +46,15 @@
|
||||
var x10:I[][][][]=3;
|
||||
~~~
|
||||
!!! Type 'number' is not assignable to type 'I[][][][]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
var x11:{z:I;x:boolean;}[][]=3;
|
||||
~~~
|
||||
!!! Type 'number' is not assignable to type '{ z: I; x: boolean; }[][]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
var x12:{z:I;x:boolean;y:(s:string)=>boolean;w:{ z:I;[s:string]:{ x; y; };[n:number]:{x; y;};():boolean; };}[][]=3;
|
||||
~~~
|
||||
!!! Type 'number' is not assignable to type '{ z: I; x: boolean; y: (s: string) => boolean; w: { (): boolean; [x: string]: { x: any; y: any; }; [x: number]: { x: any; y: any; }; z: I; }; }[][]':
|
||||
!!! Property 'concat' is missing in type 'Number'.
|
||||
!!! Property 'length' is missing in type 'Number'.
|
||||
var x13:{ new(): number; new(n:number):number; x: string; w: {y: number;}; (): {}; } = 3;
|
||||
~~~
|
||||
!!! Type 'number' is not assignable to type '{ (): {}; new (): number; new (n: number): number; x: string; w: { y: number; }; }':
|
||||
|
||||
@@ -1,32 +1,33 @@
|
||||
// it is an error to have duplicate index signatures of the same kind in a type
|
||||
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
module test {
|
||||
interface Number {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
interface String {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
[x: string]: T;
|
||||
}
|
||||
interface Array<T> {
|
||||
[x: string]: T;
|
||||
[x: string]: T;
|
||||
}
|
||||
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
class C {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
interface I {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
var a: {
|
||||
[x: string]: string;
|
||||
[x: string]: string;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/// <reference path="fourslash.ts"/>
|
||||
|
||||
////// interface
|
||||
////interface IFoo[| {
|
||||
//// getDist(): number;
|
||||
////}|]
|
||||
////
|
||||
////// class members
|
||||
////class Foo[| {
|
||||
//// constructor()[| {
|
||||
//// }|]
|
||||
////
|
||||
//// public foo(): number[| {
|
||||
//// return 0;
|
||||
//// }|]
|
||||
////
|
||||
//// public get X()[| {
|
||||
//// return 1;
|
||||
//// }|]
|
||||
////
|
||||
//// public set X(v: number)[| {
|
||||
//// }|]
|
||||
////
|
||||
//// public member = function f()[| {
|
||||
////
|
||||
//// }|]
|
||||
////}|]
|
||||
////
|
||||
////// modules
|
||||
////module m1[| {
|
||||
//// module m2[| { }|]
|
||||
//// module m3[| {
|
||||
//// function foo()[| {
|
||||
////
|
||||
//// }|]
|
||||
////
|
||||
//// interface IFoo2[| {
|
||||
////
|
||||
//// }|]
|
||||
////
|
||||
//// class foo2 implements IFoo2[| {
|
||||
////
|
||||
//// }|]
|
||||
//// }|]
|
||||
////}|]
|
||||
////
|
||||
////// function declaration
|
||||
////function foo(): number[| {
|
||||
//// return 0;
|
||||
////}|]
|
||||
////
|
||||
////// function expressions
|
||||
////(function f()[| {
|
||||
////
|
||||
////}|])
|
||||
////
|
||||
////// trivia handeling
|
||||
////class ClassFooWithTrivia[| /* some comments */
|
||||
//// /* more trivia */ {
|
||||
////
|
||||
////
|
||||
//// /*some trailing trivia */
|
||||
////}|] /* even more */
|
||||
////
|
||||
////// object literals
|
||||
////var x = [|{
|
||||
//// a:1,
|
||||
//// b:2,
|
||||
//// get foo() [|{
|
||||
//// return 1;
|
||||
//// }|]
|
||||
////}|]
|
||||
//////outline with deep nesting
|
||||
////module m1[|{
|
||||
//// module m2[| {
|
||||
//// module m3[| {
|
||||
//// module m4[| {
|
||||
//// module m5[| {
|
||||
//// module m6[| {
|
||||
//// module m7[| {
|
||||
//// module m8[| {
|
||||
//// module m9[| {
|
||||
//// module m10[| {
|
||||
//// module m11 {
|
||||
//// module m12 {
|
||||
//// export interface IFoo {
|
||||
//// }
|
||||
//// }
|
||||
//// }
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
//// }|]
|
||||
////}|]
|
||||
////
|
||||
//////outline after a deeply nested node
|
||||
////class AfterNestedNodes[| {
|
||||
////}|]
|
||||
|
||||
verify.outliningSpansInCurrentFile(test.ranges());
|
||||
@@ -1,5 +1,5 @@
|
||||
/// <reference path="perfsys.ts"/>
|
||||
/// <reference path="..\src\compiler\tc.ts"/>
|
||||
/// <reference path="..\src\compiler\tsc.ts"/>
|
||||
|
||||
// resolve all files used in this compilation
|
||||
if (perftest.hasLogIOFlag()) {
|
||||
@@ -1,4 +1,4 @@
|
||||
/// <reference path='..\..\src\compiler\tc.ts'/>
|
||||
/// <reference path='..\..\src\compiler\tsc.ts'/>
|
||||
|
||||
module TypeScript.WebTsc {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user