mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Merge branch 'noParentNodesInEmitter' into prototypeTransformClass
This commit is contained in:
@@ -25,6 +25,7 @@ tests/baselines/reference/projectOutput/*
|
||||
tests/baselines/local/projectOutput/*
|
||||
tests/services/baselines/prototyping/local/*
|
||||
tests/services/browser/typescriptServices.js
|
||||
scripts/configureNightly.js
|
||||
scripts/processDiagnosticMessages.d.ts
|
||||
scripts/processDiagnosticMessages.js
|
||||
scripts/importDefinitelyTypedTests.js
|
||||
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
TypeScript is authored by:
|
||||
|
||||
* Adam Freidin
|
||||
* Ahmad Farid
|
||||
* Anders Hejlsberg
|
||||
* Arnav Singh
|
||||
* Arthur Ozga
|
||||
* Basarat Ali Syed
|
||||
* Ben Duffield
|
||||
* Bill Ticehurst
|
||||
* Bryan Forbes
|
||||
* Caitlin Potter
|
||||
* Chris Bubernak
|
||||
* Colby Russell
|
||||
* Colin Snover
|
||||
* Cyrus Najmabadi
|
||||
* Dan Quirk
|
||||
* Daniel Rosenwasser
|
||||
* David Li
|
||||
* Dick van den Brink
|
||||
* Dirk Bäumer
|
||||
* Frank Wallis
|
||||
* Gabriel Isenberg
|
||||
* Gilad Peleg
|
||||
* Guillaume Salles
|
||||
* Harald Niesche
|
||||
* Ingvar Stepanyan
|
||||
* Ivo Gabe de Wolff
|
||||
* James Whitney
|
||||
* Jason Freeman
|
||||
* Jason Ramsay
|
||||
* Jed Mao
|
||||
* Johannes Rieken
|
||||
* Jonathan Bond-Caron
|
||||
* Jonathan Park
|
||||
* Jonathan Turner
|
||||
* Josh Kalderimis
|
||||
* Kagami Sascha Rosylight
|
||||
* Keith Mashinter
|
||||
* Kenji Imamula
|
||||
* Lorant Pinter
|
||||
* Masahiro Wakame
|
||||
* Max Deepfield
|
||||
* Micah Zoltu
|
||||
* Mohamed Hegazy
|
||||
* Oleg Mihailik
|
||||
* Oleksandr Chekhovskyi
|
||||
* Paul van Brenk
|
||||
* Pedro Maltez
|
||||
* Philip Bulley
|
||||
* piloopin
|
||||
* Ron Buckton
|
||||
* Ryan Cavanaugh
|
||||
* Sheetal Nandi
|
||||
* Shengping Zhong
|
||||
* Shyyko Serhiy
|
||||
* Simon Hürlimann
|
||||
* Solal Pirelli
|
||||
* Stan Thomas
|
||||
* Steve Lucco
|
||||
* Tien Hoanhtien
|
||||
* Tingan Ho
|
||||
* togru
|
||||
* Tomas Grubliauskas
|
||||
* TruongSinh Tran-Nguyen
|
||||
* Vladimir Matveev
|
||||
* Wesley Wigham
|
||||
* Yui Tanglertsampan
|
||||
* Zev Spitz
|
||||
* Zhengbo Li
|
||||
+42
-2
@@ -146,6 +146,7 @@ var harnessSources = harnessCoreSources.concat([
|
||||
"services/documentRegistry.ts",
|
||||
"services/preProcessFile.ts",
|
||||
"services/patternMatcher.ts",
|
||||
"session.ts",
|
||||
"versionCache.ts",
|
||||
"convertToBase64.ts",
|
||||
"transpile.ts"
|
||||
@@ -417,6 +418,45 @@ file(transformGeneratedTs, [factoryGeneratedTs]);
|
||||
desc("Generates a TypeScript file that contains factory methods to create each Syntax Node.")
|
||||
task("generate-factory", [factoryGeneratedTs, transformGeneratedTs]);
|
||||
|
||||
|
||||
// Publish nightly
|
||||
var configureNightlyJs = path.join(scriptsDirectory, "configureNightly.js");
|
||||
var configureNightlyTs = path.join(scriptsDirectory, "configureNightly.ts");
|
||||
var packageJson = "package.json";
|
||||
var programTs = path.join(compilerDirectory, "program.ts");
|
||||
|
||||
file(configureNightlyTs);
|
||||
|
||||
compileFile(/*outfile*/configureNightlyJs,
|
||||
/*sources*/ [configureNightlyTs],
|
||||
/*prereqs*/ [configureNightlyTs],
|
||||
/*prefixes*/ [],
|
||||
/*useBuiltCompiler*/ false,
|
||||
/*noOutFile*/ false,
|
||||
/*generateDeclarations*/ false,
|
||||
/*outDir*/ undefined,
|
||||
/*preserveConstEnums*/ undefined,
|
||||
/*keepComments*/ false,
|
||||
/*noResolve*/ false,
|
||||
/*stripInternal*/ false);
|
||||
|
||||
task("setDebugMode", function() {
|
||||
useDebugMode = true;
|
||||
});
|
||||
|
||||
task("configure-nightly", [configureNightlyJs], function() {
|
||||
var cmd = "node " + configureNightlyJs + " " + packageJson + " " + programTs;
|
||||
console.log(cmd);
|
||||
exec(cmd);
|
||||
}, { async: true });
|
||||
|
||||
desc("Configure, build, test, and publish the nightly release.");
|
||||
task("publish-nightly", ["configure-nightly", "LKG", "clean", "setDebugMode", "runtests"], function () {
|
||||
var cmd = "npm publish --tag next";
|
||||
console.log(cmd);
|
||||
exec(cmd);
|
||||
});
|
||||
|
||||
// Local target to build the compiler and services
|
||||
var tscFile = path.join(builtLocalDirectory, compilerFilename);
|
||||
compileFile(tscFile, compilerSources, [builtLocalDirectory, copyright].concat(compilerSources), {
|
||||
@@ -823,9 +863,9 @@ task("lint", [], function() {
|
||||
function failure(f) { return function() { console.log('FAILURE: Please fix linting errors in ' + f + '\n') }};
|
||||
|
||||
var lintTargets = compilerSources.concat(harnessCoreSources);
|
||||
for(var i in lintTargets) {
|
||||
for (var i in lintTargets) {
|
||||
var f = lintTargets[i];
|
||||
var cmd = 'tslint -f ' + f;
|
||||
var cmd = 'tslint -c tslint.json ' + f;
|
||||
exec(cmd, success(f), failure(f));
|
||||
}
|
||||
}, { async: true });
|
||||
|
||||
@@ -63,7 +63,8 @@ jake runtests # Run tests using the built compiler and test infrastructu
|
||||
# Use host=<hostName> or tests=<testPath>.
|
||||
jake runtests-browser # Runs the tests using the built run.js file. Syntax is jake runtests. Optional
|
||||
parameters 'host=', 'tests=[regex], reporter=[list|spec|json|<more>]'.
|
||||
jake baseline-accept # This replaces the baseline test results with the results obtained from jake runtests.
|
||||
jake baseline-accept # This replaces the baseline test results with the results obtained from jake runtests.
|
||||
jake lint # Runs tslint on the TypeScript source.
|
||||
jake -T # List the above commands.
|
||||
```
|
||||
|
||||
|
||||
+83
-43
@@ -933,7 +933,14 @@ var ts;
|
||||
newLine: _os.EOL,
|
||||
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
|
||||
write: function (s) {
|
||||
_fs.writeSync(1, s);
|
||||
var buffer = new Buffer(s, 'utf8');
|
||||
var offset = 0;
|
||||
var toWrite = buffer.length;
|
||||
var written = 0;
|
||||
while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) {
|
||||
offset += written;
|
||||
toWrite -= written;
|
||||
}
|
||||
},
|
||||
readFile: readFile,
|
||||
writeFile: writeFile,
|
||||
@@ -1401,7 +1408,7 @@ var ts;
|
||||
Classes_containing_abstract_methods_must_be_marked_abstract: { code: 2514, category: ts.DiagnosticCategory.Error, key: "Classes containing abstract methods must be marked abstract." },
|
||||
Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: { code: 2515, category: ts.DiagnosticCategory.Error, key: "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'." },
|
||||
All_declarations_of_an_abstract_method_must_be_consecutive: { code: 2516, category: ts.DiagnosticCategory.Error, key: "All declarations of an abstract method must be consecutive." },
|
||||
Constructor_objects_of_abstract_type_cannot_be_assigned_to_constructor_objects_of_non_abstract_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Constructor objects of abstract type cannot be assigned to constructor objects of non-abstract type" },
|
||||
Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Cannot assign an abstract constructor type to a non-abstract constructor type." },
|
||||
Only_an_ambient_class_can_be_merged_with_an_interface: { code: 2518, category: ts.DiagnosticCategory.Error, key: "Only an ambient class can be merged with an interface." },
|
||||
Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: { code: 2520, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions." },
|
||||
Expression_resolves_to_variable_declaration_0_that_compiler_uses_to_support_async_functions: { code: 2521, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '{0}' that compiler uses to support async functions." },
|
||||
@@ -9187,7 +9194,8 @@ var ts;
|
||||
}
|
||||
else {
|
||||
node.exportClause = parseNamedImportsOrExports(226);
|
||||
if (parseOptional(130)) {
|
||||
if (token === 130 || (token === 8 && !scanner.hasPrecedingLineBreak())) {
|
||||
parseExpected(130);
|
||||
node.moduleSpecifier = parseModuleSpecifier();
|
||||
}
|
||||
}
|
||||
@@ -13263,7 +13271,7 @@ var ts;
|
||||
var id = getTypeListId(elementTypes);
|
||||
var type = tupleTypes[id];
|
||||
if (!type) {
|
||||
type = tupleTypes[id] = createObjectType(8192);
|
||||
type = tupleTypes[id] = createObjectType(8192 | getWideningFlagsOfTypes(elementTypes));
|
||||
type.elementTypes = elementTypes;
|
||||
}
|
||||
return type;
|
||||
@@ -14084,10 +14092,29 @@ var ts;
|
||||
var targetSignatures = getSignaturesOfType(target, kind);
|
||||
var result = -1;
|
||||
var saveErrorInfo = errorInfo;
|
||||
var sourceSig = sourceSignatures[0];
|
||||
var targetSig = targetSignatures[0];
|
||||
if (sourceSig && targetSig) {
|
||||
var sourceErasedSignature = getErasedSignature(sourceSig);
|
||||
var targetErasedSignature = getErasedSignature(targetSig);
|
||||
var sourceReturnType = sourceErasedSignature && getReturnTypeOfSignature(sourceErasedSignature);
|
||||
var targetReturnType = targetErasedSignature && getReturnTypeOfSignature(targetErasedSignature);
|
||||
var sourceReturnDecl = sourceReturnType && sourceReturnType.symbol && ts.getDeclarationOfKind(sourceReturnType.symbol, 211);
|
||||
var targetReturnDecl = targetReturnType && targetReturnType.symbol && ts.getDeclarationOfKind(targetReturnType.symbol, 211);
|
||||
var sourceIsAbstract = sourceReturnDecl && sourceReturnDecl.flags & 256;
|
||||
var targetIsAbstract = targetReturnDecl && targetReturnDecl.flags & 256;
|
||||
if (sourceIsAbstract && !targetIsAbstract) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
|
||||
var t = targetSignatures[_i];
|
||||
if (!t.hasStringLiterals || target.flags & 262144) {
|
||||
var localErrors = reportErrors;
|
||||
var checkedAbstractAssignability = false;
|
||||
for (var _a = 0; _a < sourceSignatures.length; _a++) {
|
||||
var s = sourceSignatures[_a];
|
||||
if (!s.hasStringLiterals || source.flags & 262144) {
|
||||
@@ -14135,12 +14162,12 @@ var ts;
|
||||
target = getErasedSignature(target);
|
||||
var result = -1;
|
||||
for (var i = 0; i < checkCount; i++) {
|
||||
var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var saveErrorInfo = errorInfo;
|
||||
var related = isRelatedTo(s_1, t_1, reportErrors);
|
||||
var related = isRelatedTo(s, t, reportErrors);
|
||||
if (!related) {
|
||||
related = isRelatedTo(t_1, s_1, false);
|
||||
related = isRelatedTo(t, s, false);
|
||||
if (!related) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
|
||||
@@ -14178,11 +14205,11 @@ var ts;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
var t = getReturnTypeOfSignature(target);
|
||||
if (t === voidType)
|
||||
var targetReturnType = getReturnTypeOfSignature(target);
|
||||
if (targetReturnType === voidType)
|
||||
return result;
|
||||
var s = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(s, t, reportErrors);
|
||||
var sourceReturnType = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(sourceReturnType, targetReturnType, reportErrors);
|
||||
}
|
||||
function signaturesIdenticalTo(source, target, kind) {
|
||||
var sourceSignatures = getSignaturesOfType(source, kind);
|
||||
@@ -14395,7 +14422,7 @@ var ts;
|
||||
return !!getPropertyOfType(type, "0");
|
||||
}
|
||||
function isTupleType(type) {
|
||||
return (type.flags & 8192) && !!type.elementTypes;
|
||||
return !!(type.flags & 8192);
|
||||
}
|
||||
function getWidenedTypeOfObjectLiteral(type) {
|
||||
var properties = getPropertiesOfObjectType(type);
|
||||
@@ -14437,25 +14464,36 @@ var ts;
|
||||
if (isArrayType(type)) {
|
||||
return createArrayType(getWidenedType(type.typeArguments[0]));
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
return createTupleType(ts.map(type.elementTypes, getWidenedType));
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function reportWideningErrorsInType(type) {
|
||||
var errorReported = false;
|
||||
if (type.flags & 16384) {
|
||||
var errorReported = false;
|
||||
ts.forEach(type.types, function (t) {
|
||||
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
||||
var t = _a[_i];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
if (isArrayType(type)) {
|
||||
return reportWideningErrorsInType(type.typeArguments[0]);
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
for (var _b = 0, _c = type.elementTypes; _b < _c.length; _b++) {
|
||||
var t = _c[_b];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type.flags & 524288) {
|
||||
var errorReported = false;
|
||||
ts.forEach(getPropertiesOfObjectType(type), function (p) {
|
||||
for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
|
||||
var p = _e[_d];
|
||||
var t = getTypeOfSymbol(p);
|
||||
if (t.flags & 1048576) {
|
||||
if (!reportWideningErrorsInType(t)) {
|
||||
@@ -14463,10 +14501,9 @@ var ts;
|
||||
}
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return errorReported;
|
||||
}
|
||||
function reportImplicitAnyError(declaration, type) {
|
||||
var typeAsString = typeToString(getWidenedType(type));
|
||||
@@ -14614,28 +14651,31 @@ var ts;
|
||||
inferFromTypes(sourceType, target);
|
||||
}
|
||||
}
|
||||
else if (source.flags & 80896 && (target.flags & (4096 | 8192) ||
|
||||
(target.flags & 65536) && target.symbol && target.symbol.flags & (8192 | 2048 | 32))) {
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
else {
|
||||
source = getApparentType(source);
|
||||
if (source.flags & 80896 && (target.flags & (4096 | 8192) ||
|
||||
(target.flags & 65536) && target.symbol && target.symbol.flags & (8192 | 2048 | 32))) {
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0);
|
||||
inferFromSignatures(source, target, 1);
|
||||
inferFromIndexTypes(source, target, 0, 0);
|
||||
inferFromIndexTypes(source, target, 1, 1);
|
||||
inferFromIndexTypes(source, target, 0, 1);
|
||||
depth--;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0);
|
||||
inferFromSignatures(source, target, 1);
|
||||
inferFromIndexTypes(source, target, 0, 0);
|
||||
inferFromIndexTypes(source, target, 1, 1);
|
||||
inferFromIndexTypes(source, target, 0, 1);
|
||||
depth--;
|
||||
}
|
||||
}
|
||||
function inferFromProperties(source, target) {
|
||||
|
||||
+304
-254
@@ -933,7 +933,14 @@ var ts;
|
||||
newLine: _os.EOL,
|
||||
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
|
||||
write: function (s) {
|
||||
_fs.writeSync(1, s);
|
||||
var buffer = new Buffer(s, 'utf8');
|
||||
var offset = 0;
|
||||
var toWrite = buffer.length;
|
||||
var written = 0;
|
||||
while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) {
|
||||
offset += written;
|
||||
toWrite -= written;
|
||||
}
|
||||
},
|
||||
readFile: readFile,
|
||||
writeFile: writeFile,
|
||||
@@ -1401,7 +1408,7 @@ var ts;
|
||||
Classes_containing_abstract_methods_must_be_marked_abstract: { code: 2514, category: ts.DiagnosticCategory.Error, key: "Classes containing abstract methods must be marked abstract." },
|
||||
Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: { code: 2515, category: ts.DiagnosticCategory.Error, key: "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'." },
|
||||
All_declarations_of_an_abstract_method_must_be_consecutive: { code: 2516, category: ts.DiagnosticCategory.Error, key: "All declarations of an abstract method must be consecutive." },
|
||||
Constructor_objects_of_abstract_type_cannot_be_assigned_to_constructor_objects_of_non_abstract_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Constructor objects of abstract type cannot be assigned to constructor objects of non-abstract type" },
|
||||
Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Cannot assign an abstract constructor type to a non-abstract constructor type." },
|
||||
Only_an_ambient_class_can_be_merged_with_an_interface: { code: 2518, category: ts.DiagnosticCategory.Error, key: "Only an ambient class can be merged with an interface." },
|
||||
Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: { code: 2520, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions." },
|
||||
Expression_resolves_to_variable_declaration_0_that_compiler_uses_to_support_async_functions: { code: 2521, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '{0}' that compiler uses to support async functions." },
|
||||
@@ -8904,7 +8911,8 @@ var ts;
|
||||
}
|
||||
else {
|
||||
node.exportClause = parseNamedImportsOrExports(226);
|
||||
if (parseOptional(130)) {
|
||||
if (token === 130 || (token === 8 && !scanner.hasPrecedingLineBreak())) {
|
||||
parseExpected(130);
|
||||
node.moduleSpecifier = parseModuleSpecifier();
|
||||
}
|
||||
}
|
||||
@@ -13686,7 +13694,7 @@ var ts;
|
||||
var id = getTypeListId(elementTypes);
|
||||
var type = tupleTypes[id];
|
||||
if (!type) {
|
||||
type = tupleTypes[id] = createObjectType(8192);
|
||||
type = tupleTypes[id] = createObjectType(8192 | getWideningFlagsOfTypes(elementTypes));
|
||||
type.elementTypes = elementTypes;
|
||||
}
|
||||
return type;
|
||||
@@ -14507,10 +14515,29 @@ var ts;
|
||||
var targetSignatures = getSignaturesOfType(target, kind);
|
||||
var result = -1;
|
||||
var saveErrorInfo = errorInfo;
|
||||
var sourceSig = sourceSignatures[0];
|
||||
var targetSig = targetSignatures[0];
|
||||
if (sourceSig && targetSig) {
|
||||
var sourceErasedSignature = getErasedSignature(sourceSig);
|
||||
var targetErasedSignature = getErasedSignature(targetSig);
|
||||
var sourceReturnType = sourceErasedSignature && getReturnTypeOfSignature(sourceErasedSignature);
|
||||
var targetReturnType = targetErasedSignature && getReturnTypeOfSignature(targetErasedSignature);
|
||||
var sourceReturnDecl = sourceReturnType && sourceReturnType.symbol && ts.getDeclarationOfKind(sourceReturnType.symbol, 211);
|
||||
var targetReturnDecl = targetReturnType && targetReturnType.symbol && ts.getDeclarationOfKind(targetReturnType.symbol, 211);
|
||||
var sourceIsAbstract = sourceReturnDecl && sourceReturnDecl.flags & 256;
|
||||
var targetIsAbstract = targetReturnDecl && targetReturnDecl.flags & 256;
|
||||
if (sourceIsAbstract && !targetIsAbstract) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
|
||||
var t = targetSignatures[_i];
|
||||
if (!t.hasStringLiterals || target.flags & 262144) {
|
||||
var localErrors = reportErrors;
|
||||
var checkedAbstractAssignability = false;
|
||||
for (var _a = 0; _a < sourceSignatures.length; _a++) {
|
||||
var s = sourceSignatures[_a];
|
||||
if (!s.hasStringLiterals || source.flags & 262144) {
|
||||
@@ -14558,12 +14585,12 @@ var ts;
|
||||
target = getErasedSignature(target);
|
||||
var result = -1;
|
||||
for (var i = 0; i < checkCount; i++) {
|
||||
var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var saveErrorInfo = errorInfo;
|
||||
var related = isRelatedTo(s_1, t_1, reportErrors);
|
||||
var related = isRelatedTo(s, t, reportErrors);
|
||||
if (!related) {
|
||||
related = isRelatedTo(t_1, s_1, false);
|
||||
related = isRelatedTo(t, s, false);
|
||||
if (!related) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
|
||||
@@ -14601,11 +14628,11 @@ var ts;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
var t = getReturnTypeOfSignature(target);
|
||||
if (t === voidType)
|
||||
var targetReturnType = getReturnTypeOfSignature(target);
|
||||
if (targetReturnType === voidType)
|
||||
return result;
|
||||
var s = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(s, t, reportErrors);
|
||||
var sourceReturnType = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(sourceReturnType, targetReturnType, reportErrors);
|
||||
}
|
||||
function signaturesIdenticalTo(source, target, kind) {
|
||||
var sourceSignatures = getSignaturesOfType(source, kind);
|
||||
@@ -14818,7 +14845,7 @@ var ts;
|
||||
return !!getPropertyOfType(type, "0");
|
||||
}
|
||||
function isTupleType(type) {
|
||||
return (type.flags & 8192) && !!type.elementTypes;
|
||||
return !!(type.flags & 8192);
|
||||
}
|
||||
function getWidenedTypeOfObjectLiteral(type) {
|
||||
var properties = getPropertiesOfObjectType(type);
|
||||
@@ -14860,25 +14887,36 @@ var ts;
|
||||
if (isArrayType(type)) {
|
||||
return createArrayType(getWidenedType(type.typeArguments[0]));
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
return createTupleType(ts.map(type.elementTypes, getWidenedType));
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
function reportWideningErrorsInType(type) {
|
||||
var errorReported = false;
|
||||
if (type.flags & 16384) {
|
||||
var errorReported = false;
|
||||
ts.forEach(type.types, function (t) {
|
||||
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
||||
var t = _a[_i];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
if (isArrayType(type)) {
|
||||
return reportWideningErrorsInType(type.typeArguments[0]);
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
for (var _b = 0, _c = type.elementTypes; _b < _c.length; _b++) {
|
||||
var t = _c[_b];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type.flags & 524288) {
|
||||
var errorReported = false;
|
||||
ts.forEach(getPropertiesOfObjectType(type), function (p) {
|
||||
for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
|
||||
var p = _e[_d];
|
||||
var t = getTypeOfSymbol(p);
|
||||
if (t.flags & 1048576) {
|
||||
if (!reportWideningErrorsInType(t)) {
|
||||
@@ -14886,10 +14924,9 @@ var ts;
|
||||
}
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return errorReported;
|
||||
}
|
||||
function reportImplicitAnyError(declaration, type) {
|
||||
var typeAsString = typeToString(getWidenedType(type));
|
||||
@@ -15037,28 +15074,31 @@ var ts;
|
||||
inferFromTypes(sourceType, target);
|
||||
}
|
||||
}
|
||||
else if (source.flags & 80896 && (target.flags & (4096 | 8192) ||
|
||||
(target.flags & 65536) && target.symbol && target.symbol.flags & (8192 | 2048 | 32))) {
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
else {
|
||||
source = getApparentType(source);
|
||||
if (source.flags & 80896 && (target.flags & (4096 | 8192) ||
|
||||
(target.flags & 65536) && target.symbol && target.symbol.flags & (8192 | 2048 | 32))) {
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0);
|
||||
inferFromSignatures(source, target, 1);
|
||||
inferFromIndexTypes(source, target, 0, 0);
|
||||
inferFromIndexTypes(source, target, 1, 1);
|
||||
inferFromIndexTypes(source, target, 0, 1);
|
||||
depth--;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0);
|
||||
inferFromSignatures(source, target, 1);
|
||||
inferFromIndexTypes(source, target, 0, 0);
|
||||
inferFromIndexTypes(source, target, 1, 1);
|
||||
inferFromIndexTypes(source, target, 0, 1);
|
||||
depth--;
|
||||
}
|
||||
}
|
||||
function inferFromProperties(source, target) {
|
||||
@@ -31937,15 +31977,15 @@ var ts;
|
||||
var t;
|
||||
var pos = scanner.getStartPos();
|
||||
while (pos < endPos) {
|
||||
var t_2 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_2)) {
|
||||
var t_1 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_1)) {
|
||||
break;
|
||||
}
|
||||
scanner.scan();
|
||||
var item = {
|
||||
pos: pos,
|
||||
end: scanner.getStartPos(),
|
||||
kind: t_2
|
||||
kind: t_1
|
||||
};
|
||||
pos = scanner.getStartPos();
|
||||
if (!leadingTrivia) {
|
||||
@@ -33289,6 +33329,8 @@ var ts;
|
||||
case 15:
|
||||
case 18:
|
||||
case 19:
|
||||
case 16:
|
||||
case 17:
|
||||
case 77:
|
||||
case 101:
|
||||
case 53:
|
||||
@@ -33390,7 +33432,7 @@ var ts;
|
||||
}
|
||||
else if (tokenInfo.token.kind === listStartToken) {
|
||||
startLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line;
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1, parent, parentDynamicIndentation, startLine);
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1, parent, parentDynamicIndentation, parentStartLine);
|
||||
listDynamicIndentation = getDynamicIndentation(parent, parentStartLine, indentation_1.indentation, indentation_1.delta);
|
||||
consumeTokenAndAdvanceScanner(tokenInfo, parent, listDynamicIndentation);
|
||||
}
|
||||
@@ -35052,6 +35094,12 @@ var ts;
|
||||
var newSourceFile = ts.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
|
||||
setSourceFileFields(newSourceFile, scriptSnapshot, version);
|
||||
newSourceFile.nameTable = undefined;
|
||||
if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
|
||||
if (sourceFile.scriptSnapshot.dispose) {
|
||||
sourceFile.scriptSnapshot.dispose();
|
||||
}
|
||||
sourceFile.scriptSnapshot = undefined;
|
||||
}
|
||||
return newSourceFile;
|
||||
}
|
||||
}
|
||||
@@ -35908,20 +35956,20 @@ var ts;
|
||||
}
|
||||
function tryGetGlobalSymbols() {
|
||||
var objectLikeContainer;
|
||||
var importClause;
|
||||
var namedImportsOrExports;
|
||||
var jsxContainer;
|
||||
if (objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken)) {
|
||||
return tryGetObjectLikeCompletionSymbols(objectLikeContainer);
|
||||
}
|
||||
if (importClause = ts.getAncestor(contextToken, 220)) {
|
||||
return tryGetImportClauseCompletionSymbols(importClause);
|
||||
if (namedImportsOrExports = tryGetNamedImportsOrExportsForCompletion(contextToken)) {
|
||||
return tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports);
|
||||
}
|
||||
if (jsxContainer = tryGetContainingJsxElement(contextToken)) {
|
||||
var attrsType;
|
||||
if ((jsxContainer.kind === 231) || (jsxContainer.kind === 232)) {
|
||||
attrsType = typeChecker.getJsxElementAttributesType(jsxContainer);
|
||||
if (attrsType) {
|
||||
symbols = filterJsxAttributes(jsxContainer.attributes, typeChecker.getPropertiesOfType(attrsType));
|
||||
symbols = filterJsxAttributes(typeChecker.getPropertiesOfType(attrsType), jsxContainer.attributes);
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
return true;
|
||||
@@ -35951,19 +35999,11 @@ var ts;
|
||||
function isCompletionListBlocker(contextToken) {
|
||||
var start = new Date().getTime();
|
||||
var result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) ||
|
||||
isIdentifierDefinitionLocation(contextToken) ||
|
||||
isSolelyIdentifierDefinitionLocation(contextToken) ||
|
||||
isDotOfNumericLiteral(contextToken);
|
||||
log("getCompletionsAtPosition: isCompletionListBlocker: " + (new Date().getTime() - start));
|
||||
return result;
|
||||
}
|
||||
function shouldShowCompletionsInImportsClause(node) {
|
||||
if (node) {
|
||||
if (node.kind === 14 || node.kind === 23) {
|
||||
return node.parent.kind === 222;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isNewIdentifierDefinitionLocation(previousToken) {
|
||||
if (previousToken) {
|
||||
var containingNodeKind = previousToken.parent.kind;
|
||||
@@ -36055,23 +36095,23 @@ var ts;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
function tryGetImportClauseCompletionSymbols(importClause) {
|
||||
if (shouldShowCompletionsInImportsClause(contextToken)) {
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var importDeclaration = importClause.parent;
|
||||
ts.Debug.assert(importDeclaration !== undefined && importDeclaration.kind === 219);
|
||||
var exports_2;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports_2 = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
symbols = exports_2 ? filterModuleExports(exports_2, importDeclaration) : emptyArray;
|
||||
function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports) {
|
||||
var declarationKind = namedImportsOrExports.kind === 222 ?
|
||||
219 :
|
||||
225;
|
||||
var importOrExportDeclaration = ts.getAncestor(namedImportsOrExports, declarationKind);
|
||||
var moduleSpecifier = importOrExportDeclaration.moduleSpecifier;
|
||||
if (!moduleSpecifier) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
isMemberCompletion = false;
|
||||
isNewIdentifierLocation = true;
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var exports;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
symbols = exports ? filterNamedImportOrExportCompletionItems(exports, namedImportsOrExports.elements) : emptyArray;
|
||||
return true;
|
||||
}
|
||||
function tryGetObjectLikeCompletionContainer(contextToken) {
|
||||
@@ -36088,6 +36128,20 @@ var ts;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function tryGetNamedImportsOrExportsForCompletion(contextToken) {
|
||||
if (contextToken) {
|
||||
switch (contextToken.kind) {
|
||||
case 14:
|
||||
case 23:
|
||||
switch (contextToken.parent.kind) {
|
||||
case 222:
|
||||
case 226:
|
||||
return contextToken.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function tryGetContainingJsxElement(contextToken) {
|
||||
if (contextToken) {
|
||||
var parent_12 = contextToken.parent;
|
||||
@@ -36127,7 +36181,7 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isIdentifierDefinitionLocation(contextToken) {
|
||||
function isSolelyIdentifierDefinitionLocation(contextToken) {
|
||||
var containingNodeKind = contextToken.parent.kind;
|
||||
switch (contextToken.kind) {
|
||||
case 23:
|
||||
@@ -36173,6 +36227,10 @@ var ts;
|
||||
case 107:
|
||||
case 108:
|
||||
return containingNodeKind === 135;
|
||||
case 113:
|
||||
containingNodeKind === 223 ||
|
||||
containingNodeKind === 227 ||
|
||||
containingNodeKind === 221;
|
||||
case 70:
|
||||
case 78:
|
||||
case 104:
|
||||
@@ -36208,25 +36266,20 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function filterModuleExports(exports, importDeclaration) {
|
||||
var exisingImports = {};
|
||||
if (!importDeclaration.importClause) {
|
||||
return exports;
|
||||
function filterNamedImportOrExportCompletionItems(exportsOfModule, namedImportsOrExports) {
|
||||
var exisingImportsOrExports = {};
|
||||
for (var _i = 0; _i < namedImportsOrExports.length; _i++) {
|
||||
var element = namedImportsOrExports[_i];
|
||||
if (element.getStart() <= position && position <= element.getEnd()) {
|
||||
continue;
|
||||
}
|
||||
var name_31 = element.propertyName || element.name;
|
||||
exisingImportsOrExports[name_31.text] = true;
|
||||
}
|
||||
if (importDeclaration.importClause.namedBindings &&
|
||||
importDeclaration.importClause.namedBindings.kind === 222) {
|
||||
ts.forEach(importDeclaration.importClause.namedBindings.elements, function (el) {
|
||||
if (el.getStart() <= position && position <= el.getEnd()) {
|
||||
return;
|
||||
}
|
||||
var name = el.propertyName || el.name;
|
||||
exisingImports[name.text] = true;
|
||||
});
|
||||
if (ts.isEmpty(exisingImportsOrExports)) {
|
||||
return exportsOfModule;
|
||||
}
|
||||
if (ts.isEmpty(exisingImports)) {
|
||||
return exports;
|
||||
}
|
||||
return ts.filter(exports, function (e) { return !ts.lookUp(exisingImports, e.name); });
|
||||
return ts.filter(exportsOfModule, function (e) { return !ts.lookUp(exisingImportsOrExports, e.name); });
|
||||
}
|
||||
function filterObjectMembersList(contextualMemberSymbols, existingMembers) {
|
||||
if (!existingMembers || existingMembers.length === 0) {
|
||||
@@ -36252,15 +36305,9 @@ var ts;
|
||||
}
|
||||
existingMemberNames[existingName] = true;
|
||||
}
|
||||
var filteredMembers = [];
|
||||
ts.forEach(contextualMemberSymbols, function (s) {
|
||||
if (!existingMemberNames[s.name]) {
|
||||
filteredMembers.push(s);
|
||||
}
|
||||
});
|
||||
return filteredMembers;
|
||||
return ts.filter(contextualMemberSymbols, function (m) { return !ts.lookUp(existingMemberNames, m.name); });
|
||||
}
|
||||
function filterJsxAttributes(attributes, symbols) {
|
||||
function filterJsxAttributes(symbols, attributes) {
|
||||
var seenNames = {};
|
||||
for (var _i = 0; _i < attributes.length; _i++) {
|
||||
var attr = attributes[_i];
|
||||
@@ -36271,14 +36318,7 @@ var ts;
|
||||
seenNames[attr.name.text] = true;
|
||||
}
|
||||
}
|
||||
var result = [];
|
||||
for (var _a = 0; _a < symbols.length; _a++) {
|
||||
var sym = symbols[_a];
|
||||
if (!seenNames[sym.name]) {
|
||||
result.push(sym);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return ts.filter(symbols, function (a) { return !ts.lookUp(seenNames, a.name); });
|
||||
}
|
||||
}
|
||||
function getCompletionsAtPosition(fileName, position) {
|
||||
@@ -36310,10 +36350,10 @@ var ts;
|
||||
for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
|
||||
var sourceFile = _a[_i];
|
||||
var nameTable = getNameTable(sourceFile);
|
||||
for (var name_31 in nameTable) {
|
||||
if (!allNames[name_31]) {
|
||||
allNames[name_31] = name_31;
|
||||
var displayName = getCompletionEntryDisplayName(name_31, target, true);
|
||||
for (var name_32 in nameTable) {
|
||||
if (!allNames[name_32]) {
|
||||
allNames[name_32] = name_32;
|
||||
var displayName = getCompletionEntryDisplayName(name_32, target, true);
|
||||
if (displayName) {
|
||||
var entry = {
|
||||
name: displayName,
|
||||
@@ -37117,6 +37157,7 @@ var ts;
|
||||
if (hasKind(node.parent, 142) || hasKind(node.parent, 143)) {
|
||||
return getGetAndSetOccurrences(node.parent);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (ts.isModifier(node.kind) && node.parent &&
|
||||
(ts.isDeclaration(node.parent) || node.parent.kind === 190)) {
|
||||
@@ -37216,12 +37257,13 @@ var ts;
|
||||
var container = declaration.parent;
|
||||
if (ts.isAccessibilityModifier(modifier)) {
|
||||
if (!(container.kind === 211 ||
|
||||
container.kind === 183 ||
|
||||
(declaration.kind === 135 && hasKind(container, 141)))) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 110) {
|
||||
if (container.kind !== 211) {
|
||||
if (!(container.kind === 211 || container.kind === 183)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
@@ -37230,6 +37272,11 @@ var ts;
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 112) {
|
||||
if (!(container.kind === 211 || declaration.kind === 211)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
@@ -37239,12 +37286,18 @@ var ts;
|
||||
switch (container.kind) {
|
||||
case 216:
|
||||
case 245:
|
||||
nodes = container.statements;
|
||||
if (modifierFlag & 256) {
|
||||
nodes = declaration.members.concat(declaration);
|
||||
}
|
||||
else {
|
||||
nodes = container.statements;
|
||||
}
|
||||
break;
|
||||
case 141:
|
||||
nodes = container.parameters.concat(container.parent.members);
|
||||
break;
|
||||
case 211:
|
||||
case 183:
|
||||
nodes = container.members;
|
||||
if (modifierFlag & 112) {
|
||||
var constructor = ts.forEach(container.members, function (member) {
|
||||
@@ -37254,6 +37307,9 @@ var ts;
|
||||
nodes = nodes.concat(constructor.parameters);
|
||||
}
|
||||
}
|
||||
else if (modifierFlag & 256) {
|
||||
nodes = nodes.concat(container);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ts.Debug.fail("Invalid container kind.");
|
||||
@@ -37278,6 +37334,8 @@ var ts;
|
||||
return 1;
|
||||
case 119:
|
||||
return 2;
|
||||
case 112:
|
||||
return 256;
|
||||
default:
|
||||
ts.Debug.fail();
|
||||
}
|
||||
@@ -37975,17 +38033,17 @@ var ts;
|
||||
if (isNameOfPropertyAssignment(node)) {
|
||||
var objectLiteral = node.parent.parent;
|
||||
var contextualType = typeChecker.getContextualType(objectLiteral);
|
||||
var name_32 = node.text;
|
||||
var name_33 = node.text;
|
||||
if (contextualType) {
|
||||
if (contextualType.flags & 16384) {
|
||||
var unionProperty = contextualType.getProperty(name_32);
|
||||
var unionProperty = contextualType.getProperty(name_33);
|
||||
if (unionProperty) {
|
||||
return [unionProperty];
|
||||
}
|
||||
else {
|
||||
var result_4 = [];
|
||||
ts.forEach(contextualType.types, function (t) {
|
||||
var symbol = t.getProperty(name_32);
|
||||
var symbol = t.getProperty(name_33);
|
||||
if (symbol) {
|
||||
result_4.push(symbol);
|
||||
}
|
||||
@@ -37994,7 +38052,7 @@ var ts;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var symbol_1 = contextualType.getProperty(name_32);
|
||||
var symbol_1 = contextualType.getProperty(name_33);
|
||||
if (symbol_1) {
|
||||
return [symbol_1];
|
||||
}
|
||||
@@ -38593,7 +38651,7 @@ var ts;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return 9;
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
function processElement(element) {
|
||||
@@ -39337,10 +39395,113 @@ var ts;
|
||||
this.fileHash = {};
|
||||
this.nextFileId = 1;
|
||||
this.changeSeq = 0;
|
||||
this.handlers = (_a = {},
|
||||
_a[CommandNames.Exit] = function () {
|
||||
_this.exit();
|
||||
return {};
|
||||
},
|
||||
_a[CommandNames.Definition] = function (request) {
|
||||
var defArgs = request.arguments;
|
||||
return { response: _this.getDefinition(defArgs.line, defArgs.offset, defArgs.file) };
|
||||
},
|
||||
_a[CommandNames.TypeDefinition] = function (request) {
|
||||
var defArgs = request.arguments;
|
||||
return { response: _this.getTypeDefinition(defArgs.line, defArgs.offset, defArgs.file) };
|
||||
},
|
||||
_a[CommandNames.References] = function (request) {
|
||||
var defArgs = request.arguments;
|
||||
return { response: _this.getReferences(defArgs.line, defArgs.offset, defArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Rename] = function (request) {
|
||||
var renameArgs = request.arguments;
|
||||
return { response: _this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings) };
|
||||
},
|
||||
_a[CommandNames.Open] = function (request) {
|
||||
var openArgs = request.arguments;
|
||||
_this.openClientFile(openArgs.file);
|
||||
return {};
|
||||
},
|
||||
_a[CommandNames.Quickinfo] = function (request) {
|
||||
var quickinfoArgs = request.arguments;
|
||||
return { response: _this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Format] = function (request) {
|
||||
var formatArgs = request.arguments;
|
||||
return { response: _this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Formatonkey] = function (request) {
|
||||
var formatOnKeyArgs = request.arguments;
|
||||
return { response: _this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Completions] = function (request) {
|
||||
var completionsArgs = request.arguments;
|
||||
return { response: _this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file) };
|
||||
},
|
||||
_a[CommandNames.CompletionDetails] = function (request) {
|
||||
var completionDetailsArgs = request.arguments;
|
||||
return { response: _this.getCompletionEntryDetails(completionDetailsArgs.line, completionDetailsArgs.offset, completionDetailsArgs.entryNames, completionDetailsArgs.file) };
|
||||
},
|
||||
_a[CommandNames.SignatureHelp] = function (request) {
|
||||
var signatureHelpArgs = request.arguments;
|
||||
return { response: _this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Geterr] = function (request) {
|
||||
var geterrArgs = request.arguments;
|
||||
return { response: _this.getDiagnostics(geterrArgs.delay, geterrArgs.files), responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Change] = function (request) {
|
||||
var changeArgs = request.arguments;
|
||||
_this.change(changeArgs.line, changeArgs.offset, changeArgs.endLine, changeArgs.endOffset, changeArgs.insertString, changeArgs.file);
|
||||
return { responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Configure] = function (request) {
|
||||
var configureArgs = request.arguments;
|
||||
_this.projectService.setHostConfiguration(configureArgs);
|
||||
_this.output(undefined, CommandNames.Configure, request.seq);
|
||||
return { responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Reload] = function (request) {
|
||||
var reloadArgs = request.arguments;
|
||||
_this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq);
|
||||
return { responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Saveto] = function (request) {
|
||||
var savetoArgs = request.arguments;
|
||||
_this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile);
|
||||
return { responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Close] = function (request) {
|
||||
var closeArgs = request.arguments;
|
||||
_this.closeClientFile(closeArgs.file);
|
||||
return { responseRequired: false };
|
||||
},
|
||||
_a[CommandNames.Navto] = function (request) {
|
||||
var navtoArgs = request.arguments;
|
||||
return { response: _this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount) };
|
||||
},
|
||||
_a[CommandNames.Brace] = function (request) {
|
||||
var braceArguments = request.arguments;
|
||||
return { response: _this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file) };
|
||||
},
|
||||
_a[CommandNames.NavBar] = function (request) {
|
||||
var navBarArgs = request.arguments;
|
||||
return { response: _this.getNavigationBarItems(navBarArgs.file) };
|
||||
},
|
||||
_a[CommandNames.Occurrences] = function (request) {
|
||||
var _a = request.arguments, line = _a.line, offset = _a.offset, fileName = _a.file;
|
||||
return { response: _this.getOccurrences(line, offset, fileName) };
|
||||
},
|
||||
_a[CommandNames.ProjectInfo] = function (request) {
|
||||
var _a = request.arguments, file = _a.file, needFileNameList = _a.needFileNameList;
|
||||
return { response: _this.getProjectInfo(file, needFileNameList) };
|
||||
},
|
||||
_a
|
||||
);
|
||||
this.projectService =
|
||||
new server.ProjectService(host, logger, function (eventName, project, fileName) {
|
||||
_this.handleEvent(eventName, project, fileName);
|
||||
});
|
||||
var _a;
|
||||
}
|
||||
Session.prototype.handleEvent = function (eventName, project, fileName) {
|
||||
var _this = this;
|
||||
@@ -39957,6 +40118,23 @@ var ts;
|
||||
};
|
||||
Session.prototype.exit = function () {
|
||||
};
|
||||
Session.prototype.addProtocolHandler = function (command, handler) {
|
||||
if (this.handlers[command]) {
|
||||
throw new Error("Protocol handler already exists for command \"" + command + "\"");
|
||||
}
|
||||
this.handlers[command] = handler;
|
||||
};
|
||||
Session.prototype.executeCommand = function (request) {
|
||||
var handler = this.handlers[request.command];
|
||||
if (handler) {
|
||||
return handler(request);
|
||||
}
|
||||
else {
|
||||
this.projectService.log("Unrecognized JSON command: " + JSON.stringify(request));
|
||||
this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command);
|
||||
return { responseRequired: false };
|
||||
}
|
||||
};
|
||||
Session.prototype.onMessage = function (message) {
|
||||
if (this.logger.isVerbose()) {
|
||||
this.logger.info("request: " + message);
|
||||
@@ -39964,140 +40142,7 @@ var ts;
|
||||
}
|
||||
try {
|
||||
var request = JSON.parse(message);
|
||||
var response;
|
||||
var errorMessage;
|
||||
var responseRequired = true;
|
||||
switch (request.command) {
|
||||
case CommandNames.Exit: {
|
||||
this.exit();
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Definition: {
|
||||
var defArgs = request.arguments;
|
||||
response = this.getDefinition(defArgs.line, defArgs.offset, defArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.TypeDefinition: {
|
||||
var defArgs = request.arguments;
|
||||
response = this.getTypeDefinition(defArgs.line, defArgs.offset, defArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.References: {
|
||||
var refArgs = request.arguments;
|
||||
response = this.getReferences(refArgs.line, refArgs.offset, refArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Rename: {
|
||||
var renameArgs = request.arguments;
|
||||
response = this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Open: {
|
||||
var openArgs = request.arguments;
|
||||
this.openClientFile(openArgs.file);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Quickinfo: {
|
||||
var quickinfoArgs = request.arguments;
|
||||
response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Format: {
|
||||
var formatArgs = request.arguments;
|
||||
response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Formatonkey: {
|
||||
var formatOnKeyArgs = request.arguments;
|
||||
response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Completions: {
|
||||
var completionsArgs = request.arguments;
|
||||
response = this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.CompletionDetails: {
|
||||
var completionDetailsArgs = request.arguments;
|
||||
response =
|
||||
this.getCompletionEntryDetails(completionDetailsArgs.line, completionDetailsArgs.offset, completionDetailsArgs.entryNames, completionDetailsArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.SignatureHelp: {
|
||||
var signatureHelpArgs = request.arguments;
|
||||
response = this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Geterr: {
|
||||
var geterrArgs = request.arguments;
|
||||
response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Change: {
|
||||
var changeArgs = request.arguments;
|
||||
this.change(changeArgs.line, changeArgs.offset, changeArgs.endLine, changeArgs.endOffset, changeArgs.insertString, changeArgs.file);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Configure: {
|
||||
var configureArgs = request.arguments;
|
||||
this.projectService.setHostConfiguration(configureArgs);
|
||||
this.output(undefined, CommandNames.Configure, request.seq);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Reload: {
|
||||
var reloadArgs = request.arguments;
|
||||
this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Saveto: {
|
||||
var savetoArgs = request.arguments;
|
||||
this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Close: {
|
||||
var closeArgs = request.arguments;
|
||||
this.closeClientFile(closeArgs.file);
|
||||
responseRequired = false;
|
||||
break;
|
||||
}
|
||||
case CommandNames.Navto: {
|
||||
var navtoArgs = request.arguments;
|
||||
response = this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Brace: {
|
||||
var braceArguments = request.arguments;
|
||||
response = this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.NavBar: {
|
||||
var navBarArgs = request.arguments;
|
||||
response = this.getNavigationBarItems(navBarArgs.file);
|
||||
break;
|
||||
}
|
||||
case CommandNames.Occurrences: {
|
||||
var _a = request.arguments, line = _a.line, offset = _a.offset, fileName = _a.file;
|
||||
response = this.getOccurrences(line, offset, fileName);
|
||||
break;
|
||||
}
|
||||
case CommandNames.ProjectInfo: {
|
||||
var _b = request.arguments, file = _b.file, needFileNameList = _b.needFileNameList;
|
||||
response = this.getProjectInfo(file, needFileNameList);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this.projectService.log("Unrecognized JSON command: " + message);
|
||||
this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command);
|
||||
break;
|
||||
}
|
||||
}
|
||||
var _a = this.executeCommand(request), response = _a.response, responseRequired = _a.responseRequired;
|
||||
if (this.logger.isVerbose()) {
|
||||
var elapsed = this.hrtime(start);
|
||||
var seconds = elapsed[0];
|
||||
@@ -42027,6 +42072,11 @@ var ts;
|
||||
var decoded = JSON.parse(encoded);
|
||||
return ts.createTextChangeRange(ts.createTextSpan(decoded.span.start, decoded.span.length), decoded.newLength);
|
||||
};
|
||||
ScriptSnapshotShimAdapter.prototype.dispose = function () {
|
||||
if ("dispose" in this.scriptSnapshotShim) {
|
||||
this.scriptSnapshotShim.dispose();
|
||||
}
|
||||
};
|
||||
return ScriptSnapshotShimAdapter;
|
||||
})();
|
||||
var LanguageServiceShimHostAdapter = (function () {
|
||||
|
||||
Vendored
+2
@@ -1591,6 +1591,8 @@ declare module "typescript" {
|
||||
* not happen and the entire document will be re - parsed.
|
||||
*/
|
||||
getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange;
|
||||
/** Releases all resources held by this script snapshot */
|
||||
dispose?(): void;
|
||||
}
|
||||
module ScriptSnapshot {
|
||||
function fromString(text: string): IScriptSnapshot;
|
||||
|
||||
+243
-129
@@ -1775,8 +1775,15 @@ var ts;
|
||||
newLine: _os.EOL,
|
||||
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
|
||||
write: function (s) {
|
||||
var buffer = new Buffer(s, 'utf8');
|
||||
var offset = 0;
|
||||
var toWrite = buffer.length;
|
||||
var written = 0;
|
||||
// 1 is a standard descriptor for stdout
|
||||
_fs.writeSync(1, s);
|
||||
while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) {
|
||||
offset += written;
|
||||
toWrite -= written;
|
||||
}
|
||||
},
|
||||
readFile: readFile,
|
||||
writeFile: writeFile,
|
||||
@@ -2247,7 +2254,7 @@ var ts;
|
||||
Classes_containing_abstract_methods_must_be_marked_abstract: { code: 2514, category: ts.DiagnosticCategory.Error, key: "Classes containing abstract methods must be marked abstract." },
|
||||
Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: { code: 2515, category: ts.DiagnosticCategory.Error, key: "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'." },
|
||||
All_declarations_of_an_abstract_method_must_be_consecutive: { code: 2516, category: ts.DiagnosticCategory.Error, key: "All declarations of an abstract method must be consecutive." },
|
||||
Constructor_objects_of_abstract_type_cannot_be_assigned_to_constructor_objects_of_non_abstract_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Constructor objects of abstract type cannot be assigned to constructor objects of non-abstract type" },
|
||||
Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Cannot assign an abstract constructor type to a non-abstract constructor type." },
|
||||
Only_an_ambient_class_can_be_merged_with_an_interface: { code: 2518, category: ts.DiagnosticCategory.Error, key: "Only an ambient class can be merged with an interface." },
|
||||
Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: { code: 2520, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions." },
|
||||
Expression_resolves_to_variable_declaration_0_that_compiler_uses_to_support_async_functions: { code: 2521, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '{0}' that compiler uses to support async functions." },
|
||||
@@ -11517,7 +11524,11 @@ var ts;
|
||||
}
|
||||
else {
|
||||
node.exportClause = parseNamedImportsOrExports(226 /* NamedExports */);
|
||||
if (parseOptional(130 /* FromKeyword */)) {
|
||||
// It is not uncommon to accidentally omit the 'from' keyword. Additionally, in editing scenarios,
|
||||
// the 'from' keyword can be parsed as a named export when the export clause is unterminated (i.e. `export { from "moduleName";`)
|
||||
// If we don't have a 'from' keyword, see if we have a string literal such that ASI won't take effect.
|
||||
if (token === 130 /* FromKeyword */ || (token === 8 /* StringLiteral */ && !scanner.hasPrecedingLineBreak())) {
|
||||
parseExpected(130 /* FromKeyword */);
|
||||
node.moduleSpecifier = parseModuleSpecifier();
|
||||
}
|
||||
}
|
||||
@@ -16299,7 +16310,7 @@ var ts;
|
||||
var id = getTypeListId(elementTypes);
|
||||
var type = tupleTypes[id];
|
||||
if (!type) {
|
||||
type = tupleTypes[id] = createObjectType(8192 /* Tuple */);
|
||||
type = tupleTypes[id] = createObjectType(8192 /* Tuple */ | getWideningFlagsOfTypes(elementTypes));
|
||||
type.elementTypes = elementTypes;
|
||||
}
|
||||
return type;
|
||||
@@ -17200,10 +17211,33 @@ var ts;
|
||||
var targetSignatures = getSignaturesOfType(target, kind);
|
||||
var result = -1 /* True */;
|
||||
var saveErrorInfo = errorInfo;
|
||||
// Because the "abstractness" of a class is the same across all construct signatures
|
||||
// (internally we are checking the corresponding declaration), it is enough to perform
|
||||
// the check and report an error once over all pairs of source and target construct signatures.
|
||||
var sourceSig = sourceSignatures[0];
|
||||
// Note that in an extends-clause, targetSignatures is stripped, so the check never proceeds.
|
||||
var targetSig = targetSignatures[0];
|
||||
if (sourceSig && targetSig) {
|
||||
var sourceErasedSignature = getErasedSignature(sourceSig);
|
||||
var targetErasedSignature = getErasedSignature(targetSig);
|
||||
var sourceReturnType = sourceErasedSignature && getReturnTypeOfSignature(sourceErasedSignature);
|
||||
var targetReturnType = targetErasedSignature && getReturnTypeOfSignature(targetErasedSignature);
|
||||
var sourceReturnDecl = sourceReturnType && sourceReturnType.symbol && ts.getDeclarationOfKind(sourceReturnType.symbol, 211 /* ClassDeclaration */);
|
||||
var targetReturnDecl = targetReturnType && targetReturnType.symbol && ts.getDeclarationOfKind(targetReturnType.symbol, 211 /* ClassDeclaration */);
|
||||
var sourceIsAbstract = sourceReturnDecl && sourceReturnDecl.flags & 256 /* Abstract */;
|
||||
var targetIsAbstract = targetReturnDecl && targetReturnDecl.flags & 256 /* Abstract */;
|
||||
if (sourceIsAbstract && !targetIsAbstract) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
|
||||
}
|
||||
return 0 /* False */;
|
||||
}
|
||||
}
|
||||
outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
|
||||
var t = targetSignatures[_i];
|
||||
if (!t.hasStringLiterals || target.flags & 262144 /* FromSignature */) {
|
||||
var localErrors = reportErrors;
|
||||
var checkedAbstractAssignability = false;
|
||||
for (var _a = 0; _a < sourceSignatures.length; _a++) {
|
||||
var s = sourceSignatures[_a];
|
||||
if (!s.hasStringLiterals || source.flags & 262144 /* FromSignature */) {
|
||||
@@ -17254,12 +17288,12 @@ var ts;
|
||||
target = getErasedSignature(target);
|
||||
var result = -1 /* True */;
|
||||
for (var i = 0; i < checkCount; i++) {
|
||||
var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var saveErrorInfo = errorInfo;
|
||||
var related = isRelatedTo(s_1, t_1, reportErrors);
|
||||
var related = isRelatedTo(s, t, reportErrors);
|
||||
if (!related) {
|
||||
related = isRelatedTo(t_1, s_1, false);
|
||||
related = isRelatedTo(t, s, false);
|
||||
if (!related) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
|
||||
@@ -17297,11 +17331,11 @@ var ts;
|
||||
}
|
||||
return 0 /* False */;
|
||||
}
|
||||
var t = getReturnTypeOfSignature(target);
|
||||
if (t === voidType)
|
||||
var targetReturnType = getReturnTypeOfSignature(target);
|
||||
if (targetReturnType === voidType)
|
||||
return result;
|
||||
var s = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(s, t, reportErrors);
|
||||
var sourceReturnType = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(sourceReturnType, targetReturnType, reportErrors);
|
||||
}
|
||||
function signaturesIdenticalTo(source, target, kind) {
|
||||
var sourceSignatures = getSignaturesOfType(source, kind);
|
||||
@@ -17537,7 +17571,7 @@ var ts;
|
||||
* Prefer using isTupleLikeType() unless the use of `elementTypes` is required.
|
||||
*/
|
||||
function isTupleType(type) {
|
||||
return (type.flags & 8192 /* Tuple */) && !!type.elementTypes;
|
||||
return !!(type.flags & 8192 /* Tuple */);
|
||||
}
|
||||
function getWidenedTypeOfObjectLiteral(type) {
|
||||
var properties = getPropertiesOfObjectType(type);
|
||||
@@ -17579,25 +17613,47 @@ var ts;
|
||||
if (isArrayType(type)) {
|
||||
return createArrayType(getWidenedType(type.typeArguments[0]));
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
return createTupleType(ts.map(type.elementTypes, getWidenedType));
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Reports implicit any errors that occur as a result of widening 'null' and 'undefined'
|
||||
* to 'any'. A call to reportWideningErrorsInType is normally accompanied by a call to
|
||||
* getWidenedType. But in some cases getWidenedType is called without reporting errors
|
||||
* (type argument inference is an example).
|
||||
*
|
||||
* The return value indicates whether an error was in fact reported. The particular circumstances
|
||||
* are on a best effort basis. Currently, if the null or undefined that causes widening is inside
|
||||
* an object literal property (arbitrarily deeply), this function reports an error. If no error is
|
||||
* reported, reportImplicitAnyError is a suitable fallback to report a general error.
|
||||
*/
|
||||
function reportWideningErrorsInType(type) {
|
||||
var errorReported = false;
|
||||
if (type.flags & 16384 /* Union */) {
|
||||
var errorReported = false;
|
||||
ts.forEach(type.types, function (t) {
|
||||
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
||||
var t = _a[_i];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
if (isArrayType(type)) {
|
||||
return reportWideningErrorsInType(type.typeArguments[0]);
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
for (var _b = 0, _c = type.elementTypes; _b < _c.length; _b++) {
|
||||
var t = _c[_b];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type.flags & 524288 /* ObjectLiteral */) {
|
||||
var errorReported = false;
|
||||
ts.forEach(getPropertiesOfObjectType(type), function (p) {
|
||||
for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
|
||||
var p = _e[_d];
|
||||
var t = getTypeOfSymbol(p);
|
||||
if (t.flags & 1048576 /* ContainsUndefinedOrNull */) {
|
||||
if (!reportWideningErrorsInType(t)) {
|
||||
@@ -17605,10 +17661,9 @@ var ts;
|
||||
}
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return errorReported;
|
||||
}
|
||||
function reportImplicitAnyError(declaration, type) {
|
||||
var typeAsString = typeToString(getWidenedType(type));
|
||||
@@ -17771,29 +17826,32 @@ var ts;
|
||||
inferFromTypes(sourceType, target);
|
||||
}
|
||||
}
|
||||
else if (source.flags & 80896 /* ObjectType */ && (target.flags & (4096 /* Reference */ | 8192 /* Tuple */) ||
|
||||
(target.flags & 65536 /* Anonymous */) && target.symbol && target.symbol.flags & (8192 /* Method */ | 2048 /* TypeLiteral */ | 32 /* Class */))) {
|
||||
// If source is an object type, and target is a type reference, a tuple type, the type of a method, or a type literal, infer from members
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
else {
|
||||
source = getApparentType(source);
|
||||
if (source.flags & 80896 /* ObjectType */ && (target.flags & (4096 /* Reference */ | 8192 /* Tuple */) ||
|
||||
(target.flags & 65536 /* Anonymous */) && target.symbol && target.symbol.flags & (8192 /* Method */ | 2048 /* TypeLiteral */ | 32 /* Class */))) {
|
||||
// If source is an object type, and target is a type reference, a tuple type, the type of a method, or a type literal, infer from members
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0 /* Call */);
|
||||
inferFromSignatures(source, target, 1 /* Construct */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 0 /* String */);
|
||||
inferFromIndexTypes(source, target, 1 /* Number */, 1 /* Number */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 1 /* Number */);
|
||||
depth--;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0 /* Call */);
|
||||
inferFromSignatures(source, target, 1 /* Construct */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 0 /* String */);
|
||||
inferFromIndexTypes(source, target, 1 /* Number */, 1 /* Number */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 1 /* Number */);
|
||||
depth--;
|
||||
}
|
||||
}
|
||||
function inferFromProperties(source, target) {
|
||||
@@ -37768,8 +37826,8 @@ var ts;
|
||||
var pos = scanner.getStartPos();
|
||||
// Read leading trivia and token
|
||||
while (pos < endPos) {
|
||||
var t_2 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_2)) {
|
||||
var t_1 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_1)) {
|
||||
break;
|
||||
}
|
||||
// consume leading trivia
|
||||
@@ -37777,7 +37835,7 @@ var ts;
|
||||
var item = {
|
||||
pos: pos,
|
||||
end: scanner.getStartPos(),
|
||||
kind: t_2
|
||||
kind: t_1
|
||||
};
|
||||
pos = scanner.getStartPos();
|
||||
if (!leadingTrivia) {
|
||||
@@ -39359,6 +39417,8 @@ var ts;
|
||||
case 15 /* CloseBraceToken */:
|
||||
case 18 /* OpenBracketToken */:
|
||||
case 19 /* CloseBracketToken */:
|
||||
case 16 /* OpenParenToken */:
|
||||
case 17 /* CloseParenToken */:
|
||||
case 77 /* ElseKeyword */:
|
||||
case 101 /* WhileKeyword */:
|
||||
case 53 /* AtToken */:
|
||||
@@ -39483,7 +39543,7 @@ var ts;
|
||||
else if (tokenInfo.token.kind === listStartToken) {
|
||||
// consume list start token
|
||||
startLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line;
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1 /* Unknown */, parent, parentDynamicIndentation, startLine);
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1 /* Unknown */, parent, parentDynamicIndentation, parentStartLine);
|
||||
listDynamicIndentation = getDynamicIndentation(parent, parentStartLine, indentation_1.indentation, indentation_1.delta);
|
||||
consumeTokenAndAdvanceScanner(tokenInfo, parent, listDynamicIndentation);
|
||||
}
|
||||
@@ -41389,6 +41449,13 @@ var ts;
|
||||
// after incremental parsing nameTable might not be up-to-date
|
||||
// drop it so it can be lazily recreated later
|
||||
newSourceFile.nameTable = undefined;
|
||||
// dispose all resources held by old script snapshot
|
||||
if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
|
||||
if (sourceFile.scriptSnapshot.dispose) {
|
||||
sourceFile.scriptSnapshot.dispose();
|
||||
}
|
||||
sourceFile.scriptSnapshot = undefined;
|
||||
}
|
||||
return newSourceFile;
|
||||
}
|
||||
}
|
||||
@@ -42410,15 +42477,15 @@ var ts;
|
||||
}
|
||||
function tryGetGlobalSymbols() {
|
||||
var objectLikeContainer;
|
||||
var importClause;
|
||||
var namedImportsOrExports;
|
||||
var jsxContainer;
|
||||
if (objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken)) {
|
||||
return tryGetObjectLikeCompletionSymbols(objectLikeContainer);
|
||||
}
|
||||
if (importClause = ts.getAncestor(contextToken, 220 /* ImportClause */)) {
|
||||
if (namedImportsOrExports = tryGetNamedImportsOrExportsForCompletion(contextToken)) {
|
||||
// cursor is in an import clause
|
||||
// try to show exported member for imported module
|
||||
return tryGetImportClauseCompletionSymbols(importClause);
|
||||
return tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports);
|
||||
}
|
||||
if (jsxContainer = tryGetContainingJsxElement(contextToken)) {
|
||||
var attrsType;
|
||||
@@ -42426,7 +42493,7 @@ var ts;
|
||||
// Cursor is inside a JSX self-closing element or opening element
|
||||
attrsType = typeChecker.getJsxElementAttributesType(jsxContainer);
|
||||
if (attrsType) {
|
||||
symbols = filterJsxAttributes(jsxContainer.attributes, typeChecker.getPropertiesOfType(attrsType));
|
||||
symbols = filterJsxAttributes(typeChecker.getPropertiesOfType(attrsType), jsxContainer.attributes);
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
return true;
|
||||
@@ -42487,21 +42554,11 @@ var ts;
|
||||
function isCompletionListBlocker(contextToken) {
|
||||
var start = new Date().getTime();
|
||||
var result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) ||
|
||||
isIdentifierDefinitionLocation(contextToken) ||
|
||||
isSolelyIdentifierDefinitionLocation(contextToken) ||
|
||||
isDotOfNumericLiteral(contextToken);
|
||||
log("getCompletionsAtPosition: isCompletionListBlocker: " + (new Date().getTime() - start));
|
||||
return result;
|
||||
}
|
||||
function shouldShowCompletionsInImportsClause(node) {
|
||||
if (node) {
|
||||
// import {|
|
||||
// import {a,|
|
||||
if (node.kind === 14 /* OpenBraceToken */ || node.kind === 23 /* CommaToken */) {
|
||||
return node.parent.kind === 222 /* NamedImports */;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isNewIdentifierDefinitionLocation(previousToken) {
|
||||
if (previousToken) {
|
||||
var containingNodeKind = previousToken.parent.kind;
|
||||
@@ -42610,34 +42667,37 @@ var ts;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Aggregates relevant symbols for completion in import clauses; for instance,
|
||||
* Aggregates relevant symbols for completion in import clauses and export clauses
|
||||
* whose declarations have a module specifier; for instance, symbols will be aggregated for
|
||||
*
|
||||
* import { $ } from "moduleName";
|
||||
* import { | } from "moduleName";
|
||||
* export { a as foo, | } from "moduleName";
|
||||
*
|
||||
* but not for
|
||||
*
|
||||
* export { | };
|
||||
*
|
||||
* Relevant symbols are stored in the captured 'symbols' variable.
|
||||
*
|
||||
* @returns true if 'symbols' was successfully populated; false otherwise.
|
||||
*/
|
||||
function tryGetImportClauseCompletionSymbols(importClause) {
|
||||
// cursor is in import clause
|
||||
// try to show exported member for imported module
|
||||
if (shouldShowCompletionsInImportsClause(contextToken)) {
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var importDeclaration = importClause.parent;
|
||||
ts.Debug.assert(importDeclaration !== undefined && importDeclaration.kind === 219 /* ImportDeclaration */);
|
||||
var exports;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
//let exports = typeInfoResolver.getExportsOfImportDeclaration(importDeclaration);
|
||||
symbols = exports ? filterModuleExports(exports, importDeclaration) : emptyArray;
|
||||
function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports) {
|
||||
var declarationKind = namedImportsOrExports.kind === 222 /* NamedImports */ ?
|
||||
219 /* ImportDeclaration */ :
|
||||
225 /* ExportDeclaration */;
|
||||
var importOrExportDeclaration = ts.getAncestor(namedImportsOrExports, declarationKind);
|
||||
var moduleSpecifier = importOrExportDeclaration.moduleSpecifier;
|
||||
if (!moduleSpecifier) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
isMemberCompletion = false;
|
||||
isNewIdentifierLocation = true;
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var exports;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
symbols = exports ? filterNamedImportOrExportCompletionItems(exports, namedImportsOrExports.elements) : emptyArray;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
@@ -42658,6 +42718,24 @@ var ts;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
/**
|
||||
* Returns the containing list of named imports or exports of a context token,
|
||||
* on the condition that one exists and that the context implies completion should be given.
|
||||
*/
|
||||
function tryGetNamedImportsOrExportsForCompletion(contextToken) {
|
||||
if (contextToken) {
|
||||
switch (contextToken.kind) {
|
||||
case 14 /* OpenBraceToken */: // import { |
|
||||
case 23 /* CommaToken */:
|
||||
switch (contextToken.parent.kind) {
|
||||
case 222 /* NamedImports */:
|
||||
case 226 /* NamedExports */:
|
||||
return contextToken.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function tryGetContainingJsxElement(contextToken) {
|
||||
if (contextToken) {
|
||||
var parent_12 = contextToken.parent;
|
||||
@@ -42700,7 +42778,10 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isIdentifierDefinitionLocation(contextToken) {
|
||||
/**
|
||||
* @returns true if we are certain that the currently edited location must define a new location; false otherwise.
|
||||
*/
|
||||
function isSolelyIdentifierDefinitionLocation(contextToken) {
|
||||
var containingNodeKind = contextToken.parent.kind;
|
||||
switch (contextToken.kind) {
|
||||
case 23 /* CommaToken */:
|
||||
@@ -42746,6 +42827,10 @@ var ts;
|
||||
case 107 /* PrivateKeyword */:
|
||||
case 108 /* ProtectedKeyword */:
|
||||
return containingNodeKind === 135 /* Parameter */;
|
||||
case 113 /* AsKeyword */:
|
||||
containingNodeKind === 223 /* ImportSpecifier */ ||
|
||||
containingNodeKind === 227 /* ExportSpecifier */ ||
|
||||
containingNodeKind === 221 /* NamespaceImport */;
|
||||
case 70 /* ClassKeyword */:
|
||||
case 78 /* EnumKeyword */:
|
||||
case 104 /* InterfaceKeyword */:
|
||||
@@ -42782,27 +42867,37 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function filterModuleExports(exports, importDeclaration) {
|
||||
var exisingImports = {};
|
||||
if (!importDeclaration.importClause) {
|
||||
return exports;
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @param exportsOfModule The list of symbols which a module exposes.
|
||||
* @param namedImportsOrExports The list of existing import/export specifiers in the import/export clause.
|
||||
*
|
||||
* @returns Symbols to be suggested at an import/export clause, barring those whose named imports/exports
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterNamedImportOrExportCompletionItems(exportsOfModule, namedImportsOrExports) {
|
||||
var exisingImportsOrExports = {};
|
||||
for (var _i = 0; _i < namedImportsOrExports.length; _i++) {
|
||||
var element = namedImportsOrExports[_i];
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (element.getStart() <= position && position <= element.getEnd()) {
|
||||
continue;
|
||||
}
|
||||
var name_31 = element.propertyName || element.name;
|
||||
exisingImportsOrExports[name_31.text] = true;
|
||||
}
|
||||
if (importDeclaration.importClause.namedBindings &&
|
||||
importDeclaration.importClause.namedBindings.kind === 222 /* NamedImports */) {
|
||||
ts.forEach(importDeclaration.importClause.namedBindings.elements, function (el) {
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (el.getStart() <= position && position <= el.getEnd()) {
|
||||
return;
|
||||
}
|
||||
var name = el.propertyName || el.name;
|
||||
exisingImports[name.text] = true;
|
||||
});
|
||||
if (ts.isEmpty(exisingImportsOrExports)) {
|
||||
return exportsOfModule;
|
||||
}
|
||||
if (ts.isEmpty(exisingImports)) {
|
||||
return exports;
|
||||
}
|
||||
return ts.filter(exports, function (e) { return !ts.lookUp(exisingImports, e.name); });
|
||||
return ts.filter(exportsOfModule, function (e) { return !ts.lookUp(exisingImportsOrExports, e.name); });
|
||||
}
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @returns Symbols to be suggested in an object binding pattern or object literal expression, barring those whose declarations
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterObjectMembersList(contextualMemberSymbols, existingMembers) {
|
||||
if (!existingMembers || existingMembers.length === 0) {
|
||||
return contextualMemberSymbols;
|
||||
@@ -42832,15 +42927,15 @@ var ts;
|
||||
}
|
||||
existingMemberNames[existingName] = true;
|
||||
}
|
||||
var filteredMembers = [];
|
||||
ts.forEach(contextualMemberSymbols, function (s) {
|
||||
if (!existingMemberNames[s.name]) {
|
||||
filteredMembers.push(s);
|
||||
}
|
||||
});
|
||||
return filteredMembers;
|
||||
return ts.filter(contextualMemberSymbols, function (m) { return !ts.lookUp(existingMemberNames, m.name); });
|
||||
}
|
||||
function filterJsxAttributes(attributes, symbols) {
|
||||
/**
|
||||
* Filters out completion suggestions from 'symbols' according to existing JSX attributes.
|
||||
*
|
||||
* @returns Symbols to be suggested in a JSX element, barring those whose attributes
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterJsxAttributes(symbols, attributes) {
|
||||
var seenNames = {};
|
||||
for (var _i = 0; _i < attributes.length; _i++) {
|
||||
var attr = attributes[_i];
|
||||
@@ -42852,14 +42947,7 @@ var ts;
|
||||
seenNames[attr.name.text] = true;
|
||||
}
|
||||
}
|
||||
var result = [];
|
||||
for (var _a = 0; _a < symbols.length; _a++) {
|
||||
var sym = symbols[_a];
|
||||
if (!seenNames[sym.name]) {
|
||||
result.push(sym);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return ts.filter(symbols, function (a) { return !ts.lookUp(seenNames, a.name); });
|
||||
}
|
||||
}
|
||||
function getCompletionsAtPosition(fileName, position) {
|
||||
@@ -42892,10 +42980,10 @@ var ts;
|
||||
for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
|
||||
var sourceFile = _a[_i];
|
||||
var nameTable = getNameTable(sourceFile);
|
||||
for (var name_31 in nameTable) {
|
||||
if (!allNames[name_31]) {
|
||||
allNames[name_31] = name_31;
|
||||
var displayName = getCompletionEntryDisplayName(name_31, target, true);
|
||||
for (var name_32 in nameTable) {
|
||||
if (!allNames[name_32]) {
|
||||
allNames[name_32] = name_32;
|
||||
var displayName = getCompletionEntryDisplayName(name_32, target, true);
|
||||
if (displayName) {
|
||||
var entry = {
|
||||
name: displayName,
|
||||
@@ -43764,6 +43852,7 @@ var ts;
|
||||
if (hasKind(node.parent, 142 /* GetAccessor */) || hasKind(node.parent, 143 /* SetAccessor */)) {
|
||||
return getGetAndSetOccurrences(node.parent);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (ts.isModifier(node.kind) && node.parent &&
|
||||
(ts.isDeclaration(node.parent) || node.parent.kind === 190 /* VariableStatement */)) {
|
||||
@@ -43879,12 +43968,13 @@ var ts;
|
||||
// Make sure we only highlight the keyword when it makes sense to do so.
|
||||
if (ts.isAccessibilityModifier(modifier)) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ ||
|
||||
container.kind === 183 /* ClassExpression */ ||
|
||||
(declaration.kind === 135 /* Parameter */ && hasKind(container, 141 /* Constructor */)))) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 110 /* StaticKeyword */) {
|
||||
if (container.kind !== 211 /* ClassDeclaration */) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ || container.kind === 183 /* ClassExpression */)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
@@ -43893,6 +43983,11 @@ var ts;
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 112 /* AbstractKeyword */) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ || declaration.kind === 211 /* ClassDeclaration */)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// unsupported modifier
|
||||
return undefined;
|
||||
@@ -43903,12 +43998,19 @@ var ts;
|
||||
switch (container.kind) {
|
||||
case 216 /* ModuleBlock */:
|
||||
case 245 /* SourceFile */:
|
||||
nodes = container.statements;
|
||||
// Container is either a class declaration or the declaration is a classDeclaration
|
||||
if (modifierFlag & 256 /* Abstract */) {
|
||||
nodes = declaration.members.concat(declaration);
|
||||
}
|
||||
else {
|
||||
nodes = container.statements;
|
||||
}
|
||||
break;
|
||||
case 141 /* Constructor */:
|
||||
nodes = container.parameters.concat(container.parent.members);
|
||||
break;
|
||||
case 211 /* ClassDeclaration */:
|
||||
case 183 /* ClassExpression */:
|
||||
nodes = container.members;
|
||||
// If we're an accessibility modifier, we're in an instance member and should search
|
||||
// the constructor's parameter list for instance members as well.
|
||||
@@ -43920,6 +44022,9 @@ var ts;
|
||||
nodes = nodes.concat(constructor.parameters);
|
||||
}
|
||||
}
|
||||
else if (modifierFlag & 256 /* Abstract */) {
|
||||
nodes = nodes.concat(container);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ts.Debug.fail("Invalid container kind.");
|
||||
@@ -43944,6 +44049,8 @@ var ts;
|
||||
return 1 /* Export */;
|
||||
case 119 /* DeclareKeyword */:
|
||||
return 2 /* Ambient */;
|
||||
case 112 /* AbstractKeyword */:
|
||||
return 256 /* Abstract */;
|
||||
default:
|
||||
ts.Debug.fail();
|
||||
}
|
||||
@@ -44761,19 +44868,19 @@ var ts;
|
||||
if (isNameOfPropertyAssignment(node)) {
|
||||
var objectLiteral = node.parent.parent;
|
||||
var contextualType = typeChecker.getContextualType(objectLiteral);
|
||||
var name_32 = node.text;
|
||||
var name_33 = node.text;
|
||||
if (contextualType) {
|
||||
if (contextualType.flags & 16384 /* Union */) {
|
||||
// This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types)
|
||||
// if not, search the constituent types for the property
|
||||
var unionProperty = contextualType.getProperty(name_32);
|
||||
var unionProperty = contextualType.getProperty(name_33);
|
||||
if (unionProperty) {
|
||||
return [unionProperty];
|
||||
}
|
||||
else {
|
||||
var result_4 = [];
|
||||
ts.forEach(contextualType.types, function (t) {
|
||||
var symbol = t.getProperty(name_32);
|
||||
var symbol = t.getProperty(name_33);
|
||||
if (symbol) {
|
||||
result_4.push(symbol);
|
||||
}
|
||||
@@ -44782,7 +44889,7 @@ var ts;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var symbol_1 = contextualType.getProperty(name_32);
|
||||
var symbol_1 = contextualType.getProperty(name_33);
|
||||
if (symbol_1) {
|
||||
return [symbol_1];
|
||||
}
|
||||
@@ -45464,7 +45571,7 @@ var ts;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return 9 /* text */;
|
||||
return 2 /* identifier */;
|
||||
}
|
||||
}
|
||||
function processElement(element) {
|
||||
@@ -46760,6 +46867,13 @@ var ts;
|
||||
var decoded = JSON.parse(encoded);
|
||||
return ts.createTextChangeRange(ts.createTextSpan(decoded.span.start, decoded.span.length), decoded.newLength);
|
||||
};
|
||||
ScriptSnapshotShimAdapter.prototype.dispose = function () {
|
||||
// if scriptSnapshotShim is a COM object then property check becomes method call with no arguments
|
||||
// 'in' does not have this effect
|
||||
if ("dispose" in this.scriptSnapshotShim) {
|
||||
this.scriptSnapshotShim.dispose();
|
||||
}
|
||||
};
|
||||
return ScriptSnapshotShimAdapter;
|
||||
})();
|
||||
var LanguageServiceShimHostAdapter = (function () {
|
||||
|
||||
Vendored
+2
@@ -1591,6 +1591,8 @@ declare namespace ts {
|
||||
* not happen and the entire document will be re - parsed.
|
||||
*/
|
||||
getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange;
|
||||
/** Releases all resources held by this script snapshot */
|
||||
dispose?(): void;
|
||||
}
|
||||
module ScriptSnapshot {
|
||||
function fromString(text: string): IScriptSnapshot;
|
||||
|
||||
+243
-129
@@ -1775,8 +1775,15 @@ var ts;
|
||||
newLine: _os.EOL,
|
||||
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
|
||||
write: function (s) {
|
||||
var buffer = new Buffer(s, 'utf8');
|
||||
var offset = 0;
|
||||
var toWrite = buffer.length;
|
||||
var written = 0;
|
||||
// 1 is a standard descriptor for stdout
|
||||
_fs.writeSync(1, s);
|
||||
while ((written = _fs.writeSync(1, buffer, offset, toWrite)) < toWrite) {
|
||||
offset += written;
|
||||
toWrite -= written;
|
||||
}
|
||||
},
|
||||
readFile: readFile,
|
||||
writeFile: writeFile,
|
||||
@@ -2247,7 +2254,7 @@ var ts;
|
||||
Classes_containing_abstract_methods_must_be_marked_abstract: { code: 2514, category: ts.DiagnosticCategory.Error, key: "Classes containing abstract methods must be marked abstract." },
|
||||
Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2: { code: 2515, category: ts.DiagnosticCategory.Error, key: "Non-abstract class '{0}' does not implement inherited abstract member '{1}' from class '{2}'." },
|
||||
All_declarations_of_an_abstract_method_must_be_consecutive: { code: 2516, category: ts.DiagnosticCategory.Error, key: "All declarations of an abstract method must be consecutive." },
|
||||
Constructor_objects_of_abstract_type_cannot_be_assigned_to_constructor_objects_of_non_abstract_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Constructor objects of abstract type cannot be assigned to constructor objects of non-abstract type" },
|
||||
Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type: { code: 2517, category: ts.DiagnosticCategory.Error, key: "Cannot assign an abstract constructor type to a non-abstract constructor type." },
|
||||
Only_an_ambient_class_can_be_merged_with_an_interface: { code: 2518, category: ts.DiagnosticCategory.Error, key: "Only an ambient class can be merged with an interface." },
|
||||
Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions: { code: 2520, category: ts.DiagnosticCategory.Error, key: "Duplicate identifier '{0}'. Compiler uses declaration '{1}' to support async functions." },
|
||||
Expression_resolves_to_variable_declaration_0_that_compiler_uses_to_support_async_functions: { code: 2521, category: ts.DiagnosticCategory.Error, key: "Expression resolves to variable declaration '{0}' that compiler uses to support async functions." },
|
||||
@@ -11517,7 +11524,11 @@ var ts;
|
||||
}
|
||||
else {
|
||||
node.exportClause = parseNamedImportsOrExports(226 /* NamedExports */);
|
||||
if (parseOptional(130 /* FromKeyword */)) {
|
||||
// It is not uncommon to accidentally omit the 'from' keyword. Additionally, in editing scenarios,
|
||||
// the 'from' keyword can be parsed as a named export when the export clause is unterminated (i.e. `export { from "moduleName";`)
|
||||
// If we don't have a 'from' keyword, see if we have a string literal such that ASI won't take effect.
|
||||
if (token === 130 /* FromKeyword */ || (token === 8 /* StringLiteral */ && !scanner.hasPrecedingLineBreak())) {
|
||||
parseExpected(130 /* FromKeyword */);
|
||||
node.moduleSpecifier = parseModuleSpecifier();
|
||||
}
|
||||
}
|
||||
@@ -16299,7 +16310,7 @@ var ts;
|
||||
var id = getTypeListId(elementTypes);
|
||||
var type = tupleTypes[id];
|
||||
if (!type) {
|
||||
type = tupleTypes[id] = createObjectType(8192 /* Tuple */);
|
||||
type = tupleTypes[id] = createObjectType(8192 /* Tuple */ | getWideningFlagsOfTypes(elementTypes));
|
||||
type.elementTypes = elementTypes;
|
||||
}
|
||||
return type;
|
||||
@@ -17200,10 +17211,33 @@ var ts;
|
||||
var targetSignatures = getSignaturesOfType(target, kind);
|
||||
var result = -1 /* True */;
|
||||
var saveErrorInfo = errorInfo;
|
||||
// Because the "abstractness" of a class is the same across all construct signatures
|
||||
// (internally we are checking the corresponding declaration), it is enough to perform
|
||||
// the check and report an error once over all pairs of source and target construct signatures.
|
||||
var sourceSig = sourceSignatures[0];
|
||||
// Note that in an extends-clause, targetSignatures is stripped, so the check never proceeds.
|
||||
var targetSig = targetSignatures[0];
|
||||
if (sourceSig && targetSig) {
|
||||
var sourceErasedSignature = getErasedSignature(sourceSig);
|
||||
var targetErasedSignature = getErasedSignature(targetSig);
|
||||
var sourceReturnType = sourceErasedSignature && getReturnTypeOfSignature(sourceErasedSignature);
|
||||
var targetReturnType = targetErasedSignature && getReturnTypeOfSignature(targetErasedSignature);
|
||||
var sourceReturnDecl = sourceReturnType && sourceReturnType.symbol && ts.getDeclarationOfKind(sourceReturnType.symbol, 211 /* ClassDeclaration */);
|
||||
var targetReturnDecl = targetReturnType && targetReturnType.symbol && ts.getDeclarationOfKind(targetReturnType.symbol, 211 /* ClassDeclaration */);
|
||||
var sourceIsAbstract = sourceReturnDecl && sourceReturnDecl.flags & 256 /* Abstract */;
|
||||
var targetIsAbstract = targetReturnDecl && targetReturnDecl.flags & 256 /* Abstract */;
|
||||
if (sourceIsAbstract && !targetIsAbstract) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
|
||||
}
|
||||
return 0 /* False */;
|
||||
}
|
||||
}
|
||||
outer: for (var _i = 0; _i < targetSignatures.length; _i++) {
|
||||
var t = targetSignatures[_i];
|
||||
if (!t.hasStringLiterals || target.flags & 262144 /* FromSignature */) {
|
||||
var localErrors = reportErrors;
|
||||
var checkedAbstractAssignability = false;
|
||||
for (var _a = 0; _a < sourceSignatures.length; _a++) {
|
||||
var s = sourceSignatures[_a];
|
||||
if (!s.hasStringLiterals || source.flags & 262144 /* FromSignature */) {
|
||||
@@ -17254,12 +17288,12 @@ var ts;
|
||||
target = getErasedSignature(target);
|
||||
var result = -1 /* True */;
|
||||
for (var i = 0; i < checkCount; i++) {
|
||||
var s_1 = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t_1 = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var s = i < sourceMax ? getTypeOfSymbol(source.parameters[i]) : getRestTypeOfSignature(source);
|
||||
var t = i < targetMax ? getTypeOfSymbol(target.parameters[i]) : getRestTypeOfSignature(target);
|
||||
var saveErrorInfo = errorInfo;
|
||||
var related = isRelatedTo(s_1, t_1, reportErrors);
|
||||
var related = isRelatedTo(s, t, reportErrors);
|
||||
if (!related) {
|
||||
related = isRelatedTo(t_1, s_1, false);
|
||||
related = isRelatedTo(t, s, false);
|
||||
if (!related) {
|
||||
if (reportErrors) {
|
||||
reportError(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, source.parameters[i < sourceMax ? i : sourceMax].name, target.parameters[i < targetMax ? i : targetMax].name);
|
||||
@@ -17297,11 +17331,11 @@ var ts;
|
||||
}
|
||||
return 0 /* False */;
|
||||
}
|
||||
var t = getReturnTypeOfSignature(target);
|
||||
if (t === voidType)
|
||||
var targetReturnType = getReturnTypeOfSignature(target);
|
||||
if (targetReturnType === voidType)
|
||||
return result;
|
||||
var s = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(s, t, reportErrors);
|
||||
var sourceReturnType = getReturnTypeOfSignature(source);
|
||||
return result & isRelatedTo(sourceReturnType, targetReturnType, reportErrors);
|
||||
}
|
||||
function signaturesIdenticalTo(source, target, kind) {
|
||||
var sourceSignatures = getSignaturesOfType(source, kind);
|
||||
@@ -17537,7 +17571,7 @@ var ts;
|
||||
* Prefer using isTupleLikeType() unless the use of `elementTypes` is required.
|
||||
*/
|
||||
function isTupleType(type) {
|
||||
return (type.flags & 8192 /* Tuple */) && !!type.elementTypes;
|
||||
return !!(type.flags & 8192 /* Tuple */);
|
||||
}
|
||||
function getWidenedTypeOfObjectLiteral(type) {
|
||||
var properties = getPropertiesOfObjectType(type);
|
||||
@@ -17579,25 +17613,47 @@ var ts;
|
||||
if (isArrayType(type)) {
|
||||
return createArrayType(getWidenedType(type.typeArguments[0]));
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
return createTupleType(ts.map(type.elementTypes, getWidenedType));
|
||||
}
|
||||
}
|
||||
return type;
|
||||
}
|
||||
/**
|
||||
* Reports implicit any errors that occur as a result of widening 'null' and 'undefined'
|
||||
* to 'any'. A call to reportWideningErrorsInType is normally accompanied by a call to
|
||||
* getWidenedType. But in some cases getWidenedType is called without reporting errors
|
||||
* (type argument inference is an example).
|
||||
*
|
||||
* The return value indicates whether an error was in fact reported. The particular circumstances
|
||||
* are on a best effort basis. Currently, if the null or undefined that causes widening is inside
|
||||
* an object literal property (arbitrarily deeply), this function reports an error. If no error is
|
||||
* reported, reportImplicitAnyError is a suitable fallback to report a general error.
|
||||
*/
|
||||
function reportWideningErrorsInType(type) {
|
||||
var errorReported = false;
|
||||
if (type.flags & 16384 /* Union */) {
|
||||
var errorReported = false;
|
||||
ts.forEach(type.types, function (t) {
|
||||
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
||||
var t = _a[_i];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
if (isArrayType(type)) {
|
||||
return reportWideningErrorsInType(type.typeArguments[0]);
|
||||
}
|
||||
if (isTupleType(type)) {
|
||||
for (var _b = 0, _c = type.elementTypes; _b < _c.length; _b++) {
|
||||
var t = _c[_b];
|
||||
if (reportWideningErrorsInType(t)) {
|
||||
errorReported = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (type.flags & 524288 /* ObjectLiteral */) {
|
||||
var errorReported = false;
|
||||
ts.forEach(getPropertiesOfObjectType(type), function (p) {
|
||||
for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
|
||||
var p = _e[_d];
|
||||
var t = getTypeOfSymbol(p);
|
||||
if (t.flags & 1048576 /* ContainsUndefinedOrNull */) {
|
||||
if (!reportWideningErrorsInType(t)) {
|
||||
@@ -17605,10 +17661,9 @@ var ts;
|
||||
}
|
||||
errorReported = true;
|
||||
}
|
||||
});
|
||||
return errorReported;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
return errorReported;
|
||||
}
|
||||
function reportImplicitAnyError(declaration, type) {
|
||||
var typeAsString = typeToString(getWidenedType(type));
|
||||
@@ -17771,29 +17826,32 @@ var ts;
|
||||
inferFromTypes(sourceType, target);
|
||||
}
|
||||
}
|
||||
else if (source.flags & 80896 /* ObjectType */ && (target.flags & (4096 /* Reference */ | 8192 /* Tuple */) ||
|
||||
(target.flags & 65536 /* Anonymous */) && target.symbol && target.symbol.flags & (8192 /* Method */ | 2048 /* TypeLiteral */ | 32 /* Class */))) {
|
||||
// If source is an object type, and target is a type reference, a tuple type, the type of a method, or a type literal, infer from members
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
else {
|
||||
source = getApparentType(source);
|
||||
if (source.flags & 80896 /* ObjectType */ && (target.flags & (4096 /* Reference */ | 8192 /* Tuple */) ||
|
||||
(target.flags & 65536 /* Anonymous */) && target.symbol && target.symbol.flags & (8192 /* Method */ | 2048 /* TypeLiteral */ | 32 /* Class */))) {
|
||||
// If source is an object type, and target is a type reference, a tuple type, the type of a method, or a type literal, infer from members
|
||||
if (isInProcess(source, target)) {
|
||||
return;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0 /* Call */);
|
||||
inferFromSignatures(source, target, 1 /* Construct */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 0 /* String */);
|
||||
inferFromIndexTypes(source, target, 1 /* Number */, 1 /* Number */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 1 /* Number */);
|
||||
depth--;
|
||||
}
|
||||
if (isDeeplyNestedGeneric(source, sourceStack, depth) && isDeeplyNestedGeneric(target, targetStack, depth)) {
|
||||
return;
|
||||
}
|
||||
if (depth === 0) {
|
||||
sourceStack = [];
|
||||
targetStack = [];
|
||||
}
|
||||
sourceStack[depth] = source;
|
||||
targetStack[depth] = target;
|
||||
depth++;
|
||||
inferFromProperties(source, target);
|
||||
inferFromSignatures(source, target, 0 /* Call */);
|
||||
inferFromSignatures(source, target, 1 /* Construct */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 0 /* String */);
|
||||
inferFromIndexTypes(source, target, 1 /* Number */, 1 /* Number */);
|
||||
inferFromIndexTypes(source, target, 0 /* String */, 1 /* Number */);
|
||||
depth--;
|
||||
}
|
||||
}
|
||||
function inferFromProperties(source, target) {
|
||||
@@ -37768,8 +37826,8 @@ var ts;
|
||||
var pos = scanner.getStartPos();
|
||||
// Read leading trivia and token
|
||||
while (pos < endPos) {
|
||||
var t_2 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_2)) {
|
||||
var t_1 = scanner.getToken();
|
||||
if (!ts.isTrivia(t_1)) {
|
||||
break;
|
||||
}
|
||||
// consume leading trivia
|
||||
@@ -37777,7 +37835,7 @@ var ts;
|
||||
var item = {
|
||||
pos: pos,
|
||||
end: scanner.getStartPos(),
|
||||
kind: t_2
|
||||
kind: t_1
|
||||
};
|
||||
pos = scanner.getStartPos();
|
||||
if (!leadingTrivia) {
|
||||
@@ -39359,6 +39417,8 @@ var ts;
|
||||
case 15 /* CloseBraceToken */:
|
||||
case 18 /* OpenBracketToken */:
|
||||
case 19 /* CloseBracketToken */:
|
||||
case 16 /* OpenParenToken */:
|
||||
case 17 /* CloseParenToken */:
|
||||
case 77 /* ElseKeyword */:
|
||||
case 101 /* WhileKeyword */:
|
||||
case 53 /* AtToken */:
|
||||
@@ -39483,7 +39543,7 @@ var ts;
|
||||
else if (tokenInfo.token.kind === listStartToken) {
|
||||
// consume list start token
|
||||
startLine = sourceFile.getLineAndCharacterOfPosition(tokenInfo.token.pos).line;
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1 /* Unknown */, parent, parentDynamicIndentation, startLine);
|
||||
var indentation_1 = computeIndentation(tokenInfo.token, startLine, -1 /* Unknown */, parent, parentDynamicIndentation, parentStartLine);
|
||||
listDynamicIndentation = getDynamicIndentation(parent, parentStartLine, indentation_1.indentation, indentation_1.delta);
|
||||
consumeTokenAndAdvanceScanner(tokenInfo, parent, listDynamicIndentation);
|
||||
}
|
||||
@@ -41389,6 +41449,13 @@ var ts;
|
||||
// after incremental parsing nameTable might not be up-to-date
|
||||
// drop it so it can be lazily recreated later
|
||||
newSourceFile.nameTable = undefined;
|
||||
// dispose all resources held by old script snapshot
|
||||
if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
|
||||
if (sourceFile.scriptSnapshot.dispose) {
|
||||
sourceFile.scriptSnapshot.dispose();
|
||||
}
|
||||
sourceFile.scriptSnapshot = undefined;
|
||||
}
|
||||
return newSourceFile;
|
||||
}
|
||||
}
|
||||
@@ -42410,15 +42477,15 @@ var ts;
|
||||
}
|
||||
function tryGetGlobalSymbols() {
|
||||
var objectLikeContainer;
|
||||
var importClause;
|
||||
var namedImportsOrExports;
|
||||
var jsxContainer;
|
||||
if (objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken)) {
|
||||
return tryGetObjectLikeCompletionSymbols(objectLikeContainer);
|
||||
}
|
||||
if (importClause = ts.getAncestor(contextToken, 220 /* ImportClause */)) {
|
||||
if (namedImportsOrExports = tryGetNamedImportsOrExportsForCompletion(contextToken)) {
|
||||
// cursor is in an import clause
|
||||
// try to show exported member for imported module
|
||||
return tryGetImportClauseCompletionSymbols(importClause);
|
||||
return tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports);
|
||||
}
|
||||
if (jsxContainer = tryGetContainingJsxElement(contextToken)) {
|
||||
var attrsType;
|
||||
@@ -42426,7 +42493,7 @@ var ts;
|
||||
// Cursor is inside a JSX self-closing element or opening element
|
||||
attrsType = typeChecker.getJsxElementAttributesType(jsxContainer);
|
||||
if (attrsType) {
|
||||
symbols = filterJsxAttributes(jsxContainer.attributes, typeChecker.getPropertiesOfType(attrsType));
|
||||
symbols = filterJsxAttributes(typeChecker.getPropertiesOfType(attrsType), jsxContainer.attributes);
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
return true;
|
||||
@@ -42487,21 +42554,11 @@ var ts;
|
||||
function isCompletionListBlocker(contextToken) {
|
||||
var start = new Date().getTime();
|
||||
var result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) ||
|
||||
isIdentifierDefinitionLocation(contextToken) ||
|
||||
isSolelyIdentifierDefinitionLocation(contextToken) ||
|
||||
isDotOfNumericLiteral(contextToken);
|
||||
log("getCompletionsAtPosition: isCompletionListBlocker: " + (new Date().getTime() - start));
|
||||
return result;
|
||||
}
|
||||
function shouldShowCompletionsInImportsClause(node) {
|
||||
if (node) {
|
||||
// import {|
|
||||
// import {a,|
|
||||
if (node.kind === 14 /* OpenBraceToken */ || node.kind === 23 /* CommaToken */) {
|
||||
return node.parent.kind === 222 /* NamedImports */;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isNewIdentifierDefinitionLocation(previousToken) {
|
||||
if (previousToken) {
|
||||
var containingNodeKind = previousToken.parent.kind;
|
||||
@@ -42610,34 +42667,37 @@ var ts;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
* Aggregates relevant symbols for completion in import clauses; for instance,
|
||||
* Aggregates relevant symbols for completion in import clauses and export clauses
|
||||
* whose declarations have a module specifier; for instance, symbols will be aggregated for
|
||||
*
|
||||
* import { $ } from "moduleName";
|
||||
* import { | } from "moduleName";
|
||||
* export { a as foo, | } from "moduleName";
|
||||
*
|
||||
* but not for
|
||||
*
|
||||
* export { | };
|
||||
*
|
||||
* Relevant symbols are stored in the captured 'symbols' variable.
|
||||
*
|
||||
* @returns true if 'symbols' was successfully populated; false otherwise.
|
||||
*/
|
||||
function tryGetImportClauseCompletionSymbols(importClause) {
|
||||
// cursor is in import clause
|
||||
// try to show exported member for imported module
|
||||
if (shouldShowCompletionsInImportsClause(contextToken)) {
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var importDeclaration = importClause.parent;
|
||||
ts.Debug.assert(importDeclaration !== undefined && importDeclaration.kind === 219 /* ImportDeclaration */);
|
||||
var exports;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
//let exports = typeInfoResolver.getExportsOfImportDeclaration(importDeclaration);
|
||||
symbols = exports ? filterModuleExports(exports, importDeclaration) : emptyArray;
|
||||
function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports) {
|
||||
var declarationKind = namedImportsOrExports.kind === 222 /* NamedImports */ ?
|
||||
219 /* ImportDeclaration */ :
|
||||
225 /* ExportDeclaration */;
|
||||
var importOrExportDeclaration = ts.getAncestor(namedImportsOrExports, declarationKind);
|
||||
var moduleSpecifier = importOrExportDeclaration.moduleSpecifier;
|
||||
if (!moduleSpecifier) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
isMemberCompletion = false;
|
||||
isNewIdentifierLocation = true;
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
var exports;
|
||||
var moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
symbols = exports ? filterNamedImportOrExportCompletionItems(exports, namedImportsOrExports.elements) : emptyArray;
|
||||
return true;
|
||||
}
|
||||
/**
|
||||
@@ -42658,6 +42718,24 @@ var ts;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
/**
|
||||
* Returns the containing list of named imports or exports of a context token,
|
||||
* on the condition that one exists and that the context implies completion should be given.
|
||||
*/
|
||||
function tryGetNamedImportsOrExportsForCompletion(contextToken) {
|
||||
if (contextToken) {
|
||||
switch (contextToken.kind) {
|
||||
case 14 /* OpenBraceToken */: // import { |
|
||||
case 23 /* CommaToken */:
|
||||
switch (contextToken.parent.kind) {
|
||||
case 222 /* NamedImports */:
|
||||
case 226 /* NamedExports */:
|
||||
return contextToken.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
function tryGetContainingJsxElement(contextToken) {
|
||||
if (contextToken) {
|
||||
var parent_12 = contextToken.parent;
|
||||
@@ -42700,7 +42778,10 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function isIdentifierDefinitionLocation(contextToken) {
|
||||
/**
|
||||
* @returns true if we are certain that the currently edited location must define a new location; false otherwise.
|
||||
*/
|
||||
function isSolelyIdentifierDefinitionLocation(contextToken) {
|
||||
var containingNodeKind = contextToken.parent.kind;
|
||||
switch (contextToken.kind) {
|
||||
case 23 /* CommaToken */:
|
||||
@@ -42746,6 +42827,10 @@ var ts;
|
||||
case 107 /* PrivateKeyword */:
|
||||
case 108 /* ProtectedKeyword */:
|
||||
return containingNodeKind === 135 /* Parameter */;
|
||||
case 113 /* AsKeyword */:
|
||||
containingNodeKind === 223 /* ImportSpecifier */ ||
|
||||
containingNodeKind === 227 /* ExportSpecifier */ ||
|
||||
containingNodeKind === 221 /* NamespaceImport */;
|
||||
case 70 /* ClassKeyword */:
|
||||
case 78 /* EnumKeyword */:
|
||||
case 104 /* InterfaceKeyword */:
|
||||
@@ -42782,27 +42867,37 @@ var ts;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function filterModuleExports(exports, importDeclaration) {
|
||||
var exisingImports = {};
|
||||
if (!importDeclaration.importClause) {
|
||||
return exports;
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @param exportsOfModule The list of symbols which a module exposes.
|
||||
* @param namedImportsOrExports The list of existing import/export specifiers in the import/export clause.
|
||||
*
|
||||
* @returns Symbols to be suggested at an import/export clause, barring those whose named imports/exports
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterNamedImportOrExportCompletionItems(exportsOfModule, namedImportsOrExports) {
|
||||
var exisingImportsOrExports = {};
|
||||
for (var _i = 0; _i < namedImportsOrExports.length; _i++) {
|
||||
var element = namedImportsOrExports[_i];
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (element.getStart() <= position && position <= element.getEnd()) {
|
||||
continue;
|
||||
}
|
||||
var name_31 = element.propertyName || element.name;
|
||||
exisingImportsOrExports[name_31.text] = true;
|
||||
}
|
||||
if (importDeclaration.importClause.namedBindings &&
|
||||
importDeclaration.importClause.namedBindings.kind === 222 /* NamedImports */) {
|
||||
ts.forEach(importDeclaration.importClause.namedBindings.elements, function (el) {
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (el.getStart() <= position && position <= el.getEnd()) {
|
||||
return;
|
||||
}
|
||||
var name = el.propertyName || el.name;
|
||||
exisingImports[name.text] = true;
|
||||
});
|
||||
if (ts.isEmpty(exisingImportsOrExports)) {
|
||||
return exportsOfModule;
|
||||
}
|
||||
if (ts.isEmpty(exisingImports)) {
|
||||
return exports;
|
||||
}
|
||||
return ts.filter(exports, function (e) { return !ts.lookUp(exisingImports, e.name); });
|
||||
return ts.filter(exportsOfModule, function (e) { return !ts.lookUp(exisingImportsOrExports, e.name); });
|
||||
}
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @returns Symbols to be suggested in an object binding pattern or object literal expression, barring those whose declarations
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterObjectMembersList(contextualMemberSymbols, existingMembers) {
|
||||
if (!existingMembers || existingMembers.length === 0) {
|
||||
return contextualMemberSymbols;
|
||||
@@ -42832,15 +42927,15 @@ var ts;
|
||||
}
|
||||
existingMemberNames[existingName] = true;
|
||||
}
|
||||
var filteredMembers = [];
|
||||
ts.forEach(contextualMemberSymbols, function (s) {
|
||||
if (!existingMemberNames[s.name]) {
|
||||
filteredMembers.push(s);
|
||||
}
|
||||
});
|
||||
return filteredMembers;
|
||||
return ts.filter(contextualMemberSymbols, function (m) { return !ts.lookUp(existingMemberNames, m.name); });
|
||||
}
|
||||
function filterJsxAttributes(attributes, symbols) {
|
||||
/**
|
||||
* Filters out completion suggestions from 'symbols' according to existing JSX attributes.
|
||||
*
|
||||
* @returns Symbols to be suggested in a JSX element, barring those whose attributes
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterJsxAttributes(symbols, attributes) {
|
||||
var seenNames = {};
|
||||
for (var _i = 0; _i < attributes.length; _i++) {
|
||||
var attr = attributes[_i];
|
||||
@@ -42852,14 +42947,7 @@ var ts;
|
||||
seenNames[attr.name.text] = true;
|
||||
}
|
||||
}
|
||||
var result = [];
|
||||
for (var _a = 0; _a < symbols.length; _a++) {
|
||||
var sym = symbols[_a];
|
||||
if (!seenNames[sym.name]) {
|
||||
result.push(sym);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return ts.filter(symbols, function (a) { return !ts.lookUp(seenNames, a.name); });
|
||||
}
|
||||
}
|
||||
function getCompletionsAtPosition(fileName, position) {
|
||||
@@ -42892,10 +42980,10 @@ var ts;
|
||||
for (var _i = 0, _a = program.getSourceFiles(); _i < _a.length; _i++) {
|
||||
var sourceFile = _a[_i];
|
||||
var nameTable = getNameTable(sourceFile);
|
||||
for (var name_31 in nameTable) {
|
||||
if (!allNames[name_31]) {
|
||||
allNames[name_31] = name_31;
|
||||
var displayName = getCompletionEntryDisplayName(name_31, target, true);
|
||||
for (var name_32 in nameTable) {
|
||||
if (!allNames[name_32]) {
|
||||
allNames[name_32] = name_32;
|
||||
var displayName = getCompletionEntryDisplayName(name_32, target, true);
|
||||
if (displayName) {
|
||||
var entry = {
|
||||
name: displayName,
|
||||
@@ -43764,6 +43852,7 @@ var ts;
|
||||
if (hasKind(node.parent, 142 /* GetAccessor */) || hasKind(node.parent, 143 /* SetAccessor */)) {
|
||||
return getGetAndSetOccurrences(node.parent);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (ts.isModifier(node.kind) && node.parent &&
|
||||
(ts.isDeclaration(node.parent) || node.parent.kind === 190 /* VariableStatement */)) {
|
||||
@@ -43879,12 +43968,13 @@ var ts;
|
||||
// Make sure we only highlight the keyword when it makes sense to do so.
|
||||
if (ts.isAccessibilityModifier(modifier)) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ ||
|
||||
container.kind === 183 /* ClassExpression */ ||
|
||||
(declaration.kind === 135 /* Parameter */ && hasKind(container, 141 /* Constructor */)))) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 110 /* StaticKeyword */) {
|
||||
if (container.kind !== 211 /* ClassDeclaration */) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ || container.kind === 183 /* ClassExpression */)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
@@ -43893,6 +43983,11 @@ var ts;
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else if (modifier === 112 /* AbstractKeyword */) {
|
||||
if (!(container.kind === 211 /* ClassDeclaration */ || declaration.kind === 211 /* ClassDeclaration */)) {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// unsupported modifier
|
||||
return undefined;
|
||||
@@ -43903,12 +43998,19 @@ var ts;
|
||||
switch (container.kind) {
|
||||
case 216 /* ModuleBlock */:
|
||||
case 245 /* SourceFile */:
|
||||
nodes = container.statements;
|
||||
// Container is either a class declaration or the declaration is a classDeclaration
|
||||
if (modifierFlag & 256 /* Abstract */) {
|
||||
nodes = declaration.members.concat(declaration);
|
||||
}
|
||||
else {
|
||||
nodes = container.statements;
|
||||
}
|
||||
break;
|
||||
case 141 /* Constructor */:
|
||||
nodes = container.parameters.concat(container.parent.members);
|
||||
break;
|
||||
case 211 /* ClassDeclaration */:
|
||||
case 183 /* ClassExpression */:
|
||||
nodes = container.members;
|
||||
// If we're an accessibility modifier, we're in an instance member and should search
|
||||
// the constructor's parameter list for instance members as well.
|
||||
@@ -43920,6 +44022,9 @@ var ts;
|
||||
nodes = nodes.concat(constructor.parameters);
|
||||
}
|
||||
}
|
||||
else if (modifierFlag & 256 /* Abstract */) {
|
||||
nodes = nodes.concat(container);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
ts.Debug.fail("Invalid container kind.");
|
||||
@@ -43944,6 +44049,8 @@ var ts;
|
||||
return 1 /* Export */;
|
||||
case 119 /* DeclareKeyword */:
|
||||
return 2 /* Ambient */;
|
||||
case 112 /* AbstractKeyword */:
|
||||
return 256 /* Abstract */;
|
||||
default:
|
||||
ts.Debug.fail();
|
||||
}
|
||||
@@ -44761,19 +44868,19 @@ var ts;
|
||||
if (isNameOfPropertyAssignment(node)) {
|
||||
var objectLiteral = node.parent.parent;
|
||||
var contextualType = typeChecker.getContextualType(objectLiteral);
|
||||
var name_32 = node.text;
|
||||
var name_33 = node.text;
|
||||
if (contextualType) {
|
||||
if (contextualType.flags & 16384 /* Union */) {
|
||||
// This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types)
|
||||
// if not, search the constituent types for the property
|
||||
var unionProperty = contextualType.getProperty(name_32);
|
||||
var unionProperty = contextualType.getProperty(name_33);
|
||||
if (unionProperty) {
|
||||
return [unionProperty];
|
||||
}
|
||||
else {
|
||||
var result_4 = [];
|
||||
ts.forEach(contextualType.types, function (t) {
|
||||
var symbol = t.getProperty(name_32);
|
||||
var symbol = t.getProperty(name_33);
|
||||
if (symbol) {
|
||||
result_4.push(symbol);
|
||||
}
|
||||
@@ -44782,7 +44889,7 @@ var ts;
|
||||
}
|
||||
}
|
||||
else {
|
||||
var symbol_1 = contextualType.getProperty(name_32);
|
||||
var symbol_1 = contextualType.getProperty(name_33);
|
||||
if (symbol_1) {
|
||||
return [symbol_1];
|
||||
}
|
||||
@@ -45464,7 +45571,7 @@ var ts;
|
||||
return;
|
||||
}
|
||||
}
|
||||
return 9 /* text */;
|
||||
return 2 /* identifier */;
|
||||
}
|
||||
}
|
||||
function processElement(element) {
|
||||
@@ -46760,6 +46867,13 @@ var ts;
|
||||
var decoded = JSON.parse(encoded);
|
||||
return ts.createTextChangeRange(ts.createTextSpan(decoded.span.start, decoded.span.length), decoded.newLength);
|
||||
};
|
||||
ScriptSnapshotShimAdapter.prototype.dispose = function () {
|
||||
// if scriptSnapshotShim is a COM object then property check becomes method call with no arguments
|
||||
// 'in' does not have this effect
|
||||
if ("dispose" in this.scriptSnapshotShim) {
|
||||
this.scriptSnapshotShim.dispose();
|
||||
}
|
||||
};
|
||||
return ScriptSnapshotShimAdapter;
|
||||
})();
|
||||
var LanguageServiceShimHostAdapter = (function () {
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
"name": "typescript",
|
||||
"author": "Microsoft Corp.",
|
||||
"homepage": "http://typescriptlang.org/",
|
||||
"version": "1.5.3",
|
||||
"version": "1.6.0",
|
||||
"license": "Apache-2.0",
|
||||
"description": "TypeScript is a language for application scale JavaScript development",
|
||||
"keywords": [
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/// <reference path="../src/compiler/sys.ts" />
|
||||
|
||||
/**
|
||||
* A minimal description for a parsed package.json object.
|
||||
*/
|
||||
interface PackageJson {
|
||||
name: string;
|
||||
version: string;
|
||||
keywords: string[];
|
||||
}
|
||||
|
||||
function main(): void {
|
||||
const sys = ts.sys;
|
||||
if (sys.args.length < 2) {
|
||||
sys.write("Usage:" + sys.newLine)
|
||||
sys.write("\tnode configureNightly.js <package.json location> <file containing version>" + sys.newLine);
|
||||
return;
|
||||
}
|
||||
|
||||
// Acquire the version from the package.json file and modify it appropriately.
|
||||
const packageJsonFilePath = ts.normalizePath(sys.args[0]);
|
||||
const packageJsonContents = sys.readFile(packageJsonFilePath);
|
||||
const packageJsonValue: PackageJson = JSON.parse(packageJsonContents);
|
||||
|
||||
const nightlyVersion = getNightlyVersionString(packageJsonValue.version);
|
||||
|
||||
// Modify the package.json structure
|
||||
packageJsonValue.version = nightlyVersion;
|
||||
|
||||
// Acquire and modify the source file that exposes the version string.
|
||||
const tsFilePath = ts.normalizePath(sys.args[1]);
|
||||
const tsFileContents = sys.readFile(tsFilePath);
|
||||
const versionAssignmentRegExp = /export\s+const\s+version\s+=\s+".*";/;
|
||||
const modifiedTsFileContents = tsFileContents.replace(versionAssignmentRegExp, `export const version = "${nightlyVersion}";`);
|
||||
|
||||
// Ensure we are actually changing something - the user probably wants to know that the update failed.
|
||||
if (tsFileContents === modifiedTsFileContents) {
|
||||
let err = `\n '${tsFilePath}' was not updated while configuring for a nightly publish.\n `;
|
||||
|
||||
if (tsFileContents.match(versionAssignmentRegExp)) {
|
||||
err += `Ensure that you have not already run this script; otherwise, erase your changes using 'git checkout -- "${tsFilePath}"'.`;
|
||||
}
|
||||
else {
|
||||
err += `The file seems to no longer have a string matching '${versionAssignmentRegExp}'.`;
|
||||
}
|
||||
|
||||
throw err + "\n";
|
||||
}
|
||||
|
||||
// Finally write the changes to disk.
|
||||
sys.writeFile(packageJsonFilePath, JSON.stringify(packageJsonValue, /*replacer:*/ undefined, /*space:*/ 4))
|
||||
sys.writeFile(tsFilePath, modifiedTsFileContents);
|
||||
}
|
||||
|
||||
function getNightlyVersionString(versionString: string): string {
|
||||
// If the version string already contains "-nightly",
|
||||
// then get the base string and update based on that.
|
||||
const dashNightlyPos = versionString.indexOf("-dev");
|
||||
if (dashNightlyPos >= 0) {
|
||||
versionString = versionString.slice(0, dashNightlyPos);
|
||||
}
|
||||
|
||||
// We're going to append a representation of the current time at the end of the current version.
|
||||
// String.prototype.toISOString() returns a 24-character string formatted as 'YYYY-MM-DDTHH:mm:ss.sssZ',
|
||||
// but we'd prefer to just remove separators and limit ourselves to YYYYMMDD.
|
||||
// UTC time will always be implicit here.
|
||||
const now = new Date();
|
||||
const timeStr = now.toISOString().replace(/:|T|\.|-/g, "").slice(0, 8);
|
||||
|
||||
return `${versionString}-dev.${timeStr}`;
|
||||
}
|
||||
|
||||
main();
|
||||
+13
-7
@@ -518,15 +518,21 @@ namespace ts {
|
||||
}
|
||||
else {
|
||||
declareSymbolAndAddToSymbolTable(node, SymbolFlags.ValueModule, SymbolFlags.ValueModuleExcludes);
|
||||
|
||||
let currentModuleIsConstEnumOnly = state === ModuleInstanceState.ConstEnumOnly;
|
||||
if (node.symbol.constEnumOnlyModule === undefined) {
|
||||
// non-merged case - use the current state
|
||||
node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
|
||||
if (node.symbol.flags & (SymbolFlags.Function | SymbolFlags.Class | SymbolFlags.RegularEnum)) {
|
||||
// if module was already merged with some function, class or non-const enum
|
||||
// treat is a non-const-enum-only
|
||||
node.symbol.constEnumOnlyModule = false;
|
||||
}
|
||||
else {
|
||||
// merged case: module is const enum only if all its pieces are non-instantiated or const enum
|
||||
node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
|
||||
let currentModuleIsConstEnumOnly = state === ModuleInstanceState.ConstEnumOnly;
|
||||
if (node.symbol.constEnumOnlyModule === undefined) {
|
||||
// non-merged case - use the current state
|
||||
node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
|
||||
}
|
||||
else {
|
||||
// merged case: module is const enum only if all its pieces are non-instantiated or const enum
|
||||
node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+414
-196
File diff suppressed because it is too large
Load Diff
@@ -254,6 +254,7 @@ namespace ts {
|
||||
Only_a_void_function_can_be_called_with_the_new_keyword: { code: 2350, category: DiagnosticCategory.Error, key: "Only a void function can be called with the 'new' keyword." },
|
||||
Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature: { code: 2351, category: DiagnosticCategory.Error, key: "Cannot use 'new' with an expression whose type lacks a call or construct signature." },
|
||||
Neither_type_0_nor_type_1_is_assignable_to_the_other: { code: 2352, category: DiagnosticCategory.Error, key: "Neither type '{0}' nor type '{1}' is assignable to the other." },
|
||||
Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1: { code: 2353, category: DiagnosticCategory.Error, key: "Object literal may only specify known properties, and '{0}' does not exist in type '{1}'." },
|
||||
No_best_common_type_exists_among_return_expressions: { code: 2354, category: DiagnosticCategory.Error, key: "No best common type exists among return expressions." },
|
||||
A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_or_consist_of_a_single_throw_statement: { code: 2355, category: DiagnosticCategory.Error, key: "A function whose declared type is neither 'void' nor 'any' must return a value or consist of a single 'throw' statement." },
|
||||
An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type: { code: 2356, category: DiagnosticCategory.Error, key: "An arithmetic operand must be of type 'any', 'number' or an enum type." },
|
||||
@@ -508,7 +509,6 @@ namespace ts {
|
||||
Option_noEmit_cannot_be_specified_with_option_out_or_outDir: { code: 5040, category: DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'out' or 'outDir'." },
|
||||
Option_noEmit_cannot_be_specified_with_option_declaration: { code: 5041, category: DiagnosticCategory.Error, key: "Option 'noEmit' cannot be specified with option 'declaration'." },
|
||||
Option_project_cannot_be_mixed_with_source_files_on_a_command_line: { code: 5042, category: DiagnosticCategory.Error, key: "Option 'project' cannot be mixed with source files on a command line." },
|
||||
Option_sourceMap_cannot_be_specified_with_option_isolatedModules: { code: 5043, category: DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'isolatedModules'." },
|
||||
Option_declaration_cannot_be_specified_with_option_isolatedModules: { code: 5044, category: DiagnosticCategory.Error, key: "Option 'declaration' cannot be specified with option 'isolatedModules'." },
|
||||
Option_noEmitOnError_cannot_be_specified_with_option_isolatedModules: { code: 5045, category: DiagnosticCategory.Error, key: "Option 'noEmitOnError' cannot be specified with option 'isolatedModules'." },
|
||||
Option_out_cannot_be_specified_with_option_isolatedModules: { code: 5046, category: DiagnosticCategory.Error, key: "Option 'out' cannot be specified with option 'isolatedModules'." },
|
||||
|
||||
@@ -1005,6 +1005,10 @@
|
||||
"category": "Error",
|
||||
"code": 2352
|
||||
},
|
||||
"Object literal may only specify known properties, and '{0}' does not exist in type '{1}'.": {
|
||||
"category": "Error",
|
||||
"code": 2353
|
||||
},
|
||||
"No best common type exists among return expressions.": {
|
||||
"category": "Error",
|
||||
"code": 2354
|
||||
@@ -2021,10 +2025,6 @@
|
||||
"category": "Error",
|
||||
"code": 5042
|
||||
},
|
||||
"Option 'sourceMap' cannot be specified with option 'isolatedModules'.": {
|
||||
"category": "Error",
|
||||
"code": 5043
|
||||
},
|
||||
"Option 'declaration' cannot be specified with option 'isolatedModules'.": {
|
||||
"category": "Error",
|
||||
"code": 5044
|
||||
|
||||
+1294
-341
File diff suppressed because it is too large
Load Diff
@@ -58,7 +58,6 @@ namespace ts {
|
||||
}
|
||||
|
||||
newNode.flags = flags;
|
||||
newNode.parent = oldNode.parent;
|
||||
newNode.original = oldNode;
|
||||
|
||||
mergeCommentRanges(oldNode, newNode);
|
||||
|
||||
@@ -3286,7 +3286,7 @@ namespace ts {
|
||||
|
||||
function parseSuperExpression(): MemberExpression {
|
||||
let expression = parseTokenNode<PrimaryExpression>();
|
||||
if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.DotToken) {
|
||||
if (token === SyntaxKind.OpenParenToken || token === SyntaxKind.DotToken || token === SyntaxKind.OpenBracketToken) {
|
||||
return expression;
|
||||
}
|
||||
|
||||
@@ -5126,7 +5126,12 @@ namespace ts {
|
||||
}
|
||||
else {
|
||||
node.exportClause = parseNamedImportsOrExports(SyntaxKind.NamedExports);
|
||||
if (parseOptional(SyntaxKind.FromKeyword)) {
|
||||
|
||||
// It is not uncommon to accidentally omit the 'from' keyword. Additionally, in editing scenarios,
|
||||
// the 'from' keyword can be parsed as a named export when the export clause is unterminated (i.e. `export { from "moduleName";`)
|
||||
// If we don't have a 'from' keyword, see if we have a string literal such that ASI won't take effect.
|
||||
if (token === SyntaxKind.FromKeyword || (token === SyntaxKind.StringLiteral && !scanner.hasPrecedingLineBreak())) {
|
||||
parseExpected(SyntaxKind.FromKeyword)
|
||||
node.moduleSpecifier = parseModuleSpecifier();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace ts {
|
||||
/* @internal */ export let ioWriteTime = 0;
|
||||
|
||||
/** The version of the TypeScript compiler release */
|
||||
export const version = "1.5.3";
|
||||
export const version = "1.6.0";
|
||||
|
||||
export function findConfigFile(searchPath: string): string {
|
||||
let fileName = "tsconfig.json";
|
||||
@@ -341,7 +341,7 @@ namespace ts {
|
||||
});
|
||||
}
|
||||
|
||||
function getDeclarationDiagnosticsForFile(sourceFile: SourceFile, cancellationToken: CancellationToken): Diagnostic[] {
|
||||
function getDeclarationDiagnosticsForFile(sourceFile: SourceFile, cancellationToken: CancellationToken): Diagnostic[] {
|
||||
return runWithCancellationToken(() => {
|
||||
if (!isDeclarationFile(sourceFile)) {
|
||||
let resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile, cancellationToken);
|
||||
@@ -350,7 +350,7 @@ namespace ts {
|
||||
return ts.getDeclarationDiagnostics(getEmitHost(writeFile), resolver, sourceFile);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function getOptionsDiagnostics(): Diagnostic[] {
|
||||
let allDiagnostics: Diagnostic[] = [];
|
||||
@@ -602,10 +602,6 @@ namespace ts {
|
||||
|
||||
function verifyCompilerOptions() {
|
||||
if (options.isolatedModules) {
|
||||
if (options.sourceMap) {
|
||||
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_sourceMap_cannot_be_specified_with_option_isolatedModules));
|
||||
}
|
||||
|
||||
if (options.declaration) {
|
||||
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_declaration_cannot_be_specified_with_option_isolatedModules));
|
||||
}
|
||||
|
||||
+20
-3
@@ -1974,6 +1974,7 @@ namespace ts {
|
||||
getPropertyOfType(type: Type, propertyName: string): Symbol;
|
||||
getSignaturesOfType(type: Type, kind: SignatureKind): Signature[];
|
||||
getIndexTypeOfType(type: Type, kind: IndexKind): Type;
|
||||
getBaseTypes(type: InterfaceType): ObjectType[];
|
||||
getReturnTypeOfSignature(signature: Signature): Type;
|
||||
|
||||
getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[];
|
||||
@@ -2332,10 +2333,12 @@ namespace ts {
|
||||
FromSignature = 0x00040000, // Created for signature assignment check
|
||||
ObjectLiteral = 0x00080000, // Originates in an object literal
|
||||
/* @internal */
|
||||
ContainsUndefinedOrNull = 0x00100000, // Type is or contains Undefined or Null type
|
||||
FreshObjectLiteral = 0x00100000, // Fresh object literal type
|
||||
/* @internal */
|
||||
ContainsObjectLiteral = 0x00200000, // Type is or contains object literal type
|
||||
ESSymbol = 0x00400000, // Type of symbol primitive introduced in ES6
|
||||
ContainsUndefinedOrNull = 0x00200000, // Type is or contains Undefined or Null type
|
||||
/* @internal */
|
||||
ContainsObjectLiteral = 0x00400000, // Type is or contains object literal type
|
||||
ESSymbol = 0x00800000, // Type of symbol primitive introduced in ES6
|
||||
|
||||
/* @internal */
|
||||
Intrinsic = Any | String | Number | Boolean | ESSymbol | Void | Undefined | Null,
|
||||
@@ -2376,7 +2379,9 @@ namespace ts {
|
||||
typeParameters: TypeParameter[]; // Type parameters (undefined if non-generic)
|
||||
outerTypeParameters: TypeParameter[]; // Outer type parameters (undefined if none)
|
||||
localTypeParameters: TypeParameter[]; // Local type parameters (undefined if none)
|
||||
/* @internal */
|
||||
resolvedBaseConstructorType?: Type; // Resolved base constructor type of class
|
||||
/* @internal */
|
||||
resolvedBaseTypes: ObjectType[]; // Resolved base types
|
||||
}
|
||||
|
||||
@@ -2428,6 +2433,14 @@ namespace ts {
|
||||
numberIndexType?: Type; // Numeric index type
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
// Object literals are initially marked fresh. Freshness disappears following an assignment,
|
||||
// before a type assertion, or when when an object literal's type is widened. The regular
|
||||
// version of a fresh type is identical except for the TypeFlags.FreshObjectLiteral flag.
|
||||
export interface FreshObjectLiteralType extends ResolvedType {
|
||||
regularType: ResolvedType; // Regular version of fresh type
|
||||
}
|
||||
|
||||
// Just a place to cache element types of iterables and iterators
|
||||
/* @internal */
|
||||
export interface IterableOrIteratorType extends ObjectType, UnionType {
|
||||
@@ -2482,6 +2495,9 @@ namespace ts {
|
||||
/* @internal */
|
||||
export interface TypeMapper {
|
||||
(t: TypeParameter): Type;
|
||||
context?: InferenceContext; // The inference context this mapper was created from.
|
||||
// Only inference mappers have this set (in createInferenceMapper).
|
||||
// The identity mapper and regular instantiation mappers do not need it.
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
@@ -2779,6 +2795,7 @@ namespace ts {
|
||||
|
||||
export interface CompilerHost {
|
||||
getSourceFile(fileName: string, languageVersion: ScriptTarget, onError?: (message: string) => void): SourceFile;
|
||||
getCancellationToken?(): CancellationToken;
|
||||
getDefaultLibFileName(options: CompilerOptions): string;
|
||||
writeFile: WriteFileCallback;
|
||||
getCurrentDirectory(): string;
|
||||
|
||||
+157
-36
@@ -215,8 +215,37 @@ namespace ts {
|
||||
|
||||
// Gets the nearest enclosing block scope container that has the provided node
|
||||
// as a descendant, that is not the provided node.
|
||||
export function getEnclosingBlockScopeContainer(node: Node): Node {
|
||||
let current = node.parent;
|
||||
export function getEnclosingBlockScopeContainer(node: Node): Node;
|
||||
|
||||
/**
|
||||
* Gets the nearest enclosing block scope container that has the provided node
|
||||
* as a descendant, that is not the provided node.
|
||||
* @param node The starting node
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
*/
|
||||
export function getEnclosingBlockScopeContainer(node: Node, getAncestorOrSelf: (offset: number) => Node, offset: number): Node;
|
||||
|
||||
/**
|
||||
* Gets the nearest enclosing block scope container that has the provided node
|
||||
* as a descendant, that is not the provided node.
|
||||
* @param node The starting node
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
* @remarks
|
||||
* The emitter tracks the parent of the current node as it descends into the source file,
|
||||
* so that we can properly emit synthesized nodes that may not have parent pointers.
|
||||
* We can call `getAncestorOrSelf` with an offset that specifies how far back in the node's
|
||||
* ancestry to retrieve a parent, grandparent, etc. An offset of zero (0) refers to the
|
||||
* current node on the top of the node stack, an offset of one (1) refers to its parent, an
|
||||
* offset of two (2) refers to the grandparent, and so on.
|
||||
*/
|
||||
export function getEnclosingBlockScopeContainer(node: Node, getAncestorOrSelf?: (offset: number) => Node, offset?: number): Node {
|
||||
let current = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
while (current) {
|
||||
if (isFunctionLike(current)) {
|
||||
return current;
|
||||
@@ -233,12 +262,12 @@ namespace ts {
|
||||
case SyntaxKind.Block:
|
||||
// function block is not considered block-scope container
|
||||
// see comment in binder.ts: bind(...), case for SyntaxKind.Block
|
||||
if (!isFunctionLike(current.parent)) {
|
||||
if (!isFunctionLike(getAncestorOrSelf ? getAncestorOrSelf(offset + 1) : current.parent)) {
|
||||
return current;
|
||||
}
|
||||
}
|
||||
|
||||
current = current.parent;
|
||||
current = getAncestorOrSelf ? getAncestorOrSelf(++offset) : current.parent;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -333,32 +362,56 @@ namespace ts {
|
||||
return node.kind === SyntaxKind.EnumDeclaration && isConst(node);
|
||||
}
|
||||
|
||||
function walkUpBindingElementsAndPatterns(node: Node): Node {
|
||||
/**
|
||||
* Returns the node flags for this node and all relevant parent nodes.
|
||||
*/
|
||||
export function getCombinedNodeFlags(node: Node): NodeFlags;
|
||||
|
||||
/**
|
||||
* Returns the node flags for this node and all relevant parent nodes.
|
||||
* @param node The starting node
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
*/
|
||||
export function getCombinedNodeFlags(node: Node, getAncestorOrSelf: (offset: number) => Node, offset: number): NodeFlags;
|
||||
|
||||
/**
|
||||
* Returns the node flags for this node and all relevant parent nodes.
|
||||
* @param node The starting node
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
* @remarks
|
||||
* This is done so that nodes like variable declarations and binding elements can return
|
||||
* a view of their flags that includes the modifiers from their container. i.e. flags like
|
||||
* export/declare aren't stored on the variable declaration directly, but on the containing
|
||||
* variable statement (if it has one). Similarly, flags for let/const are store on the
|
||||
* variable declaration list. By calling this function, all those flags are combined so
|
||||
* that the client can treat the node as if it actually had those flags.
|
||||
*
|
||||
* The emitter tracks the parent of the current node as it descends into the source file,
|
||||
* so that we can properly emit synthesized nodes that may not have parent pointers.
|
||||
* We can call `getAncestorOrSelf` with an offset that specifies how far back in the node's
|
||||
* ancestry to retrieve a parent, grandparent, etc. An offset of zero (0) refers to the
|
||||
* current node on the top of the node stack, an offset of one (1) refers to its parent, an
|
||||
* offset of two (2) refers to the grandparent, and so on.
|
||||
*/
|
||||
export function getCombinedNodeFlags(node: Node, getAncestorOrSelf?: (offset: number) => Node, offset?: number): NodeFlags {
|
||||
while (node && (node.kind === SyntaxKind.BindingElement || isBindingPattern(node))) {
|
||||
node = node.parent;
|
||||
node = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
// Returns the node flags for this node and all relevant parent nodes. This is done so that
|
||||
// nodes like variable declarations and binding elements can returned a view of their flags
|
||||
// that includes the modifiers from their container. i.e. flags like export/declare aren't
|
||||
// stored on the variable declaration directly, but on the containing variable statement
|
||||
// (if it has one). Similarly, flags for let/const are store on the variable declaration
|
||||
// list. By calling this function, all those flags are combined so that the client can treat
|
||||
// the node as if it actually had those flags.
|
||||
export function getCombinedNodeFlags(node: Node): NodeFlags {
|
||||
node = walkUpBindingElementsAndPatterns(node);
|
||||
|
||||
let flags = node.flags;
|
||||
if (node.kind === SyntaxKind.VariableDeclaration) {
|
||||
node = node.parent;
|
||||
node = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
}
|
||||
|
||||
if (node && node.kind === SyntaxKind.VariableDeclarationList) {
|
||||
flags |= node.flags;
|
||||
node = node.parent;
|
||||
node = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
}
|
||||
|
||||
if (node && node.kind === SyntaxKind.VariableStatement) {
|
||||
@@ -577,7 +630,7 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
export function isVariableLike(node: Node): boolean {
|
||||
export function isVariableLike(node: Node): node is VariableLikeDeclaration {
|
||||
if (node) {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.BindingElement:
|
||||
@@ -869,7 +922,39 @@ namespace ts {
|
||||
return nodeIsDecorated(node) || childIsDecorated(node);
|
||||
}
|
||||
|
||||
export function isExpression(node: Node): boolean {
|
||||
/**
|
||||
* Returns whether the node is part of an expression.
|
||||
* @param node The node to test
|
||||
*/
|
||||
export function isExpression(node: Node): boolean;
|
||||
|
||||
/**
|
||||
* Returns whether the node is part of an expression.
|
||||
* @param node The node to test
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
*/
|
||||
export function isExpression(node: Node, getAncestorOrSelf: (offset: number) => Node, offset: number): boolean;
|
||||
|
||||
/**
|
||||
* Returns whether the node is part of an expression.
|
||||
* @param node The node to test
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
* @remarks
|
||||
* The emitter tracks the parent of the current node as it descends into the source file,
|
||||
* so that we can properly emit synthesized nodes that may not have parent pointers.
|
||||
* We can call `getAncestorOrSelf` with an offset that specifies how far back in the node's
|
||||
* ancestry to retrieve a parent, grandparent, etc. An offset of zero (0) refers to the
|
||||
* current node on the top of the node stack, an offset of one (1) refers to its parent, an
|
||||
* offset of two (2) refers to the grandparent, and so on.
|
||||
*/
|
||||
export function isExpression(node: Node, getAncestorOrSelf?: (offset: number) => Node, offset?: number): boolean {
|
||||
let parent: Node;
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.ThisKeyword:
|
||||
case SyntaxKind.SuperKeyword:
|
||||
@@ -906,18 +991,22 @@ namespace ts {
|
||||
case SyntaxKind.YieldExpression:
|
||||
return true;
|
||||
case SyntaxKind.QualifiedName:
|
||||
while (node.parent.kind === SyntaxKind.QualifiedName) {
|
||||
node = node.parent;
|
||||
parent = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
while (parent.kind === SyntaxKind.QualifiedName) {
|
||||
node = parent;
|
||||
parent = getAncestorOrSelf ? getAncestorOrSelf(++offset) : node.parent;
|
||||
}
|
||||
return node.parent.kind === SyntaxKind.TypeQuery;
|
||||
return parent.kind === SyntaxKind.TypeQuery;
|
||||
|
||||
case SyntaxKind.Identifier:
|
||||
if (node.parent.kind === SyntaxKind.TypeQuery) {
|
||||
parent = getAncestorOrSelf ? getAncestorOrSelf(offset + 1) : node.parent;
|
||||
if (parent.kind === SyntaxKind.TypeQuery) {
|
||||
return true;
|
||||
}
|
||||
// fall through
|
||||
case SyntaxKind.NumericLiteral:
|
||||
case SyntaxKind.StringLiteral:
|
||||
let parent = node.parent;
|
||||
parent = getAncestorOrSelf ? getAncestorOrSelf(offset + 1) : node.parent;
|
||||
switch (parent.kind) {
|
||||
case SyntaxKind.VariableDeclaration:
|
||||
case SyntaxKind.Parameter:
|
||||
@@ -958,9 +1047,9 @@ namespace ts {
|
||||
case SyntaxKind.Decorator:
|
||||
return true;
|
||||
case SyntaxKind.ExpressionWithTypeArguments:
|
||||
return (<ExpressionWithTypeArguments>parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent);
|
||||
return (<ExpressionWithTypeArguments>parent).expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent, getAncestorOrSelf, offset + 1);
|
||||
default:
|
||||
if (isExpression(parent)) {
|
||||
if (isExpression(parent, getAncestorOrSelf, offset)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -983,7 +1072,7 @@ namespace ts {
|
||||
return (<ExternalModuleReference>(<ImportEqualsDeclaration>node).moduleReference).expression;
|
||||
}
|
||||
|
||||
export function isInternalModuleImportEqualsDeclaration(node: Node) {
|
||||
export function isInternalModuleImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration {
|
||||
return node.kind === SyntaxKind.ImportEqualsDeclaration && (<ImportEqualsDeclaration>node).moduleReference.kind !== SyntaxKind.ExternalModuleReference;
|
||||
}
|
||||
|
||||
@@ -1442,7 +1531,7 @@ namespace ts {
|
||||
export function nodeStartsNewLexicalEnvironment(n: Node): boolean {
|
||||
return isFunctionLike(n) || n.kind === SyntaxKind.ModuleDeclaration || n.kind === SyntaxKind.SourceFile;
|
||||
}
|
||||
|
||||
|
||||
export function nodeIsSynthesized(node: Node): boolean {
|
||||
return node && node.pos === -1;
|
||||
}
|
||||
@@ -1965,10 +2054,31 @@ namespace ts {
|
||||
return token >= SyntaxKind.FirstAssignment && token <= SyntaxKind.LastAssignment;
|
||||
}
|
||||
|
||||
export function isExpressionWithTypeArgumentsInClassExtendsClause(node: Node): boolean {
|
||||
return node.kind === SyntaxKind.ExpressionWithTypeArguments &&
|
||||
(<HeritageClause>node.parent).token === SyntaxKind.ExtendsKeyword &&
|
||||
isClassLike(node.parent.parent);
|
||||
/**
|
||||
* Tests whether the node is an ExpressionWithTypeArguments node that is part of the `extends`
|
||||
* clause of a class.
|
||||
* @param node The node to test
|
||||
* @param getAncestorOrSelf A callback used to get the ancestor of the starting node, used
|
||||
* only when traversing the ancestors of the current node in the emitter.
|
||||
* @param offset The offset in the node stack used to get the ancestor of the current node
|
||||
* from the emitter's node stack.
|
||||
* @remarks
|
||||
* The emitter tracks the parent of the current node as it descends into the source file,
|
||||
* so that we can properly emit synthesized nodes that may not have parent pointers.
|
||||
* We can call `getAncestorOrSelf` with an offset that specifies how far back in the node's
|
||||
* ancestry to retrieve a parent, grandparent, etc. An offset of zero (0) refers to the
|
||||
* current node on the top of the node stack, an offset of one (1) refers to its parent, an
|
||||
* offset of two (2) refers to the grandparent, and so on.
|
||||
*/
|
||||
export function isExpressionWithTypeArgumentsInClassExtendsClause(node: Node, getAncestorOrSelf?: (offset: number) => Node, offset?: number): boolean {
|
||||
if (node.kind === SyntaxKind.ExpressionWithTypeArguments) {
|
||||
let parent = getAncestorOrSelf ? getAncestorOrSelf(offset + 1) : node.parent;
|
||||
if ((<HeritageClause>parent).token === SyntaxKind.ExtendsKeyword) {
|
||||
let grandparent = getAncestorOrSelf ? getAncestorOrSelf(offset + 2) : parent.parent;
|
||||
return isClassLike(grandparent);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Returns false if this heritage clause element's expression contains something unsupported
|
||||
@@ -1994,6 +2104,17 @@ namespace ts {
|
||||
(node.parent.kind === SyntaxKind.PropertyAccessExpression && (<PropertyAccessExpression>node.parent).name === node);
|
||||
}
|
||||
|
||||
export function isEmptyObjectLiteralOrArrayLiteral(expression: Node): boolean {
|
||||
let kind = expression.kind;
|
||||
if (kind === SyntaxKind.ObjectLiteralExpression) {
|
||||
return (<ObjectLiteralExpression>expression).properties.length === 0;
|
||||
}
|
||||
if (kind === SyntaxKind.ArrayLiteralExpression) {
|
||||
return (<ArrayLiteralExpression>expression).elements.length === 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
export function getLocalSymbolForExportDefault(symbol: Symbol) {
|
||||
return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & NodeFlags.Default) ? symbol.valueDeclaration.localSymbol : undefined;
|
||||
}
|
||||
|
||||
+11
-15
@@ -26,9 +26,8 @@ module FourSlash {
|
||||
export interface FourSlashFile {
|
||||
// The contents of the file (with markers, etc stripped out)
|
||||
content: string;
|
||||
|
||||
fileName: string;
|
||||
|
||||
version: number;
|
||||
// File-specific options (name/value pairs)
|
||||
fileOptions: { [index: string]: string; };
|
||||
}
|
||||
@@ -671,20 +670,20 @@ module FourSlash {
|
||||
|
||||
let completions = this.getCompletionListAtCaret();
|
||||
if ((!completions || completions.entries.length === 0) && negative) {
|
||||
this.raiseError("Completion list is empty at Caret");
|
||||
} else if ((completions && completions.entries.length !== 0) && !negative) {
|
||||
|
||||
this.raiseError("Completion list is empty at caret at position " + this.activeFile.fileName + " " + this.currentCaretPosition);
|
||||
}
|
||||
else if (completions && completions.entries.length !== 0 && !negative) {
|
||||
let errorMsg = "\n" + "Completion List contains: [" + completions.entries[0].name;
|
||||
for (let i = 1; i < completions.entries.length; i++) {
|
||||
errorMsg += ", " + completions.entries[i].name;
|
||||
}
|
||||
errorMsg += "]\n";
|
||||
|
||||
Harness.IO.log(errorMsg);
|
||||
this.raiseError("Completion list is not empty at Caret");
|
||||
this.raiseError("Completion list is not empty at caret at position " + this.activeFile.fileName + " " + this.currentCaretPosition + errorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public verifyCompletionListAllowsNewIdentifier(negative: boolean) {
|
||||
let completions = this.getCompletionListAtCaret();
|
||||
|
||||
@@ -1876,7 +1875,7 @@ module FourSlash {
|
||||
}
|
||||
}
|
||||
|
||||
private verifyProjectInfo(expected: string[]) {
|
||||
public verifyProjectInfo(expected: string[]) {
|
||||
if (this.testType === FourSlashTestType.Server) {
|
||||
let actual = (<ts.server.SessionClient>this.languageService).getProjectInfo(
|
||||
this.activeFile.fileName,
|
||||
@@ -2058,11 +2057,8 @@ module FourSlash {
|
||||
return result;
|
||||
}
|
||||
|
||||
public verifGetScriptLexicalStructureListContains(
|
||||
name: string,
|
||||
kind: string,
|
||||
markerPosition?: number) {
|
||||
this.taoInvalidReason = 'verifGetScriptLexicalStructureListContains impossible';
|
||||
public verifyGetScriptLexicalStructureListContains(name: string, kind: string) {
|
||||
this.taoInvalidReason = 'verifyGetScriptLexicalStructureListContains impossible';
|
||||
|
||||
let items = this.languageService.getNavigationBarItems(this.activeFile.fileName);
|
||||
|
||||
@@ -2264,7 +2260,7 @@ module FourSlash {
|
||||
return 'line ' + (pos.line + 1) + ', col ' + pos.character;
|
||||
}
|
||||
|
||||
private getMarkerByName(markerName: string) {
|
||||
public getMarkerByName(markerName: string) {
|
||||
let markerPos = this.testData.markerPositions[markerName];
|
||||
if (markerPos === undefined) {
|
||||
let markerNames: string[] = [];
|
||||
@@ -2739,4 +2735,4 @@ module FourSlash {
|
||||
fileName: fileName
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -29,6 +29,7 @@ var Buffer: BufferConstructor = require('buffer').Buffer;
|
||||
// this will work in the browser via browserify
|
||||
var _chai: typeof chai = require('chai');
|
||||
var assert: typeof _chai.assert = _chai.assert;
|
||||
var expect: typeof _chai.expect = _chai.expect;
|
||||
declare var __dirname: string; // Node-specific
|
||||
var global = <any>Function("return this").call(null);
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@ interface FindFileResult {
|
||||
}
|
||||
|
||||
interface IOLog {
|
||||
timestamp: string;
|
||||
arguments: string[];
|
||||
executingPath: string;
|
||||
currentDirectory: string;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/// <reference path="harness.ts" />
|
||||
|
||||
class RunnerBase {
|
||||
abstract class RunnerBase {
|
||||
constructor() { }
|
||||
|
||||
// contains the tests to run
|
||||
@@ -18,9 +18,7 @@ class RunnerBase {
|
||||
/** Setup the runner's tests so that they are ready to be executed by the harness
|
||||
* The first test should be a describe/it block that sets up the harness's compiler instance appropriately
|
||||
*/
|
||||
public initializeTests(): void {
|
||||
throw new Error('method not implemented');
|
||||
}
|
||||
public abstract initializeTests(): void;
|
||||
|
||||
/** Replaces instances of full paths with fileNames only */
|
||||
static removeFullPaths(path: string) {
|
||||
|
||||
@@ -123,7 +123,7 @@ module RWC {
|
||||
content = ts.sys.readFile(unitName);
|
||||
}
|
||||
catch (e) {
|
||||
// Leave content undefined.
|
||||
content = ts.sys.readFile(fileName);
|
||||
}
|
||||
return { unitName, content };
|
||||
}
|
||||
|
||||
Vendored
+3
-3
@@ -971,14 +971,14 @@ interface JSON {
|
||||
* @param replacer A function that transforms the results.
|
||||
* @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
|
||||
*/
|
||||
stringify(value: any, replacer: (key: string, value: any) => any, space: any): string;
|
||||
stringify(value: any, replacer: (key: string, value: any) => any, space: string | number): string;
|
||||
/**
|
||||
* Converts a JavaScript value to a JavaScript Object Notation (JSON) string.
|
||||
* @param value A JavaScript value, usually an object or array, to be converted.
|
||||
* @param replacer Array that transforms the results.
|
||||
* @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read.
|
||||
*/
|
||||
stringify(value: any, replacer: any[], space: any): string;
|
||||
stringify(value: any, replacer: any[], space: string | number): string;
|
||||
}
|
||||
/**
|
||||
* An intrinsic object that provides functions to convert JavaScript values to and from the JavaScript Object Notation (JSON) format.
|
||||
@@ -1181,4 +1181,4 @@ interface PromiseLike<T> {
|
||||
*/
|
||||
then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<TResult>;
|
||||
then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>;
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+1
-1
@@ -377,7 +377,7 @@ interface String {
|
||||
* @param searchString search string
|
||||
* @param position If position is undefined, 0 is assumed, so as to search all of the String.
|
||||
*/
|
||||
contains(searchString: string, position?: number): boolean;
|
||||
includes(searchString: string, position?: number): boolean;
|
||||
|
||||
/**
|
||||
* Returns true if the sequence of elements of searchString converted to a String is the
|
||||
|
||||
@@ -202,9 +202,7 @@ namespace ts.server {
|
||||
return {
|
||||
isMemberCompletion: false,
|
||||
isNewIdentifierLocation: false,
|
||||
entries: response.body,
|
||||
fileName: fileName,
|
||||
position: position
|
||||
entries: response.body
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
+62
-62
@@ -109,13 +109,13 @@ namespace ts.server {
|
||||
}
|
||||
|
||||
export class Session {
|
||||
projectService: ProjectService;
|
||||
pendingOperation = false;
|
||||
fileHash: ts.Map<number> = {};
|
||||
nextFileId = 1;
|
||||
errorTimer: any; /*NodeJS.Timer | number*/
|
||||
immediateId: any;
|
||||
changeSeq = 0;
|
||||
protected projectService: ProjectService;
|
||||
private pendingOperation = false;
|
||||
private fileHash: ts.Map<number> = {};
|
||||
private nextFileId = 1;
|
||||
private errorTimer: any; /*NodeJS.Timer | number*/
|
||||
private immediateId: any;
|
||||
private changeSeq = 0;
|
||||
|
||||
constructor(
|
||||
private host: ServerHost,
|
||||
@@ -129,7 +129,7 @@ namespace ts.server {
|
||||
});
|
||||
}
|
||||
|
||||
handleEvent(eventName: string, project: Project, fileName: string) {
|
||||
private handleEvent(eventName: string, project: Project, fileName: string) {
|
||||
if (eventName == "context") {
|
||||
this.projectService.log("got context event, updating diagnostics for" + fileName, "Info");
|
||||
this.updateErrorCheck([{ fileName, project }], this.changeSeq,
|
||||
@@ -137,7 +137,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
logError(err: Error, cmd: string) {
|
||||
public logError(err: Error, cmd: string) {
|
||||
var typedErr = <StackTraceError>err;
|
||||
var msg = "Exception on executing command " + cmd;
|
||||
if (typedErr.message) {
|
||||
@@ -149,11 +149,11 @@ namespace ts.server {
|
||||
this.projectService.log(msg);
|
||||
}
|
||||
|
||||
sendLineToClient(line: string) {
|
||||
private sendLineToClient(line: string) {
|
||||
this.host.write(line + this.host.newLine);
|
||||
}
|
||||
|
||||
send(msg: protocol.Message) {
|
||||
public send(msg: protocol.Message) {
|
||||
var json = JSON.stringify(msg);
|
||||
if (this.logger.isVerbose()) {
|
||||
this.logger.info(msg.type + ": " + json);
|
||||
@@ -162,7 +162,7 @@ namespace ts.server {
|
||||
'\r\n\r\n' + json);
|
||||
}
|
||||
|
||||
event(info: any, eventName: string) {
|
||||
public event(info: any, eventName: string) {
|
||||
var ev: protocol.Event = {
|
||||
seq: 0,
|
||||
type: "event",
|
||||
@@ -172,7 +172,7 @@ namespace ts.server {
|
||||
this.send(ev);
|
||||
}
|
||||
|
||||
response(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) {
|
||||
private response(info: any, cmdName: string, reqSeq = 0, errorMsg?: string) {
|
||||
var res: protocol.Response = {
|
||||
seq: 0,
|
||||
type: "response",
|
||||
@@ -189,11 +189,11 @@ namespace ts.server {
|
||||
this.send(res);
|
||||
}
|
||||
|
||||
output(body: any, commandName: string, requestSequence = 0, errorMessage?: string) {
|
||||
public output(body: any, commandName: string, requestSequence = 0, errorMessage?: string) {
|
||||
this.response(body, commandName, requestSequence, errorMessage);
|
||||
}
|
||||
|
||||
semanticCheck(file: string, project: Project) {
|
||||
private semanticCheck(file: string, project: Project) {
|
||||
try {
|
||||
var diags = project.compilerService.languageService.getSemanticDiagnostics(file);
|
||||
|
||||
@@ -207,7 +207,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
syntacticCheck(file: string, project: Project) {
|
||||
private syntacticCheck(file: string, project: Project) {
|
||||
try {
|
||||
var diags = project.compilerService.languageService.getSyntacticDiagnostics(file);
|
||||
if (diags) {
|
||||
@@ -220,12 +220,12 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
errorCheck(file: string, project: Project) {
|
||||
private errorCheck(file: string, project: Project) {
|
||||
this.syntacticCheck(file, project);
|
||||
this.semanticCheck(file, project);
|
||||
}
|
||||
|
||||
updateProjectStructure(seq: number, matchSeq: (seq: number) => boolean, ms = 1500) {
|
||||
private updateProjectStructure(seq: number, matchSeq: (seq: number) => boolean, ms = 1500) {
|
||||
setTimeout(() => {
|
||||
if (matchSeq(seq)) {
|
||||
this.projectService.updateProjectStructure();
|
||||
@@ -233,7 +233,7 @@ namespace ts.server {
|
||||
}, ms);
|
||||
}
|
||||
|
||||
updateErrorCheck(checkList: PendingErrorCheck[], seq: number,
|
||||
private updateErrorCheck(checkList: PendingErrorCheck[], seq: number,
|
||||
matchSeq: (seq: number) => boolean, ms = 1500, followMs = 200) {
|
||||
if (followMs > ms) {
|
||||
followMs = ms;
|
||||
@@ -269,7 +269,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
getDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] {
|
||||
private getDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -291,7 +291,7 @@ namespace ts.server {
|
||||
}));
|
||||
}
|
||||
|
||||
getTypeDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] {
|
||||
private getTypeDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -313,7 +313,7 @@ namespace ts.server {
|
||||
}));
|
||||
}
|
||||
|
||||
getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[]{
|
||||
private getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[]{
|
||||
fileName = ts.normalizePath(fileName);
|
||||
let project = this.projectService.getProjectForFile(fileName);
|
||||
|
||||
@@ -343,7 +343,7 @@ namespace ts.server {
|
||||
});
|
||||
}
|
||||
|
||||
getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo {
|
||||
private getProjectInfo(fileName: string, needFileNameList: boolean): protocol.ProjectInfo {
|
||||
fileName = ts.normalizePath(fileName)
|
||||
let project = this.projectService.getProjectForFile(fileName)
|
||||
|
||||
@@ -358,7 +358,7 @@ namespace ts.server {
|
||||
return projectInfo;
|
||||
}
|
||||
|
||||
getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody {
|
||||
private getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -426,7 +426,7 @@ namespace ts.server {
|
||||
return { info: renameInfo, locs: bakedRenameLocs };
|
||||
}
|
||||
|
||||
getReferences(line: number, offset: number, fileName: string): protocol.ReferencesResponseBody {
|
||||
private getReferences(line: number, offset: number, fileName: string): protocol.ReferencesResponseBody {
|
||||
// TODO: get all projects for this file; report refs for all projects deleting duplicates
|
||||
// can avoid duplicates by eliminating same ref file from subsequent projects
|
||||
var file = ts.normalizePath(fileName);
|
||||
@@ -473,12 +473,12 @@ namespace ts.server {
|
||||
};
|
||||
}
|
||||
|
||||
openClientFile(fileName: string) {
|
||||
private openClientFile(fileName: string) {
|
||||
var file = ts.normalizePath(fileName);
|
||||
this.projectService.openClientFile(file);
|
||||
}
|
||||
|
||||
getQuickInfo(line: number, offset: number, fileName: string): protocol.QuickInfoResponseBody {
|
||||
private getQuickInfo(line: number, offset: number, fileName: string): protocol.QuickInfoResponseBody {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -504,7 +504,7 @@ namespace ts.server {
|
||||
};
|
||||
}
|
||||
|
||||
getFormattingEditsForRange(line: number, offset: number, endLine: number, endOffset: number, fileName: string): protocol.CodeEdit[] {
|
||||
private getFormattingEditsForRange(line: number, offset: number, endLine: number, endOffset: number, fileName: string): protocol.CodeEdit[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -531,7 +531,7 @@ namespace ts.server {
|
||||
});
|
||||
}
|
||||
|
||||
getFormattingEditsAfterKeystroke(line: number, offset: number, key: string, fileName: string): protocol.CodeEdit[] {
|
||||
private getFormattingEditsAfterKeystroke(line: number, offset: number, key: string, fileName: string): protocol.CodeEdit[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
@@ -607,7 +607,7 @@ namespace ts.server {
|
||||
});
|
||||
}
|
||||
|
||||
getCompletions(line: number, offset: number, prefix: string, fileName: string): protocol.CompletionEntry[] {
|
||||
private getCompletions(line: number, offset: number, prefix: string, fileName: string): protocol.CompletionEntry[] {
|
||||
if (!prefix) {
|
||||
prefix = "";
|
||||
}
|
||||
@@ -633,7 +633,7 @@ namespace ts.server {
|
||||
}, []).sort((a, b) => a.name.localeCompare(b.name));
|
||||
}
|
||||
|
||||
getCompletionEntryDetails(line: number, offset: number,
|
||||
private getCompletionEntryDetails(line: number, offset: number,
|
||||
entryNames: string[], fileName: string): protocol.CompletionEntryDetails[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
@@ -653,7 +653,7 @@ namespace ts.server {
|
||||
}, []);
|
||||
}
|
||||
|
||||
getSignatureHelpItems(line: number, offset: number, fileName: string): protocol.SignatureHelpItems {
|
||||
private getSignatureHelpItems(line: number, offset: number, fileName: string): protocol.SignatureHelpItems {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -682,7 +682,7 @@ namespace ts.server {
|
||||
return result;
|
||||
}
|
||||
|
||||
getDiagnostics(delay: number, fileNames: string[]) {
|
||||
private getDiagnostics(delay: number, fileNames: string[]) {
|
||||
var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => {
|
||||
fileName = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(fileName);
|
||||
@@ -697,7 +697,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
change(line: number, offset: number, endLine: number, endOffset: number, insertString: string, fileName: string) {
|
||||
private change(line: number, offset: number, endLine: number, endOffset: number, insertString: string, fileName: string) {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (project) {
|
||||
@@ -712,7 +712,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
reload(fileName: string, tempFileName: string, reqSeq = 0) {
|
||||
private reload(fileName: string, tempFileName: string, reqSeq = 0) {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var tmpfile = ts.normalizePath(tempFileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
@@ -725,7 +725,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
saveToTmp(fileName: string, tempFileName: string) {
|
||||
private saveToTmp(fileName: string, tempFileName: string) {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var tmpfile = ts.normalizePath(tempFileName);
|
||||
|
||||
@@ -735,12 +735,12 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
closeClientFile(fileName: string) {
|
||||
private closeClientFile(fileName: string) {
|
||||
var file = ts.normalizePath(fileName);
|
||||
this.projectService.closeClientFile(file);
|
||||
}
|
||||
|
||||
decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): protocol.NavigationBarItem[] {
|
||||
private decorateNavigationBarItem(project: Project, fileName: string, items: ts.NavigationBarItem[]): protocol.NavigationBarItem[] {
|
||||
if (!items) {
|
||||
return undefined;
|
||||
}
|
||||
@@ -759,7 +759,7 @@ namespace ts.server {
|
||||
}));
|
||||
}
|
||||
|
||||
getNavigationBarItems(fileName: string): protocol.NavigationBarItem[] {
|
||||
private getNavigationBarItems(fileName: string): protocol.NavigationBarItem[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -775,7 +775,7 @@ namespace ts.server {
|
||||
return this.decorateNavigationBarItem(project, fileName, items);
|
||||
}
|
||||
|
||||
getNavigateToItems(searchValue: string, fileName: string, maxResultCount?: number): protocol.NavtoItem[] {
|
||||
private getNavigateToItems(searchValue: string, fileName: string, maxResultCount?: number): protocol.NavtoItem[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
if (!project) {
|
||||
@@ -814,7 +814,7 @@ namespace ts.server {
|
||||
});
|
||||
}
|
||||
|
||||
getBraceMatching(line: number, offset: number, fileName: string): protocol.TextSpan[] {
|
||||
private getBraceMatching(line: number, offset: number, fileName: string): protocol.TextSpan[] {
|
||||
var file = ts.normalizePath(fileName);
|
||||
|
||||
var project = this.projectService.getProjectForFile(file);
|
||||
@@ -836,59 +836,59 @@ namespace ts.server {
|
||||
}));
|
||||
}
|
||||
|
||||
exit() {
|
||||
public exit() {
|
||||
}
|
||||
|
||||
private handlers : Map<(request: protocol.Request) => {response?: any, responseRequired?: boolean}> = {
|
||||
[CommandNames.Exit]: () => {
|
||||
this.exit();
|
||||
return {};
|
||||
return { responseRequired: false};
|
||||
},
|
||||
[CommandNames.Definition]: (request: protocol.Request) => {
|
||||
var defArgs = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getDefinition(defArgs.line, defArgs.offset, defArgs.file)};
|
||||
return {response: this.getDefinition(defArgs.line, defArgs.offset, defArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.TypeDefinition]: (request: protocol.Request) => {
|
||||
var defArgs = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getTypeDefinition(defArgs.line, defArgs.offset, defArgs.file)};
|
||||
return {response: this.getTypeDefinition(defArgs.line, defArgs.offset, defArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.References]: (request: protocol.Request) => {
|
||||
var defArgs = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getReferences(defArgs.line, defArgs.offset, defArgs.file)};
|
||||
return {response: this.getReferences(defArgs.line, defArgs.offset, defArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Rename]: (request: protocol.Request) => {
|
||||
var renameArgs = <protocol.RenameRequestArgs>request.arguments;
|
||||
return {response: this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings)}
|
||||
return {response: this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings), responseRequired: true}
|
||||
},
|
||||
[CommandNames.Open]: (request: protocol.Request) => {
|
||||
var openArgs = <protocol.OpenRequestArgs>request.arguments;
|
||||
this.openClientFile(openArgs.file);
|
||||
return {}
|
||||
return {responseRequired: false}
|
||||
},
|
||||
[CommandNames.Quickinfo]: (request: protocol.Request) => {
|
||||
var quickinfoArgs = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file)};
|
||||
return {response: this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Format]: (request: protocol.Request) => {
|
||||
var formatArgs = <protocol.FormatRequestArgs>request.arguments;
|
||||
return {response: this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file)};
|
||||
return {response: this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Formatonkey]: (request: protocol.Request) => {
|
||||
var formatOnKeyArgs = <protocol.FormatOnKeyRequestArgs>request.arguments;
|
||||
return {response: this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file)};
|
||||
return {response: this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Completions]: (request: protocol.Request) => {
|
||||
var completionsArgs = <protocol.CompletionsRequestArgs>request.arguments;
|
||||
return {response: this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file)}
|
||||
return {response: this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file), responseRequired: true}
|
||||
},
|
||||
[CommandNames.CompletionDetails]: (request: protocol.Request) => {
|
||||
var completionDetailsArgs = <protocol.CompletionDetailsRequestArgs>request.arguments;
|
||||
return {response: this.getCompletionEntryDetails(completionDetailsArgs.line,completionDetailsArgs.offset,
|
||||
completionDetailsArgs.entryNames,completionDetailsArgs.file)}
|
||||
completionDetailsArgs.entryNames,completionDetailsArgs.file), responseRequired: true}
|
||||
},
|
||||
[CommandNames.SignatureHelp]: (request: protocol.Request) => {
|
||||
var signatureHelpArgs = <protocol.SignatureHelpRequestArgs>request.arguments;
|
||||
return {response: this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file)}
|
||||
return {response: this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file), responseRequired: true}
|
||||
},
|
||||
[CommandNames.Geterr]: (request: protocol.Request) => {
|
||||
var geterrArgs = <protocol.GeterrRequestArgs>request.arguments;
|
||||
@@ -923,33 +923,33 @@ namespace ts.server {
|
||||
},
|
||||
[CommandNames.Navto]: (request: protocol.Request) => {
|
||||
var navtoArgs = <protocol.NavtoRequestArgs>request.arguments;
|
||||
return {response: this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount)};
|
||||
return {response: this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Brace]: (request: protocol.Request) => {
|
||||
var braceArguments = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file)};
|
||||
return {response: this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.NavBar]: (request: protocol.Request) => {
|
||||
var navBarArgs = <protocol.FileRequestArgs>request.arguments;
|
||||
return {response: this.getNavigationBarItems(navBarArgs.file)};
|
||||
return {response: this.getNavigationBarItems(navBarArgs.file), responseRequired: true};
|
||||
},
|
||||
[CommandNames.Occurrences]: (request: protocol.Request) => {
|
||||
var { line, offset, file: fileName } = <protocol.FileLocationRequestArgs>request.arguments;
|
||||
return {response: this.getOccurrences(line, offset, fileName)};
|
||||
return {response: this.getOccurrences(line, offset, fileName), responseRequired: true};
|
||||
},
|
||||
[CommandNames.ProjectInfo]: (request: protocol.Request) => {
|
||||
var { file, needFileNameList } = <protocol.ProjectInfoRequestArgs>request.arguments;
|
||||
return {response: this.getProjectInfo(file, needFileNameList)};
|
||||
return {response: this.getProjectInfo(file, needFileNameList), responseRequired: true};
|
||||
},
|
||||
};
|
||||
addProtocolHandler(command: string, handler: (request: protocol.Request) => {response?: any, responseRequired: boolean}) {
|
||||
public addProtocolHandler(command: string, handler: (request: protocol.Request) => {response?: any, responseRequired: boolean}) {
|
||||
if (this.handlers[command]) {
|
||||
throw new Error(`Protocol handler already exists for command "${command}"`);
|
||||
}
|
||||
this.handlers[command] = handler;
|
||||
}
|
||||
|
||||
executeCommand(request: protocol.Request) : {response?: any, responseRequired?: boolean} {
|
||||
public executeCommand(request: protocol.Request) : {response?: any, responseRequired?: boolean} {
|
||||
var handler = this.handlers[request.command];
|
||||
if (handler) {
|
||||
return handler(request);
|
||||
@@ -960,7 +960,7 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
onMessage(message: string) {
|
||||
public onMessage(message: string) {
|
||||
if (this.logger.isVerbose()) {
|
||||
this.logger.info("request: " + message);
|
||||
var start = this.hrtime();
|
||||
|
||||
+182
-94
@@ -48,6 +48,7 @@ namespace ts {
|
||||
getConstructSignatures(): Signature[];
|
||||
getStringIndexType(): Type;
|
||||
getNumberIndexType(): Type;
|
||||
getBaseTypes(): ObjectType[]
|
||||
}
|
||||
|
||||
export interface Signature {
|
||||
@@ -91,6 +92,9 @@ namespace ts {
|
||||
* not happen and the entire document will be re - parsed.
|
||||
*/
|
||||
getChangeRange(oldSnapshot: IScriptSnapshot): TextChangeRange;
|
||||
|
||||
/** Releases all resources held by this script snapshot */
|
||||
dispose?(): void;
|
||||
}
|
||||
|
||||
export module ScriptSnapshot {
|
||||
@@ -679,6 +683,11 @@ namespace ts {
|
||||
getNumberIndexType(): Type {
|
||||
return this.checker.getIndexTypeOfType(this, IndexKind.Number);
|
||||
}
|
||||
getBaseTypes(): ObjectType[] {
|
||||
return this.flags & (TypeFlags.Class | TypeFlags.Interface)
|
||||
? this.checker.getBaseTypes(<TypeObject & InterfaceType>this)
|
||||
: undefined;
|
||||
}
|
||||
}
|
||||
|
||||
class SignatureObject implements Signature {
|
||||
@@ -1102,6 +1111,7 @@ namespace ts {
|
||||
}
|
||||
|
||||
export interface HighlightSpan {
|
||||
fileName?: string;
|
||||
textSpan: TextSpan;
|
||||
kind: string;
|
||||
}
|
||||
@@ -1408,7 +1418,9 @@ namespace ts {
|
||||
* @param fileName The name of the file to be released
|
||||
* @param compilationSettings The compilation settings used to acquire the file
|
||||
*/
|
||||
releaseDocument(fileName: string, compilationSettings: CompilerOptions): void
|
||||
releaseDocument(fileName: string, compilationSettings: CompilerOptions): void;
|
||||
|
||||
reportStats(): string;
|
||||
}
|
||||
|
||||
// TODO: move these to enums
|
||||
@@ -1748,18 +1760,31 @@ namespace ts {
|
||||
sourceFile.version = version;
|
||||
sourceFile.scriptSnapshot = scriptSnapshot;
|
||||
}
|
||||
|
||||
|
||||
export interface TranspileOptions {
|
||||
compilerOptions?: CompilerOptions;
|
||||
fileName?: string;
|
||||
reportDiagnostics?: boolean;
|
||||
moduleName?: string;
|
||||
}
|
||||
|
||||
export interface TranspileOutput {
|
||||
outputText: string;
|
||||
diagnostics?: Diagnostic[];
|
||||
sourceMapText?: string;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function will compile source text from 'input' argument using specified compiler options.
|
||||
* If not options are provided - it will use a set of default compiler options.
|
||||
* Extra compiler options that will unconditionally be used bu this function are:
|
||||
* Extra compiler options that will unconditionally be used by this function are:
|
||||
* - isolatedModules = true
|
||||
* - allowNonTsExtensions = true
|
||||
* - noLib = true
|
||||
* - noResolve = true
|
||||
*/
|
||||
export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string {
|
||||
let options = compilerOptions ? clone(compilerOptions) : getDefaultCompilerOptions();
|
||||
*/
|
||||
export function transpileModule(input: string, transpileOptions?: TranspileOptions): TranspileOutput {
|
||||
let options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions();
|
||||
|
||||
options.isolatedModules = true;
|
||||
|
||||
@@ -1775,23 +1800,30 @@ namespace ts {
|
||||
options.noResolve = true;
|
||||
|
||||
// Parse
|
||||
let inputFileName = fileName || "module.ts";
|
||||
let inputFileName = transpileOptions.fileName || "module.ts";
|
||||
let sourceFile = createSourceFile(inputFileName, input, options.target);
|
||||
if (moduleName) {
|
||||
sourceFile.moduleName = moduleName;
|
||||
if (transpileOptions.moduleName) {
|
||||
sourceFile.moduleName = transpileOptions.moduleName;
|
||||
}
|
||||
|
||||
let newLine = getNewLineCharacter(options);
|
||||
|
||||
// Output
|
||||
let outputText: string;
|
||||
let sourceMapText: string;
|
||||
|
||||
// Create a compilerHost object to allow the compiler to read and write files
|
||||
let compilerHost: CompilerHost = {
|
||||
getSourceFile: (fileName, target) => fileName === inputFileName ? sourceFile : undefined,
|
||||
writeFile: (name, text, writeByteOrderMark) => {
|
||||
Debug.assert(outputText === undefined, "Unexpected multiple outputs for the file: " + name);
|
||||
outputText = text;
|
||||
if (fileExtensionIs(name, ".map")) {
|
||||
Debug.assert(sourceMapText === undefined, `Unexpected multiple source map outputs for the file '${name}'`);
|
||||
sourceMapText = text;
|
||||
}
|
||||
else {
|
||||
Debug.assert(outputText === undefined, "Unexpected multiple outputs for the file: " + name);
|
||||
outputText = text;
|
||||
}
|
||||
},
|
||||
getDefaultLibFileName: () => "lib.d.ts",
|
||||
useCaseSensitiveFileNames: () => false,
|
||||
@@ -1801,16 +1833,29 @@ namespace ts {
|
||||
};
|
||||
|
||||
let program = createProgram([inputFileName], options, compilerHost);
|
||||
|
||||
addRange(/*to*/ diagnostics, /*from*/ program.getSyntacticDiagnostics(sourceFile));
|
||||
addRange(/*to*/ diagnostics, /*from*/ program.getOptionsDiagnostics());
|
||||
|
||||
|
||||
let diagnostics: Diagnostic[];
|
||||
if (transpileOptions.reportDiagnostics) {
|
||||
diagnostics = [];
|
||||
addRange(/*to*/ diagnostics, /*from*/ program.getSyntacticDiagnostics(sourceFile));
|
||||
addRange(/*to*/ diagnostics, /*from*/ program.getOptionsDiagnostics());
|
||||
}
|
||||
// Emit
|
||||
program.emit();
|
||||
|
||||
Debug.assert(outputText !== undefined, "Output generation failed");
|
||||
|
||||
return outputText;
|
||||
return { outputText, diagnostics, sourceMapText };
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a shortcut function for transpileModule - it accepts transpileOptions as parameters and returns only outputText part of the result.
|
||||
*/
|
||||
export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string {
|
||||
let output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName });
|
||||
// addRange correctly handles cases when wither 'from' or 'to' argument is missing
|
||||
addRange(diagnostics, output.diagnostics);
|
||||
return output.outputText;
|
||||
}
|
||||
|
||||
export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile {
|
||||
@@ -1863,6 +1908,16 @@ namespace ts {
|
||||
// after incremental parsing nameTable might not be up-to-date
|
||||
// drop it so it can be lazily recreated later
|
||||
newSourceFile.nameTable = undefined;
|
||||
|
||||
// dispose all resources held by old script snapshot
|
||||
if (sourceFile !== newSourceFile && sourceFile.scriptSnapshot) {
|
||||
if (sourceFile.scriptSnapshot.dispose) {
|
||||
sourceFile.scriptSnapshot.dispose();
|
||||
}
|
||||
|
||||
sourceFile.scriptSnapshot = undefined;
|
||||
}
|
||||
|
||||
return newSourceFile;
|
||||
}
|
||||
}
|
||||
@@ -3015,17 +3070,17 @@ namespace ts {
|
||||
|
||||
function tryGetGlobalSymbols(): boolean {
|
||||
let objectLikeContainer: ObjectLiteralExpression | BindingPattern;
|
||||
let importClause: ImportClause;
|
||||
let namedImportsOrExports: NamedImportsOrExports;
|
||||
let jsxContainer: JsxOpeningLikeElement;
|
||||
|
||||
if (objectLikeContainer = tryGetObjectLikeCompletionContainer(contextToken)) {
|
||||
return tryGetObjectLikeCompletionSymbols(objectLikeContainer);
|
||||
}
|
||||
|
||||
if (importClause = <ImportClause>getAncestor(contextToken, SyntaxKind.ImportClause)) {
|
||||
if (namedImportsOrExports = tryGetNamedImportsOrExportsForCompletion(contextToken)) {
|
||||
// cursor is in an import clause
|
||||
// try to show exported member for imported module
|
||||
return tryGetImportClauseCompletionSymbols(importClause);
|
||||
return tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports);
|
||||
}
|
||||
|
||||
if (jsxContainer = tryGetContainingJsxElement(contextToken)) {
|
||||
@@ -3035,7 +3090,7 @@ namespace ts {
|
||||
attrsType = typeChecker.getJsxElementAttributesType(<JsxOpeningLikeElement>jsxContainer);
|
||||
|
||||
if (attrsType) {
|
||||
symbols = filterJsxAttributes((<JsxOpeningLikeElement>jsxContainer).attributes, typeChecker.getPropertiesOfType(attrsType));
|
||||
symbols = filterJsxAttributes(typeChecker.getPropertiesOfType(attrsType), (<JsxOpeningLikeElement>jsxContainer).attributes);
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
return true;
|
||||
@@ -3104,24 +3159,12 @@ namespace ts {
|
||||
function isCompletionListBlocker(contextToken: Node): boolean {
|
||||
let start = new Date().getTime();
|
||||
let result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) ||
|
||||
isIdentifierDefinitionLocation(contextToken) ||
|
||||
isSolelyIdentifierDefinitionLocation(contextToken) ||
|
||||
isDotOfNumericLiteral(contextToken);
|
||||
log("getCompletionsAtPosition: isCompletionListBlocker: " + (new Date().getTime() - start));
|
||||
return result;
|
||||
}
|
||||
|
||||
function shouldShowCompletionsInImportsClause(node: Node): boolean {
|
||||
if (node) {
|
||||
// import {|
|
||||
// import {a,|
|
||||
if (node.kind === SyntaxKind.OpenBraceToken || node.kind === SyntaxKind.CommaToken) {
|
||||
return node.parent.kind === SyntaxKind.NamedImports;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function isNewIdentifierDefinitionLocation(previousToken: Node): boolean {
|
||||
if (previousToken) {
|
||||
let containingNodeKind = previousToken.parent.kind;
|
||||
@@ -3233,8 +3276,19 @@ namespace ts {
|
||||
// We are *only* completing on properties from the type being destructured.
|
||||
isNewIdentifierLocation = false;
|
||||
|
||||
typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer);
|
||||
existingMembers = (<BindingPattern>objectLikeContainer).elements;
|
||||
let rootDeclaration = getRootDeclaration(objectLikeContainer.parent);
|
||||
if (isVariableLike(rootDeclaration)) {
|
||||
// We don't want to complete using the type acquired by the shape
|
||||
// of the binding pattern; we are only interested in types acquired
|
||||
// through type declaration or inference.
|
||||
if (rootDeclaration.initializer || rootDeclaration.type) {
|
||||
typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer);
|
||||
existingMembers = (<BindingPattern>objectLikeContainer).elements;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Debug.fail("Root declaration is not variable-like.")
|
||||
}
|
||||
}
|
||||
else {
|
||||
Debug.fail("Expected object literal or binding pattern, got " + objectLikeContainer.kind);
|
||||
@@ -3253,38 +3307,42 @@ namespace ts {
|
||||
}
|
||||
|
||||
/**
|
||||
* Aggregates relevant symbols for completion in import clauses; for instance,
|
||||
* Aggregates relevant symbols for completion in import clauses and export clauses
|
||||
* whose declarations have a module specifier; for instance, symbols will be aggregated for
|
||||
*
|
||||
* import { $ } from "moduleName";
|
||||
* import { | } from "moduleName";
|
||||
* export { a as foo, | } from "moduleName";
|
||||
*
|
||||
* but not for
|
||||
*
|
||||
* export { | };
|
||||
*
|
||||
* Relevant symbols are stored in the captured 'symbols' variable.
|
||||
*
|
||||
* @returns true if 'symbols' was successfully populated; false otherwise.
|
||||
*/
|
||||
function tryGetImportClauseCompletionSymbols(importClause: ImportClause): boolean {
|
||||
// cursor is in import clause
|
||||
// try to show exported member for imported module
|
||||
if (shouldShowCompletionsInImportsClause(contextToken)) {
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports: NamedImportsOrExports): boolean {
|
||||
let declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ?
|
||||
SyntaxKind.ImportDeclaration :
|
||||
SyntaxKind.ExportDeclaration;
|
||||
let importOrExportDeclaration = <ImportDeclaration | ExportDeclaration>getAncestor(namedImportsOrExports, declarationKind);
|
||||
let moduleSpecifier = importOrExportDeclaration.moduleSpecifier;
|
||||
|
||||
let importDeclaration = <ImportDeclaration>importClause.parent;
|
||||
Debug.assert(importDeclaration !== undefined && importDeclaration.kind === SyntaxKind.ImportDeclaration);
|
||||
|
||||
let exports: Symbol[];
|
||||
let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
|
||||
//let exports = typeInfoResolver.getExportsOfImportDeclaration(importDeclaration);
|
||||
symbols = exports ? filterModuleExports(exports, importDeclaration) : emptyArray;
|
||||
if (!moduleSpecifier) {
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
isMemberCompletion = false;
|
||||
isNewIdentifierLocation = true;
|
||||
|
||||
isMemberCompletion = true;
|
||||
isNewIdentifierLocation = false;
|
||||
|
||||
let exports: Symbol[];
|
||||
let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier);
|
||||
if (moduleSpecifierSymbol) {
|
||||
exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol);
|
||||
}
|
||||
|
||||
symbols = exports ? filterNamedImportOrExportCompletionItems(exports, namedImportsOrExports.elements) : emptyArray;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3308,6 +3366,26 @@ namespace ts {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the containing list of named imports or exports of a context token,
|
||||
* on the condition that one exists and that the context implies completion should be given.
|
||||
*/
|
||||
function tryGetNamedImportsOrExportsForCompletion(contextToken: Node): NamedImportsOrExports {
|
||||
if (contextToken) {
|
||||
switch (contextToken.kind) {
|
||||
case SyntaxKind.OpenBraceToken: // import { |
|
||||
case SyntaxKind.CommaToken: // import { a as 0, |
|
||||
switch (contextToken.parent.kind) {
|
||||
case SyntaxKind.NamedImports:
|
||||
case SyntaxKind.NamedExports:
|
||||
return <NamedImportsOrExports>contextToken.parent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
function tryGetContainingJsxElement(contextToken: Node): JsxOpeningLikeElement {
|
||||
if (contextToken) {
|
||||
let parent = contextToken.parent;
|
||||
@@ -3355,7 +3433,10 @@ namespace ts {
|
||||
return false;
|
||||
}
|
||||
|
||||
function isIdentifierDefinitionLocation(contextToken: Node): boolean {
|
||||
/**
|
||||
* @returns true if we are certain that the currently edited location must define a new location; false otherwise.
|
||||
*/
|
||||
function isSolelyIdentifierDefinitionLocation(contextToken: Node): boolean {
|
||||
let containingNodeKind = contextToken.parent.kind;
|
||||
switch (contextToken.kind) {
|
||||
case SyntaxKind.CommaToken:
|
||||
@@ -3412,6 +3493,11 @@ namespace ts {
|
||||
case SyntaxKind.ProtectedKeyword:
|
||||
return containingNodeKind === SyntaxKind.Parameter;
|
||||
|
||||
case SyntaxKind.AsKeyword:
|
||||
containingNodeKind === SyntaxKind.ImportSpecifier ||
|
||||
containingNodeKind === SyntaxKind.ExportSpecifier ||
|
||||
containingNodeKind === SyntaxKind.NamespaceImport;
|
||||
|
||||
case SyntaxKind.ClassKeyword:
|
||||
case SyntaxKind.EnumKeyword:
|
||||
case SyntaxKind.InterfaceKeyword:
|
||||
@@ -3453,33 +3539,41 @@ namespace ts {
|
||||
return false;
|
||||
}
|
||||
|
||||
function filterModuleExports(exports: Symbol[], importDeclaration: ImportDeclaration): Symbol[] {
|
||||
let exisingImports: Map<boolean> = {};
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @param exportsOfModule The list of symbols which a module exposes.
|
||||
* @param namedImportsOrExports The list of existing import/export specifiers in the import/export clause.
|
||||
*
|
||||
* @returns Symbols to be suggested at an import/export clause, barring those whose named imports/exports
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterNamedImportOrExportCompletionItems(exportsOfModule: Symbol[], namedImportsOrExports: ImportOrExportSpecifier[]): Symbol[] {
|
||||
let exisingImportsOrExports: Map<boolean> = {};
|
||||
|
||||
if (!importDeclaration.importClause) {
|
||||
return exports;
|
||||
for (let element of namedImportsOrExports) {
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (element.getStart() <= position && position <= element.getEnd()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let name = element.propertyName || element.name;
|
||||
exisingImportsOrExports[name.text] = true;
|
||||
}
|
||||
|
||||
if (importDeclaration.importClause.namedBindings &&
|
||||
importDeclaration.importClause.namedBindings.kind === SyntaxKind.NamedImports) {
|
||||
|
||||
forEach((<NamedImports>importDeclaration.importClause.namedBindings).elements, el => {
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
if (el.getStart() <= position && position <= el.getEnd()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let name = el.propertyName || el.name;
|
||||
exisingImports[name.text] = true;
|
||||
});
|
||||
if (isEmpty(exisingImportsOrExports)) {
|
||||
return exportsOfModule;
|
||||
}
|
||||
|
||||
if (isEmpty(exisingImports)) {
|
||||
return exports;
|
||||
}
|
||||
return filter(exports, e => !lookUp(exisingImports, e.name));
|
||||
return filter(exportsOfModule, e => !lookUp(exisingImportsOrExports, e.name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Filters out completion suggestions for named imports or exports.
|
||||
*
|
||||
* @returns Symbols to be suggested in an object binding pattern or object literal expression, barring those whose declarations
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterObjectMembersList(contextualMemberSymbols: Symbol[], existingMembers: Declaration[]): Symbol[] {
|
||||
if (!existingMembers || existingMembers.length === 0) {
|
||||
return contextualMemberSymbols;
|
||||
@@ -3514,17 +3608,16 @@ namespace ts {
|
||||
existingMemberNames[existingName] = true;
|
||||
}
|
||||
|
||||
let filteredMembers: Symbol[] = [];
|
||||
forEach(contextualMemberSymbols, s => {
|
||||
if (!existingMemberNames[s.name]) {
|
||||
filteredMembers.push(s);
|
||||
}
|
||||
});
|
||||
|
||||
return filteredMembers;
|
||||
return filter(contextualMemberSymbols, m => !lookUp(existingMemberNames, m.name));
|
||||
}
|
||||
|
||||
function filterJsxAttributes(attributes: NodeArray<JsxAttribute | JsxSpreadAttribute>, symbols: Symbol[]): Symbol[] {
|
||||
/**
|
||||
* Filters out completion suggestions from 'symbols' according to existing JSX attributes.
|
||||
*
|
||||
* @returns Symbols to be suggested in a JSX element, barring those whose attributes
|
||||
* do not occur at the current position and have not otherwise been typed.
|
||||
*/
|
||||
function filterJsxAttributes(symbols: Symbol[], attributes: NodeArray<JsxAttribute | JsxSpreadAttribute>): Symbol[] {
|
||||
let seenNames: Map<boolean> = {};
|
||||
for (let attr of attributes) {
|
||||
// If this is the current item we are editing right now, do not filter it out
|
||||
@@ -3536,13 +3629,8 @@ namespace ts {
|
||||
seenNames[(<JsxAttribute>attr).name.text] = true;
|
||||
}
|
||||
}
|
||||
let result: Symbol[] = [];
|
||||
for (let sym of symbols) {
|
||||
if (!seenNames[sym.name]) {
|
||||
result.push(sym);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
|
||||
return filter(symbols, a => !lookUp(seenNames, a.name));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+32
-6
@@ -34,6 +34,9 @@ namespace ts {
|
||||
* Or undefined value if there was no change.
|
||||
*/
|
||||
getChangeRange(oldSnapshot: ScriptSnapshotShim): string;
|
||||
|
||||
/** Releases all resources held by this script snapshot */
|
||||
dispose?(): void;
|
||||
}
|
||||
|
||||
export interface Logger {
|
||||
@@ -61,8 +64,13 @@ namespace ts {
|
||||
|
||||
/** Public interface of the the of a config service shim instance.*/
|
||||
export interface CoreServicesShimHost extends Logger {
|
||||
/** Returns a JSON-encoded value of the type: string[] */
|
||||
readDirectory(rootDir: string, extension: string): string;
|
||||
/**
|
||||
* Returns a JSON-encoded value of the type: string[]
|
||||
*
|
||||
* @param exclude A JSON encoded string[] containing the paths to exclude
|
||||
* when enumerating the directory.
|
||||
*/
|
||||
readDirectory(rootDir: string, extension: string, exclude?: string): string;
|
||||
}
|
||||
|
||||
///
|
||||
@@ -243,6 +251,14 @@ namespace ts {
|
||||
return createTextChangeRange(
|
||||
createTextSpan(decoded.span.start, decoded.span.length), decoded.newLength);
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
// if scriptSnapshotShim is a COM object then property check becomes method call with no arguments
|
||||
// 'in' does not have this effect
|
||||
if ("dispose" in this.scriptSnapshotShim) {
|
||||
this.scriptSnapshotShim.dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class LanguageServiceShimHostAdapter implements LanguageServiceHost {
|
||||
@@ -375,8 +391,18 @@ namespace ts {
|
||||
constructor(private shimHost: CoreServicesShimHost) {
|
||||
}
|
||||
|
||||
public readDirectory(rootDir: string, extension: string): string[] {
|
||||
var encoded = this.shimHost.readDirectory(rootDir, extension);
|
||||
public readDirectory(rootDir: string, extension: string, exclude: string[]): string[] {
|
||||
// Wrap the API changes for 1.5 release. This try/catch
|
||||
// should be removed once TypeScript 1.5 has shipped.
|
||||
// Also consider removing the optional designation for
|
||||
// the exclude param at this time.
|
||||
var encoded: string;
|
||||
try {
|
||||
encoded = this.shimHost.readDirectory(rootDir, extension, JSON.stringify(exclude));
|
||||
}
|
||||
catch (e) {
|
||||
encoded = this.shimHost.readDirectory(rootDir, extension);
|
||||
}
|
||||
return JSON.parse(encoded);
|
||||
}
|
||||
}
|
||||
@@ -428,11 +454,11 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
export function realizeDiagnostics(diagnostics: Diagnostic[], newLine: string): { message: string; start: number; length: number; category: string; } []{
|
||||
export function realizeDiagnostics(diagnostics: Diagnostic[], newLine: string): { message: string; start: number; length: number; category: string; code: number; } []{
|
||||
return diagnostics.map(d => realizeDiagnostic(d, newLine));
|
||||
}
|
||||
|
||||
function realizeDiagnostic(diagnostic: Diagnostic, newLine: string): { message: string; start: number; length: number; category: string; } {
|
||||
function realizeDiagnostic(diagnostic: Diagnostic, newLine: string): { message: string; start: number; length: number; category: string; code: number; } {
|
||||
return {
|
||||
message: flattenDiagnosticMessageText(diagnostic.messageText, newLine),
|
||||
start: diagnostic.start,
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,6): error TS2461: Type 'string | number' is not an array type.
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,6): error TS2461: Type 'number | string' is not an array type.
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,7): error TS2322: Type 'number' is not assignable to type 'string'.
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,14): error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
|
||||
@@ -8,7 +8,7 @@ tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,14): error
|
||||
var tuple: [number, string] = [2, "3"];
|
||||
for ([a = 1, b = ""] of tuple) {
|
||||
~~~~~~~~~~~~~~~
|
||||
!!! error TS2461: Type 'string | number' is not an array type.
|
||||
!!! error TS2461: Type 'number | string' is not an array type.
|
||||
~
|
||||
!!! error TS2322: Type 'number' is not assignable to type 'string'.
|
||||
~
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts(3,6): error TS2322: Type 'string | number' is not assignable to type 'string'.
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts(3,6): error TS2322: Type 'number | string' is not assignable to type 'string'.
|
||||
Type 'number' is not assignable to type 'string'.
|
||||
|
||||
|
||||
@@ -7,5 +7,5 @@ tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts(3,6)
|
||||
var v: string;
|
||||
for (v of union) { }
|
||||
~
|
||||
!!! error TS2322: Type 'string | number' is not assignable to type 'string'.
|
||||
!!! error TS2322: Type 'number | string' is not assignable to type 'string'.
|
||||
!!! error TS2322: Type 'number' is not assignable to type 'string'.
|
||||
@@ -3,6 +3,6 @@ var union: string | number[];
|
||||
>union : string | number[]
|
||||
|
||||
for (var v of union) { }
|
||||
>v : string | number
|
||||
>v : number | string
|
||||
>union : string | number[]
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts(2,15): error TS2461: Type 'number | symbol | string[]' is not an array type.
|
||||
tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts(2,15): error TS2461: Type 'string[] | number | symbol' is not an array type.
|
||||
|
||||
|
||||
==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts (1 errors) ====
|
||||
var union: string | string[] | number | symbol;
|
||||
for (let v of union) { }
|
||||
~~~~~
|
||||
!!! error TS2461: Type 'number | symbol | string[]' is not an array type.
|
||||
!!! error TS2461: Type 'string[] | number | symbol' is not an array type.
|
||||
@@ -6,14 +6,14 @@ enum Color { R, G, B }
|
||||
>B : Color
|
||||
|
||||
function f1(x: Color | string) {
|
||||
>f1 : (x: string | Color) => void
|
||||
>x : string | Color
|
||||
>f1 : (x: Color | string) => void
|
||||
>x : Color | string
|
||||
>Color : Color
|
||||
|
||||
if (typeof x === "number") {
|
||||
>typeof x === "number" : boolean
|
||||
>typeof x : string
|
||||
>x : string | Color
|
||||
>x : Color | string
|
||||
>"number" : string
|
||||
|
||||
var y = x;
|
||||
@@ -35,14 +35,14 @@ function f1(x: Color | string) {
|
||||
}
|
||||
|
||||
function f2(x: Color | string | string[]) {
|
||||
>f2 : (x: string | Color | string[]) => void
|
||||
>x : string | Color | string[]
|
||||
>f2 : (x: Color | string | string[]) => void
|
||||
>x : Color | string | string[]
|
||||
>Color : Color
|
||||
|
||||
if (typeof x === "object") {
|
||||
>typeof x === "object" : boolean
|
||||
>typeof x : string
|
||||
>x : string | Color | string[]
|
||||
>x : Color | string | string[]
|
||||
>"object" : string
|
||||
|
||||
var y = x;
|
||||
@@ -55,7 +55,7 @@ function f2(x: Color | string | string[]) {
|
||||
if (typeof x === "number") {
|
||||
>typeof x === "number" : boolean
|
||||
>typeof x : string
|
||||
>x : string | Color | string[]
|
||||
>x : Color | string | string[]
|
||||
>"number" : string
|
||||
|
||||
var z = x;
|
||||
@@ -77,7 +77,7 @@ function f2(x: Color | string | string[]) {
|
||||
if (typeof x === "string") {
|
||||
>typeof x === "string" : boolean
|
||||
>typeof x : string
|
||||
>x : string | Color | string[]
|
||||
>x : Color | string | string[]
|
||||
>"string" : string
|
||||
|
||||
var a = x;
|
||||
|
||||
@@ -34,7 +34,7 @@ var d2: IHasVisualizationModel = i || moduleA;
|
||||
var d2: IHasVisualizationModel = moduleA || i;
|
||||
>d2 : IHasVisualizationModel
|
||||
>IHasVisualizationModel : IHasVisualizationModel
|
||||
>moduleA || i : IHasVisualizationModel
|
||||
>moduleA || i : typeof moduleA
|
||||
>moduleA : typeof moduleA
|
||||
>i : IHasVisualizationModel
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
tests/cases/compiler/aliasesInSystemModule1.ts(2,24): error TS2307: Cannot find module 'foo'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/aliasesInSystemModule1.ts (1 errors) ====
|
||||
|
||||
import alias = require('foo');
|
||||
~~~~~
|
||||
!!! error TS2307: Cannot find module 'foo'.
|
||||
import cls = alias.Class;
|
||||
export import cls2 = alias.Class;
|
||||
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
|
||||
module M {
|
||||
export import cls = alias.Class;
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
//// [aliasesInSystemModule1.ts]
|
||||
|
||||
import alias = require('foo');
|
||||
import cls = alias.Class;
|
||||
export import cls2 = alias.Class;
|
||||
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
|
||||
module M {
|
||||
export import cls = alias.Class;
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
}
|
||||
|
||||
|
||||
//// [aliasesInSystemModule1.js]
|
||||
System.register(['foo'], function(exports_1) {
|
||||
var alias;
|
||||
var cls, cls2, x, y, z, M;
|
||||
return {
|
||||
setters:[
|
||||
function (_alias) {
|
||||
alias = _alias;
|
||||
}],
|
||||
execute: function() {
|
||||
cls = alias.Class;
|
||||
exports_1("cls2", cls2 = alias.Class);
|
||||
x = new alias.Class();
|
||||
y = new cls();
|
||||
z = new cls2();
|
||||
(function (M) {
|
||||
M.cls = alias.Class;
|
||||
var x = new alias.Class();
|
||||
var y = new M.cls();
|
||||
var z = new cls2();
|
||||
})(M || (M = {}));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
tests/cases/compiler/aliasesInSystemModule2.ts(2,21): error TS2307: Cannot find module 'foo'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/aliasesInSystemModule2.ts (1 errors) ====
|
||||
|
||||
import {alias} from "foo";
|
||||
~~~~~
|
||||
!!! error TS2307: Cannot find module 'foo'.
|
||||
import cls = alias.Class;
|
||||
export import cls2 = alias.Class;
|
||||
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
|
||||
module M {
|
||||
export import cls = alias.Class;
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
//// [aliasesInSystemModule2.ts]
|
||||
|
||||
import {alias} from "foo";
|
||||
import cls = alias.Class;
|
||||
export import cls2 = alias.Class;
|
||||
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
|
||||
module M {
|
||||
export import cls = alias.Class;
|
||||
let x = new alias.Class();
|
||||
let y = new cls();
|
||||
let z = new cls2();
|
||||
}
|
||||
|
||||
//// [aliasesInSystemModule2.js]
|
||||
System.register(["foo"], function(exports_1) {
|
||||
var foo_1;
|
||||
var cls, cls2, x, y, z, M;
|
||||
return {
|
||||
setters:[
|
||||
function (_foo_1) {
|
||||
foo_1 = _foo_1;
|
||||
}],
|
||||
execute: function() {
|
||||
cls = foo_1.alias.Class;
|
||||
exports_1("cls2", cls2 = foo_1.alias.Class);
|
||||
x = new foo_1.alias.Class();
|
||||
y = new cls();
|
||||
z = new cls2();
|
||||
(function (M) {
|
||||
M.cls = foo_1.alias.Class;
|
||||
var x = new foo_1.alias.Class();
|
||||
var y = new M.cls();
|
||||
var z = new cls2();
|
||||
})(M || (M = {}));
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(13,12): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'.
|
||||
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(14,12): error TS2460: Type 'StrNum' has no property '2'.
|
||||
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,5): error TS2461: Type '{ 0: string; 1: number; }' is not an array type.
|
||||
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,12): error TS2460: Type '{ 0: string; 1: number; }' has no property '2'.
|
||||
tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(16,5): error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'.
|
||||
Types of property '0' are incompatible.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
@@ -46,7 +47,7 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (18 errors) ====
|
||||
==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (19 errors) ====
|
||||
interface StrNum extends Array<string|number> {
|
||||
0: string;
|
||||
1: number;
|
||||
@@ -68,6 +69,8 @@ tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error
|
||||
var [g, h, i] = z;
|
||||
~~~~~~~~~
|
||||
!!! error TS2461: Type '{ 0: string; 1: number; }' is not an array type.
|
||||
~
|
||||
!!! error TS2460: Type '{ 0: string; 1: number; }' has no property '2'.
|
||||
var j1: [number, number, number] = x;
|
||||
~~
|
||||
!!! error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'.
|
||||
|
||||
@@ -294,8 +294,8 @@ module EmptyTypes {
|
||||
|
||||
// Order matters here so test all the variants
|
||||
var a1 = [{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }];
|
||||
>a1 : { x: any; y: string; }[]
|
||||
>[{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }] : { x: any; y: string; }[]
|
||||
>a1 : ({ x: number; y: string; } | { x: string; y: string; } | { x: any; y: string; })[]
|
||||
>[{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }] : ({ x: number; y: string; } | { x: string; y: string; } | { x: any; y: string; })[]
|
||||
>{ x: 0, y: 'a' } : { x: number; y: string; }
|
||||
>x : number
|
||||
>0 : number
|
||||
@@ -313,8 +313,8 @@ module EmptyTypes {
|
||||
>'a' : string
|
||||
|
||||
var a2 = [{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }];
|
||||
>a2 : { x: any; y: string; }[]
|
||||
>[{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }] : { x: any; y: string; }[]
|
||||
>a2 : ({ x: any; y: string; } | { x: number; y: string; } | { x: string; y: string; })[]
|
||||
>[{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }] : ({ x: any; y: string; } | { x: number; y: string; } | { x: string; y: string; })[]
|
||||
>{ x: anyObj, y: 'a' } : { x: any; y: string; }
|
||||
>x : any
|
||||
>anyObj : any
|
||||
@@ -332,8 +332,8 @@ module EmptyTypes {
|
||||
>'a' : string
|
||||
|
||||
var a3 = [{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }];
|
||||
>a3 : { x: any; y: string; }[]
|
||||
>[{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }] : { x: any; y: string; }[]
|
||||
>a3 : ({ x: number; y: string; } | { x: any; y: string; } | { x: string; y: string; })[]
|
||||
>[{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }] : ({ x: number; y: string; } | { x: any; y: string; } | { x: string; y: string; })[]
|
||||
>{ x: 0, y: 'a' } : { x: number; y: string; }
|
||||
>x : number
|
||||
>0 : number
|
||||
@@ -366,22 +366,22 @@ module EmptyTypes {
|
||||
>base2 : typeof base2
|
||||
|
||||
var b1 = [baseObj, base2Obj, ifaceObj];
|
||||
>b1 : iface[]
|
||||
>[baseObj, base2Obj, ifaceObj] : iface[]
|
||||
>b1 : base[]
|
||||
>[baseObj, base2Obj, ifaceObj] : base[]
|
||||
>baseObj : base
|
||||
>base2Obj : base2
|
||||
>ifaceObj : iface
|
||||
|
||||
var b2 = [base2Obj, baseObj, ifaceObj];
|
||||
>b2 : iface[]
|
||||
>[base2Obj, baseObj, ifaceObj] : iface[]
|
||||
>b2 : base2[]
|
||||
>[base2Obj, baseObj, ifaceObj] : base2[]
|
||||
>base2Obj : base2
|
||||
>baseObj : base
|
||||
>ifaceObj : iface
|
||||
|
||||
var b3 = [baseObj, ifaceObj, base2Obj];
|
||||
>b3 : iface[]
|
||||
>[baseObj, ifaceObj, base2Obj] : iface[]
|
||||
>b3 : base[]
|
||||
>[baseObj, ifaceObj, base2Obj] : base[]
|
||||
>baseObj : base
|
||||
>ifaceObj : iface
|
||||
>base2Obj : base2
|
||||
@@ -639,7 +639,7 @@ module NonEmptyTypes {
|
||||
>x : number
|
||||
>y : base
|
||||
>base : base
|
||||
>[{ x: 7, y: new derived() }, { x: 5, y: new base() }] : { x: number; y: base; }[]
|
||||
>[{ x: 7, y: new derived() }, { x: 5, y: new base() }] : ({ x: number; y: derived; } | { x: number; y: base; })[]
|
||||
>{ x: 7, y: new derived() } : { x: number; y: derived; }
|
||||
>x : number
|
||||
>7 : number
|
||||
@@ -658,7 +658,7 @@ module NonEmptyTypes {
|
||||
>x : boolean
|
||||
>y : base
|
||||
>base : base
|
||||
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : { x: boolean; y: base; }[]
|
||||
>[{ x: true, y: new derived() }, { x: false, y: new base() }] : ({ x: boolean; y: derived; } | { x: boolean; y: base; })[]
|
||||
>{ x: true, y: new derived() } : { x: boolean; y: derived; }
|
||||
>x : boolean
|
||||
>true : boolean
|
||||
@@ -697,8 +697,8 @@ module NonEmptyTypes {
|
||||
|
||||
// Order matters here so test all the variants
|
||||
var a1 = [{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }];
|
||||
>a1 : { x: any; y: string; }[]
|
||||
>[{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }] : { x: any; y: string; }[]
|
||||
>a1 : ({ x: number; y: string; } | { x: string; y: string; } | { x: any; y: string; })[]
|
||||
>[{ x: 0, y: 'a' }, { x: 'a', y: 'a' }, { x: anyObj, y: 'a' }] : ({ x: number; y: string; } | { x: string; y: string; } | { x: any; y: string; })[]
|
||||
>{ x: 0, y: 'a' } : { x: number; y: string; }
|
||||
>x : number
|
||||
>0 : number
|
||||
@@ -716,8 +716,8 @@ module NonEmptyTypes {
|
||||
>'a' : string
|
||||
|
||||
var a2 = [{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }];
|
||||
>a2 : { x: any; y: string; }[]
|
||||
>[{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }] : { x: any; y: string; }[]
|
||||
>a2 : ({ x: any; y: string; } | { x: number; y: string; } | { x: string; y: string; })[]
|
||||
>[{ x: anyObj, y: 'a' }, { x: 0, y: 'a' }, { x: 'a', y: 'a' }] : ({ x: any; y: string; } | { x: number; y: string; } | { x: string; y: string; })[]
|
||||
>{ x: anyObj, y: 'a' } : { x: any; y: string; }
|
||||
>x : any
|
||||
>anyObj : any
|
||||
@@ -735,8 +735,8 @@ module NonEmptyTypes {
|
||||
>'a' : string
|
||||
|
||||
var a3 = [{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }];
|
||||
>a3 : { x: any; y: string; }[]
|
||||
>[{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }] : { x: any; y: string; }[]
|
||||
>a3 : ({ x: number; y: string; } | { x: any; y: string; } | { x: string; y: string; })[]
|
||||
>[{ x: 0, y: 'a' }, { x: anyObj, y: 'a' }, { x: 'a', y: 'a' }] : ({ x: number; y: string; } | { x: any; y: string; } | { x: string; y: string; })[]
|
||||
>{ x: 0, y: 'a' } : { x: number; y: string; }
|
||||
>x : number
|
||||
>0 : number
|
||||
@@ -769,29 +769,29 @@ module NonEmptyTypes {
|
||||
>base2 : typeof base2
|
||||
|
||||
var b1 = [baseObj, base2Obj, ifaceObj];
|
||||
>b1 : iface[]
|
||||
>[baseObj, base2Obj, ifaceObj] : iface[]
|
||||
>b1 : (base | base2 | iface)[]
|
||||
>[baseObj, base2Obj, ifaceObj] : (base | base2 | iface)[]
|
||||
>baseObj : base
|
||||
>base2Obj : base2
|
||||
>ifaceObj : iface
|
||||
|
||||
var b2 = [base2Obj, baseObj, ifaceObj];
|
||||
>b2 : iface[]
|
||||
>[base2Obj, baseObj, ifaceObj] : iface[]
|
||||
>b2 : (base2 | base | iface)[]
|
||||
>[base2Obj, baseObj, ifaceObj] : (base2 | base | iface)[]
|
||||
>base2Obj : base2
|
||||
>baseObj : base
|
||||
>ifaceObj : iface
|
||||
|
||||
var b3 = [baseObj, ifaceObj, base2Obj];
|
||||
>b3 : iface[]
|
||||
>[baseObj, ifaceObj, base2Obj] : iface[]
|
||||
>b3 : (base | iface | base2)[]
|
||||
>[baseObj, ifaceObj, base2Obj] : (base | iface | base2)[]
|
||||
>baseObj : base
|
||||
>ifaceObj : iface
|
||||
>base2Obj : base2
|
||||
|
||||
var b4 = [ifaceObj, baseObj, base2Obj];
|
||||
>b4 : iface[]
|
||||
>[ifaceObj, baseObj, base2Obj] : iface[]
|
||||
>b4 : (iface | base | base2)[]
|
||||
>[ifaceObj, baseObj, base2Obj] : (iface | base | base2)[]
|
||||
>ifaceObj : iface
|
||||
>baseObj : base
|
||||
>base2Obj : base2
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
tests/cases/compiler/arrayCast.ts(3,1): error TS2352: Neither type '{ foo: string; }[]' nor type '{ id: number; }[]' is assignable to the other.
|
||||
Type '{ foo: string; }' is not assignable to type '{ id: number; }'.
|
||||
Property 'id' is missing in type '{ foo: string; }'.
|
||||
Object literal may only specify known properties, and 'foo' does not exist in type '{ id: number; }'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/arrayCast.ts (1 errors) ====
|
||||
@@ -10,7 +10,7 @@ tests/cases/compiler/arrayCast.ts(3,1): error TS2352: Neither type '{ foo: strin
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2352: Neither type '{ foo: string; }[]' nor type '{ id: number; }[]' is assignable to the other.
|
||||
!!! error TS2352: Type '{ foo: string; }' is not assignable to type '{ id: number; }'.
|
||||
!!! error TS2352: Property 'id' is missing in type '{ foo: string; }'.
|
||||
!!! error TS2352: Object literal may only specify known properties, and 'foo' does not exist in type '{ id: number; }'.
|
||||
|
||||
// Should succeed, as the {} element causes the type of the array to be {}[]
|
||||
<{ id: number; }[]>[{ foo: "s" }, {}];
|
||||
@@ -1,7 +1,7 @@
|
||||
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(8,5): error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'.
|
||||
Types of property 'pop' are incompatible.
|
||||
Type '() => string | number' is not assignable to type '() => number'.
|
||||
Type 'string | number' is not assignable to type 'number'.
|
||||
Type '() => number | string' is not assignable to type '() => number'.
|
||||
Type 'number | string' is not assignable to type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(14,5): error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'.
|
||||
Property '0' is missing in type 'number[]'.
|
||||
@@ -19,8 +19,8 @@ tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionConte
|
||||
~~~~
|
||||
!!! error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'.
|
||||
!!! error TS2322: Types of property 'pop' are incompatible.
|
||||
!!! error TS2322: Type '() => string | number' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'string | number' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type '() => number | string' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'number | string' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
|
||||
// In a contextually typed array literal expression containing one or more spread elements,
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
tests/cases/compiler/arrayLiteralTypeInference.ts(13,5): error TS2322: Type '({ id: number; trueness: boolean; } | { id: number; name: string; })[]' is not assignable to type 'Action[]'.
|
||||
Type '{ id: number; trueness: boolean; } | { id: number; name: string; }' is not assignable to type 'Action'.
|
||||
Type '{ id: number; trueness: boolean; }' is not assignable to type 'Action'.
|
||||
Object literal may only specify known properties, and 'trueness' does not exist in type 'Action'.
|
||||
tests/cases/compiler/arrayLiteralTypeInference.ts(29,5): error TS2322: Type '({ id: number; trueness: boolean; } | { id: number; name: string; })[]' is not assignable to type '{ id: number; }[]'.
|
||||
Type '{ id: number; trueness: boolean; } | { id: number; name: string; }' is not assignable to type '{ id: number; }'.
|
||||
Type '{ id: number; trueness: boolean; }' is not assignable to type '{ id: number; }'.
|
||||
Object literal may only specify known properties, and 'trueness' does not exist in type '{ id: number; }'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/arrayLiteralTypeInference.ts (2 errors) ====
|
||||
class Action {
|
||||
id: number;
|
||||
}
|
||||
|
||||
class ActionA extends Action {
|
||||
value: string;
|
||||
}
|
||||
|
||||
class ActionB extends Action {
|
||||
trueNess: boolean;
|
||||
}
|
||||
|
||||
var x1: Action[] = [
|
||||
~~
|
||||
!!! error TS2322: Type '({ id: number; trueness: boolean; } | { id: number; name: string; })[]' is not assignable to type 'Action[]'.
|
||||
!!! error TS2322: Type '{ id: number; trueness: boolean; } | { id: number; name: string; }' is not assignable to type 'Action'.
|
||||
!!! error TS2322: Type '{ id: number; trueness: boolean; }' is not assignable to type 'Action'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'trueness' does not exist in type 'Action'.
|
||||
{ id: 2, trueness: false },
|
||||
{ id: 3, name: "three" }
|
||||
]
|
||||
|
||||
var x2: Action[] = [
|
||||
new ActionA(),
|
||||
new ActionB()
|
||||
]
|
||||
|
||||
var x3: Action[] = [
|
||||
new Action(),
|
||||
new ActionA(),
|
||||
new ActionB()
|
||||
]
|
||||
|
||||
var z1: { id: number }[] =
|
||||
~~
|
||||
!!! error TS2322: Type '({ id: number; trueness: boolean; } | { id: number; name: string; })[]' is not assignable to type '{ id: number; }[]'.
|
||||
!!! error TS2322: Type '{ id: number; trueness: boolean; } | { id: number; name: string; }' is not assignable to type '{ id: number; }'.
|
||||
!!! error TS2322: Type '{ id: number; trueness: boolean; }' is not assignable to type '{ id: number; }'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'trueness' does not exist in type '{ id: number; }'.
|
||||
[
|
||||
{ id: 2, trueness: false },
|
||||
{ id: 3, name: "three" }
|
||||
]
|
||||
|
||||
var z2: { id: number }[] =
|
||||
[
|
||||
new ActionA(),
|
||||
new ActionB()
|
||||
]
|
||||
|
||||
var z3: { id: number }[] =
|
||||
[
|
||||
new Action(),
|
||||
new ActionA(),
|
||||
new ActionB()
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,113 +0,0 @@
|
||||
=== tests/cases/compiler/arrayLiteralTypeInference.ts ===
|
||||
class Action {
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
id: number;
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 0, 14))
|
||||
}
|
||||
|
||||
class ActionA extends Action {
|
||||
>ActionA : Symbol(ActionA, Decl(arrayLiteralTypeInference.ts, 2, 1))
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
value: string;
|
||||
>value : Symbol(value, Decl(arrayLiteralTypeInference.ts, 4, 30))
|
||||
}
|
||||
|
||||
class ActionB extends Action {
|
||||
>ActionB : Symbol(ActionB, Decl(arrayLiteralTypeInference.ts, 6, 1))
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
trueNess: boolean;
|
||||
>trueNess : Symbol(trueNess, Decl(arrayLiteralTypeInference.ts, 8, 30))
|
||||
}
|
||||
|
||||
var x1: Action[] = [
|
||||
>x1 : Symbol(x1, Decl(arrayLiteralTypeInference.ts, 12, 3))
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
{ id: 2, trueness: false },
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 13, 5))
|
||||
>trueness : Symbol(trueness, Decl(arrayLiteralTypeInference.ts, 13, 12))
|
||||
|
||||
{ id: 3, name: "three" }
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 14, 5))
|
||||
>name : Symbol(name, Decl(arrayLiteralTypeInference.ts, 14, 12))
|
||||
|
||||
]
|
||||
|
||||
var x2: Action[] = [
|
||||
>x2 : Symbol(x2, Decl(arrayLiteralTypeInference.ts, 17, 3))
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
new ActionA(),
|
||||
>ActionA : Symbol(ActionA, Decl(arrayLiteralTypeInference.ts, 2, 1))
|
||||
|
||||
new ActionB()
|
||||
>ActionB : Symbol(ActionB, Decl(arrayLiteralTypeInference.ts, 6, 1))
|
||||
|
||||
]
|
||||
|
||||
var x3: Action[] = [
|
||||
>x3 : Symbol(x3, Decl(arrayLiteralTypeInference.ts, 22, 3))
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
new Action(),
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
new ActionA(),
|
||||
>ActionA : Symbol(ActionA, Decl(arrayLiteralTypeInference.ts, 2, 1))
|
||||
|
||||
new ActionB()
|
||||
>ActionB : Symbol(ActionB, Decl(arrayLiteralTypeInference.ts, 6, 1))
|
||||
|
||||
]
|
||||
|
||||
var z1: { id: number }[] =
|
||||
>z1 : Symbol(z1, Decl(arrayLiteralTypeInference.ts, 28, 3))
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 28, 9))
|
||||
|
||||
[
|
||||
{ id: 2, trueness: false },
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 30, 9))
|
||||
>trueness : Symbol(trueness, Decl(arrayLiteralTypeInference.ts, 30, 16))
|
||||
|
||||
{ id: 3, name: "three" }
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 31, 9))
|
||||
>name : Symbol(name, Decl(arrayLiteralTypeInference.ts, 31, 16))
|
||||
|
||||
]
|
||||
|
||||
var z2: { id: number }[] =
|
||||
>z2 : Symbol(z2, Decl(arrayLiteralTypeInference.ts, 34, 3))
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 34, 9))
|
||||
|
||||
[
|
||||
new ActionA(),
|
||||
>ActionA : Symbol(ActionA, Decl(arrayLiteralTypeInference.ts, 2, 1))
|
||||
|
||||
new ActionB()
|
||||
>ActionB : Symbol(ActionB, Decl(arrayLiteralTypeInference.ts, 6, 1))
|
||||
|
||||
]
|
||||
|
||||
var z3: { id: number }[] =
|
||||
>z3 : Symbol(z3, Decl(arrayLiteralTypeInference.ts, 40, 3))
|
||||
>id : Symbol(id, Decl(arrayLiteralTypeInference.ts, 40, 9))
|
||||
|
||||
[
|
||||
new Action(),
|
||||
>Action : Symbol(Action, Decl(arrayLiteralTypeInference.ts, 0, 0))
|
||||
|
||||
new ActionA(),
|
||||
>ActionA : Symbol(ActionA, Decl(arrayLiteralTypeInference.ts, 2, 1))
|
||||
|
||||
new ActionB()
|
||||
>ActionB : Symbol(ActionB, Decl(arrayLiteralTypeInference.ts, 6, 1))
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,144 +0,0 @@
|
||||
=== tests/cases/compiler/arrayLiteralTypeInference.ts ===
|
||||
class Action {
|
||||
>Action : Action
|
||||
|
||||
id: number;
|
||||
>id : number
|
||||
}
|
||||
|
||||
class ActionA extends Action {
|
||||
>ActionA : ActionA
|
||||
>Action : Action
|
||||
|
||||
value: string;
|
||||
>value : string
|
||||
}
|
||||
|
||||
class ActionB extends Action {
|
||||
>ActionB : ActionB
|
||||
>Action : Action
|
||||
|
||||
trueNess: boolean;
|
||||
>trueNess : boolean
|
||||
}
|
||||
|
||||
var x1: Action[] = [
|
||||
>x1 : Action[]
|
||||
>Action : Action
|
||||
>[ { id: 2, trueness: false }, { id: 3, name: "three" }] : ({ id: number; trueness: boolean; } | { id: number; name: string; })[]
|
||||
|
||||
{ id: 2, trueness: false },
|
||||
>{ id: 2, trueness: false } : { id: number; trueness: boolean; }
|
||||
>id : number
|
||||
>2 : number
|
||||
>trueness : boolean
|
||||
>false : boolean
|
||||
|
||||
{ id: 3, name: "three" }
|
||||
>{ id: 3, name: "three" } : { id: number; name: string; }
|
||||
>id : number
|
||||
>3 : number
|
||||
>name : string
|
||||
>"three" : string
|
||||
|
||||
]
|
||||
|
||||
var x2: Action[] = [
|
||||
>x2 : Action[]
|
||||
>Action : Action
|
||||
>[ new ActionA(), new ActionB()] : (ActionA | ActionB)[]
|
||||
|
||||
new ActionA(),
|
||||
>new ActionA() : ActionA
|
||||
>ActionA : typeof ActionA
|
||||
|
||||
new ActionB()
|
||||
>new ActionB() : ActionB
|
||||
>ActionB : typeof ActionB
|
||||
|
||||
]
|
||||
|
||||
var x3: Action[] = [
|
||||
>x3 : Action[]
|
||||
>Action : Action
|
||||
>[ new Action(), new ActionA(), new ActionB()] : Action[]
|
||||
|
||||
new Action(),
|
||||
>new Action() : Action
|
||||
>Action : typeof Action
|
||||
|
||||
new ActionA(),
|
||||
>new ActionA() : ActionA
|
||||
>ActionA : typeof ActionA
|
||||
|
||||
new ActionB()
|
||||
>new ActionB() : ActionB
|
||||
>ActionB : typeof ActionB
|
||||
|
||||
]
|
||||
|
||||
var z1: { id: number }[] =
|
||||
>z1 : { id: number; }[]
|
||||
>id : number
|
||||
|
||||
[
|
||||
>[ { id: 2, trueness: false }, { id: 3, name: "three" } ] : ({ id: number; trueness: boolean; } | { id: number; name: string; })[]
|
||||
|
||||
{ id: 2, trueness: false },
|
||||
>{ id: 2, trueness: false } : { id: number; trueness: boolean; }
|
||||
>id : number
|
||||
>2 : number
|
||||
>trueness : boolean
|
||||
>false : boolean
|
||||
|
||||
{ id: 3, name: "three" }
|
||||
>{ id: 3, name: "three" } : { id: number; name: string; }
|
||||
>id : number
|
||||
>3 : number
|
||||
>name : string
|
||||
>"three" : string
|
||||
|
||||
]
|
||||
|
||||
var z2: { id: number }[] =
|
||||
>z2 : { id: number; }[]
|
||||
>id : number
|
||||
|
||||
[
|
||||
>[ new ActionA(), new ActionB() ] : (ActionA | ActionB)[]
|
||||
|
||||
new ActionA(),
|
||||
>new ActionA() : ActionA
|
||||
>ActionA : typeof ActionA
|
||||
|
||||
new ActionB()
|
||||
>new ActionB() : ActionB
|
||||
>ActionB : typeof ActionB
|
||||
|
||||
]
|
||||
|
||||
var z3: { id: number }[] =
|
||||
>z3 : { id: number; }[]
|
||||
>id : number
|
||||
|
||||
[
|
||||
>[ new Action(), new ActionA(), new ActionB() ] : Action[]
|
||||
|
||||
new Action(),
|
||||
>new Action() : Action
|
||||
>Action : typeof Action
|
||||
|
||||
new ActionA(),
|
||||
>new ActionA() : ActionA
|
||||
>ActionA : typeof ActionA
|
||||
|
||||
new ActionB()
|
||||
>new ActionB() : ActionB
|
||||
>ActionB : typeof ActionB
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@ var as = [a, b]; // { x: number; y?: number };[]
|
||||
>b : { x: number; z?: number; }
|
||||
|
||||
var bs = [b, a]; // { x: number; z?: number };[]
|
||||
>bs : ({ x: number; y?: number; } | { x: number; z?: number; })[]
|
||||
>[b, a] : ({ x: number; y?: number; } | { x: number; z?: number; })[]
|
||||
>bs : ({ x: number; z?: number; } | { x: number; y?: number; })[]
|
||||
>[b, a] : ({ x: number; z?: number; } | { x: number; y?: number; })[]
|
||||
>b : { x: number; z?: number; }
|
||||
>a : { x: number; y?: number; }
|
||||
|
||||
@@ -36,8 +36,8 @@ var cs = [a, b, c]; // { x: number; y?: number };[]
|
||||
>c : { x: number; a?: number; }
|
||||
|
||||
var ds = [(x: Object) => 1, (x: string) => 2]; // { (x:Object) => number }[]
|
||||
>ds : ((x: Object) => number)[]
|
||||
>[(x: Object) => 1, (x: string) => 2] : ((x: Object) => number)[]
|
||||
>ds : (((x: Object) => number) | ((x: string) => number))[]
|
||||
>[(x: Object) => 1, (x: string) => 2] : (((x: Object) => number) | ((x: string) => number))[]
|
||||
>(x: Object) => 1 : (x: Object) => number
|
||||
>x : Object
|
||||
>Object : Object
|
||||
@@ -47,8 +47,8 @@ var ds = [(x: Object) => 1, (x: string) => 2]; // { (x:Object) => number }[]
|
||||
>2 : number
|
||||
|
||||
var es = [(x: string) => 2, (x: Object) => 1]; // { (x:string) => number }[]
|
||||
>es : ((x: string) => number)[]
|
||||
>[(x: string) => 2, (x: Object) => 1] : ((x: string) => number)[]
|
||||
>es : (((x: string) => number) | ((x: Object) => number))[]
|
||||
>[(x: string) => 2, (x: Object) => 1] : (((x: string) => number) | ((x: Object) => number))[]
|
||||
>(x: string) => 2 : (x: string) => number
|
||||
>x : string
|
||||
>2 : number
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals.ts(24,5): error TS2322: Type '({ a: string; b: number; c: string; } | { a: string; b: number; c: number; })[]' is not assignable to type '{ [n: number]: { a: string; b: number; }; }'.
|
||||
Index signatures are incompatible.
|
||||
Type '{ a: string; b: number; c: string; } | { a: string; b: number; c: number; }' is not assignable to type '{ a: string; b: number; }'.
|
||||
Type '{ a: string; b: number; c: string; }' is not assignable to type '{ a: string; b: number; }'.
|
||||
Object literal may only specify known properties, and 'c' does not exist in type '{ a: string; b: number; }'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals.ts (1 errors) ====
|
||||
// Empty array literal with no contextual type has type Undefined[]
|
||||
|
||||
var arr1= [[], [1], ['']];
|
||||
|
||||
var arr2 = [[null], [1], ['']];
|
||||
|
||||
|
||||
// Array literal with elements of only EveryType E has type E[]
|
||||
var stringArrArr = [[''], [""]];
|
||||
|
||||
var stringArr = ['', ""];
|
||||
|
||||
var numberArr = [0, 0.0, 0x00, 1e1];
|
||||
|
||||
var boolArr = [false, true, false, true];
|
||||
|
||||
class C { private p; }
|
||||
var classArr = [new C(), new C()];
|
||||
|
||||
var classTypeArray = [C, C, C];
|
||||
var classTypeArray: Array<typeof C>; // Should OK, not be a parse error
|
||||
|
||||
// Contextual type C with numeric index signature makes array literal of EveryType E of type BCT(E,C)[]
|
||||
var context1: { [n: number]: { a: string; b: number; }; } = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
~~~~~~~~
|
||||
!!! error TS2322: Type '({ a: string; b: number; c: string; } | { a: string; b: number; c: number; })[]' is not assignable to type '{ [n: number]: { a: string; b: number; }; }'.
|
||||
!!! error TS2322: Index signatures are incompatible.
|
||||
!!! error TS2322: Type '{ a: string; b: number; c: string; } | { a: string; b: number; c: number; }' is not assignable to type '{ a: string; b: number; }'.
|
||||
!!! error TS2322: Type '{ a: string; b: number; c: string; }' is not assignable to type '{ a: string; b: number; }'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'c' does not exist in type '{ a: string; b: number; }'.
|
||||
var context2 = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived have type Base[]
|
||||
class Base { private p; }
|
||||
class Derived1 extends Base { private m };
|
||||
class Derived2 extends Base { private n };
|
||||
var context3: Base[] = [new Derived1(), new Derived2()];
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived1 and Derived2 have type Base[]
|
||||
var context4: Base[] = [new Derived1(), new Derived1()];
|
||||
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
=== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals.ts ===
|
||||
// Empty array literal with no contextual type has type Undefined[]
|
||||
|
||||
var arr1= [[], [1], ['']];
|
||||
>arr1 : Symbol(arr1, Decl(arrayLiterals.ts, 2, 3))
|
||||
|
||||
var arr2 = [[null], [1], ['']];
|
||||
>arr2 : Symbol(arr2, Decl(arrayLiterals.ts, 4, 3))
|
||||
|
||||
|
||||
// Array literal with elements of only EveryType E has type E[]
|
||||
var stringArrArr = [[''], [""]];
|
||||
>stringArrArr : Symbol(stringArrArr, Decl(arrayLiterals.ts, 8, 3))
|
||||
|
||||
var stringArr = ['', ""];
|
||||
>stringArr : Symbol(stringArr, Decl(arrayLiterals.ts, 10, 3))
|
||||
|
||||
var numberArr = [0, 0.0, 0x00, 1e1];
|
||||
>numberArr : Symbol(numberArr, Decl(arrayLiterals.ts, 12, 3))
|
||||
|
||||
var boolArr = [false, true, false, true];
|
||||
>boolArr : Symbol(boolArr, Decl(arrayLiterals.ts, 14, 3))
|
||||
|
||||
class C { private p; }
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
>p : Symbol(p, Decl(arrayLiterals.ts, 16, 9))
|
||||
|
||||
var classArr = [new C(), new C()];
|
||||
>classArr : Symbol(classArr, Decl(arrayLiterals.ts, 17, 3))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
|
||||
var classTypeArray = [C, C, C];
|
||||
>classTypeArray : Symbol(classTypeArray, Decl(arrayLiterals.ts, 19, 3), Decl(arrayLiterals.ts, 20, 3))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
|
||||
var classTypeArray: Array<typeof C>; // Should OK, not be a parse error
|
||||
>classTypeArray : Symbol(classTypeArray, Decl(arrayLiterals.ts, 19, 3), Decl(arrayLiterals.ts, 20, 3))
|
||||
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11))
|
||||
>C : Symbol(C, Decl(arrayLiterals.ts, 14, 41))
|
||||
|
||||
// Contextual type C with numeric index signature makes array literal of EveryType E of type BCT(E,C)[]
|
||||
var context1: { [n: number]: { a: string; b: number; }; } = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
>context1 : Symbol(context1, Decl(arrayLiterals.ts, 23, 3))
|
||||
>n : Symbol(n, Decl(arrayLiterals.ts, 23, 17))
|
||||
>a : Symbol(a, Decl(arrayLiterals.ts, 23, 30))
|
||||
>b : Symbol(b, Decl(arrayLiterals.ts, 23, 41))
|
||||
>a : Symbol(a, Decl(arrayLiterals.ts, 23, 62))
|
||||
>b : Symbol(b, Decl(arrayLiterals.ts, 23, 69))
|
||||
>c : Symbol(c, Decl(arrayLiterals.ts, 23, 75))
|
||||
>a : Symbol(a, Decl(arrayLiterals.ts, 23, 86))
|
||||
>b : Symbol(b, Decl(arrayLiterals.ts, 23, 93))
|
||||
>c : Symbol(c, Decl(arrayLiterals.ts, 23, 99))
|
||||
|
||||
var context2 = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
>context2 : Symbol(context2, Decl(arrayLiterals.ts, 24, 3))
|
||||
>a : Symbol(a, Decl(arrayLiterals.ts, 24, 17))
|
||||
>b : Symbol(b, Decl(arrayLiterals.ts, 24, 24))
|
||||
>c : Symbol(c, Decl(arrayLiterals.ts, 24, 30))
|
||||
>a : Symbol(a, Decl(arrayLiterals.ts, 24, 41))
|
||||
>b : Symbol(b, Decl(arrayLiterals.ts, 24, 48))
|
||||
>c : Symbol(c, Decl(arrayLiterals.ts, 24, 54))
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived have type Base[]
|
||||
class Base { private p; }
|
||||
>Base : Symbol(Base, Decl(arrayLiterals.ts, 24, 63))
|
||||
>p : Symbol(p, Decl(arrayLiterals.ts, 27, 12))
|
||||
|
||||
class Derived1 extends Base { private m };
|
||||
>Derived1 : Symbol(Derived1, Decl(arrayLiterals.ts, 27, 25))
|
||||
>Base : Symbol(Base, Decl(arrayLiterals.ts, 24, 63))
|
||||
>m : Symbol(m, Decl(arrayLiterals.ts, 28, 29))
|
||||
|
||||
class Derived2 extends Base { private n };
|
||||
>Derived2 : Symbol(Derived2, Decl(arrayLiterals.ts, 28, 42))
|
||||
>Base : Symbol(Base, Decl(arrayLiterals.ts, 24, 63))
|
||||
>n : Symbol(n, Decl(arrayLiterals.ts, 29, 29))
|
||||
|
||||
var context3: Base[] = [new Derived1(), new Derived2()];
|
||||
>context3 : Symbol(context3, Decl(arrayLiterals.ts, 30, 3))
|
||||
>Base : Symbol(Base, Decl(arrayLiterals.ts, 24, 63))
|
||||
>Derived1 : Symbol(Derived1, Decl(arrayLiterals.ts, 27, 25))
|
||||
>Derived2 : Symbol(Derived2, Decl(arrayLiterals.ts, 28, 42))
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived1 and Derived2 have type Base[]
|
||||
var context4: Base[] = [new Derived1(), new Derived1()];
|
||||
>context4 : Symbol(context4, Decl(arrayLiterals.ts, 33, 3))
|
||||
>Base : Symbol(Base, Decl(arrayLiterals.ts, 24, 63))
|
||||
>Derived1 : Symbol(Derived1, Decl(arrayLiterals.ts, 27, 25))
|
||||
>Derived1 : Symbol(Derived1, Decl(arrayLiterals.ts, 27, 25))
|
||||
|
||||
|
||||
@@ -1,153 +0,0 @@
|
||||
=== tests/cases/conformance/expressions/arrayLiterals/arrayLiterals.ts ===
|
||||
// Empty array literal with no contextual type has type Undefined[]
|
||||
|
||||
var arr1= [[], [1], ['']];
|
||||
>arr1 : (number[] | string[])[]
|
||||
>[[], [1], ['']] : (number[] | string[])[]
|
||||
>[] : undefined[]
|
||||
>[1] : number[]
|
||||
>1 : number
|
||||
>[''] : string[]
|
||||
>'' : string
|
||||
|
||||
var arr2 = [[null], [1], ['']];
|
||||
>arr2 : (number[] | string[])[]
|
||||
>[[null], [1], ['']] : (number[] | string[])[]
|
||||
>[null] : null[]
|
||||
>null : null
|
||||
>[1] : number[]
|
||||
>1 : number
|
||||
>[''] : string[]
|
||||
>'' : string
|
||||
|
||||
|
||||
// Array literal with elements of only EveryType E has type E[]
|
||||
var stringArrArr = [[''], [""]];
|
||||
>stringArrArr : string[][]
|
||||
>[[''], [""]] : string[][]
|
||||
>[''] : string[]
|
||||
>'' : string
|
||||
>[""] : string[]
|
||||
>"" : string
|
||||
|
||||
var stringArr = ['', ""];
|
||||
>stringArr : string[]
|
||||
>['', ""] : string[]
|
||||
>'' : string
|
||||
>"" : string
|
||||
|
||||
var numberArr = [0, 0.0, 0x00, 1e1];
|
||||
>numberArr : number[]
|
||||
>[0, 0.0, 0x00, 1e1] : number[]
|
||||
>0 : number
|
||||
>0.0 : number
|
||||
>0x00 : number
|
||||
>1e1 : number
|
||||
|
||||
var boolArr = [false, true, false, true];
|
||||
>boolArr : boolean[]
|
||||
>[false, true, false, true] : boolean[]
|
||||
>false : boolean
|
||||
>true : boolean
|
||||
>false : boolean
|
||||
>true : boolean
|
||||
|
||||
class C { private p; }
|
||||
>C : C
|
||||
>p : any
|
||||
|
||||
var classArr = [new C(), new C()];
|
||||
>classArr : C[]
|
||||
>[new C(), new C()] : C[]
|
||||
>new C() : C
|
||||
>C : typeof C
|
||||
>new C() : C
|
||||
>C : typeof C
|
||||
|
||||
var classTypeArray = [C, C, C];
|
||||
>classTypeArray : typeof C[]
|
||||
>[C, C, C] : typeof C[]
|
||||
>C : typeof C
|
||||
>C : typeof C
|
||||
>C : typeof C
|
||||
|
||||
var classTypeArray: Array<typeof C>; // Should OK, not be a parse error
|
||||
>classTypeArray : typeof C[]
|
||||
>Array : T[]
|
||||
>C : typeof C
|
||||
|
||||
// Contextual type C with numeric index signature makes array literal of EveryType E of type BCT(E,C)[]
|
||||
var context1: { [n: number]: { a: string; b: number; }; } = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
>context1 : { [n: number]: { a: string; b: number; }; }
|
||||
>n : number
|
||||
>a : string
|
||||
>b : number
|
||||
>[{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }] : ({ a: string; b: number; c: string; } | { a: string; b: number; c: number; })[]
|
||||
>{ a: '', b: 0, c: '' } : { a: string; b: number; c: string; }
|
||||
>a : string
|
||||
>'' : string
|
||||
>b : number
|
||||
>0 : number
|
||||
>c : string
|
||||
>'' : string
|
||||
>{ a: "", b: 3, c: 0 } : { a: string; b: number; c: number; }
|
||||
>a : string
|
||||
>"" : string
|
||||
>b : number
|
||||
>3 : number
|
||||
>c : number
|
||||
>0 : number
|
||||
|
||||
var context2 = [{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }];
|
||||
>context2 : ({ a: string; b: number; c: string; } | { a: string; b: number; c: number; })[]
|
||||
>[{ a: '', b: 0, c: '' }, { a: "", b: 3, c: 0 }] : ({ a: string; b: number; c: string; } | { a: string; b: number; c: number; })[]
|
||||
>{ a: '', b: 0, c: '' } : { a: string; b: number; c: string; }
|
||||
>a : string
|
||||
>'' : string
|
||||
>b : number
|
||||
>0 : number
|
||||
>c : string
|
||||
>'' : string
|
||||
>{ a: "", b: 3, c: 0 } : { a: string; b: number; c: number; }
|
||||
>a : string
|
||||
>"" : string
|
||||
>b : number
|
||||
>3 : number
|
||||
>c : number
|
||||
>0 : number
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived have type Base[]
|
||||
class Base { private p; }
|
||||
>Base : Base
|
||||
>p : any
|
||||
|
||||
class Derived1 extends Base { private m };
|
||||
>Derived1 : Derived1
|
||||
>Base : Base
|
||||
>m : any
|
||||
|
||||
class Derived2 extends Base { private n };
|
||||
>Derived2 : Derived2
|
||||
>Base : Base
|
||||
>n : any
|
||||
|
||||
var context3: Base[] = [new Derived1(), new Derived2()];
|
||||
>context3 : Base[]
|
||||
>Base : Base
|
||||
>[new Derived1(), new Derived2()] : (Derived1 | Derived2)[]
|
||||
>new Derived1() : Derived1
|
||||
>Derived1 : typeof Derived1
|
||||
>new Derived2() : Derived2
|
||||
>Derived2 : typeof Derived2
|
||||
|
||||
// Contextual type C with numeric index signature of type Base makes array literal of Derived1 and Derived2 have type Base[]
|
||||
var context4: Base[] = [new Derived1(), new Derived1()];
|
||||
>context4 : Base[]
|
||||
>Base : Base
|
||||
>[new Derived1(), new Derived1()] : Derived1[]
|
||||
>new Derived1() : Derived1
|
||||
>Derived1 : typeof Derived1
|
||||
>new Derived1() : Derived1
|
||||
>Derived1 : typeof Derived1
|
||||
|
||||
|
||||
@@ -24,8 +24,8 @@ var a1 = ["hello", "world"]
|
||||
>"world" : string
|
||||
|
||||
var a2 = [, , , ...a0, "hello"];
|
||||
>a2 : (string | number)[]
|
||||
>[, , , ...a0, "hello"] : (string | number)[]
|
||||
>a2 : (number | string)[]
|
||||
>[, , , ...a0, "hello"] : (number | string)[]
|
||||
> : undefined
|
||||
> : undefined
|
||||
> : undefined
|
||||
@@ -151,8 +151,8 @@ interface myArray2 extends Array<Number|String> { }
|
||||
>String : String
|
||||
|
||||
var d0 = [1, true, ...temp,]; // has type (string|number|boolean)[]
|
||||
>d0 : (string | number | boolean)[]
|
||||
>[1, true, ...temp,] : (string | number | boolean)[]
|
||||
>d0 : (number | boolean | string)[]
|
||||
>[1, true, ...temp,] : (number | boolean | string)[]
|
||||
>1 : number
|
||||
>true : boolean
|
||||
>...temp : string
|
||||
@@ -214,8 +214,8 @@ var d8: number[][] = [[...temp1]]
|
||||
>temp1 : number[]
|
||||
|
||||
var d9 = [[...temp1], ...["hello"]];
|
||||
>d9 : (string | number[])[]
|
||||
>[[...temp1], ...["hello"]] : (string | number[])[]
|
||||
>d9 : (number[] | string)[]
|
||||
>[[...temp1], ...["hello"]] : (number[] | string)[]
|
||||
>[...temp1] : number[]
|
||||
>...temp1 : number
|
||||
>temp1 : number[]
|
||||
|
||||
@@ -24,8 +24,8 @@ var a1 = ["hello", "world"]
|
||||
>"world" : string
|
||||
|
||||
var a2 = [, , , ...a0, "hello"];
|
||||
>a2 : (string | number)[]
|
||||
>[, , , ...a0, "hello"] : (string | number)[]
|
||||
>a2 : (number | string)[]
|
||||
>[, , , ...a0, "hello"] : (number | string)[]
|
||||
> : undefined
|
||||
> : undefined
|
||||
> : undefined
|
||||
@@ -140,8 +140,8 @@ interface myArray2 extends Array<Number|String> { }
|
||||
>String : String
|
||||
|
||||
var d0 = [1, true, ...temp, ]; // has type (string|number|boolean)[]
|
||||
>d0 : (string | number | boolean)[]
|
||||
>[1, true, ...temp, ] : (string | number | boolean)[]
|
||||
>d0 : (number | boolean | string)[]
|
||||
>[1, true, ...temp, ] : (number | boolean | string)[]
|
||||
>1 : number
|
||||
>true : boolean
|
||||
>...temp : string
|
||||
@@ -176,10 +176,10 @@ var d4: myArray2 = [...temp, ...temp1];
|
||||
>temp1 : number[]
|
||||
|
||||
var d5 = [...a2];
|
||||
>d5 : (string | number)[]
|
||||
>[...a2] : (string | number)[]
|
||||
>...a2 : string | number
|
||||
>a2 : (string | number)[]
|
||||
>d5 : (number | string)[]
|
||||
>[...a2] : (number | string)[]
|
||||
>...a2 : number | string
|
||||
>a2 : (number | string)[]
|
||||
|
||||
var d6 = [...a3];
|
||||
>d6 : number[]
|
||||
@@ -201,8 +201,8 @@ var d8: number[][] = [[...temp1]]
|
||||
>temp1 : number[]
|
||||
|
||||
var d9 = [[...temp1], ...["hello"]];
|
||||
>d9 : (string | number[])[]
|
||||
>[[...temp1], ...["hello"]] : (string | number[])[]
|
||||
>d9 : (number[] | string)[]
|
||||
>[[...temp1], ...["hello"]] : (number[] | string)[]
|
||||
>[...temp1] : number[]
|
||||
>...temp1 : number
|
||||
>temp1 : number[]
|
||||
|
||||
@@ -5,18 +5,18 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(11,5): error
|
||||
Type 'string' is not assignable to type 'boolean'.
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(17,5): error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'.
|
||||
Types of property 'pop' are incompatible.
|
||||
Type '() => string | number | boolean' is not assignable to type '() => number'.
|
||||
Type 'string | number | boolean' is not assignable to type 'number'.
|
||||
Type '() => number | string | boolean' is not assignable to type '() => number'.
|
||||
Type 'number | string | boolean' is not assignable to type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(32,5): error TS2322: Type '(number[] | string[])[]' is not assignable to type 'tup'.
|
||||
Property '0' is missing in type '(number[] | string[])[]'.
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(33,5): error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'.
|
||||
Property '0' is missing in type 'number[]'.
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error TS2322: Type '(string | number)[]' is not assignable to type 'myArray'.
|
||||
tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error TS2322: Type '(number | string)[]' is not assignable to type 'myArray'.
|
||||
Types of property 'push' are incompatible.
|
||||
Type '(...items: (string | number)[]) => number' is not assignable to type '(...items: Number[]) => number'.
|
||||
Type '(...items: (number | string)[]) => number' is not assignable to type '(...items: Number[]) => number'.
|
||||
Types of parameters 'items' and 'items' are incompatible.
|
||||
Type 'string | number' is not assignable to type 'Number'.
|
||||
Type 'number | string' is not assignable to type 'Number'.
|
||||
Type 'string' is not assignable to type 'Number'.
|
||||
Property 'toFixed' is missing in type 'String'.
|
||||
|
||||
@@ -49,8 +49,8 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
|
||||
~~~~~~~~
|
||||
!!! error TS2322: Type '[number, number, string, boolean]' is not assignable to type '[number, number]'.
|
||||
!!! error TS2322: Types of property 'pop' are incompatible.
|
||||
!!! error TS2322: Type '() => string | number | boolean' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'string | number | boolean' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type '() => number | string | boolean' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'number | string | boolean' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
|
||||
// The resulting type an array literal expression is determined as follows:
|
||||
@@ -76,11 +76,11 @@ tests/cases/conformance/expressions/arrayLiterals/arrayLiterals3.ts(34,5): error
|
||||
!!! error TS2322: Property '0' is missing in type 'number[]'.
|
||||
var c2: myArray = [...temp1, ...temp]; // Error cannot assign (number|string)[] to number[]
|
||||
~~
|
||||
!!! error TS2322: Type '(string | number)[]' is not assignable to type 'myArray'.
|
||||
!!! error TS2322: Type '(number | string)[]' is not assignable to type 'myArray'.
|
||||
!!! error TS2322: Types of property 'push' are incompatible.
|
||||
!!! error TS2322: Type '(...items: (string | number)[]) => number' is not assignable to type '(...items: Number[]) => number'.
|
||||
!!! error TS2322: Type '(...items: (number | string)[]) => number' is not assignable to type '(...items: Number[]) => number'.
|
||||
!!! error TS2322: Types of parameters 'items' and 'items' are incompatible.
|
||||
!!! error TS2322: Type 'string | number' is not assignable to type 'Number'.
|
||||
!!! error TS2322: Type 'number | string' is not assignable to type 'Number'.
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'Number'.
|
||||
!!! error TS2322: Property 'toFixed' is missing in type 'String'.
|
||||
|
||||
@@ -77,8 +77,8 @@ var myDerivedList: DerivedList<number>;
|
||||
>DerivedList : DerivedList<U>
|
||||
|
||||
var as = [list, myDerivedList]; // List<number>[]
|
||||
>as : List<number>[]
|
||||
>[list, myDerivedList] : List<number>[]
|
||||
>as : (List<number> | DerivedList<number>)[]
|
||||
>[list, myDerivedList] : (List<number> | DerivedList<number>)[]
|
||||
>list : List<number>
|
||||
>myDerivedList : DerivedList<number>
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts(17,13): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
|
||||
tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts(26,10): error TS2349: Cannot invoke an expression whose type lacks a call signature.
|
||||
|
||||
|
||||
==== tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts (2 errors) ====
|
||||
// valid uses of arrays of function types
|
||||
|
||||
var x = [() => 1, () => { }];
|
||||
var r2 = x[0]();
|
||||
|
||||
class C {
|
||||
foo: string;
|
||||
}
|
||||
var y = [C, C];
|
||||
var r3 = new y[0]();
|
||||
|
||||
var a: { (x: number): number; (x: string): string; };
|
||||
var b: { (x: number): number; (x: string): string; };
|
||||
var c: { (x: number): number; (x: any): any; };
|
||||
var z = [a, b, c];
|
||||
var r4 = z[0];
|
||||
var r5 = r4(''); // any not string
|
||||
~~
|
||||
!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
|
||||
var r5b = r4(1);
|
||||
|
||||
var a2: { <T>(x: T): number; (x: string): string;};
|
||||
var b2: { <T>(x: T): number; (x: string): string; };
|
||||
var c2: { (x: number): number; <T>(x: T): any; };
|
||||
|
||||
var z2 = [a2, b2, c2];
|
||||
var r6 = z2[0];
|
||||
var r7 = r6(''); // any not string
|
||||
~~~~~~
|
||||
!!! error TS2349: Cannot invoke an expression whose type lacks a call signature.
|
||||
@@ -1,93 +0,0 @@
|
||||
=== tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts ===
|
||||
// valid uses of arrays of function types
|
||||
|
||||
var x = [() => 1, () => { }];
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 2, 3))
|
||||
|
||||
var r2 = x[0]();
|
||||
>r2 : Symbol(r2, Decl(arrayOfFunctionTypes3.ts, 3, 3))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 2, 3))
|
||||
|
||||
class C {
|
||||
>C : Symbol(C, Decl(arrayOfFunctionTypes3.ts, 3, 16))
|
||||
|
||||
foo: string;
|
||||
>foo : Symbol(foo, Decl(arrayOfFunctionTypes3.ts, 5, 9))
|
||||
}
|
||||
var y = [C, C];
|
||||
>y : Symbol(y, Decl(arrayOfFunctionTypes3.ts, 8, 3))
|
||||
>C : Symbol(C, Decl(arrayOfFunctionTypes3.ts, 3, 16))
|
||||
>C : Symbol(C, Decl(arrayOfFunctionTypes3.ts, 3, 16))
|
||||
|
||||
var r3 = new y[0]();
|
||||
>r3 : Symbol(r3, Decl(arrayOfFunctionTypes3.ts, 9, 3))
|
||||
>y : Symbol(y, Decl(arrayOfFunctionTypes3.ts, 8, 3))
|
||||
|
||||
var a: { (x: number): number; (x: string): string; };
|
||||
>a : Symbol(a, Decl(arrayOfFunctionTypes3.ts, 11, 3))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 11, 10))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 11, 31))
|
||||
|
||||
var b: { (x: number): number; (x: string): string; };
|
||||
>b : Symbol(b, Decl(arrayOfFunctionTypes3.ts, 12, 3))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 12, 10))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 12, 31))
|
||||
|
||||
var c: { (x: number): number; (x: any): any; };
|
||||
>c : Symbol(c, Decl(arrayOfFunctionTypes3.ts, 13, 3))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 13, 10))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 13, 31))
|
||||
|
||||
var z = [a, b, c];
|
||||
>z : Symbol(z, Decl(arrayOfFunctionTypes3.ts, 14, 3))
|
||||
>a : Symbol(a, Decl(arrayOfFunctionTypes3.ts, 11, 3))
|
||||
>b : Symbol(b, Decl(arrayOfFunctionTypes3.ts, 12, 3))
|
||||
>c : Symbol(c, Decl(arrayOfFunctionTypes3.ts, 13, 3))
|
||||
|
||||
var r4 = z[0];
|
||||
>r4 : Symbol(r4, Decl(arrayOfFunctionTypes3.ts, 15, 3))
|
||||
>z : Symbol(z, Decl(arrayOfFunctionTypes3.ts, 14, 3))
|
||||
|
||||
var r5 = r4(''); // any not string
|
||||
>r5 : Symbol(r5, Decl(arrayOfFunctionTypes3.ts, 16, 3))
|
||||
>r4 : Symbol(r4, Decl(arrayOfFunctionTypes3.ts, 15, 3))
|
||||
|
||||
var r5b = r4(1);
|
||||
>r5b : Symbol(r5b, Decl(arrayOfFunctionTypes3.ts, 17, 3))
|
||||
>r4 : Symbol(r4, Decl(arrayOfFunctionTypes3.ts, 15, 3))
|
||||
|
||||
var a2: { <T>(x: T): number; (x: string): string;};
|
||||
>a2 : Symbol(a2, Decl(arrayOfFunctionTypes3.ts, 19, 3))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 19, 11))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 19, 14))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 19, 11))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 19, 30))
|
||||
|
||||
var b2: { <T>(x: T): number; (x: string): string; };
|
||||
>b2 : Symbol(b2, Decl(arrayOfFunctionTypes3.ts, 20, 3))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 20, 11))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 20, 14))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 20, 11))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 20, 30))
|
||||
|
||||
var c2: { (x: number): number; <T>(x: T): any; };
|
||||
>c2 : Symbol(c2, Decl(arrayOfFunctionTypes3.ts, 21, 3))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 21, 11))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 21, 32))
|
||||
>x : Symbol(x, Decl(arrayOfFunctionTypes3.ts, 21, 35))
|
||||
>T : Symbol(T, Decl(arrayOfFunctionTypes3.ts, 21, 32))
|
||||
|
||||
var z2 = [a2, b2, c2];
|
||||
>z2 : Symbol(z2, Decl(arrayOfFunctionTypes3.ts, 23, 3))
|
||||
>a2 : Symbol(a2, Decl(arrayOfFunctionTypes3.ts, 19, 3))
|
||||
>b2 : Symbol(b2, Decl(arrayOfFunctionTypes3.ts, 20, 3))
|
||||
>c2 : Symbol(c2, Decl(arrayOfFunctionTypes3.ts, 21, 3))
|
||||
|
||||
var r6 = z2[0];
|
||||
>r6 : Symbol(r6, Decl(arrayOfFunctionTypes3.ts, 24, 3))
|
||||
>z2 : Symbol(z2, Decl(arrayOfFunctionTypes3.ts, 23, 3))
|
||||
|
||||
var r7 = r6(''); // any not string
|
||||
>r7 : Symbol(r7, Decl(arrayOfFunctionTypes3.ts, 25, 3))
|
||||
>r6 : Symbol(r6, Decl(arrayOfFunctionTypes3.ts, 24, 3))
|
||||
|
||||
@@ -1,116 +0,0 @@
|
||||
=== tests/cases/conformance/types/specifyingTypes/typeLiterals/arrayOfFunctionTypes3.ts ===
|
||||
// valid uses of arrays of function types
|
||||
|
||||
var x = [() => 1, () => { }];
|
||||
>x : (() => void)[]
|
||||
>[() => 1, () => { }] : (() => void)[]
|
||||
>() => 1 : () => number
|
||||
>1 : number
|
||||
>() => { } : () => void
|
||||
|
||||
var r2 = x[0]();
|
||||
>r2 : void
|
||||
>x[0]() : void
|
||||
>x[0] : () => void
|
||||
>x : (() => void)[]
|
||||
>0 : number
|
||||
|
||||
class C {
|
||||
>C : C
|
||||
|
||||
foo: string;
|
||||
>foo : string
|
||||
}
|
||||
var y = [C, C];
|
||||
>y : typeof C[]
|
||||
>[C, C] : typeof C[]
|
||||
>C : typeof C
|
||||
>C : typeof C
|
||||
|
||||
var r3 = new y[0]();
|
||||
>r3 : C
|
||||
>new y[0]() : C
|
||||
>y[0] : typeof C
|
||||
>y : typeof C[]
|
||||
>0 : number
|
||||
|
||||
var a: { (x: number): number; (x: string): string; };
|
||||
>a : { (x: number): number; (x: string): string; }
|
||||
>x : number
|
||||
>x : string
|
||||
|
||||
var b: { (x: number): number; (x: string): string; };
|
||||
>b : { (x: number): number; (x: string): string; }
|
||||
>x : number
|
||||
>x : string
|
||||
|
||||
var c: { (x: number): number; (x: any): any; };
|
||||
>c : { (x: number): number; (x: any): any; }
|
||||
>x : number
|
||||
>x : any
|
||||
|
||||
var z = [a, b, c];
|
||||
>z : { (x: number): number; (x: any): any; }[]
|
||||
>[a, b, c] : { (x: number): number; (x: any): any; }[]
|
||||
>a : { (x: number): number; (x: string): string; }
|
||||
>b : { (x: number): number; (x: string): string; }
|
||||
>c : { (x: number): number; (x: any): any; }
|
||||
|
||||
var r4 = z[0];
|
||||
>r4 : { (x: number): number; (x: any): any; }
|
||||
>z[0] : { (x: number): number; (x: any): any; }
|
||||
>z : { (x: number): number; (x: any): any; }[]
|
||||
>0 : number
|
||||
|
||||
var r5 = r4(''); // any not string
|
||||
>r5 : any
|
||||
>r4('') : any
|
||||
>r4 : { (x: number): number; (x: any): any; }
|
||||
>'' : string
|
||||
|
||||
var r5b = r4(1);
|
||||
>r5b : number
|
||||
>r4(1) : number
|
||||
>r4 : { (x: number): number; (x: any): any; }
|
||||
>1 : number
|
||||
|
||||
var a2: { <T>(x: T): number; (x: string): string;};
|
||||
>a2 : { <T>(x: T): number; (x: string): string; }
|
||||
>T : T
|
||||
>x : T
|
||||
>T : T
|
||||
>x : string
|
||||
|
||||
var b2: { <T>(x: T): number; (x: string): string; };
|
||||
>b2 : { <T>(x: T): number; (x: string): string; }
|
||||
>T : T
|
||||
>x : T
|
||||
>T : T
|
||||
>x : string
|
||||
|
||||
var c2: { (x: number): number; <T>(x: T): any; };
|
||||
>c2 : { (x: number): number; <T>(x: T): any; }
|
||||
>x : number
|
||||
>T : T
|
||||
>x : T
|
||||
>T : T
|
||||
|
||||
var z2 = [a2, b2, c2];
|
||||
>z2 : { (x: number): number; <T>(x: T): any; }[]
|
||||
>[a2, b2, c2] : { (x: number): number; <T>(x: T): any; }[]
|
||||
>a2 : { <T>(x: T): number; (x: string): string; }
|
||||
>b2 : { <T>(x: T): number; (x: string): string; }
|
||||
>c2 : { (x: number): number; <T>(x: T): any; }
|
||||
|
||||
var r6 = z2[0];
|
||||
>r6 : { (x: number): number; <T>(x: T): any; }
|
||||
>z2[0] : { (x: number): number; <T>(x: T): any; }
|
||||
>z2 : { (x: number): number; <T>(x: T): any; }[]
|
||||
>0 : number
|
||||
|
||||
var r7 = r6(''); // any not string
|
||||
>r7 : any
|
||||
>r6('') : any
|
||||
>r6 : { (x: number): number; <T>(x: T): any; }
|
||||
>'' : string
|
||||
|
||||
@@ -70,6 +70,7 @@ var p6 = ({ a }) => { };
|
||||
|
||||
var p7 = ({ a: { b } }) => { };
|
||||
>p7 : Symbol(p7, Decl(arrowFunctionExpressions.ts, 21, 3))
|
||||
>a : Symbol(a)
|
||||
>b : Symbol(b, Decl(arrowFunctionExpressions.ts, 21, 16))
|
||||
|
||||
var p8 = ({ a = 1 }) => { };
|
||||
@@ -78,6 +79,7 @@ var p8 = ({ a = 1 }) => { };
|
||||
|
||||
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
|
||||
>p9 : Symbol(p9, Decl(arrowFunctionExpressions.ts, 23, 3))
|
||||
>a : Symbol(a)
|
||||
>b : Symbol(b, Decl(arrowFunctionExpressions.ts, 23, 16))
|
||||
>b : Symbol(b, Decl(arrowFunctionExpressions.ts, 23, 28))
|
||||
|
||||
|
||||
@@ -24,12 +24,12 @@ var z = Date as any as string;
|
||||
|
||||
// Should parse as a union type, not a bitwise 'or' of (32 as number) and 'string'
|
||||
var j = 32 as number|string;
|
||||
>j : string | number
|
||||
>32 as number|string : string | number
|
||||
>j : number | string
|
||||
>32 as number|string : number | string
|
||||
>32 : number
|
||||
|
||||
j = '';
|
||||
>j = '' : string
|
||||
>j : string | number
|
||||
>j : number | string
|
||||
>'' : string
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatBetweenTupleAndArray.ts(17,1): error TS2322: Type '[number, string]' is not assignable to type 'number[]'.
|
||||
Types of property 'pop' are incompatible.
|
||||
Type '() => string | number' is not assignable to type '() => number'.
|
||||
Type 'string | number' is not assignable to type 'number'.
|
||||
Type '() => number | string' is not assignable to type '() => number'.
|
||||
Type 'number | string' is not assignable to type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignmentCompatBetweenTupleAndArray.ts(18,1): error TS2322: Type '{}[]' is not assignable to type '[{}]'.
|
||||
Property '0' is missing in type '{}[]'.
|
||||
@@ -28,8 +28,8 @@ tests/cases/conformance/types/typeRelationships/assignmentCompatibility/assignme
|
||||
~~~~~~~~
|
||||
!!! error TS2322: Type '[number, string]' is not assignable to type 'number[]'.
|
||||
!!! error TS2322: Types of property 'pop' are incompatible.
|
||||
!!! error TS2322: Type '() => string | number' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'string | number' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type '() => number | string' is not assignable to type '() => number'.
|
||||
!!! error TS2322: Type 'number | string' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
emptyObjTuple = emptyObjArray;
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
tests/cases/compiler/assignmentCompatBug2.ts(1,5): error TS2322: Type '{ a: number; }' is not assignable to type '{ b: number; }'.
|
||||
Property 'b' is missing in type '{ a: number; }'.
|
||||
Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
tests/cases/compiler/assignmentCompatBug2.ts(3,1): error TS2322: Type '{ a: number; }' is not assignable to type '{ b: number; }'.
|
||||
Property 'b' is missing in type '{ a: number; }'.
|
||||
Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
tests/cases/compiler/assignmentCompatBug2.ts(5,1): error TS2322: Type '{ b: number; a: number; }' is not assignable to type '{ b: number; }'.
|
||||
Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
tests/cases/compiler/assignmentCompatBug2.ts(15,1): error TS2322: Type '{ f: (n: number) => number; g: (s: string) => number; }' is not assignable to type '{ f(n: number): number; g(s: string): number; m: number; n?: number; k?(a: any): any; }'.
|
||||
Property 'm' is missing in type '{ f: (n: number) => number; g: (s: string) => number; }'.
|
||||
tests/cases/compiler/assignmentCompatBug2.ts(20,1): error TS2322: Type '{ f: (n: number) => number; m: number; }' is not assignable to type '{ f(n: number): number; g(s: string): number; m: number; n?: number; k?(a: any): any; }'.
|
||||
@@ -10,18 +12,21 @@ tests/cases/compiler/assignmentCompatBug2.ts(33,1): error TS2322: Type '{ f: (n:
|
||||
Property 'm' is missing in type '{ f: (n: number) => number; g: (s: string) => number; n: number; k: (a: any) => any; }'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/assignmentCompatBug2.ts (5 errors) ====
|
||||
==== tests/cases/compiler/assignmentCompatBug2.ts (6 errors) ====
|
||||
var b2: { b: number;} = { a: 0 }; // error
|
||||
~~
|
||||
!!! error TS2322: Type '{ a: number; }' is not assignable to type '{ b: number; }'.
|
||||
!!! error TS2322: Property 'b' is missing in type '{ a: number; }'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
|
||||
b2 = { a: 0 }; // error
|
||||
~~
|
||||
!!! error TS2322: Type '{ a: number; }' is not assignable to type '{ b: number; }'.
|
||||
!!! error TS2322: Property 'b' is missing in type '{ a: number; }'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
|
||||
b2 = {b: 0, a: 0 };
|
||||
~~
|
||||
!!! error TS2322: Type '{ b: number; a: number; }' is not assignable to type '{ b: number; }'.
|
||||
!!! error TS2322: Object literal may only specify known properties, and 'a' does not exist in type '{ b: number; }'.
|
||||
|
||||
var b3: { f(n: number): number; g(s: string): number; m: number; n?: number; k?(a: any): any; };
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
tests/cases/compiler/assignmentCompatBug5.ts(2,6): error TS2345: Argument of type '{ b: number; }' is not assignable to parameter of type '{ a: number; }'.
|
||||
Property 'a' is missing in type '{ b: number; }'.
|
||||
Object literal may only specify known properties, and 'b' does not exist in type '{ a: number; }'.
|
||||
tests/cases/compiler/assignmentCompatBug5.ts(5,6): error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'number[]'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/compiler/assignmentCompatBug5.ts(8,6): error TS2345: Argument of type '(s: string) => void' is not assignable to parameter of type '(n: number) => number'.
|
||||
@@ -14,7 +14,7 @@ tests/cases/compiler/assignmentCompatBug5.ts(9,6): error TS2345: Argument of typ
|
||||
foo1({ b: 5 });
|
||||
~~~~~~~~
|
||||
!!! error TS2345: Argument of type '{ b: number; }' is not assignable to parameter of type '{ a: number; }'.
|
||||
!!! error TS2345: Property 'a' is missing in type '{ b: number; }'.
|
||||
!!! error TS2345: Object literal may only specify known properties, and 'b' does not exist in type '{ a: number; }'.
|
||||
|
||||
function foo2(x: number[]) { }
|
||||
foo2(["s", "t"]);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
=== tests/cases/conformance/async/es6/awaitUnion_es6.ts ===
|
||||
declare let a: number | string;
|
||||
>a : string | number
|
||||
>a : number | string
|
||||
|
||||
declare let b: PromiseLike<number> | PromiseLike<string>;
|
||||
>b : PromiseLike<number> | PromiseLike<string>
|
||||
@@ -8,7 +8,7 @@ declare let b: PromiseLike<number> | PromiseLike<string>;
|
||||
>PromiseLike : PromiseLike<T>
|
||||
|
||||
declare let c: PromiseLike<number | string>;
|
||||
>c : PromiseLike<string | number>
|
||||
>c : PromiseLike<number | string>
|
||||
>PromiseLike : PromiseLike<T>
|
||||
|
||||
declare let d: number | PromiseLike<string>;
|
||||
@@ -16,29 +16,29 @@ declare let d: number | PromiseLike<string>;
|
||||
>PromiseLike : PromiseLike<T>
|
||||
|
||||
declare let e: number | PromiseLike<number | string>;
|
||||
>e : number | PromiseLike<string | number>
|
||||
>e : number | PromiseLike<number | string>
|
||||
>PromiseLike : PromiseLike<T>
|
||||
|
||||
async function f() {
|
||||
>f : () => Promise<void>
|
||||
|
||||
let await_a = await a;
|
||||
>await_a : string | number
|
||||
>await_a : number | string
|
||||
>a : any
|
||||
|
||||
let await_b = await b;
|
||||
>await_b : string | number
|
||||
>await_b : number | string
|
||||
>b : any
|
||||
|
||||
let await_c = await c;
|
||||
>await_c : string | number
|
||||
>await_c : number | string
|
||||
>c : any
|
||||
|
||||
let await_d = await d;
|
||||
>await_d : string | number
|
||||
>await_d : number | string
|
||||
>d : any
|
||||
|
||||
let await_e = await e;
|
||||
>await_e : string | number
|
||||
>await_e : number | string
|
||||
>e : any
|
||||
}
|
||||
|
||||
@@ -46,8 +46,8 @@ var r = true ? 1 : 2;
|
||||
>2 : number
|
||||
|
||||
var r3 = true ? 1 : {};
|
||||
>r3 : {}
|
||||
>true ? 1 : {} : {}
|
||||
>r3 : number | {}
|
||||
>true ? 1 : {} : number | {}
|
||||
>true : boolean
|
||||
>1 : number
|
||||
>{} : {}
|
||||
@@ -60,15 +60,15 @@ var r4 = true ? a : b; // typeof a
|
||||
>b : { x: number; z?: number; }
|
||||
|
||||
var r5 = true ? b : a; // typeof b
|
||||
>r5 : { x: number; y?: number; } | { x: number; z?: number; }
|
||||
>true ? b : a : { x: number; y?: number; } | { x: number; z?: number; }
|
||||
>r5 : { x: number; z?: number; } | { x: number; y?: number; }
|
||||
>true ? b : a : { x: number; z?: number; } | { x: number; y?: number; }
|
||||
>true : boolean
|
||||
>b : { x: number; z?: number; }
|
||||
>a : { x: number; y?: number; }
|
||||
|
||||
var r6 = true ? (x: number) => { } : (x: Object) => { }; // returns number => void
|
||||
>r6 : (x: number) => void
|
||||
>true ? (x: number) => { } : (x: Object) => { } : (x: number) => void
|
||||
>r6 : ((x: number) => void) | ((x: Object) => void)
|
||||
>true ? (x: number) => { } : (x: Object) => { } : ((x: number) => void) | ((x: Object) => void)
|
||||
>true : boolean
|
||||
>(x: number) => { } : (x: number) => void
|
||||
>x : number
|
||||
@@ -80,7 +80,7 @@ var r7: (x: Object) => void = true ? (x: number) => { } : (x: Object) => { };
|
||||
>r7 : (x: Object) => void
|
||||
>x : Object
|
||||
>Object : Object
|
||||
>true ? (x: number) => { } : (x: Object) => { } : (x: number) => void
|
||||
>true ? (x: number) => { } : (x: Object) => { } : ((x: number) => void) | ((x: Object) => void)
|
||||
>true : boolean
|
||||
>(x: number) => { } : (x: number) => void
|
||||
>x : number
|
||||
@@ -89,8 +89,8 @@ var r7: (x: Object) => void = true ? (x: number) => { } : (x: Object) => { };
|
||||
>Object : Object
|
||||
|
||||
var r8 = true ? (x: Object) => { } : (x: number) => { }; // returns Object => void
|
||||
>r8 : (x: Object) => void
|
||||
>true ? (x: Object) => { } : (x: number) => { } : (x: Object) => void
|
||||
>r8 : ((x: Object) => void) | ((x: number) => void)
|
||||
>true ? (x: Object) => { } : (x: number) => { } : ((x: Object) => void) | ((x: number) => void)
|
||||
>true : boolean
|
||||
>(x: Object) => { } : (x: Object) => void
|
||||
>x : Object
|
||||
@@ -107,8 +107,8 @@ var r10: Base = true ? derived : derived2; // no error since we use the contextu
|
||||
>derived2 : Derived2
|
||||
|
||||
var r11 = true ? base : derived2;
|
||||
>r11 : Base
|
||||
>true ? base : derived2 : Base
|
||||
>r11 : Base | Derived2
|
||||
>true ? base : derived2 : Base | Derived2
|
||||
>true : boolean
|
||||
>base : Base
|
||||
>derived2 : Derived2
|
||||
|
||||
@@ -98,8 +98,8 @@ var e3 = t3[2]; // any
|
||||
>2 : number
|
||||
|
||||
var e4 = t4[3]; // number
|
||||
>e4 : number
|
||||
>t4[3] : number
|
||||
>e4 : E1 | E2 | number
|
||||
>t4[3] : E1 | E2 | number
|
||||
>t4 : [E1, E2, number]
|
||||
>3 : number
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ var t5: [C1, F]
|
||||
>F : F
|
||||
|
||||
var e11 = t1[4]; // base
|
||||
>e11 : base
|
||||
>t1[4] : base
|
||||
>e11 : C | base
|
||||
>t1[4] : C | base
|
||||
>t1 : [C, base]
|
||||
>4 : number
|
||||
|
||||
@@ -78,20 +78,20 @@ var e21 = t2[4]; // {}
|
||||
>4 : number
|
||||
|
||||
var e31 = t3[4]; // C1
|
||||
>e31 : C1
|
||||
>t3[4] : C1
|
||||
>e31 : C1 | D1
|
||||
>t3[4] : C1 | D1
|
||||
>t3 : [C1, D1]
|
||||
>4 : number
|
||||
|
||||
var e41 = t4[2]; // base1
|
||||
>e41 : base1
|
||||
>t4[2] : base1
|
||||
>e41 : base1 | C1
|
||||
>t4[2] : base1 | C1
|
||||
>t4 : [base1, C1]
|
||||
>2 : number
|
||||
|
||||
var e51 = t5[2]; // {}
|
||||
>e51 : F | C1
|
||||
>t5[2] : F | C1
|
||||
>e51 : C1 | F
|
||||
>t5[2] : C1 | F
|
||||
>t5 : [C1, F]
|
||||
>2 : number
|
||||
|
||||
|
||||
@@ -27,43 +27,43 @@ var z: Z;
|
||||
|
||||
// All these arrays should be X[]
|
||||
var b1 = [x, y, z];
|
||||
>b1 : X[]
|
||||
>[x, y, z] : X[]
|
||||
>b1 : (X | Y | Z)[]
|
||||
>[x, y, z] : (X | Y | Z)[]
|
||||
>x : X
|
||||
>y : Y
|
||||
>z : Z
|
||||
|
||||
var b2 = [x, z, y];
|
||||
>b2 : X[]
|
||||
>[x, z, y] : X[]
|
||||
>b2 : (X | Z | Y)[]
|
||||
>[x, z, y] : (X | Z | Y)[]
|
||||
>x : X
|
||||
>z : Z
|
||||
>y : Y
|
||||
|
||||
var b3 = [y, x, z];
|
||||
>b3 : X[]
|
||||
>[y, x, z] : X[]
|
||||
>b3 : (Y | X | Z)[]
|
||||
>[y, x, z] : (Y | X | Z)[]
|
||||
>y : Y
|
||||
>x : X
|
||||
>z : Z
|
||||
|
||||
var b4 = [y, z, x];
|
||||
>b4 : X[]
|
||||
>[y, z, x] : X[]
|
||||
>b4 : (Y | Z | X)[]
|
||||
>[y, z, x] : (Y | Z | X)[]
|
||||
>y : Y
|
||||
>z : Z
|
||||
>x : X
|
||||
|
||||
var b5 = [z, x, y];
|
||||
>b5 : X[]
|
||||
>[z, x, y] : X[]
|
||||
>b5 : (Z | X | Y)[]
|
||||
>[z, x, y] : (Z | X | Y)[]
|
||||
>z : Z
|
||||
>x : X
|
||||
>y : Y
|
||||
|
||||
var b6 = [z, y, x];
|
||||
>b6 : X[]
|
||||
>[z, y, x] : X[]
|
||||
>b6 : (Z | Y | X)[]
|
||||
>[z, y, x] : (Z | Y | X)[]
|
||||
>z : Z
|
||||
>y : Y
|
||||
>x : X
|
||||
|
||||
@@ -163,8 +163,8 @@ xa[1].foo(1, 2, ...a, "abc");
|
||||
>xa : X[]
|
||||
>1 : number
|
||||
>foo : (x: number, y: number, ...z: string[]) => any
|
||||
>...[1, 2, "abc"] : string | number
|
||||
>[1, 2, "abc"] : (string | number)[]
|
||||
>...[1, 2, "abc"] : number | string
|
||||
>[1, 2, "abc"] : (number | string)[]
|
||||
>1 : number
|
||||
>2 : number
|
||||
>"abc" : string
|
||||
|
||||
@@ -164,8 +164,8 @@ xa[1].foo(1, 2, ...a, "abc");
|
||||
>xa : X[]
|
||||
>1 : number
|
||||
>foo : (x: number, y: number, ...z: string[]) => any
|
||||
>...[1, 2, "abc"] : string | number
|
||||
>[1, 2, "abc"] : (string | number)[]
|
||||
>...[1, 2, "abc"] : number | string
|
||||
>[1, 2, "abc"] : (number | string)[]
|
||||
>1 : number
|
||||
>2 : number
|
||||
>"abc" : string
|
||||
|
||||
@@ -8,11 +8,12 @@ tests/cases/conformance/types/tuple/castingTuple.ts(28,10): error TS2352: Neithe
|
||||
tests/cases/conformance/types/tuple/castingTuple.ts(29,10): error TS2352: Neither type '[C, D]' nor type '[A, I]' is assignable to the other.
|
||||
Types of property '0' are incompatible.
|
||||
Type 'C' is not assignable to type 'A'.
|
||||
Property 'a' is missing in type 'C'.
|
||||
tests/cases/conformance/types/tuple/castingTuple.ts(30,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'array1' must be of type '{}[]', but here has type 'number[]'.
|
||||
tests/cases/conformance/types/tuple/castingTuple.ts(30,14): error TS2352: Neither type '[number, string]' nor type 'number[]' is assignable to the other.
|
||||
Types of property 'pop' are incompatible.
|
||||
Type '() => string | number' is not assignable to type '() => number'.
|
||||
Type 'string | number' is not assignable to type 'number'.
|
||||
Type '() => number | string' is not assignable to type '() => number'.
|
||||
Type 'number | string' is not assignable to type 'number'.
|
||||
Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/types/tuple/castingTuple.ts(31,1): error TS2304: Cannot find name 't4'.
|
||||
|
||||
@@ -61,14 +62,15 @@ tests/cases/conformance/types/tuple/castingTuple.ts(31,1): error TS2304: Cannot
|
||||
!!! error TS2352: Neither type '[C, D]' nor type '[A, I]' is assignable to the other.
|
||||
!!! error TS2352: Types of property '0' are incompatible.
|
||||
!!! error TS2352: Type 'C' is not assignable to type 'A'.
|
||||
!!! error TS2352: Property 'a' is missing in type 'C'.
|
||||
var array1 = <number[]>numStrTuple;
|
||||
~~~~~~
|
||||
!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'array1' must be of type '{}[]', but here has type 'number[]'.
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
!!! error TS2352: Neither type '[number, string]' nor type 'number[]' is assignable to the other.
|
||||
!!! error TS2352: Types of property 'pop' are incompatible.
|
||||
!!! error TS2352: Type '() => string | number' is not assignable to type '() => number'.
|
||||
!!! error TS2352: Type 'string | number' is not assignable to type 'number'.
|
||||
!!! error TS2352: Type '() => number | string' is not assignable to type '() => number'.
|
||||
!!! error TS2352: Type 'number | string' is not assignable to type 'number'.
|
||||
!!! error TS2352: Type 'string' is not assignable to type 'number'.
|
||||
t4[2] = 10;
|
||||
~~
|
||||
|
||||
@@ -17,9 +17,9 @@ declare function foo<T>(obj: I<T>): T
|
||||
>T : T
|
||||
|
||||
foo({
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | number | boolean | (() => void) | number[]
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | (() => void) | boolean | number | number[]
|
||||
>foo : <T>(obj: I<T>) => T
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | boolean | (() => void) | number[]; 0: () => void; p: string; }
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | (() => void) | boolean | number | number[]; 0: () => void; p: string; }
|
||||
|
||||
p: "",
|
||||
>p : string
|
||||
|
||||
@@ -17,9 +17,9 @@ declare function foo<T>(obj: I<T>): T
|
||||
>T : T
|
||||
|
||||
foo({
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | number | boolean | (() => void) | number[]
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : string | (() => void) | boolean | number | number[]
|
||||
>foo : <T>(obj: I<T>) => T
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | number | boolean | (() => void) | number[]; 0: () => void; p: string; }
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: string]: string | (() => void) | boolean | number | number[]; 0: () => void; p: string; }
|
||||
|
||||
p: "",
|
||||
>p : string
|
||||
|
||||
@@ -17,9 +17,9 @@ declare function foo<T>(obj: I<T>): T
|
||||
>T : T
|
||||
|
||||
foo({
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : number | (() => void) | number[]
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : (() => void) | number | number[]
|
||||
>foo : <T>(obj: I<T>) => T
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: number]: (() => void) | number | number[]; 0: () => void; p: string; }
|
||||
|
||||
p: "",
|
||||
>p : string
|
||||
|
||||
@@ -17,9 +17,9 @@ declare function foo<T>(obj: I<T>): T
|
||||
>T : T
|
||||
|
||||
foo({
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : number | (() => void) | number[]
|
||||
>foo({ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]}) : (() => void) | number | number[]
|
||||
>foo : <T>(obj: I<T>) => T
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: number]: number | (() => void) | number[]; 0: () => void; p: string; }
|
||||
>{ p: "", 0: () => { }, ["hi" + "bye"]: true, [0 + 1]: 0, [+"hi"]: [0]} : { [x: number]: (() => void) | number | number[]; 0: () => void; p: string; }
|
||||
|
||||
p: "",
|
||||
>p : string
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
tests/cases/compiler/conditionalExpression1.ts(1,5): error TS2322: Type 'string | number' is not assignable to type 'boolean'.
|
||||
Type 'string' is not assignable to type 'boolean'.
|
||||
tests/cases/compiler/conditionalExpression1.ts(1,5): error TS2322: Type 'number | string' is not assignable to type 'boolean'.
|
||||
Type 'number' is not assignable to type 'boolean'.
|
||||
|
||||
|
||||
==== tests/cases/compiler/conditionalExpression1.ts (1 errors) ====
|
||||
var x: boolean = (true ? 1 : ""); // should be an error
|
||||
~
|
||||
!!! error TS2322: Type 'string | number' is not assignable to type 'boolean'.
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'boolean'.
|
||||
!!! error TS2322: Type 'number | string' is not assignable to type 'boolean'.
|
||||
!!! error TS2322: Type 'number' is not assignable to type 'boolean'.
|
||||
@@ -31,27 +31,27 @@ var b: B;
|
||||
//Cond ? Expr1 : Expr2, Expr1 is supertype
|
||||
//Be Not contextually typed
|
||||
true ? x : a;
|
||||
>true ? x : a : X
|
||||
>true ? x : a : X | A
|
||||
>true : boolean
|
||||
>x : X
|
||||
>a : A
|
||||
|
||||
var result1 = true ? x : a;
|
||||
>result1 : X
|
||||
>true ? x : a : X
|
||||
>result1 : X | A
|
||||
>true ? x : a : X | A
|
||||
>true : boolean
|
||||
>x : X
|
||||
>a : A
|
||||
|
||||
//Expr1 and Expr2 are literals
|
||||
true ? {} : 1;
|
||||
>true ? {} : 1 : {}
|
||||
>true ? {} : 1 : {} | number
|
||||
>true : boolean
|
||||
>{} : {}
|
||||
>1 : number
|
||||
|
||||
true ? { a: 1 } : { a: 2, b: 'string' };
|
||||
>true ? { a: 1 } : { a: 2, b: 'string' } : { a: number; }
|
||||
>true ? { a: 1 } : { a: 2, b: 'string' } : { a: number; } | { a: number; b: string; }
|
||||
>true : boolean
|
||||
>{ a: 1 } : { a: number; }
|
||||
>a : number
|
||||
@@ -63,15 +63,15 @@ true ? { a: 1 } : { a: 2, b: 'string' };
|
||||
>'string' : string
|
||||
|
||||
var result2 = true ? {} : 1;
|
||||
>result2 : {}
|
||||
>true ? {} : 1 : {}
|
||||
>result2 : {} | number
|
||||
>true ? {} : 1 : {} | number
|
||||
>true : boolean
|
||||
>{} : {}
|
||||
>1 : number
|
||||
|
||||
var result3 = true ? { a: 1 } : { a: 2, b: 'string' };
|
||||
>result3 : { a: number; }
|
||||
>true ? { a: 1 } : { a: 2, b: 'string' } : { a: number; }
|
||||
>result3 : { a: number; } | { a: number; b: string; }
|
||||
>true ? { a: 1 } : { a: 2, b: 'string' } : { a: number; } | { a: number; b: string; }
|
||||
>true : boolean
|
||||
>{ a: 1 } : { a: number; }
|
||||
>a : number
|
||||
@@ -86,7 +86,7 @@ var result3 = true ? { a: 1 } : { a: 2, b: 'string' };
|
||||
var resultIsX1: X = true ? x : a;
|
||||
>resultIsX1 : X
|
||||
>X : X
|
||||
>true ? x : a : X
|
||||
>true ? x : a : X | A
|
||||
>true : boolean
|
||||
>x : X
|
||||
>a : A
|
||||
@@ -95,7 +95,7 @@ var result4: (t: A) => any = true ? (m) => m.propertyX : (n) => n.propertyA;
|
||||
>result4 : (t: A) => any
|
||||
>t : A
|
||||
>A : A
|
||||
>true ? (m) => m.propertyX : (n) => n.propertyA : (m: A) => any
|
||||
>true ? (m) => m.propertyX : (n) => n.propertyA : ((m: A) => any) | ((n: A) => number)
|
||||
>true : boolean
|
||||
>(m) => m.propertyX : (m: A) => any
|
||||
>m : A
|
||||
@@ -111,27 +111,27 @@ var result4: (t: A) => any = true ? (m) => m.propertyX : (n) => n.propertyA;
|
||||
//Cond ? Expr1 : Expr2, Expr2 is supertype
|
||||
//Be Not contextually typed
|
||||
true ? a : x;
|
||||
>true ? a : x : X
|
||||
>true ? a : x : A | X
|
||||
>true : boolean
|
||||
>a : A
|
||||
>x : X
|
||||
|
||||
var result5 = true ? a : x;
|
||||
>result5 : X
|
||||
>true ? a : x : X
|
||||
>result5 : A | X
|
||||
>true ? a : x : A | X
|
||||
>true : boolean
|
||||
>a : A
|
||||
>x : X
|
||||
|
||||
//Expr1 and Expr2 are literals
|
||||
true ? 1 : {};
|
||||
>true ? 1 : {} : {}
|
||||
>true ? 1 : {} : number | {}
|
||||
>true : boolean
|
||||
>1 : number
|
||||
>{} : {}
|
||||
|
||||
true ? { a: 2, b: 'string' } : { a: 1 };
|
||||
>true ? { a: 2, b: 'string' } : { a: 1 } : { a: number; }
|
||||
>true ? { a: 2, b: 'string' } : { a: 1 } : { a: number; b: string; } | { a: number; }
|
||||
>true : boolean
|
||||
>{ a: 2, b: 'string' } : { a: number; b: string; }
|
||||
>a : number
|
||||
@@ -143,15 +143,15 @@ true ? { a: 2, b: 'string' } : { a: 1 };
|
||||
>1 : number
|
||||
|
||||
var result6 = true ? 1 : {};
|
||||
>result6 : {}
|
||||
>true ? 1 : {} : {}
|
||||
>result6 : number | {}
|
||||
>true ? 1 : {} : number | {}
|
||||
>true : boolean
|
||||
>1 : number
|
||||
>{} : {}
|
||||
|
||||
var result7 = true ? { a: 2, b: 'string' } : { a: 1 };
|
||||
>result7 : { a: number; }
|
||||
>true ? { a: 2, b: 'string' } : { a: 1 } : { a: number; }
|
||||
>result7 : { a: number; b: string; } | { a: number; }
|
||||
>true ? { a: 2, b: 'string' } : { a: 1 } : { a: number; b: string; } | { a: number; }
|
||||
>true : boolean
|
||||
>{ a: 2, b: 'string' } : { a: number; b: string; }
|
||||
>a : number
|
||||
@@ -166,7 +166,7 @@ var result7 = true ? { a: 2, b: 'string' } : { a: 1 };
|
||||
var resultIsX2: X = true ? x : a;
|
||||
>resultIsX2 : X
|
||||
>X : X
|
||||
>true ? x : a : X
|
||||
>true ? x : a : X | A
|
||||
>true : boolean
|
||||
>x : X
|
||||
>a : A
|
||||
@@ -175,7 +175,7 @@ var result8: (t: A) => any = true ? (m) => m.propertyA : (n) => n.propertyX;
|
||||
>result8 : (t: A) => any
|
||||
>t : A
|
||||
>A : A
|
||||
>true ? (m) => m.propertyA : (n) => n.propertyX : (n: A) => any
|
||||
>true ? (m) => m.propertyA : (n) => n.propertyX : ((m: A) => number) | ((n: A) => any)
|
||||
>true : boolean
|
||||
>(m) => m.propertyA : (m: A) => number
|
||||
>m : A
|
||||
@@ -218,7 +218,7 @@ var result10: (t: X) => any = true ? (m) => m.propertyX1 : (n) => n.propertyX2;
|
||||
//Expr1 and Expr2 are literals
|
||||
var result11: any = true ? 1 : 'string';
|
||||
>result11 : any
|
||||
>true ? 1 : 'string' : string | number
|
||||
>true ? 1 : 'string' : number | string
|
||||
>true : boolean
|
||||
>1 : number
|
||||
>'string' : string
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
//// [constEnumMergingWithValues1.ts]
|
||||
|
||||
function foo() {}
|
||||
module foo {
|
||||
const enum E { X }
|
||||
}
|
||||
|
||||
export = foo
|
||||
|
||||
//// [constEnumMergingWithValues1.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
function foo() { }
|
||||
return foo;
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues1.ts ===
|
||||
|
||||
function foo() {}
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues1.ts, 0, 0), Decl(constEnumMergingWithValues1.ts, 1, 17))
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues1.ts, 0, 0), Decl(constEnumMergingWithValues1.ts, 1, 17))
|
||||
|
||||
const enum E { X }
|
||||
>E : Symbol(E, Decl(constEnumMergingWithValues1.ts, 2, 12))
|
||||
>X : Symbol(E.X, Decl(constEnumMergingWithValues1.ts, 3, 18))
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues1.ts, 0, 0), Decl(constEnumMergingWithValues1.ts, 1, 17))
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues1.ts ===
|
||||
|
||||
function foo() {}
|
||||
>foo : typeof foo
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
const enum E { X }
|
||||
>E : E
|
||||
>X : E
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : typeof foo
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
//// [constEnumMergingWithValues2.ts]
|
||||
|
||||
class foo {}
|
||||
module foo {
|
||||
const enum E { X }
|
||||
}
|
||||
|
||||
export = foo
|
||||
|
||||
//// [constEnumMergingWithValues2.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
var foo = (function () {
|
||||
function foo() {
|
||||
}
|
||||
return foo;
|
||||
})();
|
||||
return foo;
|
||||
});
|
||||
@@ -0,0 +1,16 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues2.ts ===
|
||||
|
||||
class foo {}
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues2.ts, 0, 0), Decl(constEnumMergingWithValues2.ts, 1, 12))
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues2.ts, 0, 0), Decl(constEnumMergingWithValues2.ts, 1, 12))
|
||||
|
||||
const enum E { X }
|
||||
>E : Symbol(E, Decl(constEnumMergingWithValues2.ts, 2, 12))
|
||||
>X : Symbol(E.X, Decl(constEnumMergingWithValues2.ts, 3, 18))
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues2.ts, 0, 0), Decl(constEnumMergingWithValues2.ts, 1, 12))
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues2.ts ===
|
||||
|
||||
class foo {}
|
||||
>foo : foo
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
const enum E { X }
|
||||
>E : E
|
||||
>X : E
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : foo
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
//// [constEnumMergingWithValues3.ts]
|
||||
|
||||
enum foo { A }
|
||||
module foo {
|
||||
const enum E { X }
|
||||
}
|
||||
|
||||
export = foo
|
||||
|
||||
//// [constEnumMergingWithValues3.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
var foo;
|
||||
(function (foo) {
|
||||
foo[foo["A"] = 0] = "A";
|
||||
})(foo || (foo = {}));
|
||||
return foo;
|
||||
});
|
||||
@@ -0,0 +1,17 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues3.ts ===
|
||||
|
||||
enum foo { A }
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues3.ts, 0, 0), Decl(constEnumMergingWithValues3.ts, 1, 14))
|
||||
>A : Symbol(foo.A, Decl(constEnumMergingWithValues3.ts, 1, 10))
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues3.ts, 0, 0), Decl(constEnumMergingWithValues3.ts, 1, 14))
|
||||
|
||||
const enum E { X }
|
||||
>E : Symbol(E, Decl(constEnumMergingWithValues3.ts, 2, 12))
|
||||
>X : Symbol(E.X, Decl(constEnumMergingWithValues3.ts, 3, 18))
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues3.ts, 0, 0), Decl(constEnumMergingWithValues3.ts, 1, 14))
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues3.ts ===
|
||||
|
||||
enum foo { A }
|
||||
>foo : foo
|
||||
>A : foo
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
const enum E { X }
|
||||
>E : E
|
||||
>X : E
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : foo
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
//// [constEnumMergingWithValues4.ts]
|
||||
|
||||
module foo {
|
||||
const enum E { X }
|
||||
}
|
||||
|
||||
module foo {
|
||||
var x = 1;
|
||||
}
|
||||
|
||||
|
||||
export = foo
|
||||
|
||||
//// [constEnumMergingWithValues4.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
var foo;
|
||||
(function (foo) {
|
||||
var x = 1;
|
||||
})(foo || (foo = {}));
|
||||
return foo;
|
||||
});
|
||||
@@ -0,0 +1,21 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues4.ts ===
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues4.ts, 0, 0), Decl(constEnumMergingWithValues4.ts, 3, 1))
|
||||
|
||||
const enum E { X }
|
||||
>E : Symbol(E, Decl(constEnumMergingWithValues4.ts, 1, 12))
|
||||
>X : Symbol(E.X, Decl(constEnumMergingWithValues4.ts, 2, 18))
|
||||
}
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues4.ts, 0, 0), Decl(constEnumMergingWithValues4.ts, 3, 1))
|
||||
|
||||
var x = 1;
|
||||
>x : Symbol(x, Decl(constEnumMergingWithValues4.ts, 6, 7))
|
||||
}
|
||||
|
||||
|
||||
export = foo
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues4.ts, 0, 0), Decl(constEnumMergingWithValues4.ts, 3, 1))
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues4.ts ===
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
const enum E { X }
|
||||
>E : E
|
||||
>X : E
|
||||
}
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
var x = 1;
|
||||
>x : number
|
||||
>1 : number
|
||||
}
|
||||
|
||||
|
||||
export = foo
|
||||
>foo : typeof foo
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
//// [constEnumMergingWithValues5.ts]
|
||||
|
||||
module foo {
|
||||
const enum E { X }
|
||||
}
|
||||
|
||||
export = foo
|
||||
|
||||
//// [constEnumMergingWithValues5.js]
|
||||
define(["require", "exports"], function (require, exports) {
|
||||
var foo;
|
||||
(function (foo) {
|
||||
var E;
|
||||
(function (E) {
|
||||
E[E["X"] = 0] = "X";
|
||||
})(E || (E = {}));
|
||||
})(foo || (foo = {}));
|
||||
return foo;
|
||||
});
|
||||
@@ -0,0 +1,13 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues5.ts ===
|
||||
|
||||
module foo {
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues5.ts, 0, 0))
|
||||
|
||||
const enum E { X }
|
||||
>E : Symbol(E, Decl(constEnumMergingWithValues5.ts, 1, 12))
|
||||
>X : Symbol(E.X, Decl(constEnumMergingWithValues5.ts, 2, 18))
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : Symbol(foo, Decl(constEnumMergingWithValues5.ts, 0, 0))
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
=== tests/cases/compiler/constEnumMergingWithValues5.ts ===
|
||||
|
||||
module foo {
|
||||
>foo : typeof foo
|
||||
|
||||
const enum E { X }
|
||||
>E : E
|
||||
>X : E
|
||||
}
|
||||
|
||||
export = foo
|
||||
>foo : typeof foo
|
||||
|
||||
@@ -87,24 +87,24 @@ var a = baz(1, 1, g); // Should be number
|
||||
>g : <T>(x: T, y: T) => T
|
||||
|
||||
var b: number | string;
|
||||
>b : string | number
|
||||
>b : number | string
|
||||
|
||||
var b = foo(g); // Should be number | string
|
||||
>b : string | number
|
||||
>foo(g) : string | number
|
||||
>b : number | string
|
||||
>foo(g) : number | string
|
||||
>foo : <T>(cb: (x: number, y: string) => T) => T
|
||||
>g : <T>(x: T, y: T) => T
|
||||
|
||||
var b = bar(1, "one", g); // Should be number | string
|
||||
>b : string | number
|
||||
>bar(1, "one", g) : string | number
|
||||
>b : number | string
|
||||
>bar(1, "one", g) : number | string
|
||||
>bar : <T, U, V>(x: T, y: U, cb: (x: T, y: U) => V) => V
|
||||
>1 : number
|
||||
>"one" : string
|
||||
>g : <T>(x: T, y: T) => T
|
||||
|
||||
var b = bar("one", 1, g); // Should be number | string
|
||||
>b : string | number
|
||||
>b : number | string
|
||||
>bar("one", 1, g) : string | number
|
||||
>bar : <T, U, V>(x: T, y: U, cb: (x: T, y: U) => V) => V
|
||||
>"one" : string
|
||||
@@ -112,11 +112,11 @@ var b = bar("one", 1, g); // Should be number | string
|
||||
>g : <T>(x: T, y: T) => T
|
||||
|
||||
var b = baz(b, b, g); // Should be number | string
|
||||
>b : string | number
|
||||
>baz(b, b, g) : string | number
|
||||
>b : number | string
|
||||
>baz(b, b, g) : number | string
|
||||
>baz : <T, U>(x: T, y: T, cb: (x: T, y: T) => U) => U
|
||||
>b : string | number
|
||||
>b : string | number
|
||||
>b : number | string
|
||||
>b : number | string
|
||||
>g : <T>(x: T, y: T) => T
|
||||
|
||||
var d: number[] | string[];
|
||||
@@ -138,7 +138,7 @@ var d = bar(1, "one", h); // Should be number[] | string[]
|
||||
|
||||
var d = bar("one", 1, h); // Should be number[] | string[]
|
||||
>d : number[] | string[]
|
||||
>bar("one", 1, h) : number[] | string[]
|
||||
>bar("one", 1, h) : string[] | number[]
|
||||
>bar : <T, U, V>(x: T, y: U, cb: (x: T, y: U) => V) => V
|
||||
>"one" : string
|
||||
>1 : number
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(3,5): error TS2322: Type '[number, string, boolean]' is not assignable to type '[number, string]'.
|
||||
Types of property 'pop' are incompatible.
|
||||
Type '() => string | number | boolean' is not assignable to type '() => string | number'.
|
||||
Type 'string | number | boolean' is not assignable to type 'string | number'.
|
||||
Type 'boolean' is not assignable to type 'string | number'.
|
||||
Type 'boolean' is not assignable to type 'number'.
|
||||
Type '() => number | string | boolean' is not assignable to type '() => number | string'.
|
||||
Type 'number | string | boolean' is not assignable to type 'number | string'.
|
||||
Type 'boolean' is not assignable to type 'number | string'.
|
||||
Type 'boolean' is not assignable to type 'string'.
|
||||
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(15,1): error TS2322: Type '[number, string, boolean]' is not assignable to type '[number, string]'.
|
||||
tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(18,1): error TS2322: Type '[{}, number]' is not assignable to type '[{ a: string; }, number]'.
|
||||
Types of property '0' are incompatible.
|
||||
@@ -31,10 +31,10 @@ tests/cases/conformance/types/tuple/contextualTypeWithTuple.ts(25,1): error TS23
|
||||
~~~~~~~~~~~~
|
||||
!!! error TS2322: Type '[number, string, boolean]' is not assignable to type '[number, string]'.
|
||||
!!! error TS2322: Types of property 'pop' are incompatible.
|
||||
!!! error TS2322: Type '() => string | number | boolean' is not assignable to type '() => string | number'.
|
||||
!!! error TS2322: Type 'string | number | boolean' is not assignable to type 'string | number'.
|
||||
!!! error TS2322: Type 'boolean' is not assignable to type 'string | number'.
|
||||
!!! error TS2322: Type 'boolean' is not assignable to type 'number'.
|
||||
!!! error TS2322: Type '() => number | string | boolean' is not assignable to type '() => number | string'.
|
||||
!!! error TS2322: Type 'number | string | boolean' is not assignable to type 'number | string'.
|
||||
!!! error TS2322: Type 'boolean' is not assignable to type 'number | string'.
|
||||
!!! error TS2322: Type 'boolean' is not assignable to type 'string'.
|
||||
var numStrBoolTuple: [number, string, boolean] = [5, "foo", true];
|
||||
var objNumTuple: [{ a: string }, number] = [{ a: "world" }, 5];
|
||||
var strTupleTuple: [string, [number, {}]] = ["bar", [5, { x: 1, y: 1 }]];
|
||||
|
||||
@@ -82,7 +82,5 @@ var x4: IWithCallSignatures | IWithCallSignatures4 = a => /*here a should be any
|
||||
>IWithCallSignatures : Symbol(IWithCallSignatures, Decl(contextualTypeWithUnionTypeCallSignatures.ts, 9, 1))
|
||||
>IWithCallSignatures4 : Symbol(IWithCallSignatures4, Decl(contextualTypeWithUnionTypeCallSignatures.ts, 18, 1))
|
||||
>a : Symbol(a, Decl(contextualTypeWithUnionTypeCallSignatures.ts, 35, 52))
|
||||
>a.toString : Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
|
||||
>a : Symbol(a, Decl(contextualTypeWithUnionTypeCallSignatures.ts, 35, 52))
|
||||
>toString : Symbol(Number.toString, Decl(lib.d.ts, 458, 18))
|
||||
|
||||
|
||||
@@ -90,10 +90,10 @@ var x4: IWithCallSignatures | IWithCallSignatures4 = a => /*here a should be any
|
||||
>x4 : IWithCallSignatures | IWithCallSignatures4
|
||||
>IWithCallSignatures : IWithCallSignatures
|
||||
>IWithCallSignatures4 : IWithCallSignatures4
|
||||
>a => /*here a should be any*/ a.toString() : (a: number) => string
|
||||
>a : number
|
||||
>a.toString() : string
|
||||
>a.toString : (radix?: number) => string
|
||||
>a : number
|
||||
>toString : (radix?: number) => string
|
||||
>a => /*here a should be any*/ a.toString() : (a: any) => any
|
||||
>a : any
|
||||
>a.toString() : any
|
||||
>a.toString : any
|
||||
>a : any
|
||||
>toString : any
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ var arrayI1OrI2: Array<I1<number> | I2<number>> = [i1, i2, { // Like i1
|
||||
>Array : T[]
|
||||
>I1 : I1<T>
|
||||
>I2 : I2<T>
|
||||
>[i1, i2, { // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", }, { // Like i2 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }, { // Like i1 and i2 both commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }] : (I1<number> | I2<number>)[]
|
||||
>[i1, i2, { // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", }, { // Like i2 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }, { // Like i1 and i2 both commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", methodOnlyInI2: a => a, propertyOnlyInI2: "Hello", }] : (I1<number> | I2<number> | { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; methodOnlyInI2: (a: string) => string; propertyOnlyInI2: string; })[]
|
||||
>i1 : I1<number>
|
||||
>i2 : I2<number>
|
||||
>{ // Like i1 commonPropertyType: "hello", commonMethodType: a=> a, commonMethodWithTypeParameter: a => a, methodOnlyInI1: a => a, propertyOnlyInI1: "Hello", } : { commonPropertyType: string; commonMethodType: (a: string) => string; commonMethodWithTypeParameter: (a: number) => number; methodOnlyInI1: (a: string) => string; propertyOnlyInI1: string; }
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user