mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-12-15 00:06:16 -06:00
* Change getUnionType to default to no subtype reduction * Remove unnecessary subtype reduction operations * Use binary searching in union types to improve performance * Optimize type inference * Fixed broken singleAsteriskRegex. Fixes #9918 (#9920) * Lock ts-node to 1.1.0 while perf issue is investigated (#9933) * Fix typo in comment for MAX_SAFE_INTEGER * In ts.performance.now, bind window.performance.now Using an arrow function. Previously, it was set directly to window.performance.now, which fails when used on Chrome. * Add lint enforcing line endings (#9942) * Add servicesSources to the list of prerequisites for running tests * Support emitting static properties for classes with no name * Add assertion whitespace lint rule (#9931) * Add assertion whitespace lint rule * Fix typo * Add the word `Rule` to Jakefile * Limit travis build matrix (#9968) * Convert getErrorBaseline to use canonical diagnostic formatting (#9708) * Convert getErrorBaseline to use canonical diagnostic formatting * Fix lint * Found another clone of format diagnostic - consolidate * Fully declone * Unify nodeKind implementations for navigationBar and navigateTo * Fix test and rename a function * Fix lint errors * Remove hardcoded port, use the custom port * Unlock ts-node version (#9960) * Allow an abstract class to appear in a local scope * JSDoc understands string literal types Unfortunately, I didn't find a way to reuse the normal string literal type, so I had to extend the existing JSDoc type hierarchy. Otherwise, this feature is very simple. * Update baselines to be current * Add find and findIndex to ReadonlyArray * The optional this should be readonly too. * Update baseline source location * Re-add concat overload to support inferring tuples * Update baselines with new concat overload * Update LastJSDoc[Tag]Node * Display enum member types using qualified names * Accept new baselines * Fix lint error * null/undefined are allowed as index expressions `null` and `undefined` are not allowed with `--strictNullChecks` turned on. Previously, they were disallowed whether or not it was on. * Use correct nullable terminology * Get rid of port parameter * Remove [port] in usage message * Properly reset type guards in loops * Add regression test * Introduce the `EntityNameExpression` type * Allow `export =` and `export default` to alias any EntityNameExpression, not just identifiers. * Lint tests helper files * recreate program if baseUrl or paths changed in tsconfig * Simplify some code * Have travis use a newer image for the OSX build (#10034) Suggested by travis support for stopping the randomly-halting-builds issue. * Correctly check for ambient class flag * Use "best choice type" for || and ?: operators * jsx opening element formatting * change error message for unused parameter property fix * Fix issue related to this and #8383 * Add additional tests * Accept new baselines * Provide `realpath` for module resolution in LSHost * Add test * Add test baselines * Accept new baselines * CR feedback * Remove `SupportedExpressionWithTypeArguments` type; just check that the expression of each `ExpressionWithTypeArguments` is an `EntityNameExpression`. * Fix bug * Fix #10083 - allowSyntheticDefaultImports alters getExternalModuleMember (#10096) * Use recursion, and fix error for undefined node * Rename function * Fix lint error * Narrowing type parameter intersects w/narrowed types This makes sure that a union type that includes a type parameter is still usable as the actual type that the type guard narrows to. * Add a helper function `getOrUpdateProperty` to prevent unprotected access to Maps. * Limit type guards as assertions to incomplete types in loops * Accept new baselines * Fix linting error * Allow JS multiple declarations of ctor properties When a property is declared in the constructor and on the prototype of an ES6 class, the property's symbol is discarded in favour of the method's symbol. That because the usual use for this pattern is to bind an instance function: `this.m = this.m.bind(this)`. In this case the type you want really is the method's type. * Use {} type facts for unconstrained type params Previously it was using TypeFacts.All. But the constraint of an unconstrained type parameter is actually {}. * Fix newline lint * Test that declares conflicting method first * [Release-2.0] Fix 9662: Visual Studio 2015 with TS2.0 gives incorrect @types path resolution errors (#9867) * Change the shape of the shim layer to support getAutomaticTypeDirectives * Change the key for looking up automatic type-directives * Update baselines from change look-up name of type-directives * Add @currentDirectory into the test * Update baselines * Fix linting error * Address PR: fix spelling mistake * Instead of return path of the type directive names just return type directive names * Remove unused reference files: these tests produce erros so they will not produce these files (#9233) * Add string-literal completion test for jsdoc * Support other (new) literal types in jsdoc * Don't allow properties inherited from Object to be automatically included in TSX attributes * Add new test baseline and delete else in binder The extra `else` caused a ton of test failures! * Fix lint * Port PR #10016 to Master (#10100) * Treat namespaceExportDeclaration as declaration * Update baselines * wip - add tests * Add tests * Show "export namespace" for quick-info * Fix more lint * Try using runtests-parallel for CI (#9970) * Try using runtests-parallel for CI * Put worker count setting into .travis.yml * Reduce worker count to 4 - 8 wasnt much different from 4-6 but had contention issues causing timeouts * Fix lssl task (#9967) * Surface noErrorTruncation option * Stricter check for discriminant properties in type guards * Add tests * Emit more efficient/concise "empty" ES6 ctor When there are property assignments in a the class body of an inheriting class, tsc current emit the following compilation: ```ts class Foo extends Bar { public foo = 1; } ``` ```js class Foo extends Bar { constructor(…args) { super(…args); this.foo = 1; } } ``` This introduces an unneeded local variable and might force a reification of the `arguments` object (or otherwise reify the arguments into an array). This is particularly bad when that output is fed into another transpiler like Babel. In Babel, you get something like this today: ```js var Foo = (function (_Bar) { _inherits(Foo, _Bar); function Foo() { _classCallCheck(this, Foo); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _Bar.call.apply(_Bar, [this].concat(args)); this.foo = 1; } return Foo; })(Bar); ``` This causes a lot of needless work/allocations and some very strange code (`.call.apply` o_0). Admittedly, this is not strictly tsc’s problem; it could have done a deeper analysis of the code and optimized out the extra dance. However, tsc could also have emitted this simpler, more concise and semantically equivalent code in the first place: ```js class Foo extends Bar { constructor() { super(…arguments); this.foo = 1; } } ``` Which compiles into the following in Babel: ```js var Foo = (function (_Bar) { _inherits(Foo, _Bar); function Foo() { _classCallCheck(this, Foo); _Bar.apply(this, arguments); this.foo = 1; } return Foo; })(Bar); ``` Which is well-optimized (today) in most engines and much less confusing to read. As far as I can tell, the proposed compilation has exactly the same semantics as before. Fixes #10175 * Fix instanceof operator narrowing issues * Accept new baselines * Add regression test * Improve naming and documentation from PR * Update comment * Add more tests * Accept new baselines * Reduce worker count to 3 (#10210) Since we saw a starvation issue on one of @sandersn's PRs. * Speed up fourslash tests * Duh * Make baselines faster by not writing out unneeded files * Fix non-strict-compliant test * Fix 10076: Fix Tuple Destructing with "this" (#10208) * Call checkExpression eventhough there is no appropriate type from destructuring of array * Add tests and baselines * use transpileModule * Remove use strict * Improve instanceof for structurally identical types * Introduce isTypeInstanceOf function * Add test * Accept new baselines * Fix loop over array to use for-of instead of for-in * Use correct this in tuple type parameter constraints Instantiate this in tuple types used as type parameter constraints * Add explanatory comment to resolveTupleTypeMembers * Ignore null, undefined, void when checking for discriminant property * Add regression test * Delay tuple type constraint resolution Create a new tuple that stores the this-type. * Always use thisType when generating tuple id * Optimize format of type list id strings used in maps * Make ReadonlyArray iterable. * Allow OSX to fail while we investigate (#10255) The random test timeouts are an issue. * avoid using the global name * Fix single-quote lint * Optimize performance of maps * Update API sample * Fix processDiagnosticMessages script * Have travis take shallow clones of the repo (#10275) Just cloning TS on travis takes 23 seconds on linux (68 seconds on mac), hopefully having it do a shallow clone will help. We don't rely on any tagging/artifacts from the travis servers which clone depth could impact, so this shouldn't impact anything other than build speed. * Add folds to travis log (#10269) * Optimize filterType to only call getUnionType if necessary * Add shorthand types declaration for travis-fold (#10293) * Optimize getTypeWithFacts * Filter out nullable and primitive types in isDiscriminantProperty * Fix typo * Add regression tests * Optimize core filter function to only allocate when necessary * Address CR comments + more optimizations * Faster path for creating union types from filterType * Allow an @types direcotry to have a package.json which specifies `"typings": null` to disclude it from automatically included typings. * Lint * Collect timing information for commands running on travis (#10308) * Simplifies performance API * Use 'MapLike' instead of 'Map' in 'preferConstRule.ts'. * narrow from 'any' in most situations instanceof and user-defined typeguards narrow from 'any' unless the narrowed-to type is exactly 'Object' or 'Function'. This is a breaking change. * Update instanceof conformance tests * accept new baselines * add tests * accept new baselines * Use lowercase names for type reference directives * Use proper response codes in web tests * Treat ambient shorthand declarations as explicit uses of the `any` type * Parallel linting (#10313) * A perilous thing, a parallel lint * Use work queue rather than scheduling work * Dont read files for lint on main thread * Fix style * Fix the style fix (#10344) * Aligned mark names with values used by ts-perf. * Use an enum in checkClassForDuplicateDeclarations to aid readability * Rename to Accessor * Correctly update package.json version * Migrated more MapLikes to Maps * Add ES2015 Date constructor signature that accepts another Date (#10353) * Parameters with no assignments implicitly considered const * Add tests * Migrate additional MapLikes to Maps. * Fix 10625: JSX Not validating when index signature is present (#10352) * Check for type of property declaration before using index signature * Add tests and baselines * fix linting error * Adding more comments * Clean up/move some Map helper functions. * Revert some formatting changes. * Improve ReadonlyArray<T>.concat to match Array<T> The Array-based signature was incorrect and also out-of-date. * Fix link to blog * Remove old assertion about when we're allowed to use fileExists * Set isNewIdentifierLocation to true for JavaScript files * Update error message for conflicting type definitions Fixes #10370 * Explain why we lower-case type reference directives * Correctly merge bindThisPropertyAssignment Also simply it considerably after noticing that it's *only* called for Javascript files, so there was a lot of dead code for TS cases that never happened. * Fix comment * Property handle imcomplete control flow types in nested loops * Update due to CR suggestion * Add regression test * Fix 10289: correctly generate tsconfig.json with --lib (#10355) * Separate generate tsconfig into its own function and implement init with --lib # Conflicts: # src/compiler/tsc.ts * Add tests and baselines; Update function name Add unittests and baselines Add unittests and baselines for generating tsconfig Move unittest into harness folder Update harness tsconfig.json USe correct function name * Use new MapLike interstead. Update unittest # Conflicts: # src/compiler/commandLineParser.ts * Update JakeFile * Add tests for incorrect cases * Address PR : remove explicity write node_modules * Add more tests for `export = foo.bar`. * Output test baselines to tests/baselines/local instead of root
39162 lines
1.9 MiB
39162 lines
1.9 MiB
/*! *****************************************************************************
|
|
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
this file except in compliance with the License. You may obtain a copy of the
|
|
License at http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
|
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
|
MERCHANTABLITY OR NON-INFRINGEMENT.
|
|
|
|
See the Apache Version 2.0 License for specific language governing permissions
|
|
and limitations under the License.
|
|
***************************************************************************** */
|
|
|
|
var ts;
|
|
(function (ts) {
|
|
var OperationCanceledException = (function () {
|
|
function OperationCanceledException() {
|
|
}
|
|
return OperationCanceledException;
|
|
}());
|
|
ts.OperationCanceledException = OperationCanceledException;
|
|
(function (ExitStatus) {
|
|
ExitStatus[ExitStatus["Success"] = 0] = "Success";
|
|
ExitStatus[ExitStatus["DiagnosticsPresent_OutputsSkipped"] = 1] = "DiagnosticsPresent_OutputsSkipped";
|
|
ExitStatus[ExitStatus["DiagnosticsPresent_OutputsGenerated"] = 2] = "DiagnosticsPresent_OutputsGenerated";
|
|
})(ts.ExitStatus || (ts.ExitStatus = {}));
|
|
var ExitStatus = ts.ExitStatus;
|
|
(function (TypeReferenceSerializationKind) {
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["Unknown"] = 0] = "Unknown";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["TypeWithConstructSignatureAndValue"] = 1] = "TypeWithConstructSignatureAndValue";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["VoidType"] = 2] = "VoidType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["NumberLikeType"] = 3] = "NumberLikeType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["StringLikeType"] = 4] = "StringLikeType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["BooleanType"] = 5] = "BooleanType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["ArrayLikeType"] = 6] = "ArrayLikeType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["ESSymbolType"] = 7] = "ESSymbolType";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["TypeWithCallSignature"] = 8] = "TypeWithCallSignature";
|
|
TypeReferenceSerializationKind[TypeReferenceSerializationKind["ObjectType"] = 9] = "ObjectType";
|
|
})(ts.TypeReferenceSerializationKind || (ts.TypeReferenceSerializationKind = {}));
|
|
var TypeReferenceSerializationKind = ts.TypeReferenceSerializationKind;
|
|
(function (DiagnosticCategory) {
|
|
DiagnosticCategory[DiagnosticCategory["Warning"] = 0] = "Warning";
|
|
DiagnosticCategory[DiagnosticCategory["Error"] = 1] = "Error";
|
|
DiagnosticCategory[DiagnosticCategory["Message"] = 2] = "Message";
|
|
})(ts.DiagnosticCategory || (ts.DiagnosticCategory = {}));
|
|
var DiagnosticCategory = ts.DiagnosticCategory;
|
|
(function (ModuleResolutionKind) {
|
|
ModuleResolutionKind[ModuleResolutionKind["Classic"] = 1] = "Classic";
|
|
ModuleResolutionKind[ModuleResolutionKind["NodeJs"] = 2] = "NodeJs";
|
|
})(ts.ModuleResolutionKind || (ts.ModuleResolutionKind = {}));
|
|
var ModuleResolutionKind = ts.ModuleResolutionKind;
|
|
(function (ModuleKind) {
|
|
ModuleKind[ModuleKind["None"] = 0] = "None";
|
|
ModuleKind[ModuleKind["CommonJS"] = 1] = "CommonJS";
|
|
ModuleKind[ModuleKind["AMD"] = 2] = "AMD";
|
|
ModuleKind[ModuleKind["UMD"] = 3] = "UMD";
|
|
ModuleKind[ModuleKind["System"] = 4] = "System";
|
|
ModuleKind[ModuleKind["ES6"] = 5] = "ES6";
|
|
ModuleKind[ModuleKind["ES2015"] = 5] = "ES2015";
|
|
})(ts.ModuleKind || (ts.ModuleKind = {}));
|
|
var ModuleKind = ts.ModuleKind;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function createFileMap(keyMapper) {
|
|
var files = {};
|
|
return {
|
|
get: get,
|
|
set: set,
|
|
contains: contains,
|
|
remove: remove,
|
|
forEachValue: forEachValueInMap,
|
|
clear: clear
|
|
};
|
|
function forEachValueInMap(f) {
|
|
for (var key in files) {
|
|
f(key, files[key]);
|
|
}
|
|
}
|
|
function get(path) {
|
|
return files[toKey(path)];
|
|
}
|
|
function set(path, value) {
|
|
files[toKey(path)] = value;
|
|
}
|
|
function contains(path) {
|
|
return hasProperty(files, toKey(path));
|
|
}
|
|
function remove(path) {
|
|
var key = toKey(path);
|
|
delete files[key];
|
|
}
|
|
function clear() {
|
|
files = {};
|
|
}
|
|
function toKey(path) {
|
|
return keyMapper ? keyMapper(path) : path;
|
|
}
|
|
}
|
|
ts.createFileMap = createFileMap;
|
|
function toPath(fileName, basePath, getCanonicalFileName) {
|
|
var nonCanonicalizedPath = isRootedDiskPath(fileName)
|
|
? normalizePath(fileName)
|
|
: getNormalizedAbsolutePath(fileName, basePath);
|
|
return getCanonicalFileName(nonCanonicalizedPath);
|
|
}
|
|
ts.toPath = toPath;
|
|
function forEach(array, callback) {
|
|
if (array) {
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
var result = callback(array[i], i);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.forEach = forEach;
|
|
function contains(array, value, areEqual) {
|
|
if (array) {
|
|
for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {
|
|
var v = array_1[_i];
|
|
if (areEqual ? areEqual(v, value) : v === value) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.contains = contains;
|
|
function indexOf(array, value) {
|
|
if (array) {
|
|
for (var i = 0, len = array.length; i < len; i++) {
|
|
if (array[i] === value) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
ts.indexOf = indexOf;
|
|
function indexOfAnyCharCode(text, charCodes, start) {
|
|
for (var i = start || 0, len = text.length; i < len; i++) {
|
|
if (contains(charCodes, text.charCodeAt(i))) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
ts.indexOfAnyCharCode = indexOfAnyCharCode;
|
|
function countWhere(array, predicate) {
|
|
var count = 0;
|
|
if (array) {
|
|
for (var _i = 0, array_2 = array; _i < array_2.length; _i++) {
|
|
var v = array_2[_i];
|
|
if (predicate(v)) {
|
|
count++;
|
|
}
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
ts.countWhere = countWhere;
|
|
function filter(array, f) {
|
|
var result;
|
|
if (array) {
|
|
result = [];
|
|
for (var _i = 0, array_3 = array; _i < array_3.length; _i++) {
|
|
var item = array_3[_i];
|
|
if (f(item)) {
|
|
result.push(item);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.filter = filter;
|
|
function filterMutate(array, f) {
|
|
var outIndex = 0;
|
|
for (var _i = 0, array_4 = array; _i < array_4.length; _i++) {
|
|
var item = array_4[_i];
|
|
if (f(item)) {
|
|
array[outIndex] = item;
|
|
outIndex++;
|
|
}
|
|
}
|
|
array.length = outIndex;
|
|
}
|
|
ts.filterMutate = filterMutate;
|
|
function map(array, f) {
|
|
var result;
|
|
if (array) {
|
|
result = [];
|
|
for (var _i = 0, array_5 = array; _i < array_5.length; _i++) {
|
|
var v = array_5[_i];
|
|
result.push(f(v));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.map = map;
|
|
function concatenate(array1, array2) {
|
|
if (!array2 || !array2.length)
|
|
return array1;
|
|
if (!array1 || !array1.length)
|
|
return array2;
|
|
return array1.concat(array2);
|
|
}
|
|
ts.concatenate = concatenate;
|
|
function deduplicate(array, areEqual) {
|
|
var result;
|
|
if (array) {
|
|
result = [];
|
|
for (var _i = 0, array_6 = array; _i < array_6.length; _i++) {
|
|
var item = array_6[_i];
|
|
if (!contains(result, item, areEqual)) {
|
|
result.push(item);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.deduplicate = deduplicate;
|
|
function sum(array, prop) {
|
|
var result = 0;
|
|
for (var _i = 0, array_7 = array; _i < array_7.length; _i++) {
|
|
var v = array_7[_i];
|
|
result += v[prop];
|
|
}
|
|
return result;
|
|
}
|
|
ts.sum = sum;
|
|
function addRange(to, from) {
|
|
if (to && from) {
|
|
for (var _i = 0, from_1 = from; _i < from_1.length; _i++) {
|
|
var v = from_1[_i];
|
|
to.push(v);
|
|
}
|
|
}
|
|
}
|
|
ts.addRange = addRange;
|
|
function rangeEquals(array1, array2, pos, end) {
|
|
while (pos < end) {
|
|
if (array1[pos] !== array2[pos]) {
|
|
return false;
|
|
}
|
|
pos++;
|
|
}
|
|
return true;
|
|
}
|
|
ts.rangeEquals = rangeEquals;
|
|
function lastOrUndefined(array) {
|
|
if (array.length === 0) {
|
|
return undefined;
|
|
}
|
|
return array[array.length - 1];
|
|
}
|
|
ts.lastOrUndefined = lastOrUndefined;
|
|
function binarySearch(array, value) {
|
|
var low = 0;
|
|
var high = array.length - 1;
|
|
while (low <= high) {
|
|
var middle = low + ((high - low) >> 1);
|
|
var midValue = array[middle];
|
|
if (midValue === value) {
|
|
return middle;
|
|
}
|
|
else if (midValue > value) {
|
|
high = middle - 1;
|
|
}
|
|
else {
|
|
low = middle + 1;
|
|
}
|
|
}
|
|
return ~low;
|
|
}
|
|
ts.binarySearch = binarySearch;
|
|
function reduceLeft(array, f, initial) {
|
|
if (array) {
|
|
var count = array.length;
|
|
if (count > 0) {
|
|
var pos = 0;
|
|
var result = void 0;
|
|
if (arguments.length <= 2) {
|
|
result = array[pos];
|
|
pos++;
|
|
}
|
|
else {
|
|
result = initial;
|
|
}
|
|
while (pos < count) {
|
|
result = f(result, array[pos]);
|
|
pos++;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
return initial;
|
|
}
|
|
ts.reduceLeft = reduceLeft;
|
|
function reduceRight(array, f, initial) {
|
|
if (array) {
|
|
var pos = array.length - 1;
|
|
if (pos >= 0) {
|
|
var result = void 0;
|
|
if (arguments.length <= 2) {
|
|
result = array[pos];
|
|
pos--;
|
|
}
|
|
else {
|
|
result = initial;
|
|
}
|
|
while (pos >= 0) {
|
|
result = f(result, array[pos]);
|
|
pos--;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
return initial;
|
|
}
|
|
ts.reduceRight = reduceRight;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
function hasProperty(map, key) {
|
|
return hasOwnProperty.call(map, key);
|
|
}
|
|
ts.hasProperty = hasProperty;
|
|
function getKeys(map) {
|
|
var keys = [];
|
|
for (var key in map) {
|
|
keys.push(key);
|
|
}
|
|
return keys;
|
|
}
|
|
ts.getKeys = getKeys;
|
|
function getProperty(map, key) {
|
|
return hasOwnProperty.call(map, key) ? map[key] : undefined;
|
|
}
|
|
ts.getProperty = getProperty;
|
|
function isEmpty(map) {
|
|
for (var id in map) {
|
|
if (hasProperty(map, id)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
ts.isEmpty = isEmpty;
|
|
function clone(object) {
|
|
var result = {};
|
|
for (var id in object) {
|
|
result[id] = object[id];
|
|
}
|
|
return result;
|
|
}
|
|
ts.clone = clone;
|
|
function extend(first, second) {
|
|
var result = {};
|
|
for (var id in first) {
|
|
result[id] = first[id];
|
|
}
|
|
for (var id in second) {
|
|
if (!hasProperty(result, id)) {
|
|
result[id] = second[id];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.extend = extend;
|
|
function forEachValue(map, callback) {
|
|
var result;
|
|
for (var id in map) {
|
|
if (result = callback(map[id]))
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
ts.forEachValue = forEachValue;
|
|
function forEachKey(map, callback) {
|
|
var result;
|
|
for (var id in map) {
|
|
if (result = callback(id))
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
ts.forEachKey = forEachKey;
|
|
function lookUp(map, key) {
|
|
return hasProperty(map, key) ? map[key] : undefined;
|
|
}
|
|
ts.lookUp = lookUp;
|
|
function copyMap(source, target) {
|
|
for (var p in source) {
|
|
target[p] = source[p];
|
|
}
|
|
}
|
|
ts.copyMap = copyMap;
|
|
function arrayToMap(array, makeKey) {
|
|
var result = {};
|
|
forEach(array, function (value) {
|
|
result[makeKey(value)] = value;
|
|
});
|
|
return result;
|
|
}
|
|
ts.arrayToMap = arrayToMap;
|
|
function reduceProperties(map, callback, initial) {
|
|
var result = initial;
|
|
if (map) {
|
|
for (var key in map) {
|
|
if (hasProperty(map, key)) {
|
|
result = callback(result, map[key], String(key));
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.reduceProperties = reduceProperties;
|
|
function isArray(value) {
|
|
return Array.isArray ? Array.isArray(value) : value instanceof Array;
|
|
}
|
|
ts.isArray = isArray;
|
|
function memoize(callback) {
|
|
var value;
|
|
return function () {
|
|
if (callback) {
|
|
value = callback();
|
|
callback = undefined;
|
|
}
|
|
return value;
|
|
};
|
|
}
|
|
ts.memoize = memoize;
|
|
function formatStringFromArgs(text, args, baseIndex) {
|
|
baseIndex = baseIndex || 0;
|
|
return text.replace(/{(\d+)}/g, function (match, index) { return args[+index + baseIndex]; });
|
|
}
|
|
ts.localizedDiagnosticMessages = undefined;
|
|
function getLocaleSpecificMessage(message) {
|
|
return ts.localizedDiagnosticMessages && ts.localizedDiagnosticMessages[message.key]
|
|
? ts.localizedDiagnosticMessages[message.key]
|
|
: message.message;
|
|
}
|
|
ts.getLocaleSpecificMessage = getLocaleSpecificMessage;
|
|
function createFileDiagnostic(file, start, length, message) {
|
|
var end = start + length;
|
|
Debug.assert(start >= 0, "start must be non-negative, is " + start);
|
|
Debug.assert(length >= 0, "length must be non-negative, is " + length);
|
|
if (file) {
|
|
Debug.assert(start <= file.text.length, "start must be within the bounds of the file. " + start + " > " + file.text.length);
|
|
Debug.assert(end <= file.text.length, "end must be the bounds of the file. " + end + " > " + file.text.length);
|
|
}
|
|
var text = getLocaleSpecificMessage(message);
|
|
if (arguments.length > 4) {
|
|
text = formatStringFromArgs(text, arguments, 4);
|
|
}
|
|
return {
|
|
file: file,
|
|
start: start,
|
|
length: length,
|
|
messageText: text,
|
|
category: message.category,
|
|
code: message.code
|
|
};
|
|
}
|
|
ts.createFileDiagnostic = createFileDiagnostic;
|
|
function formatMessage(dummy, message) {
|
|
var text = getLocaleSpecificMessage(message);
|
|
if (arguments.length > 2) {
|
|
text = formatStringFromArgs(text, arguments, 2);
|
|
}
|
|
return text;
|
|
}
|
|
ts.formatMessage = formatMessage;
|
|
function createCompilerDiagnostic(message) {
|
|
var text = getLocaleSpecificMessage(message);
|
|
if (arguments.length > 1) {
|
|
text = formatStringFromArgs(text, arguments, 1);
|
|
}
|
|
return {
|
|
file: undefined,
|
|
start: undefined,
|
|
length: undefined,
|
|
messageText: text,
|
|
category: message.category,
|
|
code: message.code
|
|
};
|
|
}
|
|
ts.createCompilerDiagnostic = createCompilerDiagnostic;
|
|
function chainDiagnosticMessages(details, message) {
|
|
var text = getLocaleSpecificMessage(message);
|
|
if (arguments.length > 2) {
|
|
text = formatStringFromArgs(text, arguments, 2);
|
|
}
|
|
return {
|
|
messageText: text,
|
|
category: message.category,
|
|
code: message.code,
|
|
next: details
|
|
};
|
|
}
|
|
ts.chainDiagnosticMessages = chainDiagnosticMessages;
|
|
function concatenateDiagnosticMessageChains(headChain, tailChain) {
|
|
var lastChain = headChain;
|
|
while (lastChain.next) {
|
|
lastChain = lastChain.next;
|
|
}
|
|
lastChain.next = tailChain;
|
|
return headChain;
|
|
}
|
|
ts.concatenateDiagnosticMessageChains = concatenateDiagnosticMessageChains;
|
|
function compareValues(a, b) {
|
|
if (a === b)
|
|
return 0;
|
|
if (a === undefined)
|
|
return -1;
|
|
if (b === undefined)
|
|
return 1;
|
|
return a < b ? -1 : 1;
|
|
}
|
|
ts.compareValues = compareValues;
|
|
function compareStrings(a, b, ignoreCase) {
|
|
if (a === b)
|
|
return 0;
|
|
if (a === undefined)
|
|
return -1;
|
|
if (b === undefined)
|
|
return 1;
|
|
if (ignoreCase) {
|
|
if (String.prototype.localeCompare) {
|
|
var result = a.localeCompare(b, undefined, { usage: "sort", sensitivity: "accent" });
|
|
return result < 0 ? -1 : result > 0 ? 1 : 0;
|
|
}
|
|
a = a.toUpperCase();
|
|
b = b.toUpperCase();
|
|
if (a === b)
|
|
return 0;
|
|
}
|
|
return a < b ? -1 : 1;
|
|
}
|
|
ts.compareStrings = compareStrings;
|
|
function compareStringsCaseInsensitive(a, b) {
|
|
return compareStrings(a, b, true);
|
|
}
|
|
ts.compareStringsCaseInsensitive = compareStringsCaseInsensitive;
|
|
function getDiagnosticFileName(diagnostic) {
|
|
return diagnostic.file ? diagnostic.file.fileName : undefined;
|
|
}
|
|
function compareDiagnostics(d1, d2) {
|
|
return compareValues(getDiagnosticFileName(d1), getDiagnosticFileName(d2)) ||
|
|
compareValues(d1.start, d2.start) ||
|
|
compareValues(d1.length, d2.length) ||
|
|
compareValues(d1.code, d2.code) ||
|
|
compareMessageText(d1.messageText, d2.messageText) ||
|
|
0;
|
|
}
|
|
ts.compareDiagnostics = compareDiagnostics;
|
|
function compareMessageText(text1, text2) {
|
|
while (text1 && text2) {
|
|
var string1 = typeof text1 === "string" ? text1 : text1.messageText;
|
|
var string2 = typeof text2 === "string" ? text2 : text2.messageText;
|
|
var res = compareValues(string1, string2);
|
|
if (res) {
|
|
return res;
|
|
}
|
|
text1 = typeof text1 === "string" ? undefined : text1.next;
|
|
text2 = typeof text2 === "string" ? undefined : text2.next;
|
|
}
|
|
if (!text1 && !text2) {
|
|
return 0;
|
|
}
|
|
return text1 ? 1 : -1;
|
|
}
|
|
function sortAndDeduplicateDiagnostics(diagnostics) {
|
|
return deduplicateSortedDiagnostics(diagnostics.sort(compareDiagnostics));
|
|
}
|
|
ts.sortAndDeduplicateDiagnostics = sortAndDeduplicateDiagnostics;
|
|
function deduplicateSortedDiagnostics(diagnostics) {
|
|
if (diagnostics.length < 2) {
|
|
return diagnostics;
|
|
}
|
|
var newDiagnostics = [diagnostics[0]];
|
|
var previousDiagnostic = diagnostics[0];
|
|
for (var i = 1; i < diagnostics.length; i++) {
|
|
var currentDiagnostic = diagnostics[i];
|
|
var isDupe = compareDiagnostics(currentDiagnostic, previousDiagnostic) === 0;
|
|
if (!isDupe) {
|
|
newDiagnostics.push(currentDiagnostic);
|
|
previousDiagnostic = currentDiagnostic;
|
|
}
|
|
}
|
|
return newDiagnostics;
|
|
}
|
|
ts.deduplicateSortedDiagnostics = deduplicateSortedDiagnostics;
|
|
function normalizeSlashes(path) {
|
|
return path.replace(/\\/g, "/");
|
|
}
|
|
ts.normalizeSlashes = normalizeSlashes;
|
|
function getRootLength(path) {
|
|
if (path.charCodeAt(0) === 47) {
|
|
if (path.charCodeAt(1) !== 47)
|
|
return 1;
|
|
var p1 = path.indexOf("/", 2);
|
|
if (p1 < 0)
|
|
return 2;
|
|
var p2 = path.indexOf("/", p1 + 1);
|
|
if (p2 < 0)
|
|
return p1 + 1;
|
|
return p2 + 1;
|
|
}
|
|
if (path.charCodeAt(1) === 58) {
|
|
if (path.charCodeAt(2) === 47)
|
|
return 3;
|
|
return 2;
|
|
}
|
|
if (path.lastIndexOf("file:///", 0) === 0) {
|
|
return "file:///".length;
|
|
}
|
|
var idx = path.indexOf("://");
|
|
if (idx !== -1) {
|
|
return idx + "://".length;
|
|
}
|
|
return 0;
|
|
}
|
|
ts.getRootLength = getRootLength;
|
|
ts.directorySeparator = "/";
|
|
function getNormalizedParts(normalizedSlashedPath, rootLength) {
|
|
var parts = normalizedSlashedPath.substr(rootLength).split(ts.directorySeparator);
|
|
var normalized = [];
|
|
for (var _i = 0, parts_1 = parts; _i < parts_1.length; _i++) {
|
|
var part = parts_1[_i];
|
|
if (part !== ".") {
|
|
if (part === ".." && normalized.length > 0 && lastOrUndefined(normalized) !== "..") {
|
|
normalized.pop();
|
|
}
|
|
else {
|
|
if (part) {
|
|
normalized.push(part);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return normalized;
|
|
}
|
|
function normalizePath(path) {
|
|
path = normalizeSlashes(path);
|
|
var rootLength = getRootLength(path);
|
|
var normalized = getNormalizedParts(path, rootLength);
|
|
return path.substr(0, rootLength) + normalized.join(ts.directorySeparator);
|
|
}
|
|
ts.normalizePath = normalizePath;
|
|
function getDirectoryPath(path) {
|
|
return path.substr(0, Math.max(getRootLength(path), path.lastIndexOf(ts.directorySeparator)));
|
|
}
|
|
ts.getDirectoryPath = getDirectoryPath;
|
|
function isUrl(path) {
|
|
return path && !isRootedDiskPath(path) && path.indexOf("://") !== -1;
|
|
}
|
|
ts.isUrl = isUrl;
|
|
function isRootedDiskPath(path) {
|
|
return getRootLength(path) !== 0;
|
|
}
|
|
ts.isRootedDiskPath = isRootedDiskPath;
|
|
function normalizedPathComponents(path, rootLength) {
|
|
var normalizedParts = getNormalizedParts(path, rootLength);
|
|
return [path.substr(0, rootLength)].concat(normalizedParts);
|
|
}
|
|
function getNormalizedPathComponents(path, currentDirectory) {
|
|
path = normalizeSlashes(path);
|
|
var rootLength = getRootLength(path);
|
|
if (rootLength === 0) {
|
|
path = combinePaths(normalizeSlashes(currentDirectory), path);
|
|
rootLength = getRootLength(path);
|
|
}
|
|
return normalizedPathComponents(path, rootLength);
|
|
}
|
|
ts.getNormalizedPathComponents = getNormalizedPathComponents;
|
|
function getNormalizedAbsolutePath(fileName, currentDirectory) {
|
|
return getNormalizedPathFromPathComponents(getNormalizedPathComponents(fileName, currentDirectory));
|
|
}
|
|
ts.getNormalizedAbsolutePath = getNormalizedAbsolutePath;
|
|
function getNormalizedPathFromPathComponents(pathComponents) {
|
|
if (pathComponents && pathComponents.length) {
|
|
return pathComponents[0] + pathComponents.slice(1).join(ts.directorySeparator);
|
|
}
|
|
}
|
|
ts.getNormalizedPathFromPathComponents = getNormalizedPathFromPathComponents;
|
|
function getNormalizedPathComponentsOfUrl(url) {
|
|
var urlLength = url.length;
|
|
var rootLength = url.indexOf("://") + "://".length;
|
|
while (rootLength < urlLength) {
|
|
if (url.charCodeAt(rootLength) === 47) {
|
|
rootLength++;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
if (rootLength === urlLength) {
|
|
return [url];
|
|
}
|
|
var indexOfNextSlash = url.indexOf(ts.directorySeparator, rootLength);
|
|
if (indexOfNextSlash !== -1) {
|
|
rootLength = indexOfNextSlash + 1;
|
|
return normalizedPathComponents(url, rootLength);
|
|
}
|
|
else {
|
|
return [url + ts.directorySeparator];
|
|
}
|
|
}
|
|
function getNormalizedPathOrUrlComponents(pathOrUrl, currentDirectory) {
|
|
if (isUrl(pathOrUrl)) {
|
|
return getNormalizedPathComponentsOfUrl(pathOrUrl);
|
|
}
|
|
else {
|
|
return getNormalizedPathComponents(pathOrUrl, currentDirectory);
|
|
}
|
|
}
|
|
function getRelativePathToDirectoryOrUrl(directoryPathOrUrl, relativeOrAbsolutePath, currentDirectory, getCanonicalFileName, isAbsolutePathAnUrl) {
|
|
var pathComponents = getNormalizedPathOrUrlComponents(relativeOrAbsolutePath, currentDirectory);
|
|
var directoryComponents = getNormalizedPathOrUrlComponents(directoryPathOrUrl, currentDirectory);
|
|
if (directoryComponents.length > 1 && lastOrUndefined(directoryComponents) === "") {
|
|
directoryComponents.length--;
|
|
}
|
|
var joinStartIndex;
|
|
for (joinStartIndex = 0; joinStartIndex < pathComponents.length && joinStartIndex < directoryComponents.length; joinStartIndex++) {
|
|
if (getCanonicalFileName(directoryComponents[joinStartIndex]) !== getCanonicalFileName(pathComponents[joinStartIndex])) {
|
|
break;
|
|
}
|
|
}
|
|
if (joinStartIndex) {
|
|
var relativePath = "";
|
|
var relativePathComponents = pathComponents.slice(joinStartIndex, pathComponents.length);
|
|
for (; joinStartIndex < directoryComponents.length; joinStartIndex++) {
|
|
if (directoryComponents[joinStartIndex] !== "") {
|
|
relativePath = relativePath + ".." + ts.directorySeparator;
|
|
}
|
|
}
|
|
return relativePath + relativePathComponents.join(ts.directorySeparator);
|
|
}
|
|
var absolutePath = getNormalizedPathFromPathComponents(pathComponents);
|
|
if (isAbsolutePathAnUrl && isRootedDiskPath(absolutePath)) {
|
|
absolutePath = "file:///" + absolutePath;
|
|
}
|
|
return absolutePath;
|
|
}
|
|
ts.getRelativePathToDirectoryOrUrl = getRelativePathToDirectoryOrUrl;
|
|
function getBaseFileName(path) {
|
|
if (path === undefined) {
|
|
return undefined;
|
|
}
|
|
var i = path.lastIndexOf(ts.directorySeparator);
|
|
return i < 0 ? path : path.substring(i + 1);
|
|
}
|
|
ts.getBaseFileName = getBaseFileName;
|
|
function combinePaths(path1, path2) {
|
|
if (!(path1 && path1.length))
|
|
return path2;
|
|
if (!(path2 && path2.length))
|
|
return path1;
|
|
if (getRootLength(path2) !== 0)
|
|
return path2;
|
|
if (path1.charAt(path1.length - 1) === ts.directorySeparator)
|
|
return path1 + path2;
|
|
return path1 + ts.directorySeparator + path2;
|
|
}
|
|
ts.combinePaths = combinePaths;
|
|
function removeTrailingDirectorySeparator(path) {
|
|
if (path.charAt(path.length - 1) === ts.directorySeparator) {
|
|
return path.substr(0, path.length - 1);
|
|
}
|
|
return path;
|
|
}
|
|
ts.removeTrailingDirectorySeparator = removeTrailingDirectorySeparator;
|
|
function ensureTrailingDirectorySeparator(path) {
|
|
if (path.charAt(path.length - 1) !== ts.directorySeparator) {
|
|
return path + ts.directorySeparator;
|
|
}
|
|
return path;
|
|
}
|
|
ts.ensureTrailingDirectorySeparator = ensureTrailingDirectorySeparator;
|
|
function comparePaths(a, b, currentDirectory, ignoreCase) {
|
|
if (a === b)
|
|
return 0;
|
|
if (a === undefined)
|
|
return -1;
|
|
if (b === undefined)
|
|
return 1;
|
|
a = removeTrailingDirectorySeparator(a);
|
|
b = removeTrailingDirectorySeparator(b);
|
|
var aComponents = getNormalizedPathComponents(a, currentDirectory);
|
|
var bComponents = getNormalizedPathComponents(b, currentDirectory);
|
|
var sharedLength = Math.min(aComponents.length, bComponents.length);
|
|
for (var i = 0; i < sharedLength; i++) {
|
|
var result = compareStrings(aComponents[i], bComponents[i], ignoreCase);
|
|
if (result !== 0) {
|
|
return result;
|
|
}
|
|
}
|
|
return compareValues(aComponents.length, bComponents.length);
|
|
}
|
|
ts.comparePaths = comparePaths;
|
|
function containsPath(parent, child, currentDirectory, ignoreCase) {
|
|
if (parent === undefined || child === undefined)
|
|
return false;
|
|
if (parent === child)
|
|
return true;
|
|
parent = removeTrailingDirectorySeparator(parent);
|
|
child = removeTrailingDirectorySeparator(child);
|
|
if (parent === child)
|
|
return true;
|
|
var parentComponents = getNormalizedPathComponents(parent, currentDirectory);
|
|
var childComponents = getNormalizedPathComponents(child, currentDirectory);
|
|
if (childComponents.length < parentComponents.length) {
|
|
return false;
|
|
}
|
|
for (var i = 0; i < parentComponents.length; i++) {
|
|
var result = compareStrings(parentComponents[i], childComponents[i], ignoreCase);
|
|
if (result !== 0) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
ts.containsPath = containsPath;
|
|
function startsWith(str, prefix) {
|
|
return str.lastIndexOf(prefix, 0) === 0;
|
|
}
|
|
ts.startsWith = startsWith;
|
|
function endsWith(str, suffix) {
|
|
var expectedPos = str.length - suffix.length;
|
|
return expectedPos >= 0 && str.indexOf(suffix, expectedPos) === expectedPos;
|
|
}
|
|
ts.endsWith = endsWith;
|
|
function fileExtensionIs(path, extension) {
|
|
return path.length > extension.length && endsWith(path, extension);
|
|
}
|
|
ts.fileExtensionIs = fileExtensionIs;
|
|
function fileExtensionIsAny(path, extensions) {
|
|
for (var _i = 0, extensions_1 = extensions; _i < extensions_1.length; _i++) {
|
|
var extension = extensions_1[_i];
|
|
if (fileExtensionIs(path, extension)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.fileExtensionIsAny = fileExtensionIsAny;
|
|
var reservedCharacterPattern = /[^\w\s\/]/g;
|
|
var wildcardCharCodes = [42, 63];
|
|
function getRegularExpressionForWildcard(specs, basePath, usage) {
|
|
if (specs === undefined || specs.length === 0) {
|
|
return undefined;
|
|
}
|
|
var pattern = "";
|
|
var hasWrittenSubpattern = false;
|
|
spec: for (var _i = 0, specs_1 = specs; _i < specs_1.length; _i++) {
|
|
var spec = specs_1[_i];
|
|
if (!spec) {
|
|
continue;
|
|
}
|
|
var subpattern = "";
|
|
var hasRecursiveDirectoryWildcard = false;
|
|
var hasWrittenComponent = false;
|
|
var components = getNormalizedPathComponents(spec, basePath);
|
|
if (usage !== "exclude" && components[components.length - 1] === "**") {
|
|
continue spec;
|
|
}
|
|
components[0] = removeTrailingDirectorySeparator(components[0]);
|
|
var optionalCount = 0;
|
|
for (var _a = 0, components_1 = components; _a < components_1.length; _a++) {
|
|
var component = components_1[_a];
|
|
if (component === "**") {
|
|
if (hasRecursiveDirectoryWildcard) {
|
|
continue spec;
|
|
}
|
|
subpattern += "(/.+?)?";
|
|
hasRecursiveDirectoryWildcard = true;
|
|
hasWrittenComponent = true;
|
|
}
|
|
else {
|
|
if (usage === "directories") {
|
|
subpattern += "(";
|
|
optionalCount++;
|
|
}
|
|
if (hasWrittenComponent) {
|
|
subpattern += ts.directorySeparator;
|
|
}
|
|
subpattern += component.replace(reservedCharacterPattern, replaceWildcardCharacter);
|
|
hasWrittenComponent = true;
|
|
}
|
|
}
|
|
while (optionalCount > 0) {
|
|
subpattern += ")?";
|
|
optionalCount--;
|
|
}
|
|
if (hasWrittenSubpattern) {
|
|
pattern += "|";
|
|
}
|
|
pattern += "(" + subpattern + ")";
|
|
hasWrittenSubpattern = true;
|
|
}
|
|
if (!pattern) {
|
|
return undefined;
|
|
}
|
|
return "^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$");
|
|
}
|
|
ts.getRegularExpressionForWildcard = getRegularExpressionForWildcard;
|
|
function replaceWildcardCharacter(match) {
|
|
return match === "*" ? "[^/]*" : match === "?" ? "[^/]" : "\\" + match;
|
|
}
|
|
function getFileMatcherPatterns(path, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory) {
|
|
path = normalizePath(path);
|
|
currentDirectory = normalizePath(currentDirectory);
|
|
var absolutePath = combinePaths(currentDirectory, path);
|
|
return {
|
|
includeFilePattern: getRegularExpressionForWildcard(includes, absolutePath, "files"),
|
|
includeDirectoryPattern: getRegularExpressionForWildcard(includes, absolutePath, "directories"),
|
|
excludePattern: getRegularExpressionForWildcard(excludes, absolutePath, "exclude"),
|
|
basePaths: getBasePaths(path, includes, useCaseSensitiveFileNames)
|
|
};
|
|
}
|
|
ts.getFileMatcherPatterns = getFileMatcherPatterns;
|
|
function matchFiles(path, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory, getFileSystemEntries) {
|
|
path = normalizePath(path);
|
|
currentDirectory = normalizePath(currentDirectory);
|
|
var patterns = getFileMatcherPatterns(path, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory);
|
|
var regexFlag = useCaseSensitiveFileNames ? "" : "i";
|
|
var includeFileRegex = patterns.includeFilePattern && new RegExp(patterns.includeFilePattern, regexFlag);
|
|
var includeDirectoryRegex = patterns.includeDirectoryPattern && new RegExp(patterns.includeDirectoryPattern, regexFlag);
|
|
var excludeRegex = patterns.excludePattern && new RegExp(patterns.excludePattern, regexFlag);
|
|
var result = [];
|
|
for (var _i = 0, _a = patterns.basePaths; _i < _a.length; _i++) {
|
|
var basePath = _a[_i];
|
|
visitDirectory(basePath, combinePaths(currentDirectory, basePath));
|
|
}
|
|
return result;
|
|
function visitDirectory(path, absolutePath) {
|
|
var _a = getFileSystemEntries(path), files = _a.files, directories = _a.directories;
|
|
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
|
|
var current = files_1[_i];
|
|
var name_1 = combinePaths(path, current);
|
|
var absoluteName = combinePaths(absolutePath, current);
|
|
if ((!extensions || fileExtensionIsAny(name_1, extensions)) &&
|
|
(!includeFileRegex || includeFileRegex.test(absoluteName)) &&
|
|
(!excludeRegex || !excludeRegex.test(absoluteName))) {
|
|
result.push(name_1);
|
|
}
|
|
}
|
|
for (var _b = 0, directories_1 = directories; _b < directories_1.length; _b++) {
|
|
var current = directories_1[_b];
|
|
var name_2 = combinePaths(path, current);
|
|
var absoluteName = combinePaths(absolutePath, current);
|
|
if ((!includeDirectoryRegex || includeDirectoryRegex.test(absoluteName)) &&
|
|
(!excludeRegex || !excludeRegex.test(absoluteName))) {
|
|
visitDirectory(name_2, absoluteName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ts.matchFiles = matchFiles;
|
|
function getBasePaths(path, includes, useCaseSensitiveFileNames) {
|
|
var basePaths = [path];
|
|
if (includes) {
|
|
var includeBasePaths = [];
|
|
for (var _i = 0, includes_1 = includes; _i < includes_1.length; _i++) {
|
|
var include = includes_1[_i];
|
|
var absolute = isRootedDiskPath(include) ? include : normalizePath(combinePaths(path, include));
|
|
var wildcardOffset = indexOfAnyCharCode(absolute, wildcardCharCodes);
|
|
var includeBasePath = wildcardOffset < 0
|
|
? removeTrailingDirectorySeparator(getDirectoryPath(absolute))
|
|
: absolute.substring(0, absolute.lastIndexOf(ts.directorySeparator, wildcardOffset));
|
|
includeBasePaths.push(includeBasePath);
|
|
}
|
|
includeBasePaths.sort(useCaseSensitiveFileNames ? compareStrings : compareStringsCaseInsensitive);
|
|
include: for (var i = 0; i < includeBasePaths.length; i++) {
|
|
var includeBasePath = includeBasePaths[i];
|
|
for (var j = 0; j < basePaths.length; j++) {
|
|
if (containsPath(basePaths[j], includeBasePath, path, !useCaseSensitiveFileNames)) {
|
|
continue include;
|
|
}
|
|
}
|
|
basePaths.push(includeBasePath);
|
|
}
|
|
}
|
|
return basePaths;
|
|
}
|
|
function ensureScriptKind(fileName, scriptKind) {
|
|
return (scriptKind || getScriptKindFromFileName(fileName)) || 3;
|
|
}
|
|
ts.ensureScriptKind = ensureScriptKind;
|
|
function getScriptKindFromFileName(fileName) {
|
|
var ext = fileName.substr(fileName.lastIndexOf("."));
|
|
switch (ext.toLowerCase()) {
|
|
case ".js":
|
|
return 1;
|
|
case ".jsx":
|
|
return 2;
|
|
case ".ts":
|
|
return 3;
|
|
case ".tsx":
|
|
return 4;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
ts.getScriptKindFromFileName = getScriptKindFromFileName;
|
|
ts.supportedTypeScriptExtensions = [".ts", ".tsx", ".d.ts"];
|
|
ts.supportedJavascriptExtensions = [".js", ".jsx"];
|
|
var allSupportedExtensions = ts.supportedTypeScriptExtensions.concat(ts.supportedJavascriptExtensions);
|
|
function getSupportedExtensions(options) {
|
|
return options && options.allowJs ? allSupportedExtensions : ts.supportedTypeScriptExtensions;
|
|
}
|
|
ts.getSupportedExtensions = getSupportedExtensions;
|
|
function isSupportedSourceFileName(fileName, compilerOptions) {
|
|
if (!fileName) {
|
|
return false;
|
|
}
|
|
for (var _i = 0, _a = getSupportedExtensions(compilerOptions); _i < _a.length; _i++) {
|
|
var extension = _a[_i];
|
|
if (fileExtensionIs(fileName, extension)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.isSupportedSourceFileName = isSupportedSourceFileName;
|
|
function getExtensionPriority(path, supportedExtensions) {
|
|
for (var i = supportedExtensions.length - 1; i >= 0; i--) {
|
|
if (fileExtensionIs(path, supportedExtensions[i])) {
|
|
return adjustExtensionPriority(i);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
ts.getExtensionPriority = getExtensionPriority;
|
|
function adjustExtensionPriority(extensionPriority) {
|
|
if (extensionPriority < 2) {
|
|
return 0;
|
|
}
|
|
else if (extensionPriority < 5) {
|
|
return 2;
|
|
}
|
|
else {
|
|
return 5;
|
|
}
|
|
}
|
|
ts.adjustExtensionPriority = adjustExtensionPriority;
|
|
function getNextLowestExtensionPriority(extensionPriority) {
|
|
if (extensionPriority < 2) {
|
|
return 2;
|
|
}
|
|
else {
|
|
return 5;
|
|
}
|
|
}
|
|
ts.getNextLowestExtensionPriority = getNextLowestExtensionPriority;
|
|
var extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"];
|
|
function removeFileExtension(path) {
|
|
for (var _i = 0, extensionsToRemove_1 = extensionsToRemove; _i < extensionsToRemove_1.length; _i++) {
|
|
var ext = extensionsToRemove_1[_i];
|
|
var extensionless = tryRemoveExtension(path, ext);
|
|
if (extensionless !== undefined) {
|
|
return extensionless;
|
|
}
|
|
}
|
|
return path;
|
|
}
|
|
ts.removeFileExtension = removeFileExtension;
|
|
function tryRemoveExtension(path, extension) {
|
|
return fileExtensionIs(path, extension) ? path.substring(0, path.length - extension.length) : undefined;
|
|
}
|
|
ts.tryRemoveExtension = tryRemoveExtension;
|
|
function isJsxOrTsxExtension(ext) {
|
|
return ext === ".jsx" || ext === ".tsx";
|
|
}
|
|
ts.isJsxOrTsxExtension = isJsxOrTsxExtension;
|
|
function changeExtension(path, newExtension) {
|
|
return (removeFileExtension(path) + newExtension);
|
|
}
|
|
ts.changeExtension = changeExtension;
|
|
function Symbol(flags, name) {
|
|
this.flags = flags;
|
|
this.name = name;
|
|
this.declarations = undefined;
|
|
}
|
|
function Type(checker, flags) {
|
|
this.flags = flags;
|
|
}
|
|
function Signature(checker) {
|
|
}
|
|
function Node(kind, pos, end) {
|
|
this.kind = kind;
|
|
this.pos = pos;
|
|
this.end = end;
|
|
this.flags = 0;
|
|
this.parent = undefined;
|
|
}
|
|
ts.objectAllocator = {
|
|
getNodeConstructor: function () { return Node; },
|
|
getTokenConstructor: function () { return Node; },
|
|
getIdentifierConstructor: function () { return Node; },
|
|
getSourceFileConstructor: function () { return Node; },
|
|
getSymbolConstructor: function () { return Symbol; },
|
|
getTypeConstructor: function () { return Type; },
|
|
getSignatureConstructor: function () { return Signature; }
|
|
};
|
|
var Debug;
|
|
(function (Debug) {
|
|
var currentAssertionLevel = 0;
|
|
function shouldAssert(level) {
|
|
return currentAssertionLevel >= level;
|
|
}
|
|
Debug.shouldAssert = shouldAssert;
|
|
function assert(expression, message, verboseDebugInfo) {
|
|
if (!expression) {
|
|
var verboseDebugString = "";
|
|
if (verboseDebugInfo) {
|
|
verboseDebugString = "\r\nVerbose Debug Information: " + verboseDebugInfo();
|
|
}
|
|
debugger;
|
|
throw new Error("Debug Failure. False expression: " + (message || "") + verboseDebugString);
|
|
}
|
|
}
|
|
Debug.assert = assert;
|
|
function fail(message) {
|
|
Debug.assert(false, message);
|
|
}
|
|
Debug.fail = fail;
|
|
})(Debug = ts.Debug || (ts.Debug = {}));
|
|
function copyListRemovingItem(item, list) {
|
|
var copiedList = [];
|
|
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
|
|
var e = list_1[_i];
|
|
if (e !== item) {
|
|
copiedList.push(e);
|
|
}
|
|
}
|
|
return copiedList;
|
|
}
|
|
ts.copyListRemovingItem = copyListRemovingItem;
|
|
function createGetCanonicalFileName(useCaseSensitivefileNames) {
|
|
return useCaseSensitivefileNames
|
|
? (function (fileName) { return fileName; })
|
|
: (function (fileName) { return fileName.toLowerCase(); });
|
|
}
|
|
ts.createGetCanonicalFileName = createGetCanonicalFileName;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.sys = (function () {
|
|
function getWScriptSystem() {
|
|
var fso = new ActiveXObject("Scripting.FileSystemObject");
|
|
var shell = new ActiveXObject("WScript.Shell");
|
|
var fileStream = new ActiveXObject("ADODB.Stream");
|
|
fileStream.Type = 2;
|
|
var binaryStream = new ActiveXObject("ADODB.Stream");
|
|
binaryStream.Type = 1;
|
|
var args = [];
|
|
for (var i = 0; i < WScript.Arguments.length; i++) {
|
|
args[i] = WScript.Arguments.Item(i);
|
|
}
|
|
function readFile(fileName, encoding) {
|
|
if (!fso.FileExists(fileName)) {
|
|
return undefined;
|
|
}
|
|
fileStream.Open();
|
|
try {
|
|
if (encoding) {
|
|
fileStream.Charset = encoding;
|
|
fileStream.LoadFromFile(fileName);
|
|
}
|
|
else {
|
|
fileStream.Charset = "x-ansi";
|
|
fileStream.LoadFromFile(fileName);
|
|
var bom = fileStream.ReadText(2) || "";
|
|
fileStream.Position = 0;
|
|
fileStream.Charset = bom.length >= 2 && (bom.charCodeAt(0) === 0xFF && bom.charCodeAt(1) === 0xFE || bom.charCodeAt(0) === 0xFE && bom.charCodeAt(1) === 0xFF) ? "unicode" : "utf-8";
|
|
}
|
|
return fileStream.ReadText();
|
|
}
|
|
catch (e) {
|
|
throw e;
|
|
}
|
|
finally {
|
|
fileStream.Close();
|
|
}
|
|
}
|
|
function writeFile(fileName, data, writeByteOrderMark) {
|
|
fileStream.Open();
|
|
binaryStream.Open();
|
|
try {
|
|
fileStream.Charset = "utf-8";
|
|
fileStream.WriteText(data);
|
|
if (writeByteOrderMark) {
|
|
fileStream.Position = 0;
|
|
}
|
|
else {
|
|
fileStream.Position = 3;
|
|
}
|
|
fileStream.CopyTo(binaryStream);
|
|
binaryStream.SaveToFile(fileName, 2);
|
|
}
|
|
finally {
|
|
binaryStream.Close();
|
|
fileStream.Close();
|
|
}
|
|
}
|
|
function getNames(collection) {
|
|
var result = [];
|
|
for (var e = new Enumerator(collection); !e.atEnd(); e.moveNext()) {
|
|
result.push(e.item().Name);
|
|
}
|
|
return result.sort();
|
|
}
|
|
function getDirectories(path) {
|
|
var folder = fso.GetFolder(path);
|
|
return getNames(folder.subfolders);
|
|
}
|
|
function getAccessibleFileSystemEntries(path) {
|
|
try {
|
|
var folder = fso.GetFolder(path || ".");
|
|
var files = getNames(folder.files);
|
|
var directories = getNames(folder.subfolders);
|
|
return { files: files, directories: directories };
|
|
}
|
|
catch (e) {
|
|
return { files: [], directories: [] };
|
|
}
|
|
}
|
|
function readDirectory(path, extensions, excludes, includes) {
|
|
return ts.matchFiles(path, extensions, excludes, includes, false, shell.CurrentDirectory, getAccessibleFileSystemEntries);
|
|
}
|
|
var wscriptSystem = {
|
|
args: args,
|
|
newLine: "\r\n",
|
|
useCaseSensitiveFileNames: false,
|
|
write: function (s) {
|
|
WScript.StdOut.Write(s);
|
|
},
|
|
readFile: readFile,
|
|
writeFile: writeFile,
|
|
resolvePath: function (path) {
|
|
return fso.GetAbsolutePathName(path);
|
|
},
|
|
fileExists: function (path) {
|
|
return fso.FileExists(path);
|
|
},
|
|
directoryExists: function (path) {
|
|
return fso.FolderExists(path);
|
|
},
|
|
createDirectory: function (directoryName) {
|
|
if (!wscriptSystem.directoryExists(directoryName)) {
|
|
fso.CreateFolder(directoryName);
|
|
}
|
|
},
|
|
getExecutingFilePath: function () {
|
|
return WScript.ScriptFullName;
|
|
},
|
|
getCurrentDirectory: function () {
|
|
return shell.CurrentDirectory;
|
|
},
|
|
getDirectories: getDirectories,
|
|
readDirectory: readDirectory,
|
|
exit: function (exitCode) {
|
|
try {
|
|
WScript.Quit(exitCode);
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
};
|
|
return wscriptSystem;
|
|
}
|
|
function getNodeSystem() {
|
|
var _fs = require("fs");
|
|
var _path = require("path");
|
|
var _os = require("os");
|
|
var _crypto = require("crypto");
|
|
var useNonPollingWatchers = process.env["TSC_NONPOLLING_WATCHER"];
|
|
function createWatchedFileSet() {
|
|
var dirWatchers = {};
|
|
var fileWatcherCallbacks = {};
|
|
return { addFile: addFile, removeFile: removeFile };
|
|
function reduceDirWatcherRefCountForFile(fileName) {
|
|
var dirName = ts.getDirectoryPath(fileName);
|
|
if (ts.hasProperty(dirWatchers, dirName)) {
|
|
var watcher = dirWatchers[dirName];
|
|
watcher.referenceCount -= 1;
|
|
if (watcher.referenceCount <= 0) {
|
|
watcher.close();
|
|
delete dirWatchers[dirName];
|
|
}
|
|
}
|
|
}
|
|
function addDirWatcher(dirPath) {
|
|
if (ts.hasProperty(dirWatchers, dirPath)) {
|
|
var watcher_1 = dirWatchers[dirPath];
|
|
watcher_1.referenceCount += 1;
|
|
return;
|
|
}
|
|
var watcher = _fs.watch(dirPath, { persistent: true }, function (eventName, relativeFileName) { return fileEventHandler(eventName, relativeFileName, dirPath); });
|
|
watcher.referenceCount = 1;
|
|
dirWatchers[dirPath] = watcher;
|
|
return;
|
|
}
|
|
function addFileWatcherCallback(filePath, callback) {
|
|
if (ts.hasProperty(fileWatcherCallbacks, filePath)) {
|
|
fileWatcherCallbacks[filePath].push(callback);
|
|
}
|
|
else {
|
|
fileWatcherCallbacks[filePath] = [callback];
|
|
}
|
|
}
|
|
function addFile(fileName, callback) {
|
|
addFileWatcherCallback(fileName, callback);
|
|
addDirWatcher(ts.getDirectoryPath(fileName));
|
|
return { fileName: fileName, callback: callback };
|
|
}
|
|
function removeFile(watchedFile) {
|
|
removeFileWatcherCallback(watchedFile.fileName, watchedFile.callback);
|
|
reduceDirWatcherRefCountForFile(watchedFile.fileName);
|
|
}
|
|
function removeFileWatcherCallback(filePath, callback) {
|
|
if (ts.hasProperty(fileWatcherCallbacks, filePath)) {
|
|
var newCallbacks = ts.copyListRemovingItem(callback, fileWatcherCallbacks[filePath]);
|
|
if (newCallbacks.length === 0) {
|
|
delete fileWatcherCallbacks[filePath];
|
|
}
|
|
else {
|
|
fileWatcherCallbacks[filePath] = newCallbacks;
|
|
}
|
|
}
|
|
}
|
|
function fileEventHandler(eventName, relativeFileName, baseDirPath) {
|
|
var fileName = typeof relativeFileName !== "string"
|
|
? undefined
|
|
: ts.getNormalizedAbsolutePath(relativeFileName, baseDirPath);
|
|
if ((eventName === "change" || eventName === "rename") && ts.hasProperty(fileWatcherCallbacks, fileName)) {
|
|
for (var _i = 0, _a = fileWatcherCallbacks[fileName]; _i < _a.length; _i++) {
|
|
var fileCallback = _a[_i];
|
|
fileCallback(fileName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var watchedFileSet = createWatchedFileSet();
|
|
function isNode4OrLater() {
|
|
return parseInt(process.version.charAt(1)) >= 4;
|
|
}
|
|
var platform = _os.platform();
|
|
var useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin";
|
|
function readFile(fileName, encoding) {
|
|
if (!fileExists(fileName)) {
|
|
return undefined;
|
|
}
|
|
var buffer = _fs.readFileSync(fileName);
|
|
var len = buffer.length;
|
|
if (len >= 2 && buffer[0] === 0xFE && buffer[1] === 0xFF) {
|
|
len &= ~1;
|
|
for (var i = 0; i < len; i += 2) {
|
|
var temp = buffer[i];
|
|
buffer[i] = buffer[i + 1];
|
|
buffer[i + 1] = temp;
|
|
}
|
|
return buffer.toString("utf16le", 2);
|
|
}
|
|
if (len >= 2 && buffer[0] === 0xFF && buffer[1] === 0xFE) {
|
|
return buffer.toString("utf16le", 2);
|
|
}
|
|
if (len >= 3 && buffer[0] === 0xEF && buffer[1] === 0xBB && buffer[2] === 0xBF) {
|
|
return buffer.toString("utf8", 3);
|
|
}
|
|
return buffer.toString("utf8");
|
|
}
|
|
function writeFile(fileName, data, writeByteOrderMark) {
|
|
if (writeByteOrderMark) {
|
|
data = "\uFEFF" + data;
|
|
}
|
|
var fd;
|
|
try {
|
|
fd = _fs.openSync(fileName, "w");
|
|
_fs.writeSync(fd, data, undefined, "utf8");
|
|
}
|
|
finally {
|
|
if (fd !== undefined) {
|
|
_fs.closeSync(fd);
|
|
}
|
|
}
|
|
}
|
|
function getAccessibleFileSystemEntries(path) {
|
|
try {
|
|
var entries = _fs.readdirSync(path || ".").sort();
|
|
var files = [];
|
|
var directories = [];
|
|
for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
|
|
var entry = entries_1[_i];
|
|
if (entry === "." || entry === "..") {
|
|
continue;
|
|
}
|
|
var name_3 = ts.combinePaths(path, entry);
|
|
var stat = void 0;
|
|
try {
|
|
stat = _fs.statSync(name_3);
|
|
}
|
|
catch (e) {
|
|
continue;
|
|
}
|
|
if (stat.isFile()) {
|
|
files.push(entry);
|
|
}
|
|
else if (stat.isDirectory()) {
|
|
directories.push(entry);
|
|
}
|
|
}
|
|
return { files: files, directories: directories };
|
|
}
|
|
catch (e) {
|
|
return { files: [], directories: [] };
|
|
}
|
|
}
|
|
function readDirectory(path, extensions, excludes, includes) {
|
|
return ts.matchFiles(path, extensions, excludes, includes, useCaseSensitiveFileNames, process.cwd(), getAccessibleFileSystemEntries);
|
|
}
|
|
function fileSystemEntryExists(path, entryKind) {
|
|
try {
|
|
var stat = _fs.statSync(path);
|
|
switch (entryKind) {
|
|
case 0: return stat.isFile();
|
|
case 1: return stat.isDirectory();
|
|
}
|
|
}
|
|
catch (e) {
|
|
return false;
|
|
}
|
|
}
|
|
function fileExists(path) {
|
|
return fileSystemEntryExists(path, 0);
|
|
}
|
|
function directoryExists(path) {
|
|
return fileSystemEntryExists(path, 1);
|
|
}
|
|
function getDirectories(path) {
|
|
return ts.filter(_fs.readdirSync(path), function (p) { return fileSystemEntryExists(ts.combinePaths(path, p), 1); });
|
|
}
|
|
var nodeSystem = {
|
|
args: process.argv.slice(2),
|
|
newLine: _os.EOL,
|
|
useCaseSensitiveFileNames: useCaseSensitiveFileNames,
|
|
write: function (s) {
|
|
process.stdout.write(s);
|
|
},
|
|
readFile: readFile,
|
|
writeFile: writeFile,
|
|
watchFile: function (fileName, callback) {
|
|
if (useNonPollingWatchers) {
|
|
var watchedFile_1 = watchedFileSet.addFile(fileName, callback);
|
|
return {
|
|
close: function () { return watchedFileSet.removeFile(watchedFile_1); }
|
|
};
|
|
}
|
|
else {
|
|
_fs.watchFile(fileName, { persistent: true, interval: 250 }, fileChanged);
|
|
return {
|
|
close: function () { return _fs.unwatchFile(fileName, fileChanged); }
|
|
};
|
|
}
|
|
function fileChanged(curr, prev) {
|
|
if (+curr.mtime <= +prev.mtime) {
|
|
return;
|
|
}
|
|
callback(fileName);
|
|
}
|
|
},
|
|
watchDirectory: function (directoryName, callback, recursive) {
|
|
var options;
|
|
if (isNode4OrLater() && (process.platform === "win32" || process.platform === "darwin")) {
|
|
options = { persistent: true, recursive: !!recursive };
|
|
}
|
|
else {
|
|
options = { persistent: true };
|
|
}
|
|
return _fs.watch(directoryName, options, function (eventName, relativeFileName) {
|
|
if (eventName === "rename") {
|
|
callback(!relativeFileName ? relativeFileName : ts.normalizePath(ts.combinePaths(directoryName, relativeFileName)));
|
|
}
|
|
;
|
|
});
|
|
},
|
|
resolvePath: function (path) {
|
|
return _path.resolve(path);
|
|
},
|
|
fileExists: fileExists,
|
|
directoryExists: directoryExists,
|
|
createDirectory: function (directoryName) {
|
|
if (!nodeSystem.directoryExists(directoryName)) {
|
|
_fs.mkdirSync(directoryName);
|
|
}
|
|
},
|
|
getExecutingFilePath: function () {
|
|
return __filename;
|
|
},
|
|
getCurrentDirectory: function () {
|
|
return process.cwd();
|
|
},
|
|
getDirectories: getDirectories,
|
|
readDirectory: readDirectory,
|
|
getModifiedTime: function (path) {
|
|
try {
|
|
return _fs.statSync(path).mtime;
|
|
}
|
|
catch (e) {
|
|
return undefined;
|
|
}
|
|
},
|
|
createHash: function (data) {
|
|
var hash = _crypto.createHash("md5");
|
|
hash.update(data);
|
|
return hash.digest("hex");
|
|
},
|
|
getMemoryUsage: function () {
|
|
if (global.gc) {
|
|
global.gc();
|
|
}
|
|
return process.memoryUsage().heapUsed;
|
|
},
|
|
getFileSize: function (path) {
|
|
try {
|
|
var stat = _fs.statSync(path);
|
|
if (stat.isFile()) {
|
|
return stat.size;
|
|
}
|
|
}
|
|
catch (e) { }
|
|
return 0;
|
|
},
|
|
exit: function (exitCode) {
|
|
process.exit(exitCode);
|
|
},
|
|
realpath: function (path) {
|
|
return _fs.realpathSync(path);
|
|
}
|
|
};
|
|
return nodeSystem;
|
|
}
|
|
function getChakraSystem() {
|
|
var realpath = ChakraHost.realpath && (function (path) { return ChakraHost.realpath(path); });
|
|
return {
|
|
newLine: ChakraHost.newLine || "\r\n",
|
|
args: ChakraHost.args,
|
|
useCaseSensitiveFileNames: !!ChakraHost.useCaseSensitiveFileNames,
|
|
write: ChakraHost.echo,
|
|
readFile: function (path, encoding) {
|
|
return ChakraHost.readFile(path);
|
|
},
|
|
writeFile: function (path, data, writeByteOrderMark) {
|
|
if (writeByteOrderMark) {
|
|
data = "\uFEFF" + data;
|
|
}
|
|
ChakraHost.writeFile(path, data);
|
|
},
|
|
resolvePath: ChakraHost.resolvePath,
|
|
fileExists: ChakraHost.fileExists,
|
|
directoryExists: ChakraHost.directoryExists,
|
|
createDirectory: ChakraHost.createDirectory,
|
|
getExecutingFilePath: function () { return ChakraHost.executingFile; },
|
|
getCurrentDirectory: function () { return ChakraHost.currentDirectory; },
|
|
getDirectories: ChakraHost.getDirectories,
|
|
readDirectory: function (path, extensions, excludes, includes) {
|
|
var pattern = ts.getFileMatcherPatterns(path, extensions, excludes, includes, !!ChakraHost.useCaseSensitiveFileNames, ChakraHost.currentDirectory);
|
|
return ChakraHost.readDirectory(path, extensions, pattern.basePaths, pattern.excludePattern, pattern.includeFilePattern, pattern.includeDirectoryPattern);
|
|
},
|
|
exit: ChakraHost.quit,
|
|
realpath: realpath
|
|
};
|
|
}
|
|
if (typeof ChakraHost !== "undefined") {
|
|
return getChakraSystem();
|
|
}
|
|
else if (typeof WScript !== "undefined" && typeof ActiveXObject === "function") {
|
|
return getWScriptSystem();
|
|
}
|
|
else if (typeof process !== "undefined" && process.nextTick && !process.browser && typeof require !== "undefined") {
|
|
return getNodeSystem();
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
})();
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.Diagnostics = {
|
|
Unterminated_string_literal: { code: 1002, category: ts.DiagnosticCategory.Error, key: "Unterminated_string_literal_1002", message: "Unterminated string literal." },
|
|
Identifier_expected: { code: 1003, category: ts.DiagnosticCategory.Error, key: "Identifier_expected_1003", message: "Identifier expected." },
|
|
_0_expected: { code: 1005, category: ts.DiagnosticCategory.Error, key: "_0_expected_1005", message: "'{0}' expected." },
|
|
A_file_cannot_have_a_reference_to_itself: { code: 1006, category: ts.DiagnosticCategory.Error, key: "A_file_cannot_have_a_reference_to_itself_1006", message: "A file cannot have a reference to itself." },
|
|
Trailing_comma_not_allowed: { code: 1009, category: ts.DiagnosticCategory.Error, key: "Trailing_comma_not_allowed_1009", message: "Trailing comma not allowed." },
|
|
Asterisk_Slash_expected: { code: 1010, category: ts.DiagnosticCategory.Error, key: "Asterisk_Slash_expected_1010", message: "'*/' expected." },
|
|
Unexpected_token: { code: 1012, category: ts.DiagnosticCategory.Error, key: "Unexpected_token_1012", message: "Unexpected token." },
|
|
A_rest_parameter_must_be_last_in_a_parameter_list: { code: 1014, category: ts.DiagnosticCategory.Error, key: "A_rest_parameter_must_be_last_in_a_parameter_list_1014", message: "A rest parameter must be last in a parameter list." },
|
|
Parameter_cannot_have_question_mark_and_initializer: { code: 1015, category: ts.DiagnosticCategory.Error, key: "Parameter_cannot_have_question_mark_and_initializer_1015", message: "Parameter cannot have question mark and initializer." },
|
|
A_required_parameter_cannot_follow_an_optional_parameter: { code: 1016, category: ts.DiagnosticCategory.Error, key: "A_required_parameter_cannot_follow_an_optional_parameter_1016", message: "A required parameter cannot follow an optional parameter." },
|
|
An_index_signature_cannot_have_a_rest_parameter: { code: 1017, category: ts.DiagnosticCategory.Error, key: "An_index_signature_cannot_have_a_rest_parameter_1017", message: "An index signature cannot have a rest parameter." },
|
|
An_index_signature_parameter_cannot_have_an_accessibility_modifier: { code: 1018, category: ts.DiagnosticCategory.Error, key: "An_index_signature_parameter_cannot_have_an_accessibility_modifier_1018", message: "An index signature parameter cannot have an accessibility modifier." },
|
|
An_index_signature_parameter_cannot_have_a_question_mark: { code: 1019, category: ts.DiagnosticCategory.Error, key: "An_index_signature_parameter_cannot_have_a_question_mark_1019", message: "An index signature parameter cannot have a question mark." },
|
|
An_index_signature_parameter_cannot_have_an_initializer: { code: 1020, category: ts.DiagnosticCategory.Error, key: "An_index_signature_parameter_cannot_have_an_initializer_1020", message: "An index signature parameter cannot have an initializer." },
|
|
An_index_signature_must_have_a_type_annotation: { code: 1021, category: ts.DiagnosticCategory.Error, key: "An_index_signature_must_have_a_type_annotation_1021", message: "An index signature must have a type annotation." },
|
|
An_index_signature_parameter_must_have_a_type_annotation: { code: 1022, category: ts.DiagnosticCategory.Error, key: "An_index_signature_parameter_must_have_a_type_annotation_1022", message: "An index signature parameter must have a type annotation." },
|
|
An_index_signature_parameter_type_must_be_string_or_number: { code: 1023, category: ts.DiagnosticCategory.Error, key: "An_index_signature_parameter_type_must_be_string_or_number_1023", message: "An index signature parameter type must be 'string' or 'number'." },
|
|
readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature: { code: 1024, category: ts.DiagnosticCategory.Error, key: "readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature_1024", message: "'readonly' modifier can only appear on a property declaration or index signature." },
|
|
Accessibility_modifier_already_seen: { code: 1028, category: ts.DiagnosticCategory.Error, key: "Accessibility_modifier_already_seen_1028", message: "Accessibility modifier already seen." },
|
|
_0_modifier_must_precede_1_modifier: { code: 1029, category: ts.DiagnosticCategory.Error, key: "_0_modifier_must_precede_1_modifier_1029", message: "'{0}' modifier must precede '{1}' modifier." },
|
|
_0_modifier_already_seen: { code: 1030, category: ts.DiagnosticCategory.Error, key: "_0_modifier_already_seen_1030", message: "'{0}' modifier already seen." },
|
|
_0_modifier_cannot_appear_on_a_class_element: { code: 1031, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_class_element_1031", message: "'{0}' modifier cannot appear on a class element." },
|
|
super_must_be_followed_by_an_argument_list_or_member_access: { code: 1034, category: ts.DiagnosticCategory.Error, key: "super_must_be_followed_by_an_argument_list_or_member_access_1034", message: "'super' must be followed by an argument list or member access." },
|
|
Only_ambient_modules_can_use_quoted_names: { code: 1035, category: ts.DiagnosticCategory.Error, key: "Only_ambient_modules_can_use_quoted_names_1035", message: "Only ambient modules can use quoted names." },
|
|
Statements_are_not_allowed_in_ambient_contexts: { code: 1036, category: ts.DiagnosticCategory.Error, key: "Statements_are_not_allowed_in_ambient_contexts_1036", message: "Statements are not allowed in ambient contexts." },
|
|
A_declare_modifier_cannot_be_used_in_an_already_ambient_context: { code: 1038, category: ts.DiagnosticCategory.Error, key: "A_declare_modifier_cannot_be_used_in_an_already_ambient_context_1038", message: "A 'declare' modifier cannot be used in an already ambient context." },
|
|
Initializers_are_not_allowed_in_ambient_contexts: { code: 1039, category: ts.DiagnosticCategory.Error, key: "Initializers_are_not_allowed_in_ambient_contexts_1039", message: "Initializers are not allowed in ambient contexts." },
|
|
_0_modifier_cannot_be_used_in_an_ambient_context: { code: 1040, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_be_used_in_an_ambient_context_1040", message: "'{0}' modifier cannot be used in an ambient context." },
|
|
_0_modifier_cannot_be_used_with_a_class_declaration: { code: 1041, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_be_used_with_a_class_declaration_1041", message: "'{0}' modifier cannot be used with a class declaration." },
|
|
_0_modifier_cannot_be_used_here: { code: 1042, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_be_used_here_1042", message: "'{0}' modifier cannot be used here." },
|
|
_0_modifier_cannot_appear_on_a_data_property: { code: 1043, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_data_property_1043", message: "'{0}' modifier cannot appear on a data property." },
|
|
_0_modifier_cannot_appear_on_a_module_or_namespace_element: { code: 1044, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_module_or_namespace_element_1044", message: "'{0}' modifier cannot appear on a module or namespace element." },
|
|
A_0_modifier_cannot_be_used_with_an_interface_declaration: { code: 1045, category: ts.DiagnosticCategory.Error, key: "A_0_modifier_cannot_be_used_with_an_interface_declaration_1045", message: "A '{0}' modifier cannot be used with an interface declaration." },
|
|
A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file: { code: 1046, category: ts.DiagnosticCategory.Error, key: "A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file_1046", message: "A 'declare' modifier is required for a top level declaration in a .d.ts file." },
|
|
A_rest_parameter_cannot_be_optional: { code: 1047, category: ts.DiagnosticCategory.Error, key: "A_rest_parameter_cannot_be_optional_1047", message: "A rest parameter cannot be optional." },
|
|
A_rest_parameter_cannot_have_an_initializer: { code: 1048, category: ts.DiagnosticCategory.Error, key: "A_rest_parameter_cannot_have_an_initializer_1048", message: "A rest parameter cannot have an initializer." },
|
|
A_set_accessor_must_have_exactly_one_parameter: { code: 1049, category: ts.DiagnosticCategory.Error, key: "A_set_accessor_must_have_exactly_one_parameter_1049", message: "A 'set' accessor must have exactly one parameter." },
|
|
A_set_accessor_cannot_have_an_optional_parameter: { code: 1051, category: ts.DiagnosticCategory.Error, key: "A_set_accessor_cannot_have_an_optional_parameter_1051", message: "A 'set' accessor cannot have an optional parameter." },
|
|
A_set_accessor_parameter_cannot_have_an_initializer: { code: 1052, category: ts.DiagnosticCategory.Error, key: "A_set_accessor_parameter_cannot_have_an_initializer_1052", message: "A 'set' accessor parameter cannot have an initializer." },
|
|
A_set_accessor_cannot_have_rest_parameter: { code: 1053, category: ts.DiagnosticCategory.Error, key: "A_set_accessor_cannot_have_rest_parameter_1053", message: "A 'set' accessor cannot have rest parameter." },
|
|
A_get_accessor_cannot_have_parameters: { code: 1054, category: ts.DiagnosticCategory.Error, key: "A_get_accessor_cannot_have_parameters_1054", message: "A 'get' accessor cannot have parameters." },
|
|
Type_0_is_not_a_valid_async_function_return_type: { code: 1055, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_a_valid_async_function_return_type_1055", message: "Type '{0}' is not a valid async function return type." },
|
|
Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher: { code: 1056, category: ts.DiagnosticCategory.Error, key: "Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher_1056", message: "Accessors are only available when targeting ECMAScript 5 and higher." },
|
|
An_async_function_or_method_must_have_a_valid_awaitable_return_type: { code: 1057, category: ts.DiagnosticCategory.Error, key: "An_async_function_or_method_must_have_a_valid_awaitable_return_type_1057", message: "An async function or method must have a valid awaitable return type." },
|
|
Operand_for_await_does_not_have_a_valid_callable_then_member: { code: 1058, category: ts.DiagnosticCategory.Error, key: "Operand_for_await_does_not_have_a_valid_callable_then_member_1058", message: "Operand for 'await' does not have a valid callable 'then' member." },
|
|
Return_expression_in_async_function_does_not_have_a_valid_callable_then_member: { code: 1059, category: ts.DiagnosticCategory.Error, key: "Return_expression_in_async_function_does_not_have_a_valid_callable_then_member_1059", message: "Return expression in async function does not have a valid callable 'then' member." },
|
|
Expression_body_for_async_arrow_function_does_not_have_a_valid_callable_then_member: { code: 1060, category: ts.DiagnosticCategory.Error, key: "Expression_body_for_async_arrow_function_does_not_have_a_valid_callable_then_member_1060", message: "Expression body for async arrow function does not have a valid callable 'then' member." },
|
|
Enum_member_must_have_initializer: { code: 1061, category: ts.DiagnosticCategory.Error, key: "Enum_member_must_have_initializer_1061", message: "Enum member must have initializer." },
|
|
_0_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method: { code: 1062, category: ts.DiagnosticCategory.Error, key: "_0_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method_1062", message: "{0} is referenced directly or indirectly in the fulfillment callback of its own 'then' method." },
|
|
An_export_assignment_cannot_be_used_in_a_namespace: { code: 1063, category: ts.DiagnosticCategory.Error, key: "An_export_assignment_cannot_be_used_in_a_namespace_1063", message: "An export assignment cannot be used in a namespace." },
|
|
The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type: { code: 1064, category: ts.DiagnosticCategory.Error, key: "The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type_1064", message: "The return type of an async function or method must be the global Promise<T> type." },
|
|
In_ambient_enum_declarations_member_initializer_must_be_constant_expression: { code: 1066, category: ts.DiagnosticCategory.Error, key: "In_ambient_enum_declarations_member_initializer_must_be_constant_expression_1066", message: "In ambient enum declarations member initializer must be constant expression." },
|
|
Unexpected_token_A_constructor_method_accessor_or_property_was_expected: { code: 1068, category: ts.DiagnosticCategory.Error, key: "Unexpected_token_A_constructor_method_accessor_or_property_was_expected_1068", message: "Unexpected token. A constructor, method, accessor, or property was expected." },
|
|
_0_modifier_cannot_appear_on_a_type_member: { code: 1070, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_type_member_1070", message: "'{0}' modifier cannot appear on a type member." },
|
|
_0_modifier_cannot_appear_on_an_index_signature: { code: 1071, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_an_index_signature_1071", message: "'{0}' modifier cannot appear on an index signature." },
|
|
A_0_modifier_cannot_be_used_with_an_import_declaration: { code: 1079, category: ts.DiagnosticCategory.Error, key: "A_0_modifier_cannot_be_used_with_an_import_declaration_1079", message: "A '{0}' modifier cannot be used with an import declaration." },
|
|
Invalid_reference_directive_syntax: { code: 1084, category: ts.DiagnosticCategory.Error, key: "Invalid_reference_directive_syntax_1084", message: "Invalid 'reference' directive syntax." },
|
|
Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher: { code: 1085, category: ts.DiagnosticCategory.Error, key: "Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher_1085", message: "Octal literals are not available when targeting ECMAScript 5 and higher." },
|
|
An_accessor_cannot_be_declared_in_an_ambient_context: { code: 1086, category: ts.DiagnosticCategory.Error, key: "An_accessor_cannot_be_declared_in_an_ambient_context_1086", message: "An accessor cannot be declared in an ambient context." },
|
|
_0_modifier_cannot_appear_on_a_constructor_declaration: { code: 1089, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_constructor_declaration_1089", message: "'{0}' modifier cannot appear on a constructor declaration." },
|
|
_0_modifier_cannot_appear_on_a_parameter: { code: 1090, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_appear_on_a_parameter_1090", message: "'{0}' modifier cannot appear on a parameter." },
|
|
Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement: { code: 1091, category: ts.DiagnosticCategory.Error, key: "Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement_1091", message: "Only a single variable declaration is allowed in a 'for...in' statement." },
|
|
Type_parameters_cannot_appear_on_a_constructor_declaration: { code: 1092, category: ts.DiagnosticCategory.Error, key: "Type_parameters_cannot_appear_on_a_constructor_declaration_1092", message: "Type parameters cannot appear on a constructor declaration." },
|
|
Type_annotation_cannot_appear_on_a_constructor_declaration: { code: 1093, category: ts.DiagnosticCategory.Error, key: "Type_annotation_cannot_appear_on_a_constructor_declaration_1093", message: "Type annotation cannot appear on a constructor declaration." },
|
|
An_accessor_cannot_have_type_parameters: { code: 1094, category: ts.DiagnosticCategory.Error, key: "An_accessor_cannot_have_type_parameters_1094", message: "An accessor cannot have type parameters." },
|
|
A_set_accessor_cannot_have_a_return_type_annotation: { code: 1095, category: ts.DiagnosticCategory.Error, key: "A_set_accessor_cannot_have_a_return_type_annotation_1095", message: "A 'set' accessor cannot have a return type annotation." },
|
|
An_index_signature_must_have_exactly_one_parameter: { code: 1096, category: ts.DiagnosticCategory.Error, key: "An_index_signature_must_have_exactly_one_parameter_1096", message: "An index signature must have exactly one parameter." },
|
|
_0_list_cannot_be_empty: { code: 1097, category: ts.DiagnosticCategory.Error, key: "_0_list_cannot_be_empty_1097", message: "'{0}' list cannot be empty." },
|
|
Type_parameter_list_cannot_be_empty: { code: 1098, category: ts.DiagnosticCategory.Error, key: "Type_parameter_list_cannot_be_empty_1098", message: "Type parameter list cannot be empty." },
|
|
Type_argument_list_cannot_be_empty: { code: 1099, category: ts.DiagnosticCategory.Error, key: "Type_argument_list_cannot_be_empty_1099", message: "Type argument list cannot be empty." },
|
|
Invalid_use_of_0_in_strict_mode: { code: 1100, category: ts.DiagnosticCategory.Error, key: "Invalid_use_of_0_in_strict_mode_1100", message: "Invalid use of '{0}' in strict mode." },
|
|
with_statements_are_not_allowed_in_strict_mode: { code: 1101, category: ts.DiagnosticCategory.Error, key: "with_statements_are_not_allowed_in_strict_mode_1101", message: "'with' statements are not allowed in strict mode." },
|
|
delete_cannot_be_called_on_an_identifier_in_strict_mode: { code: 1102, category: ts.DiagnosticCategory.Error, key: "delete_cannot_be_called_on_an_identifier_in_strict_mode_1102", message: "'delete' cannot be called on an identifier in strict mode." },
|
|
A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement: { code: 1104, category: ts.DiagnosticCategory.Error, key: "A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement_1104", message: "A 'continue' statement can only be used within an enclosing iteration statement." },
|
|
A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement: { code: 1105, category: ts.DiagnosticCategory.Error, key: "A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement_1105", message: "A 'break' statement can only be used within an enclosing iteration or switch statement." },
|
|
Jump_target_cannot_cross_function_boundary: { code: 1107, category: ts.DiagnosticCategory.Error, key: "Jump_target_cannot_cross_function_boundary_1107", message: "Jump target cannot cross function boundary." },
|
|
A_return_statement_can_only_be_used_within_a_function_body: { code: 1108, category: ts.DiagnosticCategory.Error, key: "A_return_statement_can_only_be_used_within_a_function_body_1108", message: "A 'return' statement can only be used within a function body." },
|
|
Expression_expected: { code: 1109, category: ts.DiagnosticCategory.Error, key: "Expression_expected_1109", message: "Expression expected." },
|
|
Type_expected: { code: 1110, category: ts.DiagnosticCategory.Error, key: "Type_expected_1110", message: "Type expected." },
|
|
A_default_clause_cannot_appear_more_than_once_in_a_switch_statement: { code: 1113, category: ts.DiagnosticCategory.Error, key: "A_default_clause_cannot_appear_more_than_once_in_a_switch_statement_1113", message: "A 'default' clause cannot appear more than once in a 'switch' statement." },
|
|
Duplicate_label_0: { code: 1114, category: ts.DiagnosticCategory.Error, key: "Duplicate_label_0_1114", message: "Duplicate label '{0}'" },
|
|
A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement: { code: 1115, category: ts.DiagnosticCategory.Error, key: "A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement_1115", message: "A 'continue' statement can only jump to a label of an enclosing iteration statement." },
|
|
A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement: { code: 1116, category: ts.DiagnosticCategory.Error, key: "A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement_1116", message: "A 'break' statement can only jump to a label of an enclosing statement." },
|
|
An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode: { code: 1117, category: ts.DiagnosticCategory.Error, key: "An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode_1117", message: "An object literal cannot have multiple properties with the same name in strict mode." },
|
|
An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name: { code: 1118, category: ts.DiagnosticCategory.Error, key: "An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name_1118", message: "An object literal cannot have multiple get/set accessors with the same name." },
|
|
An_object_literal_cannot_have_property_and_accessor_with_the_same_name: { code: 1119, category: ts.DiagnosticCategory.Error, key: "An_object_literal_cannot_have_property_and_accessor_with_the_same_name_1119", message: "An object literal cannot have property and accessor with the same name." },
|
|
An_export_assignment_cannot_have_modifiers: { code: 1120, category: ts.DiagnosticCategory.Error, key: "An_export_assignment_cannot_have_modifiers_1120", message: "An export assignment cannot have modifiers." },
|
|
Octal_literals_are_not_allowed_in_strict_mode: { code: 1121, category: ts.DiagnosticCategory.Error, key: "Octal_literals_are_not_allowed_in_strict_mode_1121", message: "Octal literals are not allowed in strict mode." },
|
|
A_tuple_type_element_list_cannot_be_empty: { code: 1122, category: ts.DiagnosticCategory.Error, key: "A_tuple_type_element_list_cannot_be_empty_1122", message: "A tuple type element list cannot be empty." },
|
|
Variable_declaration_list_cannot_be_empty: { code: 1123, category: ts.DiagnosticCategory.Error, key: "Variable_declaration_list_cannot_be_empty_1123", message: "Variable declaration list cannot be empty." },
|
|
Digit_expected: { code: 1124, category: ts.DiagnosticCategory.Error, key: "Digit_expected_1124", message: "Digit expected." },
|
|
Hexadecimal_digit_expected: { code: 1125, category: ts.DiagnosticCategory.Error, key: "Hexadecimal_digit_expected_1125", message: "Hexadecimal digit expected." },
|
|
Unexpected_end_of_text: { code: 1126, category: ts.DiagnosticCategory.Error, key: "Unexpected_end_of_text_1126", message: "Unexpected end of text." },
|
|
Invalid_character: { code: 1127, category: ts.DiagnosticCategory.Error, key: "Invalid_character_1127", message: "Invalid character." },
|
|
Declaration_or_statement_expected: { code: 1128, category: ts.DiagnosticCategory.Error, key: "Declaration_or_statement_expected_1128", message: "Declaration or statement expected." },
|
|
Statement_expected: { code: 1129, category: ts.DiagnosticCategory.Error, key: "Statement_expected_1129", message: "Statement expected." },
|
|
case_or_default_expected: { code: 1130, category: ts.DiagnosticCategory.Error, key: "case_or_default_expected_1130", message: "'case' or 'default' expected." },
|
|
Property_or_signature_expected: { code: 1131, category: ts.DiagnosticCategory.Error, key: "Property_or_signature_expected_1131", message: "Property or signature expected." },
|
|
Enum_member_expected: { code: 1132, category: ts.DiagnosticCategory.Error, key: "Enum_member_expected_1132", message: "Enum member expected." },
|
|
Variable_declaration_expected: { code: 1134, category: ts.DiagnosticCategory.Error, key: "Variable_declaration_expected_1134", message: "Variable declaration expected." },
|
|
Argument_expression_expected: { code: 1135, category: ts.DiagnosticCategory.Error, key: "Argument_expression_expected_1135", message: "Argument expression expected." },
|
|
Property_assignment_expected: { code: 1136, category: ts.DiagnosticCategory.Error, key: "Property_assignment_expected_1136", message: "Property assignment expected." },
|
|
Expression_or_comma_expected: { code: 1137, category: ts.DiagnosticCategory.Error, key: "Expression_or_comma_expected_1137", message: "Expression or comma expected." },
|
|
Parameter_declaration_expected: { code: 1138, category: ts.DiagnosticCategory.Error, key: "Parameter_declaration_expected_1138", message: "Parameter declaration expected." },
|
|
Type_parameter_declaration_expected: { code: 1139, category: ts.DiagnosticCategory.Error, key: "Type_parameter_declaration_expected_1139", message: "Type parameter declaration expected." },
|
|
Type_argument_expected: { code: 1140, category: ts.DiagnosticCategory.Error, key: "Type_argument_expected_1140", message: "Type argument expected." },
|
|
String_literal_expected: { code: 1141, category: ts.DiagnosticCategory.Error, key: "String_literal_expected_1141", message: "String literal expected." },
|
|
Line_break_not_permitted_here: { code: 1142, category: ts.DiagnosticCategory.Error, key: "Line_break_not_permitted_here_1142", message: "Line break not permitted here." },
|
|
or_expected: { code: 1144, category: ts.DiagnosticCategory.Error, key: "or_expected_1144", message: "'{' or ';' expected." },
|
|
Declaration_expected: { code: 1146, category: ts.DiagnosticCategory.Error, key: "Declaration_expected_1146", message: "Declaration expected." },
|
|
Import_declarations_in_a_namespace_cannot_reference_a_module: { code: 1147, category: ts.DiagnosticCategory.Error, key: "Import_declarations_in_a_namespace_cannot_reference_a_module_1147", message: "Import declarations in a namespace cannot reference a module." },
|
|
Cannot_use_imports_exports_or_module_augmentations_when_module_is_none: { code: 1148, category: ts.DiagnosticCategory.Error, key: "Cannot_use_imports_exports_or_module_augmentations_when_module_is_none_1148", message: "Cannot use imports, exports, or module augmentations when '--module' is 'none'." },
|
|
File_name_0_differs_from_already_included_file_name_1_only_in_casing: { code: 1149, category: ts.DiagnosticCategory.Error, key: "File_name_0_differs_from_already_included_file_name_1_only_in_casing_1149", message: "File name '{0}' differs from already included file name '{1}' only in casing" },
|
|
new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead: { code: 1150, category: ts.DiagnosticCategory.Error, key: "new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead_1150", message: "'new T[]' cannot be used to create an array. Use 'new Array<T>()' instead." },
|
|
const_declarations_must_be_initialized: { code: 1155, category: ts.DiagnosticCategory.Error, key: "const_declarations_must_be_initialized_1155", message: "'const' declarations must be initialized" },
|
|
const_declarations_can_only_be_declared_inside_a_block: { code: 1156, category: ts.DiagnosticCategory.Error, key: "const_declarations_can_only_be_declared_inside_a_block_1156", message: "'const' declarations can only be declared inside a block." },
|
|
let_declarations_can_only_be_declared_inside_a_block: { code: 1157, category: ts.DiagnosticCategory.Error, key: "let_declarations_can_only_be_declared_inside_a_block_1157", message: "'let' declarations can only be declared inside a block." },
|
|
Unterminated_template_literal: { code: 1160, category: ts.DiagnosticCategory.Error, key: "Unterminated_template_literal_1160", message: "Unterminated template literal." },
|
|
Unterminated_regular_expression_literal: { code: 1161, category: ts.DiagnosticCategory.Error, key: "Unterminated_regular_expression_literal_1161", message: "Unterminated regular expression literal." },
|
|
An_object_member_cannot_be_declared_optional: { code: 1162, category: ts.DiagnosticCategory.Error, key: "An_object_member_cannot_be_declared_optional_1162", message: "An object member cannot be declared optional." },
|
|
A_yield_expression_is_only_allowed_in_a_generator_body: { code: 1163, category: ts.DiagnosticCategory.Error, key: "A_yield_expression_is_only_allowed_in_a_generator_body_1163", message: "A 'yield' expression is only allowed in a generator body." },
|
|
Computed_property_names_are_not_allowed_in_enums: { code: 1164, category: ts.DiagnosticCategory.Error, key: "Computed_property_names_are_not_allowed_in_enums_1164", message: "Computed property names are not allowed in enums." },
|
|
A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol: { code: 1165, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol_1165", message: "A computed property name in an ambient context must directly refer to a built-in symbol." },
|
|
A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol: { code: 1166, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol_1166", message: "A computed property name in a class property declaration must directly refer to a built-in symbol." },
|
|
A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol: { code: 1168, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol_1168", message: "A computed property name in a method overload must directly refer to a built-in symbol." },
|
|
A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol: { code: 1169, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol_1169", message: "A computed property name in an interface must directly refer to a built-in symbol." },
|
|
A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol: { code: 1170, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol_1170", message: "A computed property name in a type literal must directly refer to a built-in symbol." },
|
|
A_comma_expression_is_not_allowed_in_a_computed_property_name: { code: 1171, category: ts.DiagnosticCategory.Error, key: "A_comma_expression_is_not_allowed_in_a_computed_property_name_1171", message: "A comma expression is not allowed in a computed property name." },
|
|
extends_clause_already_seen: { code: 1172, category: ts.DiagnosticCategory.Error, key: "extends_clause_already_seen_1172", message: "'extends' clause already seen." },
|
|
extends_clause_must_precede_implements_clause: { code: 1173, category: ts.DiagnosticCategory.Error, key: "extends_clause_must_precede_implements_clause_1173", message: "'extends' clause must precede 'implements' clause." },
|
|
Classes_can_only_extend_a_single_class: { code: 1174, category: ts.DiagnosticCategory.Error, key: "Classes_can_only_extend_a_single_class_1174", message: "Classes can only extend a single class." },
|
|
implements_clause_already_seen: { code: 1175, category: ts.DiagnosticCategory.Error, key: "implements_clause_already_seen_1175", message: "'implements' clause already seen." },
|
|
Interface_declaration_cannot_have_implements_clause: { code: 1176, category: ts.DiagnosticCategory.Error, key: "Interface_declaration_cannot_have_implements_clause_1176", message: "Interface declaration cannot have 'implements' clause." },
|
|
Binary_digit_expected: { code: 1177, category: ts.DiagnosticCategory.Error, key: "Binary_digit_expected_1177", message: "Binary digit expected." },
|
|
Octal_digit_expected: { code: 1178, category: ts.DiagnosticCategory.Error, key: "Octal_digit_expected_1178", message: "Octal digit expected." },
|
|
Unexpected_token_expected: { code: 1179, category: ts.DiagnosticCategory.Error, key: "Unexpected_token_expected_1179", message: "Unexpected token. '{' expected." },
|
|
Property_destructuring_pattern_expected: { code: 1180, category: ts.DiagnosticCategory.Error, key: "Property_destructuring_pattern_expected_1180", message: "Property destructuring pattern expected." },
|
|
Array_element_destructuring_pattern_expected: { code: 1181, category: ts.DiagnosticCategory.Error, key: "Array_element_destructuring_pattern_expected_1181", message: "Array element destructuring pattern expected." },
|
|
A_destructuring_declaration_must_have_an_initializer: { code: 1182, category: ts.DiagnosticCategory.Error, key: "A_destructuring_declaration_must_have_an_initializer_1182", message: "A destructuring declaration must have an initializer." },
|
|
An_implementation_cannot_be_declared_in_ambient_contexts: { code: 1183, category: ts.DiagnosticCategory.Error, key: "An_implementation_cannot_be_declared_in_ambient_contexts_1183", message: "An implementation cannot be declared in ambient contexts." },
|
|
Modifiers_cannot_appear_here: { code: 1184, category: ts.DiagnosticCategory.Error, key: "Modifiers_cannot_appear_here_1184", message: "Modifiers cannot appear here." },
|
|
Merge_conflict_marker_encountered: { code: 1185, category: ts.DiagnosticCategory.Error, key: "Merge_conflict_marker_encountered_1185", message: "Merge conflict marker encountered." },
|
|
A_rest_element_cannot_have_an_initializer: { code: 1186, category: ts.DiagnosticCategory.Error, key: "A_rest_element_cannot_have_an_initializer_1186", message: "A rest element cannot have an initializer." },
|
|
A_parameter_property_may_not_be_declared_using_a_binding_pattern: { code: 1187, category: ts.DiagnosticCategory.Error, key: "A_parameter_property_may_not_be_declared_using_a_binding_pattern_1187", message: "A parameter property may not be declared using a binding pattern." },
|
|
Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement: { code: 1188, category: ts.DiagnosticCategory.Error, key: "Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement_1188", message: "Only a single variable declaration is allowed in a 'for...of' statement." },
|
|
The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer: { code: 1189, category: ts.DiagnosticCategory.Error, key: "The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer_1189", message: "The variable declaration of a 'for...in' statement cannot have an initializer." },
|
|
The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer: { code: 1190, category: ts.DiagnosticCategory.Error, key: "The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer_1190", message: "The variable declaration of a 'for...of' statement cannot have an initializer." },
|
|
An_import_declaration_cannot_have_modifiers: { code: 1191, category: ts.DiagnosticCategory.Error, key: "An_import_declaration_cannot_have_modifiers_1191", message: "An import declaration cannot have modifiers." },
|
|
Module_0_has_no_default_export: { code: 1192, category: ts.DiagnosticCategory.Error, key: "Module_0_has_no_default_export_1192", message: "Module '{0}' has no default export." },
|
|
An_export_declaration_cannot_have_modifiers: { code: 1193, category: ts.DiagnosticCategory.Error, key: "An_export_declaration_cannot_have_modifiers_1193", message: "An export declaration cannot have modifiers." },
|
|
Export_declarations_are_not_permitted_in_a_namespace: { code: 1194, category: ts.DiagnosticCategory.Error, key: "Export_declarations_are_not_permitted_in_a_namespace_1194", message: "Export declarations are not permitted in a namespace." },
|
|
Catch_clause_variable_name_must_be_an_identifier: { code: 1195, category: ts.DiagnosticCategory.Error, key: "Catch_clause_variable_name_must_be_an_identifier_1195", message: "Catch clause variable name must be an identifier." },
|
|
Catch_clause_variable_cannot_have_a_type_annotation: { code: 1196, category: ts.DiagnosticCategory.Error, key: "Catch_clause_variable_cannot_have_a_type_annotation_1196", message: "Catch clause variable cannot have a type annotation." },
|
|
Catch_clause_variable_cannot_have_an_initializer: { code: 1197, category: ts.DiagnosticCategory.Error, key: "Catch_clause_variable_cannot_have_an_initializer_1197", message: "Catch clause variable cannot have an initializer." },
|
|
An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive: { code: 1198, category: ts.DiagnosticCategory.Error, key: "An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive_1198", message: "An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive." },
|
|
Unterminated_Unicode_escape_sequence: { code: 1199, category: ts.DiagnosticCategory.Error, key: "Unterminated_Unicode_escape_sequence_1199", message: "Unterminated Unicode escape sequence." },
|
|
Line_terminator_not_permitted_before_arrow: { code: 1200, category: ts.DiagnosticCategory.Error, key: "Line_terminator_not_permitted_before_arrow_1200", message: "Line terminator not permitted before arrow." },
|
|
Import_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead: { code: 1202, category: ts.DiagnosticCategory.Error, key: "Import_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_import_Asteri_1202", message: "Import assignment cannot be used when targeting ECMAScript 2015 modules. Consider using 'import * as ns from \"mod\"', 'import {a} from \"mod\"', 'import d from \"mod\"', or another module format instead." },
|
|
Export_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_export_default_or_another_module_format_instead: { code: 1203, category: ts.DiagnosticCategory.Error, key: "Export_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_export_defaul_1203", message: "Export assignment cannot be used when targeting ECMAScript 2015 modules. Consider using 'export default' or another module format instead." },
|
|
Decorators_are_not_valid_here: { code: 1206, category: ts.DiagnosticCategory.Error, key: "Decorators_are_not_valid_here_1206", message: "Decorators are not valid here." },
|
|
Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name: { code: 1207, category: ts.DiagnosticCategory.Error, key: "Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name_1207", message: "Decorators cannot be applied to multiple get/set accessors of the same name." },
|
|
Cannot_compile_namespaces_when_the_isolatedModules_flag_is_provided: { code: 1208, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_namespaces_when_the_isolatedModules_flag_is_provided_1208", message: "Cannot compile namespaces when the '--isolatedModules' flag is provided." },
|
|
Ambient_const_enums_are_not_allowed_when_the_isolatedModules_flag_is_provided: { code: 1209, category: ts.DiagnosticCategory.Error, key: "Ambient_const_enums_are_not_allowed_when_the_isolatedModules_flag_is_provided_1209", message: "Ambient const enums are not allowed when the '--isolatedModules' flag is provided." },
|
|
Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode: { code: 1210, category: ts.DiagnosticCategory.Error, key: "Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode_1210", message: "Invalid use of '{0}'. Class definitions are automatically in strict mode." },
|
|
A_class_declaration_without_the_default_modifier_must_have_a_name: { code: 1211, category: ts.DiagnosticCategory.Error, key: "A_class_declaration_without_the_default_modifier_must_have_a_name_1211", message: "A class declaration without the 'default' modifier must have a name" },
|
|
Identifier_expected_0_is_a_reserved_word_in_strict_mode: { code: 1212, category: ts.DiagnosticCategory.Error, key: "Identifier_expected_0_is_a_reserved_word_in_strict_mode_1212", message: "Identifier expected. '{0}' is a reserved word in strict mode" },
|
|
Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode: { code: 1213, category: ts.DiagnosticCategory.Error, key: "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_stric_1213", message: "Identifier expected. '{0}' is a reserved word in strict mode. Class definitions are automatically in strict mode." },
|
|
Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode: { code: 1214, category: ts.DiagnosticCategory.Error, key: "Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode_1214", message: "Identifier expected. '{0}' is a reserved word in strict mode. Modules are automatically in strict mode." },
|
|
Invalid_use_of_0_Modules_are_automatically_in_strict_mode: { code: 1215, category: ts.DiagnosticCategory.Error, key: "Invalid_use_of_0_Modules_are_automatically_in_strict_mode_1215", message: "Invalid use of '{0}'. Modules are automatically in strict mode." },
|
|
Export_assignment_is_not_supported_when_module_flag_is_system: { code: 1218, category: ts.DiagnosticCategory.Error, key: "Export_assignment_is_not_supported_when_module_flag_is_system_1218", message: "Export assignment is not supported when '--module' flag is 'system'." },
|
|
Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_to_remove_this_warning: { code: 1219, category: ts.DiagnosticCategory.Error, key: "Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_t_1219", message: "Experimental support for decorators is a feature that is subject to change in a future release. Set the 'experimentalDecorators' option to remove this warning." },
|
|
Generators_are_only_available_when_targeting_ECMAScript_2015_or_higher: { code: 1220, category: ts.DiagnosticCategory.Error, key: "Generators_are_only_available_when_targeting_ECMAScript_2015_or_higher_1220", message: "Generators are only available when targeting ECMAScript 2015 or higher." },
|
|
Generators_are_not_allowed_in_an_ambient_context: { code: 1221, category: ts.DiagnosticCategory.Error, key: "Generators_are_not_allowed_in_an_ambient_context_1221", message: "Generators are not allowed in an ambient context." },
|
|
An_overload_signature_cannot_be_declared_as_a_generator: { code: 1222, category: ts.DiagnosticCategory.Error, key: "An_overload_signature_cannot_be_declared_as_a_generator_1222", message: "An overload signature cannot be declared as a generator." },
|
|
_0_tag_already_specified: { code: 1223, category: ts.DiagnosticCategory.Error, key: "_0_tag_already_specified_1223", message: "'{0}' tag already specified." },
|
|
Signature_0_must_have_a_type_predicate: { code: 1224, category: ts.DiagnosticCategory.Error, key: "Signature_0_must_have_a_type_predicate_1224", message: "Signature '{0}' must have a type predicate." },
|
|
Cannot_find_parameter_0: { code: 1225, category: ts.DiagnosticCategory.Error, key: "Cannot_find_parameter_0_1225", message: "Cannot find parameter '{0}'." },
|
|
Type_predicate_0_is_not_assignable_to_1: { code: 1226, category: ts.DiagnosticCategory.Error, key: "Type_predicate_0_is_not_assignable_to_1_1226", message: "Type predicate '{0}' is not assignable to '{1}'." },
|
|
Parameter_0_is_not_in_the_same_position_as_parameter_1: { code: 1227, category: ts.DiagnosticCategory.Error, key: "Parameter_0_is_not_in_the_same_position_as_parameter_1_1227", message: "Parameter '{0}' is not in the same position as parameter '{1}'." },
|
|
A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods: { code: 1228, category: ts.DiagnosticCategory.Error, key: "A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods_1228", message: "A type predicate is only allowed in return type position for functions and methods." },
|
|
A_type_predicate_cannot_reference_a_rest_parameter: { code: 1229, category: ts.DiagnosticCategory.Error, key: "A_type_predicate_cannot_reference_a_rest_parameter_1229", message: "A type predicate cannot reference a rest parameter." },
|
|
A_type_predicate_cannot_reference_element_0_in_a_binding_pattern: { code: 1230, category: ts.DiagnosticCategory.Error, key: "A_type_predicate_cannot_reference_element_0_in_a_binding_pattern_1230", message: "A type predicate cannot reference element '{0}' in a binding pattern." },
|
|
An_export_assignment_can_only_be_used_in_a_module: { code: 1231, category: ts.DiagnosticCategory.Error, key: "An_export_assignment_can_only_be_used_in_a_module_1231", message: "An export assignment can only be used in a module." },
|
|
An_import_declaration_can_only_be_used_in_a_namespace_or_module: { code: 1232, category: ts.DiagnosticCategory.Error, key: "An_import_declaration_can_only_be_used_in_a_namespace_or_module_1232", message: "An import declaration can only be used in a namespace or module." },
|
|
An_export_declaration_can_only_be_used_in_a_module: { code: 1233, category: ts.DiagnosticCategory.Error, key: "An_export_declaration_can_only_be_used_in_a_module_1233", message: "An export declaration can only be used in a module." },
|
|
An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file: { code: 1234, category: ts.DiagnosticCategory.Error, key: "An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file_1234", message: "An ambient module declaration is only allowed at the top level in a file." },
|
|
A_namespace_declaration_is_only_allowed_in_a_namespace_or_module: { code: 1235, category: ts.DiagnosticCategory.Error, key: "A_namespace_declaration_is_only_allowed_in_a_namespace_or_module_1235", message: "A namespace declaration is only allowed in a namespace or module." },
|
|
The_return_type_of_a_property_decorator_function_must_be_either_void_or_any: { code: 1236, category: ts.DiagnosticCategory.Error, key: "The_return_type_of_a_property_decorator_function_must_be_either_void_or_any_1236", message: "The return type of a property decorator function must be either 'void' or 'any'." },
|
|
The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any: { code: 1237, category: ts.DiagnosticCategory.Error, key: "The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any_1237", message: "The return type of a parameter decorator function must be either 'void' or 'any'." },
|
|
Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression: { code: 1238, category: ts.DiagnosticCategory.Error, key: "Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression_1238", message: "Unable to resolve signature of class decorator when called as an expression." },
|
|
Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression: { code: 1239, category: ts.DiagnosticCategory.Error, key: "Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression_1239", message: "Unable to resolve signature of parameter decorator when called as an expression." },
|
|
Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression: { code: 1240, category: ts.DiagnosticCategory.Error, key: "Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression_1240", message: "Unable to resolve signature of property decorator when called as an expression." },
|
|
Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression: { code: 1241, category: ts.DiagnosticCategory.Error, key: "Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression_1241", message: "Unable to resolve signature of method decorator when called as an expression." },
|
|
abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration: { code: 1242, category: ts.DiagnosticCategory.Error, key: "abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration_1242", message: "'abstract' modifier can only appear on a class, method, or property declaration." },
|
|
_0_modifier_cannot_be_used_with_1_modifier: { code: 1243, category: ts.DiagnosticCategory.Error, key: "_0_modifier_cannot_be_used_with_1_modifier_1243", message: "'{0}' modifier cannot be used with '{1}' modifier." },
|
|
Abstract_methods_can_only_appear_within_an_abstract_class: { code: 1244, category: ts.DiagnosticCategory.Error, key: "Abstract_methods_can_only_appear_within_an_abstract_class_1244", message: "Abstract methods can only appear within an abstract class." },
|
|
Method_0_cannot_have_an_implementation_because_it_is_marked_abstract: { code: 1245, category: ts.DiagnosticCategory.Error, key: "Method_0_cannot_have_an_implementation_because_it_is_marked_abstract_1245", message: "Method '{0}' cannot have an implementation because it is marked abstract." },
|
|
An_interface_property_cannot_have_an_initializer: { code: 1246, category: ts.DiagnosticCategory.Error, key: "An_interface_property_cannot_have_an_initializer_1246", message: "An interface property cannot have an initializer." },
|
|
A_type_literal_property_cannot_have_an_initializer: { code: 1247, category: ts.DiagnosticCategory.Error, key: "A_type_literal_property_cannot_have_an_initializer_1247", message: "A type literal property cannot have an initializer." },
|
|
A_class_member_cannot_have_the_0_keyword: { code: 1248, category: ts.DiagnosticCategory.Error, key: "A_class_member_cannot_have_the_0_keyword_1248", message: "A class member cannot have the '{0}' keyword." },
|
|
A_decorator_can_only_decorate_a_method_implementation_not_an_overload: { code: 1249, category: ts.DiagnosticCategory.Error, key: "A_decorator_can_only_decorate_a_method_implementation_not_an_overload_1249", message: "A decorator can only decorate a method implementation, not an overload." },
|
|
Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5: { code: 1250, category: ts.DiagnosticCategory.Error, key: "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_1250", message: "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'." },
|
|
Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode: { code: 1251, category: ts.DiagnosticCategory.Error, key: "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_d_1251", message: "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Class definitions are automatically in strict mode." },
|
|
Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode: { code: 1252, category: ts.DiagnosticCategory.Error, key: "Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_1252", message: "Function declarations are not allowed inside blocks in strict mode when targeting 'ES3' or 'ES5'. Modules are automatically in strict mode." },
|
|
_0_tag_cannot_be_used_independently_as_a_top_level_JSDoc_tag: { code: 1253, category: ts.DiagnosticCategory.Error, key: "_0_tag_cannot_be_used_independently_as_a_top_level_JSDoc_tag_1253", message: "'{0}' tag cannot be used independently as a top level JSDoc tag." },
|
|
with_statements_are_not_allowed_in_an_async_function_block: { code: 1300, category: ts.DiagnosticCategory.Error, key: "with_statements_are_not_allowed_in_an_async_function_block_1300", message: "'with' statements are not allowed in an async function block." },
|
|
await_expression_is_only_allowed_within_an_async_function: { code: 1308, category: ts.DiagnosticCategory.Error, key: "await_expression_is_only_allowed_within_an_async_function_1308", message: "'await' expression is only allowed within an async function." },
|
|
Async_functions_are_only_available_when_targeting_ECMAScript_2015_or_higher: { code: 1311, category: ts.DiagnosticCategory.Error, key: "Async_functions_are_only_available_when_targeting_ECMAScript_2015_or_higher_1311", message: "Async functions are only available when targeting ECMAScript 2015 or higher." },
|
|
can_only_be_used_in_an_object_literal_property_inside_a_destructuring_assignment: { code: 1312, category: ts.DiagnosticCategory.Error, key: "can_only_be_used_in_an_object_literal_property_inside_a_destructuring_assignment_1312", message: "'=' can only be used in an object literal property inside a destructuring assignment." },
|
|
The_body_of_an_if_statement_cannot_be_the_empty_statement: { code: 1313, category: ts.DiagnosticCategory.Error, key: "The_body_of_an_if_statement_cannot_be_the_empty_statement_1313", message: "The body of an 'if' statement cannot be the empty statement." },
|
|
Global_module_exports_may_only_appear_in_module_files: { code: 1314, category: ts.DiagnosticCategory.Error, key: "Global_module_exports_may_only_appear_in_module_files_1314", message: "Global module exports may only appear in module files." },
|
|
Global_module_exports_may_only_appear_in_declaration_files: { code: 1315, category: ts.DiagnosticCategory.Error, key: "Global_module_exports_may_only_appear_in_declaration_files_1315", message: "Global module exports may only appear in declaration files." },
|
|
Global_module_exports_may_only_appear_at_top_level: { code: 1316, category: ts.DiagnosticCategory.Error, key: "Global_module_exports_may_only_appear_at_top_level_1316", message: "Global module exports may only appear at top level." },
|
|
A_parameter_property_cannot_be_declared_using_a_rest_parameter: { code: 1317, category: ts.DiagnosticCategory.Error, key: "A_parameter_property_cannot_be_declared_using_a_rest_parameter_1317", message: "A parameter property cannot be declared using a rest parameter." },
|
|
Duplicate_identifier_0: { code: 2300, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_0_2300", message: "Duplicate identifier '{0}'." },
|
|
Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor: { code: 2301, category: ts.DiagnosticCategory.Error, key: "Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor_2301", message: "Initializer of instance member variable '{0}' cannot reference identifier '{1}' declared in the constructor." },
|
|
Static_members_cannot_reference_class_type_parameters: { code: 2302, category: ts.DiagnosticCategory.Error, key: "Static_members_cannot_reference_class_type_parameters_2302", message: "Static members cannot reference class type parameters." },
|
|
Circular_definition_of_import_alias_0: { code: 2303, category: ts.DiagnosticCategory.Error, key: "Circular_definition_of_import_alias_0_2303", message: "Circular definition of import alias '{0}'." },
|
|
Cannot_find_name_0: { code: 2304, category: ts.DiagnosticCategory.Error, key: "Cannot_find_name_0_2304", message: "Cannot find name '{0}'." },
|
|
Module_0_has_no_exported_member_1: { code: 2305, category: ts.DiagnosticCategory.Error, key: "Module_0_has_no_exported_member_1_2305", message: "Module '{0}' has no exported member '{1}'." },
|
|
File_0_is_not_a_module: { code: 2306, category: ts.DiagnosticCategory.Error, key: "File_0_is_not_a_module_2306", message: "File '{0}' is not a module." },
|
|
Cannot_find_module_0: { code: 2307, category: ts.DiagnosticCategory.Error, key: "Cannot_find_module_0_2307", message: "Cannot find module '{0}'." },
|
|
Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity: { code: 2308, category: ts.DiagnosticCategory.Error, key: "Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambig_2308", message: "Module {0} has already exported a member named '{1}'. Consider explicitly re-exporting to resolve the ambiguity." },
|
|
An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements: { code: 2309, category: ts.DiagnosticCategory.Error, key: "An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements_2309", message: "An export assignment cannot be used in a module with other exported elements." },
|
|
Type_0_recursively_references_itself_as_a_base_type: { code: 2310, category: ts.DiagnosticCategory.Error, key: "Type_0_recursively_references_itself_as_a_base_type_2310", message: "Type '{0}' recursively references itself as a base type." },
|
|
A_class_may_only_extend_another_class: { code: 2311, category: ts.DiagnosticCategory.Error, key: "A_class_may_only_extend_another_class_2311", message: "A class may only extend another class." },
|
|
An_interface_may_only_extend_a_class_or_another_interface: { code: 2312, category: ts.DiagnosticCategory.Error, key: "An_interface_may_only_extend_a_class_or_another_interface_2312", message: "An interface may only extend a class or another interface." },
|
|
Type_parameter_0_has_a_circular_constraint: { code: 2313, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_has_a_circular_constraint_2313", message: "Type parameter '{0}' has a circular constraint." },
|
|
Generic_type_0_requires_1_type_argument_s: { code: 2314, category: ts.DiagnosticCategory.Error, key: "Generic_type_0_requires_1_type_argument_s_2314", message: "Generic type '{0}' requires {1} type argument(s)." },
|
|
Type_0_is_not_generic: { code: 2315, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_generic_2315", message: "Type '{0}' is not generic." },
|
|
Global_type_0_must_be_a_class_or_interface_type: { code: 2316, category: ts.DiagnosticCategory.Error, key: "Global_type_0_must_be_a_class_or_interface_type_2316", message: "Global type '{0}' must be a class or interface type." },
|
|
Global_type_0_must_have_1_type_parameter_s: { code: 2317, category: ts.DiagnosticCategory.Error, key: "Global_type_0_must_have_1_type_parameter_s_2317", message: "Global type '{0}' must have {1} type parameter(s)." },
|
|
Cannot_find_global_type_0: { code: 2318, category: ts.DiagnosticCategory.Error, key: "Cannot_find_global_type_0_2318", message: "Cannot find global type '{0}'." },
|
|
Named_property_0_of_types_1_and_2_are_not_identical: { code: 2319, category: ts.DiagnosticCategory.Error, key: "Named_property_0_of_types_1_and_2_are_not_identical_2319", message: "Named property '{0}' of types '{1}' and '{2}' are not identical." },
|
|
Interface_0_cannot_simultaneously_extend_types_1_and_2: { code: 2320, category: ts.DiagnosticCategory.Error, key: "Interface_0_cannot_simultaneously_extend_types_1_and_2_2320", message: "Interface '{0}' cannot simultaneously extend types '{1}' and '{2}'." },
|
|
Excessive_stack_depth_comparing_types_0_and_1: { code: 2321, category: ts.DiagnosticCategory.Error, key: "Excessive_stack_depth_comparing_types_0_and_1_2321", message: "Excessive stack depth comparing types '{0}' and '{1}'." },
|
|
Type_0_is_not_assignable_to_type_1: { code: 2322, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_assignable_to_type_1_2322", message: "Type '{0}' is not assignable to type '{1}'." },
|
|
Cannot_redeclare_exported_variable_0: { code: 2323, category: ts.DiagnosticCategory.Error, key: "Cannot_redeclare_exported_variable_0_2323", message: "Cannot redeclare exported variable '{0}'." },
|
|
Property_0_is_missing_in_type_1: { code: 2324, category: ts.DiagnosticCategory.Error, key: "Property_0_is_missing_in_type_1_2324", message: "Property '{0}' is missing in type '{1}'." },
|
|
Property_0_is_private_in_type_1_but_not_in_type_2: { code: 2325, category: ts.DiagnosticCategory.Error, key: "Property_0_is_private_in_type_1_but_not_in_type_2_2325", message: "Property '{0}' is private in type '{1}' but not in type '{2}'." },
|
|
Types_of_property_0_are_incompatible: { code: 2326, category: ts.DiagnosticCategory.Error, key: "Types_of_property_0_are_incompatible_2326", message: "Types of property '{0}' are incompatible." },
|
|
Property_0_is_optional_in_type_1_but_required_in_type_2: { code: 2327, category: ts.DiagnosticCategory.Error, key: "Property_0_is_optional_in_type_1_but_required_in_type_2_2327", message: "Property '{0}' is optional in type '{1}' but required in type '{2}'." },
|
|
Types_of_parameters_0_and_1_are_incompatible: { code: 2328, category: ts.DiagnosticCategory.Error, key: "Types_of_parameters_0_and_1_are_incompatible_2328", message: "Types of parameters '{0}' and '{1}' are incompatible." },
|
|
Index_signature_is_missing_in_type_0: { code: 2329, category: ts.DiagnosticCategory.Error, key: "Index_signature_is_missing_in_type_0_2329", message: "Index signature is missing in type '{0}'." },
|
|
Index_signatures_are_incompatible: { code: 2330, category: ts.DiagnosticCategory.Error, key: "Index_signatures_are_incompatible_2330", message: "Index signatures are incompatible." },
|
|
this_cannot_be_referenced_in_a_module_or_namespace_body: { code: 2331, category: ts.DiagnosticCategory.Error, key: "this_cannot_be_referenced_in_a_module_or_namespace_body_2331", message: "'this' cannot be referenced in a module or namespace body." },
|
|
this_cannot_be_referenced_in_current_location: { code: 2332, category: ts.DiagnosticCategory.Error, key: "this_cannot_be_referenced_in_current_location_2332", message: "'this' cannot be referenced in current location." },
|
|
this_cannot_be_referenced_in_constructor_arguments: { code: 2333, category: ts.DiagnosticCategory.Error, key: "this_cannot_be_referenced_in_constructor_arguments_2333", message: "'this' cannot be referenced in constructor arguments." },
|
|
this_cannot_be_referenced_in_a_static_property_initializer: { code: 2334, category: ts.DiagnosticCategory.Error, key: "this_cannot_be_referenced_in_a_static_property_initializer_2334", message: "'this' cannot be referenced in a static property initializer." },
|
|
super_can_only_be_referenced_in_a_derived_class: { code: 2335, category: ts.DiagnosticCategory.Error, key: "super_can_only_be_referenced_in_a_derived_class_2335", message: "'super' can only be referenced in a derived class." },
|
|
super_cannot_be_referenced_in_constructor_arguments: { code: 2336, category: ts.DiagnosticCategory.Error, key: "super_cannot_be_referenced_in_constructor_arguments_2336", message: "'super' cannot be referenced in constructor arguments." },
|
|
Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors: { code: 2337, category: ts.DiagnosticCategory.Error, key: "Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors_2337", message: "Super calls are not permitted outside constructors or in nested functions inside constructors." },
|
|
super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class: { code: 2338, category: ts.DiagnosticCategory.Error, key: "super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_der_2338", message: "'super' property access is permitted only in a constructor, member function, or member accessor of a derived class." },
|
|
Property_0_does_not_exist_on_type_1: { code: 2339, category: ts.DiagnosticCategory.Error, key: "Property_0_does_not_exist_on_type_1_2339", message: "Property '{0}' does not exist on type '{1}'." },
|
|
Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword: { code: 2340, category: ts.DiagnosticCategory.Error, key: "Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword_2340", message: "Only public and protected methods of the base class are accessible via the 'super' keyword." },
|
|
Property_0_is_private_and_only_accessible_within_class_1: { code: 2341, category: ts.DiagnosticCategory.Error, key: "Property_0_is_private_and_only_accessible_within_class_1_2341", message: "Property '{0}' is private and only accessible within class '{1}'." },
|
|
An_index_expression_argument_must_be_of_type_string_number_symbol_or_any: { code: 2342, category: ts.DiagnosticCategory.Error, key: "An_index_expression_argument_must_be_of_type_string_number_symbol_or_any_2342", message: "An index expression argument must be of type 'string', 'number', 'symbol', or 'any'." },
|
|
Type_0_does_not_satisfy_the_constraint_1: { code: 2344, category: ts.DiagnosticCategory.Error, key: "Type_0_does_not_satisfy_the_constraint_1_2344", message: "Type '{0}' does not satisfy the constraint '{1}'." },
|
|
Argument_of_type_0_is_not_assignable_to_parameter_of_type_1: { code: 2345, category: ts.DiagnosticCategory.Error, key: "Argument_of_type_0_is_not_assignable_to_parameter_of_type_1_2345", message: "Argument of type '{0}' is not assignable to parameter of type '{1}'." },
|
|
Supplied_parameters_do_not_match_any_signature_of_call_target: { code: 2346, category: ts.DiagnosticCategory.Error, key: "Supplied_parameters_do_not_match_any_signature_of_call_target_2346", message: "Supplied parameters do not match any signature of call target." },
|
|
Untyped_function_calls_may_not_accept_type_arguments: { code: 2347, category: ts.DiagnosticCategory.Error, key: "Untyped_function_calls_may_not_accept_type_arguments_2347", message: "Untyped function calls may not accept type arguments." },
|
|
Value_of_type_0_is_not_callable_Did_you_mean_to_include_new: { code: 2348, category: ts.DiagnosticCategory.Error, key: "Value_of_type_0_is_not_callable_Did_you_mean_to_include_new_2348", message: "Value of type '{0}' is not callable. Did you mean to include 'new'?" },
|
|
Cannot_invoke_an_expression_whose_type_lacks_a_call_signature: { code: 2349, category: ts.DiagnosticCategory.Error, key: "Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_2349", message: "Cannot invoke an expression whose type lacks a call signature." },
|
|
Only_a_void_function_can_be_called_with_the_new_keyword: { code: 2350, category: ts.DiagnosticCategory.Error, key: "Only_a_void_function_can_be_called_with_the_new_keyword_2350", message: "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: ts.DiagnosticCategory.Error, key: "Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature_2351", message: "Cannot use 'new' with an expression whose type lacks a call or construct signature." },
|
|
Type_0_cannot_be_converted_to_type_1: { code: 2352, category: ts.DiagnosticCategory.Error, key: "Type_0_cannot_be_converted_to_type_1_2352", message: "Type '{0}' cannot be converted to type '{1}'." },
|
|
Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1: { code: 2353, category: ts.DiagnosticCategory.Error, key: "Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1_2353", message: "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: ts.DiagnosticCategory.Error, key: "No_best_common_type_exists_among_return_expressions_2354", message: "No best common type exists among return expressions." },
|
|
A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value: { code: 2355, category: ts.DiagnosticCategory.Error, key: "A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value_2355", message: "A function whose declared type is neither 'void' nor 'any' must return a value." },
|
|
An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type: { code: 2356, category: ts.DiagnosticCategory.Error, key: "An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type_2356", message: "An arithmetic operand must be of type 'any', 'number' or an enum type." },
|
|
The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer: { code: 2357, category: ts.DiagnosticCategory.Error, key: "The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer_2357", message: "The operand of an increment or decrement operator must be a variable, property or indexer." },
|
|
The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2358, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_paramete_2358", message: "The left-hand side of an 'instanceof' expression must be of type 'any', an object type or a type parameter." },
|
|
The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type: { code: 2359, category: ts.DiagnosticCategory.Error, key: "The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_F_2359", message: "The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type." },
|
|
The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol: { code: 2360, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol_2360", message: "The left-hand side of an 'in' expression must be of type 'any', 'string', 'number', or 'symbol'." },
|
|
The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2361, category: ts.DiagnosticCategory.Error, key: "The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter_2361", message: "The right-hand side of an 'in' expression must be of type 'any', an object type or a type parameter" },
|
|
The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2362, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type_2362", message: "The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
|
|
The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type: { code: 2363, category: ts.DiagnosticCategory.Error, key: "The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type_2363", message: "The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type." },
|
|
Invalid_left_hand_side_of_assignment_expression: { code: 2364, category: ts.DiagnosticCategory.Error, key: "Invalid_left_hand_side_of_assignment_expression_2364", message: "Invalid left-hand side of assignment expression." },
|
|
Operator_0_cannot_be_applied_to_types_1_and_2: { code: 2365, category: ts.DiagnosticCategory.Error, key: "Operator_0_cannot_be_applied_to_types_1_and_2_2365", message: "Operator '{0}' cannot be applied to types '{1}' and '{2}'." },
|
|
Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined: { code: 2366, category: ts.DiagnosticCategory.Error, key: "Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined_2366", message: "Function lacks ending return statement and return type does not include 'undefined'." },
|
|
Type_parameter_name_cannot_be_0: { code: 2368, category: ts.DiagnosticCategory.Error, key: "Type_parameter_name_cannot_be_0_2368", message: "Type parameter name cannot be '{0}'" },
|
|
A_parameter_property_is_only_allowed_in_a_constructor_implementation: { code: 2369, category: ts.DiagnosticCategory.Error, key: "A_parameter_property_is_only_allowed_in_a_constructor_implementation_2369", message: "A parameter property is only allowed in a constructor implementation." },
|
|
A_rest_parameter_must_be_of_an_array_type: { code: 2370, category: ts.DiagnosticCategory.Error, key: "A_rest_parameter_must_be_of_an_array_type_2370", message: "A rest parameter must be of an array type." },
|
|
A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation: { code: 2371, category: ts.DiagnosticCategory.Error, key: "A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation_2371", message: "A parameter initializer is only allowed in a function or constructor implementation." },
|
|
Parameter_0_cannot_be_referenced_in_its_initializer: { code: 2372, category: ts.DiagnosticCategory.Error, key: "Parameter_0_cannot_be_referenced_in_its_initializer_2372", message: "Parameter '{0}' cannot be referenced in its initializer." },
|
|
Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it: { code: 2373, category: ts.DiagnosticCategory.Error, key: "Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it_2373", message: "Initializer of parameter '{0}' cannot reference identifier '{1}' declared after it." },
|
|
Duplicate_string_index_signature: { code: 2374, category: ts.DiagnosticCategory.Error, key: "Duplicate_string_index_signature_2374", message: "Duplicate string index signature." },
|
|
Duplicate_number_index_signature: { code: 2375, category: ts.DiagnosticCategory.Error, key: "Duplicate_number_index_signature_2375", message: "Duplicate number index signature." },
|
|
A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties: { code: 2376, category: ts.DiagnosticCategory.Error, key: "A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_proper_2376", message: "A 'super' call must be the first statement in the constructor when a class contains initialized properties or has parameter properties." },
|
|
Constructors_for_derived_classes_must_contain_a_super_call: { code: 2377, category: ts.DiagnosticCategory.Error, key: "Constructors_for_derived_classes_must_contain_a_super_call_2377", message: "Constructors for derived classes must contain a 'super' call." },
|
|
A_get_accessor_must_return_a_value: { code: 2378, category: ts.DiagnosticCategory.Error, key: "A_get_accessor_must_return_a_value_2378", message: "A 'get' accessor must return a value." },
|
|
Getter_and_setter_accessors_do_not_agree_in_visibility: { code: 2379, category: ts.DiagnosticCategory.Error, key: "Getter_and_setter_accessors_do_not_agree_in_visibility_2379", message: "Getter and setter accessors do not agree in visibility." },
|
|
get_and_set_accessor_must_have_the_same_type: { code: 2380, category: ts.DiagnosticCategory.Error, key: "get_and_set_accessor_must_have_the_same_type_2380", message: "'get' and 'set' accessor must have the same type." },
|
|
A_signature_with_an_implementation_cannot_use_a_string_literal_type: { code: 2381, category: ts.DiagnosticCategory.Error, key: "A_signature_with_an_implementation_cannot_use_a_string_literal_type_2381", message: "A signature with an implementation cannot use a string literal type." },
|
|
Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature: { code: 2382, category: ts.DiagnosticCategory.Error, key: "Specialized_overload_signature_is_not_assignable_to_any_non_specialized_signature_2382", message: "Specialized overload signature is not assignable to any non-specialized signature." },
|
|
Overload_signatures_must_all_be_exported_or_non_exported: { code: 2383, category: ts.DiagnosticCategory.Error, key: "Overload_signatures_must_all_be_exported_or_non_exported_2383", message: "Overload signatures must all be exported or non-exported." },
|
|
Overload_signatures_must_all_be_ambient_or_non_ambient: { code: 2384, category: ts.DiagnosticCategory.Error, key: "Overload_signatures_must_all_be_ambient_or_non_ambient_2384", message: "Overload signatures must all be ambient or non-ambient." },
|
|
Overload_signatures_must_all_be_public_private_or_protected: { code: 2385, category: ts.DiagnosticCategory.Error, key: "Overload_signatures_must_all_be_public_private_or_protected_2385", message: "Overload signatures must all be public, private or protected." },
|
|
Overload_signatures_must_all_be_optional_or_required: { code: 2386, category: ts.DiagnosticCategory.Error, key: "Overload_signatures_must_all_be_optional_or_required_2386", message: "Overload signatures must all be optional or required." },
|
|
Function_overload_must_be_static: { code: 2387, category: ts.DiagnosticCategory.Error, key: "Function_overload_must_be_static_2387", message: "Function overload must be static." },
|
|
Function_overload_must_not_be_static: { code: 2388, category: ts.DiagnosticCategory.Error, key: "Function_overload_must_not_be_static_2388", message: "Function overload must not be static." },
|
|
Function_implementation_name_must_be_0: { code: 2389, category: ts.DiagnosticCategory.Error, key: "Function_implementation_name_must_be_0_2389", message: "Function implementation name must be '{0}'." },
|
|
Constructor_implementation_is_missing: { code: 2390, category: ts.DiagnosticCategory.Error, key: "Constructor_implementation_is_missing_2390", message: "Constructor implementation is missing." },
|
|
Function_implementation_is_missing_or_not_immediately_following_the_declaration: { code: 2391, category: ts.DiagnosticCategory.Error, key: "Function_implementation_is_missing_or_not_immediately_following_the_declaration_2391", message: "Function implementation is missing or not immediately following the declaration." },
|
|
Multiple_constructor_implementations_are_not_allowed: { code: 2392, category: ts.DiagnosticCategory.Error, key: "Multiple_constructor_implementations_are_not_allowed_2392", message: "Multiple constructor implementations are not allowed." },
|
|
Duplicate_function_implementation: { code: 2393, category: ts.DiagnosticCategory.Error, key: "Duplicate_function_implementation_2393", message: "Duplicate function implementation." },
|
|
Overload_signature_is_not_compatible_with_function_implementation: { code: 2394, category: ts.DiagnosticCategory.Error, key: "Overload_signature_is_not_compatible_with_function_implementation_2394", message: "Overload signature is not compatible with function implementation." },
|
|
Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local: { code: 2395, category: ts.DiagnosticCategory.Error, key: "Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local_2395", message: "Individual declarations in merged declaration '{0}' must be all exported or all local." },
|
|
Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters: { code: 2396, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters_2396", message: "Duplicate identifier 'arguments'. Compiler uses 'arguments' to initialize rest parameters." },
|
|
Declaration_name_conflicts_with_built_in_global_identifier_0: { code: 2397, category: ts.DiagnosticCategory.Error, key: "Declaration_name_conflicts_with_built_in_global_identifier_0_2397", message: "Declaration name conflicts with built-in global identifier '{0}'." },
|
|
Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference: { code: 2399, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference_2399", message: "Duplicate identifier '_this'. Compiler uses variable declaration '_this' to capture 'this' reference." },
|
|
Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference: { code: 2400, category: ts.DiagnosticCategory.Error, key: "Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference_2400", message: "Expression resolves to variable declaration '_this' that compiler uses to capture 'this' reference." },
|
|
Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference: { code: 2401, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference_2401", message: "Duplicate identifier '_super'. Compiler uses '_super' to capture base class reference." },
|
|
Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference: { code: 2402, category: ts.DiagnosticCategory.Error, key: "Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference_2402", message: "Expression resolves to '_super' that compiler uses to capture base class reference." },
|
|
Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2: { code: 2403, category: ts.DiagnosticCategory.Error, key: "Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_t_2403", message: "Subsequent variable declarations must have the same type. Variable '{0}' must be of type '{1}', but here has type '{2}'." },
|
|
The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation: { code: 2404, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation_2404", message: "The left-hand side of a 'for...in' statement cannot use a type annotation." },
|
|
The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any: { code: 2405, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any_2405", message: "The left-hand side of a 'for...in' statement must be of type 'string' or 'any'." },
|
|
Invalid_left_hand_side_in_for_in_statement: { code: 2406, category: ts.DiagnosticCategory.Error, key: "Invalid_left_hand_side_in_for_in_statement_2406", message: "Invalid left-hand side in 'for...in' statement." },
|
|
The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter: { code: 2407, category: ts.DiagnosticCategory.Error, key: "The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter_2407", message: "The right-hand side of a 'for...in' statement must be of type 'any', an object type or a type parameter." },
|
|
Setters_cannot_return_a_value: { code: 2408, category: ts.DiagnosticCategory.Error, key: "Setters_cannot_return_a_value_2408", message: "Setters cannot return a value." },
|
|
Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class: { code: 2409, category: ts.DiagnosticCategory.Error, key: "Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class_2409", message: "Return type of constructor signature must be assignable to the instance type of the class" },
|
|
All_symbols_within_a_with_block_will_be_resolved_to_any: { code: 2410, category: ts.DiagnosticCategory.Error, key: "All_symbols_within_a_with_block_will_be_resolved_to_any_2410", message: "All symbols within a 'with' block will be resolved to 'any'." },
|
|
Property_0_of_type_1_is_not_assignable_to_string_index_type_2: { code: 2411, category: ts.DiagnosticCategory.Error, key: "Property_0_of_type_1_is_not_assignable_to_string_index_type_2_2411", message: "Property '{0}' of type '{1}' is not assignable to string index type '{2}'." },
|
|
Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2: { code: 2412, category: ts.DiagnosticCategory.Error, key: "Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2_2412", message: "Property '{0}' of type '{1}' is not assignable to numeric index type '{2}'." },
|
|
Numeric_index_type_0_is_not_assignable_to_string_index_type_1: { code: 2413, category: ts.DiagnosticCategory.Error, key: "Numeric_index_type_0_is_not_assignable_to_string_index_type_1_2413", message: "Numeric index type '{0}' is not assignable to string index type '{1}'." },
|
|
Class_name_cannot_be_0: { code: 2414, category: ts.DiagnosticCategory.Error, key: "Class_name_cannot_be_0_2414", message: "Class name cannot be '{0}'" },
|
|
Class_0_incorrectly_extends_base_class_1: { code: 2415, category: ts.DiagnosticCategory.Error, key: "Class_0_incorrectly_extends_base_class_1_2415", message: "Class '{0}' incorrectly extends base class '{1}'." },
|
|
Class_static_side_0_incorrectly_extends_base_class_static_side_1: { code: 2417, category: ts.DiagnosticCategory.Error, key: "Class_static_side_0_incorrectly_extends_base_class_static_side_1_2417", message: "Class static side '{0}' incorrectly extends base class static side '{1}'." },
|
|
Class_0_incorrectly_implements_interface_1: { code: 2420, category: ts.DiagnosticCategory.Error, key: "Class_0_incorrectly_implements_interface_1_2420", message: "Class '{0}' incorrectly implements interface '{1}'." },
|
|
A_class_may_only_implement_another_class_or_interface: { code: 2422, category: ts.DiagnosticCategory.Error, key: "A_class_may_only_implement_another_class_or_interface_2422", message: "A class may only implement another class or interface." },
|
|
Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor: { code: 2423, category: ts.DiagnosticCategory.Error, key: "Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_access_2423", message: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member accessor." },
|
|
Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property: { code: 2424, category: ts.DiagnosticCategory.Error, key: "Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_proper_2424", message: "Class '{0}' defines instance member function '{1}', but extended class '{2}' defines it as instance member property." },
|
|
Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2425, category: ts.DiagnosticCategory.Error, key: "Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_functi_2425", message: "Class '{0}' defines instance member property '{1}', but extended class '{2}' defines it as instance member function." },
|
|
Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function: { code: 2426, category: ts.DiagnosticCategory.Error, key: "Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_functi_2426", message: "Class '{0}' defines instance member accessor '{1}', but extended class '{2}' defines it as instance member function." },
|
|
Interface_name_cannot_be_0: { code: 2427, category: ts.DiagnosticCategory.Error, key: "Interface_name_cannot_be_0_2427", message: "Interface name cannot be '{0}'" },
|
|
All_declarations_of_0_must_have_identical_type_parameters: { code: 2428, category: ts.DiagnosticCategory.Error, key: "All_declarations_of_0_must_have_identical_type_parameters_2428", message: "All declarations of '{0}' must have identical type parameters." },
|
|
Interface_0_incorrectly_extends_interface_1: { code: 2430, category: ts.DiagnosticCategory.Error, key: "Interface_0_incorrectly_extends_interface_1_2430", message: "Interface '{0}' incorrectly extends interface '{1}'." },
|
|
Enum_name_cannot_be_0: { code: 2431, category: ts.DiagnosticCategory.Error, key: "Enum_name_cannot_be_0_2431", message: "Enum name cannot be '{0}'" },
|
|
In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element: { code: 2432, category: ts.DiagnosticCategory.Error, key: "In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enu_2432", message: "In an enum with multiple declarations, only one declaration can omit an initializer for its first enum element." },
|
|
A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged: { code: 2433, category: ts.DiagnosticCategory.Error, key: "A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merg_2433", message: "A namespace declaration cannot be in a different file from a class or function with which it is merged" },
|
|
A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged: { code: 2434, category: ts.DiagnosticCategory.Error, key: "A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged_2434", message: "A namespace declaration cannot be located prior to a class or function with which it is merged" },
|
|
Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces: { code: 2435, category: ts.DiagnosticCategory.Error, key: "Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces_2435", message: "Ambient modules cannot be nested in other modules or namespaces." },
|
|
Ambient_module_declaration_cannot_specify_relative_module_name: { code: 2436, category: ts.DiagnosticCategory.Error, key: "Ambient_module_declaration_cannot_specify_relative_module_name_2436", message: "Ambient module declaration cannot specify relative module name." },
|
|
Module_0_is_hidden_by_a_local_declaration_with_the_same_name: { code: 2437, category: ts.DiagnosticCategory.Error, key: "Module_0_is_hidden_by_a_local_declaration_with_the_same_name_2437", message: "Module '{0}' is hidden by a local declaration with the same name" },
|
|
Import_name_cannot_be_0: { code: 2438, category: ts.DiagnosticCategory.Error, key: "Import_name_cannot_be_0_2438", message: "Import name cannot be '{0}'" },
|
|
Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name: { code: 2439, category: ts.DiagnosticCategory.Error, key: "Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relati_2439", message: "Import or export declaration in an ambient module declaration cannot reference module through relative module name." },
|
|
Import_declaration_conflicts_with_local_declaration_of_0: { code: 2440, category: ts.DiagnosticCategory.Error, key: "Import_declaration_conflicts_with_local_declaration_of_0_2440", message: "Import declaration conflicts with local declaration of '{0}'" },
|
|
Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module: { code: 2441, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_2441", message: "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module." },
|
|
Types_have_separate_declarations_of_a_private_property_0: { code: 2442, category: ts.DiagnosticCategory.Error, key: "Types_have_separate_declarations_of_a_private_property_0_2442", message: "Types have separate declarations of a private property '{0}'." },
|
|
Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2: { code: 2443, category: ts.DiagnosticCategory.Error, key: "Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2_2443", message: "Property '{0}' is protected but type '{1}' is not a class derived from '{2}'." },
|
|
Property_0_is_protected_in_type_1_but_public_in_type_2: { code: 2444, category: ts.DiagnosticCategory.Error, key: "Property_0_is_protected_in_type_1_but_public_in_type_2_2444", message: "Property '{0}' is protected in type '{1}' but public in type '{2}'." },
|
|
Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses: { code: 2445, category: ts.DiagnosticCategory.Error, key: "Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses_2445", message: "Property '{0}' is protected and only accessible within class '{1}' and its subclasses." },
|
|
Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1: { code: 2446, category: ts.DiagnosticCategory.Error, key: "Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1_2446", message: "Property '{0}' is protected and only accessible through an instance of class '{1}'." },
|
|
The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead: { code: 2447, category: ts.DiagnosticCategory.Error, key: "The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead_2447", message: "The '{0}' operator is not allowed for boolean types. Consider using '{1}' instead." },
|
|
Block_scoped_variable_0_used_before_its_declaration: { code: 2448, category: ts.DiagnosticCategory.Error, key: "Block_scoped_variable_0_used_before_its_declaration_2448", message: "Block-scoped variable '{0}' used before its declaration." },
|
|
The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant_or_a_read_only_property: { code: 2449, category: ts.DiagnosticCategory.Error, key: "The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant_or_a_read_only_property_2449", message: "The operand of an increment or decrement operator cannot be a constant or a read-only property." },
|
|
Left_hand_side_of_assignment_expression_cannot_be_a_constant_or_a_read_only_property: { code: 2450, category: ts.DiagnosticCategory.Error, key: "Left_hand_side_of_assignment_expression_cannot_be_a_constant_or_a_read_only_property_2450", message: "Left-hand side of assignment expression cannot be a constant or a read-only property." },
|
|
Cannot_redeclare_block_scoped_variable_0: { code: 2451, category: ts.DiagnosticCategory.Error, key: "Cannot_redeclare_block_scoped_variable_0_2451", message: "Cannot redeclare block-scoped variable '{0}'." },
|
|
An_enum_member_cannot_have_a_numeric_name: { code: 2452, category: ts.DiagnosticCategory.Error, key: "An_enum_member_cannot_have_a_numeric_name_2452", message: "An enum member cannot have a numeric name." },
|
|
The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly: { code: 2453, category: ts.DiagnosticCategory.Error, key: "The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_typ_2453", message: "The type argument for type parameter '{0}' cannot be inferred from the usage. Consider specifying the type arguments explicitly." },
|
|
Variable_0_is_used_before_being_assigned: { code: 2454, category: ts.DiagnosticCategory.Error, key: "Variable_0_is_used_before_being_assigned_2454", message: "Variable '{0}' is used before being assigned." },
|
|
Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0: { code: 2455, category: ts.DiagnosticCategory.Error, key: "Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0_2455", message: "Type argument candidate '{1}' is not a valid type argument because it is not a supertype of candidate '{0}'." },
|
|
Type_alias_0_circularly_references_itself: { code: 2456, category: ts.DiagnosticCategory.Error, key: "Type_alias_0_circularly_references_itself_2456", message: "Type alias '{0}' circularly references itself." },
|
|
Type_alias_name_cannot_be_0: { code: 2457, category: ts.DiagnosticCategory.Error, key: "Type_alias_name_cannot_be_0_2457", message: "Type alias name cannot be '{0}'" },
|
|
An_AMD_module_cannot_have_multiple_name_assignments: { code: 2458, category: ts.DiagnosticCategory.Error, key: "An_AMD_module_cannot_have_multiple_name_assignments_2458", message: "An AMD module cannot have multiple name assignments." },
|
|
Type_0_has_no_property_1_and_no_string_index_signature: { code: 2459, category: ts.DiagnosticCategory.Error, key: "Type_0_has_no_property_1_and_no_string_index_signature_2459", message: "Type '{0}' has no property '{1}' and no string index signature." },
|
|
Type_0_has_no_property_1: { code: 2460, category: ts.DiagnosticCategory.Error, key: "Type_0_has_no_property_1_2460", message: "Type '{0}' has no property '{1}'." },
|
|
Type_0_is_not_an_array_type: { code: 2461, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_an_array_type_2461", message: "Type '{0}' is not an array type." },
|
|
A_rest_element_must_be_last_in_an_array_destructuring_pattern: { code: 2462, category: ts.DiagnosticCategory.Error, key: "A_rest_element_must_be_last_in_an_array_destructuring_pattern_2462", message: "A rest element must be last in an array destructuring pattern" },
|
|
A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature: { code: 2463, category: ts.DiagnosticCategory.Error, key: "A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature_2463", message: "A binding pattern parameter cannot be optional in an implementation signature." },
|
|
A_computed_property_name_must_be_of_type_string_number_symbol_or_any: { code: 2464, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_must_be_of_type_string_number_symbol_or_any_2464", message: "A computed property name must be of type 'string', 'number', 'symbol', or 'any'." },
|
|
this_cannot_be_referenced_in_a_computed_property_name: { code: 2465, category: ts.DiagnosticCategory.Error, key: "this_cannot_be_referenced_in_a_computed_property_name_2465", message: "'this' cannot be referenced in a computed property name." },
|
|
super_cannot_be_referenced_in_a_computed_property_name: { code: 2466, category: ts.DiagnosticCategory.Error, key: "super_cannot_be_referenced_in_a_computed_property_name_2466", message: "'super' cannot be referenced in a computed property name." },
|
|
A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type: { code: 2467, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type_2467", message: "A computed property name cannot reference a type parameter from its containing type." },
|
|
Cannot_find_global_value_0: { code: 2468, category: ts.DiagnosticCategory.Error, key: "Cannot_find_global_value_0_2468", message: "Cannot find global value '{0}'." },
|
|
The_0_operator_cannot_be_applied_to_type_symbol: { code: 2469, category: ts.DiagnosticCategory.Error, key: "The_0_operator_cannot_be_applied_to_type_symbol_2469", message: "The '{0}' operator cannot be applied to type 'symbol'." },
|
|
Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object: { code: 2470, category: ts.DiagnosticCategory.Error, key: "Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object_2470", message: "'Symbol' reference does not refer to the global Symbol constructor object." },
|
|
A_computed_property_name_of_the_form_0_must_be_of_type_symbol: { code: 2471, category: ts.DiagnosticCategory.Error, key: "A_computed_property_name_of_the_form_0_must_be_of_type_symbol_2471", message: "A computed property name of the form '{0}' must be of type 'symbol'." },
|
|
Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher: { code: 2472, category: ts.DiagnosticCategory.Error, key: "Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher_2472", message: "Spread operator in 'new' expressions is only available when targeting ECMAScript 5 and higher." },
|
|
Enum_declarations_must_all_be_const_or_non_const: { code: 2473, category: ts.DiagnosticCategory.Error, key: "Enum_declarations_must_all_be_const_or_non_const_2473", message: "Enum declarations must all be const or non-const." },
|
|
In_const_enum_declarations_member_initializer_must_be_constant_expression: { code: 2474, category: ts.DiagnosticCategory.Error, key: "In_const_enum_declarations_member_initializer_must_be_constant_expression_2474", message: "In 'const' enum declarations member initializer must be constant expression." },
|
|
const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment: { code: 2475, category: ts.DiagnosticCategory.Error, key: "const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_im_2475", message: "'const' enums can only be used in property or index access expressions or the right hand side of an import declaration or export assignment." },
|
|
A_const_enum_member_can_only_be_accessed_using_a_string_literal: { code: 2476, category: ts.DiagnosticCategory.Error, key: "A_const_enum_member_can_only_be_accessed_using_a_string_literal_2476", message: "A const enum member can only be accessed using a string literal." },
|
|
const_enum_member_initializer_was_evaluated_to_a_non_finite_value: { code: 2477, category: ts.DiagnosticCategory.Error, key: "const_enum_member_initializer_was_evaluated_to_a_non_finite_value_2477", message: "'const' enum member initializer was evaluated to a non-finite value." },
|
|
const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN: { code: 2478, category: ts.DiagnosticCategory.Error, key: "const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN_2478", message: "'const' enum member initializer was evaluated to disallowed value 'NaN'." },
|
|
Property_0_does_not_exist_on_const_enum_1: { code: 2479, category: ts.DiagnosticCategory.Error, key: "Property_0_does_not_exist_on_const_enum_1_2479", message: "Property '{0}' does not exist on 'const' enum '{1}'." },
|
|
let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2480, category: ts.DiagnosticCategory.Error, key: "let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations_2480", message: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." },
|
|
Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2481, category: ts.DiagnosticCategory.Error, key: "Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1_2481", message: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." },
|
|
The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation_2483", message: "The left-hand side of a 'for...of' statement cannot use a type annotation." },
|
|
Export_declaration_conflicts_with_exported_declaration_of_0: { code: 2484, category: ts.DiagnosticCategory.Error, key: "Export_declaration_conflicts_with_exported_declaration_of_0_2484", message: "Export declaration conflicts with exported declaration of '{0}'" },
|
|
The_left_hand_side_of_a_for_of_statement_cannot_be_a_constant_or_a_read_only_property: { code: 2485, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_of_statement_cannot_be_a_constant_or_a_read_only_property_2485", message: "The left-hand side of a 'for...of' statement cannot be a constant or a read-only property." },
|
|
The_left_hand_side_of_a_for_in_statement_cannot_be_a_constant_or_a_read_only_property: { code: 2486, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_in_statement_cannot_be_a_constant_or_a_read_only_property_2486", message: "The left-hand side of a 'for...in' statement cannot be a constant or a read-only property." },
|
|
Invalid_left_hand_side_in_for_of_statement: { code: 2487, category: ts.DiagnosticCategory.Error, key: "Invalid_left_hand_side_in_for_of_statement_2487", message: "Invalid left-hand side in 'for...of' statement." },
|
|
Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator: { code: 2488, category: ts.DiagnosticCategory.Error, key: "Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator_2488", message: "Type must have a '[Symbol.iterator]()' method that returns an iterator." },
|
|
An_iterator_must_have_a_next_method: { code: 2489, category: ts.DiagnosticCategory.Error, key: "An_iterator_must_have_a_next_method_2489", message: "An iterator must have a 'next()' method." },
|
|
The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property: { code: 2490, category: ts.DiagnosticCategory.Error, key: "The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property_2490", message: "The type returned by the 'next()' method of an iterator must have a 'value' property." },
|
|
The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: ts.DiagnosticCategory.Error, key: "The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern_2491", message: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." },
|
|
Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: ts.DiagnosticCategory.Error, key: "Cannot_redeclare_identifier_0_in_catch_clause_2492", message: "Cannot redeclare identifier '{0}' in catch clause" },
|
|
Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: ts.DiagnosticCategory.Error, key: "Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2_2493", message: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." },
|
|
Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: ts.DiagnosticCategory.Error, key: "Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher_2494", message: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." },
|
|
Type_0_is_not_an_array_type_or_a_string_type: { code: 2495, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_an_array_type_or_a_string_type_2495", message: "Type '{0}' is not an array type or a string type." },
|
|
The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression: { code: 2496, category: ts.DiagnosticCategory.Error, key: "The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_stand_2496", message: "The 'arguments' object cannot be referenced in an arrow function in ES3 and ES5. Consider using a standard function expression." },
|
|
Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct: { code: 2497, category: ts.DiagnosticCategory.Error, key: "Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct_2497", message: "Module '{0}' resolves to a non-module entity and cannot be imported using this construct." },
|
|
Module_0_uses_export_and_cannot_be_used_with_export_Asterisk: { code: 2498, category: ts.DiagnosticCategory.Error, key: "Module_0_uses_export_and_cannot_be_used_with_export_Asterisk_2498", message: "Module '{0}' uses 'export =' and cannot be used with 'export *'." },
|
|
An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2499, category: ts.DiagnosticCategory.Error, key: "An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments_2499", message: "An interface can only extend an identifier/qualified-name with optional type arguments." },
|
|
A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2500, category: ts.DiagnosticCategory.Error, key: "A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments_2500", message: "A class can only implement an identifier/qualified-name with optional type arguments." },
|
|
A_rest_element_cannot_contain_a_binding_pattern: { code: 2501, category: ts.DiagnosticCategory.Error, key: "A_rest_element_cannot_contain_a_binding_pattern_2501", message: "A rest element cannot contain a binding pattern." },
|
|
_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation: { code: 2502, category: ts.DiagnosticCategory.Error, key: "_0_is_referenced_directly_or_indirectly_in_its_own_type_annotation_2502", message: "'{0}' is referenced directly or indirectly in its own type annotation." },
|
|
Cannot_find_namespace_0: { code: 2503, category: ts.DiagnosticCategory.Error, key: "Cannot_find_namespace_0_2503", message: "Cannot find namespace '{0}'." },
|
|
No_best_common_type_exists_among_yield_expressions: { code: 2504, category: ts.DiagnosticCategory.Error, key: "No_best_common_type_exists_among_yield_expressions_2504", message: "No best common type exists among yield expressions." },
|
|
A_generator_cannot_have_a_void_type_annotation: { code: 2505, category: ts.DiagnosticCategory.Error, key: "A_generator_cannot_have_a_void_type_annotation_2505", message: "A generator cannot have a 'void' type annotation." },
|
|
_0_is_referenced_directly_or_indirectly_in_its_own_base_expression: { code: 2506, category: ts.DiagnosticCategory.Error, key: "_0_is_referenced_directly_or_indirectly_in_its_own_base_expression_2506", message: "'{0}' is referenced directly or indirectly in its own base expression." },
|
|
Type_0_is_not_a_constructor_function_type: { code: 2507, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_a_constructor_function_type_2507", message: "Type '{0}' is not a constructor function type." },
|
|
No_base_constructor_has_the_specified_number_of_type_arguments: { code: 2508, category: ts.DiagnosticCategory.Error, key: "No_base_constructor_has_the_specified_number_of_type_arguments_2508", message: "No base constructor has the specified number of type arguments." },
|
|
Base_constructor_return_type_0_is_not_a_class_or_interface_type: { code: 2509, category: ts.DiagnosticCategory.Error, key: "Base_constructor_return_type_0_is_not_a_class_or_interface_type_2509", message: "Base constructor return type '{0}' is not a class or interface type." },
|
|
Base_constructors_must_all_have_the_same_return_type: { code: 2510, category: ts.DiagnosticCategory.Error, key: "Base_constructors_must_all_have_the_same_return_type_2510", message: "Base constructors must all have the same return type." },
|
|
Cannot_create_an_instance_of_the_abstract_class_0: { code: 2511, category: ts.DiagnosticCategory.Error, key: "Cannot_create_an_instance_of_the_abstract_class_0_2511", message: "Cannot create an instance of the abstract class '{0}'." },
|
|
Overload_signatures_must_all_be_abstract_or_non_abstract: { code: 2512, category: ts.DiagnosticCategory.Error, key: "Overload_signatures_must_all_be_abstract_or_non_abstract_2512", message: "Overload signatures must all be abstract or non-abstract." },
|
|
Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression: { code: 2513, category: ts.DiagnosticCategory.Error, key: "Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression_2513", message: "Abstract method '{0}' in class '{1}' cannot be accessed via super expression." },
|
|
Classes_containing_abstract_methods_must_be_marked_abstract: { code: 2514, category: ts.DiagnosticCategory.Error, key: "Classes_containing_abstract_methods_must_be_marked_abstract_2514", message: "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_2515", message: "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_2516", message: "All declarations of an abstract method must be consecutive." },
|
|
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_2517", message: "Cannot assign an abstract constructor type to a non-abstract constructor type." },
|
|
A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard: { code: 2518, category: ts.DiagnosticCategory.Error, key: "A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard_2518", message: "A 'this'-based type guard is not compatible with a parameter-based type guard." },
|
|
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_2520", message: "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_2521", message: "Expression resolves to variable declaration '{0}' that compiler uses to support async functions." },
|
|
The_arguments_object_cannot_be_referenced_in_an_async_arrow_function_Consider_using_a_standard_async_function_expression: { code: 2522, category: ts.DiagnosticCategory.Error, key: "The_arguments_object_cannot_be_referenced_in_an_async_arrow_function_Consider_using_a_standard_async_2522", message: "The 'arguments' object cannot be referenced in an async arrow function. Consider using a standard async function expression." },
|
|
yield_expressions_cannot_be_used_in_a_parameter_initializer: { code: 2523, category: ts.DiagnosticCategory.Error, key: "yield_expressions_cannot_be_used_in_a_parameter_initializer_2523", message: "'yield' expressions cannot be used in a parameter initializer." },
|
|
await_expressions_cannot_be_used_in_a_parameter_initializer: { code: 2524, category: ts.DiagnosticCategory.Error, key: "await_expressions_cannot_be_used_in_a_parameter_initializer_2524", message: "'await' expressions cannot be used in a parameter initializer." },
|
|
Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value: { code: 2525, category: ts.DiagnosticCategory.Error, key: "Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value_2525", message: "Initializer provides no value for this binding element and the binding element has no default value." },
|
|
A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface: { code: 2526, category: ts.DiagnosticCategory.Error, key: "A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface_2526", message: "A 'this' type is available only in a non-static member of a class or interface." },
|
|
The_inferred_type_of_0_references_an_inaccessible_this_type_A_type_annotation_is_necessary: { code: 2527, category: ts.DiagnosticCategory.Error, key: "The_inferred_type_of_0_references_an_inaccessible_this_type_A_type_annotation_is_necessary_2527", message: "The inferred type of '{0}' references an inaccessible 'this' type. A type annotation is necessary." },
|
|
A_module_cannot_have_multiple_default_exports: { code: 2528, category: ts.DiagnosticCategory.Error, key: "A_module_cannot_have_multiple_default_exports_2528", message: "A module cannot have multiple default exports." },
|
|
Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions: { code: 2529, category: ts.DiagnosticCategory.Error, key: "Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_func_2529", message: "Duplicate identifier '{0}'. Compiler reserves name '{1}' in top level scope of a module containing async functions." },
|
|
Property_0_is_incompatible_with_index_signature: { code: 2530, category: ts.DiagnosticCategory.Error, key: "Property_0_is_incompatible_with_index_signature_2530", message: "Property '{0}' is incompatible with index signature." },
|
|
Object_is_possibly_null: { code: 2531, category: ts.DiagnosticCategory.Error, key: "Object_is_possibly_null_2531", message: "Object is possibly 'null'." },
|
|
Object_is_possibly_undefined: { code: 2532, category: ts.DiagnosticCategory.Error, key: "Object_is_possibly_undefined_2532", message: "Object is possibly 'undefined'." },
|
|
Object_is_possibly_null_or_undefined: { code: 2533, category: ts.DiagnosticCategory.Error, key: "Object_is_possibly_null_or_undefined_2533", message: "Object is possibly 'null' or 'undefined'." },
|
|
A_function_returning_never_cannot_have_a_reachable_end_point: { code: 2534, category: ts.DiagnosticCategory.Error, key: "A_function_returning_never_cannot_have_a_reachable_end_point_2534", message: "A function returning 'never' cannot have a reachable end point." },
|
|
JSX_element_attributes_type_0_may_not_be_a_union_type: { code: 2600, category: ts.DiagnosticCategory.Error, key: "JSX_element_attributes_type_0_may_not_be_a_union_type_2600", message: "JSX element attributes type '{0}' may not be a union type." },
|
|
The_return_type_of_a_JSX_element_constructor_must_return_an_object_type: { code: 2601, category: ts.DiagnosticCategory.Error, key: "The_return_type_of_a_JSX_element_constructor_must_return_an_object_type_2601", message: "The return type of a JSX element constructor must return an object type." },
|
|
JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist: { code: 2602, category: ts.DiagnosticCategory.Error, key: "JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist_2602", message: "JSX element implicitly has type 'any' because the global type 'JSX.Element' does not exist." },
|
|
Property_0_in_type_1_is_not_assignable_to_type_2: { code: 2603, category: ts.DiagnosticCategory.Error, key: "Property_0_in_type_1_is_not_assignable_to_type_2_2603", message: "Property '{0}' in type '{1}' is not assignable to type '{2}'" },
|
|
JSX_element_type_0_does_not_have_any_construct_or_call_signatures: { code: 2604, category: ts.DiagnosticCategory.Error, key: "JSX_element_type_0_does_not_have_any_construct_or_call_signatures_2604", message: "JSX element type '{0}' does not have any construct or call signatures." },
|
|
JSX_element_type_0_is_not_a_constructor_function_for_JSX_elements: { code: 2605, category: ts.DiagnosticCategory.Error, key: "JSX_element_type_0_is_not_a_constructor_function_for_JSX_elements_2605", message: "JSX element type '{0}' is not a constructor function for JSX elements." },
|
|
Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property: { code: 2606, category: ts.DiagnosticCategory.Error, key: "Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property_2606", message: "Property '{0}' of JSX spread attribute is not assignable to target property." },
|
|
JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property: { code: 2607, category: ts.DiagnosticCategory.Error, key: "JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property_2607", message: "JSX element class does not support attributes because it does not have a '{0}' property" },
|
|
The_global_type_JSX_0_may_not_have_more_than_one_property: { code: 2608, category: ts.DiagnosticCategory.Error, key: "The_global_type_JSX_0_may_not_have_more_than_one_property_2608", message: "The global type 'JSX.{0}' may not have more than one property" },
|
|
Cannot_emit_namespaced_JSX_elements_in_React: { code: 2650, category: ts.DiagnosticCategory.Error, key: "Cannot_emit_namespaced_JSX_elements_in_React_2650", message: "Cannot emit namespaced JSX elements in React" },
|
|
A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums: { code: 2651, category: ts.DiagnosticCategory.Error, key: "A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_memb_2651", message: "A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums." },
|
|
Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead: { code: 2652, category: ts.DiagnosticCategory.Error, key: "Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_d_2652", message: "Merged declaration '{0}' cannot include a default export declaration. Consider adding a separate 'export default {0}' declaration instead." },
|
|
Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1: { code: 2653, category: ts.DiagnosticCategory.Error, key: "Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1_2653", message: "Non-abstract class expression does not implement inherited abstract member '{0}' from class '{1}'." },
|
|
Exported_external_package_typings_file_cannot_contain_tripleslash_references_Please_contact_the_package_author_to_update_the_package_definition: { code: 2654, category: ts.DiagnosticCategory.Error, key: "Exported_external_package_typings_file_cannot_contain_tripleslash_references_Please_contact_the_pack_2654", message: "Exported external package typings file cannot contain tripleslash references. Please contact the package author to update the package definition." },
|
|
Exported_external_package_typings_file_0_is_not_a_module_Please_contact_the_package_author_to_update_the_package_definition: { code: 2656, category: ts.DiagnosticCategory.Error, key: "Exported_external_package_typings_file_0_is_not_a_module_Please_contact_the_package_author_to_update_2656", message: "Exported external package typings file '{0}' is not a module. Please contact the package author to update the package definition." },
|
|
JSX_expressions_must_have_one_parent_element: { code: 2657, category: ts.DiagnosticCategory.Error, key: "JSX_expressions_must_have_one_parent_element_2657", message: "JSX expressions must have one parent element" },
|
|
Type_0_provides_no_match_for_the_signature_1: { code: 2658, category: ts.DiagnosticCategory.Error, key: "Type_0_provides_no_match_for_the_signature_1_2658", message: "Type '{0}' provides no match for the signature '{1}'" },
|
|
super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher: { code: 2659, category: ts.DiagnosticCategory.Error, key: "super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_highe_2659", message: "'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher." },
|
|
super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions: { code: 2660, category: ts.DiagnosticCategory.Error, key: "super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions_2660", message: "'super' can only be referenced in members of derived classes or object literal expressions." },
|
|
Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module: { code: 2661, category: ts.DiagnosticCategory.Error, key: "Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module_2661", message: "Cannot export '{0}'. Only local declarations can be exported from a module." },
|
|
Cannot_find_name_0_Did_you_mean_the_static_member_1_0: { code: 2662, category: ts.DiagnosticCategory.Error, key: "Cannot_find_name_0_Did_you_mean_the_static_member_1_0_2662", message: "Cannot find name '{0}'. Did you mean the static member '{1}.{0}'?" },
|
|
Cannot_find_name_0_Did_you_mean_the_instance_member_this_0: { code: 2663, category: ts.DiagnosticCategory.Error, key: "Cannot_find_name_0_Did_you_mean_the_instance_member_this_0_2663", message: "Cannot find name '{0}'. Did you mean the instance member 'this.{0}'?" },
|
|
Invalid_module_name_in_augmentation_module_0_cannot_be_found: { code: 2664, category: ts.DiagnosticCategory.Error, key: "Invalid_module_name_in_augmentation_module_0_cannot_be_found_2664", message: "Invalid module name in augmentation, module '{0}' cannot be found." },
|
|
Exports_and_export_assignments_are_not_permitted_in_module_augmentations: { code: 2666, category: ts.DiagnosticCategory.Error, key: "Exports_and_export_assignments_are_not_permitted_in_module_augmentations_2666", message: "Exports and export assignments are not permitted in module augmentations." },
|
|
Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module: { code: 2667, category: ts.DiagnosticCategory.Error, key: "Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_mod_2667", message: "Imports are not permitted in module augmentations. Consider moving them to the enclosing external module." },
|
|
export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible: { code: 2668, category: ts.DiagnosticCategory.Error, key: "export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always__2668", message: "'export' modifier cannot be applied to ambient modules and module augmentations since they are always visible." },
|
|
Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations: { code: 2669, category: ts.DiagnosticCategory.Error, key: "Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_2669", message: "Augmentations for the global scope can only be directly nested in external modules or ambient module declarations." },
|
|
Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context: { code: 2670, category: ts.DiagnosticCategory.Error, key: "Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambien_2670", message: "Augmentations for the global scope should have 'declare' modifier unless they appear in already ambient context." },
|
|
Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity: { code: 2671, category: ts.DiagnosticCategory.Error, key: "Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity_2671", message: "Cannot augment module '{0}' because it resolves to a non-module entity." },
|
|
Cannot_assign_a_0_constructor_type_to_a_1_constructor_type: { code: 2672, category: ts.DiagnosticCategory.Error, key: "Cannot_assign_a_0_constructor_type_to_a_1_constructor_type_2672", message: "Cannot assign a '{0}' constructor type to a '{1}' constructor type." },
|
|
Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration: { code: 2673, category: ts.DiagnosticCategory.Error, key: "Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration_2673", message: "Constructor of class '{0}' is private and only accessible within the class declaration." },
|
|
Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration: { code: 2674, category: ts.DiagnosticCategory.Error, key: "Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration_2674", message: "Constructor of class '{0}' is protected and only accessible within the class declaration." },
|
|
Cannot_extend_a_class_0_Class_constructor_is_marked_as_private: { code: 2675, category: ts.DiagnosticCategory.Error, key: "Cannot_extend_a_class_0_Class_constructor_is_marked_as_private_2675", message: "Cannot extend a class '{0}'. Class constructor is marked as private." },
|
|
Accessors_must_both_be_abstract_or_non_abstract: { code: 2676, category: ts.DiagnosticCategory.Error, key: "Accessors_must_both_be_abstract_or_non_abstract_2676", message: "Accessors must both be abstract or non-abstract." },
|
|
A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type: { code: 2677, category: ts.DiagnosticCategory.Error, key: "A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type_2677", message: "A type predicate's type must be assignable to its parameter's type." },
|
|
Type_0_is_not_comparable_to_type_1: { code: 2678, category: ts.DiagnosticCategory.Error, key: "Type_0_is_not_comparable_to_type_1_2678", message: "Type '{0}' is not comparable to type '{1}'." },
|
|
A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void: { code: 2679, category: ts.DiagnosticCategory.Error, key: "A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void_2679", message: "A function that is called with the 'new' keyword cannot have a 'this' type that is 'void'." },
|
|
A_this_parameter_must_be_the_first_parameter: { code: 2680, category: ts.DiagnosticCategory.Error, key: "A_this_parameter_must_be_the_first_parameter_2680", message: "A 'this' parameter must be the first parameter." },
|
|
A_constructor_cannot_have_a_this_parameter: { code: 2681, category: ts.DiagnosticCategory.Error, key: "A_constructor_cannot_have_a_this_parameter_2681", message: "A constructor cannot have a 'this' parameter." },
|
|
get_and_set_accessor_must_have_the_same_this_type: { code: 2682, category: ts.DiagnosticCategory.Error, key: "get_and_set_accessor_must_have_the_same_this_type_2682", message: "'get' and 'set' accessor must have the same 'this' type." },
|
|
this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation: { code: 2683, category: ts.DiagnosticCategory.Error, key: "this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_2683", message: "'this' implicitly has type 'any' because it does not have a type annotation." },
|
|
The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1: { code: 2684, category: ts.DiagnosticCategory.Error, key: "The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1_2684", message: "The 'this' context of type '{0}' is not assignable to method's 'this' of type '{1}'." },
|
|
The_this_types_of_each_signature_are_incompatible: { code: 2685, category: ts.DiagnosticCategory.Error, key: "The_this_types_of_each_signature_are_incompatible_2685", message: "The 'this' types of each signature are incompatible." },
|
|
Identifier_0_must_be_imported_from_a_module: { code: 2686, category: ts.DiagnosticCategory.Error, key: "Identifier_0_must_be_imported_from_a_module_2686", message: "Identifier '{0}' must be imported from a module" },
|
|
All_declarations_of_0_must_have_identical_modifiers: { code: 2687, category: ts.DiagnosticCategory.Error, key: "All_declarations_of_0_must_have_identical_modifiers_2687", message: "All declarations of '{0}' must have identical modifiers." },
|
|
Cannot_find_type_definition_file_for_0: { code: 2688, category: ts.DiagnosticCategory.Error, key: "Cannot_find_type_definition_file_for_0_2688", message: "Cannot find type definition file for '{0}'." },
|
|
Cannot_extend_an_interface_0_Did_you_mean_implements: { code: 2689, category: ts.DiagnosticCategory.Error, key: "Cannot_extend_an_interface_0_Did_you_mean_implements_2689", message: "Cannot extend an interface '{0}'. Did you mean 'implements'?" },
|
|
Import_declaration_0_is_using_private_name_1: { code: 4000, category: ts.DiagnosticCategory.Error, key: "Import_declaration_0_is_using_private_name_1_4000", message: "Import declaration '{0}' is using private name '{1}'." },
|
|
Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_exported_class_has_or_is_using_private_name_1_4002", message: "Type parameter '{0}' of exported class has or is using private name '{1}'." },
|
|
Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1_4004", message: "Type parameter '{0}' of exported interface has or is using private name '{1}'." },
|
|
Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4006, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4006", message: "Type parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
|
|
Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4008, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4008", message: "Type parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
|
|
Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4010, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4010", message: "Type parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
|
|
Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4012, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4012", message: "Type parameter '{0}' of public method from exported class has or is using private name '{1}'." },
|
|
Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4014, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4014", message: "Type parameter '{0}' of method from exported interface has or is using private name '{1}'." },
|
|
Type_parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4016, category: ts.DiagnosticCategory.Error, key: "Type_parameter_0_of_exported_function_has_or_is_using_private_name_1_4016", message: "Type parameter '{0}' of exported function has or is using private name '{1}'." },
|
|
Implements_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4019, category: ts.DiagnosticCategory.Error, key: "Implements_clause_of_exported_class_0_has_or_is_using_private_name_1_4019", message: "Implements clause of exported class '{0}' has or is using private name '{1}'." },
|
|
Extends_clause_of_exported_class_0_has_or_is_using_private_name_1: { code: 4020, category: ts.DiagnosticCategory.Error, key: "Extends_clause_of_exported_class_0_has_or_is_using_private_name_1_4020", message: "Extends clause of exported class '{0}' has or is using private name '{1}'." },
|
|
Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1: { code: 4022, category: ts.DiagnosticCategory.Error, key: "Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1_4022", message: "Extends clause of exported interface '{0}' has or is using private name '{1}'." },
|
|
Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4023, category: ts.DiagnosticCategory.Error, key: "Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4023", message: "Exported variable '{0}' has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Exported_variable_0_has_or_is_using_name_1_from_private_module_2: { code: 4024, category: ts.DiagnosticCategory.Error, key: "Exported_variable_0_has_or_is_using_name_1_from_private_module_2_4024", message: "Exported variable '{0}' has or is using name '{1}' from private module '{2}'." },
|
|
Exported_variable_0_has_or_is_using_private_name_1: { code: 4025, category: ts.DiagnosticCategory.Error, key: "Exported_variable_0_has_or_is_using_private_name_1_4025", message: "Exported variable '{0}' has or is using private name '{1}'." },
|
|
Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4026, category: ts.DiagnosticCategory.Error, key: "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot__4026", message: "Public static property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4027, category: ts.DiagnosticCategory.Error, key: "Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4027", message: "Public static property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
|
|
Public_static_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4028, category: ts.DiagnosticCategory.Error, key: "Public_static_property_0_of_exported_class_has_or_is_using_private_name_1_4028", message: "Public static property '{0}' of exported class has or is using private name '{1}'." },
|
|
Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4029, category: ts.DiagnosticCategory.Error, key: "Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_name_4029", message: "Public property '{0}' of exported class has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4030, category: ts.DiagnosticCategory.Error, key: "Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2_4030", message: "Public property '{0}' of exported class has or is using name '{1}' from private module '{2}'." },
|
|
Public_property_0_of_exported_class_has_or_is_using_private_name_1: { code: 4031, category: ts.DiagnosticCategory.Error, key: "Public_property_0_of_exported_class_has_or_is_using_private_name_1_4031", message: "Public property '{0}' of exported class has or is using private name '{1}'." },
|
|
Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4032, category: ts.DiagnosticCategory.Error, key: "Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2_4032", message: "Property '{0}' of exported interface has or is using name '{1}' from private module '{2}'." },
|
|
Property_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4033, category: ts.DiagnosticCategory.Error, key: "Property_0_of_exported_interface_has_or_is_using_private_name_1_4033", message: "Property '{0}' of exported interface has or is using private name '{1}'." },
|
|
Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4034, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_4034", message: "Parameter '{0}' of public static property setter from exported class has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4035, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1_4035", message: "Parameter '{0}' of public static property setter from exported class has or is using private name '{1}'." },
|
|
Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4036, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_4036", message: "Parameter '{0}' of public property setter from exported class has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1: { code: 4037, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1_4037", message: "Parameter '{0}' of public property setter from exported class has or is using private name '{1}'." },
|
|
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4038, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_externa_4038", message: "Return type of public static property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
|
|
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4039, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_4039", message: "Return type of public static property getter from exported class has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4040, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0_4040", message: "Return type of public static property getter from exported class has or is using private name '{0}'." },
|
|
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4041, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_modul_4041", message: "Return type of public property getter from exported class has or is using name '{0}' from external module {1} but cannot be named." },
|
|
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4042, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_4042", message: "Return type of public property getter from exported class has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0: { code: 4043, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0_4043", message: "Return type of public property getter from exported class has or is using private name '{0}'." },
|
|
Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4044, category: ts.DiagnosticCategory.Error, key: "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_mod_4044", message: "Return type of constructor signature from exported interface has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4045, category: ts.DiagnosticCategory.Error, key: "Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0_4045", message: "Return type of constructor signature from exported interface has or is using private name '{0}'." },
|
|
Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4046, category: ts.DiagnosticCategory.Error, key: "Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4046", message: "Return type of call signature from exported interface has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4047, category: ts.DiagnosticCategory.Error, key: "Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0_4047", message: "Return type of call signature from exported interface has or is using private name '{0}'." },
|
|
Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4048, category: ts.DiagnosticCategory.Error, key: "Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4048", message: "Return type of index signature from exported interface has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0: { code: 4049, category: ts.DiagnosticCategory.Error, key: "Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0_4049", message: "Return type of index signature from exported interface has or is using private name '{0}'." },
|
|
Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4050, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module__4050", message: "Return type of public static method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
|
|
Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4051, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4051", message: "Return type of public static method from exported class has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0: { code: 4052, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0_4052", message: "Return type of public static method from exported class has or is using private name '{0}'." },
|
|
Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4053, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_c_4053", message: "Return type of public method from exported class has or is using name '{0}' from external module {1} but cannot be named." },
|
|
Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1: { code: 4054, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1_4054", message: "Return type of public method from exported class has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0: { code: 4055, category: ts.DiagnosticCategory.Error, key: "Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0_4055", message: "Return type of public method from exported class has or is using private name '{0}'." },
|
|
Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1: { code: 4056, category: ts.DiagnosticCategory.Error, key: "Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1_4056", message: "Return type of method from exported interface has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0: { code: 4057, category: ts.DiagnosticCategory.Error, key: "Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0_4057", message: "Return type of method from exported interface has or is using private name '{0}'." },
|
|
Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named: { code: 4058, category: ts.DiagnosticCategory.Error, key: "Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named_4058", message: "Return type of exported function has or is using name '{0}' from external module {1} but cannot be named." },
|
|
Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1: { code: 4059, category: ts.DiagnosticCategory.Error, key: "Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1_4059", message: "Return type of exported function has or is using name '{0}' from private module '{1}'." },
|
|
Return_type_of_exported_function_has_or_is_using_private_name_0: { code: 4060, category: ts.DiagnosticCategory.Error, key: "Return_type_of_exported_function_has_or_is_using_private_name_0_4060", message: "Return type of exported function has or is using private name '{0}'." },
|
|
Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4061, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_can_4061", message: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4062, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2_4062", message: "Parameter '{0}' of constructor from exported class has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1: { code: 4063, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1_4063", message: "Parameter '{0}' of constructor from exported class has or is using private name '{1}'." },
|
|
Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4064, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_mod_4064", message: "Parameter '{0}' of constructor signature from exported interface has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4065, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1_4065", message: "Parameter '{0}' of constructor signature from exported interface has or is using private name '{1}'." },
|
|
Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4066, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4066", message: "Parameter '{0}' of call signature from exported interface has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1: { code: 4067, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1_4067", message: "Parameter '{0}' of call signature from exported interface has or is using private name '{1}'." },
|
|
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4068, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module__4068", message: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4069, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4069", message: "Parameter '{0}' of public static method from exported class has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1: { code: 4070, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1_4070", message: "Parameter '{0}' of public static method from exported class has or is using private name '{1}'." },
|
|
Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4071, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_c_4071", message: "Parameter '{0}' of public method from exported class has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2: { code: 4072, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2_4072", message: "Parameter '{0}' of public method from exported class has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1: { code: 4073, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1_4073", message: "Parameter '{0}' of public method from exported class has or is using private name '{1}'." },
|
|
Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2: { code: 4074, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2_4074", message: "Parameter '{0}' of method from exported interface has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1: { code: 4075, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1_4075", message: "Parameter '{0}' of method from exported interface has or is using private name '{1}'." },
|
|
Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named: { code: 4076, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named_4076", message: "Parameter '{0}' of exported function has or is using name '{1}' from external module {2} but cannot be named." },
|
|
Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2: { code: 4077, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2_4077", message: "Parameter '{0}' of exported function has or is using name '{1}' from private module '{2}'." },
|
|
Parameter_0_of_exported_function_has_or_is_using_private_name_1: { code: 4078, category: ts.DiagnosticCategory.Error, key: "Parameter_0_of_exported_function_has_or_is_using_private_name_1_4078", message: "Parameter '{0}' of exported function has or is using private name '{1}'." },
|
|
Exported_type_alias_0_has_or_is_using_private_name_1: { code: 4081, category: ts.DiagnosticCategory.Error, key: "Exported_type_alias_0_has_or_is_using_private_name_1_4081", message: "Exported type alias '{0}' has or is using private name '{1}'." },
|
|
Default_export_of_the_module_has_or_is_using_private_name_0: { code: 4082, category: ts.DiagnosticCategory.Error, key: "Default_export_of_the_module_has_or_is_using_private_name_0_4082", message: "Default export of the module has or is using private name '{0}'." },
|
|
Conflicting_library_definitions_for_0_found_at_1_and_2_Copy_the_correct_file_to_the_typings_folder_to_resolve_this_conflict: { code: 4090, category: ts.DiagnosticCategory.Message, key: "Conflicting_library_definitions_for_0_found_at_1_and_2_Copy_the_correct_file_to_the_typings_folder_t_4090", message: "Conflicting library definitions for '{0}' found at '{1}' and '{2}'. Copy the correct file to the 'typings' folder to resolve this conflict." },
|
|
The_current_host_does_not_support_the_0_option: { code: 5001, category: ts.DiagnosticCategory.Error, key: "The_current_host_does_not_support_the_0_option_5001", message: "The current host does not support the '{0}' option." },
|
|
Cannot_find_the_common_subdirectory_path_for_the_input_files: { code: 5009, category: ts.DiagnosticCategory.Error, key: "Cannot_find_the_common_subdirectory_path_for_the_input_files_5009", message: "Cannot find the common subdirectory path for the input files." },
|
|
File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: { code: 5010, category: ts.DiagnosticCategory.Error, key: "File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0_5010", message: "File specification cannot end in a recursive directory wildcard ('**'): '{0}'." },
|
|
File_specification_cannot_contain_multiple_recursive_directory_wildcards_Asterisk_Asterisk_Colon_0: { code: 5011, category: ts.DiagnosticCategory.Error, key: "File_specification_cannot_contain_multiple_recursive_directory_wildcards_Asterisk_Asterisk_Colon_0_5011", message: "File specification cannot contain multiple recursive directory wildcards ('**'): '{0}'." },
|
|
Cannot_read_file_0_Colon_1: { code: 5012, category: ts.DiagnosticCategory.Error, key: "Cannot_read_file_0_Colon_1_5012", message: "Cannot read file '{0}': {1}" },
|
|
Unsupported_file_encoding: { code: 5013, category: ts.DiagnosticCategory.Error, key: "Unsupported_file_encoding_5013", message: "Unsupported file encoding." },
|
|
Failed_to_parse_file_0_Colon_1: { code: 5014, category: ts.DiagnosticCategory.Error, key: "Failed_to_parse_file_0_Colon_1_5014", message: "Failed to parse file '{0}': {1}." },
|
|
Unknown_compiler_option_0: { code: 5023, category: ts.DiagnosticCategory.Error, key: "Unknown_compiler_option_0_5023", message: "Unknown compiler option '{0}'." },
|
|
Compiler_option_0_requires_a_value_of_type_1: { code: 5024, category: ts.DiagnosticCategory.Error, key: "Compiler_option_0_requires_a_value_of_type_1_5024", message: "Compiler option '{0}' requires a value of type {1}." },
|
|
Could_not_write_file_0_Colon_1: { code: 5033, category: ts.DiagnosticCategory.Error, key: "Could_not_write_file_0_Colon_1_5033", message: "Could not write file '{0}': {1}" },
|
|
Option_project_cannot_be_mixed_with_source_files_on_a_command_line: { code: 5042, category: ts.DiagnosticCategory.Error, key: "Option_project_cannot_be_mixed_with_source_files_on_a_command_line_5042", message: "Option 'project' cannot be mixed with source files on a command line." },
|
|
Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher: { code: 5047, category: ts.DiagnosticCategory.Error, key: "Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES_5047", message: "Option 'isolatedModules' can only be used when either option '--module' is provided or option 'target' is 'ES2015' or higher." },
|
|
Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: ts.DiagnosticCategory.Error, key: "Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided_5051", message: "Option '{0} can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
|
|
Option_0_cannot_be_specified_without_specifying_option_1: { code: 5052, category: ts.DiagnosticCategory.Error, key: "Option_0_cannot_be_specified_without_specifying_option_1_5052", message: "Option '{0}' cannot be specified without specifying option '{1}'." },
|
|
Option_0_cannot_be_specified_with_option_1: { code: 5053, category: ts.DiagnosticCategory.Error, key: "Option_0_cannot_be_specified_with_option_1_5053", message: "Option '{0}' cannot be specified with option '{1}'." },
|
|
A_tsconfig_json_file_is_already_defined_at_Colon_0: { code: 5054, category: ts.DiagnosticCategory.Error, key: "A_tsconfig_json_file_is_already_defined_at_Colon_0_5054", message: "A 'tsconfig.json' file is already defined at: '{0}'." },
|
|
Cannot_write_file_0_because_it_would_overwrite_input_file: { code: 5055, category: ts.DiagnosticCategory.Error, key: "Cannot_write_file_0_because_it_would_overwrite_input_file_5055", message: "Cannot write file '{0}' because it would overwrite input file." },
|
|
Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files: { code: 5056, category: ts.DiagnosticCategory.Error, key: "Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files_5056", message: "Cannot write file '{0}' because it would be overwritten by multiple input files." },
|
|
Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0: { code: 5057, category: ts.DiagnosticCategory.Error, key: "Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0_5057", message: "Cannot find a tsconfig.json file at the specified directory: '{0}'" },
|
|
The_specified_path_does_not_exist_Colon_0: { code: 5058, category: ts.DiagnosticCategory.Error, key: "The_specified_path_does_not_exist_Colon_0_5058", message: "The specified path does not exist: '{0}'" },
|
|
Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier: { code: 5059, category: ts.DiagnosticCategory.Error, key: "Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier_5059", message: "Invalid value for '--reactNamespace'. '{0}' is not a valid identifier." },
|
|
Option_paths_cannot_be_used_without_specifying_baseUrl_option: { code: 5060, category: ts.DiagnosticCategory.Error, key: "Option_paths_cannot_be_used_without_specifying_baseUrl_option_5060", message: "Option 'paths' cannot be used without specifying '--baseUrl' option." },
|
|
Pattern_0_can_have_at_most_one_Asterisk_character: { code: 5061, category: ts.DiagnosticCategory.Error, key: "Pattern_0_can_have_at_most_one_Asterisk_character_5061", message: "Pattern '{0}' can have at most one '*' character" },
|
|
Substitution_0_in_pattern_1_in_can_have_at_most_one_Asterisk_character: { code: 5062, category: ts.DiagnosticCategory.Error, key: "Substitution_0_in_pattern_1_in_can_have_at_most_one_Asterisk_character_5062", message: "Substitution '{0}' in pattern '{1}' in can have at most one '*' character" },
|
|
Substitutions_for_pattern_0_should_be_an_array: { code: 5063, category: ts.DiagnosticCategory.Error, key: "Substitutions_for_pattern_0_should_be_an_array_5063", message: "Substitutions for pattern '{0}' should be an array." },
|
|
Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2: { code: 5064, category: ts.DiagnosticCategory.Error, key: "Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2_5064", message: "Substitution '{0}' for pattern '{1}' has incorrect type, expected 'string', got '{2}'." },
|
|
File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0: { code: 5065, category: ts.DiagnosticCategory.Error, key: "File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildca_5065", message: "File specification cannot contain a parent directory ('..') that appears after a recursive directory wildcard ('**'): '{0}'." },
|
|
Concatenate_and_emit_output_to_single_file: { code: 6001, category: ts.DiagnosticCategory.Message, key: "Concatenate_and_emit_output_to_single_file_6001", message: "Concatenate and emit output to single file." },
|
|
Generates_corresponding_d_ts_file: { code: 6002, category: ts.DiagnosticCategory.Message, key: "Generates_corresponding_d_ts_file_6002", message: "Generates corresponding '.d.ts' file." },
|
|
Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: ts.DiagnosticCategory.Message, key: "Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations_6003", message: "Specify the location where debugger should locate map files instead of generated locations." },
|
|
Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: { code: 6004, category: ts.DiagnosticCategory.Message, key: "Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations_6004", message: "Specify the location where debugger should locate TypeScript files instead of source locations." },
|
|
Watch_input_files: { code: 6005, category: ts.DiagnosticCategory.Message, key: "Watch_input_files_6005", message: "Watch input files." },
|
|
Redirect_output_structure_to_the_directory: { code: 6006, category: ts.DiagnosticCategory.Message, key: "Redirect_output_structure_to_the_directory_6006", message: "Redirect output structure to the directory." },
|
|
Do_not_erase_const_enum_declarations_in_generated_code: { code: 6007, category: ts.DiagnosticCategory.Message, key: "Do_not_erase_const_enum_declarations_in_generated_code_6007", message: "Do not erase const enum declarations in generated code." },
|
|
Do_not_emit_outputs_if_any_errors_were_reported: { code: 6008, category: ts.DiagnosticCategory.Message, key: "Do_not_emit_outputs_if_any_errors_were_reported_6008", message: "Do not emit outputs if any errors were reported." },
|
|
Do_not_emit_comments_to_output: { code: 6009, category: ts.DiagnosticCategory.Message, key: "Do_not_emit_comments_to_output_6009", message: "Do not emit comments to output." },
|
|
Do_not_emit_outputs: { code: 6010, category: ts.DiagnosticCategory.Message, key: "Do_not_emit_outputs_6010", message: "Do not emit outputs." },
|
|
Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typechecking: { code: 6011, category: ts.DiagnosticCategory.Message, key: "Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typech_6011", message: "Allow default imports from modules with no default export. This does not affect code emit, just typechecking." },
|
|
Skip_type_checking_of_declaration_files: { code: 6012, category: ts.DiagnosticCategory.Message, key: "Skip_type_checking_of_declaration_files_6012", message: "Skip type checking of declaration files." },
|
|
Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES2015: { code: 6015, category: ts.DiagnosticCategory.Message, key: "Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES2015_6015", message: "Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES2015'" },
|
|
Specify_module_code_generation_Colon_commonjs_amd_system_umd_or_es2015: { code: 6016, category: ts.DiagnosticCategory.Message, key: "Specify_module_code_generation_Colon_commonjs_amd_system_umd_or_es2015_6016", message: "Specify module code generation: 'commonjs', 'amd', 'system', 'umd' or 'es2015'" },
|
|
Print_this_message: { code: 6017, category: ts.DiagnosticCategory.Message, key: "Print_this_message_6017", message: "Print this message." },
|
|
Print_the_compiler_s_version: { code: 6019, category: ts.DiagnosticCategory.Message, key: "Print_the_compiler_s_version_6019", message: "Print the compiler's version." },
|
|
Compile_the_project_in_the_given_directory: { code: 6020, category: ts.DiagnosticCategory.Message, key: "Compile_the_project_in_the_given_directory_6020", message: "Compile the project in the given directory." },
|
|
Syntax_Colon_0: { code: 6023, category: ts.DiagnosticCategory.Message, key: "Syntax_Colon_0_6023", message: "Syntax: {0}" },
|
|
options: { code: 6024, category: ts.DiagnosticCategory.Message, key: "options_6024", message: "options" },
|
|
file: { code: 6025, category: ts.DiagnosticCategory.Message, key: "file_6025", message: "file" },
|
|
Examples_Colon_0: { code: 6026, category: ts.DiagnosticCategory.Message, key: "Examples_Colon_0_6026", message: "Examples: {0}" },
|
|
Options_Colon: { code: 6027, category: ts.DiagnosticCategory.Message, key: "Options_Colon_6027", message: "Options:" },
|
|
Version_0: { code: 6029, category: ts.DiagnosticCategory.Message, key: "Version_0_6029", message: "Version {0}" },
|
|
Insert_command_line_options_and_files_from_a_file: { code: 6030, category: ts.DiagnosticCategory.Message, key: "Insert_command_line_options_and_files_from_a_file_6030", message: "Insert command line options and files from a file." },
|
|
File_change_detected_Starting_incremental_compilation: { code: 6032, category: ts.DiagnosticCategory.Message, key: "File_change_detected_Starting_incremental_compilation_6032", message: "File change detected. Starting incremental compilation..." },
|
|
KIND: { code: 6034, category: ts.DiagnosticCategory.Message, key: "KIND_6034", message: "KIND" },
|
|
FILE: { code: 6035, category: ts.DiagnosticCategory.Message, key: "FILE_6035", message: "FILE" },
|
|
VERSION: { code: 6036, category: ts.DiagnosticCategory.Message, key: "VERSION_6036", message: "VERSION" },
|
|
LOCATION: { code: 6037, category: ts.DiagnosticCategory.Message, key: "LOCATION_6037", message: "LOCATION" },
|
|
DIRECTORY: { code: 6038, category: ts.DiagnosticCategory.Message, key: "DIRECTORY_6038", message: "DIRECTORY" },
|
|
Compilation_complete_Watching_for_file_changes: { code: 6042, category: ts.DiagnosticCategory.Message, key: "Compilation_complete_Watching_for_file_changes_6042", message: "Compilation complete. Watching for file changes." },
|
|
Generates_corresponding_map_file: { code: 6043, category: ts.DiagnosticCategory.Message, key: "Generates_corresponding_map_file_6043", message: "Generates corresponding '.map' file." },
|
|
Compiler_option_0_expects_an_argument: { code: 6044, category: ts.DiagnosticCategory.Error, key: "Compiler_option_0_expects_an_argument_6044", message: "Compiler option '{0}' expects an argument." },
|
|
Unterminated_quoted_string_in_response_file_0: { code: 6045, category: ts.DiagnosticCategory.Error, key: "Unterminated_quoted_string_in_response_file_0_6045", message: "Unterminated quoted string in response file '{0}'." },
|
|
Argument_for_0_option_must_be_Colon_1: { code: 6046, category: ts.DiagnosticCategory.Error, key: "Argument_for_0_option_must_be_Colon_1_6046", message: "Argument for '{0}' option must be: {1}" },
|
|
Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1: { code: 6048, category: ts.DiagnosticCategory.Error, key: "Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1_6048", message: "Locale must be of the form <language> or <language>-<territory>. For example '{0}' or '{1}'." },
|
|
Unsupported_locale_0: { code: 6049, category: ts.DiagnosticCategory.Error, key: "Unsupported_locale_0_6049", message: "Unsupported locale '{0}'." },
|
|
Unable_to_open_file_0: { code: 6050, category: ts.DiagnosticCategory.Error, key: "Unable_to_open_file_0_6050", message: "Unable to open file '{0}'." },
|
|
Corrupted_locale_file_0: { code: 6051, category: ts.DiagnosticCategory.Error, key: "Corrupted_locale_file_0_6051", message: "Corrupted locale file {0}." },
|
|
Raise_error_on_expressions_and_declarations_with_an_implied_any_type: { code: 6052, category: ts.DiagnosticCategory.Message, key: "Raise_error_on_expressions_and_declarations_with_an_implied_any_type_6052", message: "Raise error on expressions and declarations with an implied 'any' type." },
|
|
File_0_not_found: { code: 6053, category: ts.DiagnosticCategory.Error, key: "File_0_not_found_6053", message: "File '{0}' not found." },
|
|
File_0_has_unsupported_extension_The_only_supported_extensions_are_1: { code: 6054, category: ts.DiagnosticCategory.Error, key: "File_0_has_unsupported_extension_The_only_supported_extensions_are_1_6054", message: "File '{0}' has unsupported extension. The only supported extensions are {1}." },
|
|
Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures: { code: 6055, category: ts.DiagnosticCategory.Message, key: "Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures_6055", message: "Suppress noImplicitAny errors for indexing objects lacking index signatures." },
|
|
Do_not_emit_declarations_for_code_that_has_an_internal_annotation: { code: 6056, category: ts.DiagnosticCategory.Message, key: "Do_not_emit_declarations_for_code_that_has_an_internal_annotation_6056", message: "Do not emit declarations for code that has an '@internal' annotation." },
|
|
Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir: { code: 6058, category: ts.DiagnosticCategory.Message, key: "Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir_6058", message: "Specify the root directory of input files. Use to control the output directory structure with --outDir." },
|
|
File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files: { code: 6059, category: ts.DiagnosticCategory.Error, key: "File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files_6059", message: "File '{0}' is not under 'rootDir' '{1}'. 'rootDir' is expected to contain all source files." },
|
|
Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix: { code: 6060, category: ts.DiagnosticCategory.Message, key: "Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix_6060", message: "Specify the end of line sequence to be used when emitting files: 'CRLF' (dos) or 'LF' (unix)." },
|
|
NEWLINE: { code: 6061, category: ts.DiagnosticCategory.Message, key: "NEWLINE_6061", message: "NEWLINE" },
|
|
Option_0_can_only_be_specified_in_tsconfig_json_file: { code: 6064, category: ts.DiagnosticCategory.Error, key: "Option_0_can_only_be_specified_in_tsconfig_json_file_6064", message: "Option '{0}' can only be specified in 'tsconfig.json' file." },
|
|
Enables_experimental_support_for_ES7_decorators: { code: 6065, category: ts.DiagnosticCategory.Message, key: "Enables_experimental_support_for_ES7_decorators_6065", message: "Enables experimental support for ES7 decorators." },
|
|
Enables_experimental_support_for_emitting_type_metadata_for_decorators: { code: 6066, category: ts.DiagnosticCategory.Message, key: "Enables_experimental_support_for_emitting_type_metadata_for_decorators_6066", message: "Enables experimental support for emitting type metadata for decorators." },
|
|
Enables_experimental_support_for_ES7_async_functions: { code: 6068, category: ts.DiagnosticCategory.Message, key: "Enables_experimental_support_for_ES7_async_functions_6068", message: "Enables experimental support for ES7 async functions." },
|
|
Specify_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6: { code: 6069, category: ts.DiagnosticCategory.Message, key: "Specify_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6_6069", message: "Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6)." },
|
|
Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file: { code: 6070, category: ts.DiagnosticCategory.Message, key: "Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file_6070", message: "Initializes a TypeScript project and creates a tsconfig.json file." },
|
|
Successfully_created_a_tsconfig_json_file: { code: 6071, category: ts.DiagnosticCategory.Message, key: "Successfully_created_a_tsconfig_json_file_6071", message: "Successfully created a tsconfig.json file." },
|
|
Suppress_excess_property_checks_for_object_literals: { code: 6072, category: ts.DiagnosticCategory.Message, key: "Suppress_excess_property_checks_for_object_literals_6072", message: "Suppress excess property checks for object literals." },
|
|
Stylize_errors_and_messages_using_color_and_context_experimental: { code: 6073, category: ts.DiagnosticCategory.Message, key: "Stylize_errors_and_messages_using_color_and_context_experimental_6073", message: "Stylize errors and messages using color and context. (experimental)" },
|
|
Do_not_report_errors_on_unused_labels: { code: 6074, category: ts.DiagnosticCategory.Message, key: "Do_not_report_errors_on_unused_labels_6074", message: "Do not report errors on unused labels." },
|
|
Report_error_when_not_all_code_paths_in_function_return_a_value: { code: 6075, category: ts.DiagnosticCategory.Message, key: "Report_error_when_not_all_code_paths_in_function_return_a_value_6075", message: "Report error when not all code paths in function return a value." },
|
|
Report_errors_for_fallthrough_cases_in_switch_statement: { code: 6076, category: ts.DiagnosticCategory.Message, key: "Report_errors_for_fallthrough_cases_in_switch_statement_6076", message: "Report errors for fallthrough cases in switch statement." },
|
|
Do_not_report_errors_on_unreachable_code: { code: 6077, category: ts.DiagnosticCategory.Message, key: "Do_not_report_errors_on_unreachable_code_6077", message: "Do not report errors on unreachable code." },
|
|
Disallow_inconsistently_cased_references_to_the_same_file: { code: 6078, category: ts.DiagnosticCategory.Message, key: "Disallow_inconsistently_cased_references_to_the_same_file_6078", message: "Disallow inconsistently-cased references to the same file." },
|
|
Specify_library_files_to_be_included_in_the_compilation_Colon: { code: 6079, category: ts.DiagnosticCategory.Message, key: "Specify_library_files_to_be_included_in_the_compilation_Colon_6079", message: "Specify library files to be included in the compilation: " },
|
|
Specify_JSX_code_generation_Colon_preserve_or_react: { code: 6080, category: ts.DiagnosticCategory.Message, key: "Specify_JSX_code_generation_Colon_preserve_or_react_6080", message: "Specify JSX code generation: 'preserve' or 'react'" },
|
|
Only_amd_and_system_modules_are_supported_alongside_0: { code: 6082, category: ts.DiagnosticCategory.Error, key: "Only_amd_and_system_modules_are_supported_alongside_0_6082", message: "Only 'amd' and 'system' modules are supported alongside --{0}." },
|
|
Base_directory_to_resolve_non_absolute_module_names: { code: 6083, category: ts.DiagnosticCategory.Message, key: "Base_directory_to_resolve_non_absolute_module_names_6083", message: "Base directory to resolve non-absolute module names." },
|
|
Specify_the_object_invoked_for_createElement_and_spread_when_targeting_react_JSX_emit: { code: 6084, category: ts.DiagnosticCategory.Message, key: "Specify_the_object_invoked_for_createElement_and_spread_when_targeting_react_JSX_emit_6084", message: "Specify the object invoked for createElement and __spread when targeting 'react' JSX emit" },
|
|
Enable_tracing_of_the_name_resolution_process: { code: 6085, category: ts.DiagnosticCategory.Message, key: "Enable_tracing_of_the_name_resolution_process_6085", message: "Enable tracing of the name resolution process." },
|
|
Resolving_module_0_from_1: { code: 6086, category: ts.DiagnosticCategory.Message, key: "Resolving_module_0_from_1_6086", message: "======== Resolving module '{0}' from '{1}'. ========" },
|
|
Explicitly_specified_module_resolution_kind_Colon_0: { code: 6087, category: ts.DiagnosticCategory.Message, key: "Explicitly_specified_module_resolution_kind_Colon_0_6087", message: "Explicitly specified module resolution kind: '{0}'." },
|
|
Module_resolution_kind_is_not_specified_using_0: { code: 6088, category: ts.DiagnosticCategory.Message, key: "Module_resolution_kind_is_not_specified_using_0_6088", message: "Module resolution kind is not specified, using '{0}'." },
|
|
Module_name_0_was_successfully_resolved_to_1: { code: 6089, category: ts.DiagnosticCategory.Message, key: "Module_name_0_was_successfully_resolved_to_1_6089", message: "======== Module name '{0}' was successfully resolved to '{1}'. ========" },
|
|
Module_name_0_was_not_resolved: { code: 6090, category: ts.DiagnosticCategory.Message, key: "Module_name_0_was_not_resolved_6090", message: "======== Module name '{0}' was not resolved. ========" },
|
|
paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0: { code: 6091, category: ts.DiagnosticCategory.Message, key: "paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0_6091", message: "'paths' option is specified, looking for a pattern to match module name '{0}'." },
|
|
Module_name_0_matched_pattern_1: { code: 6092, category: ts.DiagnosticCategory.Message, key: "Module_name_0_matched_pattern_1_6092", message: "Module name '{0}', matched pattern '{1}'." },
|
|
Trying_substitution_0_candidate_module_location_Colon_1: { code: 6093, category: ts.DiagnosticCategory.Message, key: "Trying_substitution_0_candidate_module_location_Colon_1_6093", message: "Trying substitution '{0}', candidate module location: '{1}'." },
|
|
Resolving_module_name_0_relative_to_base_url_1_2: { code: 6094, category: ts.DiagnosticCategory.Message, key: "Resolving_module_name_0_relative_to_base_url_1_2_6094", message: "Resolving module name '{0}' relative to base url '{1}' - '{2}'." },
|
|
Loading_module_as_file_Slash_folder_candidate_module_location_0: { code: 6095, category: ts.DiagnosticCategory.Message, key: "Loading_module_as_file_Slash_folder_candidate_module_location_0_6095", message: "Loading module as file / folder, candidate module location '{0}'." },
|
|
File_0_does_not_exist: { code: 6096, category: ts.DiagnosticCategory.Message, key: "File_0_does_not_exist_6096", message: "File '{0}' does not exist." },
|
|
File_0_exist_use_it_as_a_name_resolution_result: { code: 6097, category: ts.DiagnosticCategory.Message, key: "File_0_exist_use_it_as_a_name_resolution_result_6097", message: "File '{0}' exist - use it as a name resolution result." },
|
|
Loading_module_0_from_node_modules_folder: { code: 6098, category: ts.DiagnosticCategory.Message, key: "Loading_module_0_from_node_modules_folder_6098", message: "Loading module '{0}' from 'node_modules' folder." },
|
|
Found_package_json_at_0: { code: 6099, category: ts.DiagnosticCategory.Message, key: "Found_package_json_at_0_6099", message: "Found 'package.json' at '{0}'." },
|
|
package_json_does_not_have_types_field: { code: 6100, category: ts.DiagnosticCategory.Message, key: "package_json_does_not_have_types_field_6100", message: "'package.json' does not have 'types' field." },
|
|
package_json_has_0_field_1_that_references_2: { code: 6101, category: ts.DiagnosticCategory.Message, key: "package_json_has_0_field_1_that_references_2_6101", message: "'package.json' has '{0}' field '{1}' that references '{2}'." },
|
|
Allow_javascript_files_to_be_compiled: { code: 6102, category: ts.DiagnosticCategory.Message, key: "Allow_javascript_files_to_be_compiled_6102", message: "Allow javascript files to be compiled." },
|
|
Option_0_should_have_array_of_strings_as_a_value: { code: 6103, category: ts.DiagnosticCategory.Error, key: "Option_0_should_have_array_of_strings_as_a_value_6103", message: "Option '{0}' should have array of strings as a value." },
|
|
Checking_if_0_is_the_longest_matching_prefix_for_1_2: { code: 6104, category: ts.DiagnosticCategory.Message, key: "Checking_if_0_is_the_longest_matching_prefix_for_1_2_6104", message: "Checking if '{0}' is the longest matching prefix for '{1}' - '{2}'." },
|
|
Expected_type_of_0_field_in_package_json_to_be_string_got_1: { code: 6105, category: ts.DiagnosticCategory.Message, key: "Expected_type_of_0_field_in_package_json_to_be_string_got_1_6105", message: "Expected type of '{0}' field in 'package.json' to be 'string', got '{1}'." },
|
|
baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1: { code: 6106, category: ts.DiagnosticCategory.Message, key: "baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1_6106", message: "'baseUrl' option is set to '{0}', using this value to resolve non-relative module name '{1}'" },
|
|
rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0: { code: 6107, category: ts.DiagnosticCategory.Message, key: "rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0_6107", message: "'rootDirs' option is set, using it to resolve relative module name '{0}'" },
|
|
Longest_matching_prefix_for_0_is_1: { code: 6108, category: ts.DiagnosticCategory.Message, key: "Longest_matching_prefix_for_0_is_1_6108", message: "Longest matching prefix for '{0}' is '{1}'" },
|
|
Loading_0_from_the_root_dir_1_candidate_location_2: { code: 6109, category: ts.DiagnosticCategory.Message, key: "Loading_0_from_the_root_dir_1_candidate_location_2_6109", message: "Loading '{0}' from the root dir '{1}', candidate location '{2}'" },
|
|
Trying_other_entries_in_rootDirs: { code: 6110, category: ts.DiagnosticCategory.Message, key: "Trying_other_entries_in_rootDirs_6110", message: "Trying other entries in 'rootDirs'" },
|
|
Module_resolution_using_rootDirs_has_failed: { code: 6111, category: ts.DiagnosticCategory.Message, key: "Module_resolution_using_rootDirs_has_failed_6111", message: "Module resolution using 'rootDirs' has failed" },
|
|
Do_not_emit_use_strict_directives_in_module_output: { code: 6112, category: ts.DiagnosticCategory.Message, key: "Do_not_emit_use_strict_directives_in_module_output_6112", message: "Do not emit 'use strict' directives in module output." },
|
|
Enable_strict_null_checks: { code: 6113, category: ts.DiagnosticCategory.Message, key: "Enable_strict_null_checks_6113", message: "Enable strict null checks." },
|
|
Unknown_option_excludes_Did_you_mean_exclude: { code: 6114, category: ts.DiagnosticCategory.Error, key: "Unknown_option_excludes_Did_you_mean_exclude_6114", message: "Unknown option 'excludes'. Did you mean 'exclude'?" },
|
|
Raise_error_on_this_expressions_with_an_implied_any_type: { code: 6115, category: ts.DiagnosticCategory.Message, key: "Raise_error_on_this_expressions_with_an_implied_any_type_6115", message: "Raise error on 'this' expressions with an implied 'any' type." },
|
|
Resolving_type_reference_directive_0_containing_file_1_root_directory_2: { code: 6116, category: ts.DiagnosticCategory.Message, key: "Resolving_type_reference_directive_0_containing_file_1_root_directory_2_6116", message: "======== Resolving type reference directive '{0}', containing file '{1}', root directory '{2}'. ========" },
|
|
Resolving_using_primary_search_paths: { code: 6117, category: ts.DiagnosticCategory.Message, key: "Resolving_using_primary_search_paths_6117", message: "Resolving using primary search paths..." },
|
|
Resolving_from_node_modules_folder: { code: 6118, category: ts.DiagnosticCategory.Message, key: "Resolving_from_node_modules_folder_6118", message: "Resolving from node_modules folder..." },
|
|
Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2: { code: 6119, category: ts.DiagnosticCategory.Message, key: "Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2_6119", message: "======== Type reference directive '{0}' was successfully resolved to '{1}', primary: {2}. ========" },
|
|
Type_reference_directive_0_was_not_resolved: { code: 6120, category: ts.DiagnosticCategory.Message, key: "Type_reference_directive_0_was_not_resolved_6120", message: "======== Type reference directive '{0}' was not resolved. ========" },
|
|
Resolving_with_primary_search_path_0: { code: 6121, category: ts.DiagnosticCategory.Message, key: "Resolving_with_primary_search_path_0_6121", message: "Resolving with primary search path '{0}'" },
|
|
Root_directory_cannot_be_determined_skipping_primary_search_paths: { code: 6122, category: ts.DiagnosticCategory.Message, key: "Root_directory_cannot_be_determined_skipping_primary_search_paths_6122", message: "Root directory cannot be determined, skipping primary search paths." },
|
|
Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set: { code: 6123, category: ts.DiagnosticCategory.Message, key: "Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set_6123", message: "======== Resolving type reference directive '{0}', containing file '{1}', root directory not set. ========" },
|
|
Type_declaration_files_to_be_included_in_compilation: { code: 6124, category: ts.DiagnosticCategory.Message, key: "Type_declaration_files_to_be_included_in_compilation_6124", message: "Type declaration files to be included in compilation." },
|
|
Looking_up_in_node_modules_folder_initial_location_0: { code: 6125, category: ts.DiagnosticCategory.Message, key: "Looking_up_in_node_modules_folder_initial_location_0_6125", message: "Looking up in 'node_modules' folder, initial location '{0}'" },
|
|
Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder: { code: 6126, category: ts.DiagnosticCategory.Message, key: "Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_mod_6126", message: "Containing file is not specified and root directory cannot be determined, skipping lookup in 'node_modules' folder." },
|
|
Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1: { code: 6127, category: ts.DiagnosticCategory.Message, key: "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1_6127", message: "======== Resolving type reference directive '{0}', containing file not set, root directory '{1}'. ========" },
|
|
Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set: { code: 6128, category: ts.DiagnosticCategory.Message, key: "Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set_6128", message: "======== Resolving type reference directive '{0}', containing file not set, root directory not set. ========" },
|
|
The_config_file_0_found_doesn_t_contain_any_source_files: { code: 6129, category: ts.DiagnosticCategory.Error, key: "The_config_file_0_found_doesn_t_contain_any_source_files_6129", message: "The config file '{0}' found doesn't contain any source files." },
|
|
Resolving_real_path_for_0_result_1: { code: 6130, category: ts.DiagnosticCategory.Message, key: "Resolving_real_path_for_0_result_1_6130", message: "Resolving real path for '{0}', result '{1}'" },
|
|
Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system: { code: 6131, category: ts.DiagnosticCategory.Error, key: "Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system_6131", message: "Cannot compile modules using option '{0}' unless the '--module' flag is 'amd' or 'system'." },
|
|
File_name_0_has_a_1_extension_stripping_it: { code: 6132, category: ts.DiagnosticCategory.Message, key: "File_name_0_has_a_1_extension_stripping_it_6132", message: "File name '{0}' has a '{1}' extension - stripping it" },
|
|
_0_is_declared_but_never_used: { code: 6133, category: ts.DiagnosticCategory.Error, key: "_0_is_declared_but_never_used_6133", message: "'{0}' is declared but never used." },
|
|
Report_errors_on_unused_locals: { code: 6134, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_locals_6134", message: "Report errors on unused locals." },
|
|
Report_errors_on_unused_parameters: { code: 6135, category: ts.DiagnosticCategory.Message, key: "Report_errors_on_unused_parameters_6135", message: "Report errors on unused parameters." },
|
|
The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files: { code: 6136, category: ts.DiagnosticCategory.Message, key: "The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files_6136", message: "The maximum dependency depth to search under node_modules and load JavaScript files" },
|
|
No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0: { code: 6137, category: ts.DiagnosticCategory.Message, key: "No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0_6137", message: "No types specified in 'package.json' but 'allowJs' is set, so returning 'main' value of '{0}'" },
|
|
Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." },
|
|
Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." },
|
|
Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." },
|
|
new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type: { code: 7009, category: ts.DiagnosticCategory.Error, key: "new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type_7009", message: "'new' expression, whose target lacks a construct signature, implicitly has an 'any' type." },
|
|
_0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type: { code: 7010, category: ts.DiagnosticCategory.Error, key: "_0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type_7010", message: "'{0}', which lacks return-type annotation, implicitly has an '{1}' return type." },
|
|
Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type: { code: 7011, category: ts.DiagnosticCategory.Error, key: "Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type_7011", message: "Function expression, which lacks return-type annotation, implicitly has an '{0}' return type." },
|
|
Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7013, category: ts.DiagnosticCategory.Error, key: "Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7013", message: "Construct signature, which lacks return-type annotation, implicitly has an 'any' return type." },
|
|
Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number: { code: 7015, category: ts.DiagnosticCategory.Error, key: "Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number_7015", message: "Element implicitly has an 'any' type because index expression is not of type 'number'." },
|
|
Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation: { code: 7016, category: ts.DiagnosticCategory.Error, key: "Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation_7016", message: "Property '{0}' implicitly has type 'any', because its 'set' accessor lacks a type annotation." },
|
|
Index_signature_of_object_type_implicitly_has_an_any_type: { code: 7017, category: ts.DiagnosticCategory.Error, key: "Index_signature_of_object_type_implicitly_has_an_any_type_7017", message: "Index signature of object type implicitly has an 'any' type." },
|
|
Object_literal_s_property_0_implicitly_has_an_1_type: { code: 7018, category: ts.DiagnosticCategory.Error, key: "Object_literal_s_property_0_implicitly_has_an_1_type_7018", message: "Object literal's property '{0}' implicitly has an '{1}' type." },
|
|
Rest_parameter_0_implicitly_has_an_any_type: { code: 7019, category: ts.DiagnosticCategory.Error, key: "Rest_parameter_0_implicitly_has_an_any_type_7019", message: "Rest parameter '{0}' implicitly has an 'any[]' type." },
|
|
Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type: { code: 7020, category: ts.DiagnosticCategory.Error, key: "Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type_7020", message: "Call signature, which lacks return-type annotation, implicitly has an 'any' return type." },
|
|
_0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer: { code: 7022, category: ts.DiagnosticCategory.Error, key: "_0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or__7022", message: "'{0}' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer." },
|
|
_0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7023, category: ts.DiagnosticCategory.Error, key: "_0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_reference_7023", message: "'{0}' implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
|
|
Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions: { code: 7024, category: ts.DiagnosticCategory.Error, key: "Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_ref_7024", message: "Function implicitly has return type 'any' because it does not have a return type annotation and is referenced directly or indirectly in one of its return expressions." },
|
|
Generator_implicitly_has_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type: { code: 7025, category: ts.DiagnosticCategory.Error, key: "Generator_implicitly_has_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_typ_7025", message: "Generator implicitly has type '{0}' because it does not yield any values. Consider supplying a return type." },
|
|
JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists: { code: 7026, category: ts.DiagnosticCategory.Error, key: "JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists_7026", message: "JSX element implicitly has type 'any' because no interface 'JSX.{0}' exists" },
|
|
Unreachable_code_detected: { code: 7027, category: ts.DiagnosticCategory.Error, key: "Unreachable_code_detected_7027", message: "Unreachable code detected." },
|
|
Unused_label: { code: 7028, category: ts.DiagnosticCategory.Error, key: "Unused_label_7028", message: "Unused label." },
|
|
Fallthrough_case_in_switch: { code: 7029, category: ts.DiagnosticCategory.Error, key: "Fallthrough_case_in_switch_7029", message: "Fallthrough case in switch." },
|
|
Not_all_code_paths_return_a_value: { code: 7030, category: ts.DiagnosticCategory.Error, key: "Not_all_code_paths_return_a_value_7030", message: "Not all code paths return a value." },
|
|
Binding_element_0_implicitly_has_an_1_type: { code: 7031, category: ts.DiagnosticCategory.Error, key: "Binding_element_0_implicitly_has_an_1_type_7031", message: "Binding element '{0}' implicitly has an '{1}' type." },
|
|
You_cannot_rename_this_element: { code: 8000, category: ts.DiagnosticCategory.Error, key: "You_cannot_rename_this_element_8000", message: "You cannot rename this element." },
|
|
You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library: { code: 8001, category: ts.DiagnosticCategory.Error, key: "You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library_8001", message: "You cannot rename elements that are defined in the standard TypeScript library." },
|
|
import_can_only_be_used_in_a_ts_file: { code: 8002, category: ts.DiagnosticCategory.Error, key: "import_can_only_be_used_in_a_ts_file_8002", message: "'import ... =' can only be used in a .ts file." },
|
|
export_can_only_be_used_in_a_ts_file: { code: 8003, category: ts.DiagnosticCategory.Error, key: "export_can_only_be_used_in_a_ts_file_8003", message: "'export=' can only be used in a .ts file." },
|
|
type_parameter_declarations_can_only_be_used_in_a_ts_file: { code: 8004, category: ts.DiagnosticCategory.Error, key: "type_parameter_declarations_can_only_be_used_in_a_ts_file_8004", message: "'type parameter declarations' can only be used in a .ts file." },
|
|
implements_clauses_can_only_be_used_in_a_ts_file: { code: 8005, category: ts.DiagnosticCategory.Error, key: "implements_clauses_can_only_be_used_in_a_ts_file_8005", message: "'implements clauses' can only be used in a .ts file." },
|
|
interface_declarations_can_only_be_used_in_a_ts_file: { code: 8006, category: ts.DiagnosticCategory.Error, key: "interface_declarations_can_only_be_used_in_a_ts_file_8006", message: "'interface declarations' can only be used in a .ts file." },
|
|
module_declarations_can_only_be_used_in_a_ts_file: { code: 8007, category: ts.DiagnosticCategory.Error, key: "module_declarations_can_only_be_used_in_a_ts_file_8007", message: "'module declarations' can only be used in a .ts file." },
|
|
type_aliases_can_only_be_used_in_a_ts_file: { code: 8008, category: ts.DiagnosticCategory.Error, key: "type_aliases_can_only_be_used_in_a_ts_file_8008", message: "'type aliases' can only be used in a .ts file." },
|
|
_0_can_only_be_used_in_a_ts_file: { code: 8009, category: ts.DiagnosticCategory.Error, key: "_0_can_only_be_used_in_a_ts_file_8009", message: "'{0}' can only be used in a .ts file." },
|
|
types_can_only_be_used_in_a_ts_file: { code: 8010, category: ts.DiagnosticCategory.Error, key: "types_can_only_be_used_in_a_ts_file_8010", message: "'types' can only be used in a .ts file." },
|
|
type_arguments_can_only_be_used_in_a_ts_file: { code: 8011, category: ts.DiagnosticCategory.Error, key: "type_arguments_can_only_be_used_in_a_ts_file_8011", message: "'type arguments' can only be used in a .ts file." },
|
|
parameter_modifiers_can_only_be_used_in_a_ts_file: { code: 8012, category: ts.DiagnosticCategory.Error, key: "parameter_modifiers_can_only_be_used_in_a_ts_file_8012", message: "'parameter modifiers' can only be used in a .ts file." },
|
|
enum_declarations_can_only_be_used_in_a_ts_file: { code: 8015, category: ts.DiagnosticCategory.Error, key: "enum_declarations_can_only_be_used_in_a_ts_file_8015", message: "'enum declarations' can only be used in a .ts file." },
|
|
type_assertion_expressions_can_only_be_used_in_a_ts_file: { code: 8016, category: ts.DiagnosticCategory.Error, key: "type_assertion_expressions_can_only_be_used_in_a_ts_file_8016", message: "'type assertion expressions' can only be used in a .ts file." },
|
|
Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_class_extends_clauses: { code: 9002, category: ts.DiagnosticCategory.Error, key: "Only_identifiers_Slashqualified_names_with_optional_type_arguments_are_currently_supported_in_a_clas_9002", message: "Only identifiers/qualified-names with optional type arguments are currently supported in a class 'extends' clauses." },
|
|
class_expressions_are_not_currently_supported: { code: 9003, category: ts.DiagnosticCategory.Error, key: "class_expressions_are_not_currently_supported_9003", message: "'class' expressions are not currently supported." },
|
|
JSX_attributes_must_only_be_assigned_a_non_empty_expression: { code: 17000, category: ts.DiagnosticCategory.Error, key: "JSX_attributes_must_only_be_assigned_a_non_empty_expression_17000", message: "JSX attributes must only be assigned a non-empty 'expression'." },
|
|
JSX_elements_cannot_have_multiple_attributes_with_the_same_name: { code: 17001, category: ts.DiagnosticCategory.Error, key: "JSX_elements_cannot_have_multiple_attributes_with_the_same_name_17001", message: "JSX elements cannot have multiple attributes with the same name." },
|
|
Expected_corresponding_JSX_closing_tag_for_0: { code: 17002, category: ts.DiagnosticCategory.Error, key: "Expected_corresponding_JSX_closing_tag_for_0_17002", message: "Expected corresponding JSX closing tag for '{0}'." },
|
|
JSX_attribute_expected: { code: 17003, category: ts.DiagnosticCategory.Error, key: "JSX_attribute_expected_17003", message: "JSX attribute expected." },
|
|
Cannot_use_JSX_unless_the_jsx_flag_is_provided: { code: 17004, category: ts.DiagnosticCategory.Error, key: "Cannot_use_JSX_unless_the_jsx_flag_is_provided_17004", message: "Cannot use JSX unless the '--jsx' flag is provided." },
|
|
A_constructor_cannot_contain_a_super_call_when_its_class_extends_null: { code: 17005, category: ts.DiagnosticCategory.Error, key: "A_constructor_cannot_contain_a_super_call_when_its_class_extends_null_17005", message: "A constructor cannot contain a 'super' call when its class extends 'null'" },
|
|
An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: { code: 17006, category: ts.DiagnosticCategory.Error, key: "An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_ex_17006", message: "An unary expression with the '{0}' operator is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses." },
|
|
A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses: { code: 17007, category: ts.DiagnosticCategory.Error, key: "A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Con_17007", message: "A type assertion expression is not allowed in the left-hand side of an exponentiation expression. Consider enclosing the expression in parentheses." },
|
|
JSX_element_0_has_no_corresponding_closing_tag: { code: 17008, category: ts.DiagnosticCategory.Error, key: "JSX_element_0_has_no_corresponding_closing_tag_17008", message: "JSX element '{0}' has no corresponding closing tag." },
|
|
super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class: { code: 17009, category: ts.DiagnosticCategory.Error, key: "super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class_17009", message: "'super' must be called before accessing 'this' in the constructor of a derived class." },
|
|
Unknown_typing_option_0: { code: 17010, category: ts.DiagnosticCategory.Error, key: "Unknown_typing_option_0_17010", message: "Unknown typing option '{0}'." }
|
|
};
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function tokenIsIdentifierOrKeyword(token) {
|
|
return token >= 69;
|
|
}
|
|
ts.tokenIsIdentifierOrKeyword = tokenIsIdentifierOrKeyword;
|
|
var textToToken = {
|
|
"abstract": 115,
|
|
"any": 117,
|
|
"as": 116,
|
|
"boolean": 120,
|
|
"break": 70,
|
|
"case": 71,
|
|
"catch": 72,
|
|
"class": 73,
|
|
"continue": 75,
|
|
"const": 74,
|
|
"constructor": 121,
|
|
"debugger": 76,
|
|
"declare": 122,
|
|
"default": 77,
|
|
"delete": 78,
|
|
"do": 79,
|
|
"else": 80,
|
|
"enum": 81,
|
|
"export": 82,
|
|
"extends": 83,
|
|
"false": 84,
|
|
"finally": 85,
|
|
"for": 86,
|
|
"from": 136,
|
|
"function": 87,
|
|
"get": 123,
|
|
"if": 88,
|
|
"implements": 106,
|
|
"import": 89,
|
|
"in": 90,
|
|
"instanceof": 91,
|
|
"interface": 107,
|
|
"is": 124,
|
|
"let": 108,
|
|
"module": 125,
|
|
"namespace": 126,
|
|
"never": 127,
|
|
"new": 92,
|
|
"null": 93,
|
|
"number": 130,
|
|
"package": 109,
|
|
"private": 110,
|
|
"protected": 111,
|
|
"public": 112,
|
|
"readonly": 128,
|
|
"require": 129,
|
|
"global": 137,
|
|
"return": 94,
|
|
"set": 131,
|
|
"static": 113,
|
|
"string": 132,
|
|
"super": 95,
|
|
"switch": 96,
|
|
"symbol": 133,
|
|
"this": 97,
|
|
"throw": 98,
|
|
"true": 99,
|
|
"try": 100,
|
|
"type": 134,
|
|
"typeof": 101,
|
|
"undefined": 135,
|
|
"var": 102,
|
|
"void": 103,
|
|
"while": 104,
|
|
"with": 105,
|
|
"yield": 114,
|
|
"async": 118,
|
|
"await": 119,
|
|
"of": 138,
|
|
"{": 15,
|
|
"}": 16,
|
|
"(": 17,
|
|
")": 18,
|
|
"[": 19,
|
|
"]": 20,
|
|
".": 21,
|
|
"...": 22,
|
|
";": 23,
|
|
",": 24,
|
|
"<": 25,
|
|
">": 27,
|
|
"<=": 28,
|
|
">=": 29,
|
|
"==": 30,
|
|
"!=": 31,
|
|
"===": 32,
|
|
"!==": 33,
|
|
"=>": 34,
|
|
"+": 35,
|
|
"-": 36,
|
|
"**": 38,
|
|
"*": 37,
|
|
"/": 39,
|
|
"%": 40,
|
|
"++": 41,
|
|
"--": 42,
|
|
"<<": 43,
|
|
"</": 26,
|
|
">>": 44,
|
|
">>>": 45,
|
|
"&": 46,
|
|
"|": 47,
|
|
"^": 48,
|
|
"!": 49,
|
|
"~": 50,
|
|
"&&": 51,
|
|
"||": 52,
|
|
"?": 53,
|
|
":": 54,
|
|
"=": 56,
|
|
"+=": 57,
|
|
"-=": 58,
|
|
"*=": 59,
|
|
"**=": 60,
|
|
"/=": 61,
|
|
"%=": 62,
|
|
"<<=": 63,
|
|
">>=": 64,
|
|
">>>=": 65,
|
|
"&=": 66,
|
|
"|=": 67,
|
|
"^=": 68,
|
|
"@": 55
|
|
};
|
|
var unicodeES3IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1610, 1649, 1747, 1749, 1749, 1765, 1766, 1786, 1788, 1808, 1808, 1810, 1836, 1920, 1957, 2309, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2784, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3294, 3294, 3296, 3297, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3424, 3425, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3805, 3840, 3840, 3904, 3911, 3913, 3946, 3976, 3979, 4096, 4129, 4131, 4135, 4137, 4138, 4176, 4181, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6067, 6176, 6263, 6272, 6312, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8319, 8319, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12346, 12353, 12436, 12445, 12446, 12449, 12538, 12540, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65138, 65140, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
|
|
var unicodeES3IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 543, 546, 563, 592, 685, 688, 696, 699, 705, 720, 721, 736, 740, 750, 750, 768, 846, 864, 866, 890, 890, 902, 902, 904, 906, 908, 908, 910, 929, 931, 974, 976, 983, 986, 1011, 1024, 1153, 1155, 1158, 1164, 1220, 1223, 1224, 1227, 1228, 1232, 1269, 1272, 1273, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1441, 1443, 1465, 1467, 1469, 1471, 1471, 1473, 1474, 1476, 1476, 1488, 1514, 1520, 1522, 1569, 1594, 1600, 1621, 1632, 1641, 1648, 1747, 1749, 1756, 1759, 1768, 1770, 1773, 1776, 1788, 1808, 1836, 1840, 1866, 1920, 1968, 2305, 2307, 2309, 2361, 2364, 2381, 2384, 2388, 2392, 2403, 2406, 2415, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2492, 2494, 2500, 2503, 2504, 2507, 2509, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2562, 2562, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2649, 2652, 2654, 2654, 2662, 2676, 2689, 2691, 2693, 2699, 2701, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2784, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2870, 2873, 2876, 2883, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2913, 2918, 2927, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 2997, 2999, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3031, 3031, 3047, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3134, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3168, 3169, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3262, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3297, 3302, 3311, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3368, 3370, 3385, 3390, 3395, 3398, 3400, 3402, 3405, 3415, 3415, 3424, 3425, 3430, 3439, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3805, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3946, 3953, 3972, 3974, 3979, 3984, 3991, 3993, 4028, 4038, 4038, 4096, 4129, 4131, 4135, 4137, 4138, 4140, 4146, 4150, 4153, 4160, 4169, 4176, 4185, 4256, 4293, 4304, 4342, 4352, 4441, 4447, 4514, 4520, 4601, 4608, 4614, 4616, 4678, 4680, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4742, 4744, 4744, 4746, 4749, 4752, 4782, 4784, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4814, 4816, 4822, 4824, 4846, 4848, 4878, 4880, 4880, 4882, 4885, 4888, 4894, 4896, 4934, 4936, 4954, 4969, 4977, 5024, 5108, 5121, 5740, 5743, 5750, 5761, 5786, 5792, 5866, 6016, 6099, 6112, 6121, 6160, 6169, 6176, 6263, 6272, 6313, 7680, 7835, 7840, 7929, 7936, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8255, 8256, 8319, 8319, 8400, 8412, 8417, 8417, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8497, 8499, 8505, 8544, 8579, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12346, 12353, 12436, 12441, 12442, 12445, 12446, 12449, 12542, 12549, 12588, 12593, 12686, 12704, 12727, 13312, 19893, 19968, 40869, 40960, 42124, 44032, 55203, 63744, 64045, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65056, 65059, 65075, 65076, 65101, 65103, 65136, 65138, 65140, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65381, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
|
|
var unicodeES5IdentifierStart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514, 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774, 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969, 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088, 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384, 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529, 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784, 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634, 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840, 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186, 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016, 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389, 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688, 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141, 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424, 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329, 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538, 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015, 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259, 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520, 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695, 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739, 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285, 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
|
|
var unicodeES5IdentifierPart = [170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736, 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906, 908, 908, 910, 929, 931, 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520, 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788, 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112, 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423, 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482, 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525, 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632, 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693, 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757, 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884, 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929, 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018, 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157, 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216, 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285, 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340, 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424, 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570, 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789, 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895, 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028, 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902, 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099, 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272, 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516, 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783, 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155, 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205, 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417, 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584, 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728, 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335, 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449, 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783, 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072, 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309, 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584, 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741, 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808, 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203, 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140, 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,];
|
|
function lookupInUnicodeMap(code, map) {
|
|
if (code < map[0]) {
|
|
return false;
|
|
}
|
|
var lo = 0;
|
|
var hi = map.length;
|
|
var mid;
|
|
while (lo + 1 < hi) {
|
|
mid = lo + (hi - lo) / 2;
|
|
mid -= mid % 2;
|
|
if (map[mid] <= code && code <= map[mid + 1]) {
|
|
return true;
|
|
}
|
|
if (code < map[mid]) {
|
|
hi = mid;
|
|
}
|
|
else {
|
|
lo = mid + 2;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isUnicodeIdentifierStart(code, languageVersion) {
|
|
return languageVersion >= 1 ?
|
|
lookupInUnicodeMap(code, unicodeES5IdentifierStart) :
|
|
lookupInUnicodeMap(code, unicodeES3IdentifierStart);
|
|
}
|
|
ts.isUnicodeIdentifierStart = isUnicodeIdentifierStart;
|
|
function isUnicodeIdentifierPart(code, languageVersion) {
|
|
return languageVersion >= 1 ?
|
|
lookupInUnicodeMap(code, unicodeES5IdentifierPart) :
|
|
lookupInUnicodeMap(code, unicodeES3IdentifierPart);
|
|
}
|
|
function makeReverseMap(source) {
|
|
var result = [];
|
|
for (var name_4 in source) {
|
|
if (source.hasOwnProperty(name_4)) {
|
|
result[source[name_4]] = name_4;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var tokenStrings = makeReverseMap(textToToken);
|
|
function tokenToString(t) {
|
|
return tokenStrings[t];
|
|
}
|
|
ts.tokenToString = tokenToString;
|
|
function stringToToken(s) {
|
|
return textToToken[s];
|
|
}
|
|
ts.stringToToken = stringToToken;
|
|
function computeLineStarts(text) {
|
|
var result = new Array();
|
|
var pos = 0;
|
|
var lineStart = 0;
|
|
while (pos < text.length) {
|
|
var ch = text.charCodeAt(pos);
|
|
pos++;
|
|
switch (ch) {
|
|
case 13:
|
|
if (text.charCodeAt(pos) === 10) {
|
|
pos++;
|
|
}
|
|
case 10:
|
|
result.push(lineStart);
|
|
lineStart = pos;
|
|
break;
|
|
default:
|
|
if (ch > 127 && isLineBreak(ch)) {
|
|
result.push(lineStart);
|
|
lineStart = pos;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
result.push(lineStart);
|
|
return result;
|
|
}
|
|
ts.computeLineStarts = computeLineStarts;
|
|
function getPositionOfLineAndCharacter(sourceFile, line, character) {
|
|
return computePositionOfLineAndCharacter(getLineStarts(sourceFile), line, character);
|
|
}
|
|
ts.getPositionOfLineAndCharacter = getPositionOfLineAndCharacter;
|
|
function computePositionOfLineAndCharacter(lineStarts, line, character) {
|
|
ts.Debug.assert(line >= 0 && line < lineStarts.length);
|
|
return lineStarts[line] + character;
|
|
}
|
|
ts.computePositionOfLineAndCharacter = computePositionOfLineAndCharacter;
|
|
function getLineStarts(sourceFile) {
|
|
return sourceFile.lineMap || (sourceFile.lineMap = computeLineStarts(sourceFile.text));
|
|
}
|
|
ts.getLineStarts = getLineStarts;
|
|
function computeLineAndCharacterOfPosition(lineStarts, position) {
|
|
var lineNumber = ts.binarySearch(lineStarts, position);
|
|
if (lineNumber < 0) {
|
|
lineNumber = ~lineNumber - 1;
|
|
ts.Debug.assert(lineNumber !== -1, "position cannot precede the beginning of the file");
|
|
}
|
|
return {
|
|
line: lineNumber,
|
|
character: position - lineStarts[lineNumber]
|
|
};
|
|
}
|
|
ts.computeLineAndCharacterOfPosition = computeLineAndCharacterOfPosition;
|
|
function getLineAndCharacterOfPosition(sourceFile, position) {
|
|
return computeLineAndCharacterOfPosition(getLineStarts(sourceFile), position);
|
|
}
|
|
ts.getLineAndCharacterOfPosition = getLineAndCharacterOfPosition;
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
function isWhiteSpace(ch) {
|
|
return isWhiteSpaceSingleLine(ch) || isLineBreak(ch);
|
|
}
|
|
ts.isWhiteSpace = isWhiteSpace;
|
|
function isWhiteSpaceSingleLine(ch) {
|
|
return ch === 32 ||
|
|
ch === 9 ||
|
|
ch === 11 ||
|
|
ch === 12 ||
|
|
ch === 160 ||
|
|
ch === 133 ||
|
|
ch === 5760 ||
|
|
ch >= 8192 && ch <= 8203 ||
|
|
ch === 8239 ||
|
|
ch === 8287 ||
|
|
ch === 12288 ||
|
|
ch === 65279;
|
|
}
|
|
ts.isWhiteSpaceSingleLine = isWhiteSpaceSingleLine;
|
|
function isLineBreak(ch) {
|
|
return ch === 10 ||
|
|
ch === 13 ||
|
|
ch === 8232 ||
|
|
ch === 8233;
|
|
}
|
|
ts.isLineBreak = isLineBreak;
|
|
function isDigit(ch) {
|
|
return ch >= 48 && ch <= 57;
|
|
}
|
|
function isOctalDigit(ch) {
|
|
return ch >= 48 && ch <= 55;
|
|
}
|
|
ts.isOctalDigit = isOctalDigit;
|
|
function couldStartTrivia(text, pos) {
|
|
var ch = text.charCodeAt(pos);
|
|
switch (ch) {
|
|
case 13:
|
|
case 10:
|
|
case 9:
|
|
case 11:
|
|
case 12:
|
|
case 32:
|
|
case 47:
|
|
case 60:
|
|
case 61:
|
|
case 62:
|
|
return true;
|
|
case 35:
|
|
return pos === 0;
|
|
default:
|
|
return ch > 127;
|
|
}
|
|
}
|
|
ts.couldStartTrivia = couldStartTrivia;
|
|
function skipTrivia(text, pos, stopAfterLineBreak, stopAtComments) {
|
|
if (stopAtComments === void 0) { stopAtComments = false; }
|
|
if (!(pos >= 0)) {
|
|
return pos;
|
|
}
|
|
while (true) {
|
|
var ch = text.charCodeAt(pos);
|
|
switch (ch) {
|
|
case 13:
|
|
if (text.charCodeAt(pos + 1) === 10) {
|
|
pos++;
|
|
}
|
|
case 10:
|
|
pos++;
|
|
if (stopAfterLineBreak) {
|
|
return pos;
|
|
}
|
|
continue;
|
|
case 9:
|
|
case 11:
|
|
case 12:
|
|
case 32:
|
|
pos++;
|
|
continue;
|
|
case 47:
|
|
if (stopAtComments) {
|
|
break;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
while (pos < text.length) {
|
|
if (isLineBreak(text.charCodeAt(pos))) {
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
continue;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 42) {
|
|
pos += 2;
|
|
while (pos < text.length) {
|
|
if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
continue;
|
|
}
|
|
break;
|
|
case 60:
|
|
case 61:
|
|
case 62:
|
|
if (isConflictMarkerTrivia(text, pos)) {
|
|
pos = scanConflictMarkerTrivia(text, pos);
|
|
continue;
|
|
}
|
|
break;
|
|
case 35:
|
|
if (pos === 0 && isShebangTrivia(text, pos)) {
|
|
pos = scanShebangTrivia(text, pos);
|
|
continue;
|
|
}
|
|
break;
|
|
default:
|
|
if (ch > 127 && (isWhiteSpace(ch))) {
|
|
pos++;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
return pos;
|
|
}
|
|
}
|
|
ts.skipTrivia = skipTrivia;
|
|
var mergeConflictMarkerLength = "<<<<<<<".length;
|
|
function isConflictMarkerTrivia(text, pos) {
|
|
ts.Debug.assert(pos >= 0);
|
|
if (pos === 0 || isLineBreak(text.charCodeAt(pos - 1))) {
|
|
var ch = text.charCodeAt(pos);
|
|
if ((pos + mergeConflictMarkerLength) < text.length) {
|
|
for (var i = 0, n = mergeConflictMarkerLength; i < n; i++) {
|
|
if (text.charCodeAt(pos + i) !== ch) {
|
|
return false;
|
|
}
|
|
}
|
|
return ch === 61 ||
|
|
text.charCodeAt(pos + mergeConflictMarkerLength) === 32;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function scanConflictMarkerTrivia(text, pos, error) {
|
|
if (error) {
|
|
error(ts.Diagnostics.Merge_conflict_marker_encountered, mergeConflictMarkerLength);
|
|
}
|
|
var ch = text.charCodeAt(pos);
|
|
var len = text.length;
|
|
if (ch === 60 || ch === 62) {
|
|
while (pos < len && !isLineBreak(text.charCodeAt(pos))) {
|
|
pos++;
|
|
}
|
|
}
|
|
else {
|
|
ts.Debug.assert(ch === 61);
|
|
while (pos < len) {
|
|
var ch_1 = text.charCodeAt(pos);
|
|
if (ch_1 === 62 && isConflictMarkerTrivia(text, pos)) {
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
}
|
|
return pos;
|
|
}
|
|
var shebangTriviaRegex = /^#!.*/;
|
|
function isShebangTrivia(text, pos) {
|
|
ts.Debug.assert(pos === 0);
|
|
return shebangTriviaRegex.test(text);
|
|
}
|
|
function scanShebangTrivia(text, pos) {
|
|
var shebang = shebangTriviaRegex.exec(text)[0];
|
|
pos = pos + shebang.length;
|
|
return pos;
|
|
}
|
|
function getCommentRanges(text, pos, trailing) {
|
|
var result;
|
|
var collecting = trailing || pos === 0;
|
|
while (pos < text.length) {
|
|
var ch = text.charCodeAt(pos);
|
|
switch (ch) {
|
|
case 13:
|
|
if (text.charCodeAt(pos + 1) === 10) {
|
|
pos++;
|
|
}
|
|
case 10:
|
|
pos++;
|
|
if (trailing) {
|
|
return result;
|
|
}
|
|
collecting = true;
|
|
if (result && result.length) {
|
|
ts.lastOrUndefined(result).hasTrailingNewLine = true;
|
|
}
|
|
continue;
|
|
case 9:
|
|
case 11:
|
|
case 12:
|
|
case 32:
|
|
pos++;
|
|
continue;
|
|
case 47:
|
|
var nextChar = text.charCodeAt(pos + 1);
|
|
var hasTrailingNewLine = false;
|
|
if (nextChar === 47 || nextChar === 42) {
|
|
var kind = nextChar === 47 ? 2 : 3;
|
|
var startPos = pos;
|
|
pos += 2;
|
|
if (nextChar === 47) {
|
|
while (pos < text.length) {
|
|
if (isLineBreak(text.charCodeAt(pos))) {
|
|
hasTrailingNewLine = true;
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
}
|
|
else {
|
|
while (pos < text.length) {
|
|
if (text.charCodeAt(pos) === 42 && text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
}
|
|
if (collecting) {
|
|
if (!result) {
|
|
result = [];
|
|
}
|
|
result.push({ pos: startPos, end: pos, hasTrailingNewLine: hasTrailingNewLine, kind: kind });
|
|
}
|
|
continue;
|
|
}
|
|
break;
|
|
default:
|
|
if (ch > 127 && (isWhiteSpace(ch))) {
|
|
if (result && result.length && isLineBreak(ch)) {
|
|
ts.lastOrUndefined(result).hasTrailingNewLine = true;
|
|
}
|
|
pos++;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
return result;
|
|
}
|
|
function getLeadingCommentRanges(text, pos) {
|
|
return getCommentRanges(text, pos, false);
|
|
}
|
|
ts.getLeadingCommentRanges = getLeadingCommentRanges;
|
|
function getTrailingCommentRanges(text, pos) {
|
|
return getCommentRanges(text, pos, true);
|
|
}
|
|
ts.getTrailingCommentRanges = getTrailingCommentRanges;
|
|
function getShebang(text) {
|
|
return shebangTriviaRegex.test(text)
|
|
? shebangTriviaRegex.exec(text)[0]
|
|
: undefined;
|
|
}
|
|
ts.getShebang = getShebang;
|
|
function isIdentifierStart(ch, languageVersion) {
|
|
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
|
|
ch === 36 || ch === 95 ||
|
|
ch > 127 && isUnicodeIdentifierStart(ch, languageVersion);
|
|
}
|
|
ts.isIdentifierStart = isIdentifierStart;
|
|
function isIdentifierPart(ch, languageVersion) {
|
|
return ch >= 65 && ch <= 90 || ch >= 97 && ch <= 122 ||
|
|
ch >= 48 && ch <= 57 || ch === 36 || ch === 95 ||
|
|
ch > 127 && isUnicodeIdentifierPart(ch, languageVersion);
|
|
}
|
|
ts.isIdentifierPart = isIdentifierPart;
|
|
function isIdentifier(name, languageVersion) {
|
|
if (!isIdentifierStart(name.charCodeAt(0), languageVersion)) {
|
|
return false;
|
|
}
|
|
for (var i = 1, n = name.length; i < n; i++) {
|
|
if (!isIdentifierPart(name.charCodeAt(i), languageVersion)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
ts.isIdentifier = isIdentifier;
|
|
function createScanner(languageVersion, skipTrivia, languageVariant, text, onError, start, length) {
|
|
if (languageVariant === void 0) { languageVariant = 0; }
|
|
var pos;
|
|
var end;
|
|
var startPos;
|
|
var tokenPos;
|
|
var token;
|
|
var tokenValue;
|
|
var precedingLineBreak;
|
|
var hasExtendedUnicodeEscape;
|
|
var tokenIsUnterminated;
|
|
setText(text, start, length);
|
|
return {
|
|
getStartPos: function () { return startPos; },
|
|
getTextPos: function () { return pos; },
|
|
getToken: function () { return token; },
|
|
getTokenPos: function () { return tokenPos; },
|
|
getTokenText: function () { return text.substring(tokenPos, pos); },
|
|
getTokenValue: function () { return tokenValue; },
|
|
hasExtendedUnicodeEscape: function () { return hasExtendedUnicodeEscape; },
|
|
hasPrecedingLineBreak: function () { return precedingLineBreak; },
|
|
isIdentifier: function () { return token === 69 || token > 105; },
|
|
isReservedWord: function () { return token >= 70 && token <= 105; },
|
|
isUnterminated: function () { return tokenIsUnterminated; },
|
|
reScanGreaterToken: reScanGreaterToken,
|
|
reScanSlashToken: reScanSlashToken,
|
|
reScanTemplateToken: reScanTemplateToken,
|
|
scanJsxIdentifier: scanJsxIdentifier,
|
|
reScanJsxToken: reScanJsxToken,
|
|
scanJsxToken: scanJsxToken,
|
|
scanJSDocToken: scanJSDocToken,
|
|
scan: scan,
|
|
getText: getText,
|
|
setText: setText,
|
|
setScriptTarget: setScriptTarget,
|
|
setLanguageVariant: setLanguageVariant,
|
|
setOnError: setOnError,
|
|
setTextPos: setTextPos,
|
|
tryScan: tryScan,
|
|
lookAhead: lookAhead,
|
|
scanRange: scanRange
|
|
};
|
|
function error(message, length) {
|
|
if (onError) {
|
|
onError(message, length || 0);
|
|
}
|
|
}
|
|
function scanNumber() {
|
|
var start = pos;
|
|
while (isDigit(text.charCodeAt(pos)))
|
|
pos++;
|
|
if (text.charCodeAt(pos) === 46) {
|
|
pos++;
|
|
while (isDigit(text.charCodeAt(pos)))
|
|
pos++;
|
|
}
|
|
var end = pos;
|
|
if (text.charCodeAt(pos) === 69 || text.charCodeAt(pos) === 101) {
|
|
pos++;
|
|
if (text.charCodeAt(pos) === 43 || text.charCodeAt(pos) === 45)
|
|
pos++;
|
|
if (isDigit(text.charCodeAt(pos))) {
|
|
pos++;
|
|
while (isDigit(text.charCodeAt(pos)))
|
|
pos++;
|
|
end = pos;
|
|
}
|
|
else {
|
|
error(ts.Diagnostics.Digit_expected);
|
|
}
|
|
}
|
|
return "" + +(text.substring(start, end));
|
|
}
|
|
function scanOctalDigits() {
|
|
var start = pos;
|
|
while (isOctalDigit(text.charCodeAt(pos))) {
|
|
pos++;
|
|
}
|
|
return +(text.substring(start, pos));
|
|
}
|
|
function scanExactNumberOfHexDigits(count) {
|
|
return scanHexDigits(count, false);
|
|
}
|
|
function scanMinimumNumberOfHexDigits(count) {
|
|
return scanHexDigits(count, true);
|
|
}
|
|
function scanHexDigits(minCount, scanAsManyAsPossible) {
|
|
var digits = 0;
|
|
var value = 0;
|
|
while (digits < minCount || scanAsManyAsPossible) {
|
|
var ch = text.charCodeAt(pos);
|
|
if (ch >= 48 && ch <= 57) {
|
|
value = value * 16 + ch - 48;
|
|
}
|
|
else if (ch >= 65 && ch <= 70) {
|
|
value = value * 16 + ch - 65 + 10;
|
|
}
|
|
else if (ch >= 97 && ch <= 102) {
|
|
value = value * 16 + ch - 97 + 10;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
pos++;
|
|
digits++;
|
|
}
|
|
if (digits < minCount) {
|
|
value = -1;
|
|
}
|
|
return value;
|
|
}
|
|
function scanString() {
|
|
var quote = text.charCodeAt(pos);
|
|
pos++;
|
|
var result = "";
|
|
var start = pos;
|
|
while (true) {
|
|
if (pos >= end) {
|
|
result += text.substring(start, pos);
|
|
tokenIsUnterminated = true;
|
|
error(ts.Diagnostics.Unterminated_string_literal);
|
|
break;
|
|
}
|
|
var ch = text.charCodeAt(pos);
|
|
if (ch === quote) {
|
|
result += text.substring(start, pos);
|
|
pos++;
|
|
break;
|
|
}
|
|
if (ch === 92) {
|
|
result += text.substring(start, pos);
|
|
result += scanEscapeSequence();
|
|
start = pos;
|
|
continue;
|
|
}
|
|
if (isLineBreak(ch)) {
|
|
result += text.substring(start, pos);
|
|
tokenIsUnterminated = true;
|
|
error(ts.Diagnostics.Unterminated_string_literal);
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
return result;
|
|
}
|
|
function scanTemplateAndSetTokenValue() {
|
|
var startedWithBacktick = text.charCodeAt(pos) === 96;
|
|
pos++;
|
|
var start = pos;
|
|
var contents = "";
|
|
var resultingToken;
|
|
while (true) {
|
|
if (pos >= end) {
|
|
contents += text.substring(start, pos);
|
|
tokenIsUnterminated = true;
|
|
error(ts.Diagnostics.Unterminated_template_literal);
|
|
resultingToken = startedWithBacktick ? 11 : 14;
|
|
break;
|
|
}
|
|
var currChar = text.charCodeAt(pos);
|
|
if (currChar === 96) {
|
|
contents += text.substring(start, pos);
|
|
pos++;
|
|
resultingToken = startedWithBacktick ? 11 : 14;
|
|
break;
|
|
}
|
|
if (currChar === 36 && pos + 1 < end && text.charCodeAt(pos + 1) === 123) {
|
|
contents += text.substring(start, pos);
|
|
pos += 2;
|
|
resultingToken = startedWithBacktick ? 12 : 13;
|
|
break;
|
|
}
|
|
if (currChar === 92) {
|
|
contents += text.substring(start, pos);
|
|
contents += scanEscapeSequence();
|
|
start = pos;
|
|
continue;
|
|
}
|
|
if (currChar === 13) {
|
|
contents += text.substring(start, pos);
|
|
pos++;
|
|
if (pos < end && text.charCodeAt(pos) === 10) {
|
|
pos++;
|
|
}
|
|
contents += "\n";
|
|
start = pos;
|
|
continue;
|
|
}
|
|
pos++;
|
|
}
|
|
ts.Debug.assert(resultingToken !== undefined);
|
|
tokenValue = contents;
|
|
return resultingToken;
|
|
}
|
|
function scanEscapeSequence() {
|
|
pos++;
|
|
if (pos >= end) {
|
|
error(ts.Diagnostics.Unexpected_end_of_text);
|
|
return "";
|
|
}
|
|
var ch = text.charCodeAt(pos);
|
|
pos++;
|
|
switch (ch) {
|
|
case 48:
|
|
return "\0";
|
|
case 98:
|
|
return "\b";
|
|
case 116:
|
|
return "\t";
|
|
case 110:
|
|
return "\n";
|
|
case 118:
|
|
return "\v";
|
|
case 102:
|
|
return "\f";
|
|
case 114:
|
|
return "\r";
|
|
case 39:
|
|
return "\'";
|
|
case 34:
|
|
return "\"";
|
|
case 117:
|
|
if (pos < end && text.charCodeAt(pos) === 123) {
|
|
hasExtendedUnicodeEscape = true;
|
|
pos++;
|
|
return scanExtendedUnicodeEscape();
|
|
}
|
|
return scanHexadecimalEscape(4);
|
|
case 120:
|
|
return scanHexadecimalEscape(2);
|
|
case 13:
|
|
if (pos < end && text.charCodeAt(pos) === 10) {
|
|
pos++;
|
|
}
|
|
case 10:
|
|
case 8232:
|
|
case 8233:
|
|
return "";
|
|
default:
|
|
return String.fromCharCode(ch);
|
|
}
|
|
}
|
|
function scanHexadecimalEscape(numDigits) {
|
|
var escapedValue = scanExactNumberOfHexDigits(numDigits);
|
|
if (escapedValue >= 0) {
|
|
return String.fromCharCode(escapedValue);
|
|
}
|
|
else {
|
|
error(ts.Diagnostics.Hexadecimal_digit_expected);
|
|
return "";
|
|
}
|
|
}
|
|
function scanExtendedUnicodeEscape() {
|
|
var escapedValue = scanMinimumNumberOfHexDigits(1);
|
|
var isInvalidExtendedEscape = false;
|
|
if (escapedValue < 0) {
|
|
error(ts.Diagnostics.Hexadecimal_digit_expected);
|
|
isInvalidExtendedEscape = true;
|
|
}
|
|
else if (escapedValue > 0x10FFFF) {
|
|
error(ts.Diagnostics.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive);
|
|
isInvalidExtendedEscape = true;
|
|
}
|
|
if (pos >= end) {
|
|
error(ts.Diagnostics.Unexpected_end_of_text);
|
|
isInvalidExtendedEscape = true;
|
|
}
|
|
else if (text.charCodeAt(pos) === 125) {
|
|
pos++;
|
|
}
|
|
else {
|
|
error(ts.Diagnostics.Unterminated_Unicode_escape_sequence);
|
|
isInvalidExtendedEscape = true;
|
|
}
|
|
if (isInvalidExtendedEscape) {
|
|
return "";
|
|
}
|
|
return utf16EncodeAsString(escapedValue);
|
|
}
|
|
function utf16EncodeAsString(codePoint) {
|
|
ts.Debug.assert(0x0 <= codePoint && codePoint <= 0x10FFFF);
|
|
if (codePoint <= 65535) {
|
|
return String.fromCharCode(codePoint);
|
|
}
|
|
var codeUnit1 = Math.floor((codePoint - 65536) / 1024) + 0xD800;
|
|
var codeUnit2 = ((codePoint - 65536) % 1024) + 0xDC00;
|
|
return String.fromCharCode(codeUnit1, codeUnit2);
|
|
}
|
|
function peekUnicodeEscape() {
|
|
if (pos + 5 < end && text.charCodeAt(pos + 1) === 117) {
|
|
var start_1 = pos;
|
|
pos += 2;
|
|
var value = scanExactNumberOfHexDigits(4);
|
|
pos = start_1;
|
|
return value;
|
|
}
|
|
return -1;
|
|
}
|
|
function scanIdentifierParts() {
|
|
var result = "";
|
|
var start = pos;
|
|
while (pos < end) {
|
|
var ch = text.charCodeAt(pos);
|
|
if (isIdentifierPart(ch, languageVersion)) {
|
|
pos++;
|
|
}
|
|
else if (ch === 92) {
|
|
ch = peekUnicodeEscape();
|
|
if (!(ch >= 0 && isIdentifierPart(ch, languageVersion))) {
|
|
break;
|
|
}
|
|
result += text.substring(start, pos);
|
|
result += String.fromCharCode(ch);
|
|
pos += 6;
|
|
start = pos;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
result += text.substring(start, pos);
|
|
return result;
|
|
}
|
|
function getIdentifierToken() {
|
|
var len = tokenValue.length;
|
|
if (len >= 2 && len <= 11) {
|
|
var ch = tokenValue.charCodeAt(0);
|
|
if (ch >= 97 && ch <= 122 && hasOwnProperty.call(textToToken, tokenValue)) {
|
|
return token = textToToken[tokenValue];
|
|
}
|
|
}
|
|
return token = 69;
|
|
}
|
|
function scanBinaryOrOctalDigits(base) {
|
|
ts.Debug.assert(base !== 2 || base !== 8, "Expected either base 2 or base 8");
|
|
var value = 0;
|
|
var numberOfDigits = 0;
|
|
while (true) {
|
|
var ch = text.charCodeAt(pos);
|
|
var valueOfCh = ch - 48;
|
|
if (!isDigit(ch) || valueOfCh >= base) {
|
|
break;
|
|
}
|
|
value = value * base + valueOfCh;
|
|
pos++;
|
|
numberOfDigits++;
|
|
}
|
|
if (numberOfDigits === 0) {
|
|
return -1;
|
|
}
|
|
return value;
|
|
}
|
|
function scan() {
|
|
startPos = pos;
|
|
hasExtendedUnicodeEscape = false;
|
|
precedingLineBreak = false;
|
|
tokenIsUnterminated = false;
|
|
while (true) {
|
|
tokenPos = pos;
|
|
if (pos >= end) {
|
|
return token = 1;
|
|
}
|
|
var ch = text.charCodeAt(pos);
|
|
if (ch === 35 && pos === 0 && isShebangTrivia(text, pos)) {
|
|
pos = scanShebangTrivia(text, pos);
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
return token = 6;
|
|
}
|
|
}
|
|
switch (ch) {
|
|
case 10:
|
|
case 13:
|
|
precedingLineBreak = true;
|
|
if (skipTrivia) {
|
|
pos++;
|
|
continue;
|
|
}
|
|
else {
|
|
if (ch === 13 && pos + 1 < end && text.charCodeAt(pos + 1) === 10) {
|
|
pos += 2;
|
|
}
|
|
else {
|
|
pos++;
|
|
}
|
|
return token = 4;
|
|
}
|
|
case 9:
|
|
case 11:
|
|
case 12:
|
|
case 32:
|
|
if (skipTrivia) {
|
|
pos++;
|
|
continue;
|
|
}
|
|
else {
|
|
while (pos < end && isWhiteSpaceSingleLine(text.charCodeAt(pos))) {
|
|
pos++;
|
|
}
|
|
return token = 5;
|
|
}
|
|
case 33:
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
if (text.charCodeAt(pos + 2) === 61) {
|
|
return pos += 3, token = 33;
|
|
}
|
|
return pos += 2, token = 31;
|
|
}
|
|
pos++;
|
|
return token = 49;
|
|
case 34:
|
|
case 39:
|
|
tokenValue = scanString();
|
|
return token = 9;
|
|
case 96:
|
|
return token = scanTemplateAndSetTokenValue();
|
|
case 37:
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 62;
|
|
}
|
|
pos++;
|
|
return token = 40;
|
|
case 38:
|
|
if (text.charCodeAt(pos + 1) === 38) {
|
|
return pos += 2, token = 51;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 66;
|
|
}
|
|
pos++;
|
|
return token = 46;
|
|
case 40:
|
|
pos++;
|
|
return token = 17;
|
|
case 41:
|
|
pos++;
|
|
return token = 18;
|
|
case 42:
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 59;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 42) {
|
|
if (text.charCodeAt(pos + 2) === 61) {
|
|
return pos += 3, token = 60;
|
|
}
|
|
return pos += 2, token = 38;
|
|
}
|
|
pos++;
|
|
return token = 37;
|
|
case 43:
|
|
if (text.charCodeAt(pos + 1) === 43) {
|
|
return pos += 2, token = 41;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 57;
|
|
}
|
|
pos++;
|
|
return token = 35;
|
|
case 44:
|
|
pos++;
|
|
return token = 24;
|
|
case 45:
|
|
if (text.charCodeAt(pos + 1) === 45) {
|
|
return pos += 2, token = 42;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 58;
|
|
}
|
|
pos++;
|
|
return token = 36;
|
|
case 46:
|
|
if (isDigit(text.charCodeAt(pos + 1))) {
|
|
tokenValue = scanNumber();
|
|
return token = 8;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 46 && text.charCodeAt(pos + 2) === 46) {
|
|
return pos += 3, token = 22;
|
|
}
|
|
pos++;
|
|
return token = 21;
|
|
case 47:
|
|
if (text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
while (pos < end) {
|
|
if (isLineBreak(text.charCodeAt(pos))) {
|
|
break;
|
|
}
|
|
pos++;
|
|
}
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
return token = 2;
|
|
}
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 42) {
|
|
pos += 2;
|
|
var commentClosed = false;
|
|
while (pos < end) {
|
|
var ch_2 = text.charCodeAt(pos);
|
|
if (ch_2 === 42 && text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
commentClosed = true;
|
|
break;
|
|
}
|
|
if (isLineBreak(ch_2)) {
|
|
precedingLineBreak = true;
|
|
}
|
|
pos++;
|
|
}
|
|
if (!commentClosed) {
|
|
error(ts.Diagnostics.Asterisk_Slash_expected);
|
|
}
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
tokenIsUnterminated = !commentClosed;
|
|
return token = 3;
|
|
}
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 61;
|
|
}
|
|
pos++;
|
|
return token = 39;
|
|
case 48:
|
|
if (pos + 2 < end && (text.charCodeAt(pos + 1) === 88 || text.charCodeAt(pos + 1) === 120)) {
|
|
pos += 2;
|
|
var value = scanMinimumNumberOfHexDigits(1);
|
|
if (value < 0) {
|
|
error(ts.Diagnostics.Hexadecimal_digit_expected);
|
|
value = 0;
|
|
}
|
|
tokenValue = "" + value;
|
|
return token = 8;
|
|
}
|
|
else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 66 || text.charCodeAt(pos + 1) === 98)) {
|
|
pos += 2;
|
|
var value = scanBinaryOrOctalDigits(2);
|
|
if (value < 0) {
|
|
error(ts.Diagnostics.Binary_digit_expected);
|
|
value = 0;
|
|
}
|
|
tokenValue = "" + value;
|
|
return token = 8;
|
|
}
|
|
else if (pos + 2 < end && (text.charCodeAt(pos + 1) === 79 || text.charCodeAt(pos + 1) === 111)) {
|
|
pos += 2;
|
|
var value = scanBinaryOrOctalDigits(8);
|
|
if (value < 0) {
|
|
error(ts.Diagnostics.Octal_digit_expected);
|
|
value = 0;
|
|
}
|
|
tokenValue = "" + value;
|
|
return token = 8;
|
|
}
|
|
if (pos + 1 < end && isOctalDigit(text.charCodeAt(pos + 1))) {
|
|
tokenValue = "" + scanOctalDigits();
|
|
return token = 8;
|
|
}
|
|
case 49:
|
|
case 50:
|
|
case 51:
|
|
case 52:
|
|
case 53:
|
|
case 54:
|
|
case 55:
|
|
case 56:
|
|
case 57:
|
|
tokenValue = scanNumber();
|
|
return token = 8;
|
|
case 58:
|
|
pos++;
|
|
return token = 54;
|
|
case 59:
|
|
pos++;
|
|
return token = 23;
|
|
case 60:
|
|
if (isConflictMarkerTrivia(text, pos)) {
|
|
pos = scanConflictMarkerTrivia(text, pos, error);
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
return token = 7;
|
|
}
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 60) {
|
|
if (text.charCodeAt(pos + 2) === 61) {
|
|
return pos += 3, token = 63;
|
|
}
|
|
return pos += 2, token = 43;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 28;
|
|
}
|
|
if (languageVariant === 1 &&
|
|
text.charCodeAt(pos + 1) === 47 &&
|
|
text.charCodeAt(pos + 2) !== 42) {
|
|
return pos += 2, token = 26;
|
|
}
|
|
pos++;
|
|
return token = 25;
|
|
case 61:
|
|
if (isConflictMarkerTrivia(text, pos)) {
|
|
pos = scanConflictMarkerTrivia(text, pos, error);
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
return token = 7;
|
|
}
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
if (text.charCodeAt(pos + 2) === 61) {
|
|
return pos += 3, token = 32;
|
|
}
|
|
return pos += 2, token = 30;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 62) {
|
|
return pos += 2, token = 34;
|
|
}
|
|
pos++;
|
|
return token = 56;
|
|
case 62:
|
|
if (isConflictMarkerTrivia(text, pos)) {
|
|
pos = scanConflictMarkerTrivia(text, pos, error);
|
|
if (skipTrivia) {
|
|
continue;
|
|
}
|
|
else {
|
|
return token = 7;
|
|
}
|
|
}
|
|
pos++;
|
|
return token = 27;
|
|
case 63:
|
|
pos++;
|
|
return token = 53;
|
|
case 91:
|
|
pos++;
|
|
return token = 19;
|
|
case 93:
|
|
pos++;
|
|
return token = 20;
|
|
case 94:
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 68;
|
|
}
|
|
pos++;
|
|
return token = 48;
|
|
case 123:
|
|
pos++;
|
|
return token = 15;
|
|
case 124:
|
|
if (text.charCodeAt(pos + 1) === 124) {
|
|
return pos += 2, token = 52;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 67;
|
|
}
|
|
pos++;
|
|
return token = 47;
|
|
case 125:
|
|
pos++;
|
|
return token = 16;
|
|
case 126:
|
|
pos++;
|
|
return token = 50;
|
|
case 64:
|
|
pos++;
|
|
return token = 55;
|
|
case 92:
|
|
var cookedChar = peekUnicodeEscape();
|
|
if (cookedChar >= 0 && isIdentifierStart(cookedChar, languageVersion)) {
|
|
pos += 6;
|
|
tokenValue = String.fromCharCode(cookedChar) + scanIdentifierParts();
|
|
return token = getIdentifierToken();
|
|
}
|
|
error(ts.Diagnostics.Invalid_character);
|
|
pos++;
|
|
return token = 0;
|
|
default:
|
|
if (isIdentifierStart(ch, languageVersion)) {
|
|
pos++;
|
|
while (pos < end && isIdentifierPart(ch = text.charCodeAt(pos), languageVersion))
|
|
pos++;
|
|
tokenValue = text.substring(tokenPos, pos);
|
|
if (ch === 92) {
|
|
tokenValue += scanIdentifierParts();
|
|
}
|
|
return token = getIdentifierToken();
|
|
}
|
|
else if (isWhiteSpaceSingleLine(ch)) {
|
|
pos++;
|
|
continue;
|
|
}
|
|
else if (isLineBreak(ch)) {
|
|
precedingLineBreak = true;
|
|
pos++;
|
|
continue;
|
|
}
|
|
error(ts.Diagnostics.Invalid_character);
|
|
pos++;
|
|
return token = 0;
|
|
}
|
|
}
|
|
}
|
|
function reScanGreaterToken() {
|
|
if (token === 27) {
|
|
if (text.charCodeAt(pos) === 62) {
|
|
if (text.charCodeAt(pos + 1) === 62) {
|
|
if (text.charCodeAt(pos + 2) === 61) {
|
|
return pos += 3, token = 65;
|
|
}
|
|
return pos += 2, token = 45;
|
|
}
|
|
if (text.charCodeAt(pos + 1) === 61) {
|
|
return pos += 2, token = 64;
|
|
}
|
|
pos++;
|
|
return token = 44;
|
|
}
|
|
if (text.charCodeAt(pos) === 61) {
|
|
pos++;
|
|
return token = 29;
|
|
}
|
|
}
|
|
return token;
|
|
}
|
|
function reScanSlashToken() {
|
|
if (token === 39 || token === 61) {
|
|
var p = tokenPos + 1;
|
|
var inEscape = false;
|
|
var inCharacterClass = false;
|
|
while (true) {
|
|
if (p >= end) {
|
|
tokenIsUnterminated = true;
|
|
error(ts.Diagnostics.Unterminated_regular_expression_literal);
|
|
break;
|
|
}
|
|
var ch = text.charCodeAt(p);
|
|
if (isLineBreak(ch)) {
|
|
tokenIsUnterminated = true;
|
|
error(ts.Diagnostics.Unterminated_regular_expression_literal);
|
|
break;
|
|
}
|
|
if (inEscape) {
|
|
inEscape = false;
|
|
}
|
|
else if (ch === 47 && !inCharacterClass) {
|
|
p++;
|
|
break;
|
|
}
|
|
else if (ch === 91) {
|
|
inCharacterClass = true;
|
|
}
|
|
else if (ch === 92) {
|
|
inEscape = true;
|
|
}
|
|
else if (ch === 93) {
|
|
inCharacterClass = false;
|
|
}
|
|
p++;
|
|
}
|
|
while (p < end && isIdentifierPart(text.charCodeAt(p), languageVersion)) {
|
|
p++;
|
|
}
|
|
pos = p;
|
|
tokenValue = text.substring(tokenPos, pos);
|
|
token = 10;
|
|
}
|
|
return token;
|
|
}
|
|
function reScanTemplateToken() {
|
|
ts.Debug.assert(token === 16, "'reScanTemplateToken' should only be called on a '}'");
|
|
pos = tokenPos;
|
|
return token = scanTemplateAndSetTokenValue();
|
|
}
|
|
function reScanJsxToken() {
|
|
pos = tokenPos = startPos;
|
|
return token = scanJsxToken();
|
|
}
|
|
function scanJsxToken() {
|
|
startPos = tokenPos = pos;
|
|
if (pos >= end) {
|
|
return token = 1;
|
|
}
|
|
var char = text.charCodeAt(pos);
|
|
if (char === 60) {
|
|
if (text.charCodeAt(pos + 1) === 47) {
|
|
pos += 2;
|
|
return token = 26;
|
|
}
|
|
pos++;
|
|
return token = 25;
|
|
}
|
|
if (char === 123) {
|
|
pos++;
|
|
return token = 15;
|
|
}
|
|
while (pos < end) {
|
|
pos++;
|
|
char = text.charCodeAt(pos);
|
|
if ((char === 123) || (char === 60)) {
|
|
break;
|
|
}
|
|
}
|
|
return token = 244;
|
|
}
|
|
function scanJsxIdentifier() {
|
|
if (tokenIsIdentifierOrKeyword(token)) {
|
|
var firstCharPosition = pos;
|
|
while (pos < end) {
|
|
var ch = text.charCodeAt(pos);
|
|
if (ch === 45 || ((firstCharPosition === pos) ? isIdentifierStart(ch, languageVersion) : isIdentifierPart(ch, languageVersion))) {
|
|
pos++;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
tokenValue += text.substr(firstCharPosition, pos - firstCharPosition);
|
|
}
|
|
return token;
|
|
}
|
|
function scanJSDocToken() {
|
|
if (pos >= end) {
|
|
return token = 1;
|
|
}
|
|
startPos = pos;
|
|
var ch = text.charCodeAt(pos);
|
|
while (pos < end) {
|
|
ch = text.charCodeAt(pos);
|
|
if (isWhiteSpaceSingleLine(ch)) {
|
|
pos++;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
tokenPos = pos;
|
|
switch (ch) {
|
|
case 64:
|
|
return pos += 1, token = 55;
|
|
case 10:
|
|
case 13:
|
|
return pos += 1, token = 4;
|
|
case 42:
|
|
return pos += 1, token = 37;
|
|
case 123:
|
|
return pos += 1, token = 15;
|
|
case 125:
|
|
return pos += 1, token = 16;
|
|
case 91:
|
|
return pos += 1, token = 19;
|
|
case 93:
|
|
return pos += 1, token = 20;
|
|
case 61:
|
|
return pos += 1, token = 56;
|
|
case 44:
|
|
return pos += 1, token = 24;
|
|
}
|
|
if (isIdentifierStart(ch, 2)) {
|
|
pos++;
|
|
while (isIdentifierPart(text.charCodeAt(pos), 2) && pos < end) {
|
|
pos++;
|
|
}
|
|
return token = 69;
|
|
}
|
|
else {
|
|
return pos += 1, token = 0;
|
|
}
|
|
}
|
|
function speculationHelper(callback, isLookahead) {
|
|
var savePos = pos;
|
|
var saveStartPos = startPos;
|
|
var saveTokenPos = tokenPos;
|
|
var saveToken = token;
|
|
var saveTokenValue = tokenValue;
|
|
var savePrecedingLineBreak = precedingLineBreak;
|
|
var result = callback();
|
|
if (!result || isLookahead) {
|
|
pos = savePos;
|
|
startPos = saveStartPos;
|
|
tokenPos = saveTokenPos;
|
|
token = saveToken;
|
|
tokenValue = saveTokenValue;
|
|
precedingLineBreak = savePrecedingLineBreak;
|
|
}
|
|
return result;
|
|
}
|
|
function scanRange(start, length, callback) {
|
|
var saveEnd = end;
|
|
var savePos = pos;
|
|
var saveStartPos = startPos;
|
|
var saveTokenPos = tokenPos;
|
|
var saveToken = token;
|
|
var savePrecedingLineBreak = precedingLineBreak;
|
|
var saveTokenValue = tokenValue;
|
|
var saveHasExtendedUnicodeEscape = hasExtendedUnicodeEscape;
|
|
var saveTokenIsUnterminated = tokenIsUnterminated;
|
|
setText(text, start, length);
|
|
var result = callback();
|
|
end = saveEnd;
|
|
pos = savePos;
|
|
startPos = saveStartPos;
|
|
tokenPos = saveTokenPos;
|
|
token = saveToken;
|
|
precedingLineBreak = savePrecedingLineBreak;
|
|
tokenValue = saveTokenValue;
|
|
hasExtendedUnicodeEscape = saveHasExtendedUnicodeEscape;
|
|
tokenIsUnterminated = saveTokenIsUnterminated;
|
|
return result;
|
|
}
|
|
function lookAhead(callback) {
|
|
return speculationHelper(callback, true);
|
|
}
|
|
function tryScan(callback) {
|
|
return speculationHelper(callback, false);
|
|
}
|
|
function getText() {
|
|
return text;
|
|
}
|
|
function setText(newText, start, length) {
|
|
text = newText || "";
|
|
end = length === undefined ? text.length : start + length;
|
|
setTextPos(start || 0);
|
|
}
|
|
function setOnError(errorCallback) {
|
|
onError = errorCallback;
|
|
}
|
|
function setScriptTarget(scriptTarget) {
|
|
languageVersion = scriptTarget;
|
|
}
|
|
function setLanguageVariant(variant) {
|
|
languageVariant = variant;
|
|
}
|
|
function setTextPos(textPos) {
|
|
ts.Debug.assert(textPos >= 0);
|
|
pos = textPos;
|
|
startPos = textPos;
|
|
tokenPos = textPos;
|
|
token = 0;
|
|
precedingLineBreak = false;
|
|
tokenValue = undefined;
|
|
hasExtendedUnicodeEscape = false;
|
|
tokenIsUnterminated = false;
|
|
}
|
|
}
|
|
ts.createScanner = createScanner;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function getDeclarationOfKind(symbol, kind) {
|
|
var declarations = symbol.declarations;
|
|
if (declarations) {
|
|
for (var _i = 0, declarations_1 = declarations; _i < declarations_1.length; _i++) {
|
|
var declaration = declarations_1[_i];
|
|
if (declaration.kind === kind) {
|
|
return declaration;
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getDeclarationOfKind = getDeclarationOfKind;
|
|
var stringWriters = [];
|
|
function getSingleLineStringWriter() {
|
|
if (stringWriters.length === 0) {
|
|
var str_1 = "";
|
|
var writeText = function (text) { return str_1 += text; };
|
|
return {
|
|
string: function () { return str_1; },
|
|
writeKeyword: writeText,
|
|
writeOperator: writeText,
|
|
writePunctuation: writeText,
|
|
writeSpace: writeText,
|
|
writeStringLiteral: writeText,
|
|
writeParameter: writeText,
|
|
writeSymbol: writeText,
|
|
writeLine: function () { return str_1 += " "; },
|
|
increaseIndent: function () { },
|
|
decreaseIndent: function () { },
|
|
clear: function () { return str_1 = ""; },
|
|
trackSymbol: function () { },
|
|
reportInaccessibleThisError: function () { }
|
|
};
|
|
}
|
|
return stringWriters.pop();
|
|
}
|
|
ts.getSingleLineStringWriter = getSingleLineStringWriter;
|
|
function releaseStringWriter(writer) {
|
|
writer.clear();
|
|
stringWriters.push(writer);
|
|
}
|
|
ts.releaseStringWriter = releaseStringWriter;
|
|
function getFullWidth(node) {
|
|
return node.end - node.pos;
|
|
}
|
|
ts.getFullWidth = getFullWidth;
|
|
function mapIsEqualTo(map1, map2) {
|
|
if (!map1 || !map2) {
|
|
return map1 === map2;
|
|
}
|
|
return containsAll(map1, map2) && containsAll(map2, map1);
|
|
}
|
|
ts.mapIsEqualTo = mapIsEqualTo;
|
|
function containsAll(map, other) {
|
|
for (var key in map) {
|
|
if (!ts.hasProperty(map, key)) {
|
|
continue;
|
|
}
|
|
if (!ts.hasProperty(other, key) || map[key] !== other[key]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function arrayIsEqualTo(array1, array2, equaler) {
|
|
if (!array1 || !array2) {
|
|
return array1 === array2;
|
|
}
|
|
if (array1.length !== array2.length) {
|
|
return false;
|
|
}
|
|
for (var i = 0; i < array1.length; i++) {
|
|
var equals = equaler ? equaler(array1[i], array2[i]) : array1[i] === array2[i];
|
|
if (!equals) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
ts.arrayIsEqualTo = arrayIsEqualTo;
|
|
function hasResolvedModule(sourceFile, moduleNameText) {
|
|
return sourceFile.resolvedModules && ts.hasProperty(sourceFile.resolvedModules, moduleNameText);
|
|
}
|
|
ts.hasResolvedModule = hasResolvedModule;
|
|
function getResolvedModule(sourceFile, moduleNameText) {
|
|
return hasResolvedModule(sourceFile, moduleNameText) ? sourceFile.resolvedModules[moduleNameText] : undefined;
|
|
}
|
|
ts.getResolvedModule = getResolvedModule;
|
|
function setResolvedModule(sourceFile, moduleNameText, resolvedModule) {
|
|
if (!sourceFile.resolvedModules) {
|
|
sourceFile.resolvedModules = {};
|
|
}
|
|
sourceFile.resolvedModules[moduleNameText] = resolvedModule;
|
|
}
|
|
ts.setResolvedModule = setResolvedModule;
|
|
function setResolvedTypeReferenceDirective(sourceFile, typeReferenceDirectiveName, resolvedTypeReferenceDirective) {
|
|
if (!sourceFile.resolvedTypeReferenceDirectiveNames) {
|
|
sourceFile.resolvedTypeReferenceDirectiveNames = {};
|
|
}
|
|
sourceFile.resolvedTypeReferenceDirectiveNames[typeReferenceDirectiveName] = resolvedTypeReferenceDirective;
|
|
}
|
|
ts.setResolvedTypeReferenceDirective = setResolvedTypeReferenceDirective;
|
|
function moduleResolutionIsEqualTo(oldResolution, newResolution) {
|
|
return oldResolution.resolvedFileName === newResolution.resolvedFileName && oldResolution.isExternalLibraryImport === newResolution.isExternalLibraryImport;
|
|
}
|
|
ts.moduleResolutionIsEqualTo = moduleResolutionIsEqualTo;
|
|
function typeDirectiveIsEqualTo(oldResolution, newResolution) {
|
|
return oldResolution.resolvedFileName === newResolution.resolvedFileName && oldResolution.primary === newResolution.primary;
|
|
}
|
|
ts.typeDirectiveIsEqualTo = typeDirectiveIsEqualTo;
|
|
function hasChangesInResolutions(names, newResolutions, oldResolutions, comparer) {
|
|
if (names.length !== newResolutions.length) {
|
|
return false;
|
|
}
|
|
for (var i = 0; i < names.length; i++) {
|
|
var newResolution = newResolutions[i];
|
|
var oldResolution = oldResolutions && ts.hasProperty(oldResolutions, names[i]) ? oldResolutions[names[i]] : undefined;
|
|
var changed = oldResolution
|
|
? !newResolution || !comparer(oldResolution, newResolution)
|
|
: newResolution;
|
|
if (changed) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.hasChangesInResolutions = hasChangesInResolutions;
|
|
function containsParseError(node) {
|
|
aggregateChildData(node);
|
|
return (node.flags & 268435456) !== 0;
|
|
}
|
|
ts.containsParseError = containsParseError;
|
|
function aggregateChildData(node) {
|
|
if (!(node.flags & 536870912)) {
|
|
var thisNodeOrAnySubNodesHasError = ((node.flags & 67108864) !== 0) ||
|
|
ts.forEachChild(node, containsParseError);
|
|
if (thisNodeOrAnySubNodesHasError) {
|
|
node.flags |= 268435456;
|
|
}
|
|
node.flags |= 536870912;
|
|
}
|
|
}
|
|
function getSourceFileOfNode(node) {
|
|
while (node && node.kind !== 256) {
|
|
node = node.parent;
|
|
}
|
|
return node;
|
|
}
|
|
ts.getSourceFileOfNode = getSourceFileOfNode;
|
|
function isStatementWithLocals(node) {
|
|
switch (node.kind) {
|
|
case 199:
|
|
case 227:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isStatementWithLocals = isStatementWithLocals;
|
|
function getStartPositionOfLine(line, sourceFile) {
|
|
ts.Debug.assert(line >= 0);
|
|
return ts.getLineStarts(sourceFile)[line];
|
|
}
|
|
ts.getStartPositionOfLine = getStartPositionOfLine;
|
|
function nodePosToString(node) {
|
|
var file = getSourceFileOfNode(node);
|
|
var loc = ts.getLineAndCharacterOfPosition(file, node.pos);
|
|
return file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + ")";
|
|
}
|
|
ts.nodePosToString = nodePosToString;
|
|
function getStartPosOfNode(node) {
|
|
return node.pos;
|
|
}
|
|
ts.getStartPosOfNode = getStartPosOfNode;
|
|
function getEndLinePosition(line, sourceFile) {
|
|
ts.Debug.assert(line >= 0);
|
|
var lineStarts = ts.getLineStarts(sourceFile);
|
|
var lineIndex = line;
|
|
var sourceText = sourceFile.text;
|
|
if (lineIndex + 1 === lineStarts.length) {
|
|
return sourceText.length - 1;
|
|
}
|
|
else {
|
|
var start = lineStarts[lineIndex];
|
|
var pos = lineStarts[lineIndex + 1] - 1;
|
|
ts.Debug.assert(ts.isLineBreak(sourceText.charCodeAt(pos)));
|
|
while (start <= pos && ts.isLineBreak(sourceText.charCodeAt(pos))) {
|
|
pos--;
|
|
}
|
|
return pos;
|
|
}
|
|
}
|
|
ts.getEndLinePosition = getEndLinePosition;
|
|
function nodeIsMissing(node) {
|
|
if (!node) {
|
|
return true;
|
|
}
|
|
return node.pos === node.end && node.pos >= 0 && node.kind !== 1;
|
|
}
|
|
ts.nodeIsMissing = nodeIsMissing;
|
|
function nodeIsPresent(node) {
|
|
return !nodeIsMissing(node);
|
|
}
|
|
ts.nodeIsPresent = nodeIsPresent;
|
|
function getTokenPosOfNode(node, sourceFile, includeJsDocComment) {
|
|
if (nodeIsMissing(node)) {
|
|
return node.pos;
|
|
}
|
|
if (isJSDocNode(node)) {
|
|
return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos, false, true);
|
|
}
|
|
if (includeJsDocComment && node.jsDocComments && node.jsDocComments.length > 0) {
|
|
return getTokenPosOfNode(node.jsDocComments[0]);
|
|
}
|
|
if (node.kind === 282 && node._children.length > 0) {
|
|
return getTokenPosOfNode(node._children[0], sourceFile, includeJsDocComment);
|
|
}
|
|
return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.pos);
|
|
}
|
|
ts.getTokenPosOfNode = getTokenPosOfNode;
|
|
function isJSDocNode(node) {
|
|
return node.kind >= 257 && node.kind <= 281;
|
|
}
|
|
ts.isJSDocNode = isJSDocNode;
|
|
function getNonDecoratorTokenPosOfNode(node, sourceFile) {
|
|
if (nodeIsMissing(node) || !node.decorators) {
|
|
return getTokenPosOfNode(node, sourceFile);
|
|
}
|
|
return ts.skipTrivia((sourceFile || getSourceFileOfNode(node)).text, node.decorators.end);
|
|
}
|
|
ts.getNonDecoratorTokenPosOfNode = getNonDecoratorTokenPosOfNode;
|
|
function getSourceTextOfNodeFromSourceFile(sourceFile, node, includeTrivia) {
|
|
if (includeTrivia === void 0) { includeTrivia = false; }
|
|
if (nodeIsMissing(node)) {
|
|
return "";
|
|
}
|
|
var text = sourceFile.text;
|
|
return text.substring(includeTrivia ? node.pos : ts.skipTrivia(text, node.pos), node.end);
|
|
}
|
|
ts.getSourceTextOfNodeFromSourceFile = getSourceTextOfNodeFromSourceFile;
|
|
function getTextOfNodeFromSourceText(sourceText, node) {
|
|
if (nodeIsMissing(node)) {
|
|
return "";
|
|
}
|
|
return sourceText.substring(ts.skipTrivia(sourceText, node.pos), node.end);
|
|
}
|
|
ts.getTextOfNodeFromSourceText = getTextOfNodeFromSourceText;
|
|
function getTextOfNode(node, includeTrivia) {
|
|
if (includeTrivia === void 0) { includeTrivia = false; }
|
|
return getSourceTextOfNodeFromSourceFile(getSourceFileOfNode(node), node, includeTrivia);
|
|
}
|
|
ts.getTextOfNode = getTextOfNode;
|
|
function escapeIdentifier(identifier) {
|
|
return identifier.length >= 2 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 ? "_" + identifier : identifier;
|
|
}
|
|
ts.escapeIdentifier = escapeIdentifier;
|
|
function unescapeIdentifier(identifier) {
|
|
return identifier.length >= 3 && identifier.charCodeAt(0) === 95 && identifier.charCodeAt(1) === 95 && identifier.charCodeAt(2) === 95 ? identifier.substr(1) : identifier;
|
|
}
|
|
ts.unescapeIdentifier = unescapeIdentifier;
|
|
function makeIdentifierFromModuleName(moduleName) {
|
|
return ts.getBaseFileName(moduleName).replace(/^(\d)/, "_$1").replace(/\W/g, "_");
|
|
}
|
|
ts.makeIdentifierFromModuleName = makeIdentifierFromModuleName;
|
|
function isBlockOrCatchScoped(declaration) {
|
|
return (getCombinedNodeFlags(declaration) & 3072) !== 0 ||
|
|
isCatchClauseVariableDeclaration(declaration);
|
|
}
|
|
ts.isBlockOrCatchScoped = isBlockOrCatchScoped;
|
|
function isAmbientModule(node) {
|
|
return node && node.kind === 225 &&
|
|
(node.name.kind === 9 || isGlobalScopeAugmentation(node));
|
|
}
|
|
ts.isAmbientModule = isAmbientModule;
|
|
function isShorthandAmbientModule(node) {
|
|
return node.kind === 225 && (!node.body);
|
|
}
|
|
ts.isShorthandAmbientModule = isShorthandAmbientModule;
|
|
function isBlockScopedContainerTopLevel(node) {
|
|
return node.kind === 256 ||
|
|
node.kind === 225 ||
|
|
isFunctionLike(node) ||
|
|
isFunctionBlock(node);
|
|
}
|
|
ts.isBlockScopedContainerTopLevel = isBlockScopedContainerTopLevel;
|
|
function isGlobalScopeAugmentation(module) {
|
|
return !!(module.flags & 131072);
|
|
}
|
|
ts.isGlobalScopeAugmentation = isGlobalScopeAugmentation;
|
|
function isExternalModuleAugmentation(node) {
|
|
if (!node || !isAmbientModule(node)) {
|
|
return false;
|
|
}
|
|
switch (node.parent.kind) {
|
|
case 256:
|
|
return ts.isExternalModule(node.parent);
|
|
case 226:
|
|
return isAmbientModule(node.parent.parent) && !ts.isExternalModule(node.parent.parent.parent);
|
|
}
|
|
return false;
|
|
}
|
|
ts.isExternalModuleAugmentation = isExternalModuleAugmentation;
|
|
function getEnclosingBlockScopeContainer(node) {
|
|
var current = node.parent;
|
|
while (current) {
|
|
if (isFunctionLike(current)) {
|
|
return current;
|
|
}
|
|
switch (current.kind) {
|
|
case 256:
|
|
case 227:
|
|
case 252:
|
|
case 225:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
return current;
|
|
case 199:
|
|
if (!isFunctionLike(current.parent)) {
|
|
return current;
|
|
}
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
ts.getEnclosingBlockScopeContainer = getEnclosingBlockScopeContainer;
|
|
function isCatchClauseVariableDeclaration(declaration) {
|
|
return declaration &&
|
|
declaration.kind === 218 &&
|
|
declaration.parent &&
|
|
declaration.parent.kind === 252;
|
|
}
|
|
ts.isCatchClauseVariableDeclaration = isCatchClauseVariableDeclaration;
|
|
function declarationNameToString(name) {
|
|
return getFullWidth(name) === 0 ? "(Missing)" : getTextOfNode(name);
|
|
}
|
|
ts.declarationNameToString = declarationNameToString;
|
|
function createDiagnosticForNode(node, message, arg0, arg1, arg2) {
|
|
var sourceFile = getSourceFileOfNode(node);
|
|
var span = getErrorSpanForNode(sourceFile, node);
|
|
return ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2);
|
|
}
|
|
ts.createDiagnosticForNode = createDiagnosticForNode;
|
|
function createDiagnosticForNodeFromMessageChain(node, messageChain) {
|
|
var sourceFile = getSourceFileOfNode(node);
|
|
var span = getErrorSpanForNode(sourceFile, node);
|
|
return {
|
|
file: sourceFile,
|
|
start: span.start,
|
|
length: span.length,
|
|
code: messageChain.code,
|
|
category: messageChain.category,
|
|
messageText: messageChain.next ? messageChain : messageChain.messageText
|
|
};
|
|
}
|
|
ts.createDiagnosticForNodeFromMessageChain = createDiagnosticForNodeFromMessageChain;
|
|
function getSpanOfTokenAtPosition(sourceFile, pos) {
|
|
var scanner = ts.createScanner(sourceFile.languageVersion, true, sourceFile.languageVariant, sourceFile.text, undefined, pos);
|
|
scanner.scan();
|
|
var start = scanner.getTokenPos();
|
|
return ts.createTextSpanFromBounds(start, scanner.getTextPos());
|
|
}
|
|
ts.getSpanOfTokenAtPosition = getSpanOfTokenAtPosition;
|
|
function getErrorSpanForArrowFunction(sourceFile, node) {
|
|
var pos = ts.skipTrivia(sourceFile.text, node.pos);
|
|
if (node.body && node.body.kind === 199) {
|
|
var startLine = ts.getLineAndCharacterOfPosition(sourceFile, node.body.pos).line;
|
|
var endLine = ts.getLineAndCharacterOfPosition(sourceFile, node.body.end).line;
|
|
if (startLine < endLine) {
|
|
return ts.createTextSpan(pos, getEndLinePosition(startLine, sourceFile) - pos + 1);
|
|
}
|
|
}
|
|
return ts.createTextSpanFromBounds(pos, node.end);
|
|
}
|
|
function getErrorSpanForNode(sourceFile, node) {
|
|
var errorNode = node;
|
|
switch (node.kind) {
|
|
case 256:
|
|
var pos_1 = ts.skipTrivia(sourceFile.text, 0, false);
|
|
if (pos_1 === sourceFile.text.length) {
|
|
return ts.createTextSpan(0, 0);
|
|
}
|
|
return getSpanOfTokenAtPosition(sourceFile, pos_1);
|
|
case 218:
|
|
case 169:
|
|
case 221:
|
|
case 192:
|
|
case 222:
|
|
case 225:
|
|
case 224:
|
|
case 255:
|
|
case 220:
|
|
case 179:
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
case 223:
|
|
errorNode = node.name;
|
|
break;
|
|
case 180:
|
|
return getErrorSpanForArrowFunction(sourceFile, node);
|
|
}
|
|
if (errorNode === undefined) {
|
|
return getSpanOfTokenAtPosition(sourceFile, node.pos);
|
|
}
|
|
var pos = nodeIsMissing(errorNode)
|
|
? errorNode.pos
|
|
: ts.skipTrivia(sourceFile.text, errorNode.pos);
|
|
return ts.createTextSpanFromBounds(pos, errorNode.end);
|
|
}
|
|
ts.getErrorSpanForNode = getErrorSpanForNode;
|
|
function isExternalOrCommonJsModule(file) {
|
|
return (file.externalModuleIndicator || file.commonJsModuleIndicator) !== undefined;
|
|
}
|
|
ts.isExternalOrCommonJsModule = isExternalOrCommonJsModule;
|
|
function isDeclarationFile(file) {
|
|
return file.isDeclarationFile;
|
|
}
|
|
ts.isDeclarationFile = isDeclarationFile;
|
|
function isConstEnumDeclaration(node) {
|
|
return node.kind === 224 && isConst(node);
|
|
}
|
|
ts.isConstEnumDeclaration = isConstEnumDeclaration;
|
|
function walkUpBindingElementsAndPatterns(node) {
|
|
while (node && (node.kind === 169 || isBindingPattern(node))) {
|
|
node = node.parent;
|
|
}
|
|
return node;
|
|
}
|
|
function getCombinedNodeFlags(node) {
|
|
node = walkUpBindingElementsAndPatterns(node);
|
|
var flags = node.flags;
|
|
if (node.kind === 218) {
|
|
node = node.parent;
|
|
}
|
|
if (node && node.kind === 219) {
|
|
flags |= node.flags;
|
|
node = node.parent;
|
|
}
|
|
if (node && node.kind === 200) {
|
|
flags |= node.flags;
|
|
}
|
|
return flags;
|
|
}
|
|
ts.getCombinedNodeFlags = getCombinedNodeFlags;
|
|
function isConst(node) {
|
|
return !!(getCombinedNodeFlags(node) & 2048);
|
|
}
|
|
ts.isConst = isConst;
|
|
function isLet(node) {
|
|
return !!(getCombinedNodeFlags(node) & 1024);
|
|
}
|
|
ts.isLet = isLet;
|
|
function isSuperCallExpression(n) {
|
|
return n.kind === 174 && n.expression.kind === 95;
|
|
}
|
|
ts.isSuperCallExpression = isSuperCallExpression;
|
|
function isPrologueDirective(node) {
|
|
return node.kind === 202 && node.expression.kind === 9;
|
|
}
|
|
ts.isPrologueDirective = isPrologueDirective;
|
|
function getLeadingCommentRangesOfNode(node, sourceFileOfNode) {
|
|
return ts.getLeadingCommentRanges(sourceFileOfNode.text, node.pos);
|
|
}
|
|
ts.getLeadingCommentRangesOfNode = getLeadingCommentRangesOfNode;
|
|
function getLeadingCommentRangesOfNodeFromText(node, text) {
|
|
return ts.getLeadingCommentRanges(text, node.pos);
|
|
}
|
|
ts.getLeadingCommentRangesOfNodeFromText = getLeadingCommentRangesOfNodeFromText;
|
|
function getJsDocComments(node, sourceFileOfNode) {
|
|
return getJsDocCommentsFromText(node, sourceFileOfNode.text);
|
|
}
|
|
ts.getJsDocComments = getJsDocComments;
|
|
function getJsDocCommentsFromText(node, text) {
|
|
var commentRanges = (node.kind === 142 ||
|
|
node.kind === 141 ||
|
|
node.kind === 179 ||
|
|
node.kind === 180) ?
|
|
ts.concatenate(ts.getTrailingCommentRanges(text, node.pos), ts.getLeadingCommentRanges(text, node.pos)) :
|
|
getLeadingCommentRangesOfNodeFromText(node, text);
|
|
return ts.filter(commentRanges, isJsDocComment);
|
|
function isJsDocComment(comment) {
|
|
return text.charCodeAt(comment.pos + 1) === 42 &&
|
|
text.charCodeAt(comment.pos + 2) === 42 &&
|
|
text.charCodeAt(comment.pos + 3) !== 47;
|
|
}
|
|
}
|
|
ts.getJsDocCommentsFromText = getJsDocCommentsFromText;
|
|
ts.fullTripleSlashReferencePathRegEx = /^(\/\/\/\s*<reference\s+path\s*=\s*)('|")(.+?)\2.*?\/>/;
|
|
ts.fullTripleSlashReferenceTypeReferenceDirectiveRegEx = /^(\/\/\/\s*<reference\s+types\s*=\s*)('|")(.+?)\2.*?\/>/;
|
|
ts.fullTripleSlashAMDReferencePathRegEx = /^(\/\/\/\s*<amd-dependency\s+path\s*=\s*)('|")(.+?)\2.*?\/>/;
|
|
function isTypeNode(node) {
|
|
if (154 <= node.kind && node.kind <= 166) {
|
|
return true;
|
|
}
|
|
switch (node.kind) {
|
|
case 117:
|
|
case 130:
|
|
case 132:
|
|
case 120:
|
|
case 133:
|
|
case 135:
|
|
case 127:
|
|
return true;
|
|
case 103:
|
|
return node.parent.kind !== 183;
|
|
case 194:
|
|
return !isExpressionWithTypeArgumentsInClassExtendsClause(node);
|
|
case 69:
|
|
if (node.parent.kind === 139 && node.parent.right === node) {
|
|
node = node.parent;
|
|
}
|
|
else if (node.parent.kind === 172 && node.parent.name === node) {
|
|
node = node.parent;
|
|
}
|
|
ts.Debug.assert(node.kind === 69 || node.kind === 139 || node.kind === 172, "'node' was expected to be a qualified name, identifier or property access in 'isTypeNode'.");
|
|
case 139:
|
|
case 172:
|
|
case 97:
|
|
var parent_1 = node.parent;
|
|
if (parent_1.kind === 158) {
|
|
return false;
|
|
}
|
|
if (154 <= parent_1.kind && parent_1.kind <= 166) {
|
|
return true;
|
|
}
|
|
switch (parent_1.kind) {
|
|
case 194:
|
|
return !isExpressionWithTypeArgumentsInClassExtendsClause(parent_1);
|
|
case 141:
|
|
return node === parent_1.constraint;
|
|
case 145:
|
|
case 144:
|
|
case 142:
|
|
case 218:
|
|
return node === parent_1.type;
|
|
case 220:
|
|
case 179:
|
|
case 180:
|
|
case 148:
|
|
case 147:
|
|
case 146:
|
|
case 149:
|
|
case 150:
|
|
return node === parent_1.type;
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
return node === parent_1.type;
|
|
case 177:
|
|
return node === parent_1.type;
|
|
case 174:
|
|
case 175:
|
|
return parent_1.typeArguments && ts.indexOf(parent_1.typeArguments, node) >= 0;
|
|
case 176:
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.isTypeNode = isTypeNode;
|
|
function forEachReturnStatement(body, visitor) {
|
|
return traverse(body);
|
|
function traverse(node) {
|
|
switch (node.kind) {
|
|
case 211:
|
|
return visitor(node);
|
|
case 227:
|
|
case 199:
|
|
case 203:
|
|
case 204:
|
|
case 205:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
case 212:
|
|
case 213:
|
|
case 249:
|
|
case 250:
|
|
case 214:
|
|
case 216:
|
|
case 252:
|
|
return ts.forEachChild(node, traverse);
|
|
}
|
|
}
|
|
}
|
|
ts.forEachReturnStatement = forEachReturnStatement;
|
|
function forEachYieldExpression(body, visitor) {
|
|
return traverse(body);
|
|
function traverse(node) {
|
|
switch (node.kind) {
|
|
case 190:
|
|
visitor(node);
|
|
var operand = node.expression;
|
|
if (operand) {
|
|
traverse(operand);
|
|
}
|
|
case 224:
|
|
case 222:
|
|
case 225:
|
|
case 223:
|
|
case 221:
|
|
case 192:
|
|
return;
|
|
default:
|
|
if (isFunctionLike(node)) {
|
|
var name_5 = node.name;
|
|
if (name_5 && name_5.kind === 140) {
|
|
traverse(name_5.expression);
|
|
return;
|
|
}
|
|
}
|
|
else if (!isTypeNode(node)) {
|
|
ts.forEachChild(node, traverse);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ts.forEachYieldExpression = forEachYieldExpression;
|
|
function isVariableLike(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 169:
|
|
case 255:
|
|
case 142:
|
|
case 253:
|
|
case 145:
|
|
case 144:
|
|
case 254:
|
|
case 218:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.isVariableLike = isVariableLike;
|
|
function isAccessor(node) {
|
|
return node && (node.kind === 149 || node.kind === 150);
|
|
}
|
|
ts.isAccessor = isAccessor;
|
|
function isClassLike(node) {
|
|
return node && (node.kind === 221 || node.kind === 192);
|
|
}
|
|
ts.isClassLike = isClassLike;
|
|
function isFunctionLike(node) {
|
|
return node && isFunctionLikeKind(node.kind);
|
|
}
|
|
ts.isFunctionLike = isFunctionLike;
|
|
function isFunctionLikeKind(kind) {
|
|
switch (kind) {
|
|
case 148:
|
|
case 179:
|
|
case 220:
|
|
case 180:
|
|
case 147:
|
|
case 146:
|
|
case 149:
|
|
case 150:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 156:
|
|
case 157:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isFunctionLikeKind = isFunctionLikeKind;
|
|
function introducesArgumentsExoticObject(node) {
|
|
switch (node.kind) {
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 220:
|
|
case 179:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.introducesArgumentsExoticObject = introducesArgumentsExoticObject;
|
|
function isIterationStatement(node, lookInLabeledStatements) {
|
|
switch (node.kind) {
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
case 204:
|
|
case 205:
|
|
return true;
|
|
case 214:
|
|
return lookInLabeledStatements && isIterationStatement(node.statement, lookInLabeledStatements);
|
|
}
|
|
return false;
|
|
}
|
|
ts.isIterationStatement = isIterationStatement;
|
|
function isFunctionBlock(node) {
|
|
return node && node.kind === 199 && isFunctionLike(node.parent);
|
|
}
|
|
ts.isFunctionBlock = isFunctionBlock;
|
|
function isObjectLiteralMethod(node) {
|
|
return node && node.kind === 147 && node.parent.kind === 171;
|
|
}
|
|
ts.isObjectLiteralMethod = isObjectLiteralMethod;
|
|
function isIdentifierTypePredicate(predicate) {
|
|
return predicate && predicate.kind === 1;
|
|
}
|
|
ts.isIdentifierTypePredicate = isIdentifierTypePredicate;
|
|
function isThisTypePredicate(predicate) {
|
|
return predicate && predicate.kind === 0;
|
|
}
|
|
ts.isThisTypePredicate = isThisTypePredicate;
|
|
function getContainingFunction(node) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (!node || isFunctionLike(node)) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
ts.getContainingFunction = getContainingFunction;
|
|
function getContainingClass(node) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (!node || isClassLike(node)) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
ts.getContainingClass = getContainingClass;
|
|
function getThisContainer(node, includeArrowFunctions) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (!node) {
|
|
return undefined;
|
|
}
|
|
switch (node.kind) {
|
|
case 140:
|
|
if (isClassLike(node.parent.parent)) {
|
|
return node;
|
|
}
|
|
node = node.parent;
|
|
break;
|
|
case 143:
|
|
if (node.parent.kind === 142 && isClassElement(node.parent.parent)) {
|
|
node = node.parent.parent;
|
|
}
|
|
else if (isClassElement(node.parent)) {
|
|
node = node.parent;
|
|
}
|
|
break;
|
|
case 180:
|
|
if (!includeArrowFunctions) {
|
|
continue;
|
|
}
|
|
case 220:
|
|
case 179:
|
|
case 225:
|
|
case 145:
|
|
case 144:
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 224:
|
|
case 256:
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
ts.getThisContainer = getThisContainer;
|
|
function getSuperContainer(node, stopOnFunctions) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (!node) {
|
|
return node;
|
|
}
|
|
switch (node.kind) {
|
|
case 140:
|
|
node = node.parent;
|
|
break;
|
|
case 220:
|
|
case 179:
|
|
case 180:
|
|
if (!stopOnFunctions) {
|
|
continue;
|
|
}
|
|
case 145:
|
|
case 144:
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
return node;
|
|
case 143:
|
|
if (node.parent.kind === 142 && isClassElement(node.parent.parent)) {
|
|
node = node.parent.parent;
|
|
}
|
|
else if (isClassElement(node.parent)) {
|
|
node = node.parent;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
ts.getSuperContainer = getSuperContainer;
|
|
function getImmediatelyInvokedFunctionExpression(func) {
|
|
if (func.kind === 179 || func.kind === 180) {
|
|
var prev = func;
|
|
var parent_2 = func.parent;
|
|
while (parent_2.kind === 178) {
|
|
prev = parent_2;
|
|
parent_2 = parent_2.parent;
|
|
}
|
|
if (parent_2.kind === 174 && parent_2.expression === prev) {
|
|
return parent_2;
|
|
}
|
|
}
|
|
}
|
|
ts.getImmediatelyInvokedFunctionExpression = getImmediatelyInvokedFunctionExpression;
|
|
function isSuperPropertyOrElementAccess(node) {
|
|
return (node.kind === 172
|
|
|| node.kind === 173)
|
|
&& node.expression.kind === 95;
|
|
}
|
|
ts.isSuperPropertyOrElementAccess = isSuperPropertyOrElementAccess;
|
|
function getEntityNameFromTypeNode(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 155:
|
|
return node.typeName;
|
|
case 194:
|
|
return node.expression;
|
|
case 69:
|
|
case 139:
|
|
return node;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getEntityNameFromTypeNode = getEntityNameFromTypeNode;
|
|
function getInvokedExpression(node) {
|
|
if (node.kind === 176) {
|
|
return node.tag;
|
|
}
|
|
return node.expression;
|
|
}
|
|
ts.getInvokedExpression = getInvokedExpression;
|
|
function nodeCanBeDecorated(node) {
|
|
switch (node.kind) {
|
|
case 221:
|
|
return true;
|
|
case 145:
|
|
return node.parent.kind === 221;
|
|
case 149:
|
|
case 150:
|
|
case 147:
|
|
return node.body !== undefined
|
|
&& node.parent.kind === 221;
|
|
case 142:
|
|
return node.parent.body !== undefined
|
|
&& (node.parent.kind === 148
|
|
|| node.parent.kind === 147
|
|
|| node.parent.kind === 150)
|
|
&& node.parent.parent.kind === 221;
|
|
}
|
|
return false;
|
|
}
|
|
ts.nodeCanBeDecorated = nodeCanBeDecorated;
|
|
function nodeIsDecorated(node) {
|
|
return node.decorators !== undefined
|
|
&& nodeCanBeDecorated(node);
|
|
}
|
|
ts.nodeIsDecorated = nodeIsDecorated;
|
|
function isPropertyAccessExpression(node) {
|
|
return node.kind === 172;
|
|
}
|
|
ts.isPropertyAccessExpression = isPropertyAccessExpression;
|
|
function isElementAccessExpression(node) {
|
|
return node.kind === 173;
|
|
}
|
|
ts.isElementAccessExpression = isElementAccessExpression;
|
|
function isJSXTagName(node) {
|
|
var parent = node.parent;
|
|
if (parent.kind === 243 ||
|
|
parent.kind === 242 ||
|
|
parent.kind === 245) {
|
|
return parent.tagName === node;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isJSXTagName = isJSXTagName;
|
|
function isExpression(node) {
|
|
switch (node.kind) {
|
|
case 97:
|
|
case 95:
|
|
case 93:
|
|
case 99:
|
|
case 84:
|
|
case 10:
|
|
case 170:
|
|
case 171:
|
|
case 172:
|
|
case 173:
|
|
case 174:
|
|
case 175:
|
|
case 176:
|
|
case 195:
|
|
case 177:
|
|
case 196:
|
|
case 178:
|
|
case 179:
|
|
case 192:
|
|
case 180:
|
|
case 183:
|
|
case 181:
|
|
case 182:
|
|
case 185:
|
|
case 186:
|
|
case 187:
|
|
case 188:
|
|
case 191:
|
|
case 189:
|
|
case 11:
|
|
case 193:
|
|
case 241:
|
|
case 242:
|
|
case 190:
|
|
case 184:
|
|
return true;
|
|
case 139:
|
|
while (node.parent.kind === 139) {
|
|
node = node.parent;
|
|
}
|
|
return node.parent.kind === 158 || isJSXTagName(node);
|
|
case 69:
|
|
if (node.parent.kind === 158 || isJSXTagName(node)) {
|
|
return true;
|
|
}
|
|
case 8:
|
|
case 9:
|
|
case 97:
|
|
var parent_3 = node.parent;
|
|
switch (parent_3.kind) {
|
|
case 218:
|
|
case 142:
|
|
case 145:
|
|
case 144:
|
|
case 255:
|
|
case 253:
|
|
case 169:
|
|
return parent_3.initializer === node;
|
|
case 202:
|
|
case 203:
|
|
case 204:
|
|
case 205:
|
|
case 211:
|
|
case 212:
|
|
case 213:
|
|
case 249:
|
|
case 215:
|
|
case 213:
|
|
return parent_3.expression === node;
|
|
case 206:
|
|
var forStatement = parent_3;
|
|
return (forStatement.initializer === node && forStatement.initializer.kind !== 219) ||
|
|
forStatement.condition === node ||
|
|
forStatement.incrementor === node;
|
|
case 207:
|
|
case 208:
|
|
var forInStatement = parent_3;
|
|
return (forInStatement.initializer === node && forInStatement.initializer.kind !== 219) ||
|
|
forInStatement.expression === node;
|
|
case 177:
|
|
case 195:
|
|
return node === parent_3.expression;
|
|
case 197:
|
|
return node === parent_3.expression;
|
|
case 140:
|
|
return node === parent_3.expression;
|
|
case 143:
|
|
case 248:
|
|
case 247:
|
|
return true;
|
|
case 194:
|
|
return parent_3.expression === node && isExpressionWithTypeArgumentsInClassExtendsClause(parent_3);
|
|
default:
|
|
if (isExpression(parent_3)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.isExpression = isExpression;
|
|
function isExternalModuleNameRelative(moduleName) {
|
|
return /^\.\.?($|[\\/])/.test(moduleName);
|
|
}
|
|
ts.isExternalModuleNameRelative = isExternalModuleNameRelative;
|
|
function isInstantiatedModule(node, preserveConstEnums) {
|
|
var moduleState = ts.getModuleInstanceState(node);
|
|
return moduleState === 1 ||
|
|
(preserveConstEnums && moduleState === 2);
|
|
}
|
|
ts.isInstantiatedModule = isInstantiatedModule;
|
|
function isExternalModuleImportEqualsDeclaration(node) {
|
|
return node.kind === 229 && node.moduleReference.kind === 240;
|
|
}
|
|
ts.isExternalModuleImportEqualsDeclaration = isExternalModuleImportEqualsDeclaration;
|
|
function getExternalModuleImportEqualsDeclarationExpression(node) {
|
|
ts.Debug.assert(isExternalModuleImportEqualsDeclaration(node));
|
|
return node.moduleReference.expression;
|
|
}
|
|
ts.getExternalModuleImportEqualsDeclarationExpression = getExternalModuleImportEqualsDeclarationExpression;
|
|
function isInternalModuleImportEqualsDeclaration(node) {
|
|
return node.kind === 229 && node.moduleReference.kind !== 240;
|
|
}
|
|
ts.isInternalModuleImportEqualsDeclaration = isInternalModuleImportEqualsDeclaration;
|
|
function isSourceFileJavaScript(file) {
|
|
return isInJavaScriptFile(file);
|
|
}
|
|
ts.isSourceFileJavaScript = isSourceFileJavaScript;
|
|
function isInJavaScriptFile(node) {
|
|
return node && !!(node.flags & 134217728);
|
|
}
|
|
ts.isInJavaScriptFile = isInJavaScriptFile;
|
|
function isRequireCall(expression, checkArgumentIsStringLiteral) {
|
|
var isRequire = expression.kind === 174 &&
|
|
expression.expression.kind === 69 &&
|
|
expression.expression.text === "require" &&
|
|
expression.arguments.length === 1;
|
|
return isRequire && (!checkArgumentIsStringLiteral || expression.arguments[0].kind === 9);
|
|
}
|
|
ts.isRequireCall = isRequireCall;
|
|
function isSingleOrDoubleQuote(charCode) {
|
|
return charCode === 39 || charCode === 34;
|
|
}
|
|
ts.isSingleOrDoubleQuote = isSingleOrDoubleQuote;
|
|
function isDeclarationOfFunctionExpression(s) {
|
|
if (s.valueDeclaration && s.valueDeclaration.kind === 218) {
|
|
var declaration = s.valueDeclaration;
|
|
return declaration.initializer && declaration.initializer.kind === 179;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isDeclarationOfFunctionExpression = isDeclarationOfFunctionExpression;
|
|
function getSpecialPropertyAssignmentKind(expression) {
|
|
if (!isInJavaScriptFile(expression)) {
|
|
return 0;
|
|
}
|
|
if (expression.kind !== 187) {
|
|
return 0;
|
|
}
|
|
var expr = expression;
|
|
if (expr.operatorToken.kind !== 56 || expr.left.kind !== 172) {
|
|
return 0;
|
|
}
|
|
var lhs = expr.left;
|
|
if (lhs.expression.kind === 69) {
|
|
var lhsId = lhs.expression;
|
|
if (lhsId.text === "exports") {
|
|
return 1;
|
|
}
|
|
else if (lhsId.text === "module" && lhs.name.text === "exports") {
|
|
return 2;
|
|
}
|
|
}
|
|
else if (lhs.expression.kind === 97) {
|
|
return 4;
|
|
}
|
|
else if (lhs.expression.kind === 172) {
|
|
var innerPropertyAccess = lhs.expression;
|
|
if (innerPropertyAccess.expression.kind === 69) {
|
|
var innerPropertyAccessIdentifier = innerPropertyAccess.expression;
|
|
if (innerPropertyAccessIdentifier.text === "module" && innerPropertyAccess.name.text === "exports") {
|
|
return 1;
|
|
}
|
|
if (innerPropertyAccess.name.text === "prototype") {
|
|
return 3;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
ts.getSpecialPropertyAssignmentKind = getSpecialPropertyAssignmentKind;
|
|
function getExternalModuleName(node) {
|
|
if (node.kind === 230) {
|
|
return node.moduleSpecifier;
|
|
}
|
|
if (node.kind === 229) {
|
|
var reference = node.moduleReference;
|
|
if (reference.kind === 240) {
|
|
return reference.expression;
|
|
}
|
|
}
|
|
if (node.kind === 236) {
|
|
return node.moduleSpecifier;
|
|
}
|
|
if (node.kind === 225 && node.name.kind === 9) {
|
|
return node.name;
|
|
}
|
|
}
|
|
ts.getExternalModuleName = getExternalModuleName;
|
|
function hasQuestionToken(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 142:
|
|
case 147:
|
|
case 146:
|
|
case 254:
|
|
case 253:
|
|
case 145:
|
|
case 144:
|
|
return node.questionToken !== undefined;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.hasQuestionToken = hasQuestionToken;
|
|
function isJSDocConstructSignature(node) {
|
|
return node.kind === 269 &&
|
|
node.parameters.length > 0 &&
|
|
node.parameters[0].type.kind === 271;
|
|
}
|
|
ts.isJSDocConstructSignature = isJSDocConstructSignature;
|
|
function getJSDocTag(node, kind, checkParentVariableStatement) {
|
|
if (!node) {
|
|
return undefined;
|
|
}
|
|
var jsDocComments = getJSDocComments(node, checkParentVariableStatement);
|
|
if (!jsDocComments) {
|
|
return undefined;
|
|
}
|
|
for (var _i = 0, jsDocComments_1 = jsDocComments; _i < jsDocComments_1.length; _i++) {
|
|
var jsDocComment = jsDocComments_1[_i];
|
|
for (var _a = 0, _b = jsDocComment.tags; _a < _b.length; _a++) {
|
|
var tag = _b[_a];
|
|
if (tag.kind === kind) {
|
|
return tag;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getJSDocComments(node, checkParentVariableStatement) {
|
|
if (node.jsDocComments) {
|
|
return node.jsDocComments;
|
|
}
|
|
if (checkParentVariableStatement) {
|
|
var isInitializerOfVariableDeclarationInStatement = node.parent.kind === 218 &&
|
|
node.parent.initializer === node &&
|
|
node.parent.parent.parent.kind === 200;
|
|
var variableStatementNode = isInitializerOfVariableDeclarationInStatement ? node.parent.parent.parent : undefined;
|
|
if (variableStatementNode) {
|
|
return variableStatementNode.jsDocComments;
|
|
}
|
|
var parent_4 = node.parent;
|
|
var isSourceOfAssignmentExpressionStatement = parent_4 && parent_4.parent &&
|
|
parent_4.kind === 187 &&
|
|
parent_4.operatorToken.kind === 56 &&
|
|
parent_4.parent.kind === 202;
|
|
if (isSourceOfAssignmentExpressionStatement) {
|
|
return parent_4.parent.jsDocComments;
|
|
}
|
|
var isPropertyAssignmentExpression = parent_4 && parent_4.kind === 253;
|
|
if (isPropertyAssignmentExpression) {
|
|
return parent_4.jsDocComments;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getJSDocTypeTag(node) {
|
|
return getJSDocTag(node, 277, false);
|
|
}
|
|
ts.getJSDocTypeTag = getJSDocTypeTag;
|
|
function getJSDocReturnTag(node) {
|
|
return getJSDocTag(node, 276, true);
|
|
}
|
|
ts.getJSDocReturnTag = getJSDocReturnTag;
|
|
function getJSDocTemplateTag(node) {
|
|
return getJSDocTag(node, 278, false);
|
|
}
|
|
ts.getJSDocTemplateTag = getJSDocTemplateTag;
|
|
function getCorrespondingJSDocParameterTag(parameter) {
|
|
if (parameter.name && parameter.name.kind === 69) {
|
|
var parameterName = parameter.name.text;
|
|
var jsDocComments = getJSDocComments(parameter.parent, true);
|
|
if (jsDocComments) {
|
|
for (var _i = 0, jsDocComments_2 = jsDocComments; _i < jsDocComments_2.length; _i++) {
|
|
var jsDocComment = jsDocComments_2[_i];
|
|
for (var _a = 0, _b = jsDocComment.tags; _a < _b.length; _a++) {
|
|
var tag = _b[_a];
|
|
if (tag.kind === 275) {
|
|
var parameterTag = tag;
|
|
var name_6 = parameterTag.preParameterName || parameterTag.postParameterName;
|
|
if (name_6.text === parameterName) {
|
|
return parameterTag;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getCorrespondingJSDocParameterTag = getCorrespondingJSDocParameterTag;
|
|
function hasRestParameter(s) {
|
|
return isRestParameter(ts.lastOrUndefined(s.parameters));
|
|
}
|
|
ts.hasRestParameter = hasRestParameter;
|
|
function hasDeclaredRestParameter(s) {
|
|
return isDeclaredRestParam(ts.lastOrUndefined(s.parameters));
|
|
}
|
|
ts.hasDeclaredRestParameter = hasDeclaredRestParameter;
|
|
function isRestParameter(node) {
|
|
if (node && (node.flags & 134217728)) {
|
|
if (node.type && node.type.kind === 270) {
|
|
return true;
|
|
}
|
|
var paramTag = getCorrespondingJSDocParameterTag(node);
|
|
if (paramTag && paramTag.typeExpression) {
|
|
return paramTag.typeExpression.type.kind === 270;
|
|
}
|
|
}
|
|
return isDeclaredRestParam(node);
|
|
}
|
|
ts.isRestParameter = isRestParameter;
|
|
function isDeclaredRestParam(node) {
|
|
return node && node.dotDotDotToken !== undefined;
|
|
}
|
|
ts.isDeclaredRestParam = isDeclaredRestParam;
|
|
function isLiteralKind(kind) {
|
|
return 8 <= kind && kind <= 11;
|
|
}
|
|
ts.isLiteralKind = isLiteralKind;
|
|
function isTextualLiteralKind(kind) {
|
|
return kind === 9 || kind === 11;
|
|
}
|
|
ts.isTextualLiteralKind = isTextualLiteralKind;
|
|
function isTemplateLiteralKind(kind) {
|
|
return 11 <= kind && kind <= 14;
|
|
}
|
|
ts.isTemplateLiteralKind = isTemplateLiteralKind;
|
|
function isBindingPattern(node) {
|
|
return !!node && (node.kind === 168 || node.kind === 167);
|
|
}
|
|
ts.isBindingPattern = isBindingPattern;
|
|
function isAssignmentTarget(node) {
|
|
while (node.parent.kind === 178) {
|
|
node = node.parent;
|
|
}
|
|
while (true) {
|
|
var parent_5 = node.parent;
|
|
if (parent_5.kind === 170 || parent_5.kind === 191) {
|
|
node = parent_5;
|
|
continue;
|
|
}
|
|
if (parent_5.kind === 253 || parent_5.kind === 254) {
|
|
node = parent_5.parent;
|
|
continue;
|
|
}
|
|
return parent_5.kind === 187 &&
|
|
parent_5.operatorToken.kind === 56 &&
|
|
parent_5.left === node ||
|
|
(parent_5.kind === 207 || parent_5.kind === 208) &&
|
|
parent_5.initializer === node;
|
|
}
|
|
}
|
|
ts.isAssignmentTarget = isAssignmentTarget;
|
|
function isNodeDescendentOf(node, ancestor) {
|
|
while (node) {
|
|
if (node === ancestor)
|
|
return true;
|
|
node = node.parent;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isNodeDescendentOf = isNodeDescendentOf;
|
|
function isInAmbientContext(node) {
|
|
while (node) {
|
|
if (node.flags & 2 || (node.kind === 256 && node.isDeclarationFile)) {
|
|
return true;
|
|
}
|
|
node = node.parent;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isInAmbientContext = isInAmbientContext;
|
|
function isDeclaration(node) {
|
|
switch (node.kind) {
|
|
case 180:
|
|
case 169:
|
|
case 221:
|
|
case 192:
|
|
case 148:
|
|
case 224:
|
|
case 255:
|
|
case 238:
|
|
case 220:
|
|
case 179:
|
|
case 149:
|
|
case 231:
|
|
case 229:
|
|
case 234:
|
|
case 222:
|
|
case 147:
|
|
case 146:
|
|
case 225:
|
|
case 232:
|
|
case 142:
|
|
case 253:
|
|
case 145:
|
|
case 144:
|
|
case 150:
|
|
case 254:
|
|
case 223:
|
|
case 141:
|
|
case 218:
|
|
case 279:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isDeclaration = isDeclaration;
|
|
function isStatement(n) {
|
|
switch (n.kind) {
|
|
case 210:
|
|
case 209:
|
|
case 217:
|
|
case 204:
|
|
case 202:
|
|
case 201:
|
|
case 207:
|
|
case 208:
|
|
case 206:
|
|
case 203:
|
|
case 214:
|
|
case 211:
|
|
case 213:
|
|
case 215:
|
|
case 216:
|
|
case 200:
|
|
case 205:
|
|
case 212:
|
|
case 235:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
ts.isStatement = isStatement;
|
|
function isClassElement(n) {
|
|
switch (n.kind) {
|
|
case 148:
|
|
case 145:
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
case 146:
|
|
case 153:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
ts.isClassElement = isClassElement;
|
|
function isDeclarationName(name) {
|
|
if (name.kind !== 69 && name.kind !== 9 && name.kind !== 8) {
|
|
return false;
|
|
}
|
|
var parent = name.parent;
|
|
if (parent.kind === 234 || parent.kind === 238) {
|
|
if (parent.propertyName) {
|
|
return true;
|
|
}
|
|
}
|
|
if (isDeclaration(parent)) {
|
|
return parent.name === name;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isDeclarationName = isDeclarationName;
|
|
function isLiteralComputedPropertyDeclarationName(node) {
|
|
return (node.kind === 9 || node.kind === 8) &&
|
|
node.parent.kind === 140 &&
|
|
isDeclaration(node.parent.parent);
|
|
}
|
|
ts.isLiteralComputedPropertyDeclarationName = isLiteralComputedPropertyDeclarationName;
|
|
function isIdentifierName(node) {
|
|
var parent = node.parent;
|
|
switch (parent.kind) {
|
|
case 145:
|
|
case 144:
|
|
case 147:
|
|
case 146:
|
|
case 149:
|
|
case 150:
|
|
case 255:
|
|
case 253:
|
|
case 172:
|
|
return parent.name === node;
|
|
case 139:
|
|
if (parent.right === node) {
|
|
while (parent.kind === 139) {
|
|
parent = parent.parent;
|
|
}
|
|
return parent.kind === 158;
|
|
}
|
|
return false;
|
|
case 169:
|
|
case 234:
|
|
return parent.propertyName === node;
|
|
case 238:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isIdentifierName = isIdentifierName;
|
|
function isAliasSymbolDeclaration(node) {
|
|
return node.kind === 229 ||
|
|
node.kind === 228 ||
|
|
node.kind === 231 && !!node.name ||
|
|
node.kind === 232 ||
|
|
node.kind === 234 ||
|
|
node.kind === 238 ||
|
|
node.kind === 235 && node.expression.kind === 69;
|
|
}
|
|
ts.isAliasSymbolDeclaration = isAliasSymbolDeclaration;
|
|
function getClassExtendsHeritageClauseElement(node) {
|
|
var heritageClause = getHeritageClause(node.heritageClauses, 83);
|
|
return heritageClause && heritageClause.types.length > 0 ? heritageClause.types[0] : undefined;
|
|
}
|
|
ts.getClassExtendsHeritageClauseElement = getClassExtendsHeritageClauseElement;
|
|
function getClassImplementsHeritageClauseElements(node) {
|
|
var heritageClause = getHeritageClause(node.heritageClauses, 106);
|
|
return heritageClause ? heritageClause.types : undefined;
|
|
}
|
|
ts.getClassImplementsHeritageClauseElements = getClassImplementsHeritageClauseElements;
|
|
function getInterfaceBaseTypeNodes(node) {
|
|
var heritageClause = getHeritageClause(node.heritageClauses, 83);
|
|
return heritageClause ? heritageClause.types : undefined;
|
|
}
|
|
ts.getInterfaceBaseTypeNodes = getInterfaceBaseTypeNodes;
|
|
function getHeritageClause(clauses, kind) {
|
|
if (clauses) {
|
|
for (var _i = 0, clauses_1 = clauses; _i < clauses_1.length; _i++) {
|
|
var clause = clauses_1[_i];
|
|
if (clause.token === kind) {
|
|
return clause;
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getHeritageClause = getHeritageClause;
|
|
function tryResolveScriptReference(host, sourceFile, reference) {
|
|
if (!host.getCompilerOptions().noResolve) {
|
|
var referenceFileName = ts.isRootedDiskPath(reference.fileName) ? reference.fileName : ts.combinePaths(ts.getDirectoryPath(sourceFile.fileName), reference.fileName);
|
|
return host.getSourceFile(referenceFileName);
|
|
}
|
|
}
|
|
ts.tryResolveScriptReference = tryResolveScriptReference;
|
|
function getAncestor(node, kind) {
|
|
while (node) {
|
|
if (node.kind === kind) {
|
|
return node;
|
|
}
|
|
node = node.parent;
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getAncestor = getAncestor;
|
|
function getFileReferenceFromReferencePath(comment, commentRange) {
|
|
var simpleReferenceRegEx = /^\/\/\/\s*<reference\s+/gim;
|
|
var isNoDefaultLibRegEx = /^(\/\/\/\s*<reference\s+no-default-lib\s*=\s*)('|")(.+?)\2\s*\/>/gim;
|
|
if (simpleReferenceRegEx.test(comment)) {
|
|
if (isNoDefaultLibRegEx.test(comment)) {
|
|
return {
|
|
isNoDefaultLib: true
|
|
};
|
|
}
|
|
else {
|
|
var refMatchResult = ts.fullTripleSlashReferencePathRegEx.exec(comment);
|
|
var refLibResult = !refMatchResult && ts.fullTripleSlashReferenceTypeReferenceDirectiveRegEx.exec(comment);
|
|
if (refMatchResult || refLibResult) {
|
|
var start = commentRange.pos;
|
|
var end = commentRange.end;
|
|
return {
|
|
fileReference: {
|
|
pos: start,
|
|
end: end,
|
|
fileName: (refMatchResult || refLibResult)[3]
|
|
},
|
|
isNoDefaultLib: false,
|
|
isTypeReferenceDirective: !!refLibResult
|
|
};
|
|
}
|
|
return {
|
|
diagnosticMessage: ts.Diagnostics.Invalid_reference_directive_syntax,
|
|
isNoDefaultLib: false
|
|
};
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getFileReferenceFromReferencePath = getFileReferenceFromReferencePath;
|
|
function isKeyword(token) {
|
|
return 70 <= token && token <= 138;
|
|
}
|
|
ts.isKeyword = isKeyword;
|
|
function isTrivia(token) {
|
|
return 2 <= token && token <= 7;
|
|
}
|
|
ts.isTrivia = isTrivia;
|
|
function isAsyncFunctionLike(node) {
|
|
return isFunctionLike(node) && (node.flags & 256) !== 0 && !isAccessor(node);
|
|
}
|
|
ts.isAsyncFunctionLike = isAsyncFunctionLike;
|
|
function isStringOrNumericLiteral(kind) {
|
|
return kind === 9 || kind === 8;
|
|
}
|
|
ts.isStringOrNumericLiteral = isStringOrNumericLiteral;
|
|
function hasDynamicName(declaration) {
|
|
return declaration.name && isDynamicName(declaration.name);
|
|
}
|
|
ts.hasDynamicName = hasDynamicName;
|
|
function isDynamicName(name) {
|
|
return name.kind === 140 &&
|
|
!isStringOrNumericLiteral(name.expression.kind) &&
|
|
!isWellKnownSymbolSyntactically(name.expression);
|
|
}
|
|
ts.isDynamicName = isDynamicName;
|
|
function isWellKnownSymbolSyntactically(node) {
|
|
return isPropertyAccessExpression(node) && isESSymbolIdentifier(node.expression);
|
|
}
|
|
ts.isWellKnownSymbolSyntactically = isWellKnownSymbolSyntactically;
|
|
function getPropertyNameForPropertyNameNode(name) {
|
|
if (name.kind === 69 || name.kind === 9 || name.kind === 8 || name.kind === 142) {
|
|
return name.text;
|
|
}
|
|
if (name.kind === 140) {
|
|
var nameExpression = name.expression;
|
|
if (isWellKnownSymbolSyntactically(nameExpression)) {
|
|
var rightHandSideName = nameExpression.name.text;
|
|
return getPropertyNameForKnownSymbolName(rightHandSideName);
|
|
}
|
|
else if (nameExpression.kind === 9 || nameExpression.kind === 8) {
|
|
return nameExpression.text;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.getPropertyNameForPropertyNameNode = getPropertyNameForPropertyNameNode;
|
|
function getPropertyNameForKnownSymbolName(symbolName) {
|
|
return "__@" + symbolName;
|
|
}
|
|
ts.getPropertyNameForKnownSymbolName = getPropertyNameForKnownSymbolName;
|
|
function isESSymbolIdentifier(node) {
|
|
return node.kind === 69 && node.text === "Symbol";
|
|
}
|
|
ts.isESSymbolIdentifier = isESSymbolIdentifier;
|
|
function isModifierKind(token) {
|
|
switch (token) {
|
|
case 115:
|
|
case 118:
|
|
case 74:
|
|
case 122:
|
|
case 77:
|
|
case 82:
|
|
case 112:
|
|
case 110:
|
|
case 111:
|
|
case 128:
|
|
case 113:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isModifierKind = isModifierKind;
|
|
function isParameterDeclaration(node) {
|
|
var root = getRootDeclaration(node);
|
|
return root.kind === 142;
|
|
}
|
|
ts.isParameterDeclaration = isParameterDeclaration;
|
|
function getRootDeclaration(node) {
|
|
while (node.kind === 169) {
|
|
node = node.parent.parent;
|
|
}
|
|
return node;
|
|
}
|
|
ts.getRootDeclaration = getRootDeclaration;
|
|
function nodeStartsNewLexicalEnvironment(n) {
|
|
return isFunctionLike(n) || n.kind === 225 || n.kind === 256;
|
|
}
|
|
ts.nodeStartsNewLexicalEnvironment = nodeStartsNewLexicalEnvironment;
|
|
function cloneNode(node, location, flags, parent) {
|
|
var clone = location !== undefined
|
|
? ts.createNode(node.kind, location.pos, location.end)
|
|
: createSynthesizedNode(node.kind);
|
|
for (var key in node) {
|
|
if (clone.hasOwnProperty(key) || !node.hasOwnProperty(key)) {
|
|
continue;
|
|
}
|
|
clone[key] = node[key];
|
|
}
|
|
if (flags !== undefined) {
|
|
clone.flags = flags;
|
|
}
|
|
if (parent !== undefined) {
|
|
clone.parent = parent;
|
|
}
|
|
return clone;
|
|
}
|
|
ts.cloneNode = cloneNode;
|
|
function cloneEntityName(node, parent) {
|
|
var clone = cloneNode(node, node, node.flags, parent);
|
|
if (isQualifiedName(clone)) {
|
|
var left = clone.left, right = clone.right;
|
|
clone.left = cloneEntityName(left, clone);
|
|
clone.right = cloneNode(right, right, right.flags, parent);
|
|
}
|
|
return clone;
|
|
}
|
|
ts.cloneEntityName = cloneEntityName;
|
|
function isQualifiedName(node) {
|
|
return node.kind === 139;
|
|
}
|
|
ts.isQualifiedName = isQualifiedName;
|
|
function nodeIsSynthesized(node) {
|
|
return node.pos === -1;
|
|
}
|
|
ts.nodeIsSynthesized = nodeIsSynthesized;
|
|
function createSynthesizedNode(kind, startsOnNewLine) {
|
|
var node = ts.createNode(kind, -1, -1);
|
|
node.startsOnNewLine = startsOnNewLine;
|
|
return node;
|
|
}
|
|
ts.createSynthesizedNode = createSynthesizedNode;
|
|
function createSynthesizedNodeArray() {
|
|
var array = [];
|
|
array.pos = -1;
|
|
array.end = -1;
|
|
return array;
|
|
}
|
|
ts.createSynthesizedNodeArray = createSynthesizedNodeArray;
|
|
function createDiagnosticCollection() {
|
|
var nonFileDiagnostics = [];
|
|
var fileDiagnostics = {};
|
|
var diagnosticsModified = false;
|
|
var modificationCount = 0;
|
|
return {
|
|
add: add,
|
|
getGlobalDiagnostics: getGlobalDiagnostics,
|
|
getDiagnostics: getDiagnostics,
|
|
getModificationCount: getModificationCount,
|
|
reattachFileDiagnostics: reattachFileDiagnostics
|
|
};
|
|
function getModificationCount() {
|
|
return modificationCount;
|
|
}
|
|
function reattachFileDiagnostics(newFile) {
|
|
if (!ts.hasProperty(fileDiagnostics, newFile.fileName)) {
|
|
return;
|
|
}
|
|
for (var _i = 0, _a = fileDiagnostics[newFile.fileName]; _i < _a.length; _i++) {
|
|
var diagnostic = _a[_i];
|
|
diagnostic.file = newFile;
|
|
}
|
|
}
|
|
function add(diagnostic) {
|
|
var diagnostics;
|
|
if (diagnostic.file) {
|
|
diagnostics = fileDiagnostics[diagnostic.file.fileName];
|
|
if (!diagnostics) {
|
|
diagnostics = [];
|
|
fileDiagnostics[diagnostic.file.fileName] = diagnostics;
|
|
}
|
|
}
|
|
else {
|
|
diagnostics = nonFileDiagnostics;
|
|
}
|
|
diagnostics.push(diagnostic);
|
|
diagnosticsModified = true;
|
|
modificationCount++;
|
|
}
|
|
function getGlobalDiagnostics() {
|
|
sortAndDeduplicate();
|
|
return nonFileDiagnostics;
|
|
}
|
|
function getDiagnostics(fileName) {
|
|
sortAndDeduplicate();
|
|
if (fileName) {
|
|
return fileDiagnostics[fileName] || [];
|
|
}
|
|
var allDiagnostics = [];
|
|
function pushDiagnostic(d) {
|
|
allDiagnostics.push(d);
|
|
}
|
|
ts.forEach(nonFileDiagnostics, pushDiagnostic);
|
|
for (var key in fileDiagnostics) {
|
|
if (ts.hasProperty(fileDiagnostics, key)) {
|
|
ts.forEach(fileDiagnostics[key], pushDiagnostic);
|
|
}
|
|
}
|
|
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
|
|
}
|
|
function sortAndDeduplicate() {
|
|
if (!diagnosticsModified) {
|
|
return;
|
|
}
|
|
diagnosticsModified = false;
|
|
nonFileDiagnostics = ts.sortAndDeduplicateDiagnostics(nonFileDiagnostics);
|
|
for (var key in fileDiagnostics) {
|
|
if (ts.hasProperty(fileDiagnostics, key)) {
|
|
fileDiagnostics[key] = ts.sortAndDeduplicateDiagnostics(fileDiagnostics[key]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ts.createDiagnosticCollection = createDiagnosticCollection;
|
|
var escapedCharsRegExp = /[\\\"\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g;
|
|
var escapedCharsMap = {
|
|
"\0": "\\0",
|
|
"\t": "\\t",
|
|
"\v": "\\v",
|
|
"\f": "\\f",
|
|
"\b": "\\b",
|
|
"\r": "\\r",
|
|
"\n": "\\n",
|
|
"\\": "\\\\",
|
|
"\"": "\\\"",
|
|
"\u2028": "\\u2028",
|
|
"\u2029": "\\u2029",
|
|
"\u0085": "\\u0085"
|
|
};
|
|
function escapeString(s) {
|
|
s = escapedCharsRegExp.test(s) ? s.replace(escapedCharsRegExp, getReplacement) : s;
|
|
return s;
|
|
function getReplacement(c) {
|
|
return escapedCharsMap[c] || get16BitUnicodeEscapeSequence(c.charCodeAt(0));
|
|
}
|
|
}
|
|
ts.escapeString = escapeString;
|
|
function isIntrinsicJsxName(name) {
|
|
var ch = name.substr(0, 1);
|
|
return ch.toLowerCase() === ch;
|
|
}
|
|
ts.isIntrinsicJsxName = isIntrinsicJsxName;
|
|
function get16BitUnicodeEscapeSequence(charCode) {
|
|
var hexCharCode = charCode.toString(16).toUpperCase();
|
|
var paddedHexCode = ("0000" + hexCharCode).slice(-4);
|
|
return "\\u" + paddedHexCode;
|
|
}
|
|
var nonAsciiCharacters = /[^\u0000-\u007F]/g;
|
|
function escapeNonAsciiCharacters(s) {
|
|
return nonAsciiCharacters.test(s) ?
|
|
s.replace(nonAsciiCharacters, function (c) { return get16BitUnicodeEscapeSequence(c.charCodeAt(0)); }) :
|
|
s;
|
|
}
|
|
ts.escapeNonAsciiCharacters = escapeNonAsciiCharacters;
|
|
var indentStrings = ["", " "];
|
|
function getIndentString(level) {
|
|
if (indentStrings[level] === undefined) {
|
|
indentStrings[level] = getIndentString(level - 1) + indentStrings[1];
|
|
}
|
|
return indentStrings[level];
|
|
}
|
|
ts.getIndentString = getIndentString;
|
|
function getIndentSize() {
|
|
return indentStrings[1].length;
|
|
}
|
|
ts.getIndentSize = getIndentSize;
|
|
function createTextWriter(newLine) {
|
|
var output;
|
|
var indent;
|
|
var lineStart;
|
|
var lineCount;
|
|
var linePos;
|
|
function write(s) {
|
|
if (s && s.length) {
|
|
if (lineStart) {
|
|
output += getIndentString(indent);
|
|
lineStart = false;
|
|
}
|
|
output += s;
|
|
}
|
|
}
|
|
function reset() {
|
|
output = "";
|
|
indent = 0;
|
|
lineStart = true;
|
|
lineCount = 0;
|
|
linePos = 0;
|
|
}
|
|
function rawWrite(s) {
|
|
if (s !== undefined) {
|
|
if (lineStart) {
|
|
lineStart = false;
|
|
}
|
|
output += s;
|
|
}
|
|
}
|
|
function writeLiteral(s) {
|
|
if (s && s.length) {
|
|
write(s);
|
|
var lineStartsOfS = ts.computeLineStarts(s);
|
|
if (lineStartsOfS.length > 1) {
|
|
lineCount = lineCount + lineStartsOfS.length - 1;
|
|
linePos = output.length - s.length + ts.lastOrUndefined(lineStartsOfS);
|
|
}
|
|
}
|
|
}
|
|
function writeLine() {
|
|
if (!lineStart) {
|
|
output += newLine;
|
|
lineCount++;
|
|
linePos = output.length;
|
|
lineStart = true;
|
|
}
|
|
}
|
|
function writeTextOfNode(text, node) {
|
|
write(getTextOfNodeFromSourceText(text, node));
|
|
}
|
|
reset();
|
|
return {
|
|
write: write,
|
|
rawWrite: rawWrite,
|
|
writeTextOfNode: writeTextOfNode,
|
|
writeLiteral: writeLiteral,
|
|
writeLine: writeLine,
|
|
increaseIndent: function () { indent++; },
|
|
decreaseIndent: function () { indent--; },
|
|
getIndent: function () { return indent; },
|
|
getTextPos: function () { return output.length; },
|
|
getLine: function () { return lineCount + 1; },
|
|
getColumn: function () { return lineStart ? indent * getIndentSize() + 1 : output.length - linePos + 1; },
|
|
getText: function () { return output; },
|
|
reset: reset
|
|
};
|
|
}
|
|
ts.createTextWriter = createTextWriter;
|
|
function getExternalModuleNameFromPath(host, fileName) {
|
|
var getCanonicalFileName = function (f) { return host.getCanonicalFileName(f); };
|
|
var dir = ts.toPath(host.getCommonSourceDirectory(), host.getCurrentDirectory(), getCanonicalFileName);
|
|
var filePath = ts.getNormalizedAbsolutePath(fileName, host.getCurrentDirectory());
|
|
var relativePath = ts.getRelativePathToDirectoryOrUrl(dir, filePath, dir, getCanonicalFileName, false);
|
|
return ts.removeFileExtension(relativePath);
|
|
}
|
|
ts.getExternalModuleNameFromPath = getExternalModuleNameFromPath;
|
|
function getOwnEmitOutputFilePath(sourceFile, host, extension) {
|
|
var compilerOptions = host.getCompilerOptions();
|
|
var emitOutputFilePathWithoutExtension;
|
|
if (compilerOptions.outDir) {
|
|
emitOutputFilePathWithoutExtension = ts.removeFileExtension(getSourceFilePathInNewDir(sourceFile, host, compilerOptions.outDir));
|
|
}
|
|
else {
|
|
emitOutputFilePathWithoutExtension = ts.removeFileExtension(sourceFile.fileName);
|
|
}
|
|
return emitOutputFilePathWithoutExtension + extension;
|
|
}
|
|
ts.getOwnEmitOutputFilePath = getOwnEmitOutputFilePath;
|
|
function getDeclarationEmitOutputFilePath(sourceFile, host) {
|
|
var options = host.getCompilerOptions();
|
|
var outputDir = options.declarationDir || options.outDir;
|
|
if (options.declaration) {
|
|
var path = outputDir
|
|
? getSourceFilePathInNewDir(sourceFile, host, outputDir)
|
|
: sourceFile.fileName;
|
|
return ts.removeFileExtension(path) + ".d.ts";
|
|
}
|
|
}
|
|
ts.getDeclarationEmitOutputFilePath = getDeclarationEmitOutputFilePath;
|
|
function getEmitScriptTarget(compilerOptions) {
|
|
return compilerOptions.target || 0;
|
|
}
|
|
ts.getEmitScriptTarget = getEmitScriptTarget;
|
|
function getEmitModuleKind(compilerOptions) {
|
|
return typeof compilerOptions.module === "number" ?
|
|
compilerOptions.module :
|
|
getEmitScriptTarget(compilerOptions) === 2 ? ts.ModuleKind.ES6 : ts.ModuleKind.CommonJS;
|
|
}
|
|
ts.getEmitModuleKind = getEmitModuleKind;
|
|
function forEachExpectedEmitFile(host, action, targetSourceFile) {
|
|
var options = host.getCompilerOptions();
|
|
if (options.outFile || options.out) {
|
|
onBundledEmit(host);
|
|
}
|
|
else {
|
|
var sourceFiles = targetSourceFile === undefined ? host.getSourceFiles() : [targetSourceFile];
|
|
for (var _i = 0, sourceFiles_1 = sourceFiles; _i < sourceFiles_1.length; _i++) {
|
|
var sourceFile = sourceFiles_1[_i];
|
|
if (!isDeclarationFile(sourceFile) && !host.isSourceFileFromExternalLibrary(sourceFile)) {
|
|
onSingleFileEmit(host, sourceFile);
|
|
}
|
|
}
|
|
}
|
|
function onSingleFileEmit(host, sourceFile) {
|
|
var extension = ".js";
|
|
if (options.jsx === 1) {
|
|
if (isSourceFileJavaScript(sourceFile)) {
|
|
if (ts.fileExtensionIs(sourceFile.fileName, ".jsx")) {
|
|
extension = ".jsx";
|
|
}
|
|
}
|
|
else if (sourceFile.languageVariant === 1) {
|
|
extension = ".jsx";
|
|
}
|
|
}
|
|
var jsFilePath = getOwnEmitOutputFilePath(sourceFile, host, extension);
|
|
var emitFileNames = {
|
|
jsFilePath: jsFilePath,
|
|
sourceMapFilePath: getSourceMapFilePath(jsFilePath, options),
|
|
declarationFilePath: !isSourceFileJavaScript(sourceFile) ? getDeclarationEmitOutputFilePath(sourceFile, host) : undefined
|
|
};
|
|
action(emitFileNames, [sourceFile], false);
|
|
}
|
|
function onBundledEmit(host) {
|
|
var bundledSources = ts.filter(host.getSourceFiles(), function (sourceFile) { return !isDeclarationFile(sourceFile) &&
|
|
!host.isSourceFileFromExternalLibrary(sourceFile) &&
|
|
(!ts.isExternalModule(sourceFile) ||
|
|
!!getEmitModuleKind(options)); });
|
|
if (bundledSources.length) {
|
|
var jsFilePath = options.outFile || options.out;
|
|
var emitFileNames = {
|
|
jsFilePath: jsFilePath,
|
|
sourceMapFilePath: getSourceMapFilePath(jsFilePath, options),
|
|
declarationFilePath: options.declaration ? ts.removeFileExtension(jsFilePath) + ".d.ts" : undefined
|
|
};
|
|
action(emitFileNames, bundledSources, true);
|
|
}
|
|
}
|
|
function getSourceMapFilePath(jsFilePath, options) {
|
|
return options.sourceMap ? jsFilePath + ".map" : undefined;
|
|
}
|
|
}
|
|
ts.forEachExpectedEmitFile = forEachExpectedEmitFile;
|
|
function getSourceFilePathInNewDir(sourceFile, host, newDirPath) {
|
|
var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory());
|
|
var commonSourceDirectory = host.getCommonSourceDirectory();
|
|
var isSourceFileInCommonSourceDirectory = host.getCanonicalFileName(sourceFilePath).indexOf(host.getCanonicalFileName(commonSourceDirectory)) === 0;
|
|
sourceFilePath = isSourceFileInCommonSourceDirectory ? sourceFilePath.substring(commonSourceDirectory.length) : sourceFilePath;
|
|
return ts.combinePaths(newDirPath, sourceFilePath);
|
|
}
|
|
ts.getSourceFilePathInNewDir = getSourceFilePathInNewDir;
|
|
function writeFile(host, diagnostics, fileName, data, writeByteOrderMark, sourceFiles) {
|
|
host.writeFile(fileName, data, writeByteOrderMark, function (hostErrorMessage) {
|
|
diagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Could_not_write_file_0_Colon_1, fileName, hostErrorMessage));
|
|
}, sourceFiles);
|
|
}
|
|
ts.writeFile = writeFile;
|
|
function getLineOfLocalPosition(currentSourceFile, pos) {
|
|
return ts.getLineAndCharacterOfPosition(currentSourceFile, pos).line;
|
|
}
|
|
ts.getLineOfLocalPosition = getLineOfLocalPosition;
|
|
function getLineOfLocalPositionFromLineMap(lineMap, pos) {
|
|
return ts.computeLineAndCharacterOfPosition(lineMap, pos).line;
|
|
}
|
|
ts.getLineOfLocalPositionFromLineMap = getLineOfLocalPositionFromLineMap;
|
|
function getFirstConstructorWithBody(node) {
|
|
return ts.forEach(node.members, function (member) {
|
|
if (member.kind === 148 && nodeIsPresent(member.body)) {
|
|
return member;
|
|
}
|
|
});
|
|
}
|
|
ts.getFirstConstructorWithBody = getFirstConstructorWithBody;
|
|
function getSetAccessorTypeAnnotationNode(accessor) {
|
|
if (accessor && accessor.parameters.length > 0) {
|
|
var hasThis = accessor.parameters.length === 2 &&
|
|
accessor.parameters[0].name.kind === 69 &&
|
|
accessor.parameters[0].name.originalKeywordKind === 97;
|
|
return accessor.parameters[hasThis ? 1 : 0].type;
|
|
}
|
|
}
|
|
ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode;
|
|
function getAllAccessorDeclarations(declarations, accessor) {
|
|
var firstAccessor;
|
|
var secondAccessor;
|
|
var getAccessor;
|
|
var setAccessor;
|
|
if (hasDynamicName(accessor)) {
|
|
firstAccessor = accessor;
|
|
if (accessor.kind === 149) {
|
|
getAccessor = accessor;
|
|
}
|
|
else if (accessor.kind === 150) {
|
|
setAccessor = accessor;
|
|
}
|
|
else {
|
|
ts.Debug.fail("Accessor has wrong kind");
|
|
}
|
|
}
|
|
else {
|
|
ts.forEach(declarations, function (member) {
|
|
if ((member.kind === 149 || member.kind === 150)
|
|
&& (member.flags & 32) === (accessor.flags & 32)) {
|
|
var memberName = getPropertyNameForPropertyNameNode(member.name);
|
|
var accessorName = getPropertyNameForPropertyNameNode(accessor.name);
|
|
if (memberName === accessorName) {
|
|
if (!firstAccessor) {
|
|
firstAccessor = member;
|
|
}
|
|
else if (!secondAccessor) {
|
|
secondAccessor = member;
|
|
}
|
|
if (member.kind === 149 && !getAccessor) {
|
|
getAccessor = member;
|
|
}
|
|
if (member.kind === 150 && !setAccessor) {
|
|
setAccessor = member;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return {
|
|
firstAccessor: firstAccessor,
|
|
secondAccessor: secondAccessor,
|
|
getAccessor: getAccessor,
|
|
setAccessor: setAccessor
|
|
};
|
|
}
|
|
ts.getAllAccessorDeclarations = getAllAccessorDeclarations;
|
|
function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) {
|
|
if (leadingComments && leadingComments.length && node.pos !== leadingComments[0].pos &&
|
|
getLineOfLocalPositionFromLineMap(lineMap, node.pos) !== getLineOfLocalPositionFromLineMap(lineMap, leadingComments[0].pos)) {
|
|
writer.writeLine();
|
|
}
|
|
}
|
|
ts.emitNewLineBeforeLeadingComments = emitNewLineBeforeLeadingComments;
|
|
function emitComments(text, lineMap, writer, comments, trailingSeparator, newLine, writeComment) {
|
|
var emitLeadingSpace = !trailingSeparator;
|
|
ts.forEach(comments, function (comment) {
|
|
if (emitLeadingSpace) {
|
|
writer.write(" ");
|
|
emitLeadingSpace = false;
|
|
}
|
|
writeComment(text, lineMap, writer, comment, newLine);
|
|
if (comment.hasTrailingNewLine) {
|
|
writer.writeLine();
|
|
}
|
|
else if (trailingSeparator) {
|
|
writer.write(" ");
|
|
}
|
|
else {
|
|
emitLeadingSpace = true;
|
|
}
|
|
});
|
|
}
|
|
ts.emitComments = emitComments;
|
|
function emitDetachedComments(text, lineMap, writer, writeComment, node, newLine, removeComments) {
|
|
var leadingComments;
|
|
var currentDetachedCommentInfo;
|
|
if (removeComments) {
|
|
if (node.pos === 0) {
|
|
leadingComments = ts.filter(ts.getLeadingCommentRanges(text, node.pos), isPinnedComment);
|
|
}
|
|
}
|
|
else {
|
|
leadingComments = ts.getLeadingCommentRanges(text, node.pos);
|
|
}
|
|
if (leadingComments) {
|
|
var detachedComments = [];
|
|
var lastComment = void 0;
|
|
for (var _i = 0, leadingComments_1 = leadingComments; _i < leadingComments_1.length; _i++) {
|
|
var comment = leadingComments_1[_i];
|
|
if (lastComment) {
|
|
var lastCommentLine = getLineOfLocalPositionFromLineMap(lineMap, lastComment.end);
|
|
var commentLine = getLineOfLocalPositionFromLineMap(lineMap, comment.pos);
|
|
if (commentLine >= lastCommentLine + 2) {
|
|
break;
|
|
}
|
|
}
|
|
detachedComments.push(comment);
|
|
lastComment = comment;
|
|
}
|
|
if (detachedComments.length) {
|
|
var lastCommentLine = getLineOfLocalPositionFromLineMap(lineMap, ts.lastOrUndefined(detachedComments).end);
|
|
var nodeLine = getLineOfLocalPositionFromLineMap(lineMap, ts.skipTrivia(text, node.pos));
|
|
if (nodeLine >= lastCommentLine + 2) {
|
|
emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments);
|
|
emitComments(text, lineMap, writer, detachedComments, true, newLine, writeComment);
|
|
currentDetachedCommentInfo = { nodePos: node.pos, detachedCommentEndPos: ts.lastOrUndefined(detachedComments).end };
|
|
}
|
|
}
|
|
}
|
|
return currentDetachedCommentInfo;
|
|
function isPinnedComment(comment) {
|
|
return text.charCodeAt(comment.pos + 1) === 42 &&
|
|
text.charCodeAt(comment.pos + 2) === 33;
|
|
}
|
|
}
|
|
ts.emitDetachedComments = emitDetachedComments;
|
|
function writeCommentRange(text, lineMap, writer, comment, newLine) {
|
|
if (text.charCodeAt(comment.pos + 1) === 42) {
|
|
var firstCommentLineAndCharacter = ts.computeLineAndCharacterOfPosition(lineMap, comment.pos);
|
|
var lineCount = lineMap.length;
|
|
var firstCommentLineIndent = void 0;
|
|
for (var pos = comment.pos, currentLine = firstCommentLineAndCharacter.line; pos < comment.end; currentLine++) {
|
|
var nextLineStart = (currentLine + 1) === lineCount
|
|
? text.length + 1
|
|
: lineMap[currentLine + 1];
|
|
if (pos !== comment.pos) {
|
|
if (firstCommentLineIndent === undefined) {
|
|
firstCommentLineIndent = calculateIndent(text, lineMap[firstCommentLineAndCharacter.line], comment.pos);
|
|
}
|
|
var currentWriterIndentSpacing = writer.getIndent() * getIndentSize();
|
|
var spacesToEmit = currentWriterIndentSpacing - firstCommentLineIndent + calculateIndent(text, pos, nextLineStart);
|
|
if (spacesToEmit > 0) {
|
|
var numberOfSingleSpacesToEmit = spacesToEmit % getIndentSize();
|
|
var indentSizeSpaceString = getIndentString((spacesToEmit - numberOfSingleSpacesToEmit) / getIndentSize());
|
|
writer.rawWrite(indentSizeSpaceString);
|
|
while (numberOfSingleSpacesToEmit) {
|
|
writer.rawWrite(" ");
|
|
numberOfSingleSpacesToEmit--;
|
|
}
|
|
}
|
|
else {
|
|
writer.rawWrite("");
|
|
}
|
|
}
|
|
writeTrimmedCurrentLine(text, comment, writer, newLine, pos, nextLineStart);
|
|
pos = nextLineStart;
|
|
}
|
|
}
|
|
else {
|
|
writer.write(text.substring(comment.pos, comment.end));
|
|
}
|
|
}
|
|
ts.writeCommentRange = writeCommentRange;
|
|
function writeTrimmedCurrentLine(text, comment, writer, newLine, pos, nextLineStart) {
|
|
var end = Math.min(comment.end, nextLineStart - 1);
|
|
var currentLineText = text.substring(pos, end).replace(/^\s+|\s+$/g, "");
|
|
if (currentLineText) {
|
|
writer.write(currentLineText);
|
|
if (end !== comment.end) {
|
|
writer.writeLine();
|
|
}
|
|
}
|
|
else {
|
|
writer.writeLiteral(newLine);
|
|
}
|
|
}
|
|
function calculateIndent(text, pos, end) {
|
|
var currentLineIndent = 0;
|
|
for (; pos < end && ts.isWhiteSpaceSingleLine(text.charCodeAt(pos)); pos++) {
|
|
if (text.charCodeAt(pos) === 9) {
|
|
currentLineIndent += getIndentSize() - (currentLineIndent % getIndentSize());
|
|
}
|
|
else {
|
|
currentLineIndent++;
|
|
}
|
|
}
|
|
return currentLineIndent;
|
|
}
|
|
function modifierToFlag(token) {
|
|
switch (token) {
|
|
case 113: return 32;
|
|
case 112: return 4;
|
|
case 111: return 16;
|
|
case 110: return 8;
|
|
case 115: return 128;
|
|
case 82: return 1;
|
|
case 122: return 2;
|
|
case 74: return 2048;
|
|
case 77: return 512;
|
|
case 118: return 256;
|
|
case 128: return 64;
|
|
}
|
|
return 0;
|
|
}
|
|
ts.modifierToFlag = modifierToFlag;
|
|
function isLeftHandSideExpression(expr) {
|
|
if (expr) {
|
|
switch (expr.kind) {
|
|
case 172:
|
|
case 173:
|
|
case 175:
|
|
case 174:
|
|
case 196:
|
|
case 241:
|
|
case 242:
|
|
case 176:
|
|
case 170:
|
|
case 178:
|
|
case 171:
|
|
case 192:
|
|
case 179:
|
|
case 69:
|
|
case 10:
|
|
case 8:
|
|
case 9:
|
|
case 11:
|
|
case 189:
|
|
case 84:
|
|
case 93:
|
|
case 97:
|
|
case 99:
|
|
case 95:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
ts.isLeftHandSideExpression = isLeftHandSideExpression;
|
|
function isAssignmentOperator(token) {
|
|
return token >= 56 && token <= 68;
|
|
}
|
|
ts.isAssignmentOperator = isAssignmentOperator;
|
|
function isExpressionWithTypeArgumentsInClassExtendsClause(node) {
|
|
return node.kind === 194 &&
|
|
node.parent.token === 83 &&
|
|
isClassLike(node.parent.parent);
|
|
}
|
|
ts.isExpressionWithTypeArgumentsInClassExtendsClause = isExpressionWithTypeArgumentsInClassExtendsClause;
|
|
function isSupportedExpressionWithTypeArguments(node) {
|
|
return isSupportedExpressionWithTypeArgumentsRest(node.expression);
|
|
}
|
|
ts.isSupportedExpressionWithTypeArguments = isSupportedExpressionWithTypeArguments;
|
|
function isSupportedExpressionWithTypeArgumentsRest(node) {
|
|
if (node.kind === 69) {
|
|
return true;
|
|
}
|
|
else if (isPropertyAccessExpression(node)) {
|
|
return isSupportedExpressionWithTypeArgumentsRest(node.expression);
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
function isRightSideOfQualifiedNameOrPropertyAccess(node) {
|
|
return (node.parent.kind === 139 && node.parent.right === node) ||
|
|
(node.parent.kind === 172 && node.parent.name === node);
|
|
}
|
|
ts.isRightSideOfQualifiedNameOrPropertyAccess = isRightSideOfQualifiedNameOrPropertyAccess;
|
|
function isEmptyObjectLiteralOrArrayLiteral(expression) {
|
|
var kind = expression.kind;
|
|
if (kind === 171) {
|
|
return expression.properties.length === 0;
|
|
}
|
|
if (kind === 170) {
|
|
return expression.elements.length === 0;
|
|
}
|
|
return false;
|
|
}
|
|
ts.isEmptyObjectLiteralOrArrayLiteral = isEmptyObjectLiteralOrArrayLiteral;
|
|
function getLocalSymbolForExportDefault(symbol) {
|
|
return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & 512) ? symbol.valueDeclaration.localSymbol : undefined;
|
|
}
|
|
ts.getLocalSymbolForExportDefault = getLocalSymbolForExportDefault;
|
|
function hasJavaScriptFileExtension(fileName) {
|
|
return ts.forEach(ts.supportedJavascriptExtensions, function (extension) { return ts.fileExtensionIs(fileName, extension); });
|
|
}
|
|
ts.hasJavaScriptFileExtension = hasJavaScriptFileExtension;
|
|
function hasTypeScriptFileExtension(fileName) {
|
|
return ts.forEach(ts.supportedTypeScriptExtensions, function (extension) { return ts.fileExtensionIs(fileName, extension); });
|
|
}
|
|
ts.hasTypeScriptFileExtension = hasTypeScriptFileExtension;
|
|
function getExpandedCharCodes(input) {
|
|
var output = [];
|
|
var length = input.length;
|
|
for (var i = 0; i < length; i++) {
|
|
var charCode = input.charCodeAt(i);
|
|
if (charCode < 0x80) {
|
|
output.push(charCode);
|
|
}
|
|
else if (charCode < 0x800) {
|
|
output.push((charCode >> 6) | 192);
|
|
output.push((charCode & 63) | 128);
|
|
}
|
|
else if (charCode < 0x10000) {
|
|
output.push((charCode >> 12) | 224);
|
|
output.push(((charCode >> 6) & 63) | 128);
|
|
output.push((charCode & 63) | 128);
|
|
}
|
|
else if (charCode < 0x20000) {
|
|
output.push((charCode >> 18) | 240);
|
|
output.push(((charCode >> 12) & 63) | 128);
|
|
output.push(((charCode >> 6) & 63) | 128);
|
|
output.push((charCode & 63) | 128);
|
|
}
|
|
else {
|
|
ts.Debug.assert(false, "Unexpected code point");
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
ts.stringify = typeof JSON !== "undefined" && JSON.stringify
|
|
? JSON.stringify
|
|
: stringifyFallback;
|
|
function stringifyFallback(value) {
|
|
return value === undefined ? undefined : stringifyValue(value);
|
|
}
|
|
function stringifyValue(value) {
|
|
return typeof value === "string" ? "\"" + escapeString(value) + "\""
|
|
: typeof value === "number" ? isFinite(value) ? String(value) : "null"
|
|
: typeof value === "boolean" ? value ? "true" : "false"
|
|
: typeof value === "object" && value ? ts.isArray(value) ? cycleCheck(stringifyArray, value) : cycleCheck(stringifyObject, value)
|
|
: "null";
|
|
}
|
|
function cycleCheck(cb, value) {
|
|
ts.Debug.assert(!value.hasOwnProperty("__cycle"), "Converting circular structure to JSON");
|
|
value.__cycle = true;
|
|
var result = cb(value);
|
|
delete value.__cycle;
|
|
return result;
|
|
}
|
|
function stringifyArray(value) {
|
|
return "[" + ts.reduceLeft(value, stringifyElement, "") + "]";
|
|
}
|
|
function stringifyElement(memo, value) {
|
|
return (memo ? memo + "," : memo) + stringifyValue(value);
|
|
}
|
|
function stringifyObject(value) {
|
|
return "{" + ts.reduceProperties(value, stringifyProperty, "") + "}";
|
|
}
|
|
function stringifyProperty(memo, value, key) {
|
|
return value === undefined || typeof value === "function" || key === "__cycle" ? memo
|
|
: (memo ? memo + "," : memo) + ("\"" + escapeString(key) + "\":" + stringifyValue(value));
|
|
}
|
|
var base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
function convertToBase64(input) {
|
|
var result = "";
|
|
var charCodes = getExpandedCharCodes(input);
|
|
var i = 0;
|
|
var length = charCodes.length;
|
|
var byte1, byte2, byte3, byte4;
|
|
while (i < length) {
|
|
byte1 = charCodes[i] >> 2;
|
|
byte2 = (charCodes[i] & 3) << 4 | charCodes[i + 1] >> 4;
|
|
byte3 = (charCodes[i + 1] & 15) << 2 | charCodes[i + 2] >> 6;
|
|
byte4 = charCodes[i + 2] & 63;
|
|
if (i + 1 >= length) {
|
|
byte3 = byte4 = 64;
|
|
}
|
|
else if (i + 2 >= length) {
|
|
byte4 = 64;
|
|
}
|
|
result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
|
|
i += 3;
|
|
}
|
|
return result;
|
|
}
|
|
ts.convertToBase64 = convertToBase64;
|
|
function convertToRelativePath(absoluteOrRelativePath, basePath, getCanonicalFileName) {
|
|
return !ts.isRootedDiskPath(absoluteOrRelativePath)
|
|
? absoluteOrRelativePath
|
|
: ts.getRelativePathToDirectoryOrUrl(basePath, absoluteOrRelativePath, basePath, getCanonicalFileName, false);
|
|
}
|
|
ts.convertToRelativePath = convertToRelativePath;
|
|
var carriageReturnLineFeed = "\r\n";
|
|
var lineFeed = "\n";
|
|
function getNewLineCharacter(options) {
|
|
if (options.newLine === 0) {
|
|
return carriageReturnLineFeed;
|
|
}
|
|
else if (options.newLine === 1) {
|
|
return lineFeed;
|
|
}
|
|
else if (ts.sys) {
|
|
return ts.sys.newLine;
|
|
}
|
|
return carriageReturnLineFeed;
|
|
}
|
|
ts.getNewLineCharacter = getNewLineCharacter;
|
|
function isWatchSet(options) {
|
|
return options.watch && options.hasOwnProperty("watch");
|
|
}
|
|
ts.isWatchSet = isWatchSet;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function getDefaultLibFileName(options) {
|
|
return options.target === 2 ? "lib.es6.d.ts" : "lib.d.ts";
|
|
}
|
|
ts.getDefaultLibFileName = getDefaultLibFileName;
|
|
function textSpanEnd(span) {
|
|
return span.start + span.length;
|
|
}
|
|
ts.textSpanEnd = textSpanEnd;
|
|
function textSpanIsEmpty(span) {
|
|
return span.length === 0;
|
|
}
|
|
ts.textSpanIsEmpty = textSpanIsEmpty;
|
|
function textSpanContainsPosition(span, position) {
|
|
return position >= span.start && position < textSpanEnd(span);
|
|
}
|
|
ts.textSpanContainsPosition = textSpanContainsPosition;
|
|
function textSpanContainsTextSpan(span, other) {
|
|
return other.start >= span.start && textSpanEnd(other) <= textSpanEnd(span);
|
|
}
|
|
ts.textSpanContainsTextSpan = textSpanContainsTextSpan;
|
|
function textSpanOverlapsWith(span, other) {
|
|
var overlapStart = Math.max(span.start, other.start);
|
|
var overlapEnd = Math.min(textSpanEnd(span), textSpanEnd(other));
|
|
return overlapStart < overlapEnd;
|
|
}
|
|
ts.textSpanOverlapsWith = textSpanOverlapsWith;
|
|
function textSpanOverlap(span1, span2) {
|
|
var overlapStart = Math.max(span1.start, span2.start);
|
|
var overlapEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
|
|
if (overlapStart < overlapEnd) {
|
|
return createTextSpanFromBounds(overlapStart, overlapEnd);
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.textSpanOverlap = textSpanOverlap;
|
|
function textSpanIntersectsWithTextSpan(span, other) {
|
|
return other.start <= textSpanEnd(span) && textSpanEnd(other) >= span.start;
|
|
}
|
|
ts.textSpanIntersectsWithTextSpan = textSpanIntersectsWithTextSpan;
|
|
function textSpanIntersectsWith(span, start, length) {
|
|
var end = start + length;
|
|
return start <= textSpanEnd(span) && end >= span.start;
|
|
}
|
|
ts.textSpanIntersectsWith = textSpanIntersectsWith;
|
|
function decodedTextSpanIntersectsWith(start1, length1, start2, length2) {
|
|
var end1 = start1 + length1;
|
|
var end2 = start2 + length2;
|
|
return start2 <= end1 && end2 >= start1;
|
|
}
|
|
ts.decodedTextSpanIntersectsWith = decodedTextSpanIntersectsWith;
|
|
function textSpanIntersectsWithPosition(span, position) {
|
|
return position <= textSpanEnd(span) && position >= span.start;
|
|
}
|
|
ts.textSpanIntersectsWithPosition = textSpanIntersectsWithPosition;
|
|
function textSpanIntersection(span1, span2) {
|
|
var intersectStart = Math.max(span1.start, span2.start);
|
|
var intersectEnd = Math.min(textSpanEnd(span1), textSpanEnd(span2));
|
|
if (intersectStart <= intersectEnd) {
|
|
return createTextSpanFromBounds(intersectStart, intersectEnd);
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.textSpanIntersection = textSpanIntersection;
|
|
function createTextSpan(start, length) {
|
|
if (start < 0) {
|
|
throw new Error("start < 0");
|
|
}
|
|
if (length < 0) {
|
|
throw new Error("length < 0");
|
|
}
|
|
return { start: start, length: length };
|
|
}
|
|
ts.createTextSpan = createTextSpan;
|
|
function createTextSpanFromBounds(start, end) {
|
|
return createTextSpan(start, end - start);
|
|
}
|
|
ts.createTextSpanFromBounds = createTextSpanFromBounds;
|
|
function textChangeRangeNewSpan(range) {
|
|
return createTextSpan(range.span.start, range.newLength);
|
|
}
|
|
ts.textChangeRangeNewSpan = textChangeRangeNewSpan;
|
|
function textChangeRangeIsUnchanged(range) {
|
|
return textSpanIsEmpty(range.span) && range.newLength === 0;
|
|
}
|
|
ts.textChangeRangeIsUnchanged = textChangeRangeIsUnchanged;
|
|
function createTextChangeRange(span, newLength) {
|
|
if (newLength < 0) {
|
|
throw new Error("newLength < 0");
|
|
}
|
|
return { span: span, newLength: newLength };
|
|
}
|
|
ts.createTextChangeRange = createTextChangeRange;
|
|
ts.unchangedTextChangeRange = createTextChangeRange(createTextSpan(0, 0), 0);
|
|
function collapseTextChangeRangesAcrossMultipleVersions(changes) {
|
|
if (changes.length === 0) {
|
|
return ts.unchangedTextChangeRange;
|
|
}
|
|
if (changes.length === 1) {
|
|
return changes[0];
|
|
}
|
|
var change0 = changes[0];
|
|
var oldStartN = change0.span.start;
|
|
var oldEndN = textSpanEnd(change0.span);
|
|
var newEndN = oldStartN + change0.newLength;
|
|
for (var i = 1; i < changes.length; i++) {
|
|
var nextChange = changes[i];
|
|
var oldStart1 = oldStartN;
|
|
var oldEnd1 = oldEndN;
|
|
var newEnd1 = newEndN;
|
|
var oldStart2 = nextChange.span.start;
|
|
var oldEnd2 = textSpanEnd(nextChange.span);
|
|
var newEnd2 = oldStart2 + nextChange.newLength;
|
|
oldStartN = Math.min(oldStart1, oldStart2);
|
|
oldEndN = Math.max(oldEnd1, oldEnd1 + (oldEnd2 - newEnd1));
|
|
newEndN = Math.max(newEnd2, newEnd2 + (newEnd1 - oldEnd2));
|
|
}
|
|
return createTextChangeRange(createTextSpanFromBounds(oldStartN, oldEndN), newEndN - oldStartN);
|
|
}
|
|
ts.collapseTextChangeRangesAcrossMultipleVersions = collapseTextChangeRangesAcrossMultipleVersions;
|
|
function getTypeParameterOwner(d) {
|
|
if (d && d.kind === 141) {
|
|
for (var current = d; current; current = current.parent) {
|
|
if (ts.isFunctionLike(current) || ts.isClassLike(current) || current.kind === 222) {
|
|
return current;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ts.getTypeParameterOwner = getTypeParameterOwner;
|
|
function isParameterPropertyDeclaration(node) {
|
|
return node.flags & 92 && node.parent.kind === 148 && ts.isClassLike(node.parent.parent);
|
|
}
|
|
ts.isParameterPropertyDeclaration = isParameterPropertyDeclaration;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.parseTime = 0;
|
|
var NodeConstructor;
|
|
var TokenConstructor;
|
|
var IdentifierConstructor;
|
|
var SourceFileConstructor;
|
|
function createNode(kind, pos, end) {
|
|
if (kind === 256) {
|
|
return new (SourceFileConstructor || (SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor()))(kind, pos, end);
|
|
}
|
|
else if (kind === 69) {
|
|
return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end);
|
|
}
|
|
else if (kind < 139) {
|
|
return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end);
|
|
}
|
|
else {
|
|
return new (NodeConstructor || (NodeConstructor = ts.objectAllocator.getNodeConstructor()))(kind, pos, end);
|
|
}
|
|
}
|
|
ts.createNode = createNode;
|
|
function visitNode(cbNode, node) {
|
|
if (node) {
|
|
return cbNode(node);
|
|
}
|
|
}
|
|
function visitNodeArray(cbNodes, nodes) {
|
|
if (nodes) {
|
|
return cbNodes(nodes);
|
|
}
|
|
}
|
|
function visitEachNode(cbNode, nodes) {
|
|
if (nodes) {
|
|
for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
|
|
var node = nodes_1[_i];
|
|
var result = cbNode(node);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function forEachChild(node, cbNode, cbNodeArray) {
|
|
if (!node) {
|
|
return;
|
|
}
|
|
var visitNodes = cbNodeArray ? visitNodeArray : visitEachNode;
|
|
var cbNodes = cbNodeArray || cbNode;
|
|
switch (node.kind) {
|
|
case 139:
|
|
return visitNode(cbNode, node.left) ||
|
|
visitNode(cbNode, node.right);
|
|
case 141:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.constraint) ||
|
|
visitNode(cbNode, node.expression);
|
|
case 254:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.questionToken) ||
|
|
visitNode(cbNode, node.equalsToken) ||
|
|
visitNode(cbNode, node.objectAssignmentInitializer);
|
|
case 142:
|
|
case 145:
|
|
case 144:
|
|
case 253:
|
|
case 218:
|
|
case 169:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.propertyName) ||
|
|
visitNode(cbNode, node.dotDotDotToken) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.questionToken) ||
|
|
visitNode(cbNode, node.type) ||
|
|
visitNode(cbNode, node.initializer);
|
|
case 156:
|
|
case 157:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNodes(cbNodes, node.typeParameters) ||
|
|
visitNodes(cbNodes, node.parameters) ||
|
|
visitNode(cbNode, node.type);
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 179:
|
|
case 220:
|
|
case 180:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.asteriskToken) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.questionToken) ||
|
|
visitNodes(cbNodes, node.typeParameters) ||
|
|
visitNodes(cbNodes, node.parameters) ||
|
|
visitNode(cbNode, node.type) ||
|
|
visitNode(cbNode, node.equalsGreaterThanToken) ||
|
|
visitNode(cbNode, node.body);
|
|
case 155:
|
|
return visitNode(cbNode, node.typeName) ||
|
|
visitNodes(cbNodes, node.typeArguments);
|
|
case 154:
|
|
return visitNode(cbNode, node.parameterName) ||
|
|
visitNode(cbNode, node.type);
|
|
case 158:
|
|
return visitNode(cbNode, node.exprName);
|
|
case 159:
|
|
return visitNodes(cbNodes, node.members);
|
|
case 160:
|
|
return visitNode(cbNode, node.elementType);
|
|
case 161:
|
|
return visitNodes(cbNodes, node.elementTypes);
|
|
case 162:
|
|
case 163:
|
|
return visitNodes(cbNodes, node.types);
|
|
case 164:
|
|
return visitNode(cbNode, node.type);
|
|
case 167:
|
|
case 168:
|
|
return visitNodes(cbNodes, node.elements);
|
|
case 170:
|
|
return visitNodes(cbNodes, node.elements);
|
|
case 171:
|
|
return visitNodes(cbNodes, node.properties);
|
|
case 172:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.name);
|
|
case 173:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.argumentExpression);
|
|
case 174:
|
|
case 175:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNodes(cbNodes, node.typeArguments) ||
|
|
visitNodes(cbNodes, node.arguments);
|
|
case 176:
|
|
return visitNode(cbNode, node.tag) ||
|
|
visitNode(cbNode, node.template);
|
|
case 177:
|
|
return visitNode(cbNode, node.type) ||
|
|
visitNode(cbNode, node.expression);
|
|
case 178:
|
|
return visitNode(cbNode, node.expression);
|
|
case 181:
|
|
return visitNode(cbNode, node.expression);
|
|
case 182:
|
|
return visitNode(cbNode, node.expression);
|
|
case 183:
|
|
return visitNode(cbNode, node.expression);
|
|
case 185:
|
|
return visitNode(cbNode, node.operand);
|
|
case 190:
|
|
return visitNode(cbNode, node.asteriskToken) ||
|
|
visitNode(cbNode, node.expression);
|
|
case 184:
|
|
return visitNode(cbNode, node.expression);
|
|
case 186:
|
|
return visitNode(cbNode, node.operand);
|
|
case 187:
|
|
return visitNode(cbNode, node.left) ||
|
|
visitNode(cbNode, node.operatorToken) ||
|
|
visitNode(cbNode, node.right);
|
|
case 195:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.type);
|
|
case 196:
|
|
return visitNode(cbNode, node.expression);
|
|
case 188:
|
|
return visitNode(cbNode, node.condition) ||
|
|
visitNode(cbNode, node.questionToken) ||
|
|
visitNode(cbNode, node.whenTrue) ||
|
|
visitNode(cbNode, node.colonToken) ||
|
|
visitNode(cbNode, node.whenFalse);
|
|
case 191:
|
|
return visitNode(cbNode, node.expression);
|
|
case 199:
|
|
case 226:
|
|
return visitNodes(cbNodes, node.statements);
|
|
case 256:
|
|
return visitNodes(cbNodes, node.statements) ||
|
|
visitNode(cbNode, node.endOfFileToken);
|
|
case 200:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.declarationList);
|
|
case 219:
|
|
return visitNodes(cbNodes, node.declarations);
|
|
case 202:
|
|
return visitNode(cbNode, node.expression);
|
|
case 203:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.thenStatement) ||
|
|
visitNode(cbNode, node.elseStatement);
|
|
case 204:
|
|
return visitNode(cbNode, node.statement) ||
|
|
visitNode(cbNode, node.expression);
|
|
case 205:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 206:
|
|
return visitNode(cbNode, node.initializer) ||
|
|
visitNode(cbNode, node.condition) ||
|
|
visitNode(cbNode, node.incrementor) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 207:
|
|
return visitNode(cbNode, node.initializer) ||
|
|
visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 208:
|
|
return visitNode(cbNode, node.initializer) ||
|
|
visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 209:
|
|
case 210:
|
|
return visitNode(cbNode, node.label);
|
|
case 211:
|
|
return visitNode(cbNode, node.expression);
|
|
case 212:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 213:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNode(cbNode, node.caseBlock);
|
|
case 227:
|
|
return visitNodes(cbNodes, node.clauses);
|
|
case 249:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNodes(cbNodes, node.statements);
|
|
case 250:
|
|
return visitNodes(cbNodes, node.statements);
|
|
case 214:
|
|
return visitNode(cbNode, node.label) ||
|
|
visitNode(cbNode, node.statement);
|
|
case 215:
|
|
return visitNode(cbNode, node.expression);
|
|
case 216:
|
|
return visitNode(cbNode, node.tryBlock) ||
|
|
visitNode(cbNode, node.catchClause) ||
|
|
visitNode(cbNode, node.finallyBlock);
|
|
case 252:
|
|
return visitNode(cbNode, node.variableDeclaration) ||
|
|
visitNode(cbNode, node.block);
|
|
case 143:
|
|
return visitNode(cbNode, node.expression);
|
|
case 221:
|
|
case 192:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNodes(cbNodes, node.typeParameters) ||
|
|
visitNodes(cbNodes, node.heritageClauses) ||
|
|
visitNodes(cbNodes, node.members);
|
|
case 222:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNodes(cbNodes, node.typeParameters) ||
|
|
visitNodes(cbNodes, node.heritageClauses) ||
|
|
visitNodes(cbNodes, node.members);
|
|
case 223:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNodes(cbNodes, node.typeParameters) ||
|
|
visitNode(cbNode, node.type);
|
|
case 224:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNodes(cbNodes, node.members);
|
|
case 255:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.initializer);
|
|
case 225:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.body);
|
|
case 229:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.moduleReference);
|
|
case 230:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.importClause) ||
|
|
visitNode(cbNode, node.moduleSpecifier);
|
|
case 231:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.namedBindings);
|
|
case 228:
|
|
return visitNode(cbNode, node.name);
|
|
case 232:
|
|
return visitNode(cbNode, node.name);
|
|
case 233:
|
|
case 237:
|
|
return visitNodes(cbNodes, node.elements);
|
|
case 236:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.exportClause) ||
|
|
visitNode(cbNode, node.moduleSpecifier);
|
|
case 234:
|
|
case 238:
|
|
return visitNode(cbNode, node.propertyName) ||
|
|
visitNode(cbNode, node.name);
|
|
case 235:
|
|
return visitNodes(cbNodes, node.decorators) ||
|
|
visitNodes(cbNodes, node.modifiers) ||
|
|
visitNode(cbNode, node.expression);
|
|
case 189:
|
|
return visitNode(cbNode, node.head) || visitNodes(cbNodes, node.templateSpans);
|
|
case 197:
|
|
return visitNode(cbNode, node.expression) || visitNode(cbNode, node.literal);
|
|
case 140:
|
|
return visitNode(cbNode, node.expression);
|
|
case 251:
|
|
return visitNodes(cbNodes, node.types);
|
|
case 194:
|
|
return visitNode(cbNode, node.expression) ||
|
|
visitNodes(cbNodes, node.typeArguments);
|
|
case 240:
|
|
return visitNode(cbNode, node.expression);
|
|
case 239:
|
|
return visitNodes(cbNodes, node.decorators);
|
|
case 241:
|
|
return visitNode(cbNode, node.openingElement) ||
|
|
visitNodes(cbNodes, node.children) ||
|
|
visitNode(cbNode, node.closingElement);
|
|
case 242:
|
|
case 243:
|
|
return visitNode(cbNode, node.tagName) ||
|
|
visitNodes(cbNodes, node.attributes);
|
|
case 246:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.initializer);
|
|
case 247:
|
|
return visitNode(cbNode, node.expression);
|
|
case 248:
|
|
return visitNode(cbNode, node.expression);
|
|
case 245:
|
|
return visitNode(cbNode, node.tagName);
|
|
case 257:
|
|
return visitNode(cbNode, node.type);
|
|
case 261:
|
|
return visitNodes(cbNodes, node.types);
|
|
case 262:
|
|
return visitNodes(cbNodes, node.types);
|
|
case 260:
|
|
return visitNode(cbNode, node.elementType);
|
|
case 264:
|
|
return visitNode(cbNode, node.type);
|
|
case 263:
|
|
return visitNode(cbNode, node.type);
|
|
case 265:
|
|
return visitNodes(cbNodes, node.members);
|
|
case 267:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNodes(cbNodes, node.typeArguments);
|
|
case 268:
|
|
return visitNode(cbNode, node.type);
|
|
case 269:
|
|
return visitNodes(cbNodes, node.parameters) ||
|
|
visitNode(cbNode, node.type);
|
|
case 270:
|
|
return visitNode(cbNode, node.type);
|
|
case 271:
|
|
return visitNode(cbNode, node.type);
|
|
case 272:
|
|
return visitNode(cbNode, node.type);
|
|
case 266:
|
|
return visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.type);
|
|
case 273:
|
|
return visitNodes(cbNodes, node.tags);
|
|
case 275:
|
|
return visitNode(cbNode, node.preParameterName) ||
|
|
visitNode(cbNode, node.typeExpression) ||
|
|
visitNode(cbNode, node.postParameterName);
|
|
case 276:
|
|
return visitNode(cbNode, node.typeExpression);
|
|
case 277:
|
|
return visitNode(cbNode, node.typeExpression);
|
|
case 278:
|
|
return visitNodes(cbNodes, node.typeParameters);
|
|
case 279:
|
|
return visitNode(cbNode, node.typeExpression) ||
|
|
visitNode(cbNode, node.name) ||
|
|
visitNode(cbNode, node.jsDocTypeLiteral);
|
|
case 281:
|
|
return visitNodes(cbNodes, node.jsDocPropertyTags);
|
|
case 280:
|
|
return visitNode(cbNode, node.typeExpression) ||
|
|
visitNode(cbNode, node.name);
|
|
}
|
|
}
|
|
ts.forEachChild = forEachChild;
|
|
function createSourceFile(fileName, sourceText, languageVersion, setParentNodes, scriptKind) {
|
|
if (setParentNodes === void 0) { setParentNodes = false; }
|
|
var start = new Date().getTime();
|
|
var result = Parser.parseSourceFile(fileName, sourceText, languageVersion, undefined, setParentNodes, scriptKind);
|
|
ts.parseTime += new Date().getTime() - start;
|
|
return result;
|
|
}
|
|
ts.createSourceFile = createSourceFile;
|
|
function isExternalModule(file) {
|
|
return file.externalModuleIndicator !== undefined;
|
|
}
|
|
ts.isExternalModule = isExternalModule;
|
|
function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
|
|
return IncrementalParser.updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks);
|
|
}
|
|
ts.updateSourceFile = updateSourceFile;
|
|
function parseIsolatedJSDocComment(content, start, length) {
|
|
var result = Parser.JSDocParser.parseIsolatedJSDocComment(content, start, length);
|
|
if (result && result.jsDocComment) {
|
|
Parser.fixupParentReferences(result.jsDocComment);
|
|
}
|
|
return result;
|
|
}
|
|
ts.parseIsolatedJSDocComment = parseIsolatedJSDocComment;
|
|
function parseJSDocTypeExpressionForTests(content, start, length) {
|
|
return Parser.JSDocParser.parseJSDocTypeExpressionForTests(content, start, length);
|
|
}
|
|
ts.parseJSDocTypeExpressionForTests = parseJSDocTypeExpressionForTests;
|
|
var Parser;
|
|
(function (Parser) {
|
|
var scanner = ts.createScanner(2, true);
|
|
var disallowInAndDecoratorContext = 4194304 | 16777216;
|
|
var NodeConstructor;
|
|
var TokenConstructor;
|
|
var IdentifierConstructor;
|
|
var SourceFileConstructor;
|
|
var sourceFile;
|
|
var parseDiagnostics;
|
|
var syntaxCursor;
|
|
var token;
|
|
var sourceText;
|
|
var nodeCount;
|
|
var identifiers;
|
|
var identifierCount;
|
|
var parsingContext;
|
|
var contextFlags;
|
|
var parseErrorBeforeNextFinishedNode = false;
|
|
function parseSourceFile(fileName, _sourceText, languageVersion, _syntaxCursor, setParentNodes, scriptKind) {
|
|
scriptKind = ts.ensureScriptKind(fileName, scriptKind);
|
|
initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind);
|
|
var result = parseSourceFileWorker(fileName, languageVersion, setParentNodes, scriptKind);
|
|
clearState();
|
|
return result;
|
|
}
|
|
Parser.parseSourceFile = parseSourceFile;
|
|
function getLanguageVariant(scriptKind) {
|
|
return scriptKind === 4 || scriptKind === 2 || scriptKind === 1 ? 1 : 0;
|
|
}
|
|
function initializeState(fileName, _sourceText, languageVersion, _syntaxCursor, scriptKind) {
|
|
NodeConstructor = ts.objectAllocator.getNodeConstructor();
|
|
TokenConstructor = ts.objectAllocator.getTokenConstructor();
|
|
IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor();
|
|
SourceFileConstructor = ts.objectAllocator.getSourceFileConstructor();
|
|
sourceText = _sourceText;
|
|
syntaxCursor = _syntaxCursor;
|
|
parseDiagnostics = [];
|
|
parsingContext = 0;
|
|
identifiers = {};
|
|
identifierCount = 0;
|
|
nodeCount = 0;
|
|
contextFlags = scriptKind === 1 || scriptKind === 2 ? 134217728 : 0;
|
|
parseErrorBeforeNextFinishedNode = false;
|
|
scanner.setText(sourceText);
|
|
scanner.setOnError(scanError);
|
|
scanner.setScriptTarget(languageVersion);
|
|
scanner.setLanguageVariant(getLanguageVariant(scriptKind));
|
|
}
|
|
function clearState() {
|
|
scanner.setText("");
|
|
scanner.setOnError(undefined);
|
|
parseDiagnostics = undefined;
|
|
sourceFile = undefined;
|
|
identifiers = undefined;
|
|
syntaxCursor = undefined;
|
|
sourceText = undefined;
|
|
}
|
|
function parseSourceFileWorker(fileName, languageVersion, setParentNodes, scriptKind) {
|
|
sourceFile = createSourceFile(fileName, languageVersion, scriptKind);
|
|
sourceFile.flags = contextFlags;
|
|
token = nextToken();
|
|
processReferenceComments(sourceFile);
|
|
sourceFile.statements = parseList(0, parseStatement);
|
|
ts.Debug.assert(token === 1);
|
|
sourceFile.endOfFileToken = parseTokenNode();
|
|
setExternalModuleIndicator(sourceFile);
|
|
sourceFile.nodeCount = nodeCount;
|
|
sourceFile.identifierCount = identifierCount;
|
|
sourceFile.identifiers = identifiers;
|
|
sourceFile.parseDiagnostics = parseDiagnostics;
|
|
if (setParentNodes) {
|
|
fixupParentReferences(sourceFile);
|
|
}
|
|
return sourceFile;
|
|
}
|
|
function addJSDocComment(node) {
|
|
if (contextFlags & 134217728) {
|
|
var comments = ts.getLeadingCommentRangesOfNode(node, sourceFile);
|
|
if (comments) {
|
|
for (var _i = 0, comments_1 = comments; _i < comments_1.length; _i++) {
|
|
var comment = comments_1[_i];
|
|
var jsDocComment = JSDocParser.parseJSDocComment(node, comment.pos, comment.end - comment.pos);
|
|
if (!jsDocComment) {
|
|
continue;
|
|
}
|
|
if (!node.jsDocComments) {
|
|
node.jsDocComments = [];
|
|
}
|
|
node.jsDocComments.push(jsDocComment);
|
|
}
|
|
}
|
|
}
|
|
return node;
|
|
}
|
|
function fixupParentReferences(rootNode) {
|
|
var parent = rootNode;
|
|
forEachChild(rootNode, visitNode);
|
|
return;
|
|
function visitNode(n) {
|
|
if (n.parent !== parent) {
|
|
n.parent = parent;
|
|
var saveParent = parent;
|
|
parent = n;
|
|
forEachChild(n, visitNode);
|
|
if (n.jsDocComments) {
|
|
for (var _i = 0, _a = n.jsDocComments; _i < _a.length; _i++) {
|
|
var jsDocComment = _a[_i];
|
|
jsDocComment.parent = n;
|
|
parent = jsDocComment;
|
|
forEachChild(jsDocComment, visitNode);
|
|
}
|
|
}
|
|
parent = saveParent;
|
|
}
|
|
}
|
|
}
|
|
Parser.fixupParentReferences = fixupParentReferences;
|
|
function createSourceFile(fileName, languageVersion, scriptKind) {
|
|
var sourceFile = new SourceFileConstructor(256, 0, sourceText.length);
|
|
nodeCount++;
|
|
sourceFile.text = sourceText;
|
|
sourceFile.bindDiagnostics = [];
|
|
sourceFile.languageVersion = languageVersion;
|
|
sourceFile.fileName = ts.normalizePath(fileName);
|
|
sourceFile.languageVariant = getLanguageVariant(scriptKind);
|
|
sourceFile.isDeclarationFile = ts.fileExtensionIs(sourceFile.fileName, ".d.ts");
|
|
sourceFile.scriptKind = scriptKind;
|
|
return sourceFile;
|
|
}
|
|
function setContextFlag(val, flag) {
|
|
if (val) {
|
|
contextFlags |= flag;
|
|
}
|
|
else {
|
|
contextFlags &= ~flag;
|
|
}
|
|
}
|
|
function setDisallowInContext(val) {
|
|
setContextFlag(val, 4194304);
|
|
}
|
|
function setYieldContext(val) {
|
|
setContextFlag(val, 8388608);
|
|
}
|
|
function setDecoratorContext(val) {
|
|
setContextFlag(val, 16777216);
|
|
}
|
|
function setAwaitContext(val) {
|
|
setContextFlag(val, 33554432);
|
|
}
|
|
function doOutsideOfContext(context, func) {
|
|
var contextFlagsToClear = context & contextFlags;
|
|
if (contextFlagsToClear) {
|
|
setContextFlag(false, contextFlagsToClear);
|
|
var result = func();
|
|
setContextFlag(true, contextFlagsToClear);
|
|
return result;
|
|
}
|
|
return func();
|
|
}
|
|
function doInsideOfContext(context, func) {
|
|
var contextFlagsToSet = context & ~contextFlags;
|
|
if (contextFlagsToSet) {
|
|
setContextFlag(true, contextFlagsToSet);
|
|
var result = func();
|
|
setContextFlag(false, contextFlagsToSet);
|
|
return result;
|
|
}
|
|
return func();
|
|
}
|
|
function allowInAnd(func) {
|
|
return doOutsideOfContext(4194304, func);
|
|
}
|
|
function disallowInAnd(func) {
|
|
return doInsideOfContext(4194304, func);
|
|
}
|
|
function doInYieldContext(func) {
|
|
return doInsideOfContext(8388608, func);
|
|
}
|
|
function doInDecoratorContext(func) {
|
|
return doInsideOfContext(16777216, func);
|
|
}
|
|
function doInAwaitContext(func) {
|
|
return doInsideOfContext(33554432, func);
|
|
}
|
|
function doOutsideOfAwaitContext(func) {
|
|
return doOutsideOfContext(33554432, func);
|
|
}
|
|
function doInYieldAndAwaitContext(func) {
|
|
return doInsideOfContext(8388608 | 33554432, func);
|
|
}
|
|
function inContext(flags) {
|
|
return (contextFlags & flags) !== 0;
|
|
}
|
|
function inYieldContext() {
|
|
return inContext(8388608);
|
|
}
|
|
function inDisallowInContext() {
|
|
return inContext(4194304);
|
|
}
|
|
function inDecoratorContext() {
|
|
return inContext(16777216);
|
|
}
|
|
function inAwaitContext() {
|
|
return inContext(33554432);
|
|
}
|
|
function parseErrorAtCurrentToken(message, arg0) {
|
|
var start = scanner.getTokenPos();
|
|
var length = scanner.getTextPos() - start;
|
|
parseErrorAtPosition(start, length, message, arg0);
|
|
}
|
|
function parseErrorAtPosition(start, length, message, arg0) {
|
|
var lastError = ts.lastOrUndefined(parseDiagnostics);
|
|
if (!lastError || start !== lastError.start) {
|
|
parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, start, length, message, arg0));
|
|
}
|
|
parseErrorBeforeNextFinishedNode = true;
|
|
}
|
|
function scanError(message, length) {
|
|
var pos = scanner.getTextPos();
|
|
parseErrorAtPosition(pos, length || 0, message);
|
|
}
|
|
function getNodePos() {
|
|
return scanner.getStartPos();
|
|
}
|
|
function getNodeEnd() {
|
|
return scanner.getStartPos();
|
|
}
|
|
function nextToken() {
|
|
return token = scanner.scan();
|
|
}
|
|
function reScanGreaterToken() {
|
|
return token = scanner.reScanGreaterToken();
|
|
}
|
|
function reScanSlashToken() {
|
|
return token = scanner.reScanSlashToken();
|
|
}
|
|
function reScanTemplateToken() {
|
|
return token = scanner.reScanTemplateToken();
|
|
}
|
|
function scanJsxIdentifier() {
|
|
return token = scanner.scanJsxIdentifier();
|
|
}
|
|
function scanJsxText() {
|
|
return token = scanner.scanJsxToken();
|
|
}
|
|
function speculationHelper(callback, isLookAhead) {
|
|
var saveToken = token;
|
|
var saveParseDiagnosticsLength = parseDiagnostics.length;
|
|
var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
|
|
var saveContextFlags = contextFlags;
|
|
var result = isLookAhead
|
|
? scanner.lookAhead(callback)
|
|
: scanner.tryScan(callback);
|
|
ts.Debug.assert(saveContextFlags === contextFlags);
|
|
if (!result || isLookAhead) {
|
|
token = saveToken;
|
|
parseDiagnostics.length = saveParseDiagnosticsLength;
|
|
parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
|
|
}
|
|
return result;
|
|
}
|
|
function lookAhead(callback) {
|
|
return speculationHelper(callback, true);
|
|
}
|
|
function tryParse(callback) {
|
|
return speculationHelper(callback, false);
|
|
}
|
|
function isIdentifier() {
|
|
if (token === 69) {
|
|
return true;
|
|
}
|
|
if (token === 114 && inYieldContext()) {
|
|
return false;
|
|
}
|
|
if (token === 119 && inAwaitContext()) {
|
|
return false;
|
|
}
|
|
return token > 105;
|
|
}
|
|
function parseExpected(kind, diagnosticMessage, shouldAdvance) {
|
|
if (shouldAdvance === void 0) { shouldAdvance = true; }
|
|
if (token === kind) {
|
|
if (shouldAdvance) {
|
|
nextToken();
|
|
}
|
|
return true;
|
|
}
|
|
if (diagnosticMessage) {
|
|
parseErrorAtCurrentToken(diagnosticMessage);
|
|
}
|
|
else {
|
|
parseErrorAtCurrentToken(ts.Diagnostics._0_expected, ts.tokenToString(kind));
|
|
}
|
|
return false;
|
|
}
|
|
function parseOptional(t) {
|
|
if (token === t) {
|
|
nextToken();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function parseOptionalToken(t) {
|
|
if (token === t) {
|
|
return parseTokenNode();
|
|
}
|
|
return undefined;
|
|
}
|
|
function parseExpectedToken(t, reportAtCurrentPosition, diagnosticMessage, arg0) {
|
|
return parseOptionalToken(t) ||
|
|
createMissingNode(t, reportAtCurrentPosition, diagnosticMessage, arg0);
|
|
}
|
|
function parseTokenNode() {
|
|
var node = createNode(token);
|
|
nextToken();
|
|
return finishNode(node);
|
|
}
|
|
function canParseSemicolon() {
|
|
if (token === 23) {
|
|
return true;
|
|
}
|
|
return token === 16 || token === 1 || scanner.hasPrecedingLineBreak();
|
|
}
|
|
function parseSemicolon() {
|
|
if (canParseSemicolon()) {
|
|
if (token === 23) {
|
|
nextToken();
|
|
}
|
|
return true;
|
|
}
|
|
else {
|
|
return parseExpected(23);
|
|
}
|
|
}
|
|
function createNode(kind, pos) {
|
|
nodeCount++;
|
|
if (!(pos >= 0)) {
|
|
pos = scanner.getStartPos();
|
|
}
|
|
return kind >= 139 ? new NodeConstructor(kind, pos, pos) :
|
|
kind === 69 ? new IdentifierConstructor(kind, pos, pos) :
|
|
new TokenConstructor(kind, pos, pos);
|
|
}
|
|
function finishNode(node, end) {
|
|
node.end = end === undefined ? scanner.getStartPos() : end;
|
|
if (contextFlags) {
|
|
node.flags |= contextFlags;
|
|
}
|
|
if (parseErrorBeforeNextFinishedNode) {
|
|
parseErrorBeforeNextFinishedNode = false;
|
|
node.flags |= 67108864;
|
|
}
|
|
return node;
|
|
}
|
|
function createMissingNode(kind, reportAtCurrentPosition, diagnosticMessage, arg0) {
|
|
if (reportAtCurrentPosition) {
|
|
parseErrorAtPosition(scanner.getStartPos(), 0, diagnosticMessage, arg0);
|
|
}
|
|
else {
|
|
parseErrorAtCurrentToken(diagnosticMessage, arg0);
|
|
}
|
|
var result = createNode(kind, scanner.getStartPos());
|
|
result.text = "";
|
|
return finishNode(result);
|
|
}
|
|
function internIdentifier(text) {
|
|
text = ts.escapeIdentifier(text);
|
|
return ts.hasProperty(identifiers, text) ? identifiers[text] : (identifiers[text] = text);
|
|
}
|
|
function createIdentifier(isIdentifier, diagnosticMessage) {
|
|
identifierCount++;
|
|
if (isIdentifier) {
|
|
var node = createNode(69);
|
|
if (token !== 69) {
|
|
node.originalKeywordKind = token;
|
|
}
|
|
node.text = internIdentifier(scanner.getTokenValue());
|
|
nextToken();
|
|
return finishNode(node);
|
|
}
|
|
return createMissingNode(69, false, diagnosticMessage || ts.Diagnostics.Identifier_expected);
|
|
}
|
|
function parseIdentifier(diagnosticMessage) {
|
|
return createIdentifier(isIdentifier(), diagnosticMessage);
|
|
}
|
|
function parseIdentifierName() {
|
|
return createIdentifier(ts.tokenIsIdentifierOrKeyword(token));
|
|
}
|
|
function isLiteralPropertyName() {
|
|
return ts.tokenIsIdentifierOrKeyword(token) ||
|
|
token === 9 ||
|
|
token === 8;
|
|
}
|
|
function parsePropertyNameWorker(allowComputedPropertyNames) {
|
|
if (token === 9 || token === 8) {
|
|
return parseLiteralNode(true);
|
|
}
|
|
if (allowComputedPropertyNames && token === 19) {
|
|
return parseComputedPropertyName();
|
|
}
|
|
return parseIdentifierName();
|
|
}
|
|
function parsePropertyName() {
|
|
return parsePropertyNameWorker(true);
|
|
}
|
|
function parseSimplePropertyName() {
|
|
return parsePropertyNameWorker(false);
|
|
}
|
|
function isSimplePropertyName() {
|
|
return token === 9 || token === 8 || ts.tokenIsIdentifierOrKeyword(token);
|
|
}
|
|
function parseComputedPropertyName() {
|
|
var node = createNode(140);
|
|
parseExpected(19);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(20);
|
|
return finishNode(node);
|
|
}
|
|
function parseContextualModifier(t) {
|
|
return token === t && tryParse(nextTokenCanFollowModifier);
|
|
}
|
|
function nextTokenIsOnSameLineAndCanFollowModifier() {
|
|
nextToken();
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
return false;
|
|
}
|
|
return canFollowModifier();
|
|
}
|
|
function nextTokenCanFollowModifier() {
|
|
if (token === 74) {
|
|
return nextToken() === 81;
|
|
}
|
|
if (token === 82) {
|
|
nextToken();
|
|
if (token === 77) {
|
|
return lookAhead(nextTokenIsClassOrFunctionOrAsync);
|
|
}
|
|
return token !== 37 && token !== 116 && token !== 15 && canFollowModifier();
|
|
}
|
|
if (token === 77) {
|
|
return nextTokenIsClassOrFunctionOrAsync();
|
|
}
|
|
if (token === 113) {
|
|
nextToken();
|
|
return canFollowModifier();
|
|
}
|
|
return nextTokenIsOnSameLineAndCanFollowModifier();
|
|
}
|
|
function parseAnyContextualModifier() {
|
|
return ts.isModifierKind(token) && tryParse(nextTokenCanFollowModifier);
|
|
}
|
|
function canFollowModifier() {
|
|
return token === 19
|
|
|| token === 15
|
|
|| token === 37
|
|
|| token === 22
|
|
|| isLiteralPropertyName();
|
|
}
|
|
function nextTokenIsClassOrFunctionOrAsync() {
|
|
nextToken();
|
|
return token === 73 || token === 87 ||
|
|
(token === 118 && lookAhead(nextTokenIsFunctionKeywordOnSameLine));
|
|
}
|
|
function isListElement(parsingContext, inErrorRecovery) {
|
|
var node = currentNode(parsingContext);
|
|
if (node) {
|
|
return true;
|
|
}
|
|
switch (parsingContext) {
|
|
case 0:
|
|
case 1:
|
|
case 3:
|
|
return !(token === 23 && inErrorRecovery) && isStartOfStatement();
|
|
case 2:
|
|
return token === 71 || token === 77;
|
|
case 4:
|
|
return lookAhead(isTypeMemberStart);
|
|
case 5:
|
|
return lookAhead(isClassMemberStart) || (token === 23 && !inErrorRecovery);
|
|
case 6:
|
|
return token === 19 || isLiteralPropertyName();
|
|
case 12:
|
|
return token === 19 || token === 37 || isLiteralPropertyName();
|
|
case 9:
|
|
return token === 19 || isLiteralPropertyName();
|
|
case 7:
|
|
if (token === 15) {
|
|
return lookAhead(isValidHeritageClauseObjectLiteral);
|
|
}
|
|
if (!inErrorRecovery) {
|
|
return isStartOfLeftHandSideExpression() && !isHeritageClauseExtendsOrImplementsKeyword();
|
|
}
|
|
else {
|
|
return isIdentifier() && !isHeritageClauseExtendsOrImplementsKeyword();
|
|
}
|
|
case 8:
|
|
return isIdentifierOrPattern();
|
|
case 10:
|
|
return token === 24 || token === 22 || isIdentifierOrPattern();
|
|
case 17:
|
|
return isIdentifier();
|
|
case 11:
|
|
case 15:
|
|
return token === 24 || token === 22 || isStartOfExpression();
|
|
case 16:
|
|
return isStartOfParameter();
|
|
case 18:
|
|
case 19:
|
|
return token === 24 || isStartOfType();
|
|
case 20:
|
|
return isHeritageClause();
|
|
case 21:
|
|
return ts.tokenIsIdentifierOrKeyword(token);
|
|
case 13:
|
|
return ts.tokenIsIdentifierOrKeyword(token) || token === 15;
|
|
case 14:
|
|
return true;
|
|
case 22:
|
|
case 23:
|
|
case 25:
|
|
return JSDocParser.isJSDocType();
|
|
case 24:
|
|
return isSimplePropertyName();
|
|
}
|
|
ts.Debug.fail("Non-exhaustive case in 'isListElement'.");
|
|
}
|
|
function isValidHeritageClauseObjectLiteral() {
|
|
ts.Debug.assert(token === 15);
|
|
if (nextToken() === 16) {
|
|
var next = nextToken();
|
|
return next === 24 || next === 15 || next === 83 || next === 106;
|
|
}
|
|
return true;
|
|
}
|
|
function nextTokenIsIdentifier() {
|
|
nextToken();
|
|
return isIdentifier();
|
|
}
|
|
function nextTokenIsIdentifierOrKeyword() {
|
|
nextToken();
|
|
return ts.tokenIsIdentifierOrKeyword(token);
|
|
}
|
|
function isHeritageClauseExtendsOrImplementsKeyword() {
|
|
if (token === 106 ||
|
|
token === 83) {
|
|
return lookAhead(nextTokenIsStartOfExpression);
|
|
}
|
|
return false;
|
|
}
|
|
function nextTokenIsStartOfExpression() {
|
|
nextToken();
|
|
return isStartOfExpression();
|
|
}
|
|
function isListTerminator(kind) {
|
|
if (token === 1) {
|
|
return true;
|
|
}
|
|
switch (kind) {
|
|
case 1:
|
|
case 2:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 12:
|
|
case 9:
|
|
case 21:
|
|
return token === 16;
|
|
case 3:
|
|
return token === 16 || token === 71 || token === 77;
|
|
case 7:
|
|
return token === 15 || token === 83 || token === 106;
|
|
case 8:
|
|
return isVariableDeclaratorListTerminator();
|
|
case 17:
|
|
return token === 27 || token === 17 || token === 15 || token === 83 || token === 106;
|
|
case 11:
|
|
return token === 18 || token === 23;
|
|
case 15:
|
|
case 19:
|
|
case 10:
|
|
return token === 20;
|
|
case 16:
|
|
return token === 18 || token === 20;
|
|
case 18:
|
|
return token === 27 || token === 17;
|
|
case 20:
|
|
return token === 15 || token === 16;
|
|
case 13:
|
|
return token === 27 || token === 39;
|
|
case 14:
|
|
return token === 25 && lookAhead(nextTokenIsSlash);
|
|
case 22:
|
|
return token === 18 || token === 54 || token === 16;
|
|
case 23:
|
|
return token === 27 || token === 16;
|
|
case 25:
|
|
return token === 20 || token === 16;
|
|
case 24:
|
|
return token === 16;
|
|
}
|
|
}
|
|
function isVariableDeclaratorListTerminator() {
|
|
if (canParseSemicolon()) {
|
|
return true;
|
|
}
|
|
if (isInOrOfKeyword(token)) {
|
|
return true;
|
|
}
|
|
if (token === 34) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isInSomeParsingContext() {
|
|
for (var kind = 0; kind < 26; kind++) {
|
|
if (parsingContext & (1 << kind)) {
|
|
if (isListElement(kind, true) || isListTerminator(kind)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function parseList(kind, parseElement) {
|
|
var saveParsingContext = parsingContext;
|
|
parsingContext |= 1 << kind;
|
|
var result = [];
|
|
result.pos = getNodePos();
|
|
while (!isListTerminator(kind)) {
|
|
if (isListElement(kind, false)) {
|
|
var element = parseListElement(kind, parseElement);
|
|
result.push(element);
|
|
continue;
|
|
}
|
|
if (abortParsingListOrMoveToNextToken(kind)) {
|
|
break;
|
|
}
|
|
}
|
|
result.end = getNodeEnd();
|
|
parsingContext = saveParsingContext;
|
|
return result;
|
|
}
|
|
function parseListElement(parsingContext, parseElement) {
|
|
var node = currentNode(parsingContext);
|
|
if (node) {
|
|
return consumeNode(node);
|
|
}
|
|
return parseElement();
|
|
}
|
|
function currentNode(parsingContext) {
|
|
if (parseErrorBeforeNextFinishedNode) {
|
|
return undefined;
|
|
}
|
|
if (!syntaxCursor) {
|
|
return undefined;
|
|
}
|
|
var node = syntaxCursor.currentNode(scanner.getStartPos());
|
|
if (ts.nodeIsMissing(node)) {
|
|
return undefined;
|
|
}
|
|
if (node.intersectsChange) {
|
|
return undefined;
|
|
}
|
|
if (ts.containsParseError(node)) {
|
|
return undefined;
|
|
}
|
|
var nodeContextFlags = node.flags & 197132288;
|
|
if (nodeContextFlags !== contextFlags) {
|
|
return undefined;
|
|
}
|
|
if (!canReuseNode(node, parsingContext)) {
|
|
return undefined;
|
|
}
|
|
return node;
|
|
}
|
|
function consumeNode(node) {
|
|
scanner.setTextPos(node.end);
|
|
nextToken();
|
|
return node;
|
|
}
|
|
function canReuseNode(node, parsingContext) {
|
|
switch (parsingContext) {
|
|
case 5:
|
|
return isReusableClassMember(node);
|
|
case 2:
|
|
return isReusableSwitchClause(node);
|
|
case 0:
|
|
case 1:
|
|
case 3:
|
|
return isReusableStatement(node);
|
|
case 6:
|
|
return isReusableEnumMember(node);
|
|
case 4:
|
|
return isReusableTypeMember(node);
|
|
case 8:
|
|
return isReusableVariableDeclaration(node);
|
|
case 16:
|
|
return isReusableParameter(node);
|
|
case 20:
|
|
case 17:
|
|
case 19:
|
|
case 18:
|
|
case 11:
|
|
case 12:
|
|
case 7:
|
|
case 13:
|
|
case 14:
|
|
}
|
|
return false;
|
|
}
|
|
function isReusableClassMember(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 148:
|
|
case 153:
|
|
case 149:
|
|
case 150:
|
|
case 145:
|
|
case 198:
|
|
return true;
|
|
case 147:
|
|
var methodDeclaration = node;
|
|
var nameIsConstructor = methodDeclaration.name.kind === 69 &&
|
|
methodDeclaration.name.originalKeywordKind === 121;
|
|
return !nameIsConstructor;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isReusableSwitchClause(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 249:
|
|
case 250:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isReusableStatement(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 220:
|
|
case 200:
|
|
case 199:
|
|
case 203:
|
|
case 202:
|
|
case 215:
|
|
case 211:
|
|
case 213:
|
|
case 210:
|
|
case 209:
|
|
case 207:
|
|
case 208:
|
|
case 206:
|
|
case 205:
|
|
case 212:
|
|
case 201:
|
|
case 216:
|
|
case 214:
|
|
case 204:
|
|
case 217:
|
|
case 230:
|
|
case 229:
|
|
case 236:
|
|
case 235:
|
|
case 225:
|
|
case 221:
|
|
case 222:
|
|
case 224:
|
|
case 223:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isReusableEnumMember(node) {
|
|
return node.kind === 255;
|
|
}
|
|
function isReusableTypeMember(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 152:
|
|
case 146:
|
|
case 153:
|
|
case 144:
|
|
case 151:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isReusableVariableDeclaration(node) {
|
|
if (node.kind !== 218) {
|
|
return false;
|
|
}
|
|
var variableDeclarator = node;
|
|
return variableDeclarator.initializer === undefined;
|
|
}
|
|
function isReusableParameter(node) {
|
|
if (node.kind !== 142) {
|
|
return false;
|
|
}
|
|
var parameter = node;
|
|
return parameter.initializer === undefined;
|
|
}
|
|
function abortParsingListOrMoveToNextToken(kind) {
|
|
parseErrorAtCurrentToken(parsingContextErrors(kind));
|
|
if (isInSomeParsingContext()) {
|
|
return true;
|
|
}
|
|
nextToken();
|
|
return false;
|
|
}
|
|
function parsingContextErrors(context) {
|
|
switch (context) {
|
|
case 0: return ts.Diagnostics.Declaration_or_statement_expected;
|
|
case 1: return ts.Diagnostics.Declaration_or_statement_expected;
|
|
case 2: return ts.Diagnostics.case_or_default_expected;
|
|
case 3: return ts.Diagnostics.Statement_expected;
|
|
case 4: return ts.Diagnostics.Property_or_signature_expected;
|
|
case 5: return ts.Diagnostics.Unexpected_token_A_constructor_method_accessor_or_property_was_expected;
|
|
case 6: return ts.Diagnostics.Enum_member_expected;
|
|
case 7: return ts.Diagnostics.Expression_expected;
|
|
case 8: return ts.Diagnostics.Variable_declaration_expected;
|
|
case 9: return ts.Diagnostics.Property_destructuring_pattern_expected;
|
|
case 10: return ts.Diagnostics.Array_element_destructuring_pattern_expected;
|
|
case 11: return ts.Diagnostics.Argument_expression_expected;
|
|
case 12: return ts.Diagnostics.Property_assignment_expected;
|
|
case 15: return ts.Diagnostics.Expression_or_comma_expected;
|
|
case 16: return ts.Diagnostics.Parameter_declaration_expected;
|
|
case 17: return ts.Diagnostics.Type_parameter_declaration_expected;
|
|
case 18: return ts.Diagnostics.Type_argument_expected;
|
|
case 19: return ts.Diagnostics.Type_expected;
|
|
case 20: return ts.Diagnostics.Unexpected_token_expected;
|
|
case 21: return ts.Diagnostics.Identifier_expected;
|
|
case 13: return ts.Diagnostics.Identifier_expected;
|
|
case 14: return ts.Diagnostics.Identifier_expected;
|
|
case 22: return ts.Diagnostics.Parameter_declaration_expected;
|
|
case 23: return ts.Diagnostics.Type_argument_expected;
|
|
case 25: return ts.Diagnostics.Type_expected;
|
|
case 24: return ts.Diagnostics.Property_assignment_expected;
|
|
}
|
|
}
|
|
;
|
|
function parseDelimitedList(kind, parseElement, considerSemicolonAsDelimiter) {
|
|
var saveParsingContext = parsingContext;
|
|
parsingContext |= 1 << kind;
|
|
var result = [];
|
|
result.pos = getNodePos();
|
|
var commaStart = -1;
|
|
while (true) {
|
|
if (isListElement(kind, false)) {
|
|
result.push(parseListElement(kind, parseElement));
|
|
commaStart = scanner.getTokenPos();
|
|
if (parseOptional(24)) {
|
|
continue;
|
|
}
|
|
commaStart = -1;
|
|
if (isListTerminator(kind)) {
|
|
break;
|
|
}
|
|
parseExpected(24);
|
|
if (considerSemicolonAsDelimiter && token === 23 && !scanner.hasPrecedingLineBreak()) {
|
|
nextToken();
|
|
}
|
|
continue;
|
|
}
|
|
if (isListTerminator(kind)) {
|
|
break;
|
|
}
|
|
if (abortParsingListOrMoveToNextToken(kind)) {
|
|
break;
|
|
}
|
|
}
|
|
if (commaStart >= 0) {
|
|
result.hasTrailingComma = true;
|
|
}
|
|
result.end = getNodeEnd();
|
|
parsingContext = saveParsingContext;
|
|
return result;
|
|
}
|
|
function createMissingList() {
|
|
var pos = getNodePos();
|
|
var result = [];
|
|
result.pos = pos;
|
|
result.end = pos;
|
|
return result;
|
|
}
|
|
function parseBracketedList(kind, parseElement, open, close) {
|
|
if (parseExpected(open)) {
|
|
var result = parseDelimitedList(kind, parseElement);
|
|
parseExpected(close);
|
|
return result;
|
|
}
|
|
return createMissingList();
|
|
}
|
|
function parseEntityName(allowReservedWords, diagnosticMessage) {
|
|
var entity = parseIdentifier(diagnosticMessage);
|
|
while (parseOptional(21)) {
|
|
var node = createNode(139, entity.pos);
|
|
node.left = entity;
|
|
node.right = parseRightSideOfDot(allowReservedWords);
|
|
entity = finishNode(node);
|
|
}
|
|
return entity;
|
|
}
|
|
function parseRightSideOfDot(allowIdentifierNames) {
|
|
if (scanner.hasPrecedingLineBreak() && ts.tokenIsIdentifierOrKeyword(token)) {
|
|
var matchesPattern = lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
|
|
if (matchesPattern) {
|
|
return createMissingNode(69, true, ts.Diagnostics.Identifier_expected);
|
|
}
|
|
}
|
|
return allowIdentifierNames ? parseIdentifierName() : parseIdentifier();
|
|
}
|
|
function parseTemplateExpression() {
|
|
var template = createNode(189);
|
|
template.head = parseTemplateLiteralFragment();
|
|
ts.Debug.assert(template.head.kind === 12, "Template head has wrong token kind");
|
|
var templateSpans = [];
|
|
templateSpans.pos = getNodePos();
|
|
do {
|
|
templateSpans.push(parseTemplateSpan());
|
|
} while (ts.lastOrUndefined(templateSpans).literal.kind === 13);
|
|
templateSpans.end = getNodeEnd();
|
|
template.templateSpans = templateSpans;
|
|
return finishNode(template);
|
|
}
|
|
function parseTemplateSpan() {
|
|
var span = createNode(197);
|
|
span.expression = allowInAnd(parseExpression);
|
|
var literal;
|
|
if (token === 16) {
|
|
reScanTemplateToken();
|
|
literal = parseTemplateLiteralFragment();
|
|
}
|
|
else {
|
|
literal = parseExpectedToken(14, false, ts.Diagnostics._0_expected, ts.tokenToString(16));
|
|
}
|
|
span.literal = literal;
|
|
return finishNode(span);
|
|
}
|
|
function parseStringLiteralTypeNode() {
|
|
return parseLiteralLikeNode(166, true);
|
|
}
|
|
function parseLiteralNode(internName) {
|
|
return parseLiteralLikeNode(token, internName);
|
|
}
|
|
function parseTemplateLiteralFragment() {
|
|
return parseLiteralLikeNode(token, false);
|
|
}
|
|
function parseLiteralLikeNode(kind, internName) {
|
|
var node = createNode(kind);
|
|
var text = scanner.getTokenValue();
|
|
node.text = internName ? internIdentifier(text) : text;
|
|
if (scanner.hasExtendedUnicodeEscape()) {
|
|
node.hasExtendedUnicodeEscape = true;
|
|
}
|
|
if (scanner.isUnterminated()) {
|
|
node.isUnterminated = true;
|
|
}
|
|
var tokenPos = scanner.getTokenPos();
|
|
nextToken();
|
|
finishNode(node);
|
|
if (node.kind === 8
|
|
&& sourceText.charCodeAt(tokenPos) === 48
|
|
&& ts.isOctalDigit(sourceText.charCodeAt(tokenPos + 1))) {
|
|
node.isOctalLiteral = true;
|
|
}
|
|
return node;
|
|
}
|
|
function parseTypeReference() {
|
|
var typeName = parseEntityName(false, ts.Diagnostics.Type_expected);
|
|
var node = createNode(155, typeName.pos);
|
|
node.typeName = typeName;
|
|
if (!scanner.hasPrecedingLineBreak() && token === 25) {
|
|
node.typeArguments = parseBracketedList(18, parseType, 25, 27);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseThisTypePredicate(lhs) {
|
|
nextToken();
|
|
var node = createNode(154, lhs.pos);
|
|
node.parameterName = lhs;
|
|
node.type = parseType();
|
|
return finishNode(node);
|
|
}
|
|
function parseThisTypeNode() {
|
|
var node = createNode(165);
|
|
nextToken();
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeQuery() {
|
|
var node = createNode(158);
|
|
parseExpected(101);
|
|
node.exprName = parseEntityName(true);
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeParameter() {
|
|
var node = createNode(141);
|
|
node.name = parseIdentifier();
|
|
if (parseOptional(83)) {
|
|
if (isStartOfType() || !isStartOfExpression()) {
|
|
node.constraint = parseType();
|
|
}
|
|
else {
|
|
node.expression = parseUnaryExpressionOrHigher();
|
|
}
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeParameters() {
|
|
if (token === 25) {
|
|
return parseBracketedList(17, parseTypeParameter, 25, 27);
|
|
}
|
|
}
|
|
function parseParameterType() {
|
|
if (parseOptional(54)) {
|
|
return parseType();
|
|
}
|
|
return undefined;
|
|
}
|
|
function isStartOfParameter() {
|
|
return token === 22 || isIdentifierOrPattern() || ts.isModifierKind(token) || token === 55 || token === 97;
|
|
}
|
|
function setModifiers(node, modifiers) {
|
|
if (modifiers) {
|
|
node.flags |= modifiers.flags;
|
|
node.modifiers = modifiers;
|
|
}
|
|
}
|
|
function parseParameter() {
|
|
var node = createNode(142);
|
|
if (token === 97) {
|
|
node.name = createIdentifier(true, undefined);
|
|
node.type = parseParameterType();
|
|
return finishNode(node);
|
|
}
|
|
node.decorators = parseDecorators();
|
|
setModifiers(node, parseModifiers());
|
|
node.dotDotDotToken = parseOptionalToken(22);
|
|
node.name = parseIdentifierOrPattern();
|
|
if (ts.getFullWidth(node.name) === 0 && node.flags === 0 && ts.isModifierKind(token)) {
|
|
nextToken();
|
|
}
|
|
node.questionToken = parseOptionalToken(53);
|
|
node.type = parseParameterType();
|
|
node.initializer = parseBindingElementInitializer(true);
|
|
return addJSDocComment(finishNode(node));
|
|
}
|
|
function parseBindingElementInitializer(inParameter) {
|
|
return inParameter ? parseParameterInitializer() : parseNonParameterInitializer();
|
|
}
|
|
function parseParameterInitializer() {
|
|
return parseInitializer(true);
|
|
}
|
|
function fillSignature(returnToken, yieldContext, awaitContext, requireCompleteParameterList, signature) {
|
|
var returnTokenRequired = returnToken === 34;
|
|
signature.typeParameters = parseTypeParameters();
|
|
signature.parameters = parseParameterList(yieldContext, awaitContext, requireCompleteParameterList);
|
|
if (returnTokenRequired) {
|
|
parseExpected(returnToken);
|
|
signature.type = parseTypeOrTypePredicate();
|
|
}
|
|
else if (parseOptional(returnToken)) {
|
|
signature.type = parseTypeOrTypePredicate();
|
|
}
|
|
}
|
|
function parseParameterList(yieldContext, awaitContext, requireCompleteParameterList) {
|
|
if (parseExpected(17)) {
|
|
var savedYieldContext = inYieldContext();
|
|
var savedAwaitContext = inAwaitContext();
|
|
setYieldContext(yieldContext);
|
|
setAwaitContext(awaitContext);
|
|
var result = parseDelimitedList(16, parseParameter);
|
|
setYieldContext(savedYieldContext);
|
|
setAwaitContext(savedAwaitContext);
|
|
if (!parseExpected(18) && requireCompleteParameterList) {
|
|
return undefined;
|
|
}
|
|
return result;
|
|
}
|
|
return requireCompleteParameterList ? undefined : createMissingList();
|
|
}
|
|
function parseTypeMemberSemicolon() {
|
|
if (parseOptional(24)) {
|
|
return;
|
|
}
|
|
parseSemicolon();
|
|
}
|
|
function parseSignatureMember(kind) {
|
|
var node = createNode(kind);
|
|
if (kind === 152) {
|
|
parseExpected(92);
|
|
}
|
|
fillSignature(54, false, false, false, node);
|
|
parseTypeMemberSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function isIndexSignature() {
|
|
if (token !== 19) {
|
|
return false;
|
|
}
|
|
return lookAhead(isUnambiguouslyIndexSignature);
|
|
}
|
|
function isUnambiguouslyIndexSignature() {
|
|
nextToken();
|
|
if (token === 22 || token === 20) {
|
|
return true;
|
|
}
|
|
if (ts.isModifierKind(token)) {
|
|
nextToken();
|
|
if (isIdentifier()) {
|
|
return true;
|
|
}
|
|
}
|
|
else if (!isIdentifier()) {
|
|
return false;
|
|
}
|
|
else {
|
|
nextToken();
|
|
}
|
|
if (token === 54 || token === 24) {
|
|
return true;
|
|
}
|
|
if (token !== 53) {
|
|
return false;
|
|
}
|
|
nextToken();
|
|
return token === 54 || token === 24 || token === 20;
|
|
}
|
|
function parseIndexSignatureDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(153, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
node.parameters = parseBracketedList(16, parseParameter, 19, 20);
|
|
node.type = parseTypeAnnotation();
|
|
parseTypeMemberSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parsePropertyOrMethodSignature(fullStart, modifiers) {
|
|
var name = parsePropertyName();
|
|
var questionToken = parseOptionalToken(53);
|
|
if (token === 17 || token === 25) {
|
|
var method = createNode(146, fullStart);
|
|
setModifiers(method, modifiers);
|
|
method.name = name;
|
|
method.questionToken = questionToken;
|
|
fillSignature(54, false, false, false, method);
|
|
parseTypeMemberSemicolon();
|
|
return finishNode(method);
|
|
}
|
|
else {
|
|
var property = createNode(144, fullStart);
|
|
setModifiers(property, modifiers);
|
|
property.name = name;
|
|
property.questionToken = questionToken;
|
|
property.type = parseTypeAnnotation();
|
|
if (token === 56) {
|
|
property.initializer = parseNonParameterInitializer();
|
|
}
|
|
parseTypeMemberSemicolon();
|
|
return finishNode(property);
|
|
}
|
|
}
|
|
function isTypeMemberStart() {
|
|
var idToken;
|
|
if (token === 17 || token === 25) {
|
|
return true;
|
|
}
|
|
while (ts.isModifierKind(token)) {
|
|
idToken = token;
|
|
nextToken();
|
|
}
|
|
if (token === 19) {
|
|
return true;
|
|
}
|
|
if (isLiteralPropertyName()) {
|
|
idToken = token;
|
|
nextToken();
|
|
}
|
|
if (idToken) {
|
|
return token === 17 ||
|
|
token === 25 ||
|
|
token === 53 ||
|
|
token === 54 ||
|
|
canParseSemicolon();
|
|
}
|
|
return false;
|
|
}
|
|
function parseTypeMember() {
|
|
if (token === 17 || token === 25) {
|
|
return parseSignatureMember(151);
|
|
}
|
|
if (token === 92 && lookAhead(isStartOfConstructSignature)) {
|
|
return parseSignatureMember(152);
|
|
}
|
|
var fullStart = getNodePos();
|
|
var modifiers = parseModifiers();
|
|
if (isIndexSignature()) {
|
|
return parseIndexSignatureDeclaration(fullStart, undefined, modifiers);
|
|
}
|
|
return parsePropertyOrMethodSignature(fullStart, modifiers);
|
|
}
|
|
function isStartOfConstructSignature() {
|
|
nextToken();
|
|
return token === 17 || token === 25;
|
|
}
|
|
function parseTypeLiteral() {
|
|
var node = createNode(159);
|
|
node.members = parseObjectTypeMembers();
|
|
return finishNode(node);
|
|
}
|
|
function parseObjectTypeMembers() {
|
|
var members;
|
|
if (parseExpected(15)) {
|
|
members = parseList(4, parseTypeMember);
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
members = createMissingList();
|
|
}
|
|
return members;
|
|
}
|
|
function parseTupleType() {
|
|
var node = createNode(161);
|
|
node.elementTypes = parseBracketedList(19, parseType, 19, 20);
|
|
return finishNode(node);
|
|
}
|
|
function parseParenthesizedType() {
|
|
var node = createNode(164);
|
|
parseExpected(17);
|
|
node.type = parseType();
|
|
parseExpected(18);
|
|
return finishNode(node);
|
|
}
|
|
function parseFunctionOrConstructorType(kind) {
|
|
var node = createNode(kind);
|
|
if (kind === 157) {
|
|
parseExpected(92);
|
|
}
|
|
fillSignature(34, false, false, false, node);
|
|
return finishNode(node);
|
|
}
|
|
function parseKeywordAndNoDot() {
|
|
var node = parseTokenNode();
|
|
return token === 21 ? undefined : node;
|
|
}
|
|
function parseNonArrayType() {
|
|
switch (token) {
|
|
case 117:
|
|
case 132:
|
|
case 130:
|
|
case 120:
|
|
case 133:
|
|
case 135:
|
|
case 127:
|
|
var node = tryParse(parseKeywordAndNoDot);
|
|
return node || parseTypeReference();
|
|
case 9:
|
|
return parseStringLiteralTypeNode();
|
|
case 103:
|
|
case 93:
|
|
return parseTokenNode();
|
|
case 97: {
|
|
var thisKeyword = parseThisTypeNode();
|
|
if (token === 124 && !scanner.hasPrecedingLineBreak()) {
|
|
return parseThisTypePredicate(thisKeyword);
|
|
}
|
|
else {
|
|
return thisKeyword;
|
|
}
|
|
}
|
|
case 101:
|
|
return parseTypeQuery();
|
|
case 15:
|
|
return parseTypeLiteral();
|
|
case 19:
|
|
return parseTupleType();
|
|
case 17:
|
|
return parseParenthesizedType();
|
|
default:
|
|
return parseTypeReference();
|
|
}
|
|
}
|
|
function isStartOfType() {
|
|
switch (token) {
|
|
case 117:
|
|
case 132:
|
|
case 130:
|
|
case 120:
|
|
case 133:
|
|
case 103:
|
|
case 135:
|
|
case 93:
|
|
case 97:
|
|
case 101:
|
|
case 127:
|
|
case 15:
|
|
case 19:
|
|
case 25:
|
|
case 92:
|
|
case 9:
|
|
return true;
|
|
case 17:
|
|
return lookAhead(isStartOfParenthesizedOrFunctionType);
|
|
default:
|
|
return isIdentifier();
|
|
}
|
|
}
|
|
function isStartOfParenthesizedOrFunctionType() {
|
|
nextToken();
|
|
return token === 18 || isStartOfParameter() || isStartOfType();
|
|
}
|
|
function parseArrayTypeOrHigher() {
|
|
var type = parseNonArrayType();
|
|
while (!scanner.hasPrecedingLineBreak() && parseOptional(19)) {
|
|
parseExpected(20);
|
|
var node = createNode(160, type.pos);
|
|
node.elementType = type;
|
|
type = finishNode(node);
|
|
}
|
|
return type;
|
|
}
|
|
function parseUnionOrIntersectionType(kind, parseConstituentType, operator) {
|
|
var type = parseConstituentType();
|
|
if (token === operator) {
|
|
var types = [type];
|
|
types.pos = type.pos;
|
|
while (parseOptional(operator)) {
|
|
types.push(parseConstituentType());
|
|
}
|
|
types.end = getNodeEnd();
|
|
var node = createNode(kind, type.pos);
|
|
node.types = types;
|
|
type = finishNode(node);
|
|
}
|
|
return type;
|
|
}
|
|
function parseIntersectionTypeOrHigher() {
|
|
return parseUnionOrIntersectionType(163, parseArrayTypeOrHigher, 46);
|
|
}
|
|
function parseUnionTypeOrHigher() {
|
|
return parseUnionOrIntersectionType(162, parseIntersectionTypeOrHigher, 47);
|
|
}
|
|
function isStartOfFunctionType() {
|
|
if (token === 25) {
|
|
return true;
|
|
}
|
|
return token === 17 && lookAhead(isUnambiguouslyStartOfFunctionType);
|
|
}
|
|
function skipParameterStart() {
|
|
if (ts.isModifierKind(token)) {
|
|
parseModifiers();
|
|
}
|
|
if (isIdentifier() || token === 97) {
|
|
nextToken();
|
|
return true;
|
|
}
|
|
if (token === 19 || token === 15) {
|
|
var previousErrorCount = parseDiagnostics.length;
|
|
parseIdentifierOrPattern();
|
|
return previousErrorCount === parseDiagnostics.length;
|
|
}
|
|
return false;
|
|
}
|
|
function isUnambiguouslyStartOfFunctionType() {
|
|
nextToken();
|
|
if (token === 18 || token === 22) {
|
|
return true;
|
|
}
|
|
if (skipParameterStart()) {
|
|
if (token === 54 || token === 24 ||
|
|
token === 53 || token === 56) {
|
|
return true;
|
|
}
|
|
if (token === 18) {
|
|
nextToken();
|
|
if (token === 34) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function parseTypeOrTypePredicate() {
|
|
var typePredicateVariable = isIdentifier() && tryParse(parseTypePredicatePrefix);
|
|
var type = parseType();
|
|
if (typePredicateVariable) {
|
|
var node = createNode(154, typePredicateVariable.pos);
|
|
node.parameterName = typePredicateVariable;
|
|
node.type = type;
|
|
return finishNode(node);
|
|
}
|
|
else {
|
|
return type;
|
|
}
|
|
}
|
|
function parseTypePredicatePrefix() {
|
|
var id = parseIdentifier();
|
|
if (token === 124 && !scanner.hasPrecedingLineBreak()) {
|
|
nextToken();
|
|
return id;
|
|
}
|
|
}
|
|
function parseType() {
|
|
return doOutsideOfContext(41943040, parseTypeWorker);
|
|
}
|
|
function parseTypeWorker() {
|
|
if (isStartOfFunctionType()) {
|
|
return parseFunctionOrConstructorType(156);
|
|
}
|
|
if (token === 92) {
|
|
return parseFunctionOrConstructorType(157);
|
|
}
|
|
return parseUnionTypeOrHigher();
|
|
}
|
|
function parseTypeAnnotation() {
|
|
return parseOptional(54) ? parseType() : undefined;
|
|
}
|
|
function isStartOfLeftHandSideExpression() {
|
|
switch (token) {
|
|
case 97:
|
|
case 95:
|
|
case 93:
|
|
case 99:
|
|
case 84:
|
|
case 8:
|
|
case 9:
|
|
case 11:
|
|
case 12:
|
|
case 17:
|
|
case 19:
|
|
case 15:
|
|
case 87:
|
|
case 73:
|
|
case 92:
|
|
case 39:
|
|
case 61:
|
|
case 69:
|
|
return true;
|
|
default:
|
|
return isIdentifier();
|
|
}
|
|
}
|
|
function isStartOfExpression() {
|
|
if (isStartOfLeftHandSideExpression()) {
|
|
return true;
|
|
}
|
|
switch (token) {
|
|
case 35:
|
|
case 36:
|
|
case 50:
|
|
case 49:
|
|
case 78:
|
|
case 101:
|
|
case 103:
|
|
case 41:
|
|
case 42:
|
|
case 25:
|
|
case 119:
|
|
case 114:
|
|
return true;
|
|
default:
|
|
if (isBinaryOperator()) {
|
|
return true;
|
|
}
|
|
return isIdentifier();
|
|
}
|
|
}
|
|
function isStartOfExpressionStatement() {
|
|
return token !== 15 &&
|
|
token !== 87 &&
|
|
token !== 73 &&
|
|
token !== 55 &&
|
|
isStartOfExpression();
|
|
}
|
|
function parseExpression() {
|
|
var saveDecoratorContext = inDecoratorContext();
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(false);
|
|
}
|
|
var expr = parseAssignmentExpressionOrHigher();
|
|
var operatorToken;
|
|
while ((operatorToken = parseOptionalToken(24))) {
|
|
expr = makeBinaryExpression(expr, operatorToken, parseAssignmentExpressionOrHigher());
|
|
}
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(true);
|
|
}
|
|
return expr;
|
|
}
|
|
function parseInitializer(inParameter) {
|
|
if (token !== 56) {
|
|
if (scanner.hasPrecedingLineBreak() || (inParameter && token === 15) || !isStartOfExpression()) {
|
|
return undefined;
|
|
}
|
|
}
|
|
parseExpected(56);
|
|
return parseAssignmentExpressionOrHigher();
|
|
}
|
|
function parseAssignmentExpressionOrHigher() {
|
|
if (isYieldExpression()) {
|
|
return parseYieldExpression();
|
|
}
|
|
var arrowExpression = tryParseParenthesizedArrowFunctionExpression() || tryParseAsyncSimpleArrowFunctionExpression();
|
|
if (arrowExpression) {
|
|
return arrowExpression;
|
|
}
|
|
var expr = parseBinaryExpressionOrHigher(0);
|
|
if (expr.kind === 69 && token === 34) {
|
|
return parseSimpleArrowFunctionExpression(expr);
|
|
}
|
|
if (ts.isLeftHandSideExpression(expr) && ts.isAssignmentOperator(reScanGreaterToken())) {
|
|
return makeBinaryExpression(expr, parseTokenNode(), parseAssignmentExpressionOrHigher());
|
|
}
|
|
return parseConditionalExpressionRest(expr);
|
|
}
|
|
function isYieldExpression() {
|
|
if (token === 114) {
|
|
if (inYieldContext()) {
|
|
return true;
|
|
}
|
|
return lookAhead(nextTokenIsIdentifierOrKeywordOrNumberOnSameLine);
|
|
}
|
|
return false;
|
|
}
|
|
function nextTokenIsIdentifierOnSameLine() {
|
|
nextToken();
|
|
return !scanner.hasPrecedingLineBreak() && isIdentifier();
|
|
}
|
|
function parseYieldExpression() {
|
|
var node = createNode(190);
|
|
nextToken();
|
|
if (!scanner.hasPrecedingLineBreak() &&
|
|
(token === 37 || isStartOfExpression())) {
|
|
node.asteriskToken = parseOptionalToken(37);
|
|
node.expression = parseAssignmentExpressionOrHigher();
|
|
return finishNode(node);
|
|
}
|
|
else {
|
|
return finishNode(node);
|
|
}
|
|
}
|
|
function parseSimpleArrowFunctionExpression(identifier, asyncModifier) {
|
|
ts.Debug.assert(token === 34, "parseSimpleArrowFunctionExpression should only have been called if we had a =>");
|
|
var node;
|
|
if (asyncModifier) {
|
|
node = createNode(180, asyncModifier.pos);
|
|
setModifiers(node, asyncModifier);
|
|
}
|
|
else {
|
|
node = createNode(180, identifier.pos);
|
|
}
|
|
var parameter = createNode(142, identifier.pos);
|
|
parameter.name = identifier;
|
|
finishNode(parameter);
|
|
node.parameters = [parameter];
|
|
node.parameters.pos = parameter.pos;
|
|
node.parameters.end = parameter.end;
|
|
node.equalsGreaterThanToken = parseExpectedToken(34, false, ts.Diagnostics._0_expected, "=>");
|
|
node.body = parseArrowFunctionExpressionBody(!!asyncModifier);
|
|
return finishNode(node);
|
|
}
|
|
function tryParseParenthesizedArrowFunctionExpression() {
|
|
var triState = isParenthesizedArrowFunctionExpression();
|
|
if (triState === 0) {
|
|
return undefined;
|
|
}
|
|
var arrowFunction = triState === 1
|
|
? parseParenthesizedArrowFunctionExpressionHead(true)
|
|
: tryParse(parsePossibleParenthesizedArrowFunctionExpressionHead);
|
|
if (!arrowFunction) {
|
|
return undefined;
|
|
}
|
|
var isAsync = !!(arrowFunction.flags & 256);
|
|
var lastToken = token;
|
|
arrowFunction.equalsGreaterThanToken = parseExpectedToken(34, false, ts.Diagnostics._0_expected, "=>");
|
|
arrowFunction.body = (lastToken === 34 || lastToken === 15)
|
|
? parseArrowFunctionExpressionBody(isAsync)
|
|
: parseIdentifier();
|
|
return finishNode(arrowFunction);
|
|
}
|
|
function isParenthesizedArrowFunctionExpression() {
|
|
if (token === 17 || token === 25 || token === 118) {
|
|
return lookAhead(isParenthesizedArrowFunctionExpressionWorker);
|
|
}
|
|
if (token === 34) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
function isParenthesizedArrowFunctionExpressionWorker() {
|
|
if (token === 118) {
|
|
nextToken();
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
return 0;
|
|
}
|
|
if (token !== 17 && token !== 25) {
|
|
return 0;
|
|
}
|
|
}
|
|
var first = token;
|
|
var second = nextToken();
|
|
if (first === 17) {
|
|
if (second === 18) {
|
|
var third = nextToken();
|
|
switch (third) {
|
|
case 34:
|
|
case 54:
|
|
case 15:
|
|
return 1;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
if (second === 19 || second === 15) {
|
|
return 2;
|
|
}
|
|
if (second === 22) {
|
|
return 1;
|
|
}
|
|
if (!isIdentifier()) {
|
|
return 0;
|
|
}
|
|
if (nextToken() === 54) {
|
|
return 1;
|
|
}
|
|
return 2;
|
|
}
|
|
else {
|
|
ts.Debug.assert(first === 25);
|
|
if (!isIdentifier()) {
|
|
return 0;
|
|
}
|
|
if (sourceFile.languageVariant === 1) {
|
|
var isArrowFunctionInJsx = lookAhead(function () {
|
|
var third = nextToken();
|
|
if (third === 83) {
|
|
var fourth = nextToken();
|
|
switch (fourth) {
|
|
case 56:
|
|
case 27:
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
else if (third === 24) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
if (isArrowFunctionInJsx) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
return 2;
|
|
}
|
|
}
|
|
function parsePossibleParenthesizedArrowFunctionExpressionHead() {
|
|
return parseParenthesizedArrowFunctionExpressionHead(false);
|
|
}
|
|
function tryParseAsyncSimpleArrowFunctionExpression() {
|
|
if (token === 118) {
|
|
var isUnParenthesizedAsyncArrowFunction = lookAhead(isUnParenthesizedAsyncArrowFunctionWorker);
|
|
if (isUnParenthesizedAsyncArrowFunction === 1) {
|
|
var asyncModifier = parseModifiersForArrowFunction();
|
|
var expr = parseBinaryExpressionOrHigher(0);
|
|
return parseSimpleArrowFunctionExpression(expr, asyncModifier);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function isUnParenthesizedAsyncArrowFunctionWorker() {
|
|
if (token === 118) {
|
|
nextToken();
|
|
if (scanner.hasPrecedingLineBreak() || token === 34) {
|
|
return 0;
|
|
}
|
|
var expr = parseBinaryExpressionOrHigher(0);
|
|
if (!scanner.hasPrecedingLineBreak() && expr.kind === 69 && token === 34) {
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function parseParenthesizedArrowFunctionExpressionHead(allowAmbiguity) {
|
|
var node = createNode(180);
|
|
setModifiers(node, parseModifiersForArrowFunction());
|
|
var isAsync = !!(node.flags & 256);
|
|
fillSignature(54, false, isAsync, !allowAmbiguity, node);
|
|
if (!node.parameters) {
|
|
return undefined;
|
|
}
|
|
if (!allowAmbiguity && token !== 34 && token !== 15) {
|
|
return undefined;
|
|
}
|
|
return node;
|
|
}
|
|
function parseArrowFunctionExpressionBody(isAsync) {
|
|
if (token === 15) {
|
|
return parseFunctionBlock(false, isAsync, false);
|
|
}
|
|
if (token !== 23 &&
|
|
token !== 87 &&
|
|
token !== 73 &&
|
|
isStartOfStatement() &&
|
|
!isStartOfExpressionStatement()) {
|
|
return parseFunctionBlock(false, isAsync, true);
|
|
}
|
|
return isAsync
|
|
? doInAwaitContext(parseAssignmentExpressionOrHigher)
|
|
: doOutsideOfAwaitContext(parseAssignmentExpressionOrHigher);
|
|
}
|
|
function parseConditionalExpressionRest(leftOperand) {
|
|
var questionToken = parseOptionalToken(53);
|
|
if (!questionToken) {
|
|
return leftOperand;
|
|
}
|
|
var node = createNode(188, leftOperand.pos);
|
|
node.condition = leftOperand;
|
|
node.questionToken = questionToken;
|
|
node.whenTrue = doOutsideOfContext(disallowInAndDecoratorContext, parseAssignmentExpressionOrHigher);
|
|
node.colonToken = parseExpectedToken(54, false, ts.Diagnostics._0_expected, ts.tokenToString(54));
|
|
node.whenFalse = parseAssignmentExpressionOrHigher();
|
|
return finishNode(node);
|
|
}
|
|
function parseBinaryExpressionOrHigher(precedence) {
|
|
var leftOperand = parseUnaryExpressionOrHigher();
|
|
return parseBinaryExpressionRest(precedence, leftOperand);
|
|
}
|
|
function isInOrOfKeyword(t) {
|
|
return t === 90 || t === 138;
|
|
}
|
|
function parseBinaryExpressionRest(precedence, leftOperand) {
|
|
while (true) {
|
|
reScanGreaterToken();
|
|
var newPrecedence = getBinaryOperatorPrecedence();
|
|
var consumeCurrentOperator = token === 38 ?
|
|
newPrecedence >= precedence :
|
|
newPrecedence > precedence;
|
|
if (!consumeCurrentOperator) {
|
|
break;
|
|
}
|
|
if (token === 90 && inDisallowInContext()) {
|
|
break;
|
|
}
|
|
if (token === 116) {
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
break;
|
|
}
|
|
else {
|
|
nextToken();
|
|
leftOperand = makeAsExpression(leftOperand, parseType());
|
|
}
|
|
}
|
|
else {
|
|
leftOperand = makeBinaryExpression(leftOperand, parseTokenNode(), parseBinaryExpressionOrHigher(newPrecedence));
|
|
}
|
|
}
|
|
return leftOperand;
|
|
}
|
|
function isBinaryOperator() {
|
|
if (inDisallowInContext() && token === 90) {
|
|
return false;
|
|
}
|
|
return getBinaryOperatorPrecedence() > 0;
|
|
}
|
|
function getBinaryOperatorPrecedence() {
|
|
switch (token) {
|
|
case 52:
|
|
return 1;
|
|
case 51:
|
|
return 2;
|
|
case 47:
|
|
return 3;
|
|
case 48:
|
|
return 4;
|
|
case 46:
|
|
return 5;
|
|
case 30:
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
return 6;
|
|
case 25:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
case 91:
|
|
case 90:
|
|
case 116:
|
|
return 7;
|
|
case 43:
|
|
case 44:
|
|
case 45:
|
|
return 8;
|
|
case 35:
|
|
case 36:
|
|
return 9;
|
|
case 37:
|
|
case 39:
|
|
case 40:
|
|
return 10;
|
|
case 38:
|
|
return 11;
|
|
}
|
|
return -1;
|
|
}
|
|
function makeBinaryExpression(left, operatorToken, right) {
|
|
var node = createNode(187, left.pos);
|
|
node.left = left;
|
|
node.operatorToken = operatorToken;
|
|
node.right = right;
|
|
return finishNode(node);
|
|
}
|
|
function makeAsExpression(left, right) {
|
|
var node = createNode(195, left.pos);
|
|
node.expression = left;
|
|
node.type = right;
|
|
return finishNode(node);
|
|
}
|
|
function parsePrefixUnaryExpression() {
|
|
var node = createNode(185);
|
|
node.operator = token;
|
|
nextToken();
|
|
node.operand = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function parseDeleteExpression() {
|
|
var node = createNode(181);
|
|
nextToken();
|
|
node.expression = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeOfExpression() {
|
|
var node = createNode(182);
|
|
nextToken();
|
|
node.expression = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function parseVoidExpression() {
|
|
var node = createNode(183);
|
|
nextToken();
|
|
node.expression = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function isAwaitExpression() {
|
|
if (token === 119) {
|
|
if (inAwaitContext()) {
|
|
return true;
|
|
}
|
|
return lookAhead(nextTokenIsIdentifierOnSameLine);
|
|
}
|
|
return false;
|
|
}
|
|
function parseAwaitExpression() {
|
|
var node = createNode(184);
|
|
nextToken();
|
|
node.expression = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function parseUnaryExpressionOrHigher() {
|
|
if (isAwaitExpression()) {
|
|
return parseAwaitExpression();
|
|
}
|
|
if (isIncrementExpression()) {
|
|
var incrementExpression = parseIncrementExpression();
|
|
return token === 38 ?
|
|
parseBinaryExpressionRest(getBinaryOperatorPrecedence(), incrementExpression) :
|
|
incrementExpression;
|
|
}
|
|
var unaryOperator = token;
|
|
var simpleUnaryExpression = parseSimpleUnaryExpression();
|
|
if (token === 38) {
|
|
var start = ts.skipTrivia(sourceText, simpleUnaryExpression.pos);
|
|
if (simpleUnaryExpression.kind === 177) {
|
|
parseErrorAtPosition(start, simpleUnaryExpression.end - start, ts.Diagnostics.A_type_assertion_expression_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses);
|
|
}
|
|
else {
|
|
parseErrorAtPosition(start, simpleUnaryExpression.end - start, ts.Diagnostics.An_unary_expression_with_the_0_operator_is_not_allowed_in_the_left_hand_side_of_an_exponentiation_expression_Consider_enclosing_the_expression_in_parentheses, ts.tokenToString(unaryOperator));
|
|
}
|
|
}
|
|
return simpleUnaryExpression;
|
|
}
|
|
function parseSimpleUnaryExpression() {
|
|
switch (token) {
|
|
case 35:
|
|
case 36:
|
|
case 50:
|
|
case 49:
|
|
return parsePrefixUnaryExpression();
|
|
case 78:
|
|
return parseDeleteExpression();
|
|
case 101:
|
|
return parseTypeOfExpression();
|
|
case 103:
|
|
return parseVoidExpression();
|
|
case 25:
|
|
return parseTypeAssertion();
|
|
default:
|
|
return parseIncrementExpression();
|
|
}
|
|
}
|
|
function isIncrementExpression() {
|
|
switch (token) {
|
|
case 35:
|
|
case 36:
|
|
case 50:
|
|
case 49:
|
|
case 78:
|
|
case 101:
|
|
case 103:
|
|
return false;
|
|
case 25:
|
|
if (sourceFile.languageVariant !== 1) {
|
|
return false;
|
|
}
|
|
default:
|
|
return true;
|
|
}
|
|
}
|
|
function parseIncrementExpression() {
|
|
if (token === 41 || token === 42) {
|
|
var node = createNode(185);
|
|
node.operator = token;
|
|
nextToken();
|
|
node.operand = parseLeftHandSideExpressionOrHigher();
|
|
return finishNode(node);
|
|
}
|
|
else if (sourceFile.languageVariant === 1 && token === 25 && lookAhead(nextTokenIsIdentifierOrKeyword)) {
|
|
return parseJsxElementOrSelfClosingElement(true);
|
|
}
|
|
var expression = parseLeftHandSideExpressionOrHigher();
|
|
ts.Debug.assert(ts.isLeftHandSideExpression(expression));
|
|
if ((token === 41 || token === 42) && !scanner.hasPrecedingLineBreak()) {
|
|
var node = createNode(186, expression.pos);
|
|
node.operand = expression;
|
|
node.operator = token;
|
|
nextToken();
|
|
return finishNode(node);
|
|
}
|
|
return expression;
|
|
}
|
|
function parseLeftHandSideExpressionOrHigher() {
|
|
var expression = token === 95
|
|
? parseSuperExpression()
|
|
: parseMemberExpressionOrHigher();
|
|
return parseCallExpressionRest(expression);
|
|
}
|
|
function parseMemberExpressionOrHigher() {
|
|
var expression = parsePrimaryExpression();
|
|
return parseMemberExpressionRest(expression);
|
|
}
|
|
function parseSuperExpression() {
|
|
var expression = parseTokenNode();
|
|
if (token === 17 || token === 21 || token === 19) {
|
|
return expression;
|
|
}
|
|
var node = createNode(172, expression.pos);
|
|
node.expression = expression;
|
|
parseExpectedToken(21, false, ts.Diagnostics.super_must_be_followed_by_an_argument_list_or_member_access);
|
|
node.name = parseRightSideOfDot(true);
|
|
return finishNode(node);
|
|
}
|
|
function tagNamesAreEquivalent(lhs, rhs) {
|
|
if (lhs.kind !== rhs.kind) {
|
|
return false;
|
|
}
|
|
if (lhs.kind === 69) {
|
|
return lhs.text === rhs.text;
|
|
}
|
|
if (lhs.kind === 97) {
|
|
return true;
|
|
}
|
|
return lhs.name.text === rhs.name.text &&
|
|
tagNamesAreEquivalent(lhs.expression, rhs.expression);
|
|
}
|
|
function parseJsxElementOrSelfClosingElement(inExpressionContext) {
|
|
var opening = parseJsxOpeningOrSelfClosingElement(inExpressionContext);
|
|
var result;
|
|
if (opening.kind === 243) {
|
|
var node = createNode(241, opening.pos);
|
|
node.openingElement = opening;
|
|
node.children = parseJsxChildren(node.openingElement.tagName);
|
|
node.closingElement = parseJsxClosingElement(inExpressionContext);
|
|
if (!tagNamesAreEquivalent(node.openingElement.tagName, node.closingElement.tagName)) {
|
|
parseErrorAtPosition(node.closingElement.pos, node.closingElement.end - node.closingElement.pos, ts.Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, ts.getTextOfNodeFromSourceText(sourceText, node.openingElement.tagName));
|
|
}
|
|
result = finishNode(node);
|
|
}
|
|
else {
|
|
ts.Debug.assert(opening.kind === 242);
|
|
result = opening;
|
|
}
|
|
if (inExpressionContext && token === 25) {
|
|
var invalidElement = tryParse(function () { return parseJsxElementOrSelfClosingElement(true); });
|
|
if (invalidElement) {
|
|
parseErrorAtCurrentToken(ts.Diagnostics.JSX_expressions_must_have_one_parent_element);
|
|
var badNode = createNode(187, result.pos);
|
|
badNode.end = invalidElement.end;
|
|
badNode.left = result;
|
|
badNode.right = invalidElement;
|
|
badNode.operatorToken = createMissingNode(24, false, undefined);
|
|
badNode.operatorToken.pos = badNode.operatorToken.end = badNode.right.pos;
|
|
return badNode;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function parseJsxText() {
|
|
var node = createNode(244, scanner.getStartPos());
|
|
token = scanner.scanJsxToken();
|
|
return finishNode(node);
|
|
}
|
|
function parseJsxChild() {
|
|
switch (token) {
|
|
case 244:
|
|
return parseJsxText();
|
|
case 15:
|
|
return parseJsxExpression(false);
|
|
case 25:
|
|
return parseJsxElementOrSelfClosingElement(false);
|
|
}
|
|
ts.Debug.fail("Unknown JSX child kind " + token);
|
|
}
|
|
function parseJsxChildren(openingTagName) {
|
|
var result = [];
|
|
result.pos = scanner.getStartPos();
|
|
var saveParsingContext = parsingContext;
|
|
parsingContext |= 1 << 14;
|
|
while (true) {
|
|
token = scanner.reScanJsxToken();
|
|
if (token === 26) {
|
|
break;
|
|
}
|
|
else if (token === 1) {
|
|
parseErrorAtPosition(openingTagName.pos, openingTagName.end - openingTagName.pos, ts.Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, ts.getTextOfNodeFromSourceText(sourceText, openingTagName));
|
|
break;
|
|
}
|
|
result.push(parseJsxChild());
|
|
}
|
|
result.end = scanner.getTokenPos();
|
|
parsingContext = saveParsingContext;
|
|
return result;
|
|
}
|
|
function parseJsxOpeningOrSelfClosingElement(inExpressionContext) {
|
|
var fullStart = scanner.getStartPos();
|
|
parseExpected(25);
|
|
var tagName = parseJsxElementName();
|
|
var attributes = parseList(13, parseJsxAttribute);
|
|
var node;
|
|
if (token === 27) {
|
|
node = createNode(243, fullStart);
|
|
scanJsxText();
|
|
}
|
|
else {
|
|
parseExpected(39);
|
|
if (inExpressionContext) {
|
|
parseExpected(27);
|
|
}
|
|
else {
|
|
parseExpected(27, undefined, false);
|
|
scanJsxText();
|
|
}
|
|
node = createNode(242, fullStart);
|
|
}
|
|
node.tagName = tagName;
|
|
node.attributes = attributes;
|
|
return finishNode(node);
|
|
}
|
|
function parseJsxElementName() {
|
|
scanJsxIdentifier();
|
|
var expression = token === 97 ?
|
|
parseTokenNode() : parseIdentifierName();
|
|
while (parseOptional(21)) {
|
|
var propertyAccess = createNode(172, expression.pos);
|
|
propertyAccess.expression = expression;
|
|
propertyAccess.name = parseRightSideOfDot(true);
|
|
expression = finishNode(propertyAccess);
|
|
}
|
|
return expression;
|
|
}
|
|
function parseJsxExpression(inExpressionContext) {
|
|
var node = createNode(248);
|
|
parseExpected(15);
|
|
if (token !== 16) {
|
|
node.expression = parseAssignmentExpressionOrHigher();
|
|
}
|
|
if (inExpressionContext) {
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
parseExpected(16, undefined, false);
|
|
scanJsxText();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseJsxAttribute() {
|
|
if (token === 15) {
|
|
return parseJsxSpreadAttribute();
|
|
}
|
|
scanJsxIdentifier();
|
|
var node = createNode(246);
|
|
node.name = parseIdentifierName();
|
|
if (parseOptional(56)) {
|
|
switch (token) {
|
|
case 9:
|
|
node.initializer = parseLiteralNode();
|
|
break;
|
|
default:
|
|
node.initializer = parseJsxExpression(true);
|
|
break;
|
|
}
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseJsxSpreadAttribute() {
|
|
var node = createNode(247);
|
|
parseExpected(15);
|
|
parseExpected(22);
|
|
node.expression = parseExpression();
|
|
parseExpected(16);
|
|
return finishNode(node);
|
|
}
|
|
function parseJsxClosingElement(inExpressionContext) {
|
|
var node = createNode(245);
|
|
parseExpected(26);
|
|
node.tagName = parseJsxElementName();
|
|
if (inExpressionContext) {
|
|
parseExpected(27);
|
|
}
|
|
else {
|
|
parseExpected(27, undefined, false);
|
|
scanJsxText();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeAssertion() {
|
|
var node = createNode(177);
|
|
parseExpected(25);
|
|
node.type = parseType();
|
|
parseExpected(27);
|
|
node.expression = parseSimpleUnaryExpression();
|
|
return finishNode(node);
|
|
}
|
|
function parseMemberExpressionRest(expression) {
|
|
while (true) {
|
|
var dotToken = parseOptionalToken(21);
|
|
if (dotToken) {
|
|
var propertyAccess = createNode(172, expression.pos);
|
|
propertyAccess.expression = expression;
|
|
propertyAccess.name = parseRightSideOfDot(true);
|
|
expression = finishNode(propertyAccess);
|
|
continue;
|
|
}
|
|
if (token === 49 && !scanner.hasPrecedingLineBreak()) {
|
|
nextToken();
|
|
var nonNullExpression = createNode(196, expression.pos);
|
|
nonNullExpression.expression = expression;
|
|
expression = finishNode(nonNullExpression);
|
|
continue;
|
|
}
|
|
if (!inDecoratorContext() && parseOptional(19)) {
|
|
var indexedAccess = createNode(173, expression.pos);
|
|
indexedAccess.expression = expression;
|
|
if (token !== 20) {
|
|
indexedAccess.argumentExpression = allowInAnd(parseExpression);
|
|
if (indexedAccess.argumentExpression.kind === 9 || indexedAccess.argumentExpression.kind === 8) {
|
|
var literal = indexedAccess.argumentExpression;
|
|
literal.text = internIdentifier(literal.text);
|
|
}
|
|
}
|
|
parseExpected(20);
|
|
expression = finishNode(indexedAccess);
|
|
continue;
|
|
}
|
|
if (token === 11 || token === 12) {
|
|
var tagExpression = createNode(176, expression.pos);
|
|
tagExpression.tag = expression;
|
|
tagExpression.template = token === 11
|
|
? parseLiteralNode()
|
|
: parseTemplateExpression();
|
|
expression = finishNode(tagExpression);
|
|
continue;
|
|
}
|
|
return expression;
|
|
}
|
|
}
|
|
function parseCallExpressionRest(expression) {
|
|
while (true) {
|
|
expression = parseMemberExpressionRest(expression);
|
|
if (token === 25) {
|
|
var typeArguments = tryParse(parseTypeArgumentsInExpression);
|
|
if (!typeArguments) {
|
|
return expression;
|
|
}
|
|
var callExpr = createNode(174, expression.pos);
|
|
callExpr.expression = expression;
|
|
callExpr.typeArguments = typeArguments;
|
|
callExpr.arguments = parseArgumentList();
|
|
expression = finishNode(callExpr);
|
|
continue;
|
|
}
|
|
else if (token === 17) {
|
|
var callExpr = createNode(174, expression.pos);
|
|
callExpr.expression = expression;
|
|
callExpr.arguments = parseArgumentList();
|
|
expression = finishNode(callExpr);
|
|
continue;
|
|
}
|
|
return expression;
|
|
}
|
|
}
|
|
function parseArgumentList() {
|
|
parseExpected(17);
|
|
var result = parseDelimitedList(11, parseArgumentExpression);
|
|
parseExpected(18);
|
|
return result;
|
|
}
|
|
function parseTypeArgumentsInExpression() {
|
|
if (!parseOptional(25)) {
|
|
return undefined;
|
|
}
|
|
var typeArguments = parseDelimitedList(18, parseType);
|
|
if (!parseExpected(27)) {
|
|
return undefined;
|
|
}
|
|
return typeArguments && canFollowTypeArgumentsInExpression()
|
|
? typeArguments
|
|
: undefined;
|
|
}
|
|
function canFollowTypeArgumentsInExpression() {
|
|
switch (token) {
|
|
case 17:
|
|
case 21:
|
|
case 18:
|
|
case 20:
|
|
case 54:
|
|
case 23:
|
|
case 53:
|
|
case 30:
|
|
case 32:
|
|
case 31:
|
|
case 33:
|
|
case 51:
|
|
case 52:
|
|
case 48:
|
|
case 46:
|
|
case 47:
|
|
case 16:
|
|
case 1:
|
|
return true;
|
|
case 24:
|
|
case 15:
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
function parsePrimaryExpression() {
|
|
switch (token) {
|
|
case 8:
|
|
case 9:
|
|
case 11:
|
|
return parseLiteralNode();
|
|
case 97:
|
|
case 95:
|
|
case 93:
|
|
case 99:
|
|
case 84:
|
|
return parseTokenNode();
|
|
case 17:
|
|
return parseParenthesizedExpression();
|
|
case 19:
|
|
return parseArrayLiteralExpression();
|
|
case 15:
|
|
return parseObjectLiteralExpression();
|
|
case 118:
|
|
if (!lookAhead(nextTokenIsFunctionKeywordOnSameLine)) {
|
|
break;
|
|
}
|
|
return parseFunctionExpression();
|
|
case 73:
|
|
return parseClassExpression();
|
|
case 87:
|
|
return parseFunctionExpression();
|
|
case 92:
|
|
return parseNewExpression();
|
|
case 39:
|
|
case 61:
|
|
if (reScanSlashToken() === 10) {
|
|
return parseLiteralNode();
|
|
}
|
|
break;
|
|
case 12:
|
|
return parseTemplateExpression();
|
|
}
|
|
return parseIdentifier(ts.Diagnostics.Expression_expected);
|
|
}
|
|
function parseParenthesizedExpression() {
|
|
var node = createNode(178);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
return finishNode(node);
|
|
}
|
|
function parseSpreadElement() {
|
|
var node = createNode(191);
|
|
parseExpected(22);
|
|
node.expression = parseAssignmentExpressionOrHigher();
|
|
return finishNode(node);
|
|
}
|
|
function parseArgumentOrArrayLiteralElement() {
|
|
return token === 22 ? parseSpreadElement() :
|
|
token === 24 ? createNode(193) :
|
|
parseAssignmentExpressionOrHigher();
|
|
}
|
|
function parseArgumentExpression() {
|
|
return doOutsideOfContext(disallowInAndDecoratorContext, parseArgumentOrArrayLiteralElement);
|
|
}
|
|
function parseArrayLiteralExpression() {
|
|
var node = createNode(170);
|
|
parseExpected(19);
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
node.multiLine = true;
|
|
}
|
|
node.elements = parseDelimitedList(15, parseArgumentOrArrayLiteralElement);
|
|
parseExpected(20);
|
|
return finishNode(node);
|
|
}
|
|
function tryParseAccessorDeclaration(fullStart, decorators, modifiers) {
|
|
if (parseContextualModifier(123)) {
|
|
return addJSDocComment(parseAccessorDeclaration(149, fullStart, decorators, modifiers));
|
|
}
|
|
else if (parseContextualModifier(131)) {
|
|
return parseAccessorDeclaration(150, fullStart, decorators, modifiers);
|
|
}
|
|
return undefined;
|
|
}
|
|
function parseObjectLiteralElement() {
|
|
var fullStart = scanner.getStartPos();
|
|
var decorators = parseDecorators();
|
|
var modifiers = parseModifiers();
|
|
var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
|
|
if (accessor) {
|
|
return accessor;
|
|
}
|
|
var asteriskToken = parseOptionalToken(37);
|
|
var tokenIsIdentifier = isIdentifier();
|
|
var propertyName = parsePropertyName();
|
|
var questionToken = parseOptionalToken(53);
|
|
if (asteriskToken || token === 17 || token === 25) {
|
|
return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, propertyName, questionToken);
|
|
}
|
|
var isShorthandPropertyAssignment = tokenIsIdentifier && (token === 24 || token === 16 || token === 56);
|
|
if (isShorthandPropertyAssignment) {
|
|
var shorthandDeclaration = createNode(254, fullStart);
|
|
shorthandDeclaration.name = propertyName;
|
|
shorthandDeclaration.questionToken = questionToken;
|
|
var equalsToken = parseOptionalToken(56);
|
|
if (equalsToken) {
|
|
shorthandDeclaration.equalsToken = equalsToken;
|
|
shorthandDeclaration.objectAssignmentInitializer = allowInAnd(parseAssignmentExpressionOrHigher);
|
|
}
|
|
return addJSDocComment(finishNode(shorthandDeclaration));
|
|
}
|
|
else {
|
|
var propertyAssignment = createNode(253, fullStart);
|
|
propertyAssignment.modifiers = modifiers;
|
|
propertyAssignment.name = propertyName;
|
|
propertyAssignment.questionToken = questionToken;
|
|
parseExpected(54);
|
|
propertyAssignment.initializer = allowInAnd(parseAssignmentExpressionOrHigher);
|
|
return addJSDocComment(finishNode(propertyAssignment));
|
|
}
|
|
}
|
|
function parseObjectLiteralExpression() {
|
|
var node = createNode(171);
|
|
parseExpected(15);
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
node.multiLine = true;
|
|
}
|
|
node.properties = parseDelimitedList(12, parseObjectLiteralElement, true);
|
|
parseExpected(16);
|
|
return finishNode(node);
|
|
}
|
|
function parseFunctionExpression() {
|
|
var saveDecoratorContext = inDecoratorContext();
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(false);
|
|
}
|
|
var node = createNode(179);
|
|
setModifiers(node, parseModifiers());
|
|
parseExpected(87);
|
|
node.asteriskToken = parseOptionalToken(37);
|
|
var isGenerator = !!node.asteriskToken;
|
|
var isAsync = !!(node.flags & 256);
|
|
node.name =
|
|
isGenerator && isAsync ? doInYieldAndAwaitContext(parseOptionalIdentifier) :
|
|
isGenerator ? doInYieldContext(parseOptionalIdentifier) :
|
|
isAsync ? doInAwaitContext(parseOptionalIdentifier) :
|
|
parseOptionalIdentifier();
|
|
fillSignature(54, isGenerator, isAsync, false, node);
|
|
node.body = parseFunctionBlock(isGenerator, isAsync, false);
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(true);
|
|
}
|
|
return addJSDocComment(finishNode(node));
|
|
}
|
|
function parseOptionalIdentifier() {
|
|
return isIdentifier() ? parseIdentifier() : undefined;
|
|
}
|
|
function parseNewExpression() {
|
|
var node = createNode(175);
|
|
parseExpected(92);
|
|
node.expression = parseMemberExpressionOrHigher();
|
|
node.typeArguments = tryParse(parseTypeArgumentsInExpression);
|
|
if (node.typeArguments || token === 17) {
|
|
node.arguments = parseArgumentList();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseBlock(ignoreMissingOpenBrace, diagnosticMessage) {
|
|
var node = createNode(199);
|
|
if (parseExpected(15, diagnosticMessage) || ignoreMissingOpenBrace) {
|
|
node.statements = parseList(1, parseStatement);
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
node.statements = createMissingList();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseFunctionBlock(allowYield, allowAwait, ignoreMissingOpenBrace, diagnosticMessage) {
|
|
var savedYieldContext = inYieldContext();
|
|
setYieldContext(allowYield);
|
|
var savedAwaitContext = inAwaitContext();
|
|
setAwaitContext(allowAwait);
|
|
var saveDecoratorContext = inDecoratorContext();
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(false);
|
|
}
|
|
var block = parseBlock(ignoreMissingOpenBrace, diagnosticMessage);
|
|
if (saveDecoratorContext) {
|
|
setDecoratorContext(true);
|
|
}
|
|
setYieldContext(savedYieldContext);
|
|
setAwaitContext(savedAwaitContext);
|
|
return block;
|
|
}
|
|
function parseEmptyStatement() {
|
|
var node = createNode(201);
|
|
parseExpected(23);
|
|
return finishNode(node);
|
|
}
|
|
function parseIfStatement() {
|
|
var node = createNode(203);
|
|
parseExpected(88);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
node.thenStatement = parseStatement();
|
|
node.elseStatement = parseOptional(80) ? parseStatement() : undefined;
|
|
return finishNode(node);
|
|
}
|
|
function parseDoStatement() {
|
|
var node = createNode(204);
|
|
parseExpected(79);
|
|
node.statement = parseStatement();
|
|
parseExpected(104);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
parseOptional(23);
|
|
return finishNode(node);
|
|
}
|
|
function parseWhileStatement() {
|
|
var node = createNode(205);
|
|
parseExpected(104);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
node.statement = parseStatement();
|
|
return finishNode(node);
|
|
}
|
|
function parseForOrForInOrForOfStatement() {
|
|
var pos = getNodePos();
|
|
parseExpected(86);
|
|
parseExpected(17);
|
|
var initializer = undefined;
|
|
if (token !== 23) {
|
|
if (token === 102 || token === 108 || token === 74) {
|
|
initializer = parseVariableDeclarationList(true);
|
|
}
|
|
else {
|
|
initializer = disallowInAnd(parseExpression);
|
|
}
|
|
}
|
|
var forOrForInOrForOfStatement;
|
|
if (parseOptional(90)) {
|
|
var forInStatement = createNode(207, pos);
|
|
forInStatement.initializer = initializer;
|
|
forInStatement.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
forOrForInOrForOfStatement = forInStatement;
|
|
}
|
|
else if (parseOptional(138)) {
|
|
var forOfStatement = createNode(208, pos);
|
|
forOfStatement.initializer = initializer;
|
|
forOfStatement.expression = allowInAnd(parseAssignmentExpressionOrHigher);
|
|
parseExpected(18);
|
|
forOrForInOrForOfStatement = forOfStatement;
|
|
}
|
|
else {
|
|
var forStatement = createNode(206, pos);
|
|
forStatement.initializer = initializer;
|
|
parseExpected(23);
|
|
if (token !== 23 && token !== 18) {
|
|
forStatement.condition = allowInAnd(parseExpression);
|
|
}
|
|
parseExpected(23);
|
|
if (token !== 18) {
|
|
forStatement.incrementor = allowInAnd(parseExpression);
|
|
}
|
|
parseExpected(18);
|
|
forOrForInOrForOfStatement = forStatement;
|
|
}
|
|
forOrForInOrForOfStatement.statement = parseStatement();
|
|
return finishNode(forOrForInOrForOfStatement);
|
|
}
|
|
function parseBreakOrContinueStatement(kind) {
|
|
var node = createNode(kind);
|
|
parseExpected(kind === 210 ? 70 : 75);
|
|
if (!canParseSemicolon()) {
|
|
node.label = parseIdentifier();
|
|
}
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseReturnStatement() {
|
|
var node = createNode(211);
|
|
parseExpected(94);
|
|
if (!canParseSemicolon()) {
|
|
node.expression = allowInAnd(parseExpression);
|
|
}
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseWithStatement() {
|
|
var node = createNode(212);
|
|
parseExpected(105);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
node.statement = parseStatement();
|
|
return finishNode(node);
|
|
}
|
|
function parseCaseClause() {
|
|
var node = createNode(249);
|
|
parseExpected(71);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(54);
|
|
node.statements = parseList(3, parseStatement);
|
|
return finishNode(node);
|
|
}
|
|
function parseDefaultClause() {
|
|
var node = createNode(250);
|
|
parseExpected(77);
|
|
parseExpected(54);
|
|
node.statements = parseList(3, parseStatement);
|
|
return finishNode(node);
|
|
}
|
|
function parseCaseOrDefaultClause() {
|
|
return token === 71 ? parseCaseClause() : parseDefaultClause();
|
|
}
|
|
function parseSwitchStatement() {
|
|
var node = createNode(213);
|
|
parseExpected(96);
|
|
parseExpected(17);
|
|
node.expression = allowInAnd(parseExpression);
|
|
parseExpected(18);
|
|
var caseBlock = createNode(227, scanner.getStartPos());
|
|
parseExpected(15);
|
|
caseBlock.clauses = parseList(2, parseCaseOrDefaultClause);
|
|
parseExpected(16);
|
|
node.caseBlock = finishNode(caseBlock);
|
|
return finishNode(node);
|
|
}
|
|
function parseThrowStatement() {
|
|
var node = createNode(215);
|
|
parseExpected(98);
|
|
node.expression = scanner.hasPrecedingLineBreak() ? undefined : allowInAnd(parseExpression);
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseTryStatement() {
|
|
var node = createNode(216);
|
|
parseExpected(100);
|
|
node.tryBlock = parseBlock(false);
|
|
node.catchClause = token === 72 ? parseCatchClause() : undefined;
|
|
if (!node.catchClause || token === 85) {
|
|
parseExpected(85);
|
|
node.finallyBlock = parseBlock(false);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseCatchClause() {
|
|
var result = createNode(252);
|
|
parseExpected(72);
|
|
if (parseExpected(17)) {
|
|
result.variableDeclaration = parseVariableDeclaration();
|
|
}
|
|
parseExpected(18);
|
|
result.block = parseBlock(false);
|
|
return finishNode(result);
|
|
}
|
|
function parseDebuggerStatement() {
|
|
var node = createNode(217);
|
|
parseExpected(76);
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseExpressionOrLabeledStatement() {
|
|
var fullStart = scanner.getStartPos();
|
|
var expression = allowInAnd(parseExpression);
|
|
if (expression.kind === 69 && parseOptional(54)) {
|
|
var labeledStatement = createNode(214, fullStart);
|
|
labeledStatement.label = expression;
|
|
labeledStatement.statement = parseStatement();
|
|
return addJSDocComment(finishNode(labeledStatement));
|
|
}
|
|
else {
|
|
var expressionStatement = createNode(202, fullStart);
|
|
expressionStatement.expression = expression;
|
|
parseSemicolon();
|
|
return addJSDocComment(finishNode(expressionStatement));
|
|
}
|
|
}
|
|
function nextTokenIsIdentifierOrKeywordOnSameLine() {
|
|
nextToken();
|
|
return ts.tokenIsIdentifierOrKeyword(token) && !scanner.hasPrecedingLineBreak();
|
|
}
|
|
function nextTokenIsFunctionKeywordOnSameLine() {
|
|
nextToken();
|
|
return token === 87 && !scanner.hasPrecedingLineBreak();
|
|
}
|
|
function nextTokenIsIdentifierOrKeywordOrNumberOnSameLine() {
|
|
nextToken();
|
|
return (ts.tokenIsIdentifierOrKeyword(token) || token === 8) && !scanner.hasPrecedingLineBreak();
|
|
}
|
|
function isDeclaration() {
|
|
while (true) {
|
|
switch (token) {
|
|
case 102:
|
|
case 108:
|
|
case 74:
|
|
case 87:
|
|
case 73:
|
|
case 81:
|
|
return true;
|
|
case 107:
|
|
case 134:
|
|
return nextTokenIsIdentifierOnSameLine();
|
|
case 125:
|
|
case 126:
|
|
return nextTokenIsIdentifierOrStringLiteralOnSameLine();
|
|
case 115:
|
|
case 118:
|
|
case 122:
|
|
case 110:
|
|
case 111:
|
|
case 112:
|
|
case 128:
|
|
nextToken();
|
|
if (scanner.hasPrecedingLineBreak()) {
|
|
return false;
|
|
}
|
|
continue;
|
|
case 137:
|
|
nextToken();
|
|
return token === 15 || token === 69 || token === 82;
|
|
case 89:
|
|
nextToken();
|
|
return token === 9 || token === 37 ||
|
|
token === 15 || ts.tokenIsIdentifierOrKeyword(token);
|
|
case 82:
|
|
nextToken();
|
|
if (token === 56 || token === 37 ||
|
|
token === 15 || token === 77 ||
|
|
token === 116) {
|
|
return true;
|
|
}
|
|
continue;
|
|
case 113:
|
|
nextToken();
|
|
continue;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
function isStartOfDeclaration() {
|
|
return lookAhead(isDeclaration);
|
|
}
|
|
function isStartOfStatement() {
|
|
switch (token) {
|
|
case 55:
|
|
case 23:
|
|
case 15:
|
|
case 102:
|
|
case 108:
|
|
case 87:
|
|
case 73:
|
|
case 81:
|
|
case 88:
|
|
case 79:
|
|
case 104:
|
|
case 86:
|
|
case 75:
|
|
case 70:
|
|
case 94:
|
|
case 105:
|
|
case 96:
|
|
case 98:
|
|
case 100:
|
|
case 76:
|
|
case 72:
|
|
case 85:
|
|
return true;
|
|
case 74:
|
|
case 82:
|
|
case 89:
|
|
return isStartOfDeclaration();
|
|
case 118:
|
|
case 122:
|
|
case 107:
|
|
case 125:
|
|
case 126:
|
|
case 134:
|
|
case 137:
|
|
return true;
|
|
case 112:
|
|
case 110:
|
|
case 111:
|
|
case 113:
|
|
case 128:
|
|
return isStartOfDeclaration() || !lookAhead(nextTokenIsIdentifierOrKeywordOnSameLine);
|
|
default:
|
|
return isStartOfExpression();
|
|
}
|
|
}
|
|
function nextTokenIsIdentifierOrStartOfDestructuring() {
|
|
nextToken();
|
|
return isIdentifier() || token === 15 || token === 19;
|
|
}
|
|
function isLetDeclaration() {
|
|
return lookAhead(nextTokenIsIdentifierOrStartOfDestructuring);
|
|
}
|
|
function parseStatement() {
|
|
switch (token) {
|
|
case 23:
|
|
return parseEmptyStatement();
|
|
case 15:
|
|
return parseBlock(false);
|
|
case 102:
|
|
return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
|
|
case 108:
|
|
if (isLetDeclaration()) {
|
|
return parseVariableStatement(scanner.getStartPos(), undefined, undefined);
|
|
}
|
|
break;
|
|
case 87:
|
|
return parseFunctionDeclaration(scanner.getStartPos(), undefined, undefined);
|
|
case 73:
|
|
return parseClassDeclaration(scanner.getStartPos(), undefined, undefined);
|
|
case 88:
|
|
return parseIfStatement();
|
|
case 79:
|
|
return parseDoStatement();
|
|
case 104:
|
|
return parseWhileStatement();
|
|
case 86:
|
|
return parseForOrForInOrForOfStatement();
|
|
case 75:
|
|
return parseBreakOrContinueStatement(209);
|
|
case 70:
|
|
return parseBreakOrContinueStatement(210);
|
|
case 94:
|
|
return parseReturnStatement();
|
|
case 105:
|
|
return parseWithStatement();
|
|
case 96:
|
|
return parseSwitchStatement();
|
|
case 98:
|
|
return parseThrowStatement();
|
|
case 100:
|
|
case 72:
|
|
case 85:
|
|
return parseTryStatement();
|
|
case 76:
|
|
return parseDebuggerStatement();
|
|
case 55:
|
|
return parseDeclaration();
|
|
case 118:
|
|
case 107:
|
|
case 134:
|
|
case 125:
|
|
case 126:
|
|
case 122:
|
|
case 74:
|
|
case 81:
|
|
case 82:
|
|
case 89:
|
|
case 110:
|
|
case 111:
|
|
case 112:
|
|
case 115:
|
|
case 113:
|
|
case 128:
|
|
case 137:
|
|
if (isStartOfDeclaration()) {
|
|
return parseDeclaration();
|
|
}
|
|
break;
|
|
}
|
|
return parseExpressionOrLabeledStatement();
|
|
}
|
|
function parseDeclaration() {
|
|
var fullStart = getNodePos();
|
|
var decorators = parseDecorators();
|
|
var modifiers = parseModifiers();
|
|
switch (token) {
|
|
case 102:
|
|
case 108:
|
|
case 74:
|
|
return parseVariableStatement(fullStart, decorators, modifiers);
|
|
case 87:
|
|
return parseFunctionDeclaration(fullStart, decorators, modifiers);
|
|
case 73:
|
|
return parseClassDeclaration(fullStart, decorators, modifiers);
|
|
case 107:
|
|
return parseInterfaceDeclaration(fullStart, decorators, modifiers);
|
|
case 134:
|
|
return parseTypeAliasDeclaration(fullStart, decorators, modifiers);
|
|
case 81:
|
|
return parseEnumDeclaration(fullStart, decorators, modifiers);
|
|
case 137:
|
|
case 125:
|
|
case 126:
|
|
return parseModuleDeclaration(fullStart, decorators, modifiers);
|
|
case 89:
|
|
return parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers);
|
|
case 82:
|
|
nextToken();
|
|
switch (token) {
|
|
case 77:
|
|
case 56:
|
|
return parseExportAssignment(fullStart, decorators, modifiers);
|
|
case 116:
|
|
return parseNamespaceExportDeclaration(fullStart, decorators, modifiers);
|
|
default:
|
|
return parseExportDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
default:
|
|
if (decorators || modifiers) {
|
|
var node = createMissingNode(239, true, ts.Diagnostics.Declaration_expected);
|
|
node.pos = fullStart;
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
return finishNode(node);
|
|
}
|
|
}
|
|
}
|
|
function nextTokenIsIdentifierOrStringLiteralOnSameLine() {
|
|
nextToken();
|
|
return !scanner.hasPrecedingLineBreak() && (isIdentifier() || token === 9);
|
|
}
|
|
function parseFunctionBlockOrSemicolon(isGenerator, isAsync, diagnosticMessage) {
|
|
if (token !== 15 && canParseSemicolon()) {
|
|
parseSemicolon();
|
|
return;
|
|
}
|
|
return parseFunctionBlock(isGenerator, isAsync, false, diagnosticMessage);
|
|
}
|
|
function parseArrayBindingElement() {
|
|
if (token === 24) {
|
|
return createNode(193);
|
|
}
|
|
var node = createNode(169);
|
|
node.dotDotDotToken = parseOptionalToken(22);
|
|
node.name = parseIdentifierOrPattern();
|
|
node.initializer = parseBindingElementInitializer(false);
|
|
return finishNode(node);
|
|
}
|
|
function parseObjectBindingElement() {
|
|
var node = createNode(169);
|
|
var tokenIsIdentifier = isIdentifier();
|
|
var propertyName = parsePropertyName();
|
|
if (tokenIsIdentifier && token !== 54) {
|
|
node.name = propertyName;
|
|
}
|
|
else {
|
|
parseExpected(54);
|
|
node.propertyName = propertyName;
|
|
node.name = parseIdentifierOrPattern();
|
|
}
|
|
node.initializer = parseBindingElementInitializer(false);
|
|
return finishNode(node);
|
|
}
|
|
function parseObjectBindingPattern() {
|
|
var node = createNode(167);
|
|
parseExpected(15);
|
|
node.elements = parseDelimitedList(9, parseObjectBindingElement);
|
|
parseExpected(16);
|
|
return finishNode(node);
|
|
}
|
|
function parseArrayBindingPattern() {
|
|
var node = createNode(168);
|
|
parseExpected(19);
|
|
node.elements = parseDelimitedList(10, parseArrayBindingElement);
|
|
parseExpected(20);
|
|
return finishNode(node);
|
|
}
|
|
function isIdentifierOrPattern() {
|
|
return token === 15 || token === 19 || isIdentifier();
|
|
}
|
|
function parseIdentifierOrPattern() {
|
|
if (token === 19) {
|
|
return parseArrayBindingPattern();
|
|
}
|
|
if (token === 15) {
|
|
return parseObjectBindingPattern();
|
|
}
|
|
return parseIdentifier();
|
|
}
|
|
function parseVariableDeclaration() {
|
|
var node = createNode(218);
|
|
node.name = parseIdentifierOrPattern();
|
|
node.type = parseTypeAnnotation();
|
|
if (!isInOrOfKeyword(token)) {
|
|
node.initializer = parseInitializer(false);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseVariableDeclarationList(inForStatementInitializer) {
|
|
var node = createNode(219);
|
|
switch (token) {
|
|
case 102:
|
|
break;
|
|
case 108:
|
|
node.flags |= 1024;
|
|
break;
|
|
case 74:
|
|
node.flags |= 2048;
|
|
break;
|
|
default:
|
|
ts.Debug.fail();
|
|
}
|
|
nextToken();
|
|
if (token === 138 && lookAhead(canFollowContextualOfKeyword)) {
|
|
node.declarations = createMissingList();
|
|
}
|
|
else {
|
|
var savedDisallowIn = inDisallowInContext();
|
|
setDisallowInContext(inForStatementInitializer);
|
|
node.declarations = parseDelimitedList(8, parseVariableDeclaration);
|
|
setDisallowInContext(savedDisallowIn);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function canFollowContextualOfKeyword() {
|
|
return nextTokenIsIdentifier() && nextToken() === 18;
|
|
}
|
|
function parseVariableStatement(fullStart, decorators, modifiers) {
|
|
var node = createNode(200, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
node.declarationList = parseVariableDeclarationList(false);
|
|
parseSemicolon();
|
|
return addJSDocComment(finishNode(node));
|
|
}
|
|
function parseFunctionDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(220, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(87);
|
|
node.asteriskToken = parseOptionalToken(37);
|
|
node.name = node.flags & 512 ? parseOptionalIdentifier() : parseIdentifier();
|
|
var isGenerator = !!node.asteriskToken;
|
|
var isAsync = !!(node.flags & 256);
|
|
fillSignature(54, isGenerator, isAsync, false, node);
|
|
node.body = parseFunctionBlockOrSemicolon(isGenerator, isAsync, ts.Diagnostics.or_expected);
|
|
return addJSDocComment(finishNode(node));
|
|
}
|
|
function parseConstructorDeclaration(pos, decorators, modifiers) {
|
|
var node = createNode(148, pos);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(121);
|
|
fillSignature(54, false, false, false, node);
|
|
node.body = parseFunctionBlockOrSemicolon(false, false, ts.Diagnostics.or_expected);
|
|
return addJSDocComment(finishNode(node));
|
|
}
|
|
function parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, diagnosticMessage) {
|
|
var method = createNode(147, fullStart);
|
|
method.decorators = decorators;
|
|
setModifiers(method, modifiers);
|
|
method.asteriskToken = asteriskToken;
|
|
method.name = name;
|
|
method.questionToken = questionToken;
|
|
var isGenerator = !!asteriskToken;
|
|
var isAsync = !!(method.flags & 256);
|
|
fillSignature(54, isGenerator, isAsync, false, method);
|
|
method.body = parseFunctionBlockOrSemicolon(isGenerator, isAsync, diagnosticMessage);
|
|
return addJSDocComment(finishNode(method));
|
|
}
|
|
function parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken) {
|
|
var property = createNode(145, fullStart);
|
|
property.decorators = decorators;
|
|
setModifiers(property, modifiers);
|
|
property.name = name;
|
|
property.questionToken = questionToken;
|
|
property.type = parseTypeAnnotation();
|
|
property.initializer = modifiers && modifiers.flags & 32
|
|
? allowInAnd(parseNonParameterInitializer)
|
|
: doOutsideOfContext(8388608 | 4194304, parseNonParameterInitializer);
|
|
parseSemicolon();
|
|
return finishNode(property);
|
|
}
|
|
function parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers) {
|
|
var asteriskToken = parseOptionalToken(37);
|
|
var name = parsePropertyName();
|
|
var questionToken = parseOptionalToken(53);
|
|
if (asteriskToken || token === 17 || token === 25) {
|
|
return parseMethodDeclaration(fullStart, decorators, modifiers, asteriskToken, name, questionToken, ts.Diagnostics.or_expected);
|
|
}
|
|
else {
|
|
return parsePropertyDeclaration(fullStart, decorators, modifiers, name, questionToken);
|
|
}
|
|
}
|
|
function parseNonParameterInitializer() {
|
|
return parseInitializer(false);
|
|
}
|
|
function parseAccessorDeclaration(kind, fullStart, decorators, modifiers) {
|
|
var node = createNode(kind, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
node.name = parsePropertyName();
|
|
fillSignature(54, false, false, false, node);
|
|
node.body = parseFunctionBlockOrSemicolon(false, false);
|
|
return finishNode(node);
|
|
}
|
|
function isClassMemberModifier(idToken) {
|
|
switch (idToken) {
|
|
case 112:
|
|
case 110:
|
|
case 111:
|
|
case 113:
|
|
case 128:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
function isClassMemberStart() {
|
|
var idToken;
|
|
if (token === 55) {
|
|
return true;
|
|
}
|
|
while (ts.isModifierKind(token)) {
|
|
idToken = token;
|
|
if (isClassMemberModifier(idToken)) {
|
|
return true;
|
|
}
|
|
nextToken();
|
|
}
|
|
if (token === 37) {
|
|
return true;
|
|
}
|
|
if (isLiteralPropertyName()) {
|
|
idToken = token;
|
|
nextToken();
|
|
}
|
|
if (token === 19) {
|
|
return true;
|
|
}
|
|
if (idToken !== undefined) {
|
|
if (!ts.isKeyword(idToken) || idToken === 131 || idToken === 123) {
|
|
return true;
|
|
}
|
|
switch (token) {
|
|
case 17:
|
|
case 25:
|
|
case 54:
|
|
case 56:
|
|
case 53:
|
|
return true;
|
|
default:
|
|
return canParseSemicolon();
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function parseDecorators() {
|
|
var decorators;
|
|
while (true) {
|
|
var decoratorStart = getNodePos();
|
|
if (!parseOptional(55)) {
|
|
break;
|
|
}
|
|
if (!decorators) {
|
|
decorators = [];
|
|
decorators.pos = decoratorStart;
|
|
}
|
|
var decorator = createNode(143, decoratorStart);
|
|
decorator.expression = doInDecoratorContext(parseLeftHandSideExpressionOrHigher);
|
|
decorators.push(finishNode(decorator));
|
|
}
|
|
if (decorators) {
|
|
decorators.end = getNodeEnd();
|
|
}
|
|
return decorators;
|
|
}
|
|
function parseModifiers(permitInvalidConstAsModifier) {
|
|
var flags = 0;
|
|
var modifiers;
|
|
while (true) {
|
|
var modifierStart = scanner.getStartPos();
|
|
var modifierKind = token;
|
|
if (token === 74 && permitInvalidConstAsModifier) {
|
|
if (!tryParse(nextTokenIsOnSameLineAndCanFollowModifier)) {
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
if (!parseAnyContextualModifier()) {
|
|
break;
|
|
}
|
|
}
|
|
if (!modifiers) {
|
|
modifiers = [];
|
|
modifiers.pos = modifierStart;
|
|
}
|
|
flags |= ts.modifierToFlag(modifierKind);
|
|
modifiers.push(finishNode(createNode(modifierKind, modifierStart)));
|
|
}
|
|
if (modifiers) {
|
|
modifiers.flags = flags;
|
|
modifiers.end = scanner.getStartPos();
|
|
}
|
|
return modifiers;
|
|
}
|
|
function parseModifiersForArrowFunction() {
|
|
var flags = 0;
|
|
var modifiers;
|
|
if (token === 118) {
|
|
var modifierStart = scanner.getStartPos();
|
|
var modifierKind = token;
|
|
nextToken();
|
|
modifiers = [];
|
|
modifiers.pos = modifierStart;
|
|
flags |= ts.modifierToFlag(modifierKind);
|
|
modifiers.push(finishNode(createNode(modifierKind, modifierStart)));
|
|
modifiers.flags = flags;
|
|
modifiers.end = scanner.getStartPos();
|
|
}
|
|
return modifiers;
|
|
}
|
|
function parseClassElement() {
|
|
if (token === 23) {
|
|
var result = createNode(198);
|
|
nextToken();
|
|
return finishNode(result);
|
|
}
|
|
var fullStart = getNodePos();
|
|
var decorators = parseDecorators();
|
|
var modifiers = parseModifiers(true);
|
|
var accessor = tryParseAccessorDeclaration(fullStart, decorators, modifiers);
|
|
if (accessor) {
|
|
return accessor;
|
|
}
|
|
if (token === 121) {
|
|
return parseConstructorDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
if (isIndexSignature()) {
|
|
return parseIndexSignatureDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
if (ts.tokenIsIdentifierOrKeyword(token) ||
|
|
token === 9 ||
|
|
token === 8 ||
|
|
token === 37 ||
|
|
token === 19) {
|
|
return parsePropertyOrMethodDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
if (decorators || modifiers) {
|
|
var name_7 = createMissingNode(69, true, ts.Diagnostics.Declaration_expected);
|
|
return parsePropertyDeclaration(fullStart, decorators, modifiers, name_7, undefined);
|
|
}
|
|
ts.Debug.fail("Should not have attempted to parse class member declaration.");
|
|
}
|
|
function parseClassExpression() {
|
|
return parseClassDeclarationOrExpression(scanner.getStartPos(), undefined, undefined, 192);
|
|
}
|
|
function parseClassDeclaration(fullStart, decorators, modifiers) {
|
|
return parseClassDeclarationOrExpression(fullStart, decorators, modifiers, 221);
|
|
}
|
|
function parseClassDeclarationOrExpression(fullStart, decorators, modifiers, kind) {
|
|
var node = createNode(kind, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(73);
|
|
node.name = parseNameOfClassDeclarationOrExpression();
|
|
node.typeParameters = parseTypeParameters();
|
|
node.heritageClauses = parseHeritageClauses(true);
|
|
if (parseExpected(15)) {
|
|
node.members = parseClassMembers();
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
node.members = createMissingList();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseNameOfClassDeclarationOrExpression() {
|
|
return isIdentifier() && !isImplementsClause()
|
|
? parseIdentifier()
|
|
: undefined;
|
|
}
|
|
function isImplementsClause() {
|
|
return token === 106 && lookAhead(nextTokenIsIdentifierOrKeyword);
|
|
}
|
|
function parseHeritageClauses(isClassHeritageClause) {
|
|
if (isHeritageClause()) {
|
|
return parseList(20, parseHeritageClause);
|
|
}
|
|
return undefined;
|
|
}
|
|
function parseHeritageClause() {
|
|
if (token === 83 || token === 106) {
|
|
var node = createNode(251);
|
|
node.token = token;
|
|
nextToken();
|
|
node.types = parseDelimitedList(7, parseExpressionWithTypeArguments);
|
|
return finishNode(node);
|
|
}
|
|
return undefined;
|
|
}
|
|
function parseExpressionWithTypeArguments() {
|
|
var node = createNode(194);
|
|
node.expression = parseLeftHandSideExpressionOrHigher();
|
|
if (token === 25) {
|
|
node.typeArguments = parseBracketedList(18, parseType, 25, 27);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function isHeritageClause() {
|
|
return token === 83 || token === 106;
|
|
}
|
|
function parseClassMembers() {
|
|
return parseList(5, parseClassElement);
|
|
}
|
|
function parseInterfaceDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(222, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(107);
|
|
node.name = parseIdentifier();
|
|
node.typeParameters = parseTypeParameters();
|
|
node.heritageClauses = parseHeritageClauses(false);
|
|
node.members = parseObjectTypeMembers();
|
|
return finishNode(node);
|
|
}
|
|
function parseTypeAliasDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(223, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(134);
|
|
node.name = parseIdentifier();
|
|
node.typeParameters = parseTypeParameters();
|
|
parseExpected(56);
|
|
node.type = parseType();
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseEnumMember() {
|
|
var node = createNode(255, scanner.getStartPos());
|
|
node.name = parsePropertyName();
|
|
node.initializer = allowInAnd(parseNonParameterInitializer);
|
|
return finishNode(node);
|
|
}
|
|
function parseEnumDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(224, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
parseExpected(81);
|
|
node.name = parseIdentifier();
|
|
if (parseExpected(15)) {
|
|
node.members = parseDelimitedList(6, parseEnumMember);
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
node.members = createMissingList();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseModuleBlock() {
|
|
var node = createNode(226, scanner.getStartPos());
|
|
if (parseExpected(15)) {
|
|
node.statements = parseList(1, parseStatement);
|
|
parseExpected(16);
|
|
}
|
|
else {
|
|
node.statements = createMissingList();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags) {
|
|
var node = createNode(225, fullStart);
|
|
var namespaceFlag = flags & 4096;
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
node.flags |= flags;
|
|
node.name = parseIdentifier();
|
|
node.body = parseOptional(21)
|
|
? parseModuleOrNamespaceDeclaration(getNodePos(), undefined, undefined, 1 | namespaceFlag)
|
|
: parseModuleBlock();
|
|
return finishNode(node);
|
|
}
|
|
function parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(225, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
if (token === 137) {
|
|
node.name = parseIdentifier();
|
|
node.flags |= 131072;
|
|
}
|
|
else {
|
|
node.name = parseLiteralNode(true);
|
|
}
|
|
if (token === 15) {
|
|
node.body = parseModuleBlock();
|
|
}
|
|
else {
|
|
parseSemicolon();
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseModuleDeclaration(fullStart, decorators, modifiers) {
|
|
var flags = modifiers ? modifiers.flags : 0;
|
|
if (token === 137) {
|
|
return parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
else if (parseOptional(126)) {
|
|
flags |= 4096;
|
|
}
|
|
else {
|
|
parseExpected(125);
|
|
if (token === 9) {
|
|
return parseAmbientExternalModuleDeclaration(fullStart, decorators, modifiers);
|
|
}
|
|
}
|
|
return parseModuleOrNamespaceDeclaration(fullStart, decorators, modifiers, flags);
|
|
}
|
|
function isExternalModuleReference() {
|
|
return token === 129 &&
|
|
lookAhead(nextTokenIsOpenParen);
|
|
}
|
|
function nextTokenIsOpenParen() {
|
|
return nextToken() === 17;
|
|
}
|
|
function nextTokenIsSlash() {
|
|
return nextToken() === 39;
|
|
}
|
|
function parseNamespaceExportDeclaration(fullStart, decorators, modifiers) {
|
|
var exportDeclaration = createNode(228, fullStart);
|
|
exportDeclaration.decorators = decorators;
|
|
exportDeclaration.modifiers = modifiers;
|
|
parseExpected(116);
|
|
parseExpected(126);
|
|
exportDeclaration.name = parseIdentifier();
|
|
parseExpected(23);
|
|
return finishNode(exportDeclaration);
|
|
}
|
|
function parseImportDeclarationOrImportEqualsDeclaration(fullStart, decorators, modifiers) {
|
|
parseExpected(89);
|
|
var afterImportPos = scanner.getStartPos();
|
|
var identifier;
|
|
if (isIdentifier()) {
|
|
identifier = parseIdentifier();
|
|
if (token !== 24 && token !== 136) {
|
|
var importEqualsDeclaration = createNode(229, fullStart);
|
|
importEqualsDeclaration.decorators = decorators;
|
|
setModifiers(importEqualsDeclaration, modifiers);
|
|
importEqualsDeclaration.name = identifier;
|
|
parseExpected(56);
|
|
importEqualsDeclaration.moduleReference = parseModuleReference();
|
|
parseSemicolon();
|
|
return finishNode(importEqualsDeclaration);
|
|
}
|
|
}
|
|
var importDeclaration = createNode(230, fullStart);
|
|
importDeclaration.decorators = decorators;
|
|
setModifiers(importDeclaration, modifiers);
|
|
if (identifier ||
|
|
token === 37 ||
|
|
token === 15) {
|
|
importDeclaration.importClause = parseImportClause(identifier, afterImportPos);
|
|
parseExpected(136);
|
|
}
|
|
importDeclaration.moduleSpecifier = parseModuleSpecifier();
|
|
parseSemicolon();
|
|
return finishNode(importDeclaration);
|
|
}
|
|
function parseImportClause(identifier, fullStart) {
|
|
var importClause = createNode(231, fullStart);
|
|
if (identifier) {
|
|
importClause.name = identifier;
|
|
}
|
|
if (!importClause.name ||
|
|
parseOptional(24)) {
|
|
importClause.namedBindings = token === 37 ? parseNamespaceImport() : parseNamedImportsOrExports(233);
|
|
}
|
|
return finishNode(importClause);
|
|
}
|
|
function parseModuleReference() {
|
|
return isExternalModuleReference()
|
|
? parseExternalModuleReference()
|
|
: parseEntityName(false);
|
|
}
|
|
function parseExternalModuleReference() {
|
|
var node = createNode(240);
|
|
parseExpected(129);
|
|
parseExpected(17);
|
|
node.expression = parseModuleSpecifier();
|
|
parseExpected(18);
|
|
return finishNode(node);
|
|
}
|
|
function parseModuleSpecifier() {
|
|
if (token === 9) {
|
|
var result = parseLiteralNode();
|
|
internIdentifier(result.text);
|
|
return result;
|
|
}
|
|
else {
|
|
return parseExpression();
|
|
}
|
|
}
|
|
function parseNamespaceImport() {
|
|
var namespaceImport = createNode(232);
|
|
parseExpected(37);
|
|
parseExpected(116);
|
|
namespaceImport.name = parseIdentifier();
|
|
return finishNode(namespaceImport);
|
|
}
|
|
function parseNamedImportsOrExports(kind) {
|
|
var node = createNode(kind);
|
|
node.elements = parseBracketedList(21, kind === 233 ? parseImportSpecifier : parseExportSpecifier, 15, 16);
|
|
return finishNode(node);
|
|
}
|
|
function parseExportSpecifier() {
|
|
return parseImportOrExportSpecifier(238);
|
|
}
|
|
function parseImportSpecifier() {
|
|
return parseImportOrExportSpecifier(234);
|
|
}
|
|
function parseImportOrExportSpecifier(kind) {
|
|
var node = createNode(kind);
|
|
var checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
|
|
var checkIdentifierStart = scanner.getTokenPos();
|
|
var checkIdentifierEnd = scanner.getTextPos();
|
|
var identifierName = parseIdentifierName();
|
|
if (token === 116) {
|
|
node.propertyName = identifierName;
|
|
parseExpected(116);
|
|
checkIdentifierIsKeyword = ts.isKeyword(token) && !isIdentifier();
|
|
checkIdentifierStart = scanner.getTokenPos();
|
|
checkIdentifierEnd = scanner.getTextPos();
|
|
node.name = parseIdentifierName();
|
|
}
|
|
else {
|
|
node.name = identifierName;
|
|
}
|
|
if (kind === 234 && checkIdentifierIsKeyword) {
|
|
parseErrorAtPosition(checkIdentifierStart, checkIdentifierEnd - checkIdentifierStart, ts.Diagnostics.Identifier_expected);
|
|
}
|
|
return finishNode(node);
|
|
}
|
|
function parseExportDeclaration(fullStart, decorators, modifiers) {
|
|
var node = createNode(236, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
if (parseOptional(37)) {
|
|
parseExpected(136);
|
|
node.moduleSpecifier = parseModuleSpecifier();
|
|
}
|
|
else {
|
|
node.exportClause = parseNamedImportsOrExports(237);
|
|
if (token === 136 || (token === 9 && !scanner.hasPrecedingLineBreak())) {
|
|
parseExpected(136);
|
|
node.moduleSpecifier = parseModuleSpecifier();
|
|
}
|
|
}
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function parseExportAssignment(fullStart, decorators, modifiers) {
|
|
var node = createNode(235, fullStart);
|
|
node.decorators = decorators;
|
|
setModifiers(node, modifiers);
|
|
if (parseOptional(56)) {
|
|
node.isExportEquals = true;
|
|
}
|
|
else {
|
|
parseExpected(77);
|
|
}
|
|
node.expression = parseAssignmentExpressionOrHigher();
|
|
parseSemicolon();
|
|
return finishNode(node);
|
|
}
|
|
function processReferenceComments(sourceFile) {
|
|
var triviaScanner = ts.createScanner(sourceFile.languageVersion, false, 0, sourceText);
|
|
var referencedFiles = [];
|
|
var typeReferenceDirectives = [];
|
|
var amdDependencies = [];
|
|
var amdModuleName;
|
|
while (true) {
|
|
var kind = triviaScanner.scan();
|
|
if (kind !== 2) {
|
|
if (ts.isTrivia(kind)) {
|
|
continue;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
var range = { pos: triviaScanner.getTokenPos(), end: triviaScanner.getTextPos(), kind: triviaScanner.getToken() };
|
|
var comment = sourceText.substring(range.pos, range.end);
|
|
var referencePathMatchResult = ts.getFileReferenceFromReferencePath(comment, range);
|
|
if (referencePathMatchResult) {
|
|
var fileReference = referencePathMatchResult.fileReference;
|
|
sourceFile.hasNoDefaultLib = referencePathMatchResult.isNoDefaultLib;
|
|
var diagnosticMessage = referencePathMatchResult.diagnosticMessage;
|
|
if (fileReference) {
|
|
if (referencePathMatchResult.isTypeReferenceDirective) {
|
|
typeReferenceDirectives.push(fileReference);
|
|
}
|
|
else {
|
|
referencedFiles.push(fileReference);
|
|
}
|
|
}
|
|
if (diagnosticMessage) {
|
|
parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, diagnosticMessage));
|
|
}
|
|
}
|
|
else {
|
|
var amdModuleNameRegEx = /^\/\/\/\s*<amd-module\s+name\s*=\s*('|")(.+?)\1/gim;
|
|
var amdModuleNameMatchResult = amdModuleNameRegEx.exec(comment);
|
|
if (amdModuleNameMatchResult) {
|
|
if (amdModuleName) {
|
|
parseDiagnostics.push(ts.createFileDiagnostic(sourceFile, range.pos, range.end - range.pos, ts.Diagnostics.An_AMD_module_cannot_have_multiple_name_assignments));
|
|
}
|
|
amdModuleName = amdModuleNameMatchResult[2];
|
|
}
|
|
var amdDependencyRegEx = /^\/\/\/\s*<amd-dependency\s/gim;
|
|
var pathRegex = /\spath\s*=\s*('|")(.+?)\1/gim;
|
|
var nameRegex = /\sname\s*=\s*('|")(.+?)\1/gim;
|
|
var amdDependencyMatchResult = amdDependencyRegEx.exec(comment);
|
|
if (amdDependencyMatchResult) {
|
|
var pathMatchResult = pathRegex.exec(comment);
|
|
var nameMatchResult = nameRegex.exec(comment);
|
|
if (pathMatchResult) {
|
|
var amdDependency = { path: pathMatchResult[2], name: nameMatchResult ? nameMatchResult[2] : undefined };
|
|
amdDependencies.push(amdDependency);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sourceFile.referencedFiles = referencedFiles;
|
|
sourceFile.typeReferenceDirectives = typeReferenceDirectives;
|
|
sourceFile.amdDependencies = amdDependencies;
|
|
sourceFile.moduleName = amdModuleName;
|
|
}
|
|
function setExternalModuleIndicator(sourceFile) {
|
|
sourceFile.externalModuleIndicator = ts.forEach(sourceFile.statements, function (node) {
|
|
return node.flags & 1
|
|
|| node.kind === 229 && node.moduleReference.kind === 240
|
|
|| node.kind === 230
|
|
|| node.kind === 235
|
|
|| node.kind === 236
|
|
? node
|
|
: undefined;
|
|
});
|
|
}
|
|
var JSDocParser;
|
|
(function (JSDocParser) {
|
|
function isJSDocType() {
|
|
switch (token) {
|
|
case 37:
|
|
case 53:
|
|
case 17:
|
|
case 19:
|
|
case 49:
|
|
case 15:
|
|
case 87:
|
|
case 22:
|
|
case 92:
|
|
case 97:
|
|
return true;
|
|
}
|
|
return ts.tokenIsIdentifierOrKeyword(token);
|
|
}
|
|
JSDocParser.isJSDocType = isJSDocType;
|
|
function parseJSDocTypeExpressionForTests(content, start, length) {
|
|
initializeState("file.js", content, 2, undefined, 1);
|
|
scanner.setText(content, start, length);
|
|
token = scanner.scan();
|
|
var jsDocTypeExpression = parseJSDocTypeExpression();
|
|
var diagnostics = parseDiagnostics;
|
|
clearState();
|
|
return jsDocTypeExpression ? { jsDocTypeExpression: jsDocTypeExpression, diagnostics: diagnostics } : undefined;
|
|
}
|
|
JSDocParser.parseJSDocTypeExpressionForTests = parseJSDocTypeExpressionForTests;
|
|
function parseJSDocTypeExpression() {
|
|
var result = createNode(257, scanner.getTokenPos());
|
|
parseExpected(15);
|
|
result.type = parseJSDocTopLevelType();
|
|
parseExpected(16);
|
|
fixupParentReferences(result);
|
|
return finishNode(result);
|
|
}
|
|
JSDocParser.parseJSDocTypeExpression = parseJSDocTypeExpression;
|
|
function parseJSDocTopLevelType() {
|
|
var type = parseJSDocType();
|
|
if (token === 47) {
|
|
var unionType = createNode(261, type.pos);
|
|
unionType.types = parseJSDocTypeList(type);
|
|
type = finishNode(unionType);
|
|
}
|
|
if (token === 56) {
|
|
var optionalType = createNode(268, type.pos);
|
|
nextToken();
|
|
optionalType.type = type;
|
|
type = finishNode(optionalType);
|
|
}
|
|
return type;
|
|
}
|
|
function parseJSDocType() {
|
|
var type = parseBasicTypeExpression();
|
|
while (true) {
|
|
if (token === 19) {
|
|
var arrayType = createNode(260, type.pos);
|
|
arrayType.elementType = type;
|
|
nextToken();
|
|
parseExpected(20);
|
|
type = finishNode(arrayType);
|
|
}
|
|
else if (token === 53) {
|
|
var nullableType = createNode(263, type.pos);
|
|
nullableType.type = type;
|
|
nextToken();
|
|
type = finishNode(nullableType);
|
|
}
|
|
else if (token === 49) {
|
|
var nonNullableType = createNode(264, type.pos);
|
|
nonNullableType.type = type;
|
|
nextToken();
|
|
type = finishNode(nonNullableType);
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function parseBasicTypeExpression() {
|
|
switch (token) {
|
|
case 37:
|
|
return parseJSDocAllType();
|
|
case 53:
|
|
return parseJSDocUnknownOrNullableType();
|
|
case 17:
|
|
return parseJSDocUnionType();
|
|
case 19:
|
|
return parseJSDocTupleType();
|
|
case 49:
|
|
return parseJSDocNonNullableType();
|
|
case 15:
|
|
return parseJSDocRecordType();
|
|
case 87:
|
|
return parseJSDocFunctionType();
|
|
case 22:
|
|
return parseJSDocVariadicType();
|
|
case 92:
|
|
return parseJSDocConstructorType();
|
|
case 97:
|
|
return parseJSDocThisType();
|
|
case 117:
|
|
case 132:
|
|
case 130:
|
|
case 120:
|
|
case 133:
|
|
case 103:
|
|
return parseTokenNode();
|
|
}
|
|
return parseJSDocTypeReference();
|
|
}
|
|
function parseJSDocThisType() {
|
|
var result = createNode(272);
|
|
nextToken();
|
|
parseExpected(54);
|
|
result.type = parseJSDocType();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocConstructorType() {
|
|
var result = createNode(271);
|
|
nextToken();
|
|
parseExpected(54);
|
|
result.type = parseJSDocType();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocVariadicType() {
|
|
var result = createNode(270);
|
|
nextToken();
|
|
result.type = parseJSDocType();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocFunctionType() {
|
|
var result = createNode(269);
|
|
nextToken();
|
|
parseExpected(17);
|
|
result.parameters = parseDelimitedList(22, parseJSDocParameter);
|
|
checkForTrailingComma(result.parameters);
|
|
parseExpected(18);
|
|
if (token === 54) {
|
|
nextToken();
|
|
result.type = parseJSDocType();
|
|
}
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocParameter() {
|
|
var parameter = createNode(142);
|
|
parameter.type = parseJSDocType();
|
|
if (parseOptional(56)) {
|
|
parameter.questionToken = createNode(56);
|
|
}
|
|
return finishNode(parameter);
|
|
}
|
|
function parseJSDocTypeReference() {
|
|
var result = createNode(267);
|
|
result.name = parseSimplePropertyName();
|
|
if (token === 25) {
|
|
result.typeArguments = parseTypeArguments();
|
|
}
|
|
else {
|
|
while (parseOptional(21)) {
|
|
if (token === 25) {
|
|
result.typeArguments = parseTypeArguments();
|
|
break;
|
|
}
|
|
else {
|
|
result.name = parseQualifiedName(result.name);
|
|
}
|
|
}
|
|
}
|
|
return finishNode(result);
|
|
}
|
|
function parseTypeArguments() {
|
|
nextToken();
|
|
var typeArguments = parseDelimitedList(23, parseJSDocType);
|
|
checkForTrailingComma(typeArguments);
|
|
checkForEmptyTypeArgumentList(typeArguments);
|
|
parseExpected(27);
|
|
return typeArguments;
|
|
}
|
|
function checkForEmptyTypeArgumentList(typeArguments) {
|
|
if (parseDiagnostics.length === 0 && typeArguments && typeArguments.length === 0) {
|
|
var start = typeArguments.pos - "<".length;
|
|
var end = ts.skipTrivia(sourceText, typeArguments.end) + ">".length;
|
|
return parseErrorAtPosition(start, end - start, ts.Diagnostics.Type_argument_list_cannot_be_empty);
|
|
}
|
|
}
|
|
function parseQualifiedName(left) {
|
|
var result = createNode(139, left.pos);
|
|
result.left = left;
|
|
result.right = parseIdentifierName();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocRecordType() {
|
|
var result = createNode(265);
|
|
nextToken();
|
|
result.members = parseDelimitedList(24, parseJSDocRecordMember);
|
|
checkForTrailingComma(result.members);
|
|
parseExpected(16);
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocRecordMember() {
|
|
var result = createNode(266);
|
|
result.name = parseSimplePropertyName();
|
|
if (token === 54) {
|
|
nextToken();
|
|
result.type = parseJSDocType();
|
|
}
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocNonNullableType() {
|
|
var result = createNode(264);
|
|
nextToken();
|
|
result.type = parseJSDocType();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocTupleType() {
|
|
var result = createNode(262);
|
|
nextToken();
|
|
result.types = parseDelimitedList(25, parseJSDocType);
|
|
checkForTrailingComma(result.types);
|
|
parseExpected(20);
|
|
return finishNode(result);
|
|
}
|
|
function checkForTrailingComma(list) {
|
|
if (parseDiagnostics.length === 0 && list.hasTrailingComma) {
|
|
var start = list.end - ",".length;
|
|
parseErrorAtPosition(start, ",".length, ts.Diagnostics.Trailing_comma_not_allowed);
|
|
}
|
|
}
|
|
function parseJSDocUnionType() {
|
|
var result = createNode(261);
|
|
nextToken();
|
|
result.types = parseJSDocTypeList(parseJSDocType());
|
|
parseExpected(18);
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocTypeList(firstType) {
|
|
ts.Debug.assert(!!firstType);
|
|
var types = [];
|
|
types.pos = firstType.pos;
|
|
types.push(firstType);
|
|
while (parseOptional(47)) {
|
|
types.push(parseJSDocType());
|
|
}
|
|
types.end = scanner.getStartPos();
|
|
return types;
|
|
}
|
|
function parseJSDocAllType() {
|
|
var result = createNode(258);
|
|
nextToken();
|
|
return finishNode(result);
|
|
}
|
|
function parseJSDocUnknownOrNullableType() {
|
|
var pos = scanner.getStartPos();
|
|
nextToken();
|
|
if (token === 24 ||
|
|
token === 16 ||
|
|
token === 18 ||
|
|
token === 27 ||
|
|
token === 56 ||
|
|
token === 47) {
|
|
var result = createNode(259, pos);
|
|
return finishNode(result);
|
|
}
|
|
else {
|
|
var result = createNode(263, pos);
|
|
result.type = parseJSDocType();
|
|
return finishNode(result);
|
|
}
|
|
}
|
|
function parseIsolatedJSDocComment(content, start, length) {
|
|
initializeState("file.js", content, 2, undefined, 1);
|
|
sourceFile = { languageVariant: 0, text: content };
|
|
var jsDocComment = parseJSDocCommentWorker(start, length);
|
|
var diagnostics = parseDiagnostics;
|
|
clearState();
|
|
return jsDocComment ? { jsDocComment: jsDocComment, diagnostics: diagnostics } : undefined;
|
|
}
|
|
JSDocParser.parseIsolatedJSDocComment = parseIsolatedJSDocComment;
|
|
function parseJSDocComment(parent, start, length) {
|
|
var saveToken = token;
|
|
var saveParseDiagnosticsLength = parseDiagnostics.length;
|
|
var saveParseErrorBeforeNextFinishedNode = parseErrorBeforeNextFinishedNode;
|
|
var comment = parseJSDocCommentWorker(start, length);
|
|
if (comment) {
|
|
comment.parent = parent;
|
|
}
|
|
token = saveToken;
|
|
parseDiagnostics.length = saveParseDiagnosticsLength;
|
|
parseErrorBeforeNextFinishedNode = saveParseErrorBeforeNextFinishedNode;
|
|
return comment;
|
|
}
|
|
JSDocParser.parseJSDocComment = parseJSDocComment;
|
|
function parseJSDocCommentWorker(start, length) {
|
|
var content = sourceText;
|
|
start = start || 0;
|
|
var end = length === undefined ? content.length : start + length;
|
|
length = end - start;
|
|
ts.Debug.assert(start >= 0);
|
|
ts.Debug.assert(start <= end);
|
|
ts.Debug.assert(end <= content.length);
|
|
var tags;
|
|
var result;
|
|
if (content.charCodeAt(start) === 47 &&
|
|
content.charCodeAt(start + 1) === 42 &&
|
|
content.charCodeAt(start + 2) === 42 &&
|
|
content.charCodeAt(start + 3) !== 42) {
|
|
scanner.scanRange(start + 3, length - 5, function () {
|
|
var canParseTag = true;
|
|
var seenAsterisk = true;
|
|
nextJSDocToken();
|
|
while (token !== 1) {
|
|
switch (token) {
|
|
case 55:
|
|
if (canParseTag) {
|
|
parseTag();
|
|
}
|
|
seenAsterisk = false;
|
|
break;
|
|
case 4:
|
|
canParseTag = true;
|
|
seenAsterisk = false;
|
|
break;
|
|
case 37:
|
|
if (seenAsterisk) {
|
|
canParseTag = false;
|
|
}
|
|
seenAsterisk = true;
|
|
break;
|
|
case 69:
|
|
canParseTag = false;
|
|
break;
|
|
case 1:
|
|
break;
|
|
}
|
|
nextJSDocToken();
|
|
}
|
|
result = createJSDocComment();
|
|
});
|
|
}
|
|
return result;
|
|
function createJSDocComment() {
|
|
if (!tags) {
|
|
return undefined;
|
|
}
|
|
var result = createNode(273, start);
|
|
result.tags = tags;
|
|
return finishNode(result, end);
|
|
}
|
|
function skipWhitespace() {
|
|
while (token === 5 || token === 4) {
|
|
nextJSDocToken();
|
|
}
|
|
}
|
|
function parseTag() {
|
|
ts.Debug.assert(token === 55);
|
|
var atToken = createNode(55, scanner.getTokenPos());
|
|
atToken.end = scanner.getTextPos();
|
|
nextJSDocToken();
|
|
var tagName = parseJSDocIdentifierName();
|
|
if (!tagName) {
|
|
return;
|
|
}
|
|
var tag = handleTag(atToken, tagName) || handleUnknownTag(atToken, tagName);
|
|
addTag(tag);
|
|
}
|
|
function handleTag(atToken, tagName) {
|
|
if (tagName) {
|
|
switch (tagName.text) {
|
|
case "param":
|
|
return handleParamTag(atToken, tagName);
|
|
case "return":
|
|
case "returns":
|
|
return handleReturnTag(atToken, tagName);
|
|
case "template":
|
|
return handleTemplateTag(atToken, tagName);
|
|
case "type":
|
|
return handleTypeTag(atToken, tagName);
|
|
case "typedef":
|
|
return handleTypedefTag(atToken, tagName);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function handleUnknownTag(atToken, tagName) {
|
|
var result = createNode(274, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
return finishNode(result);
|
|
}
|
|
function addTag(tag) {
|
|
if (tag) {
|
|
if (!tags) {
|
|
tags = [];
|
|
tags.pos = tag.pos;
|
|
}
|
|
tags.push(tag);
|
|
tags.end = tag.end;
|
|
}
|
|
}
|
|
function tryParseTypeExpression() {
|
|
if (token !== 15) {
|
|
return undefined;
|
|
}
|
|
var typeExpression = parseJSDocTypeExpression();
|
|
return typeExpression;
|
|
}
|
|
function handleParamTag(atToken, tagName) {
|
|
var typeExpression = tryParseTypeExpression();
|
|
skipWhitespace();
|
|
var name;
|
|
var isBracketed;
|
|
if (parseOptionalToken(19)) {
|
|
name = parseJSDocIdentifierName();
|
|
isBracketed = true;
|
|
if (parseOptionalToken(56)) {
|
|
parseExpression();
|
|
}
|
|
parseExpected(20);
|
|
}
|
|
else if (ts.tokenIsIdentifierOrKeyword(token)) {
|
|
name = parseJSDocIdentifierName();
|
|
}
|
|
if (!name) {
|
|
parseErrorAtPosition(scanner.getStartPos(), 0, ts.Diagnostics.Identifier_expected);
|
|
return undefined;
|
|
}
|
|
var preName, postName;
|
|
if (typeExpression) {
|
|
postName = name;
|
|
}
|
|
else {
|
|
preName = name;
|
|
}
|
|
if (!typeExpression) {
|
|
typeExpression = tryParseTypeExpression();
|
|
}
|
|
var result = createNode(275, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
result.preParameterName = preName;
|
|
result.typeExpression = typeExpression;
|
|
result.postParameterName = postName;
|
|
result.isBracketed = isBracketed;
|
|
return finishNode(result);
|
|
}
|
|
function handleReturnTag(atToken, tagName) {
|
|
if (ts.forEach(tags, function (t) { return t.kind === 276; })) {
|
|
parseErrorAtPosition(tagName.pos, scanner.getTokenPos() - tagName.pos, ts.Diagnostics._0_tag_already_specified, tagName.text);
|
|
}
|
|
var result = createNode(276, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
result.typeExpression = tryParseTypeExpression();
|
|
return finishNode(result);
|
|
}
|
|
function handleTypeTag(atToken, tagName) {
|
|
if (ts.forEach(tags, function (t) { return t.kind === 277; })) {
|
|
parseErrorAtPosition(tagName.pos, scanner.getTokenPos() - tagName.pos, ts.Diagnostics._0_tag_already_specified, tagName.text);
|
|
}
|
|
var result = createNode(277, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
result.typeExpression = tryParseTypeExpression();
|
|
return finishNode(result);
|
|
}
|
|
function handlePropertyTag(atToken, tagName) {
|
|
var typeExpression = tryParseTypeExpression();
|
|
skipWhitespace();
|
|
var name = parseJSDocIdentifierName();
|
|
if (!name) {
|
|
parseErrorAtPosition(scanner.getStartPos(), 0, ts.Diagnostics.Identifier_expected);
|
|
return undefined;
|
|
}
|
|
var result = createNode(280, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
result.name = name;
|
|
result.typeExpression = typeExpression;
|
|
return finishNode(result);
|
|
}
|
|
function handleTypedefTag(atToken, tagName) {
|
|
var typeExpression = tryParseTypeExpression();
|
|
skipWhitespace();
|
|
var typedefTag = createNode(279, atToken.pos);
|
|
typedefTag.atToken = atToken;
|
|
typedefTag.tagName = tagName;
|
|
typedefTag.name = parseJSDocIdentifierName();
|
|
typedefTag.typeExpression = typeExpression;
|
|
if (typeExpression) {
|
|
if (typeExpression.type.kind === 267) {
|
|
var jsDocTypeReference = typeExpression.type;
|
|
if (jsDocTypeReference.name.kind === 69) {
|
|
var name_8 = jsDocTypeReference.name;
|
|
if (name_8.text === "Object") {
|
|
typedefTag.jsDocTypeLiteral = scanChildTags();
|
|
}
|
|
}
|
|
}
|
|
if (!typedefTag.jsDocTypeLiteral) {
|
|
typedefTag.jsDocTypeLiteral = typeExpression.type;
|
|
}
|
|
}
|
|
else {
|
|
typedefTag.jsDocTypeLiteral = scanChildTags();
|
|
}
|
|
return finishNode(typedefTag);
|
|
function scanChildTags() {
|
|
var jsDocTypeLiteral = createNode(281, scanner.getStartPos());
|
|
var resumePos = scanner.getStartPos();
|
|
var canParseTag = true;
|
|
var seenAsterisk = false;
|
|
var parentTagTerminated = false;
|
|
while (token !== 1 && !parentTagTerminated) {
|
|
nextJSDocToken();
|
|
switch (token) {
|
|
case 55:
|
|
if (canParseTag) {
|
|
parentTagTerminated = !tryParseChildTag(jsDocTypeLiteral);
|
|
if (!parentTagTerminated) {
|
|
resumePos = scanner.getStartPos();
|
|
}
|
|
}
|
|
seenAsterisk = false;
|
|
break;
|
|
case 4:
|
|
resumePos = scanner.getStartPos() - 1;
|
|
canParseTag = true;
|
|
seenAsterisk = false;
|
|
break;
|
|
case 37:
|
|
if (seenAsterisk) {
|
|
canParseTag = false;
|
|
}
|
|
seenAsterisk = true;
|
|
break;
|
|
case 69:
|
|
canParseTag = false;
|
|
case 1:
|
|
break;
|
|
}
|
|
}
|
|
scanner.setTextPos(resumePos);
|
|
return finishNode(jsDocTypeLiteral);
|
|
}
|
|
}
|
|
function tryParseChildTag(parentTag) {
|
|
ts.Debug.assert(token === 55);
|
|
var atToken = createNode(55, scanner.getStartPos());
|
|
atToken.end = scanner.getTextPos();
|
|
nextJSDocToken();
|
|
var tagName = parseJSDocIdentifierName();
|
|
if (!tagName) {
|
|
return false;
|
|
}
|
|
switch (tagName.text) {
|
|
case "type":
|
|
if (parentTag.jsDocTypeTag) {
|
|
return false;
|
|
}
|
|
parentTag.jsDocTypeTag = handleTypeTag(atToken, tagName);
|
|
return true;
|
|
case "prop":
|
|
case "property":
|
|
if (!parentTag.jsDocPropertyTags) {
|
|
parentTag.jsDocPropertyTags = [];
|
|
}
|
|
var propertyTag = handlePropertyTag(atToken, tagName);
|
|
parentTag.jsDocPropertyTags.push(propertyTag);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function handleTemplateTag(atToken, tagName) {
|
|
if (ts.forEach(tags, function (t) { return t.kind === 278; })) {
|
|
parseErrorAtPosition(tagName.pos, scanner.getTokenPos() - tagName.pos, ts.Diagnostics._0_tag_already_specified, tagName.text);
|
|
}
|
|
var typeParameters = [];
|
|
typeParameters.pos = scanner.getStartPos();
|
|
while (true) {
|
|
var name_9 = parseJSDocIdentifierName();
|
|
if (!name_9) {
|
|
parseErrorAtPosition(scanner.getStartPos(), 0, ts.Diagnostics.Identifier_expected);
|
|
return undefined;
|
|
}
|
|
var typeParameter = createNode(141, name_9.pos);
|
|
typeParameter.name = name_9;
|
|
finishNode(typeParameter);
|
|
typeParameters.push(typeParameter);
|
|
if (token === 24) {
|
|
nextJSDocToken();
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
var result = createNode(278, atToken.pos);
|
|
result.atToken = atToken;
|
|
result.tagName = tagName;
|
|
result.typeParameters = typeParameters;
|
|
finishNode(result);
|
|
typeParameters.end = result.end;
|
|
return result;
|
|
}
|
|
function nextJSDocToken() {
|
|
return token = scanner.scanJSDocToken();
|
|
}
|
|
function parseJSDocIdentifierName() {
|
|
return createJSDocIdentifier(ts.tokenIsIdentifierOrKeyword(token));
|
|
}
|
|
function createJSDocIdentifier(isIdentifier) {
|
|
if (!isIdentifier) {
|
|
parseErrorAtCurrentToken(ts.Diagnostics.Identifier_expected);
|
|
return undefined;
|
|
}
|
|
var pos = scanner.getTokenPos();
|
|
var end = scanner.getTextPos();
|
|
var result = createNode(69, pos);
|
|
result.text = content.substring(pos, end);
|
|
finishNode(result, end);
|
|
nextJSDocToken();
|
|
return result;
|
|
}
|
|
}
|
|
JSDocParser.parseJSDocCommentWorker = parseJSDocCommentWorker;
|
|
})(JSDocParser = Parser.JSDocParser || (Parser.JSDocParser = {}));
|
|
})(Parser || (Parser = {}));
|
|
var IncrementalParser;
|
|
(function (IncrementalParser) {
|
|
function updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks) {
|
|
aggressiveChecks = aggressiveChecks || ts.Debug.shouldAssert(2);
|
|
checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks);
|
|
if (ts.textChangeRangeIsUnchanged(textChangeRange)) {
|
|
return sourceFile;
|
|
}
|
|
if (sourceFile.statements.length === 0) {
|
|
return Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, undefined, true, sourceFile.scriptKind);
|
|
}
|
|
var incrementalSourceFile = sourceFile;
|
|
ts.Debug.assert(!incrementalSourceFile.hasBeenIncrementallyParsed);
|
|
incrementalSourceFile.hasBeenIncrementallyParsed = true;
|
|
var oldText = sourceFile.text;
|
|
var syntaxCursor = createSyntaxCursor(sourceFile);
|
|
var changeRange = extendToAffectedRange(sourceFile, textChangeRange);
|
|
checkChangeRange(sourceFile, newText, changeRange, aggressiveChecks);
|
|
ts.Debug.assert(changeRange.span.start <= textChangeRange.span.start);
|
|
ts.Debug.assert(ts.textSpanEnd(changeRange.span) === ts.textSpanEnd(textChangeRange.span));
|
|
ts.Debug.assert(ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)) === ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)));
|
|
var delta = ts.textChangeRangeNewSpan(changeRange).length - changeRange.span.length;
|
|
updateTokenPositionsAndMarkElements(incrementalSourceFile, changeRange.span.start, ts.textSpanEnd(changeRange.span), ts.textSpanEnd(ts.textChangeRangeNewSpan(changeRange)), delta, oldText, newText, aggressiveChecks);
|
|
var result = Parser.parseSourceFile(sourceFile.fileName, newText, sourceFile.languageVersion, syntaxCursor, true, sourceFile.scriptKind);
|
|
return result;
|
|
}
|
|
IncrementalParser.updateSourceFile = updateSourceFile;
|
|
function moveElementEntirelyPastChangeRange(element, isArray, delta, oldText, newText, aggressiveChecks) {
|
|
if (isArray) {
|
|
visitArray(element);
|
|
}
|
|
else {
|
|
visitNode(element);
|
|
}
|
|
return;
|
|
function visitNode(node) {
|
|
var text = "";
|
|
if (aggressiveChecks && shouldCheckNode(node)) {
|
|
text = oldText.substring(node.pos, node.end);
|
|
}
|
|
if (node._children) {
|
|
node._children = undefined;
|
|
}
|
|
node.pos += delta;
|
|
node.end += delta;
|
|
if (aggressiveChecks && shouldCheckNode(node)) {
|
|
ts.Debug.assert(text === newText.substring(node.pos, node.end));
|
|
}
|
|
forEachChild(node, visitNode, visitArray);
|
|
if (node.jsDocComments) {
|
|
for (var _i = 0, _a = node.jsDocComments; _i < _a.length; _i++) {
|
|
var jsDocComment = _a[_i];
|
|
forEachChild(jsDocComment, visitNode, visitArray);
|
|
}
|
|
}
|
|
checkNodePositions(node, aggressiveChecks);
|
|
}
|
|
function visitArray(array) {
|
|
array._children = undefined;
|
|
array.pos += delta;
|
|
array.end += delta;
|
|
for (var _i = 0, array_8 = array; _i < array_8.length; _i++) {
|
|
var node = array_8[_i];
|
|
visitNode(node);
|
|
}
|
|
}
|
|
}
|
|
function shouldCheckNode(node) {
|
|
switch (node.kind) {
|
|
case 9:
|
|
case 8:
|
|
case 69:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function adjustIntersectingElement(element, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta) {
|
|
ts.Debug.assert(element.end >= changeStart, "Adjusting an element that was entirely before the change range");
|
|
ts.Debug.assert(element.pos <= changeRangeOldEnd, "Adjusting an element that was entirely after the change range");
|
|
ts.Debug.assert(element.pos <= element.end);
|
|
element.pos = Math.min(element.pos, changeRangeNewEnd);
|
|
if (element.end >= changeRangeOldEnd) {
|
|
element.end += delta;
|
|
}
|
|
else {
|
|
element.end = Math.min(element.end, changeRangeNewEnd);
|
|
}
|
|
ts.Debug.assert(element.pos <= element.end);
|
|
if (element.parent) {
|
|
ts.Debug.assert(element.pos >= element.parent.pos);
|
|
ts.Debug.assert(element.end <= element.parent.end);
|
|
}
|
|
}
|
|
function checkNodePositions(node, aggressiveChecks) {
|
|
if (aggressiveChecks) {
|
|
var pos_2 = node.pos;
|
|
forEachChild(node, function (child) {
|
|
ts.Debug.assert(child.pos >= pos_2);
|
|
pos_2 = child.end;
|
|
});
|
|
ts.Debug.assert(pos_2 <= node.end);
|
|
}
|
|
}
|
|
function updateTokenPositionsAndMarkElements(sourceFile, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta, oldText, newText, aggressiveChecks) {
|
|
visitNode(sourceFile);
|
|
return;
|
|
function visitNode(child) {
|
|
ts.Debug.assert(child.pos <= child.end);
|
|
if (child.pos > changeRangeOldEnd) {
|
|
moveElementEntirelyPastChangeRange(child, false, delta, oldText, newText, aggressiveChecks);
|
|
return;
|
|
}
|
|
var fullEnd = child.end;
|
|
if (fullEnd >= changeStart) {
|
|
child.intersectsChange = true;
|
|
child._children = undefined;
|
|
adjustIntersectingElement(child, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
|
|
forEachChild(child, visitNode, visitArray);
|
|
checkNodePositions(child, aggressiveChecks);
|
|
return;
|
|
}
|
|
ts.Debug.assert(fullEnd < changeStart);
|
|
}
|
|
function visitArray(array) {
|
|
ts.Debug.assert(array.pos <= array.end);
|
|
if (array.pos > changeRangeOldEnd) {
|
|
moveElementEntirelyPastChangeRange(array, true, delta, oldText, newText, aggressiveChecks);
|
|
return;
|
|
}
|
|
var fullEnd = array.end;
|
|
if (fullEnd >= changeStart) {
|
|
array.intersectsChange = true;
|
|
array._children = undefined;
|
|
adjustIntersectingElement(array, changeStart, changeRangeOldEnd, changeRangeNewEnd, delta);
|
|
for (var _i = 0, array_9 = array; _i < array_9.length; _i++) {
|
|
var node = array_9[_i];
|
|
visitNode(node);
|
|
}
|
|
return;
|
|
}
|
|
ts.Debug.assert(fullEnd < changeStart);
|
|
}
|
|
}
|
|
function extendToAffectedRange(sourceFile, changeRange) {
|
|
var maxLookahead = 1;
|
|
var start = changeRange.span.start;
|
|
for (var i = 0; start > 0 && i <= maxLookahead; i++) {
|
|
var nearestNode = findNearestNodeStartingBeforeOrAtPosition(sourceFile, start);
|
|
ts.Debug.assert(nearestNode.pos <= start);
|
|
var position = nearestNode.pos;
|
|
start = Math.max(0, position - 1);
|
|
}
|
|
var finalSpan = ts.createTextSpanFromBounds(start, ts.textSpanEnd(changeRange.span));
|
|
var finalLength = changeRange.newLength + (changeRange.span.start - start);
|
|
return ts.createTextChangeRange(finalSpan, finalLength);
|
|
}
|
|
function findNearestNodeStartingBeforeOrAtPosition(sourceFile, position) {
|
|
var bestResult = sourceFile;
|
|
var lastNodeEntirelyBeforePosition;
|
|
forEachChild(sourceFile, visit);
|
|
if (lastNodeEntirelyBeforePosition) {
|
|
var lastChildOfLastEntireNodeBeforePosition = getLastChild(lastNodeEntirelyBeforePosition);
|
|
if (lastChildOfLastEntireNodeBeforePosition.pos > bestResult.pos) {
|
|
bestResult = lastChildOfLastEntireNodeBeforePosition;
|
|
}
|
|
}
|
|
return bestResult;
|
|
function getLastChild(node) {
|
|
while (true) {
|
|
var lastChild = getLastChildWorker(node);
|
|
if (lastChild) {
|
|
node = lastChild;
|
|
}
|
|
else {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
function getLastChildWorker(node) {
|
|
var last = undefined;
|
|
forEachChild(node, function (child) {
|
|
if (ts.nodeIsPresent(child)) {
|
|
last = child;
|
|
}
|
|
});
|
|
return last;
|
|
}
|
|
function visit(child) {
|
|
if (ts.nodeIsMissing(child)) {
|
|
return;
|
|
}
|
|
if (child.pos <= position) {
|
|
if (child.pos >= bestResult.pos) {
|
|
bestResult = child;
|
|
}
|
|
if (position < child.end) {
|
|
forEachChild(child, visit);
|
|
return true;
|
|
}
|
|
else {
|
|
ts.Debug.assert(child.end <= position);
|
|
lastNodeEntirelyBeforePosition = child;
|
|
}
|
|
}
|
|
else {
|
|
ts.Debug.assert(child.pos > position);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
function checkChangeRange(sourceFile, newText, textChangeRange, aggressiveChecks) {
|
|
var oldText = sourceFile.text;
|
|
if (textChangeRange) {
|
|
ts.Debug.assert((oldText.length - textChangeRange.span.length + textChangeRange.newLength) === newText.length);
|
|
if (aggressiveChecks || ts.Debug.shouldAssert(3)) {
|
|
var oldTextPrefix = oldText.substr(0, textChangeRange.span.start);
|
|
var newTextPrefix = newText.substr(0, textChangeRange.span.start);
|
|
ts.Debug.assert(oldTextPrefix === newTextPrefix);
|
|
var oldTextSuffix = oldText.substring(ts.textSpanEnd(textChangeRange.span), oldText.length);
|
|
var newTextSuffix = newText.substring(ts.textSpanEnd(ts.textChangeRangeNewSpan(textChangeRange)), newText.length);
|
|
ts.Debug.assert(oldTextSuffix === newTextSuffix);
|
|
}
|
|
}
|
|
}
|
|
function createSyntaxCursor(sourceFile) {
|
|
var currentArray = sourceFile.statements;
|
|
var currentArrayIndex = 0;
|
|
ts.Debug.assert(currentArrayIndex < currentArray.length);
|
|
var current = currentArray[currentArrayIndex];
|
|
var lastQueriedPosition = -1;
|
|
return {
|
|
currentNode: function (position) {
|
|
if (position !== lastQueriedPosition) {
|
|
if (current && current.end === position && currentArrayIndex < (currentArray.length - 1)) {
|
|
currentArrayIndex++;
|
|
current = currentArray[currentArrayIndex];
|
|
}
|
|
if (!current || current.pos !== position) {
|
|
findHighestListElementThatStartsAtPosition(position);
|
|
}
|
|
}
|
|
lastQueriedPosition = position;
|
|
ts.Debug.assert(!current || current.pos === position);
|
|
return current;
|
|
}
|
|
};
|
|
function findHighestListElementThatStartsAtPosition(position) {
|
|
currentArray = undefined;
|
|
currentArrayIndex = -1;
|
|
current = undefined;
|
|
forEachChild(sourceFile, visitNode, visitArray);
|
|
return;
|
|
function visitNode(node) {
|
|
if (position >= node.pos && position < node.end) {
|
|
forEachChild(node, visitNode, visitArray);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function visitArray(array) {
|
|
if (position >= array.pos && position < array.end) {
|
|
for (var i = 0, n = array.length; i < n; i++) {
|
|
var child = array[i];
|
|
if (child) {
|
|
if (child.pos === position) {
|
|
currentArray = array;
|
|
currentArrayIndex = i;
|
|
current = child;
|
|
return true;
|
|
}
|
|
else {
|
|
if (child.pos < position && position < child.end) {
|
|
forEachChild(child, visitNode, visitArray);
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
})(IncrementalParser || (IncrementalParser = {}));
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.bindTime = 0;
|
|
function getModuleInstanceState(node) {
|
|
if (node.kind === 222 || node.kind === 223) {
|
|
return 0;
|
|
}
|
|
else if (ts.isConstEnumDeclaration(node)) {
|
|
return 2;
|
|
}
|
|
else if ((node.kind === 230 || node.kind === 229) && !(node.flags & 1)) {
|
|
return 0;
|
|
}
|
|
else if (node.kind === 226) {
|
|
var state_1 = 0;
|
|
ts.forEachChild(node, function (n) {
|
|
switch (getModuleInstanceState(n)) {
|
|
case 0:
|
|
return false;
|
|
case 2:
|
|
state_1 = 2;
|
|
return false;
|
|
case 1:
|
|
state_1 = 1;
|
|
return true;
|
|
}
|
|
});
|
|
return state_1;
|
|
}
|
|
else if (node.kind === 225) {
|
|
var body = node.body;
|
|
return body ? getModuleInstanceState(body) : 1;
|
|
}
|
|
else {
|
|
return 1;
|
|
}
|
|
}
|
|
ts.getModuleInstanceState = getModuleInstanceState;
|
|
var binder = createBinder();
|
|
function bindSourceFile(file, options) {
|
|
var start = new Date().getTime();
|
|
binder(file, options);
|
|
ts.bindTime += new Date().getTime() - start;
|
|
}
|
|
ts.bindSourceFile = bindSourceFile;
|
|
function createBinder() {
|
|
var file;
|
|
var options;
|
|
var languageVersion;
|
|
var parent;
|
|
var container;
|
|
var blockScopeContainer;
|
|
var lastContainer;
|
|
var seenThisKeyword;
|
|
var currentFlow;
|
|
var currentBreakTarget;
|
|
var currentContinueTarget;
|
|
var currentReturnTarget;
|
|
var currentTrueTarget;
|
|
var currentFalseTarget;
|
|
var preSwitchCaseFlow;
|
|
var activeLabels;
|
|
var hasExplicitReturn;
|
|
var emitFlags;
|
|
var inStrictMode;
|
|
var symbolCount = 0;
|
|
var Symbol;
|
|
var classifiableNames;
|
|
var unreachableFlow = { flags: 1 };
|
|
var reportedUnreachableFlow = { flags: 1 };
|
|
function bindSourceFile(f, opts) {
|
|
file = f;
|
|
options = opts;
|
|
languageVersion = ts.getEmitScriptTarget(options);
|
|
inStrictMode = !!file.externalModuleIndicator;
|
|
classifiableNames = {};
|
|
symbolCount = 0;
|
|
Symbol = ts.objectAllocator.getSymbolConstructor();
|
|
if (!file.locals) {
|
|
bind(file);
|
|
file.symbolCount = symbolCount;
|
|
file.classifiableNames = classifiableNames;
|
|
}
|
|
file = undefined;
|
|
options = undefined;
|
|
languageVersion = undefined;
|
|
parent = undefined;
|
|
container = undefined;
|
|
blockScopeContainer = undefined;
|
|
lastContainer = undefined;
|
|
seenThisKeyword = false;
|
|
currentFlow = undefined;
|
|
currentBreakTarget = undefined;
|
|
currentContinueTarget = undefined;
|
|
currentReturnTarget = undefined;
|
|
currentTrueTarget = undefined;
|
|
currentFalseTarget = undefined;
|
|
activeLabels = undefined;
|
|
hasExplicitReturn = false;
|
|
emitFlags = 0;
|
|
}
|
|
return bindSourceFile;
|
|
function createSymbol(flags, name) {
|
|
symbolCount++;
|
|
return new Symbol(flags, name);
|
|
}
|
|
function addDeclarationToSymbol(symbol, node, symbolFlags) {
|
|
symbol.flags |= symbolFlags;
|
|
node.symbol = symbol;
|
|
if (!symbol.declarations) {
|
|
symbol.declarations = [];
|
|
}
|
|
symbol.declarations.push(node);
|
|
if (symbolFlags & 1952 && !symbol.exports) {
|
|
symbol.exports = {};
|
|
}
|
|
if (symbolFlags & 6240 && !symbol.members) {
|
|
symbol.members = {};
|
|
}
|
|
if (symbolFlags & 107455) {
|
|
var valueDeclaration = symbol.valueDeclaration;
|
|
if (!valueDeclaration ||
|
|
(valueDeclaration.kind !== node.kind && valueDeclaration.kind === 225)) {
|
|
symbol.valueDeclaration = node;
|
|
}
|
|
}
|
|
}
|
|
function getDeclarationName(node) {
|
|
if (node.name) {
|
|
if (ts.isAmbientModule(node)) {
|
|
return ts.isGlobalScopeAugmentation(node) ? "__global" : "\"" + node.name.text + "\"";
|
|
}
|
|
if (node.name.kind === 140) {
|
|
var nameExpression = node.name.expression;
|
|
if (ts.isStringOrNumericLiteral(nameExpression.kind)) {
|
|
return nameExpression.text;
|
|
}
|
|
ts.Debug.assert(ts.isWellKnownSymbolSyntactically(nameExpression));
|
|
return ts.getPropertyNameForKnownSymbolName(nameExpression.name.text);
|
|
}
|
|
return node.name.text;
|
|
}
|
|
switch (node.kind) {
|
|
case 148:
|
|
return "__constructor";
|
|
case 156:
|
|
case 151:
|
|
return "__call";
|
|
case 157:
|
|
case 152:
|
|
return "__new";
|
|
case 153:
|
|
return "__index";
|
|
case 236:
|
|
return "__export";
|
|
case 235:
|
|
return node.isExportEquals ? "export=" : "default";
|
|
case 187:
|
|
switch (ts.getSpecialPropertyAssignmentKind(node)) {
|
|
case 2:
|
|
return "export=";
|
|
case 1:
|
|
case 4:
|
|
return node.left.name.text;
|
|
case 3:
|
|
return node.left.expression.name.text;
|
|
}
|
|
ts.Debug.fail("Unknown binary declaration kind");
|
|
break;
|
|
case 220:
|
|
case 221:
|
|
return node.flags & 512 ? "default" : undefined;
|
|
case 269:
|
|
return ts.isJSDocConstructSignature(node) ? "__new" : "__call";
|
|
case 142:
|
|
ts.Debug.assert(node.parent.kind === 269);
|
|
var functionType = node.parent;
|
|
var index = ts.indexOf(functionType.parameters, node);
|
|
return "p" + index;
|
|
case 279:
|
|
var parentNode = node.parent && node.parent.parent;
|
|
var nameFromParentNode = void 0;
|
|
if (parentNode && parentNode.kind === 200) {
|
|
if (parentNode.declarationList.declarations.length > 0) {
|
|
var nameIdentifier = parentNode.declarationList.declarations[0].name;
|
|
if (nameIdentifier.kind === 69) {
|
|
nameFromParentNode = nameIdentifier.text;
|
|
}
|
|
}
|
|
}
|
|
return nameFromParentNode;
|
|
}
|
|
}
|
|
function getDisplayName(node) {
|
|
return node.name ? ts.declarationNameToString(node.name) : getDeclarationName(node);
|
|
}
|
|
function declareSymbol(symbolTable, parent, node, includes, excludes) {
|
|
ts.Debug.assert(!ts.hasDynamicName(node));
|
|
var isDefaultExport = node.flags & 512;
|
|
var name = isDefaultExport && parent ? "default" : getDeclarationName(node);
|
|
var symbol;
|
|
if (name !== undefined) {
|
|
symbol = ts.hasProperty(symbolTable, name)
|
|
? symbolTable[name]
|
|
: (symbolTable[name] = createSymbol(0, name));
|
|
if (name && (includes & 788448)) {
|
|
classifiableNames[name] = name;
|
|
}
|
|
if (symbol.flags & excludes) {
|
|
if (node.name) {
|
|
node.name.parent = node;
|
|
}
|
|
var message_1 = symbol.flags & 2
|
|
? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0
|
|
: ts.Diagnostics.Duplicate_identifier_0;
|
|
ts.forEach(symbol.declarations, function (declaration) {
|
|
if (declaration.flags & 512) {
|
|
message_1 = ts.Diagnostics.A_module_cannot_have_multiple_default_exports;
|
|
}
|
|
});
|
|
ts.forEach(symbol.declarations, function (declaration) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(declaration.name || declaration, message_1, getDisplayName(declaration)));
|
|
});
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node.name || node, message_1, getDisplayName(node)));
|
|
symbol = createSymbol(0, name);
|
|
}
|
|
}
|
|
else {
|
|
symbol = createSymbol(0, "__missing");
|
|
}
|
|
addDeclarationToSymbol(symbol, node, includes);
|
|
symbol.parent = parent;
|
|
return symbol;
|
|
}
|
|
function declareModuleMember(node, symbolFlags, symbolExcludes) {
|
|
var hasExportModifier = ts.getCombinedNodeFlags(node) & 1;
|
|
if (symbolFlags & 8388608) {
|
|
if (node.kind === 238 || (node.kind === 229 && hasExportModifier)) {
|
|
return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
|
|
}
|
|
else {
|
|
return declareSymbol(container.locals, undefined, node, symbolFlags, symbolExcludes);
|
|
}
|
|
}
|
|
else {
|
|
if (!ts.isAmbientModule(node) && (hasExportModifier || container.flags & 8192)) {
|
|
var exportKind = (symbolFlags & 107455 ? 1048576 : 0) |
|
|
(symbolFlags & 793056 ? 2097152 : 0) |
|
|
(symbolFlags & 1536 ? 4194304 : 0);
|
|
var local = declareSymbol(container.locals, undefined, node, exportKind, symbolExcludes);
|
|
local.exportSymbol = declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
|
|
node.localSymbol = local;
|
|
return local;
|
|
}
|
|
else {
|
|
return declareSymbol(container.locals, undefined, node, symbolFlags, symbolExcludes);
|
|
}
|
|
}
|
|
}
|
|
function bindContainer(node, containerFlags) {
|
|
var saveContainer = container;
|
|
var savedBlockScopeContainer = blockScopeContainer;
|
|
if (containerFlags & 1) {
|
|
container = blockScopeContainer = node;
|
|
if (containerFlags & 32) {
|
|
container.locals = {};
|
|
}
|
|
addToContainerChain(container);
|
|
}
|
|
else if (containerFlags & 2) {
|
|
blockScopeContainer = node;
|
|
blockScopeContainer.locals = undefined;
|
|
}
|
|
if (containerFlags & 4) {
|
|
var saveCurrentFlow = currentFlow;
|
|
var saveBreakTarget = currentBreakTarget;
|
|
var saveContinueTarget = currentContinueTarget;
|
|
var saveReturnTarget = currentReturnTarget;
|
|
var saveActiveLabels = activeLabels;
|
|
var saveHasExplicitReturn = hasExplicitReturn;
|
|
var isIIFE = containerFlags & 16 && !!ts.getImmediatelyInvokedFunctionExpression(node);
|
|
if (isIIFE) {
|
|
currentReturnTarget = createBranchLabel();
|
|
}
|
|
else {
|
|
currentFlow = { flags: 2 };
|
|
if (containerFlags & 16) {
|
|
currentFlow.container = node;
|
|
}
|
|
currentReturnTarget = undefined;
|
|
}
|
|
currentBreakTarget = undefined;
|
|
currentContinueTarget = undefined;
|
|
activeLabels = undefined;
|
|
hasExplicitReturn = false;
|
|
bindChildren(node);
|
|
node.flags &= ~4030464;
|
|
if (!(currentFlow.flags & 1) && containerFlags & 8 && ts.nodeIsPresent(node.body)) {
|
|
node.flags |= 32768;
|
|
if (hasExplicitReturn)
|
|
node.flags |= 65536;
|
|
}
|
|
if (node.kind === 256) {
|
|
node.flags |= emitFlags;
|
|
}
|
|
if (isIIFE) {
|
|
addAntecedent(currentReturnTarget, currentFlow);
|
|
currentFlow = finishFlowLabel(currentReturnTarget);
|
|
}
|
|
else {
|
|
currentFlow = saveCurrentFlow;
|
|
}
|
|
currentBreakTarget = saveBreakTarget;
|
|
currentContinueTarget = saveContinueTarget;
|
|
currentReturnTarget = saveReturnTarget;
|
|
activeLabels = saveActiveLabels;
|
|
hasExplicitReturn = saveHasExplicitReturn;
|
|
}
|
|
else if (containerFlags & 64) {
|
|
seenThisKeyword = false;
|
|
bindChildren(node);
|
|
node.flags = seenThisKeyword ? node.flags | 16384 : node.flags & ~16384;
|
|
}
|
|
else {
|
|
bindChildren(node);
|
|
}
|
|
container = saveContainer;
|
|
blockScopeContainer = savedBlockScopeContainer;
|
|
}
|
|
function bindChildren(node) {
|
|
if (ts.isInJavaScriptFile(node) && node.jsDocComments) {
|
|
for (var _i = 0, _a = node.jsDocComments; _i < _a.length; _i++) {
|
|
var jsDocComment = _a[_i];
|
|
bind(jsDocComment);
|
|
}
|
|
}
|
|
if (checkUnreachable(node)) {
|
|
ts.forEachChild(node, bind);
|
|
return;
|
|
}
|
|
switch (node.kind) {
|
|
case 205:
|
|
bindWhileStatement(node);
|
|
break;
|
|
case 204:
|
|
bindDoStatement(node);
|
|
break;
|
|
case 206:
|
|
bindForStatement(node);
|
|
break;
|
|
case 207:
|
|
case 208:
|
|
bindForInOrForOfStatement(node);
|
|
break;
|
|
case 203:
|
|
bindIfStatement(node);
|
|
break;
|
|
case 211:
|
|
case 215:
|
|
bindReturnOrThrow(node);
|
|
break;
|
|
case 210:
|
|
case 209:
|
|
bindBreakOrContinueStatement(node);
|
|
break;
|
|
case 216:
|
|
bindTryStatement(node);
|
|
break;
|
|
case 213:
|
|
bindSwitchStatement(node);
|
|
break;
|
|
case 227:
|
|
bindCaseBlock(node);
|
|
break;
|
|
case 249:
|
|
bindCaseClause(node);
|
|
break;
|
|
case 214:
|
|
bindLabeledStatement(node);
|
|
break;
|
|
case 185:
|
|
bindPrefixUnaryExpressionFlow(node);
|
|
break;
|
|
case 187:
|
|
bindBinaryExpressionFlow(node);
|
|
break;
|
|
case 181:
|
|
bindDeleteExpressionFlow(node);
|
|
break;
|
|
case 188:
|
|
bindConditionalExpressionFlow(node);
|
|
break;
|
|
case 218:
|
|
bindVariableDeclarationFlow(node);
|
|
break;
|
|
case 174:
|
|
bindCallExpressionFlow(node);
|
|
break;
|
|
default:
|
|
ts.forEachChild(node, bind);
|
|
break;
|
|
}
|
|
}
|
|
function isNarrowingExpression(expr) {
|
|
switch (expr.kind) {
|
|
case 69:
|
|
case 97:
|
|
case 172:
|
|
return isNarrowableReference(expr);
|
|
case 174:
|
|
return hasNarrowableArgument(expr);
|
|
case 178:
|
|
return isNarrowingExpression(expr.expression);
|
|
case 187:
|
|
return isNarrowingBinaryExpression(expr);
|
|
case 185:
|
|
return expr.operator === 49 && isNarrowingExpression(expr.operand);
|
|
}
|
|
return false;
|
|
}
|
|
function isNarrowableReference(expr) {
|
|
return expr.kind === 69 ||
|
|
expr.kind === 97 ||
|
|
expr.kind === 172 && isNarrowableReference(expr.expression);
|
|
}
|
|
function hasNarrowableArgument(expr) {
|
|
if (expr.arguments) {
|
|
for (var _i = 0, _a = expr.arguments; _i < _a.length; _i++) {
|
|
var argument = _a[_i];
|
|
if (isNarrowableReference(argument)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
if (expr.expression.kind === 172 &&
|
|
isNarrowableReference(expr.expression.expression)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isNarrowingNullCheckOperands(expr1, expr2) {
|
|
return (expr1.kind === 93 || expr1.kind === 69 && expr1.text === "undefined") && isNarrowableOperand(expr2);
|
|
}
|
|
function isNarrowingTypeofOperands(expr1, expr2) {
|
|
return expr1.kind === 182 && isNarrowableOperand(expr1.expression) && expr2.kind === 9;
|
|
}
|
|
function isNarrowingDiscriminant(expr) {
|
|
return expr.kind === 172 && isNarrowableReference(expr.expression);
|
|
}
|
|
function isNarrowingBinaryExpression(expr) {
|
|
switch (expr.operatorToken.kind) {
|
|
case 56:
|
|
return isNarrowableReference(expr.left);
|
|
case 30:
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
return isNarrowingNullCheckOperands(expr.right, expr.left) || isNarrowingNullCheckOperands(expr.left, expr.right) ||
|
|
isNarrowingTypeofOperands(expr.right, expr.left) || isNarrowingTypeofOperands(expr.left, expr.right) ||
|
|
isNarrowingDiscriminant(expr.left) || isNarrowingDiscriminant(expr.right);
|
|
case 91:
|
|
return isNarrowableOperand(expr.left);
|
|
case 24:
|
|
return isNarrowingExpression(expr.right);
|
|
}
|
|
return false;
|
|
}
|
|
function isNarrowableOperand(expr) {
|
|
switch (expr.kind) {
|
|
case 178:
|
|
return isNarrowableOperand(expr.expression);
|
|
case 187:
|
|
switch (expr.operatorToken.kind) {
|
|
case 56:
|
|
return isNarrowableOperand(expr.left);
|
|
case 24:
|
|
return isNarrowableOperand(expr.right);
|
|
}
|
|
}
|
|
return isNarrowableReference(expr);
|
|
}
|
|
function isNarrowingSwitchStatement(switchStatement) {
|
|
var expr = switchStatement.expression;
|
|
return expr.kind === 172 && isNarrowableReference(expr.expression);
|
|
}
|
|
function createBranchLabel() {
|
|
return {
|
|
flags: 4,
|
|
antecedents: undefined
|
|
};
|
|
}
|
|
function createLoopLabel() {
|
|
return {
|
|
flags: 8,
|
|
antecedents: undefined
|
|
};
|
|
}
|
|
function setFlowNodeReferenced(flow) {
|
|
flow.flags |= flow.flags & 256 ? 512 : 256;
|
|
}
|
|
function addAntecedent(label, antecedent) {
|
|
if (!(antecedent.flags & 1) && !ts.contains(label.antecedents, antecedent)) {
|
|
(label.antecedents || (label.antecedents = [])).push(antecedent);
|
|
setFlowNodeReferenced(antecedent);
|
|
}
|
|
}
|
|
function createFlowCondition(flags, antecedent, expression) {
|
|
if (antecedent.flags & 1) {
|
|
return antecedent;
|
|
}
|
|
if (!expression) {
|
|
return flags & 32 ? antecedent : unreachableFlow;
|
|
}
|
|
if (expression.kind === 99 && flags & 64 ||
|
|
expression.kind === 84 && flags & 32) {
|
|
return unreachableFlow;
|
|
}
|
|
if (!isNarrowingExpression(expression)) {
|
|
return antecedent;
|
|
}
|
|
setFlowNodeReferenced(antecedent);
|
|
return {
|
|
flags: flags,
|
|
expression: expression,
|
|
antecedent: antecedent
|
|
};
|
|
}
|
|
function createFlowSwitchClause(antecedent, switchStatement, clauseStart, clauseEnd) {
|
|
if (!isNarrowingSwitchStatement(switchStatement)) {
|
|
return antecedent;
|
|
}
|
|
setFlowNodeReferenced(antecedent);
|
|
return {
|
|
flags: 128,
|
|
switchStatement: switchStatement,
|
|
clauseStart: clauseStart,
|
|
clauseEnd: clauseEnd,
|
|
antecedent: antecedent
|
|
};
|
|
}
|
|
function createFlowAssignment(antecedent, node) {
|
|
setFlowNodeReferenced(antecedent);
|
|
return {
|
|
flags: 16,
|
|
antecedent: antecedent,
|
|
node: node
|
|
};
|
|
}
|
|
function finishFlowLabel(flow) {
|
|
var antecedents = flow.antecedents;
|
|
if (!antecedents) {
|
|
return unreachableFlow;
|
|
}
|
|
if (antecedents.length === 1) {
|
|
return antecedents[0];
|
|
}
|
|
return flow;
|
|
}
|
|
function isStatementCondition(node) {
|
|
var parent = node.parent;
|
|
switch (parent.kind) {
|
|
case 203:
|
|
case 205:
|
|
case 204:
|
|
return parent.expression === node;
|
|
case 206:
|
|
case 188:
|
|
return parent.condition === node;
|
|
}
|
|
return false;
|
|
}
|
|
function isLogicalExpression(node) {
|
|
while (true) {
|
|
if (node.kind === 178) {
|
|
node = node.expression;
|
|
}
|
|
else if (node.kind === 185 && node.operator === 49) {
|
|
node = node.operand;
|
|
}
|
|
else {
|
|
return node.kind === 187 && (node.operatorToken.kind === 51 ||
|
|
node.operatorToken.kind === 52);
|
|
}
|
|
}
|
|
}
|
|
function isTopLevelLogicalExpression(node) {
|
|
while (node.parent.kind === 178 ||
|
|
node.parent.kind === 185 &&
|
|
node.parent.operator === 49) {
|
|
node = node.parent;
|
|
}
|
|
return !isStatementCondition(node) && !isLogicalExpression(node.parent);
|
|
}
|
|
function bindCondition(node, trueTarget, falseTarget) {
|
|
var saveTrueTarget = currentTrueTarget;
|
|
var saveFalseTarget = currentFalseTarget;
|
|
currentTrueTarget = trueTarget;
|
|
currentFalseTarget = falseTarget;
|
|
bind(node);
|
|
currentTrueTarget = saveTrueTarget;
|
|
currentFalseTarget = saveFalseTarget;
|
|
if (!node || !isLogicalExpression(node)) {
|
|
addAntecedent(trueTarget, createFlowCondition(32, currentFlow, node));
|
|
addAntecedent(falseTarget, createFlowCondition(64, currentFlow, node));
|
|
}
|
|
}
|
|
function bindIterativeStatement(node, breakTarget, continueTarget) {
|
|
var saveBreakTarget = currentBreakTarget;
|
|
var saveContinueTarget = currentContinueTarget;
|
|
currentBreakTarget = breakTarget;
|
|
currentContinueTarget = continueTarget;
|
|
bind(node);
|
|
currentBreakTarget = saveBreakTarget;
|
|
currentContinueTarget = saveContinueTarget;
|
|
}
|
|
function bindWhileStatement(node) {
|
|
var preWhileLabel = createLoopLabel();
|
|
var preBodyLabel = createBranchLabel();
|
|
var postWhileLabel = createBranchLabel();
|
|
addAntecedent(preWhileLabel, currentFlow);
|
|
currentFlow = preWhileLabel;
|
|
bindCondition(node.expression, preBodyLabel, postWhileLabel);
|
|
currentFlow = finishFlowLabel(preBodyLabel);
|
|
bindIterativeStatement(node.statement, postWhileLabel, preWhileLabel);
|
|
addAntecedent(preWhileLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postWhileLabel);
|
|
}
|
|
function bindDoStatement(node) {
|
|
var preDoLabel = createLoopLabel();
|
|
var preConditionLabel = createBranchLabel();
|
|
var postDoLabel = createBranchLabel();
|
|
addAntecedent(preDoLabel, currentFlow);
|
|
currentFlow = preDoLabel;
|
|
bindIterativeStatement(node.statement, postDoLabel, preConditionLabel);
|
|
addAntecedent(preConditionLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(preConditionLabel);
|
|
bindCondition(node.expression, preDoLabel, postDoLabel);
|
|
currentFlow = finishFlowLabel(postDoLabel);
|
|
}
|
|
function bindForStatement(node) {
|
|
var preLoopLabel = createLoopLabel();
|
|
var preBodyLabel = createBranchLabel();
|
|
var postLoopLabel = createBranchLabel();
|
|
bind(node.initializer);
|
|
addAntecedent(preLoopLabel, currentFlow);
|
|
currentFlow = preLoopLabel;
|
|
bindCondition(node.condition, preBodyLabel, postLoopLabel);
|
|
currentFlow = finishFlowLabel(preBodyLabel);
|
|
bindIterativeStatement(node.statement, postLoopLabel, preLoopLabel);
|
|
bind(node.incrementor);
|
|
addAntecedent(preLoopLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postLoopLabel);
|
|
}
|
|
function bindForInOrForOfStatement(node) {
|
|
var preLoopLabel = createLoopLabel();
|
|
var postLoopLabel = createBranchLabel();
|
|
addAntecedent(preLoopLabel, currentFlow);
|
|
currentFlow = preLoopLabel;
|
|
bind(node.expression);
|
|
addAntecedent(postLoopLabel, currentFlow);
|
|
bind(node.initializer);
|
|
if (node.initializer.kind !== 219) {
|
|
bindAssignmentTargetFlow(node.initializer);
|
|
}
|
|
bindIterativeStatement(node.statement, postLoopLabel, preLoopLabel);
|
|
addAntecedent(preLoopLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postLoopLabel);
|
|
}
|
|
function bindIfStatement(node) {
|
|
var thenLabel = createBranchLabel();
|
|
var elseLabel = createBranchLabel();
|
|
var postIfLabel = createBranchLabel();
|
|
bindCondition(node.expression, thenLabel, elseLabel);
|
|
currentFlow = finishFlowLabel(thenLabel);
|
|
bind(node.thenStatement);
|
|
addAntecedent(postIfLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(elseLabel);
|
|
bind(node.elseStatement);
|
|
addAntecedent(postIfLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postIfLabel);
|
|
}
|
|
function bindReturnOrThrow(node) {
|
|
bind(node.expression);
|
|
if (node.kind === 211) {
|
|
hasExplicitReturn = true;
|
|
if (currentReturnTarget) {
|
|
addAntecedent(currentReturnTarget, currentFlow);
|
|
}
|
|
}
|
|
currentFlow = unreachableFlow;
|
|
}
|
|
function findActiveLabel(name) {
|
|
if (activeLabels) {
|
|
for (var _i = 0, activeLabels_1 = activeLabels; _i < activeLabels_1.length; _i++) {
|
|
var label = activeLabels_1[_i];
|
|
if (label.name === name) {
|
|
return label;
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function bindbreakOrContinueFlow(node, breakTarget, continueTarget) {
|
|
var flowLabel = node.kind === 210 ? breakTarget : continueTarget;
|
|
if (flowLabel) {
|
|
addAntecedent(flowLabel, currentFlow);
|
|
currentFlow = unreachableFlow;
|
|
}
|
|
}
|
|
function bindBreakOrContinueStatement(node) {
|
|
bind(node.label);
|
|
if (node.label) {
|
|
var activeLabel = findActiveLabel(node.label.text);
|
|
if (activeLabel) {
|
|
activeLabel.referenced = true;
|
|
bindbreakOrContinueFlow(node, activeLabel.breakTarget, activeLabel.continueTarget);
|
|
}
|
|
}
|
|
else {
|
|
bindbreakOrContinueFlow(node, currentBreakTarget, currentContinueTarget);
|
|
}
|
|
}
|
|
function bindTryStatement(node) {
|
|
var postFinallyLabel = createBranchLabel();
|
|
var preTryFlow = currentFlow;
|
|
bind(node.tryBlock);
|
|
addAntecedent(postFinallyLabel, currentFlow);
|
|
if (node.catchClause) {
|
|
currentFlow = preTryFlow;
|
|
bind(node.catchClause);
|
|
addAntecedent(postFinallyLabel, currentFlow);
|
|
}
|
|
if (node.finallyBlock) {
|
|
currentFlow = preTryFlow;
|
|
bind(node.finallyBlock);
|
|
}
|
|
currentFlow = finishFlowLabel(postFinallyLabel);
|
|
}
|
|
function bindSwitchStatement(node) {
|
|
var postSwitchLabel = createBranchLabel();
|
|
bind(node.expression);
|
|
var saveBreakTarget = currentBreakTarget;
|
|
var savePreSwitchCaseFlow = preSwitchCaseFlow;
|
|
currentBreakTarget = postSwitchLabel;
|
|
preSwitchCaseFlow = currentFlow;
|
|
bind(node.caseBlock);
|
|
addAntecedent(postSwitchLabel, currentFlow);
|
|
var hasDefault = ts.forEach(node.caseBlock.clauses, function (c) { return c.kind === 250; });
|
|
node.possiblyExhaustive = !hasDefault && !postSwitchLabel.antecedents;
|
|
if (!hasDefault) {
|
|
addAntecedent(postSwitchLabel, createFlowSwitchClause(preSwitchCaseFlow, node, 0, 0));
|
|
}
|
|
currentBreakTarget = saveBreakTarget;
|
|
preSwitchCaseFlow = savePreSwitchCaseFlow;
|
|
currentFlow = finishFlowLabel(postSwitchLabel);
|
|
}
|
|
function bindCaseBlock(node) {
|
|
var clauses = node.clauses;
|
|
var fallthroughFlow = unreachableFlow;
|
|
for (var i = 0; i < clauses.length; i++) {
|
|
var clauseStart = i;
|
|
while (!clauses[i].statements.length && i + 1 < clauses.length) {
|
|
bind(clauses[i]);
|
|
i++;
|
|
}
|
|
var preCaseLabel = createBranchLabel();
|
|
addAntecedent(preCaseLabel, createFlowSwitchClause(preSwitchCaseFlow, node.parent, clauseStart, i + 1));
|
|
addAntecedent(preCaseLabel, fallthroughFlow);
|
|
currentFlow = finishFlowLabel(preCaseLabel);
|
|
var clause = clauses[i];
|
|
bind(clause);
|
|
fallthroughFlow = currentFlow;
|
|
if (!(currentFlow.flags & 1) && i !== clauses.length - 1 && options.noFallthroughCasesInSwitch) {
|
|
errorOnFirstToken(clause, ts.Diagnostics.Fallthrough_case_in_switch);
|
|
}
|
|
}
|
|
}
|
|
function bindCaseClause(node) {
|
|
var saveCurrentFlow = currentFlow;
|
|
currentFlow = preSwitchCaseFlow;
|
|
bind(node.expression);
|
|
currentFlow = saveCurrentFlow;
|
|
ts.forEach(node.statements, bind);
|
|
}
|
|
function pushActiveLabel(name, breakTarget, continueTarget) {
|
|
var activeLabel = {
|
|
name: name,
|
|
breakTarget: breakTarget,
|
|
continueTarget: continueTarget,
|
|
referenced: false
|
|
};
|
|
(activeLabels || (activeLabels = [])).push(activeLabel);
|
|
return activeLabel;
|
|
}
|
|
function popActiveLabel() {
|
|
activeLabels.pop();
|
|
}
|
|
function bindLabeledStatement(node) {
|
|
var preStatementLabel = createLoopLabel();
|
|
var postStatementLabel = createBranchLabel();
|
|
bind(node.label);
|
|
addAntecedent(preStatementLabel, currentFlow);
|
|
var activeLabel = pushActiveLabel(node.label.text, postStatementLabel, preStatementLabel);
|
|
bind(node.statement);
|
|
popActiveLabel();
|
|
if (!activeLabel.referenced && !options.allowUnusedLabels) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node.label, ts.Diagnostics.Unused_label));
|
|
}
|
|
addAntecedent(postStatementLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postStatementLabel);
|
|
}
|
|
function bindDestructuringTargetFlow(node) {
|
|
if (node.kind === 187 && node.operatorToken.kind === 56) {
|
|
bindAssignmentTargetFlow(node.left);
|
|
}
|
|
else {
|
|
bindAssignmentTargetFlow(node);
|
|
}
|
|
}
|
|
function bindAssignmentTargetFlow(node) {
|
|
if (isNarrowableReference(node)) {
|
|
currentFlow = createFlowAssignment(currentFlow, node);
|
|
}
|
|
else if (node.kind === 170) {
|
|
for (var _i = 0, _a = node.elements; _i < _a.length; _i++) {
|
|
var e = _a[_i];
|
|
if (e.kind === 191) {
|
|
bindAssignmentTargetFlow(e.expression);
|
|
}
|
|
else {
|
|
bindDestructuringTargetFlow(e);
|
|
}
|
|
}
|
|
}
|
|
else if (node.kind === 171) {
|
|
for (var _b = 0, _c = node.properties; _b < _c.length; _b++) {
|
|
var p = _c[_b];
|
|
if (p.kind === 253) {
|
|
bindDestructuringTargetFlow(p.initializer);
|
|
}
|
|
else if (p.kind === 254) {
|
|
bindAssignmentTargetFlow(p.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function bindLogicalExpression(node, trueTarget, falseTarget) {
|
|
var preRightLabel = createBranchLabel();
|
|
if (node.operatorToken.kind === 51) {
|
|
bindCondition(node.left, preRightLabel, falseTarget);
|
|
}
|
|
else {
|
|
bindCondition(node.left, trueTarget, preRightLabel);
|
|
}
|
|
currentFlow = finishFlowLabel(preRightLabel);
|
|
bind(node.operatorToken);
|
|
bindCondition(node.right, trueTarget, falseTarget);
|
|
}
|
|
function bindPrefixUnaryExpressionFlow(node) {
|
|
if (node.operator === 49) {
|
|
var saveTrueTarget = currentTrueTarget;
|
|
currentTrueTarget = currentFalseTarget;
|
|
currentFalseTarget = saveTrueTarget;
|
|
ts.forEachChild(node, bind);
|
|
currentFalseTarget = currentTrueTarget;
|
|
currentTrueTarget = saveTrueTarget;
|
|
}
|
|
else {
|
|
ts.forEachChild(node, bind);
|
|
}
|
|
}
|
|
function bindBinaryExpressionFlow(node) {
|
|
var operator = node.operatorToken.kind;
|
|
if (operator === 51 || operator === 52) {
|
|
if (isTopLevelLogicalExpression(node)) {
|
|
var postExpressionLabel = createBranchLabel();
|
|
bindLogicalExpression(node, postExpressionLabel, postExpressionLabel);
|
|
currentFlow = finishFlowLabel(postExpressionLabel);
|
|
}
|
|
else {
|
|
bindLogicalExpression(node, currentTrueTarget, currentFalseTarget);
|
|
}
|
|
}
|
|
else {
|
|
ts.forEachChild(node, bind);
|
|
if (operator === 56 && !ts.isAssignmentTarget(node)) {
|
|
bindAssignmentTargetFlow(node.left);
|
|
}
|
|
}
|
|
}
|
|
function bindDeleteExpressionFlow(node) {
|
|
ts.forEachChild(node, bind);
|
|
if (node.expression.kind === 172) {
|
|
bindAssignmentTargetFlow(node.expression);
|
|
}
|
|
}
|
|
function bindConditionalExpressionFlow(node) {
|
|
var trueLabel = createBranchLabel();
|
|
var falseLabel = createBranchLabel();
|
|
var postExpressionLabel = createBranchLabel();
|
|
bindCondition(node.condition, trueLabel, falseLabel);
|
|
currentFlow = finishFlowLabel(trueLabel);
|
|
bind(node.whenTrue);
|
|
addAntecedent(postExpressionLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(falseLabel);
|
|
bind(node.whenFalse);
|
|
addAntecedent(postExpressionLabel, currentFlow);
|
|
currentFlow = finishFlowLabel(postExpressionLabel);
|
|
}
|
|
function bindInitializedVariableFlow(node) {
|
|
var name = node.name;
|
|
if (ts.isBindingPattern(name)) {
|
|
for (var _i = 0, _a = name.elements; _i < _a.length; _i++) {
|
|
var child = _a[_i];
|
|
bindInitializedVariableFlow(child);
|
|
}
|
|
}
|
|
else {
|
|
currentFlow = createFlowAssignment(currentFlow, node);
|
|
}
|
|
}
|
|
function bindVariableDeclarationFlow(node) {
|
|
ts.forEachChild(node, bind);
|
|
if (node.initializer || node.parent.parent.kind === 207 || node.parent.parent.kind === 208) {
|
|
bindInitializedVariableFlow(node);
|
|
}
|
|
}
|
|
function bindCallExpressionFlow(node) {
|
|
var expr = node.expression;
|
|
while (expr.kind === 178) {
|
|
expr = expr.expression;
|
|
}
|
|
if (expr.kind === 179 || expr.kind === 180) {
|
|
ts.forEach(node.typeArguments, bind);
|
|
ts.forEach(node.arguments, bind);
|
|
bind(node.expression);
|
|
}
|
|
else {
|
|
ts.forEachChild(node, bind);
|
|
}
|
|
}
|
|
function getContainerFlags(node) {
|
|
switch (node.kind) {
|
|
case 192:
|
|
case 221:
|
|
case 224:
|
|
case 171:
|
|
case 159:
|
|
case 281:
|
|
case 265:
|
|
return 1;
|
|
case 222:
|
|
return 1 | 64;
|
|
case 269:
|
|
case 225:
|
|
case 223:
|
|
return 1 | 32;
|
|
case 256:
|
|
return 1 | 4 | 32;
|
|
case 148:
|
|
case 220:
|
|
case 147:
|
|
case 146:
|
|
case 149:
|
|
case 150:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 156:
|
|
case 157:
|
|
return 1 | 4 | 32 | 8;
|
|
case 179:
|
|
case 180:
|
|
return 1 | 4 | 32 | 8 | 16;
|
|
case 226:
|
|
return 4;
|
|
case 145:
|
|
return node.initializer ? 4 : 0;
|
|
case 252:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
case 227:
|
|
return 2;
|
|
case 199:
|
|
return ts.isFunctionLike(node.parent) ? 0 : 2;
|
|
}
|
|
return 0;
|
|
}
|
|
function addToContainerChain(next) {
|
|
if (lastContainer) {
|
|
lastContainer.nextContainer = next;
|
|
}
|
|
lastContainer = next;
|
|
}
|
|
function declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes) {
|
|
return declareSymbolAndAddToSymbolTableWorker(node, symbolFlags, symbolExcludes);
|
|
}
|
|
function declareSymbolAndAddToSymbolTableWorker(node, symbolFlags, symbolExcludes) {
|
|
switch (container.kind) {
|
|
case 225:
|
|
return declareModuleMember(node, symbolFlags, symbolExcludes);
|
|
case 256:
|
|
return declareSourceFileMember(node, symbolFlags, symbolExcludes);
|
|
case 192:
|
|
case 221:
|
|
return declareClassMember(node, symbolFlags, symbolExcludes);
|
|
case 224:
|
|
return declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes);
|
|
case 159:
|
|
case 171:
|
|
case 222:
|
|
case 265:
|
|
case 281:
|
|
return declareSymbol(container.symbol.members, container.symbol, node, symbolFlags, symbolExcludes);
|
|
case 156:
|
|
case 157:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 220:
|
|
case 179:
|
|
case 180:
|
|
case 269:
|
|
case 223:
|
|
return declareSymbol(container.locals, undefined, node, symbolFlags, symbolExcludes);
|
|
}
|
|
}
|
|
function declareClassMember(node, symbolFlags, symbolExcludes) {
|
|
return node.flags & 32
|
|
? declareSymbol(container.symbol.exports, container.symbol, node, symbolFlags, symbolExcludes)
|
|
: declareSymbol(container.symbol.members, container.symbol, node, symbolFlags, symbolExcludes);
|
|
}
|
|
function declareSourceFileMember(node, symbolFlags, symbolExcludes) {
|
|
return ts.isExternalModule(file)
|
|
? declareModuleMember(node, symbolFlags, symbolExcludes)
|
|
: declareSymbol(file.locals, undefined, node, symbolFlags, symbolExcludes);
|
|
}
|
|
function hasExportDeclarations(node) {
|
|
var body = node.kind === 256 ? node : node.body;
|
|
if (body && (body.kind === 256 || body.kind === 226)) {
|
|
for (var _i = 0, _a = body.statements; _i < _a.length; _i++) {
|
|
var stat = _a[_i];
|
|
if (stat.kind === 236 || stat.kind === 235) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function setExportContextFlag(node) {
|
|
if (ts.isInAmbientContext(node) && !hasExportDeclarations(node)) {
|
|
node.flags |= 8192;
|
|
}
|
|
else {
|
|
node.flags &= ~8192;
|
|
}
|
|
}
|
|
function bindModuleDeclaration(node) {
|
|
setExportContextFlag(node);
|
|
if (ts.isAmbientModule(node)) {
|
|
if (node.flags & 1) {
|
|
errorOnFirstToken(node, ts.Diagnostics.export_modifier_cannot_be_applied_to_ambient_modules_and_module_augmentations_since_they_are_always_visible);
|
|
}
|
|
if (ts.isExternalModuleAugmentation(node)) {
|
|
declareSymbolAndAddToSymbolTable(node, 1024, 0);
|
|
}
|
|
else {
|
|
var pattern = void 0;
|
|
if (node.name.kind === 9) {
|
|
var text = node.name.text;
|
|
if (ts.hasZeroOrOneAsteriskCharacter(text)) {
|
|
pattern = ts.tryParsePattern(text);
|
|
}
|
|
else {
|
|
errorOnFirstToken(node.name, ts.Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, text);
|
|
}
|
|
}
|
|
var symbol = declareSymbolAndAddToSymbolTable(node, 512, 106639);
|
|
if (pattern) {
|
|
(file.patternAmbientModules || (file.patternAmbientModules = [])).push({ pattern: pattern, symbol: symbol });
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var state = getModuleInstanceState(node);
|
|
if (state === 0) {
|
|
declareSymbolAndAddToSymbolTable(node, 1024, 0);
|
|
}
|
|
else {
|
|
declareSymbolAndAddToSymbolTable(node, 512, 106639);
|
|
if (node.symbol.flags & (16 | 32 | 256)) {
|
|
node.symbol.constEnumOnlyModule = false;
|
|
}
|
|
else {
|
|
var currentModuleIsConstEnumOnly = state === 2;
|
|
if (node.symbol.constEnumOnlyModule === undefined) {
|
|
node.symbol.constEnumOnlyModule = currentModuleIsConstEnumOnly;
|
|
}
|
|
else {
|
|
node.symbol.constEnumOnlyModule = node.symbol.constEnumOnlyModule && currentModuleIsConstEnumOnly;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function bindFunctionOrConstructorType(node) {
|
|
var symbol = createSymbol(131072, getDeclarationName(node));
|
|
addDeclarationToSymbol(symbol, node, 131072);
|
|
var typeLiteralSymbol = createSymbol(2048, "__type");
|
|
addDeclarationToSymbol(typeLiteralSymbol, node, 2048);
|
|
typeLiteralSymbol.members = (_a = {}, _a[symbol.name] = symbol, _a);
|
|
var _a;
|
|
}
|
|
function bindObjectLiteralExpression(node) {
|
|
if (inStrictMode) {
|
|
var seen = {};
|
|
for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
|
|
var prop = _a[_i];
|
|
if (prop.name.kind !== 69) {
|
|
continue;
|
|
}
|
|
var identifier = prop.name;
|
|
var currentKind = prop.kind === 253 || prop.kind === 254 || prop.kind === 147
|
|
? 1
|
|
: 2;
|
|
var existingKind = seen[identifier.text];
|
|
if (!existingKind) {
|
|
seen[identifier.text] = currentKind;
|
|
continue;
|
|
}
|
|
if (currentKind === 1 && existingKind === 1) {
|
|
var span = ts.getErrorSpanForNode(file, identifier);
|
|
file.bindDiagnostics.push(ts.createFileDiagnostic(file, span.start, span.length, ts.Diagnostics.An_object_literal_cannot_have_multiple_properties_with_the_same_name_in_strict_mode));
|
|
}
|
|
}
|
|
}
|
|
return bindAnonymousDeclaration(node, 4096, "__object");
|
|
}
|
|
function bindAnonymousDeclaration(node, symbolFlags, name) {
|
|
var symbol = createSymbol(symbolFlags, name);
|
|
addDeclarationToSymbol(symbol, node, symbolFlags);
|
|
}
|
|
function bindBlockScopedDeclaration(node, symbolFlags, symbolExcludes) {
|
|
switch (blockScopeContainer.kind) {
|
|
case 225:
|
|
declareModuleMember(node, symbolFlags, symbolExcludes);
|
|
break;
|
|
case 256:
|
|
if (ts.isExternalModule(container)) {
|
|
declareModuleMember(node, symbolFlags, symbolExcludes);
|
|
break;
|
|
}
|
|
default:
|
|
if (!blockScopeContainer.locals) {
|
|
blockScopeContainer.locals = {};
|
|
addToContainerChain(blockScopeContainer);
|
|
}
|
|
declareSymbol(blockScopeContainer.locals, undefined, node, symbolFlags, symbolExcludes);
|
|
}
|
|
}
|
|
function bindBlockScopedVariableDeclaration(node) {
|
|
bindBlockScopedDeclaration(node, 2, 107455);
|
|
}
|
|
function checkStrictModeIdentifier(node) {
|
|
if (inStrictMode &&
|
|
node.originalKeywordKind >= 106 &&
|
|
node.originalKeywordKind <= 114 &&
|
|
!ts.isIdentifierName(node) &&
|
|
!ts.isInAmbientContext(node)) {
|
|
if (!file.parseDiagnostics.length) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, getStrictModeIdentifierMessage(node), ts.declarationNameToString(node)));
|
|
}
|
|
}
|
|
}
|
|
function getStrictModeIdentifierMessage(node) {
|
|
if (ts.getContainingClass(node)) {
|
|
return ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Class_definitions_are_automatically_in_strict_mode;
|
|
}
|
|
if (file.externalModuleIndicator) {
|
|
return ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode_Modules_are_automatically_in_strict_mode;
|
|
}
|
|
return ts.Diagnostics.Identifier_expected_0_is_a_reserved_word_in_strict_mode;
|
|
}
|
|
function checkStrictModeBinaryExpression(node) {
|
|
if (inStrictMode && ts.isLeftHandSideExpression(node.left) && ts.isAssignmentOperator(node.operatorToken.kind)) {
|
|
checkStrictModeEvalOrArguments(node, node.left);
|
|
}
|
|
}
|
|
function checkStrictModeCatchClause(node) {
|
|
if (inStrictMode && node.variableDeclaration) {
|
|
checkStrictModeEvalOrArguments(node, node.variableDeclaration.name);
|
|
}
|
|
}
|
|
function checkStrictModeDeleteExpression(node) {
|
|
if (inStrictMode && node.expression.kind === 69) {
|
|
var span = ts.getErrorSpanForNode(file, node.expression);
|
|
file.bindDiagnostics.push(ts.createFileDiagnostic(file, span.start, span.length, ts.Diagnostics.delete_cannot_be_called_on_an_identifier_in_strict_mode));
|
|
}
|
|
}
|
|
function isEvalOrArgumentsIdentifier(node) {
|
|
return node.kind === 69 &&
|
|
(node.text === "eval" || node.text === "arguments");
|
|
}
|
|
function checkStrictModeEvalOrArguments(contextNode, name) {
|
|
if (name && name.kind === 69) {
|
|
var identifier = name;
|
|
if (isEvalOrArgumentsIdentifier(identifier)) {
|
|
var span = ts.getErrorSpanForNode(file, name);
|
|
file.bindDiagnostics.push(ts.createFileDiagnostic(file, span.start, span.length, getStrictModeEvalOrArgumentsMessage(contextNode), identifier.text));
|
|
}
|
|
}
|
|
}
|
|
function getStrictModeEvalOrArgumentsMessage(node) {
|
|
if (ts.getContainingClass(node)) {
|
|
return ts.Diagnostics.Invalid_use_of_0_Class_definitions_are_automatically_in_strict_mode;
|
|
}
|
|
if (file.externalModuleIndicator) {
|
|
return ts.Diagnostics.Invalid_use_of_0_Modules_are_automatically_in_strict_mode;
|
|
}
|
|
return ts.Diagnostics.Invalid_use_of_0_in_strict_mode;
|
|
}
|
|
function checkStrictModeFunctionName(node) {
|
|
if (inStrictMode) {
|
|
checkStrictModeEvalOrArguments(node, node.name);
|
|
}
|
|
}
|
|
function getStrictModeBlockScopeFunctionDeclarationMessage(node) {
|
|
if (ts.getContainingClass(node)) {
|
|
return ts.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Class_definitions_are_automatically_in_strict_mode;
|
|
}
|
|
if (file.externalModuleIndicator) {
|
|
return ts.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5_Modules_are_automatically_in_strict_mode;
|
|
}
|
|
return ts.Diagnostics.Function_declarations_are_not_allowed_inside_blocks_in_strict_mode_when_targeting_ES3_or_ES5;
|
|
}
|
|
function checkStrictModeFunctionDeclaration(node) {
|
|
if (languageVersion < 2) {
|
|
if (blockScopeContainer.kind !== 256 &&
|
|
blockScopeContainer.kind !== 225 &&
|
|
!ts.isFunctionLike(blockScopeContainer)) {
|
|
var errorSpan = ts.getErrorSpanForNode(file, node);
|
|
file.bindDiagnostics.push(ts.createFileDiagnostic(file, errorSpan.start, errorSpan.length, getStrictModeBlockScopeFunctionDeclarationMessage(node)));
|
|
}
|
|
}
|
|
}
|
|
function checkStrictModeNumericLiteral(node) {
|
|
if (inStrictMode && node.isOctalLiteral) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Octal_literals_are_not_allowed_in_strict_mode));
|
|
}
|
|
}
|
|
function checkStrictModePostfixUnaryExpression(node) {
|
|
if (inStrictMode) {
|
|
checkStrictModeEvalOrArguments(node, node.operand);
|
|
}
|
|
}
|
|
function checkStrictModePrefixUnaryExpression(node) {
|
|
if (inStrictMode) {
|
|
if (node.operator === 41 || node.operator === 42) {
|
|
checkStrictModeEvalOrArguments(node, node.operand);
|
|
}
|
|
}
|
|
}
|
|
function checkStrictModeWithStatement(node) {
|
|
if (inStrictMode) {
|
|
errorOnFirstToken(node, ts.Diagnostics.with_statements_are_not_allowed_in_strict_mode);
|
|
}
|
|
}
|
|
function errorOnFirstToken(node, message, arg0, arg1, arg2) {
|
|
var span = ts.getSpanOfTokenAtPosition(file, node.pos);
|
|
file.bindDiagnostics.push(ts.createFileDiagnostic(file, span.start, span.length, message, arg0, arg1, arg2));
|
|
}
|
|
function getDestructuringParameterName(node) {
|
|
return "__" + ts.indexOf(node.parent.parameters, node);
|
|
}
|
|
function bind(node) {
|
|
if (!node) {
|
|
return;
|
|
}
|
|
node.parent = parent;
|
|
var saveInStrictMode = inStrictMode;
|
|
bindWorker(node);
|
|
if (node.kind > 138) {
|
|
var saveParent = parent;
|
|
parent = node;
|
|
var containerFlags = getContainerFlags(node);
|
|
if (containerFlags === 0) {
|
|
bindChildren(node);
|
|
}
|
|
else {
|
|
bindContainer(node, containerFlags);
|
|
}
|
|
parent = saveParent;
|
|
}
|
|
inStrictMode = saveInStrictMode;
|
|
}
|
|
function updateStrictModeStatementList(statements) {
|
|
if (!inStrictMode) {
|
|
for (var _i = 0, statements_1 = statements; _i < statements_1.length; _i++) {
|
|
var statement = statements_1[_i];
|
|
if (!ts.isPrologueDirective(statement)) {
|
|
return;
|
|
}
|
|
if (isUseStrictPrologueDirective(statement)) {
|
|
inStrictMode = true;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isUseStrictPrologueDirective(node) {
|
|
var nodeText = ts.getTextOfNodeFromSourceText(file.text, node.expression);
|
|
return nodeText === '"use strict"' || nodeText === "'use strict'";
|
|
}
|
|
function bindWorker(node) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
case 97:
|
|
if (currentFlow && (ts.isExpression(node) || parent.kind === 254)) {
|
|
node.flowNode = currentFlow;
|
|
}
|
|
return checkStrictModeIdentifier(node);
|
|
case 172:
|
|
if (currentFlow && isNarrowableReference(node)) {
|
|
node.flowNode = currentFlow;
|
|
}
|
|
break;
|
|
case 187:
|
|
if (ts.isInJavaScriptFile(node)) {
|
|
var specialKind = ts.getSpecialPropertyAssignmentKind(node);
|
|
switch (specialKind) {
|
|
case 1:
|
|
bindExportsPropertyAssignment(node);
|
|
break;
|
|
case 2:
|
|
bindModuleExportsAssignment(node);
|
|
break;
|
|
case 3:
|
|
bindPrototypePropertyAssignment(node);
|
|
break;
|
|
case 4:
|
|
bindThisPropertyAssignment(node);
|
|
break;
|
|
case 0:
|
|
break;
|
|
default:
|
|
ts.Debug.fail("Unknown special property assignment kind");
|
|
}
|
|
}
|
|
return checkStrictModeBinaryExpression(node);
|
|
case 252:
|
|
return checkStrictModeCatchClause(node);
|
|
case 181:
|
|
return checkStrictModeDeleteExpression(node);
|
|
case 8:
|
|
return checkStrictModeNumericLiteral(node);
|
|
case 186:
|
|
return checkStrictModePostfixUnaryExpression(node);
|
|
case 185:
|
|
return checkStrictModePrefixUnaryExpression(node);
|
|
case 212:
|
|
return checkStrictModeWithStatement(node);
|
|
case 165:
|
|
seenThisKeyword = true;
|
|
return;
|
|
case 154:
|
|
return checkTypePredicate(node);
|
|
case 141:
|
|
return declareSymbolAndAddToSymbolTable(node, 262144, 530912);
|
|
case 142:
|
|
return bindParameter(node);
|
|
case 218:
|
|
case 169:
|
|
return bindVariableDeclarationOrBindingElement(node);
|
|
case 145:
|
|
case 144:
|
|
case 266:
|
|
return bindPropertyOrMethodOrAccessor(node, 4 | (node.questionToken ? 536870912 : 0), 0);
|
|
case 280:
|
|
return bindJSDocProperty(node);
|
|
case 253:
|
|
case 254:
|
|
return bindPropertyOrMethodOrAccessor(node, 4, 0);
|
|
case 255:
|
|
return bindPropertyOrMethodOrAccessor(node, 8, 107455);
|
|
case 247:
|
|
emitFlags |= 1073741824;
|
|
return;
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
return declareSymbolAndAddToSymbolTable(node, 131072, 0);
|
|
case 147:
|
|
case 146:
|
|
return bindPropertyOrMethodOrAccessor(node, 8192 | (node.questionToken ? 536870912 : 0), ts.isObjectLiteralMethod(node) ? 0 : 99263);
|
|
case 220:
|
|
return bindFunctionDeclaration(node);
|
|
case 148:
|
|
return declareSymbolAndAddToSymbolTable(node, 16384, 0);
|
|
case 149:
|
|
return bindPropertyOrMethodOrAccessor(node, 32768, 41919);
|
|
case 150:
|
|
return bindPropertyOrMethodOrAccessor(node, 65536, 74687);
|
|
case 156:
|
|
case 157:
|
|
case 269:
|
|
return bindFunctionOrConstructorType(node);
|
|
case 159:
|
|
case 281:
|
|
case 265:
|
|
return bindAnonymousDeclaration(node, 2048, "__type");
|
|
case 171:
|
|
return bindObjectLiteralExpression(node);
|
|
case 179:
|
|
case 180:
|
|
return bindFunctionExpression(node);
|
|
case 174:
|
|
if (ts.isInJavaScriptFile(node)) {
|
|
bindCallExpression(node);
|
|
}
|
|
break;
|
|
case 192:
|
|
case 221:
|
|
inStrictMode = true;
|
|
return bindClassLikeDeclaration(node);
|
|
case 222:
|
|
return bindBlockScopedDeclaration(node, 64, 792960);
|
|
case 279:
|
|
case 223:
|
|
return bindBlockScopedDeclaration(node, 524288, 793056);
|
|
case 224:
|
|
return bindEnumDeclaration(node);
|
|
case 225:
|
|
return bindModuleDeclaration(node);
|
|
case 229:
|
|
case 232:
|
|
case 234:
|
|
case 238:
|
|
return declareSymbolAndAddToSymbolTable(node, 8388608, 8388608);
|
|
case 228:
|
|
return bindNamespaceExportDeclaration(node);
|
|
case 231:
|
|
return bindImportClause(node);
|
|
case 236:
|
|
return bindExportDeclaration(node);
|
|
case 235:
|
|
return bindExportAssignment(node);
|
|
case 256:
|
|
updateStrictModeStatementList(node.statements);
|
|
return bindSourceFileIfExternalModule();
|
|
case 199:
|
|
if (!ts.isFunctionLike(node.parent)) {
|
|
return;
|
|
}
|
|
case 226:
|
|
return updateStrictModeStatementList(node.statements);
|
|
}
|
|
}
|
|
function checkTypePredicate(node) {
|
|
var parameterName = node.parameterName, type = node.type;
|
|
if (parameterName && parameterName.kind === 69) {
|
|
checkStrictModeIdentifier(parameterName);
|
|
}
|
|
if (parameterName && parameterName.kind === 165) {
|
|
seenThisKeyword = true;
|
|
}
|
|
bind(type);
|
|
}
|
|
function bindSourceFileIfExternalModule() {
|
|
setExportContextFlag(file);
|
|
if (ts.isExternalModule(file)) {
|
|
bindSourceFileAsExternalModule();
|
|
}
|
|
}
|
|
function bindSourceFileAsExternalModule() {
|
|
bindAnonymousDeclaration(file, 512, "\"" + ts.removeFileExtension(file.fileName) + "\"");
|
|
}
|
|
function bindExportAssignment(node) {
|
|
var boundExpression = node.kind === 235 ? node.expression : node.right;
|
|
if (!container.symbol || !container.symbol.exports) {
|
|
bindAnonymousDeclaration(node, 8388608, getDeclarationName(node));
|
|
}
|
|
else if (boundExpression.kind === 69 && node.kind === 235) {
|
|
declareSymbol(container.symbol.exports, container.symbol, node, 8388608, 0 | 8388608);
|
|
}
|
|
else {
|
|
declareSymbol(container.symbol.exports, container.symbol, node, 4, 0 | 8388608);
|
|
}
|
|
}
|
|
function bindNamespaceExportDeclaration(node) {
|
|
if (node.modifiers && node.modifiers.length) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Modifiers_cannot_appear_here));
|
|
}
|
|
if (node.parent.kind !== 256) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Global_module_exports_may_only_appear_at_top_level));
|
|
return;
|
|
}
|
|
else {
|
|
var parent_6 = node.parent;
|
|
if (!ts.isExternalModule(parent_6)) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Global_module_exports_may_only_appear_in_module_files));
|
|
return;
|
|
}
|
|
if (!parent_6.isDeclarationFile) {
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Global_module_exports_may_only_appear_in_declaration_files));
|
|
return;
|
|
}
|
|
}
|
|
file.symbol.globalExports = file.symbol.globalExports || {};
|
|
declareSymbol(file.symbol.globalExports, file.symbol, node, 8388608, 8388608);
|
|
}
|
|
function bindExportDeclaration(node) {
|
|
if (!container.symbol || !container.symbol.exports) {
|
|
bindAnonymousDeclaration(node, 1073741824, getDeclarationName(node));
|
|
}
|
|
else if (!node.exportClause) {
|
|
declareSymbol(container.symbol.exports, container.symbol, node, 1073741824, 0);
|
|
}
|
|
}
|
|
function bindImportClause(node) {
|
|
if (node.name) {
|
|
declareSymbolAndAddToSymbolTable(node, 8388608, 8388608);
|
|
}
|
|
}
|
|
function setCommonJsModuleIndicator(node) {
|
|
if (!file.commonJsModuleIndicator) {
|
|
file.commonJsModuleIndicator = node;
|
|
bindSourceFileAsExternalModule();
|
|
}
|
|
}
|
|
function bindExportsPropertyAssignment(node) {
|
|
setCommonJsModuleIndicator(node);
|
|
declareSymbol(file.symbol.exports, file.symbol, node.left, 4 | 7340032, 0);
|
|
}
|
|
function bindModuleExportsAssignment(node) {
|
|
setCommonJsModuleIndicator(node);
|
|
declareSymbol(file.symbol.exports, file.symbol, node, 4 | 7340032 | 512, 0);
|
|
}
|
|
function bindThisPropertyAssignment(node) {
|
|
var assignee;
|
|
if (container.kind === 220 || container.kind === 220) {
|
|
assignee = container;
|
|
}
|
|
else if (container.kind === 148) {
|
|
assignee = container.parent;
|
|
}
|
|
else {
|
|
return;
|
|
}
|
|
assignee.symbol.members = assignee.symbol.members || {};
|
|
declareSymbol(assignee.symbol.members, assignee.symbol, node, 4, 0 & ~4);
|
|
}
|
|
function bindPrototypePropertyAssignment(node) {
|
|
var leftSideOfAssignment = node.left;
|
|
var classPrototype = leftSideOfAssignment.expression;
|
|
var constructorFunction = classPrototype.expression;
|
|
leftSideOfAssignment.parent = node;
|
|
constructorFunction.parent = classPrototype;
|
|
classPrototype.parent = leftSideOfAssignment;
|
|
var funcSymbol = container.locals[constructorFunction.text];
|
|
if (!funcSymbol || !(funcSymbol.flags & 16 || ts.isDeclarationOfFunctionExpression(funcSymbol))) {
|
|
return;
|
|
}
|
|
if (!funcSymbol.members) {
|
|
funcSymbol.members = {};
|
|
}
|
|
declareSymbol(funcSymbol.members, funcSymbol, leftSideOfAssignment, 4, 0);
|
|
}
|
|
function bindCallExpression(node) {
|
|
if (!file.commonJsModuleIndicator && ts.isRequireCall(node, false)) {
|
|
setCommonJsModuleIndicator(node);
|
|
}
|
|
}
|
|
function bindClassLikeDeclaration(node) {
|
|
if (!ts.isDeclarationFile(file) && !ts.isInAmbientContext(node)) {
|
|
if (ts.getClassExtendsHeritageClauseElement(node) !== undefined) {
|
|
emitFlags |= 262144;
|
|
}
|
|
if (ts.nodeIsDecorated(node)) {
|
|
emitFlags |= 524288;
|
|
}
|
|
}
|
|
if (node.kind === 221) {
|
|
bindBlockScopedDeclaration(node, 32, 899519);
|
|
}
|
|
else {
|
|
var bindingName = node.name ? node.name.text : "__class";
|
|
bindAnonymousDeclaration(node, 32, bindingName);
|
|
if (node.name) {
|
|
classifiableNames[node.name.text] = node.name.text;
|
|
}
|
|
}
|
|
var symbol = node.symbol;
|
|
var prototypeSymbol = createSymbol(4 | 134217728, "prototype");
|
|
if (ts.hasProperty(symbol.exports, prototypeSymbol.name)) {
|
|
if (node.name) {
|
|
node.name.parent = node;
|
|
}
|
|
file.bindDiagnostics.push(ts.createDiagnosticForNode(symbol.exports[prototypeSymbol.name].declarations[0], ts.Diagnostics.Duplicate_identifier_0, prototypeSymbol.name));
|
|
}
|
|
symbol.exports[prototypeSymbol.name] = prototypeSymbol;
|
|
prototypeSymbol.parent = symbol;
|
|
}
|
|
function bindEnumDeclaration(node) {
|
|
return ts.isConst(node)
|
|
? bindBlockScopedDeclaration(node, 128, 899967)
|
|
: bindBlockScopedDeclaration(node, 256, 899327);
|
|
}
|
|
function bindVariableDeclarationOrBindingElement(node) {
|
|
if (inStrictMode) {
|
|
checkStrictModeEvalOrArguments(node, node.name);
|
|
}
|
|
if (!ts.isBindingPattern(node.name)) {
|
|
if (ts.isBlockOrCatchScoped(node)) {
|
|
bindBlockScopedVariableDeclaration(node);
|
|
}
|
|
else if (ts.isParameterDeclaration(node)) {
|
|
declareSymbolAndAddToSymbolTable(node, 1, 107455);
|
|
}
|
|
else {
|
|
declareSymbolAndAddToSymbolTable(node, 1, 107454);
|
|
}
|
|
}
|
|
}
|
|
function bindParameter(node) {
|
|
if (!ts.isDeclarationFile(file) &&
|
|
!ts.isInAmbientContext(node) &&
|
|
ts.nodeIsDecorated(node)) {
|
|
emitFlags |= (524288 | 1048576);
|
|
}
|
|
if (inStrictMode) {
|
|
checkStrictModeEvalOrArguments(node, node.name);
|
|
}
|
|
if (ts.isBindingPattern(node.name)) {
|
|
bindAnonymousDeclaration(node, 1, getDestructuringParameterName(node));
|
|
}
|
|
else {
|
|
declareSymbolAndAddToSymbolTable(node, 1, 107455);
|
|
}
|
|
if (ts.isParameterPropertyDeclaration(node)) {
|
|
var classDeclaration = node.parent.parent;
|
|
declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, 4 | (node.questionToken ? 536870912 : 0), 0);
|
|
}
|
|
}
|
|
function bindFunctionDeclaration(node) {
|
|
if (!ts.isDeclarationFile(file) && !ts.isInAmbientContext(node)) {
|
|
if (ts.isAsyncFunctionLike(node)) {
|
|
emitFlags |= 2097152;
|
|
}
|
|
}
|
|
checkStrictModeFunctionName(node);
|
|
if (inStrictMode) {
|
|
checkStrictModeFunctionDeclaration(node);
|
|
bindBlockScopedDeclaration(node, 16, 106927);
|
|
}
|
|
else {
|
|
declareSymbolAndAddToSymbolTable(node, 16, 106927);
|
|
}
|
|
}
|
|
function bindFunctionExpression(node) {
|
|
if (!ts.isDeclarationFile(file) && !ts.isInAmbientContext(node)) {
|
|
if (ts.isAsyncFunctionLike(node)) {
|
|
emitFlags |= 2097152;
|
|
}
|
|
}
|
|
if (currentFlow) {
|
|
node.flowNode = currentFlow;
|
|
}
|
|
checkStrictModeFunctionName(node);
|
|
var bindingName = node.name ? node.name.text : "__function";
|
|
return bindAnonymousDeclaration(node, 16, bindingName);
|
|
}
|
|
function bindPropertyOrMethodOrAccessor(node, symbolFlags, symbolExcludes) {
|
|
if (!ts.isDeclarationFile(file) && !ts.isInAmbientContext(node)) {
|
|
if (ts.isAsyncFunctionLike(node)) {
|
|
emitFlags |= 2097152;
|
|
}
|
|
if (ts.nodeIsDecorated(node)) {
|
|
emitFlags |= 524288;
|
|
}
|
|
}
|
|
return ts.hasDynamicName(node)
|
|
? bindAnonymousDeclaration(node, symbolFlags, "__computed")
|
|
: declareSymbolAndAddToSymbolTable(node, symbolFlags, symbolExcludes);
|
|
}
|
|
function bindJSDocProperty(node) {
|
|
return declareSymbolAndAddToSymbolTable(node, 4, 0);
|
|
}
|
|
function shouldReportErrorOnModuleDeclaration(node) {
|
|
var instanceState = getModuleInstanceState(node);
|
|
return instanceState === 1 || (instanceState === 2 && options.preserveConstEnums);
|
|
}
|
|
function checkUnreachable(node) {
|
|
if (!(currentFlow.flags & 1)) {
|
|
return false;
|
|
}
|
|
if (currentFlow === unreachableFlow) {
|
|
var reportError = (ts.isStatement(node) && node.kind !== 201) ||
|
|
node.kind === 221 ||
|
|
(node.kind === 225 && shouldReportErrorOnModuleDeclaration(node)) ||
|
|
(node.kind === 224 && (!ts.isConstEnumDeclaration(node) || options.preserveConstEnums));
|
|
if (reportError) {
|
|
currentFlow = reportedUnreachableFlow;
|
|
var reportUnreachableCode = !options.allowUnreachableCode &&
|
|
!ts.isInAmbientContext(node) &&
|
|
(node.kind !== 200 ||
|
|
ts.getCombinedNodeFlags(node.declarationList) & 3072 ||
|
|
ts.forEach(node.declarationList.declarations, function (d) { return d.initializer; }));
|
|
if (reportUnreachableCode) {
|
|
errorOnFirstToken(node, ts.Diagnostics.Unreachable_code_detected);
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
var nextSymbolId = 1;
|
|
var nextNodeId = 1;
|
|
var nextMergeId = 1;
|
|
var nextFlowId = 1;
|
|
function getNodeId(node) {
|
|
if (!node.id) {
|
|
node.id = nextNodeId;
|
|
nextNodeId++;
|
|
}
|
|
return node.id;
|
|
}
|
|
ts.getNodeId = getNodeId;
|
|
ts.checkTime = 0;
|
|
function getSymbolId(symbol) {
|
|
if (!symbol.id) {
|
|
symbol.id = nextSymbolId;
|
|
nextSymbolId++;
|
|
}
|
|
return symbol.id;
|
|
}
|
|
ts.getSymbolId = getSymbolId;
|
|
function createTypeChecker(host, produceDiagnostics) {
|
|
var cancellationToken;
|
|
var Symbol = ts.objectAllocator.getSymbolConstructor();
|
|
var Type = ts.objectAllocator.getTypeConstructor();
|
|
var Signature = ts.objectAllocator.getSignatureConstructor();
|
|
var typeCount = 0;
|
|
var symbolCount = 0;
|
|
var emptyArray = [];
|
|
var emptySymbols = {};
|
|
var compilerOptions = host.getCompilerOptions();
|
|
var languageVersion = compilerOptions.target || 0;
|
|
var modulekind = ts.getEmitModuleKind(compilerOptions);
|
|
var noUnusedIdentifiers = !!compilerOptions.noUnusedLocals || !!compilerOptions.noUnusedParameters;
|
|
var allowSyntheticDefaultImports = typeof compilerOptions.allowSyntheticDefaultImports !== "undefined" ? compilerOptions.allowSyntheticDefaultImports : modulekind === ts.ModuleKind.System;
|
|
var strictNullChecks = compilerOptions.strictNullChecks;
|
|
var emitResolver = createResolver();
|
|
var undefinedSymbol = createSymbol(4 | 67108864, "undefined");
|
|
undefinedSymbol.declarations = [];
|
|
var argumentsSymbol = createSymbol(4 | 67108864, "arguments");
|
|
var checker = {
|
|
getNodeCount: function () { return ts.sum(host.getSourceFiles(), "nodeCount"); },
|
|
getIdentifierCount: function () { return ts.sum(host.getSourceFiles(), "identifierCount"); },
|
|
getSymbolCount: function () { return ts.sum(host.getSourceFiles(), "symbolCount") + symbolCount; },
|
|
getTypeCount: function () { return typeCount; },
|
|
isUndefinedSymbol: function (symbol) { return symbol === undefinedSymbol; },
|
|
isArgumentsSymbol: function (symbol) { return symbol === argumentsSymbol; },
|
|
isUnknownSymbol: function (symbol) { return symbol === unknownSymbol; },
|
|
getDiagnostics: getDiagnostics,
|
|
getGlobalDiagnostics: getGlobalDiagnostics,
|
|
getTypeOfSymbolAtLocation: getTypeOfSymbolAtLocation,
|
|
getSymbolsOfParameterPropertyDeclaration: getSymbolsOfParameterPropertyDeclaration,
|
|
getDeclaredTypeOfSymbol: getDeclaredTypeOfSymbol,
|
|
getPropertiesOfType: getPropertiesOfType,
|
|
getPropertyOfType: getPropertyOfType,
|
|
getSignaturesOfType: getSignaturesOfType,
|
|
getIndexTypeOfType: getIndexTypeOfType,
|
|
getBaseTypes: getBaseTypes,
|
|
getReturnTypeOfSignature: getReturnTypeOfSignature,
|
|
getNonNullableType: getNonNullableType,
|
|
getSymbolsInScope: getSymbolsInScope,
|
|
getSymbolAtLocation: getSymbolAtLocation,
|
|
getShorthandAssignmentValueSymbol: getShorthandAssignmentValueSymbol,
|
|
getExportSpecifierLocalTargetSymbol: getExportSpecifierLocalTargetSymbol,
|
|
getTypeAtLocation: getTypeOfNode,
|
|
getPropertySymbolOfDestructuringAssignment: getPropertySymbolOfDestructuringAssignment,
|
|
typeToString: typeToString,
|
|
getSymbolDisplayBuilder: getSymbolDisplayBuilder,
|
|
symbolToString: symbolToString,
|
|
getAugmentedPropertiesOfType: getAugmentedPropertiesOfType,
|
|
getRootSymbols: getRootSymbols,
|
|
getContextualType: getContextualType,
|
|
getFullyQualifiedName: getFullyQualifiedName,
|
|
getResolvedSignature: getResolvedSignature,
|
|
getConstantValue: getConstantValue,
|
|
isValidPropertyAccess: isValidPropertyAccess,
|
|
getSignatureFromDeclaration: getSignatureFromDeclaration,
|
|
isImplementationOfOverload: isImplementationOfOverload,
|
|
getAliasedSymbol: resolveAlias,
|
|
getEmitResolver: getEmitResolver,
|
|
getExportsOfModule: getExportsOfModuleAsArray,
|
|
getJsxElementAttributesType: getJsxElementAttributesType,
|
|
getJsxIntrinsicTagNames: getJsxIntrinsicTagNames,
|
|
isOptionalParameter: isOptionalParameter
|
|
};
|
|
var unknownSymbol = createSymbol(4 | 67108864, "unknown");
|
|
var resolvingSymbol = createSymbol(67108864, "__resolving__");
|
|
var anyType = createIntrinsicType(1, "any");
|
|
var stringType = createIntrinsicType(2, "string");
|
|
var numberType = createIntrinsicType(4, "number");
|
|
var booleanType = createIntrinsicType(8, "boolean");
|
|
var esSymbolType = createIntrinsicType(16777216, "symbol");
|
|
var voidType = createIntrinsicType(16, "void");
|
|
var undefinedType = createIntrinsicType(32, "undefined");
|
|
var undefinedWideningType = strictNullChecks ? undefinedType : createIntrinsicType(32 | 2097152, "undefined");
|
|
var nullType = createIntrinsicType(64, "null");
|
|
var nullWideningType = strictNullChecks ? nullType : createIntrinsicType(64 | 2097152, "null");
|
|
var unknownType = createIntrinsicType(1, "unknown");
|
|
var neverType = createIntrinsicType(134217728, "never");
|
|
var emptyObjectType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
|
|
var emptyGenericType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
|
|
emptyGenericType.instantiations = {};
|
|
var anyFunctionType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
|
|
anyFunctionType.flags |= 8388608;
|
|
var noConstraintType = createAnonymousType(undefined, emptySymbols, emptyArray, emptyArray, undefined, undefined);
|
|
var anySignature = createSignature(undefined, undefined, undefined, emptyArray, anyType, undefined, 0, false, false);
|
|
var unknownSignature = createSignature(undefined, undefined, undefined, emptyArray, unknownType, undefined, 0, false, false);
|
|
var enumNumberIndexInfo = createIndexInfo(stringType, true);
|
|
var globals = {};
|
|
var patternAmbientModules;
|
|
var getGlobalESSymbolConstructorSymbol;
|
|
var getGlobalPromiseConstructorSymbol;
|
|
var globalObjectType;
|
|
var globalFunctionType;
|
|
var globalArrayType;
|
|
var globalReadonlyArrayType;
|
|
var globalStringType;
|
|
var globalNumberType;
|
|
var globalBooleanType;
|
|
var globalRegExpType;
|
|
var anyArrayType;
|
|
var anyReadonlyArrayType;
|
|
var getGlobalTemplateStringsArrayType;
|
|
var getGlobalESSymbolType;
|
|
var getGlobalIterableType;
|
|
var getGlobalIteratorType;
|
|
var getGlobalIterableIteratorType;
|
|
var getGlobalClassDecoratorType;
|
|
var getGlobalParameterDecoratorType;
|
|
var getGlobalPropertyDecoratorType;
|
|
var getGlobalMethodDecoratorType;
|
|
var getGlobalTypedPropertyDescriptorType;
|
|
var getGlobalPromiseType;
|
|
var tryGetGlobalPromiseType;
|
|
var getGlobalPromiseLikeType;
|
|
var getInstantiatedGlobalPromiseLikeType;
|
|
var getGlobalPromiseConstructorLikeType;
|
|
var getGlobalThenableType;
|
|
var jsxElementClassType;
|
|
var deferredNodes;
|
|
var deferredUnusedIdentifierNodes;
|
|
var flowLoopStart = 0;
|
|
var flowLoopCount = 0;
|
|
var visitedFlowCount = 0;
|
|
var tupleTypes = {};
|
|
var unionTypes = {};
|
|
var intersectionTypes = {};
|
|
var stringLiteralTypes = {};
|
|
var resolutionTargets = [];
|
|
var resolutionResults = [];
|
|
var resolutionPropertyNames = [];
|
|
var mergedSymbols = [];
|
|
var symbolLinks = [];
|
|
var nodeLinks = [];
|
|
var flowLoopCaches = [];
|
|
var flowLoopNodes = [];
|
|
var flowLoopKeys = [];
|
|
var flowLoopTypes = [];
|
|
var visitedFlowNodes = [];
|
|
var visitedFlowTypes = [];
|
|
var potentialThisCollisions = [];
|
|
var awaitedTypeStack = [];
|
|
var diagnostics = ts.createDiagnosticCollection();
|
|
var typeofEQFacts = {
|
|
"string": 1,
|
|
"number": 2,
|
|
"boolean": 4,
|
|
"symbol": 8,
|
|
"undefined": 16384,
|
|
"object": 16,
|
|
"function": 32
|
|
};
|
|
var typeofNEFacts = {
|
|
"string": 128,
|
|
"number": 256,
|
|
"boolean": 512,
|
|
"symbol": 1024,
|
|
"undefined": 131072,
|
|
"object": 2048,
|
|
"function": 4096
|
|
};
|
|
var typeofTypesByName = {
|
|
"string": stringType,
|
|
"number": numberType,
|
|
"boolean": booleanType,
|
|
"symbol": esSymbolType,
|
|
"undefined": undefinedType
|
|
};
|
|
var jsxElementType;
|
|
var jsxTypes = {};
|
|
var JsxNames = {
|
|
JSX: "JSX",
|
|
IntrinsicElements: "IntrinsicElements",
|
|
ElementClass: "ElementClass",
|
|
ElementAttributesPropertyNameContainer: "ElementAttributesProperty",
|
|
Element: "Element",
|
|
IntrinsicAttributes: "IntrinsicAttributes",
|
|
IntrinsicClassAttributes: "IntrinsicClassAttributes"
|
|
};
|
|
var subtypeRelation = {};
|
|
var assignableRelation = {};
|
|
var comparableRelation = {};
|
|
var identityRelation = {};
|
|
var _displayBuilder;
|
|
var builtinGlobals = (_a = {},
|
|
_a[undefinedSymbol.name] = undefinedSymbol,
|
|
_a
|
|
);
|
|
initializeTypeChecker();
|
|
return checker;
|
|
function getEmitResolver(sourceFile, cancellationToken) {
|
|
getDiagnostics(sourceFile, cancellationToken);
|
|
return emitResolver;
|
|
}
|
|
function error(location, message, arg0, arg1, arg2) {
|
|
var diagnostic = location
|
|
? ts.createDiagnosticForNode(location, message, arg0, arg1, arg2)
|
|
: ts.createCompilerDiagnostic(message, arg0, arg1, arg2);
|
|
diagnostics.add(diagnostic);
|
|
}
|
|
function createSymbol(flags, name) {
|
|
symbolCount++;
|
|
return new Symbol(flags, name);
|
|
}
|
|
function getExcludedSymbolFlags(flags) {
|
|
var result = 0;
|
|
if (flags & 2)
|
|
result |= 107455;
|
|
if (flags & 1)
|
|
result |= 107454;
|
|
if (flags & 4)
|
|
result |= 0;
|
|
if (flags & 8)
|
|
result |= 107455;
|
|
if (flags & 16)
|
|
result |= 106927;
|
|
if (flags & 32)
|
|
result |= 899519;
|
|
if (flags & 64)
|
|
result |= 792960;
|
|
if (flags & 256)
|
|
result |= 899327;
|
|
if (flags & 128)
|
|
result |= 899967;
|
|
if (flags & 512)
|
|
result |= 106639;
|
|
if (flags & 8192)
|
|
result |= 99263;
|
|
if (flags & 32768)
|
|
result |= 41919;
|
|
if (flags & 65536)
|
|
result |= 74687;
|
|
if (flags & 262144)
|
|
result |= 530912;
|
|
if (flags & 524288)
|
|
result |= 793056;
|
|
if (flags & 8388608)
|
|
result |= 8388608;
|
|
return result;
|
|
}
|
|
function recordMergedSymbol(target, source) {
|
|
if (!source.mergeId) {
|
|
source.mergeId = nextMergeId;
|
|
nextMergeId++;
|
|
}
|
|
mergedSymbols[source.mergeId] = target;
|
|
}
|
|
function cloneSymbol(symbol) {
|
|
var result = createSymbol(symbol.flags | 33554432, symbol.name);
|
|
result.declarations = symbol.declarations.slice(0);
|
|
result.parent = symbol.parent;
|
|
if (symbol.valueDeclaration)
|
|
result.valueDeclaration = symbol.valueDeclaration;
|
|
if (symbol.constEnumOnlyModule)
|
|
result.constEnumOnlyModule = true;
|
|
if (symbol.members)
|
|
result.members = cloneSymbolTable(symbol.members);
|
|
if (symbol.exports)
|
|
result.exports = cloneSymbolTable(symbol.exports);
|
|
recordMergedSymbol(result, symbol);
|
|
return result;
|
|
}
|
|
function mergeSymbol(target, source) {
|
|
if (!(target.flags & getExcludedSymbolFlags(source.flags))) {
|
|
if (source.flags & 512 && target.flags & 512 && target.constEnumOnlyModule && !source.constEnumOnlyModule) {
|
|
target.constEnumOnlyModule = false;
|
|
}
|
|
target.flags |= source.flags;
|
|
if (source.valueDeclaration &&
|
|
(!target.valueDeclaration ||
|
|
(target.valueDeclaration.kind === 225 && source.valueDeclaration.kind !== 225))) {
|
|
target.valueDeclaration = source.valueDeclaration;
|
|
}
|
|
ts.forEach(source.declarations, function (node) {
|
|
target.declarations.push(node);
|
|
});
|
|
if (source.members) {
|
|
if (!target.members)
|
|
target.members = {};
|
|
mergeSymbolTable(target.members, source.members);
|
|
}
|
|
if (source.exports) {
|
|
if (!target.exports)
|
|
target.exports = {};
|
|
mergeSymbolTable(target.exports, source.exports);
|
|
}
|
|
recordMergedSymbol(target, source);
|
|
}
|
|
else {
|
|
var message_2 = target.flags & 2 || source.flags & 2
|
|
? ts.Diagnostics.Cannot_redeclare_block_scoped_variable_0 : ts.Diagnostics.Duplicate_identifier_0;
|
|
ts.forEach(source.declarations, function (node) {
|
|
error(node.name ? node.name : node, message_2, symbolToString(source));
|
|
});
|
|
ts.forEach(target.declarations, function (node) {
|
|
error(node.name ? node.name : node, message_2, symbolToString(source));
|
|
});
|
|
}
|
|
}
|
|
function cloneSymbolTable(symbolTable) {
|
|
var result = {};
|
|
for (var id in symbolTable) {
|
|
if (ts.hasProperty(symbolTable, id)) {
|
|
result[id] = symbolTable[id];
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function mergeSymbolTable(target, source) {
|
|
for (var id in source) {
|
|
if (ts.hasProperty(source, id)) {
|
|
if (!ts.hasProperty(target, id)) {
|
|
target[id] = source[id];
|
|
}
|
|
else {
|
|
var symbol = target[id];
|
|
if (!(symbol.flags & 33554432)) {
|
|
target[id] = symbol = cloneSymbol(symbol);
|
|
}
|
|
mergeSymbol(symbol, source[id]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function mergeModuleAugmentation(moduleName) {
|
|
var moduleAugmentation = moduleName.parent;
|
|
if (moduleAugmentation.symbol.declarations[0] !== moduleAugmentation) {
|
|
ts.Debug.assert(moduleAugmentation.symbol.declarations.length > 1);
|
|
return;
|
|
}
|
|
if (ts.isGlobalScopeAugmentation(moduleAugmentation)) {
|
|
mergeSymbolTable(globals, moduleAugmentation.symbol.exports);
|
|
}
|
|
else {
|
|
var moduleNotFoundError = !ts.isInAmbientContext(moduleName.parent.parent)
|
|
? ts.Diagnostics.Invalid_module_name_in_augmentation_module_0_cannot_be_found
|
|
: undefined;
|
|
var mainModule = resolveExternalModuleNameWorker(moduleName, moduleName, moduleNotFoundError);
|
|
if (!mainModule) {
|
|
return;
|
|
}
|
|
mainModule = resolveExternalModuleSymbol(mainModule);
|
|
if (mainModule.flags & 1536) {
|
|
mainModule = mainModule.flags & 33554432 ? mainModule : cloneSymbol(mainModule);
|
|
mergeSymbol(mainModule, moduleAugmentation.symbol);
|
|
}
|
|
else {
|
|
error(moduleName, ts.Diagnostics.Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity, moduleName.text);
|
|
}
|
|
}
|
|
}
|
|
function addToSymbolTable(target, source, message) {
|
|
for (var id in source) {
|
|
if (ts.hasProperty(source, id)) {
|
|
if (ts.hasProperty(target, id)) {
|
|
ts.forEach(target[id].declarations, addDeclarationDiagnostic(id, message));
|
|
}
|
|
else {
|
|
target[id] = source[id];
|
|
}
|
|
}
|
|
}
|
|
function addDeclarationDiagnostic(id, message) {
|
|
return function (declaration) { return diagnostics.add(ts.createDiagnosticForNode(declaration, message, id)); };
|
|
}
|
|
}
|
|
function getSymbolLinks(symbol) {
|
|
if (symbol.flags & 67108864)
|
|
return symbol;
|
|
var id = getSymbolId(symbol);
|
|
return symbolLinks[id] || (symbolLinks[id] = {});
|
|
}
|
|
function getNodeLinks(node) {
|
|
var nodeId = getNodeId(node);
|
|
return nodeLinks[nodeId] || (nodeLinks[nodeId] = {});
|
|
}
|
|
function isGlobalSourceFile(node) {
|
|
return node.kind === 256 && !ts.isExternalOrCommonJsModule(node);
|
|
}
|
|
function getSymbol(symbols, name, meaning) {
|
|
if (meaning && ts.hasProperty(symbols, name)) {
|
|
var symbol = symbols[name];
|
|
ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
|
|
if (symbol.flags & meaning) {
|
|
return symbol;
|
|
}
|
|
if (symbol.flags & 8388608) {
|
|
var target = resolveAlias(symbol);
|
|
if (target === unknownSymbol || target.flags & meaning) {
|
|
return symbol;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getSymbolsOfParameterPropertyDeclaration(parameter, parameterName) {
|
|
var constructorDeclaration = parameter.parent;
|
|
var classDeclaration = parameter.parent.parent;
|
|
var parameterSymbol = getSymbol(constructorDeclaration.locals, parameterName, 107455);
|
|
var propertySymbol = getSymbol(classDeclaration.symbol.members, parameterName, 107455);
|
|
if (parameterSymbol && propertySymbol) {
|
|
return [parameterSymbol, propertySymbol];
|
|
}
|
|
ts.Debug.fail("There should exist two symbols, one as property declaration and one as parameter declaration");
|
|
}
|
|
function isBlockScopedNameDeclaredBeforeUse(declaration, usage) {
|
|
var declarationFile = ts.getSourceFileOfNode(declaration);
|
|
var useFile = ts.getSourceFileOfNode(usage);
|
|
if (declarationFile !== useFile) {
|
|
if ((modulekind && (declarationFile.externalModuleIndicator || useFile.externalModuleIndicator)) ||
|
|
(!compilerOptions.outFile && !compilerOptions.out)) {
|
|
return true;
|
|
}
|
|
var sourceFiles = host.getSourceFiles();
|
|
return ts.indexOf(sourceFiles, declarationFile) <= ts.indexOf(sourceFiles, useFile);
|
|
}
|
|
if (declaration.pos <= usage.pos) {
|
|
return declaration.kind !== 218 ||
|
|
!isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration, usage);
|
|
}
|
|
return isUsedInFunctionOrNonStaticProperty(declaration, usage);
|
|
function isImmediatelyUsedInInitializerOfBlockScopedVariable(declaration, usage) {
|
|
var container = ts.getEnclosingBlockScopeContainer(declaration);
|
|
switch (declaration.parent.parent.kind) {
|
|
case 200:
|
|
case 206:
|
|
case 208:
|
|
if (isSameScopeDescendentOf(usage, declaration, container)) {
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
switch (declaration.parent.parent.kind) {
|
|
case 207:
|
|
case 208:
|
|
if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isUsedInFunctionOrNonStaticProperty(declaration, usage) {
|
|
var container = ts.getEnclosingBlockScopeContainer(declaration);
|
|
var current = usage;
|
|
while (current) {
|
|
if (current === container) {
|
|
return false;
|
|
}
|
|
if (ts.isFunctionLike(current)) {
|
|
return true;
|
|
}
|
|
var initializerOfNonStaticProperty = current.parent &&
|
|
current.parent.kind === 145 &&
|
|
(current.parent.flags & 32) === 0 &&
|
|
current.parent.initializer === current;
|
|
if (initializerOfNonStaticProperty) {
|
|
return true;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
function resolveName(location, name, meaning, nameNotFoundMessage, nameArg) {
|
|
var result;
|
|
var lastLocation;
|
|
var propertyWithInvalidInitializer;
|
|
var errorLocation = location;
|
|
var grandparent;
|
|
var isInExternalModule = false;
|
|
loop: while (location) {
|
|
if (location.locals && !isGlobalSourceFile(location)) {
|
|
if (result = getSymbol(location.locals, name, meaning)) {
|
|
var useResult = true;
|
|
if (ts.isFunctionLike(location) && lastLocation && lastLocation !== location.body) {
|
|
if (meaning & result.flags & 793056 && lastLocation.kind !== 273) {
|
|
useResult = result.flags & 262144
|
|
? lastLocation === location.type ||
|
|
lastLocation.kind === 142 ||
|
|
lastLocation.kind === 141
|
|
: false;
|
|
}
|
|
if (meaning & 107455 && result.flags & 1) {
|
|
useResult =
|
|
lastLocation.kind === 142 ||
|
|
(lastLocation === location.type &&
|
|
result.valueDeclaration.kind === 142);
|
|
}
|
|
}
|
|
if (useResult) {
|
|
break loop;
|
|
}
|
|
else {
|
|
result = undefined;
|
|
}
|
|
}
|
|
}
|
|
switch (location.kind) {
|
|
case 256:
|
|
if (!ts.isExternalOrCommonJsModule(location))
|
|
break;
|
|
isInExternalModule = true;
|
|
case 225:
|
|
var moduleExports = getSymbolOfNode(location).exports;
|
|
if (location.kind === 256 || ts.isAmbientModule(location)) {
|
|
if (result = moduleExports["default"]) {
|
|
var localSymbol = ts.getLocalSymbolForExportDefault(result);
|
|
if (localSymbol && (result.flags & meaning) && localSymbol.name === name) {
|
|
break loop;
|
|
}
|
|
result = undefined;
|
|
}
|
|
if (ts.hasProperty(moduleExports, name) &&
|
|
moduleExports[name].flags === 8388608 &&
|
|
ts.getDeclarationOfKind(moduleExports[name], 238)) {
|
|
break;
|
|
}
|
|
}
|
|
if (result = getSymbol(moduleExports, name, meaning & 8914931)) {
|
|
break loop;
|
|
}
|
|
break;
|
|
case 224:
|
|
if (result = getSymbol(getSymbolOfNode(location).exports, name, meaning & 8)) {
|
|
break loop;
|
|
}
|
|
break;
|
|
case 145:
|
|
case 144:
|
|
if (ts.isClassLike(location.parent) && !(location.flags & 32)) {
|
|
var ctor = findConstructorDeclaration(location.parent);
|
|
if (ctor && ctor.locals) {
|
|
if (getSymbol(ctor.locals, name, meaning & 107455)) {
|
|
propertyWithInvalidInitializer = location;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 221:
|
|
case 192:
|
|
case 222:
|
|
if (result = getSymbol(getSymbolOfNode(location).members, name, meaning & 793056)) {
|
|
if (lastLocation && lastLocation.flags & 32) {
|
|
error(errorLocation, ts.Diagnostics.Static_members_cannot_reference_class_type_parameters);
|
|
return undefined;
|
|
}
|
|
break loop;
|
|
}
|
|
if (location.kind === 192 && meaning & 32) {
|
|
var className = location.name;
|
|
if (className && name === className.text) {
|
|
result = location.symbol;
|
|
break loop;
|
|
}
|
|
}
|
|
break;
|
|
case 140:
|
|
grandparent = location.parent.parent;
|
|
if (ts.isClassLike(grandparent) || grandparent.kind === 222) {
|
|
if (result = getSymbol(getSymbolOfNode(grandparent).members, name, meaning & 793056)) {
|
|
error(errorLocation, ts.Diagnostics.A_computed_property_name_cannot_reference_a_type_parameter_from_its_containing_type);
|
|
return undefined;
|
|
}
|
|
}
|
|
break;
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 220:
|
|
case 180:
|
|
if (meaning & 3 && name === "arguments") {
|
|
result = argumentsSymbol;
|
|
break loop;
|
|
}
|
|
break;
|
|
case 179:
|
|
if (meaning & 3 && name === "arguments") {
|
|
result = argumentsSymbol;
|
|
break loop;
|
|
}
|
|
if (meaning & 16) {
|
|
var functionName = location.name;
|
|
if (functionName && name === functionName.text) {
|
|
result = location.symbol;
|
|
break loop;
|
|
}
|
|
}
|
|
break;
|
|
case 143:
|
|
if (location.parent && location.parent.kind === 142) {
|
|
location = location.parent;
|
|
}
|
|
if (location.parent && ts.isClassElement(location.parent)) {
|
|
location = location.parent;
|
|
}
|
|
break;
|
|
}
|
|
lastLocation = location;
|
|
location = location.parent;
|
|
}
|
|
if (result && nameNotFoundMessage && noUnusedIdentifiers) {
|
|
result.isReferenced = true;
|
|
}
|
|
if (!result) {
|
|
result = getSymbol(globals, name, meaning);
|
|
}
|
|
if (!result) {
|
|
if (nameNotFoundMessage) {
|
|
if (!checkAndReportErrorForMissingPrefix(errorLocation, name, nameArg) &&
|
|
!checkAndReportErrorForExtendingInterface(errorLocation)) {
|
|
error(errorLocation, nameNotFoundMessage, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
if (nameNotFoundMessage) {
|
|
if (propertyWithInvalidInitializer) {
|
|
var propertyName = propertyWithInvalidInitializer.name;
|
|
error(errorLocation, ts.Diagnostics.Initializer_of_instance_member_variable_0_cannot_reference_identifier_1_declared_in_the_constructor, ts.declarationNameToString(propertyName), typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
|
|
return undefined;
|
|
}
|
|
if (meaning & 2) {
|
|
var exportOrLocalSymbol = getExportSymbolOfValueSymbolIfExported(result);
|
|
if (exportOrLocalSymbol.flags & 2) {
|
|
checkResolvedBlockScopedVariable(exportOrLocalSymbol, errorLocation);
|
|
}
|
|
}
|
|
if (result && isInExternalModule) {
|
|
var decls = result.declarations;
|
|
if (decls && decls.length === 1 && decls[0].kind === 228) {
|
|
error(errorLocation, ts.Diagnostics.Identifier_0_must_be_imported_from_a_module, name);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function checkAndReportErrorForMissingPrefix(errorLocation, name, nameArg) {
|
|
if (!errorLocation || (errorLocation.kind === 69 && (isTypeReferenceIdentifier(errorLocation)) || isInTypeQuery(errorLocation))) {
|
|
return false;
|
|
}
|
|
var container = ts.getThisContainer(errorLocation, true);
|
|
var location = container;
|
|
while (location) {
|
|
if (ts.isClassLike(location.parent)) {
|
|
var classSymbol = getSymbolOfNode(location.parent);
|
|
if (!classSymbol) {
|
|
break;
|
|
}
|
|
var constructorType = getTypeOfSymbol(classSymbol);
|
|
if (getPropertyOfType(constructorType, name)) {
|
|
error(errorLocation, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_static_member_1_0, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg), symbolToString(classSymbol));
|
|
return true;
|
|
}
|
|
if (location === container && !(location.flags & 32)) {
|
|
var instanceType = getDeclaredTypeOfSymbol(classSymbol).thisType;
|
|
if (getPropertyOfType(instanceType, name)) {
|
|
error(errorLocation, ts.Diagnostics.Cannot_find_name_0_Did_you_mean_the_instance_member_this_0, typeof nameArg === "string" ? nameArg : ts.declarationNameToString(nameArg));
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
location = location.parent;
|
|
}
|
|
return false;
|
|
}
|
|
function checkAndReportErrorForExtendingInterface(errorLocation) {
|
|
var parentClassExpression = errorLocation;
|
|
while (parentClassExpression) {
|
|
var kind = parentClassExpression.kind;
|
|
if (kind === 69 || kind === 172) {
|
|
parentClassExpression = parentClassExpression.parent;
|
|
continue;
|
|
}
|
|
if (kind === 194) {
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
if (!parentClassExpression) {
|
|
return false;
|
|
}
|
|
var expression = parentClassExpression.expression;
|
|
if (resolveEntityName(expression, 64, true)) {
|
|
error(errorLocation, ts.Diagnostics.Cannot_extend_an_interface_0_Did_you_mean_implements, ts.getTextOfNode(expression));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function checkResolvedBlockScopedVariable(result, errorLocation) {
|
|
ts.Debug.assert((result.flags & 2) !== 0);
|
|
var declaration = ts.forEach(result.declarations, function (d) { return ts.isBlockOrCatchScoped(d) ? d : undefined; });
|
|
ts.Debug.assert(declaration !== undefined, "Block-scoped variable declaration is undefined");
|
|
if (!isBlockScopedNameDeclaredBeforeUse(ts.getAncestor(declaration, 218), errorLocation)) {
|
|
error(errorLocation, ts.Diagnostics.Block_scoped_variable_0_used_before_its_declaration, ts.declarationNameToString(declaration.name));
|
|
}
|
|
}
|
|
function isSameScopeDescendentOf(initial, parent, stopAt) {
|
|
if (!parent) {
|
|
return false;
|
|
}
|
|
for (var current = initial; current && current !== stopAt && !ts.isFunctionLike(current); current = current.parent) {
|
|
if (current === parent) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function getAnyImportSyntax(node) {
|
|
if (ts.isAliasSymbolDeclaration(node)) {
|
|
if (node.kind === 229) {
|
|
return node;
|
|
}
|
|
while (node && node.kind !== 230) {
|
|
node = node.parent;
|
|
}
|
|
return node;
|
|
}
|
|
}
|
|
function getDeclarationOfAliasSymbol(symbol) {
|
|
return ts.forEach(symbol.declarations, function (d) { return ts.isAliasSymbolDeclaration(d) ? d : undefined; });
|
|
}
|
|
function getTargetOfImportEqualsDeclaration(node) {
|
|
if (node.moduleReference.kind === 240) {
|
|
return resolveExternalModuleSymbol(resolveExternalModuleName(node, ts.getExternalModuleImportEqualsDeclarationExpression(node)));
|
|
}
|
|
return getSymbolOfPartOfRightHandSideOfImportEquals(node.moduleReference, node);
|
|
}
|
|
function getTargetOfImportClause(node) {
|
|
var moduleSymbol = resolveExternalModuleName(node, node.parent.moduleSpecifier);
|
|
if (moduleSymbol) {
|
|
var exportDefaultSymbol = ts.isShorthandAmbientModule(moduleSymbol.valueDeclaration) ?
|
|
moduleSymbol :
|
|
moduleSymbol.exports["export="] ?
|
|
getPropertyOfType(getTypeOfSymbol(moduleSymbol.exports["export="]), "default") :
|
|
resolveSymbol(moduleSymbol.exports["default"]);
|
|
if (!exportDefaultSymbol && !allowSyntheticDefaultImports) {
|
|
error(node.name, ts.Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
|
|
}
|
|
else if (!exportDefaultSymbol && allowSyntheticDefaultImports) {
|
|
return resolveExternalModuleSymbol(moduleSymbol) || resolveSymbol(moduleSymbol);
|
|
}
|
|
return exportDefaultSymbol;
|
|
}
|
|
}
|
|
function getTargetOfNamespaceImport(node) {
|
|
var moduleSpecifier = node.parent.parent.moduleSpecifier;
|
|
return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier);
|
|
}
|
|
function combineValueAndTypeSymbols(valueSymbol, typeSymbol) {
|
|
if (valueSymbol.flags & (793056 | 1536)) {
|
|
return valueSymbol;
|
|
}
|
|
var result = createSymbol(valueSymbol.flags | typeSymbol.flags, valueSymbol.name);
|
|
result.declarations = ts.concatenate(valueSymbol.declarations, typeSymbol.declarations);
|
|
result.parent = valueSymbol.parent || typeSymbol.parent;
|
|
if (valueSymbol.valueDeclaration)
|
|
result.valueDeclaration = valueSymbol.valueDeclaration;
|
|
if (typeSymbol.members)
|
|
result.members = typeSymbol.members;
|
|
if (valueSymbol.exports)
|
|
result.exports = valueSymbol.exports;
|
|
return result;
|
|
}
|
|
function getExportOfModule(symbol, name) {
|
|
if (symbol.flags & 1536) {
|
|
var exports = getExportsOfSymbol(symbol);
|
|
if (ts.hasProperty(exports, name)) {
|
|
return resolveSymbol(exports[name]);
|
|
}
|
|
}
|
|
}
|
|
function getPropertyOfVariable(symbol, name) {
|
|
if (symbol.flags & 3) {
|
|
var typeAnnotation = symbol.valueDeclaration.type;
|
|
if (typeAnnotation) {
|
|
return resolveSymbol(getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name));
|
|
}
|
|
}
|
|
}
|
|
function getExternalModuleMember(node, specifier) {
|
|
var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
|
|
var targetSymbol = resolveESModuleSymbol(moduleSymbol, node.moduleSpecifier);
|
|
if (targetSymbol) {
|
|
var name_10 = specifier.propertyName || specifier.name;
|
|
if (name_10.text) {
|
|
if (ts.isShorthandAmbientModule(moduleSymbol.valueDeclaration)) {
|
|
return moduleSymbol;
|
|
}
|
|
var symbolFromVariable = void 0;
|
|
if (moduleSymbol && moduleSymbol.exports && moduleSymbol.exports["export="]) {
|
|
symbolFromVariable = getPropertyOfType(getTypeOfSymbol(targetSymbol), name_10.text);
|
|
}
|
|
else {
|
|
symbolFromVariable = getPropertyOfVariable(targetSymbol, name_10.text);
|
|
}
|
|
symbolFromVariable = resolveSymbol(symbolFromVariable);
|
|
var symbolFromModule = getExportOfModule(targetSymbol, name_10.text);
|
|
var symbol = symbolFromModule && symbolFromVariable ?
|
|
combineValueAndTypeSymbols(symbolFromVariable, symbolFromModule) :
|
|
symbolFromModule || symbolFromVariable;
|
|
if (!symbol) {
|
|
error(name_10, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(moduleSymbol), ts.declarationNameToString(name_10));
|
|
}
|
|
return symbol;
|
|
}
|
|
}
|
|
}
|
|
function getTargetOfImportSpecifier(node) {
|
|
return getExternalModuleMember(node.parent.parent.parent, node);
|
|
}
|
|
function getTargetOfNamespaceExportDeclaration(node) {
|
|
return resolveExternalModuleSymbol(node.parent.symbol);
|
|
}
|
|
function getTargetOfExportSpecifier(node) {
|
|
return node.parent.parent.moduleSpecifier ?
|
|
getExternalModuleMember(node.parent.parent, node) :
|
|
resolveEntityName(node.propertyName || node.name, 107455 | 793056 | 1536);
|
|
}
|
|
function getTargetOfExportAssignment(node) {
|
|
return resolveEntityName(node.expression, 107455 | 793056 | 1536);
|
|
}
|
|
function getTargetOfAliasDeclaration(node) {
|
|
switch (node.kind) {
|
|
case 229:
|
|
return getTargetOfImportEqualsDeclaration(node);
|
|
case 231:
|
|
return getTargetOfImportClause(node);
|
|
case 232:
|
|
return getTargetOfNamespaceImport(node);
|
|
case 234:
|
|
return getTargetOfImportSpecifier(node);
|
|
case 238:
|
|
return getTargetOfExportSpecifier(node);
|
|
case 235:
|
|
return getTargetOfExportAssignment(node);
|
|
case 228:
|
|
return getTargetOfNamespaceExportDeclaration(node);
|
|
}
|
|
}
|
|
function resolveSymbol(symbol) {
|
|
return symbol && symbol.flags & 8388608 && !(symbol.flags & (107455 | 793056 | 1536)) ? resolveAlias(symbol) : symbol;
|
|
}
|
|
function resolveAlias(symbol) {
|
|
ts.Debug.assert((symbol.flags & 8388608) !== 0, "Should only get Alias here.");
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.target) {
|
|
links.target = resolvingSymbol;
|
|
var node = getDeclarationOfAliasSymbol(symbol);
|
|
var target = getTargetOfAliasDeclaration(node);
|
|
if (links.target === resolvingSymbol) {
|
|
links.target = target || unknownSymbol;
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.Circular_definition_of_import_alias_0, symbolToString(symbol));
|
|
}
|
|
}
|
|
else if (links.target === resolvingSymbol) {
|
|
links.target = unknownSymbol;
|
|
}
|
|
return links.target;
|
|
}
|
|
function markExportAsReferenced(node) {
|
|
var symbol = getSymbolOfNode(node);
|
|
var target = resolveAlias(symbol);
|
|
if (target) {
|
|
var markAlias = target === unknownSymbol ||
|
|
((target.flags & 107455) && !isConstEnumOrConstEnumOnlyModule(target));
|
|
if (markAlias) {
|
|
markAliasSymbolAsReferenced(symbol);
|
|
}
|
|
}
|
|
}
|
|
function markAliasSymbolAsReferenced(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.referenced) {
|
|
links.referenced = true;
|
|
var node = getDeclarationOfAliasSymbol(symbol);
|
|
if (node.kind === 235) {
|
|
checkExpressionCached(node.expression);
|
|
}
|
|
else if (node.kind === 238) {
|
|
checkExpressionCached(node.propertyName || node.name);
|
|
}
|
|
else if (ts.isInternalModuleImportEqualsDeclaration(node)) {
|
|
checkExpressionCached(node.moduleReference);
|
|
}
|
|
}
|
|
}
|
|
function getSymbolOfPartOfRightHandSideOfImportEquals(entityName, importDeclaration, dontResolveAlias) {
|
|
if (entityName.kind === 69 && ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
|
|
entityName = entityName.parent;
|
|
}
|
|
if (entityName.kind === 69 || entityName.parent.kind === 139) {
|
|
return resolveEntityName(entityName, 1536, false, dontResolveAlias);
|
|
}
|
|
else {
|
|
ts.Debug.assert(entityName.parent.kind === 229);
|
|
return resolveEntityName(entityName, 107455 | 793056 | 1536, false, dontResolveAlias);
|
|
}
|
|
}
|
|
function getFullyQualifiedName(symbol) {
|
|
return symbol.parent ? getFullyQualifiedName(symbol.parent) + "." + symbolToString(symbol) : symbolToString(symbol);
|
|
}
|
|
function resolveEntityName(name, meaning, ignoreErrors, dontResolveAlias) {
|
|
if (ts.nodeIsMissing(name)) {
|
|
return undefined;
|
|
}
|
|
var symbol;
|
|
if (name.kind === 69) {
|
|
var message = meaning === 1536 ? ts.Diagnostics.Cannot_find_namespace_0 : ts.Diagnostics.Cannot_find_name_0;
|
|
symbol = resolveName(name, name.text, meaning, ignoreErrors ? undefined : message, name);
|
|
if (!symbol) {
|
|
return undefined;
|
|
}
|
|
}
|
|
else if (name.kind === 139 || name.kind === 172) {
|
|
var left = name.kind === 139 ? name.left : name.expression;
|
|
var right = name.kind === 139 ? name.right : name.name;
|
|
var namespace = resolveEntityName(left, 1536, ignoreErrors);
|
|
if (!namespace || ts.nodeIsMissing(right)) {
|
|
return undefined;
|
|
}
|
|
else if (namespace === unknownSymbol) {
|
|
return namespace;
|
|
}
|
|
symbol = getSymbol(getExportsOfSymbol(namespace), right.text, meaning);
|
|
if (!symbol) {
|
|
if (!ignoreErrors) {
|
|
error(right, ts.Diagnostics.Module_0_has_no_exported_member_1, getFullyQualifiedName(namespace), ts.declarationNameToString(right));
|
|
}
|
|
return undefined;
|
|
}
|
|
}
|
|
else {
|
|
ts.Debug.fail("Unknown entity name kind.");
|
|
}
|
|
ts.Debug.assert((symbol.flags & 16777216) === 0, "Should never get an instantiated symbol here.");
|
|
return (symbol.flags & meaning) || dontResolveAlias ? symbol : resolveAlias(symbol);
|
|
}
|
|
function resolveExternalModuleName(location, moduleReferenceExpression) {
|
|
return resolveExternalModuleNameWorker(location, moduleReferenceExpression, ts.Diagnostics.Cannot_find_module_0);
|
|
}
|
|
function resolveExternalModuleNameWorker(location, moduleReferenceExpression, moduleNotFoundError) {
|
|
if (moduleReferenceExpression.kind !== 9) {
|
|
return;
|
|
}
|
|
var moduleReferenceLiteral = moduleReferenceExpression;
|
|
var moduleName = ts.escapeIdentifier(moduleReferenceLiteral.text);
|
|
if (moduleName === undefined) {
|
|
return;
|
|
}
|
|
var isRelative = ts.isExternalModuleNameRelative(moduleName);
|
|
if (!isRelative) {
|
|
var symbol = getSymbol(globals, '"' + moduleName + '"', 512);
|
|
if (symbol) {
|
|
return getMergedSymbol(symbol);
|
|
}
|
|
}
|
|
var resolvedModule = ts.getResolvedModule(ts.getSourceFileOfNode(location), moduleReferenceLiteral.text);
|
|
var sourceFile = resolvedModule && host.getSourceFile(resolvedModule.resolvedFileName);
|
|
if (sourceFile) {
|
|
if (sourceFile.symbol) {
|
|
return getMergedSymbol(sourceFile.symbol);
|
|
}
|
|
if (moduleNotFoundError) {
|
|
error(moduleReferenceLiteral, ts.Diagnostics.File_0_is_not_a_module, sourceFile.fileName);
|
|
}
|
|
return undefined;
|
|
}
|
|
if (patternAmbientModules) {
|
|
var pattern = ts.findBestPatternMatch(patternAmbientModules, function (_) { return _.pattern; }, moduleName);
|
|
if (pattern) {
|
|
return getMergedSymbol(pattern.symbol);
|
|
}
|
|
}
|
|
if (moduleNotFoundError) {
|
|
error(moduleReferenceLiteral, moduleNotFoundError, moduleName);
|
|
}
|
|
return undefined;
|
|
}
|
|
function resolveExternalModuleSymbol(moduleSymbol) {
|
|
return moduleSymbol && getMergedSymbol(resolveSymbol(moduleSymbol.exports["export="])) || moduleSymbol;
|
|
}
|
|
function resolveESModuleSymbol(moduleSymbol, moduleReferenceExpression) {
|
|
var symbol = resolveExternalModuleSymbol(moduleSymbol);
|
|
if (symbol && !(symbol.flags & (1536 | 3))) {
|
|
error(moduleReferenceExpression, ts.Diagnostics.Module_0_resolves_to_a_non_module_entity_and_cannot_be_imported_using_this_construct, symbolToString(moduleSymbol));
|
|
symbol = undefined;
|
|
}
|
|
return symbol;
|
|
}
|
|
function hasExportAssignmentSymbol(moduleSymbol) {
|
|
return moduleSymbol.exports["export="] !== undefined;
|
|
}
|
|
function getExportsOfModuleAsArray(moduleSymbol) {
|
|
return symbolsToArray(getExportsOfModule(moduleSymbol));
|
|
}
|
|
function getExportsOfSymbol(symbol) {
|
|
return symbol.flags & 1536 ? getExportsOfModule(symbol) : symbol.exports || emptySymbols;
|
|
}
|
|
function getExportsOfModule(moduleSymbol) {
|
|
var links = getSymbolLinks(moduleSymbol);
|
|
return links.resolvedExports || (links.resolvedExports = getExportsForModule(moduleSymbol));
|
|
}
|
|
function extendExportSymbols(target, source, lookupTable, exportNode) {
|
|
for (var id in source) {
|
|
if (id !== "default" && !ts.hasProperty(target, id)) {
|
|
target[id] = source[id];
|
|
if (lookupTable && exportNode) {
|
|
lookupTable[id] = {
|
|
specifierText: ts.getTextOfNode(exportNode.moduleSpecifier)
|
|
};
|
|
}
|
|
}
|
|
else if (lookupTable && exportNode && id !== "default" && ts.hasProperty(target, id) && resolveSymbol(target[id]) !== resolveSymbol(source[id])) {
|
|
if (!lookupTable[id].exportsWithDuplicate) {
|
|
lookupTable[id].exportsWithDuplicate = [exportNode];
|
|
}
|
|
else {
|
|
lookupTable[id].exportsWithDuplicate.push(exportNode);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getExportsForModule(moduleSymbol) {
|
|
var visitedSymbols = [];
|
|
return visit(moduleSymbol) || moduleSymbol.exports;
|
|
function visit(symbol) {
|
|
if (!(symbol && symbol.flags & 1952 && !ts.contains(visitedSymbols, symbol))) {
|
|
return;
|
|
}
|
|
visitedSymbols.push(symbol);
|
|
var symbols = cloneSymbolTable(symbol.exports);
|
|
var exportStars = symbol.exports["__export"];
|
|
if (exportStars) {
|
|
var nestedSymbols = {};
|
|
var lookupTable = {};
|
|
for (var _i = 0, _a = exportStars.declarations; _i < _a.length; _i++) {
|
|
var node = _a[_i];
|
|
var resolvedModule = resolveExternalModuleName(node, node.moduleSpecifier);
|
|
var exportedSymbols = visit(resolvedModule);
|
|
extendExportSymbols(nestedSymbols, exportedSymbols, lookupTable, node);
|
|
}
|
|
for (var id in lookupTable) {
|
|
var exportsWithDuplicate = lookupTable[id].exportsWithDuplicate;
|
|
if (id === "export=" || !(exportsWithDuplicate && exportsWithDuplicate.length) || ts.hasProperty(symbols, id)) {
|
|
continue;
|
|
}
|
|
for (var _b = 0, exportsWithDuplicate_1 = exportsWithDuplicate; _b < exportsWithDuplicate_1.length; _b++) {
|
|
var node = exportsWithDuplicate_1[_b];
|
|
diagnostics.add(ts.createDiagnosticForNode(node, ts.Diagnostics.Module_0_has_already_exported_a_member_named_1_Consider_explicitly_re_exporting_to_resolve_the_ambiguity, lookupTable[id].specifierText, id));
|
|
}
|
|
}
|
|
extendExportSymbols(symbols, nestedSymbols);
|
|
}
|
|
return symbols;
|
|
}
|
|
}
|
|
function getMergedSymbol(symbol) {
|
|
var merged;
|
|
return symbol && symbol.mergeId && (merged = mergedSymbols[symbol.mergeId]) ? merged : symbol;
|
|
}
|
|
function getSymbolOfNode(node) {
|
|
return getMergedSymbol(node.symbol);
|
|
}
|
|
function getParentOfSymbol(symbol) {
|
|
return getMergedSymbol(symbol.parent);
|
|
}
|
|
function getExportSymbolOfValueSymbolIfExported(symbol) {
|
|
return symbol && (symbol.flags & 1048576) !== 0
|
|
? getMergedSymbol(symbol.exportSymbol)
|
|
: symbol;
|
|
}
|
|
function symbolIsValue(symbol) {
|
|
if (symbol.flags & 16777216) {
|
|
return symbolIsValue(getSymbolLinks(symbol).target);
|
|
}
|
|
if (symbol.flags & 107455) {
|
|
return true;
|
|
}
|
|
if (symbol.flags & 8388608) {
|
|
return (resolveAlias(symbol).flags & 107455) !== 0;
|
|
}
|
|
return false;
|
|
}
|
|
function findConstructorDeclaration(node) {
|
|
var members = node.members;
|
|
for (var _i = 0, members_1 = members; _i < members_1.length; _i++) {
|
|
var member = members_1[_i];
|
|
if (member.kind === 148 && ts.nodeIsPresent(member.body)) {
|
|
return member;
|
|
}
|
|
}
|
|
}
|
|
function createType(flags) {
|
|
var result = new Type(checker, flags);
|
|
result.id = typeCount;
|
|
typeCount++;
|
|
return result;
|
|
}
|
|
function createIntrinsicType(kind, intrinsicName) {
|
|
var type = createType(kind);
|
|
type.intrinsicName = intrinsicName;
|
|
return type;
|
|
}
|
|
function createObjectType(kind, symbol) {
|
|
var type = createType(kind);
|
|
type.symbol = symbol;
|
|
return type;
|
|
}
|
|
function isReservedMemberName(name) {
|
|
return name.charCodeAt(0) === 95 &&
|
|
name.charCodeAt(1) === 95 &&
|
|
name.charCodeAt(2) !== 95 &&
|
|
name.charCodeAt(2) !== 64;
|
|
}
|
|
function getNamedMembers(members) {
|
|
var result;
|
|
for (var id in members) {
|
|
if (ts.hasProperty(members, id)) {
|
|
if (!isReservedMemberName(id)) {
|
|
if (!result)
|
|
result = [];
|
|
var symbol = members[id];
|
|
if (symbolIsValue(symbol)) {
|
|
result.push(symbol);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result || emptyArray;
|
|
}
|
|
function setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo) {
|
|
type.members = members;
|
|
type.properties = getNamedMembers(members);
|
|
type.callSignatures = callSignatures;
|
|
type.constructSignatures = constructSignatures;
|
|
if (stringIndexInfo)
|
|
type.stringIndexInfo = stringIndexInfo;
|
|
if (numberIndexInfo)
|
|
type.numberIndexInfo = numberIndexInfo;
|
|
return type;
|
|
}
|
|
function createAnonymousType(symbol, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo) {
|
|
return setObjectTypeMembers(createObjectType(65536, symbol), members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
function forEachSymbolTableInScope(enclosingDeclaration, callback) {
|
|
var result;
|
|
for (var location_1 = enclosingDeclaration; location_1; location_1 = location_1.parent) {
|
|
if (location_1.locals && !isGlobalSourceFile(location_1)) {
|
|
if (result = callback(location_1.locals)) {
|
|
return result;
|
|
}
|
|
}
|
|
switch (location_1.kind) {
|
|
case 256:
|
|
if (!ts.isExternalOrCommonJsModule(location_1)) {
|
|
break;
|
|
}
|
|
case 225:
|
|
if (result = callback(getSymbolOfNode(location_1).exports)) {
|
|
return result;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return callback(globals);
|
|
}
|
|
function getQualifiedLeftMeaning(rightMeaning) {
|
|
return rightMeaning === 107455 ? 107455 : 1536;
|
|
}
|
|
function getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, useOnlyExternalAliasing) {
|
|
function getAccessibleSymbolChainFromSymbolTable(symbols) {
|
|
function canQualifySymbol(symbolFromSymbolTable, meaning) {
|
|
if (!needsQualification(symbolFromSymbolTable, enclosingDeclaration, meaning)) {
|
|
return true;
|
|
}
|
|
var accessibleParent = getAccessibleSymbolChain(symbolFromSymbolTable.parent, enclosingDeclaration, getQualifiedLeftMeaning(meaning), useOnlyExternalAliasing);
|
|
return !!accessibleParent;
|
|
}
|
|
function isAccessible(symbolFromSymbolTable, resolvedAliasSymbol) {
|
|
if (symbol === (resolvedAliasSymbol || symbolFromSymbolTable)) {
|
|
return !ts.forEach(symbolFromSymbolTable.declarations, hasExternalModuleSymbol) &&
|
|
canQualifySymbol(symbolFromSymbolTable, meaning);
|
|
}
|
|
}
|
|
if (isAccessible(ts.lookUp(symbols, symbol.name))) {
|
|
return [symbol];
|
|
}
|
|
return ts.forEachValue(symbols, function (symbolFromSymbolTable) {
|
|
if (symbolFromSymbolTable.flags & 8388608
|
|
&& symbolFromSymbolTable.name !== "export="
|
|
&& !ts.getDeclarationOfKind(symbolFromSymbolTable, 238)) {
|
|
if (!useOnlyExternalAliasing ||
|
|
ts.forEach(symbolFromSymbolTable.declarations, ts.isExternalModuleImportEqualsDeclaration)) {
|
|
var resolvedImportedSymbol = resolveAlias(symbolFromSymbolTable);
|
|
if (isAccessible(symbolFromSymbolTable, resolveAlias(symbolFromSymbolTable))) {
|
|
return [symbolFromSymbolTable];
|
|
}
|
|
var accessibleSymbolsFromExports = resolvedImportedSymbol.exports ? getAccessibleSymbolChainFromSymbolTable(resolvedImportedSymbol.exports) : undefined;
|
|
if (accessibleSymbolsFromExports && canQualifySymbol(symbolFromSymbolTable, getQualifiedLeftMeaning(meaning))) {
|
|
return [symbolFromSymbolTable].concat(accessibleSymbolsFromExports);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
if (symbol) {
|
|
if (!(isPropertyOrMethodDeclarationSymbol(symbol))) {
|
|
return forEachSymbolTableInScope(enclosingDeclaration, getAccessibleSymbolChainFromSymbolTable);
|
|
}
|
|
}
|
|
}
|
|
function needsQualification(symbol, enclosingDeclaration, meaning) {
|
|
var qualify = false;
|
|
forEachSymbolTableInScope(enclosingDeclaration, function (symbolTable) {
|
|
if (!ts.hasProperty(symbolTable, symbol.name)) {
|
|
return false;
|
|
}
|
|
var symbolFromSymbolTable = symbolTable[symbol.name];
|
|
if (symbolFromSymbolTable === symbol) {
|
|
return true;
|
|
}
|
|
symbolFromSymbolTable = (symbolFromSymbolTable.flags & 8388608 && !ts.getDeclarationOfKind(symbolFromSymbolTable, 238)) ? resolveAlias(symbolFromSymbolTable) : symbolFromSymbolTable;
|
|
if (symbolFromSymbolTable.flags & meaning) {
|
|
qualify = true;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
return qualify;
|
|
}
|
|
function isPropertyOrMethodDeclarationSymbol(symbol) {
|
|
if (symbol.declarations && symbol.declarations.length) {
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var declaration = _a[_i];
|
|
switch (declaration.kind) {
|
|
case 145:
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
continue;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isSymbolAccessible(symbol, enclosingDeclaration, meaning) {
|
|
if (symbol && enclosingDeclaration && !(symbol.flags & 262144)) {
|
|
var initialSymbol = symbol;
|
|
var meaningToLook = meaning;
|
|
while (symbol) {
|
|
var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaningToLook, false);
|
|
if (accessibleSymbolChain) {
|
|
var hasAccessibleDeclarations = hasVisibleDeclarations(accessibleSymbolChain[0]);
|
|
if (!hasAccessibleDeclarations) {
|
|
return {
|
|
accessibility: 1,
|
|
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
|
|
errorModuleName: symbol !== initialSymbol ? symbolToString(symbol, enclosingDeclaration, 1536) : undefined
|
|
};
|
|
}
|
|
return hasAccessibleDeclarations;
|
|
}
|
|
meaningToLook = getQualifiedLeftMeaning(meaning);
|
|
symbol = getParentOfSymbol(symbol);
|
|
}
|
|
var symbolExternalModule = ts.forEach(initialSymbol.declarations, getExternalModuleContainer);
|
|
if (symbolExternalModule) {
|
|
var enclosingExternalModule = getExternalModuleContainer(enclosingDeclaration);
|
|
if (symbolExternalModule !== enclosingExternalModule) {
|
|
return {
|
|
accessibility: 2,
|
|
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning),
|
|
errorModuleName: symbolToString(symbolExternalModule)
|
|
};
|
|
}
|
|
}
|
|
return {
|
|
accessibility: 1,
|
|
errorSymbolName: symbolToString(initialSymbol, enclosingDeclaration, meaning)
|
|
};
|
|
}
|
|
return { accessibility: 0 };
|
|
function getExternalModuleContainer(declaration) {
|
|
for (; declaration; declaration = declaration.parent) {
|
|
if (hasExternalModuleSymbol(declaration)) {
|
|
return getSymbolOfNode(declaration);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function hasExternalModuleSymbol(declaration) {
|
|
return ts.isAmbientModule(declaration) || (declaration.kind === 256 && ts.isExternalOrCommonJsModule(declaration));
|
|
}
|
|
function hasVisibleDeclarations(symbol) {
|
|
var aliasesToMakeVisible;
|
|
if (ts.forEach(symbol.declarations, function (declaration) { return !getIsDeclarationVisible(declaration); })) {
|
|
return undefined;
|
|
}
|
|
return { accessibility: 0, aliasesToMakeVisible: aliasesToMakeVisible };
|
|
function getIsDeclarationVisible(declaration) {
|
|
if (!isDeclarationVisible(declaration)) {
|
|
var anyImportSyntax = getAnyImportSyntax(declaration);
|
|
if (anyImportSyntax &&
|
|
!(anyImportSyntax.flags & 1) &&
|
|
isDeclarationVisible(anyImportSyntax.parent)) {
|
|
getNodeLinks(declaration).isVisible = true;
|
|
if (aliasesToMakeVisible) {
|
|
if (!ts.contains(aliasesToMakeVisible, anyImportSyntax)) {
|
|
aliasesToMakeVisible.push(anyImportSyntax);
|
|
}
|
|
}
|
|
else {
|
|
aliasesToMakeVisible = [anyImportSyntax];
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
function isEntityNameVisible(entityName, enclosingDeclaration) {
|
|
var meaning;
|
|
if (entityName.parent.kind === 158 || ts.isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent)) {
|
|
meaning = 107455 | 1048576;
|
|
}
|
|
else if (entityName.kind === 139 || entityName.kind === 172 ||
|
|
entityName.parent.kind === 229) {
|
|
meaning = 1536;
|
|
}
|
|
else {
|
|
meaning = 793056;
|
|
}
|
|
var firstIdentifier = getFirstIdentifier(entityName);
|
|
var symbol = resolveName(enclosingDeclaration, firstIdentifier.text, meaning, undefined, undefined);
|
|
return (symbol && hasVisibleDeclarations(symbol)) || {
|
|
accessibility: 1,
|
|
errorSymbolName: ts.getTextOfNode(firstIdentifier),
|
|
errorNode: firstIdentifier
|
|
};
|
|
}
|
|
function writeKeyword(writer, kind) {
|
|
writer.writeKeyword(ts.tokenToString(kind));
|
|
}
|
|
function writePunctuation(writer, kind) {
|
|
writer.writePunctuation(ts.tokenToString(kind));
|
|
}
|
|
function writeSpace(writer) {
|
|
writer.writeSpace(" ");
|
|
}
|
|
function symbolToString(symbol, enclosingDeclaration, meaning) {
|
|
var writer = ts.getSingleLineStringWriter();
|
|
getSymbolDisplayBuilder().buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning);
|
|
var result = writer.string();
|
|
ts.releaseStringWriter(writer);
|
|
return result;
|
|
}
|
|
function signatureToString(signature, enclosingDeclaration, flags, kind) {
|
|
var writer = ts.getSingleLineStringWriter();
|
|
getSymbolDisplayBuilder().buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, kind);
|
|
var result = writer.string();
|
|
ts.releaseStringWriter(writer);
|
|
return result;
|
|
}
|
|
function typeToString(type, enclosingDeclaration, flags) {
|
|
var writer = ts.getSingleLineStringWriter();
|
|
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
|
|
var result = writer.string();
|
|
ts.releaseStringWriter(writer);
|
|
var maxLength = compilerOptions.noErrorTruncation || flags & 4 ? undefined : 100;
|
|
if (maxLength && result.length >= maxLength) {
|
|
result = result.substr(0, maxLength - "...".length) + "...";
|
|
}
|
|
return result;
|
|
}
|
|
function typePredicateToString(typePredicate, enclosingDeclaration, flags) {
|
|
var writer = ts.getSingleLineStringWriter();
|
|
getSymbolDisplayBuilder().buildTypePredicateDisplay(typePredicate, writer, enclosingDeclaration, flags);
|
|
var result = writer.string();
|
|
ts.releaseStringWriter(writer);
|
|
return result;
|
|
}
|
|
function visibilityToString(flags) {
|
|
if (flags === 8) {
|
|
return "private";
|
|
}
|
|
if (flags === 16) {
|
|
return "protected";
|
|
}
|
|
return "public";
|
|
}
|
|
function getTypeAliasForTypeLiteral(type) {
|
|
if (type.symbol && type.symbol.flags & 2048) {
|
|
var node = type.symbol.declarations[0].parent;
|
|
while (node.kind === 164) {
|
|
node = node.parent;
|
|
}
|
|
if (node.kind === 223) {
|
|
return getSymbolOfNode(node);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function isTopLevelInExternalModuleAugmentation(node) {
|
|
return node && node.parent &&
|
|
node.parent.kind === 226 &&
|
|
ts.isExternalModuleAugmentation(node.parent.parent);
|
|
}
|
|
function getSymbolDisplayBuilder() {
|
|
function getNameOfSymbol(symbol) {
|
|
if (symbol.declarations && symbol.declarations.length) {
|
|
var declaration = symbol.declarations[0];
|
|
if (declaration.name) {
|
|
return ts.declarationNameToString(declaration.name);
|
|
}
|
|
switch (declaration.kind) {
|
|
case 192:
|
|
return "(Anonymous class)";
|
|
case 179:
|
|
case 180:
|
|
return "(Anonymous function)";
|
|
}
|
|
}
|
|
return symbol.name;
|
|
}
|
|
function appendSymbolNameOnly(symbol, writer) {
|
|
writer.writeSymbol(getNameOfSymbol(symbol), symbol);
|
|
}
|
|
function appendPropertyOrElementAccessForSymbol(symbol, writer) {
|
|
var symbolName = getNameOfSymbol(symbol);
|
|
var firstChar = symbolName.charCodeAt(0);
|
|
var needsElementAccess = !ts.isIdentifierStart(firstChar, languageVersion);
|
|
if (needsElementAccess) {
|
|
writePunctuation(writer, 19);
|
|
if (ts.isSingleOrDoubleQuote(firstChar)) {
|
|
writer.writeStringLiteral(symbolName);
|
|
}
|
|
else {
|
|
writer.writeSymbol(symbolName, symbol);
|
|
}
|
|
writePunctuation(writer, 20);
|
|
}
|
|
else {
|
|
writePunctuation(writer, 21);
|
|
writer.writeSymbol(symbolName, symbol);
|
|
}
|
|
}
|
|
function buildSymbolDisplay(symbol, writer, enclosingDeclaration, meaning, flags, typeFlags) {
|
|
var parentSymbol;
|
|
function appendParentTypeArgumentsAndSymbolName(symbol) {
|
|
if (parentSymbol) {
|
|
if (flags & 1) {
|
|
if (symbol.flags & 16777216) {
|
|
buildDisplayForTypeArgumentsAndDelimiters(getTypeParametersOfClassOrInterface(parentSymbol), symbol.mapper, writer, enclosingDeclaration);
|
|
}
|
|
else {
|
|
buildTypeParameterDisplayFromSymbol(parentSymbol, writer, enclosingDeclaration);
|
|
}
|
|
}
|
|
appendPropertyOrElementAccessForSymbol(symbol, writer);
|
|
}
|
|
else {
|
|
appendSymbolNameOnly(symbol, writer);
|
|
}
|
|
parentSymbol = symbol;
|
|
}
|
|
writer.trackSymbol(symbol, enclosingDeclaration, meaning);
|
|
function walkSymbol(symbol, meaning) {
|
|
if (symbol) {
|
|
var accessibleSymbolChain = getAccessibleSymbolChain(symbol, enclosingDeclaration, meaning, !!(flags & 2));
|
|
if (!accessibleSymbolChain ||
|
|
needsQualification(accessibleSymbolChain[0], enclosingDeclaration, accessibleSymbolChain.length === 1 ? meaning : getQualifiedLeftMeaning(meaning))) {
|
|
walkSymbol(getParentOfSymbol(accessibleSymbolChain ? accessibleSymbolChain[0] : symbol), getQualifiedLeftMeaning(meaning));
|
|
}
|
|
if (accessibleSymbolChain) {
|
|
for (var _i = 0, accessibleSymbolChain_1 = accessibleSymbolChain; _i < accessibleSymbolChain_1.length; _i++) {
|
|
var accessibleSymbol = accessibleSymbolChain_1[_i];
|
|
appendParentTypeArgumentsAndSymbolName(accessibleSymbol);
|
|
}
|
|
}
|
|
else {
|
|
if (!parentSymbol && ts.forEach(symbol.declarations, hasExternalModuleSymbol)) {
|
|
return;
|
|
}
|
|
if (symbol.flags & 2048 || symbol.flags & 4096) {
|
|
return;
|
|
}
|
|
appendParentTypeArgumentsAndSymbolName(symbol);
|
|
}
|
|
}
|
|
}
|
|
var isTypeParameter = symbol.flags & 262144;
|
|
var typeFormatFlag = 128 & typeFlags;
|
|
if (!isTypeParameter && (enclosingDeclaration || typeFormatFlag)) {
|
|
walkSymbol(symbol, meaning);
|
|
return;
|
|
}
|
|
return appendParentTypeArgumentsAndSymbolName(symbol);
|
|
}
|
|
function buildTypeDisplay(type, writer, enclosingDeclaration, globalFlags, symbolStack) {
|
|
var globalFlagsToPass = globalFlags & 16;
|
|
var inObjectTypeLiteral = false;
|
|
return writeType(type, globalFlags);
|
|
function writeType(type, flags) {
|
|
if (type.flags & 150995071) {
|
|
writer.writeKeyword(!(globalFlags & 16) && isTypeAny(type)
|
|
? "any"
|
|
: type.intrinsicName);
|
|
}
|
|
else if (type.flags & 33554432) {
|
|
if (inObjectTypeLiteral) {
|
|
writer.reportInaccessibleThisError();
|
|
}
|
|
writer.writeKeyword("this");
|
|
}
|
|
else if (type.flags & 4096) {
|
|
writeTypeReference(type, flags);
|
|
}
|
|
else if (type.flags & (1024 | 2048 | 128 | 512)) {
|
|
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 793056, 0, flags);
|
|
}
|
|
else if (type.flags & 8192) {
|
|
writeTupleType(type);
|
|
}
|
|
else if (type.flags & 49152) {
|
|
writeUnionOrIntersectionType(type, flags);
|
|
}
|
|
else if (type.flags & 65536) {
|
|
writeAnonymousType(type, flags);
|
|
}
|
|
else if (type.flags & 256) {
|
|
writer.writeStringLiteral("\"" + ts.escapeString(type.text) + "\"");
|
|
}
|
|
else {
|
|
writePunctuation(writer, 15);
|
|
writeSpace(writer);
|
|
writePunctuation(writer, 22);
|
|
writeSpace(writer);
|
|
writePunctuation(writer, 16);
|
|
}
|
|
}
|
|
function writeTypeList(types, delimiter) {
|
|
for (var i = 0; i < types.length; i++) {
|
|
if (i > 0) {
|
|
if (delimiter !== 24) {
|
|
writeSpace(writer);
|
|
}
|
|
writePunctuation(writer, delimiter);
|
|
writeSpace(writer);
|
|
}
|
|
writeType(types[i], delimiter === 24 ? 0 : 64);
|
|
}
|
|
}
|
|
function writeSymbolTypeReference(symbol, typeArguments, pos, end, flags) {
|
|
if (symbol.flags & 32 || !isReservedMemberName(symbol.name)) {
|
|
buildSymbolDisplay(symbol, writer, enclosingDeclaration, 793056, 0, flags);
|
|
}
|
|
if (pos < end) {
|
|
writePunctuation(writer, 25);
|
|
writeType(typeArguments[pos], 256);
|
|
pos++;
|
|
while (pos < end) {
|
|
writePunctuation(writer, 24);
|
|
writeSpace(writer);
|
|
writeType(typeArguments[pos], 0);
|
|
pos++;
|
|
}
|
|
writePunctuation(writer, 27);
|
|
}
|
|
}
|
|
function writeTypeReference(type, flags) {
|
|
var typeArguments = type.typeArguments || emptyArray;
|
|
if (type.target === globalArrayType && !(flags & 1)) {
|
|
writeType(typeArguments[0], 64);
|
|
writePunctuation(writer, 19);
|
|
writePunctuation(writer, 20);
|
|
}
|
|
else {
|
|
var outerTypeParameters = type.target.outerTypeParameters;
|
|
var i = 0;
|
|
if (outerTypeParameters) {
|
|
var length_1 = outerTypeParameters.length;
|
|
while (i < length_1) {
|
|
var start = i;
|
|
var parent_7 = getParentSymbolOfTypeParameter(outerTypeParameters[i]);
|
|
do {
|
|
i++;
|
|
} while (i < length_1 && getParentSymbolOfTypeParameter(outerTypeParameters[i]) === parent_7);
|
|
if (!ts.rangeEquals(outerTypeParameters, typeArguments, start, i)) {
|
|
writeSymbolTypeReference(parent_7, typeArguments, start, i, flags);
|
|
writePunctuation(writer, 21);
|
|
}
|
|
}
|
|
}
|
|
var typeParameterCount = (type.target.typeParameters || emptyArray).length;
|
|
writeSymbolTypeReference(type.symbol, typeArguments, i, typeParameterCount, flags);
|
|
}
|
|
}
|
|
function writeTupleType(type) {
|
|
writePunctuation(writer, 19);
|
|
writeTypeList(type.elementTypes, 24);
|
|
writePunctuation(writer, 20);
|
|
}
|
|
function writeUnionOrIntersectionType(type, flags) {
|
|
if (flags & 64) {
|
|
writePunctuation(writer, 17);
|
|
}
|
|
writeTypeList(type.types, type.flags & 16384 ? 47 : 46);
|
|
if (flags & 64) {
|
|
writePunctuation(writer, 18);
|
|
}
|
|
}
|
|
function writeAnonymousType(type, flags) {
|
|
var symbol = type.symbol;
|
|
if (symbol) {
|
|
if (symbol.flags & (32 | 384 | 512)) {
|
|
writeTypeOfSymbol(type, flags);
|
|
}
|
|
else if (shouldWriteTypeOfFunctionSymbol()) {
|
|
writeTypeOfSymbol(type, flags);
|
|
}
|
|
else if (ts.contains(symbolStack, symbol)) {
|
|
var typeAlias = getTypeAliasForTypeLiteral(type);
|
|
if (typeAlias) {
|
|
buildSymbolDisplay(typeAlias, writer, enclosingDeclaration, 793056, 0, flags);
|
|
}
|
|
else {
|
|
writeKeyword(writer, 117);
|
|
}
|
|
}
|
|
else {
|
|
if (!symbolStack) {
|
|
symbolStack = [];
|
|
}
|
|
symbolStack.push(symbol);
|
|
writeLiteralType(type, flags);
|
|
symbolStack.pop();
|
|
}
|
|
}
|
|
else {
|
|
writeLiteralType(type, flags);
|
|
}
|
|
function shouldWriteTypeOfFunctionSymbol() {
|
|
var isStaticMethodSymbol = !!(symbol.flags & 8192 &&
|
|
ts.forEach(symbol.declarations, function (declaration) { return declaration.flags & 32; }));
|
|
var isNonLocalFunctionSymbol = !!(symbol.flags & 16) &&
|
|
(symbol.parent ||
|
|
ts.forEach(symbol.declarations, function (declaration) {
|
|
return declaration.parent.kind === 256 || declaration.parent.kind === 226;
|
|
}));
|
|
if (isStaticMethodSymbol || isNonLocalFunctionSymbol) {
|
|
return !!(flags & 2) ||
|
|
(ts.contains(symbolStack, symbol));
|
|
}
|
|
}
|
|
}
|
|
function writeTypeOfSymbol(type, typeFormatFlags) {
|
|
writeKeyword(writer, 101);
|
|
writeSpace(writer);
|
|
buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, 107455, 0, typeFormatFlags);
|
|
}
|
|
function writeIndexSignature(info, keyword) {
|
|
if (info) {
|
|
if (info.isReadonly) {
|
|
writeKeyword(writer, 128);
|
|
writeSpace(writer);
|
|
}
|
|
writePunctuation(writer, 19);
|
|
writer.writeParameter(info.declaration ? ts.declarationNameToString(info.declaration.parameters[0].name) : "x");
|
|
writePunctuation(writer, 54);
|
|
writeSpace(writer);
|
|
writeKeyword(writer, keyword);
|
|
writePunctuation(writer, 20);
|
|
writePunctuation(writer, 54);
|
|
writeSpace(writer);
|
|
writeType(info.type, 0);
|
|
writePunctuation(writer, 23);
|
|
writer.writeLine();
|
|
}
|
|
}
|
|
function writePropertyWithModifiers(prop) {
|
|
if (isReadonlySymbol(prop)) {
|
|
writeKeyword(writer, 128);
|
|
writeSpace(writer);
|
|
}
|
|
buildSymbolDisplay(prop, writer);
|
|
if (prop.flags & 536870912) {
|
|
writePunctuation(writer, 53);
|
|
}
|
|
}
|
|
function shouldAddParenthesisAroundFunctionType(callSignature, flags) {
|
|
if (flags & 64) {
|
|
return true;
|
|
}
|
|
else if (flags & 256) {
|
|
var typeParameters = callSignature.target && (flags & 32) ?
|
|
callSignature.target.typeParameters : callSignature.typeParameters;
|
|
return typeParameters && typeParameters.length !== 0;
|
|
}
|
|
return false;
|
|
}
|
|
function writeLiteralType(type, flags) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if (!resolved.properties.length && !resolved.stringIndexInfo && !resolved.numberIndexInfo) {
|
|
if (!resolved.callSignatures.length && !resolved.constructSignatures.length) {
|
|
writePunctuation(writer, 15);
|
|
writePunctuation(writer, 16);
|
|
return;
|
|
}
|
|
if (resolved.callSignatures.length === 1 && !resolved.constructSignatures.length) {
|
|
var parenthesizeSignature = shouldAddParenthesisAroundFunctionType(resolved.callSignatures[0], flags);
|
|
if (parenthesizeSignature) {
|
|
writePunctuation(writer, 17);
|
|
}
|
|
buildSignatureDisplay(resolved.callSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, undefined, symbolStack);
|
|
if (parenthesizeSignature) {
|
|
writePunctuation(writer, 18);
|
|
}
|
|
return;
|
|
}
|
|
if (resolved.constructSignatures.length === 1 && !resolved.callSignatures.length) {
|
|
if (flags & 64) {
|
|
writePunctuation(writer, 17);
|
|
}
|
|
writeKeyword(writer, 92);
|
|
writeSpace(writer);
|
|
buildSignatureDisplay(resolved.constructSignatures[0], writer, enclosingDeclaration, globalFlagsToPass | 8, undefined, symbolStack);
|
|
if (flags & 64) {
|
|
writePunctuation(writer, 18);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
var saveInObjectTypeLiteral = inObjectTypeLiteral;
|
|
inObjectTypeLiteral = true;
|
|
writePunctuation(writer, 15);
|
|
writer.writeLine();
|
|
writer.increaseIndent();
|
|
for (var _i = 0, _a = resolved.callSignatures; _i < _a.length; _i++) {
|
|
var signature = _a[_i];
|
|
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, undefined, symbolStack);
|
|
writePunctuation(writer, 23);
|
|
writer.writeLine();
|
|
}
|
|
for (var _b = 0, _c = resolved.constructSignatures; _b < _c.length; _b++) {
|
|
var signature = _c[_b];
|
|
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, 1, symbolStack);
|
|
writePunctuation(writer, 23);
|
|
writer.writeLine();
|
|
}
|
|
writeIndexSignature(resolved.stringIndexInfo, 132);
|
|
writeIndexSignature(resolved.numberIndexInfo, 130);
|
|
for (var _d = 0, _e = resolved.properties; _d < _e.length; _d++) {
|
|
var p = _e[_d];
|
|
var t = getTypeOfSymbol(p);
|
|
if (p.flags & (16 | 8192) && !getPropertiesOfObjectType(t).length) {
|
|
var signatures = getSignaturesOfType(t, 0);
|
|
for (var _f = 0, signatures_1 = signatures; _f < signatures_1.length; _f++) {
|
|
var signature = signatures_1[_f];
|
|
writePropertyWithModifiers(p);
|
|
buildSignatureDisplay(signature, writer, enclosingDeclaration, globalFlagsToPass, undefined, symbolStack);
|
|
writePunctuation(writer, 23);
|
|
writer.writeLine();
|
|
}
|
|
}
|
|
else {
|
|
writePropertyWithModifiers(p);
|
|
writePunctuation(writer, 54);
|
|
writeSpace(writer);
|
|
writeType(t, 0);
|
|
writePunctuation(writer, 23);
|
|
writer.writeLine();
|
|
}
|
|
}
|
|
writer.decreaseIndent();
|
|
writePunctuation(writer, 16);
|
|
inObjectTypeLiteral = saveInObjectTypeLiteral;
|
|
}
|
|
}
|
|
function buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaration, flags) {
|
|
var targetSymbol = getTargetSymbol(symbol);
|
|
if (targetSymbol.flags & 32 || targetSymbol.flags & 64 || targetSymbol.flags & 524288) {
|
|
buildDisplayForTypeParametersAndDelimiters(getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol), writer, enclosingDeclaration, flags);
|
|
}
|
|
}
|
|
function buildTypeParameterDisplay(tp, writer, enclosingDeclaration, flags, symbolStack) {
|
|
appendSymbolNameOnly(tp.symbol, writer);
|
|
var constraint = getConstraintOfTypeParameter(tp);
|
|
if (constraint) {
|
|
writeSpace(writer);
|
|
writeKeyword(writer, 83);
|
|
writeSpace(writer);
|
|
buildTypeDisplay(constraint, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
}
|
|
function buildParameterDisplay(p, writer, enclosingDeclaration, flags, symbolStack) {
|
|
var parameterNode = p.valueDeclaration;
|
|
if (ts.isRestParameter(parameterNode)) {
|
|
writePunctuation(writer, 22);
|
|
}
|
|
if (ts.isBindingPattern(parameterNode.name)) {
|
|
buildBindingPatternDisplay(parameterNode.name, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
else {
|
|
appendSymbolNameOnly(p, writer);
|
|
}
|
|
if (isOptionalParameter(parameterNode)) {
|
|
writePunctuation(writer, 53);
|
|
}
|
|
writePunctuation(writer, 54);
|
|
writeSpace(writer);
|
|
buildTypeDisplay(getTypeOfSymbol(p), writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
function buildBindingPatternDisplay(bindingPattern, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (bindingPattern.kind === 167) {
|
|
writePunctuation(writer, 15);
|
|
buildDisplayForCommaSeparatedList(bindingPattern.elements, writer, function (e) { return buildBindingElementDisplay(e, writer, enclosingDeclaration, flags, symbolStack); });
|
|
writePunctuation(writer, 16);
|
|
}
|
|
else if (bindingPattern.kind === 168) {
|
|
writePunctuation(writer, 19);
|
|
var elements = bindingPattern.elements;
|
|
buildDisplayForCommaSeparatedList(elements, writer, function (e) { return buildBindingElementDisplay(e, writer, enclosingDeclaration, flags, symbolStack); });
|
|
if (elements && elements.hasTrailingComma) {
|
|
writePunctuation(writer, 24);
|
|
}
|
|
writePunctuation(writer, 20);
|
|
}
|
|
}
|
|
function buildBindingElementDisplay(bindingElement, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (bindingElement.kind === 193) {
|
|
return;
|
|
}
|
|
ts.Debug.assert(bindingElement.kind === 169);
|
|
if (bindingElement.propertyName) {
|
|
writer.writeSymbol(ts.getTextOfNode(bindingElement.propertyName), bindingElement.symbol);
|
|
writePunctuation(writer, 54);
|
|
writeSpace(writer);
|
|
}
|
|
if (ts.isBindingPattern(bindingElement.name)) {
|
|
buildBindingPatternDisplay(bindingElement.name, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
else {
|
|
if (bindingElement.dotDotDotToken) {
|
|
writePunctuation(writer, 22);
|
|
}
|
|
appendSymbolNameOnly(bindingElement.symbol, writer);
|
|
}
|
|
}
|
|
function buildDisplayForTypeParametersAndDelimiters(typeParameters, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (typeParameters && typeParameters.length) {
|
|
writePunctuation(writer, 25);
|
|
buildDisplayForCommaSeparatedList(typeParameters, writer, function (p) { return buildTypeParameterDisplay(p, writer, enclosingDeclaration, flags, symbolStack); });
|
|
writePunctuation(writer, 27);
|
|
}
|
|
}
|
|
function buildDisplayForCommaSeparatedList(list, writer, action) {
|
|
for (var i = 0; i < list.length; i++) {
|
|
if (i > 0) {
|
|
writePunctuation(writer, 24);
|
|
writeSpace(writer);
|
|
}
|
|
action(list[i]);
|
|
}
|
|
}
|
|
function buildDisplayForTypeArgumentsAndDelimiters(typeParameters, mapper, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (typeParameters && typeParameters.length) {
|
|
writePunctuation(writer, 25);
|
|
var flags_1 = 256;
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
if (i > 0) {
|
|
writePunctuation(writer, 24);
|
|
writeSpace(writer);
|
|
flags_1 = 0;
|
|
}
|
|
buildTypeDisplay(mapper(typeParameters[i]), writer, enclosingDeclaration, flags_1);
|
|
}
|
|
writePunctuation(writer, 27);
|
|
}
|
|
}
|
|
function buildDisplayForParametersAndDelimiters(thisParameter, parameters, writer, enclosingDeclaration, flags, symbolStack) {
|
|
writePunctuation(writer, 17);
|
|
if (thisParameter) {
|
|
buildParameterDisplay(thisParameter, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
for (var i = 0; i < parameters.length; i++) {
|
|
if (i > 0 || thisParameter) {
|
|
writePunctuation(writer, 24);
|
|
writeSpace(writer);
|
|
}
|
|
buildParameterDisplay(parameters[i], writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
writePunctuation(writer, 18);
|
|
}
|
|
function buildTypePredicateDisplay(predicate, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (ts.isIdentifierTypePredicate(predicate)) {
|
|
writer.writeParameter(predicate.parameterName);
|
|
}
|
|
else {
|
|
writeKeyword(writer, 97);
|
|
}
|
|
writeSpace(writer);
|
|
writeKeyword(writer, 124);
|
|
writeSpace(writer);
|
|
buildTypeDisplay(predicate.type, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
function buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, symbolStack) {
|
|
if (flags & 8) {
|
|
writeSpace(writer);
|
|
writePunctuation(writer, 34);
|
|
}
|
|
else {
|
|
writePunctuation(writer, 54);
|
|
}
|
|
writeSpace(writer);
|
|
if (signature.typePredicate) {
|
|
buildTypePredicateDisplay(signature.typePredicate, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
else {
|
|
var returnType = getReturnTypeOfSignature(signature);
|
|
buildTypeDisplay(returnType, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
}
|
|
function buildSignatureDisplay(signature, writer, enclosingDeclaration, flags, kind, symbolStack) {
|
|
if (kind === 1) {
|
|
writeKeyword(writer, 92);
|
|
writeSpace(writer);
|
|
}
|
|
if (signature.target && (flags & 32)) {
|
|
buildDisplayForTypeArgumentsAndDelimiters(signature.target.typeParameters, signature.mapper, writer, enclosingDeclaration);
|
|
}
|
|
else {
|
|
buildDisplayForTypeParametersAndDelimiters(signature.typeParameters, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
buildDisplayForParametersAndDelimiters(signature.thisParameter, signature.parameters, writer, enclosingDeclaration, flags, symbolStack);
|
|
buildReturnTypeDisplay(signature, writer, enclosingDeclaration, flags, symbolStack);
|
|
}
|
|
return _displayBuilder || (_displayBuilder = {
|
|
buildSymbolDisplay: buildSymbolDisplay,
|
|
buildTypeDisplay: buildTypeDisplay,
|
|
buildTypeParameterDisplay: buildTypeParameterDisplay,
|
|
buildTypePredicateDisplay: buildTypePredicateDisplay,
|
|
buildParameterDisplay: buildParameterDisplay,
|
|
buildDisplayForParametersAndDelimiters: buildDisplayForParametersAndDelimiters,
|
|
buildDisplayForTypeParametersAndDelimiters: buildDisplayForTypeParametersAndDelimiters,
|
|
buildTypeParameterDisplayFromSymbol: buildTypeParameterDisplayFromSymbol,
|
|
buildSignatureDisplay: buildSignatureDisplay,
|
|
buildReturnTypeDisplay: buildReturnTypeDisplay
|
|
});
|
|
}
|
|
function isDeclarationVisible(node) {
|
|
if (node) {
|
|
var links = getNodeLinks(node);
|
|
if (links.isVisible === undefined) {
|
|
links.isVisible = !!determineIfDeclarationIsVisible();
|
|
}
|
|
return links.isVisible;
|
|
}
|
|
return false;
|
|
function determineIfDeclarationIsVisible() {
|
|
switch (node.kind) {
|
|
case 169:
|
|
return isDeclarationVisible(node.parent.parent);
|
|
case 218:
|
|
if (ts.isBindingPattern(node.name) &&
|
|
!node.name.elements.length) {
|
|
return false;
|
|
}
|
|
case 225:
|
|
case 221:
|
|
case 222:
|
|
case 223:
|
|
case 220:
|
|
case 224:
|
|
case 229:
|
|
if (ts.isExternalModuleAugmentation(node)) {
|
|
return true;
|
|
}
|
|
var parent_8 = getDeclarationContainer(node);
|
|
if (!(ts.getCombinedNodeFlags(node) & 1) &&
|
|
!(node.kind !== 229 && parent_8.kind !== 256 && ts.isInAmbientContext(parent_8))) {
|
|
return isGlobalSourceFile(parent_8);
|
|
}
|
|
return isDeclarationVisible(parent_8);
|
|
case 145:
|
|
case 144:
|
|
case 149:
|
|
case 150:
|
|
case 147:
|
|
case 146:
|
|
if (node.flags & (8 | 16)) {
|
|
return false;
|
|
}
|
|
case 148:
|
|
case 152:
|
|
case 151:
|
|
case 153:
|
|
case 142:
|
|
case 226:
|
|
case 156:
|
|
case 157:
|
|
case 159:
|
|
case 155:
|
|
case 160:
|
|
case 161:
|
|
case 162:
|
|
case 163:
|
|
case 164:
|
|
return isDeclarationVisible(node.parent);
|
|
case 231:
|
|
case 232:
|
|
case 234:
|
|
return false;
|
|
case 141:
|
|
case 256:
|
|
return true;
|
|
case 235:
|
|
return false;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
function collectLinkedAliases(node) {
|
|
var exportSymbol;
|
|
if (node.parent && node.parent.kind === 235) {
|
|
exportSymbol = resolveName(node.parent, node.text, 107455 | 793056 | 1536 | 8388608, ts.Diagnostics.Cannot_find_name_0, node);
|
|
}
|
|
else if (node.parent.kind === 238) {
|
|
var exportSpecifier = node.parent;
|
|
exportSymbol = exportSpecifier.parent.parent.moduleSpecifier ?
|
|
getExternalModuleMember(exportSpecifier.parent.parent, exportSpecifier) :
|
|
resolveEntityName(exportSpecifier.propertyName || exportSpecifier.name, 107455 | 793056 | 1536 | 8388608);
|
|
}
|
|
var result = [];
|
|
if (exportSymbol) {
|
|
buildVisibleNodeList(exportSymbol.declarations);
|
|
}
|
|
return result;
|
|
function buildVisibleNodeList(declarations) {
|
|
ts.forEach(declarations, function (declaration) {
|
|
getNodeLinks(declaration).isVisible = true;
|
|
var resultNode = getAnyImportSyntax(declaration) || declaration;
|
|
if (!ts.contains(result, resultNode)) {
|
|
result.push(resultNode);
|
|
}
|
|
if (ts.isInternalModuleImportEqualsDeclaration(declaration)) {
|
|
var internalModuleReference = declaration.moduleReference;
|
|
var firstIdentifier = getFirstIdentifier(internalModuleReference);
|
|
var importSymbol = resolveName(declaration, firstIdentifier.text, 107455 | 793056 | 1536, undefined, undefined);
|
|
if (importSymbol) {
|
|
buildVisibleNodeList(importSymbol.declarations);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function pushTypeResolution(target, propertyName) {
|
|
var resolutionCycleStartIndex = findResolutionCycleStartIndex(target, propertyName);
|
|
if (resolutionCycleStartIndex >= 0) {
|
|
var length_2 = resolutionTargets.length;
|
|
for (var i = resolutionCycleStartIndex; i < length_2; i++) {
|
|
resolutionResults[i] = false;
|
|
}
|
|
return false;
|
|
}
|
|
resolutionTargets.push(target);
|
|
resolutionResults.push(true);
|
|
resolutionPropertyNames.push(propertyName);
|
|
return true;
|
|
}
|
|
function findResolutionCycleStartIndex(target, propertyName) {
|
|
for (var i = resolutionTargets.length - 1; i >= 0; i--) {
|
|
if (hasType(resolutionTargets[i], resolutionPropertyNames[i])) {
|
|
return -1;
|
|
}
|
|
if (resolutionTargets[i] === target && resolutionPropertyNames[i] === propertyName) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function hasType(target, propertyName) {
|
|
if (propertyName === 0) {
|
|
return getSymbolLinks(target).type;
|
|
}
|
|
if (propertyName === 2) {
|
|
return getSymbolLinks(target).declaredType;
|
|
}
|
|
if (propertyName === 1) {
|
|
ts.Debug.assert(!!(target.flags & 1024));
|
|
return target.resolvedBaseConstructorType;
|
|
}
|
|
if (propertyName === 3) {
|
|
return target.resolvedReturnType;
|
|
}
|
|
ts.Debug.fail("Unhandled TypeSystemPropertyName " + propertyName);
|
|
}
|
|
function popTypeResolution() {
|
|
resolutionTargets.pop();
|
|
resolutionPropertyNames.pop();
|
|
return resolutionResults.pop();
|
|
}
|
|
function getDeclarationContainer(node) {
|
|
node = ts.getRootDeclaration(node);
|
|
while (node) {
|
|
switch (node.kind) {
|
|
case 218:
|
|
case 219:
|
|
case 234:
|
|
case 233:
|
|
case 232:
|
|
case 231:
|
|
node = node.parent;
|
|
break;
|
|
default:
|
|
return node.parent;
|
|
}
|
|
}
|
|
}
|
|
function getTypeOfPrototypeProperty(prototype) {
|
|
var classType = getDeclaredTypeOfSymbol(getParentOfSymbol(prototype));
|
|
return classType.typeParameters ? createTypeReference(classType, ts.map(classType.typeParameters, function (_) { return anyType; })) : classType;
|
|
}
|
|
function getTypeOfPropertyOfType(type, name) {
|
|
var prop = getPropertyOfType(type, name);
|
|
return prop ? getTypeOfSymbol(prop) : undefined;
|
|
}
|
|
function isTypeAny(type) {
|
|
return type && (type.flags & 1) !== 0;
|
|
}
|
|
function isTypeNever(type) {
|
|
return type && (type.flags & 134217728) !== 0;
|
|
}
|
|
function getTypeForBindingElementParent(node) {
|
|
var symbol = getSymbolOfNode(node);
|
|
return symbol && getSymbolLinks(symbol).type || getTypeForVariableLikeDeclaration(node, false);
|
|
}
|
|
function getTextOfPropertyName(name) {
|
|
switch (name.kind) {
|
|
case 69:
|
|
return name.text;
|
|
case 9:
|
|
case 8:
|
|
return name.text;
|
|
case 140:
|
|
if (ts.isStringOrNumericLiteral(name.expression.kind)) {
|
|
return name.expression.text;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function isComputedNonLiteralName(name) {
|
|
return name.kind === 140 && !ts.isStringOrNumericLiteral(name.expression.kind);
|
|
}
|
|
function getTypeForBindingElement(declaration) {
|
|
var pattern = declaration.parent;
|
|
var parentType = getTypeForBindingElementParent(pattern.parent);
|
|
if (parentType === unknownType) {
|
|
return unknownType;
|
|
}
|
|
if (!parentType || isTypeAny(parentType)) {
|
|
if (declaration.initializer) {
|
|
return checkExpressionCached(declaration.initializer);
|
|
}
|
|
return parentType;
|
|
}
|
|
var type;
|
|
if (pattern.kind === 167) {
|
|
var name_11 = declaration.propertyName || declaration.name;
|
|
if (isComputedNonLiteralName(name_11)) {
|
|
return anyType;
|
|
}
|
|
if (declaration.initializer) {
|
|
getContextualType(declaration.initializer);
|
|
}
|
|
var text = getTextOfPropertyName(name_11);
|
|
type = getTypeOfPropertyOfType(parentType, text) ||
|
|
isNumericLiteralName(text) && getIndexTypeOfType(parentType, 1) ||
|
|
getIndexTypeOfType(parentType, 0);
|
|
if (!type) {
|
|
error(name_11, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(parentType), ts.declarationNameToString(name_11));
|
|
return unknownType;
|
|
}
|
|
}
|
|
else {
|
|
var elementType = checkIteratedTypeOrElementType(parentType, pattern, false);
|
|
if (!declaration.dotDotDotToken) {
|
|
var propName = "" + ts.indexOf(pattern.elements, declaration);
|
|
type = isTupleLikeType(parentType)
|
|
? getTypeOfPropertyOfType(parentType, propName)
|
|
: elementType;
|
|
if (!type) {
|
|
if (isTupleType(parentType)) {
|
|
error(declaration, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(parentType), parentType.elementTypes.length, pattern.elements.length);
|
|
}
|
|
else {
|
|
error(declaration, ts.Diagnostics.Type_0_has_no_property_1, typeToString(parentType), propName);
|
|
}
|
|
return unknownType;
|
|
}
|
|
}
|
|
else {
|
|
type = createArrayType(elementType);
|
|
}
|
|
}
|
|
if (strictNullChecks && declaration.initializer && !(getCombinedTypeFlags(checkExpressionCached(declaration.initializer)) & 32)) {
|
|
type = getTypeWithFacts(type, 131072);
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeForVariableLikeDeclarationFromJSDocComment(declaration) {
|
|
var jsDocType = getJSDocTypeForVariableLikeDeclarationFromJSDocComment(declaration);
|
|
if (jsDocType) {
|
|
return getTypeFromTypeNode(jsDocType);
|
|
}
|
|
}
|
|
function getJSDocTypeForVariableLikeDeclarationFromJSDocComment(declaration) {
|
|
var typeTag = ts.getJSDocTypeTag(declaration);
|
|
if (typeTag && typeTag.typeExpression) {
|
|
return typeTag.typeExpression.type;
|
|
}
|
|
if (declaration.kind === 218 &&
|
|
declaration.parent.kind === 219 &&
|
|
declaration.parent.parent.kind === 200) {
|
|
var annotation = ts.getJSDocTypeTag(declaration.parent.parent);
|
|
if (annotation && annotation.typeExpression) {
|
|
return annotation.typeExpression.type;
|
|
}
|
|
}
|
|
else if (declaration.kind === 142) {
|
|
var paramTag = ts.getCorrespondingJSDocParameterTag(declaration);
|
|
if (paramTag && paramTag.typeExpression) {
|
|
return paramTag.typeExpression.type;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function addOptionality(type, optional) {
|
|
return strictNullChecks && optional ? addTypeKind(type, 32) : type;
|
|
}
|
|
function getTypeForVariableLikeDeclaration(declaration, includeOptionality) {
|
|
if (declaration.flags & 134217728) {
|
|
var type = getTypeForVariableLikeDeclarationFromJSDocComment(declaration);
|
|
if (type && type !== unknownType) {
|
|
return type;
|
|
}
|
|
}
|
|
if (declaration.parent.parent.kind === 207) {
|
|
return stringType;
|
|
}
|
|
if (declaration.parent.parent.kind === 208) {
|
|
return checkRightHandSideOfForOf(declaration.parent.parent.expression) || anyType;
|
|
}
|
|
if (ts.isBindingPattern(declaration.parent)) {
|
|
return getTypeForBindingElement(declaration);
|
|
}
|
|
if (declaration.type) {
|
|
return addOptionality(getTypeFromTypeNode(declaration.type), declaration.questionToken && includeOptionality);
|
|
}
|
|
if (declaration.kind === 142) {
|
|
var func = declaration.parent;
|
|
if (func.kind === 150 && !ts.hasDynamicName(func)) {
|
|
var getter = ts.getDeclarationOfKind(declaration.parent.symbol, 149);
|
|
if (getter) {
|
|
var getterSignature = getSignatureFromDeclaration(getter);
|
|
var thisParameter = getAccessorThisParameter(func);
|
|
if (thisParameter && declaration === thisParameter) {
|
|
ts.Debug.assert(!thisParameter.type);
|
|
return getTypeOfSymbol(getterSignature.thisParameter);
|
|
}
|
|
return getReturnTypeOfSignature(getterSignature);
|
|
}
|
|
}
|
|
var type = declaration.symbol.name === "this"
|
|
? getContextuallyTypedThisType(func)
|
|
: getContextuallyTypedParameterType(declaration);
|
|
if (type) {
|
|
return addOptionality(type, declaration.questionToken && includeOptionality);
|
|
}
|
|
}
|
|
if (declaration.initializer) {
|
|
return addOptionality(checkExpressionCached(declaration.initializer), declaration.questionToken && includeOptionality);
|
|
}
|
|
if (declaration.kind === 254) {
|
|
return checkIdentifier(declaration.name);
|
|
}
|
|
if (ts.isBindingPattern(declaration.name)) {
|
|
return getTypeFromBindingPattern(declaration.name, false);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getTypeFromBindingElement(element, includePatternInType) {
|
|
if (element.initializer) {
|
|
var type = checkExpressionCached(element.initializer);
|
|
reportErrorsFromWidening(element, type);
|
|
return getWidenedType(type);
|
|
}
|
|
if (ts.isBindingPattern(element.name)) {
|
|
return getTypeFromBindingPattern(element.name, includePatternInType);
|
|
}
|
|
if (compilerOptions.noImplicitAny && !declarationBelongsToPrivateAmbientMember(element)) {
|
|
reportImplicitAnyError(element, anyType);
|
|
}
|
|
return anyType;
|
|
}
|
|
function getTypeFromObjectBindingPattern(pattern, includePatternInType) {
|
|
var members = {};
|
|
var hasComputedProperties = false;
|
|
ts.forEach(pattern.elements, function (e) {
|
|
var name = e.propertyName || e.name;
|
|
if (isComputedNonLiteralName(name)) {
|
|
hasComputedProperties = true;
|
|
return;
|
|
}
|
|
var text = getTextOfPropertyName(name);
|
|
var flags = 4 | 67108864 | (e.initializer ? 536870912 : 0);
|
|
var symbol = createSymbol(flags, text);
|
|
symbol.type = getTypeFromBindingElement(e, includePatternInType);
|
|
symbol.bindingElement = e;
|
|
members[symbol.name] = symbol;
|
|
});
|
|
var result = createAnonymousType(undefined, members, emptyArray, emptyArray, undefined, undefined);
|
|
if (includePatternInType) {
|
|
result.pattern = pattern;
|
|
}
|
|
if (hasComputedProperties) {
|
|
result.flags |= 67108864;
|
|
}
|
|
return result;
|
|
}
|
|
function getTypeFromArrayBindingPattern(pattern, includePatternInType) {
|
|
var elements = pattern.elements;
|
|
if (elements.length === 0 || elements[elements.length - 1].dotDotDotToken) {
|
|
return languageVersion >= 2 ? createIterableType(anyType) : anyArrayType;
|
|
}
|
|
var elementTypes = ts.map(elements, function (e) { return e.kind === 193 ? anyType : getTypeFromBindingElement(e, includePatternInType); });
|
|
if (includePatternInType) {
|
|
var result = createNewTupleType(elementTypes);
|
|
result.pattern = pattern;
|
|
return result;
|
|
}
|
|
return createTupleType(elementTypes);
|
|
}
|
|
function getTypeFromBindingPattern(pattern, includePatternInType) {
|
|
return pattern.kind === 167
|
|
? getTypeFromObjectBindingPattern(pattern, includePatternInType)
|
|
: getTypeFromArrayBindingPattern(pattern, includePatternInType);
|
|
}
|
|
function getWidenedTypeForVariableLikeDeclaration(declaration, reportErrors) {
|
|
var type = getTypeForVariableLikeDeclaration(declaration, true);
|
|
if (type) {
|
|
if (reportErrors) {
|
|
reportErrorsFromWidening(declaration, type);
|
|
}
|
|
if (declaration.kind === 253) {
|
|
return type;
|
|
}
|
|
return getWidenedType(type);
|
|
}
|
|
type = declaration.dotDotDotToken ? anyArrayType : anyType;
|
|
if (reportErrors && compilerOptions.noImplicitAny) {
|
|
if (!declarationBelongsToPrivateAmbientMember(declaration)) {
|
|
reportImplicitAnyError(declaration, type);
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function declarationBelongsToPrivateAmbientMember(declaration) {
|
|
var root = ts.getRootDeclaration(declaration);
|
|
var memberDeclaration = root.kind === 142 ? root.parent : root;
|
|
return isPrivateWithinAmbient(memberDeclaration);
|
|
}
|
|
function getTypeOfVariableOrParameterOrProperty(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
if (symbol.flags & 134217728) {
|
|
return links.type = getTypeOfPrototypeProperty(symbol);
|
|
}
|
|
var declaration = symbol.valueDeclaration;
|
|
if (declaration.parent.kind === 252) {
|
|
return links.type = anyType;
|
|
}
|
|
if (declaration.kind === 235) {
|
|
return links.type = checkExpression(declaration.expression);
|
|
}
|
|
if (declaration.flags & 134217728 && declaration.kind === 280 && declaration.typeExpression) {
|
|
return links.type = getTypeFromTypeNode(declaration.typeExpression.type);
|
|
}
|
|
if (!pushTypeResolution(symbol, 0)) {
|
|
return unknownType;
|
|
}
|
|
var type = undefined;
|
|
if (declaration.kind === 187 ||
|
|
declaration.kind === 172 && declaration.parent.kind === 187) {
|
|
type = getUnionType(ts.map(symbol.declarations, function (decl) { return decl.kind === 187 ?
|
|
checkExpressionCached(decl.right) :
|
|
checkExpressionCached(decl.parent.right); }));
|
|
}
|
|
if (type === undefined) {
|
|
type = getWidenedTypeForVariableLikeDeclaration(declaration, true);
|
|
}
|
|
if (!popTypeResolution()) {
|
|
if (symbol.valueDeclaration.type) {
|
|
type = unknownType;
|
|
error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol));
|
|
}
|
|
else {
|
|
type = anyType;
|
|
if (compilerOptions.noImplicitAny) {
|
|
error(symbol.valueDeclaration, ts.Diagnostics._0_implicitly_has_type_any_because_it_does_not_have_a_type_annotation_and_is_referenced_directly_or_indirectly_in_its_own_initializer, symbolToString(symbol));
|
|
}
|
|
}
|
|
}
|
|
links.type = type;
|
|
}
|
|
return links.type;
|
|
}
|
|
function getAnnotatedAccessorType(accessor) {
|
|
if (accessor) {
|
|
if (accessor.kind === 149) {
|
|
return accessor.type && getTypeFromTypeNode(accessor.type);
|
|
}
|
|
else {
|
|
var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor);
|
|
return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getAnnotatedAccessorThisParameter(accessor) {
|
|
var parameter = getAccessorThisParameter(accessor);
|
|
return parameter && parameter.symbol;
|
|
}
|
|
function getThisTypeOfDeclaration(declaration) {
|
|
return getThisTypeOfSignature(getSignatureFromDeclaration(declaration));
|
|
}
|
|
function getTypeOfAccessors(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
var getter = ts.getDeclarationOfKind(symbol, 149);
|
|
var setter = ts.getDeclarationOfKind(symbol, 150);
|
|
if (getter && getter.flags & 134217728) {
|
|
var jsDocType = getTypeForVariableLikeDeclarationFromJSDocComment(getter);
|
|
if (jsDocType) {
|
|
return links.type = jsDocType;
|
|
}
|
|
}
|
|
if (!pushTypeResolution(symbol, 0)) {
|
|
return unknownType;
|
|
}
|
|
var type = void 0;
|
|
var getterReturnType = getAnnotatedAccessorType(getter);
|
|
if (getterReturnType) {
|
|
type = getterReturnType;
|
|
}
|
|
else {
|
|
var setterParameterType = getAnnotatedAccessorType(setter);
|
|
if (setterParameterType) {
|
|
type = setterParameterType;
|
|
}
|
|
else {
|
|
if (getter && getter.body) {
|
|
type = getReturnTypeFromBody(getter);
|
|
}
|
|
else {
|
|
if (compilerOptions.noImplicitAny) {
|
|
error(setter, ts.Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_type_annotation, symbolToString(symbol));
|
|
}
|
|
type = anyType;
|
|
}
|
|
}
|
|
}
|
|
if (!popTypeResolution()) {
|
|
type = anyType;
|
|
if (compilerOptions.noImplicitAny) {
|
|
var getter_1 = ts.getDeclarationOfKind(symbol, 149);
|
|
error(getter_1, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, symbolToString(symbol));
|
|
}
|
|
}
|
|
links.type = type;
|
|
}
|
|
return links.type;
|
|
}
|
|
function getTypeOfFuncClassEnumModule(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
if (symbol.valueDeclaration.kind === 225 && ts.isShorthandAmbientModule(symbol.valueDeclaration)) {
|
|
links.type = anyType;
|
|
}
|
|
else {
|
|
var type = createObjectType(65536, symbol);
|
|
links.type = strictNullChecks && symbol.flags & 536870912 ?
|
|
addTypeKind(type, 32) : type;
|
|
}
|
|
}
|
|
return links.type;
|
|
}
|
|
function getTypeOfEnumMember(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
links.type = getDeclaredTypeOfEnum(getParentOfSymbol(symbol));
|
|
}
|
|
return links.type;
|
|
}
|
|
function getTypeOfAlias(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
var targetSymbol = resolveAlias(symbol);
|
|
links.type = targetSymbol.flags & 107455
|
|
? getTypeOfSymbol(targetSymbol)
|
|
: unknownType;
|
|
}
|
|
return links.type;
|
|
}
|
|
function getTypeOfInstantiatedSymbol(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.type) {
|
|
links.type = instantiateType(getTypeOfSymbol(links.target), links.mapper);
|
|
}
|
|
return links.type;
|
|
}
|
|
function getTypeOfSymbol(symbol) {
|
|
if (symbol.flags & 16777216) {
|
|
return getTypeOfInstantiatedSymbol(symbol);
|
|
}
|
|
if (symbol.flags & (3 | 4)) {
|
|
return getTypeOfVariableOrParameterOrProperty(symbol);
|
|
}
|
|
if (symbol.flags & (16 | 8192 | 32 | 384 | 512)) {
|
|
return getTypeOfFuncClassEnumModule(symbol);
|
|
}
|
|
if (symbol.flags & 8) {
|
|
return getTypeOfEnumMember(symbol);
|
|
}
|
|
if (symbol.flags & 98304) {
|
|
return getTypeOfAccessors(symbol);
|
|
}
|
|
if (symbol.flags & 8388608) {
|
|
return getTypeOfAlias(symbol);
|
|
}
|
|
return unknownType;
|
|
}
|
|
function getTargetType(type) {
|
|
return type.flags & 4096 ? type.target : type;
|
|
}
|
|
function hasBaseType(type, checkBase) {
|
|
return check(type);
|
|
function check(type) {
|
|
var target = getTargetType(type);
|
|
return target === checkBase || ts.forEach(getBaseTypes(target), check);
|
|
}
|
|
}
|
|
function appendTypeParameters(typeParameters, declarations) {
|
|
for (var _i = 0, declarations_2 = declarations; _i < declarations_2.length; _i++) {
|
|
var declaration = declarations_2[_i];
|
|
var tp = getDeclaredTypeOfTypeParameter(getSymbolOfNode(declaration));
|
|
if (!typeParameters) {
|
|
typeParameters = [tp];
|
|
}
|
|
else if (!ts.contains(typeParameters, tp)) {
|
|
typeParameters.push(tp);
|
|
}
|
|
}
|
|
return typeParameters;
|
|
}
|
|
function appendOuterTypeParameters(typeParameters, node) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (!node) {
|
|
return typeParameters;
|
|
}
|
|
if (node.kind === 221 || node.kind === 192 ||
|
|
node.kind === 220 || node.kind === 179 ||
|
|
node.kind === 147 || node.kind === 180) {
|
|
var declarations = node.typeParameters;
|
|
if (declarations) {
|
|
return appendTypeParameters(appendOuterTypeParameters(typeParameters, node), declarations);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getOuterTypeParametersOfClassOrInterface(symbol) {
|
|
var declaration = symbol.flags & 32 ? symbol.valueDeclaration : ts.getDeclarationOfKind(symbol, 222);
|
|
return appendOuterTypeParameters(undefined, declaration);
|
|
}
|
|
function getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol) {
|
|
var result;
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var node = _a[_i];
|
|
if (node.kind === 222 || node.kind === 221 ||
|
|
node.kind === 192 || node.kind === 223) {
|
|
var declaration = node;
|
|
if (declaration.typeParameters) {
|
|
result = appendTypeParameters(result, declaration.typeParameters);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function getTypeParametersOfClassOrInterface(symbol) {
|
|
return ts.concatenate(getOuterTypeParametersOfClassOrInterface(symbol), getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol));
|
|
}
|
|
function isConstructorType(type) {
|
|
return type.flags & 80896 && getSignaturesOfType(type, 1).length > 0;
|
|
}
|
|
function getBaseTypeNodeOfClass(type) {
|
|
return ts.getClassExtendsHeritageClauseElement(type.symbol.valueDeclaration);
|
|
}
|
|
function getConstructorsForTypeArguments(type, typeArgumentNodes) {
|
|
var typeArgCount = typeArgumentNodes ? typeArgumentNodes.length : 0;
|
|
return ts.filter(getSignaturesOfType(type, 1), function (sig) { return (sig.typeParameters ? sig.typeParameters.length : 0) === typeArgCount; });
|
|
}
|
|
function getInstantiatedConstructorsForTypeArguments(type, typeArgumentNodes) {
|
|
var signatures = getConstructorsForTypeArguments(type, typeArgumentNodes);
|
|
if (typeArgumentNodes) {
|
|
var typeArguments_1 = ts.map(typeArgumentNodes, getTypeFromTypeNode);
|
|
signatures = ts.map(signatures, function (sig) { return getSignatureInstantiation(sig, typeArguments_1); });
|
|
}
|
|
return signatures;
|
|
}
|
|
function getBaseConstructorTypeOfClass(type) {
|
|
if (!type.resolvedBaseConstructorType) {
|
|
var baseTypeNode = getBaseTypeNodeOfClass(type);
|
|
if (!baseTypeNode) {
|
|
return type.resolvedBaseConstructorType = undefinedType;
|
|
}
|
|
if (!pushTypeResolution(type, 1)) {
|
|
return unknownType;
|
|
}
|
|
var baseConstructorType = checkExpression(baseTypeNode.expression);
|
|
if (baseConstructorType.flags & 80896) {
|
|
resolveStructuredTypeMembers(baseConstructorType);
|
|
}
|
|
if (!popTypeResolution()) {
|
|
error(type.symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_base_expression, symbolToString(type.symbol));
|
|
return type.resolvedBaseConstructorType = unknownType;
|
|
}
|
|
if (baseConstructorType !== unknownType && baseConstructorType !== nullWideningType && !isConstructorType(baseConstructorType)) {
|
|
error(baseTypeNode.expression, ts.Diagnostics.Type_0_is_not_a_constructor_function_type, typeToString(baseConstructorType));
|
|
return type.resolvedBaseConstructorType = unknownType;
|
|
}
|
|
type.resolvedBaseConstructorType = baseConstructorType;
|
|
}
|
|
return type.resolvedBaseConstructorType;
|
|
}
|
|
function getBaseTypes(type) {
|
|
var isClass = type.symbol.flags & 32;
|
|
var isInterface = type.symbol.flags & 64;
|
|
if (!type.resolvedBaseTypes) {
|
|
if (!isClass && !isInterface) {
|
|
ts.Debug.fail("type must be class or interface");
|
|
}
|
|
if (isClass) {
|
|
resolveBaseTypesOfClass(type);
|
|
}
|
|
if (isInterface) {
|
|
resolveBaseTypesOfInterface(type);
|
|
}
|
|
}
|
|
return type.resolvedBaseTypes;
|
|
}
|
|
function resolveBaseTypesOfClass(type) {
|
|
type.resolvedBaseTypes = type.resolvedBaseTypes || emptyArray;
|
|
var baseConstructorType = getBaseConstructorTypeOfClass(type);
|
|
if (!(baseConstructorType.flags & 80896)) {
|
|
return;
|
|
}
|
|
var baseTypeNode = getBaseTypeNodeOfClass(type);
|
|
var baseType;
|
|
var originalBaseType = baseConstructorType && baseConstructorType.symbol ? getDeclaredTypeOfSymbol(baseConstructorType.symbol) : undefined;
|
|
if (baseConstructorType.symbol && baseConstructorType.symbol.flags & 32 &&
|
|
areAllOuterTypeParametersApplied(originalBaseType)) {
|
|
baseType = getTypeFromClassOrInterfaceReference(baseTypeNode, baseConstructorType.symbol);
|
|
}
|
|
else {
|
|
var constructors = getInstantiatedConstructorsForTypeArguments(baseConstructorType, baseTypeNode.typeArguments);
|
|
if (!constructors.length) {
|
|
error(baseTypeNode.expression, ts.Diagnostics.No_base_constructor_has_the_specified_number_of_type_arguments);
|
|
return;
|
|
}
|
|
baseType = getReturnTypeOfSignature(constructors[0]);
|
|
}
|
|
if (baseType === unknownType) {
|
|
return;
|
|
}
|
|
if (!(getTargetType(baseType).flags & (1024 | 2048))) {
|
|
error(baseTypeNode.expression, ts.Diagnostics.Base_constructor_return_type_0_is_not_a_class_or_interface_type, typeToString(baseType));
|
|
return;
|
|
}
|
|
if (type === baseType || hasBaseType(baseType, type)) {
|
|
error(type.symbol.valueDeclaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
|
|
return;
|
|
}
|
|
if (type.resolvedBaseTypes === emptyArray) {
|
|
type.resolvedBaseTypes = [baseType];
|
|
}
|
|
else {
|
|
type.resolvedBaseTypes.push(baseType);
|
|
}
|
|
}
|
|
function areAllOuterTypeParametersApplied(type) {
|
|
var outerTypeParameters = type.outerTypeParameters;
|
|
if (outerTypeParameters) {
|
|
var last = outerTypeParameters.length - 1;
|
|
var typeArguments = type.typeArguments;
|
|
return outerTypeParameters[last].symbol !== typeArguments[last].symbol;
|
|
}
|
|
return true;
|
|
}
|
|
function resolveBaseTypesOfInterface(type) {
|
|
type.resolvedBaseTypes = type.resolvedBaseTypes || emptyArray;
|
|
for (var _i = 0, _a = type.symbol.declarations; _i < _a.length; _i++) {
|
|
var declaration = _a[_i];
|
|
if (declaration.kind === 222 && ts.getInterfaceBaseTypeNodes(declaration)) {
|
|
for (var _b = 0, _c = ts.getInterfaceBaseTypeNodes(declaration); _b < _c.length; _b++) {
|
|
var node = _c[_b];
|
|
var baseType = getTypeFromTypeNode(node);
|
|
if (baseType !== unknownType) {
|
|
if (getTargetType(baseType).flags & (1024 | 2048)) {
|
|
if (type !== baseType && !hasBaseType(baseType, type)) {
|
|
if (type.resolvedBaseTypes === emptyArray) {
|
|
type.resolvedBaseTypes = [baseType];
|
|
}
|
|
else {
|
|
type.resolvedBaseTypes.push(baseType);
|
|
}
|
|
}
|
|
else {
|
|
error(declaration, ts.Diagnostics.Type_0_recursively_references_itself_as_a_base_type, typeToString(type, undefined, 1));
|
|
}
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.An_interface_may_only_extend_a_class_or_another_interface);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isIndependentInterface(symbol) {
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var declaration = _a[_i];
|
|
if (declaration.kind === 222) {
|
|
if (declaration.flags & 16384) {
|
|
return false;
|
|
}
|
|
var baseTypeNodes = ts.getInterfaceBaseTypeNodes(declaration);
|
|
if (baseTypeNodes) {
|
|
for (var _b = 0, baseTypeNodes_1 = baseTypeNodes; _b < baseTypeNodes_1.length; _b++) {
|
|
var node = baseTypeNodes_1[_b];
|
|
if (ts.isSupportedExpressionWithTypeArguments(node)) {
|
|
var baseSymbol = resolveEntityName(node.expression, 793056, true);
|
|
if (!baseSymbol || !(baseSymbol.flags & 64) || getDeclaredTypeOfClassOrInterface(baseSymbol).thisType) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function getDeclaredTypeOfClassOrInterface(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.declaredType) {
|
|
var kind = symbol.flags & 32 ? 1024 : 2048;
|
|
var type = links.declaredType = createObjectType(kind, symbol);
|
|
var outerTypeParameters = getOuterTypeParametersOfClassOrInterface(symbol);
|
|
var localTypeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
|
|
if (outerTypeParameters || localTypeParameters || kind === 1024 || !isIndependentInterface(symbol)) {
|
|
type.flags |= 4096;
|
|
type.typeParameters = ts.concatenate(outerTypeParameters, localTypeParameters);
|
|
type.outerTypeParameters = outerTypeParameters;
|
|
type.localTypeParameters = localTypeParameters;
|
|
type.instantiations = {};
|
|
type.instantiations[getTypeListId(type.typeParameters)] = type;
|
|
type.target = type;
|
|
type.typeArguments = type.typeParameters;
|
|
type.thisType = createType(512 | 33554432);
|
|
type.thisType.symbol = symbol;
|
|
type.thisType.constraint = type;
|
|
}
|
|
}
|
|
return links.declaredType;
|
|
}
|
|
function getDeclaredTypeOfTypeAlias(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.declaredType) {
|
|
if (!pushTypeResolution(symbol, 2)) {
|
|
return unknownType;
|
|
}
|
|
var type = void 0;
|
|
var declaration = ts.getDeclarationOfKind(symbol, 279);
|
|
if (declaration) {
|
|
if (declaration.jsDocTypeLiteral) {
|
|
type = getTypeFromTypeNode(declaration.jsDocTypeLiteral);
|
|
}
|
|
else {
|
|
type = getTypeFromTypeNode(declaration.typeExpression.type);
|
|
}
|
|
}
|
|
else {
|
|
declaration = ts.getDeclarationOfKind(symbol, 223);
|
|
type = getTypeFromTypeNode(declaration.type);
|
|
}
|
|
if (popTypeResolution()) {
|
|
links.typeParameters = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(symbol);
|
|
if (links.typeParameters) {
|
|
links.instantiations = {};
|
|
links.instantiations[getTypeListId(links.typeParameters)] = type;
|
|
}
|
|
}
|
|
else {
|
|
type = unknownType;
|
|
error(declaration.name, ts.Diagnostics.Type_alias_0_circularly_references_itself, symbolToString(symbol));
|
|
}
|
|
links.declaredType = type;
|
|
}
|
|
return links.declaredType;
|
|
}
|
|
function getDeclaredTypeOfEnum(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.declaredType) {
|
|
var type = createType(128);
|
|
type.symbol = symbol;
|
|
links.declaredType = type;
|
|
}
|
|
return links.declaredType;
|
|
}
|
|
function getDeclaredTypeOfTypeParameter(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.declaredType) {
|
|
var type = createType(512);
|
|
type.symbol = symbol;
|
|
if (!ts.getDeclarationOfKind(symbol, 141).constraint) {
|
|
type.constraint = noConstraintType;
|
|
}
|
|
links.declaredType = type;
|
|
}
|
|
return links.declaredType;
|
|
}
|
|
function getDeclaredTypeOfAlias(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.declaredType) {
|
|
links.declaredType = getDeclaredTypeOfSymbol(resolveAlias(symbol));
|
|
}
|
|
return links.declaredType;
|
|
}
|
|
function getDeclaredTypeOfSymbol(symbol) {
|
|
ts.Debug.assert((symbol.flags & 16777216) === 0);
|
|
if (symbol.flags & (32 | 64)) {
|
|
return getDeclaredTypeOfClassOrInterface(symbol);
|
|
}
|
|
if (symbol.flags & 524288) {
|
|
return getDeclaredTypeOfTypeAlias(symbol);
|
|
}
|
|
if (symbol.flags & 384) {
|
|
return getDeclaredTypeOfEnum(symbol);
|
|
}
|
|
if (symbol.flags & 262144) {
|
|
return getDeclaredTypeOfTypeParameter(symbol);
|
|
}
|
|
if (symbol.flags & 8388608) {
|
|
return getDeclaredTypeOfAlias(symbol);
|
|
}
|
|
return unknownType;
|
|
}
|
|
function isIndependentTypeReference(node) {
|
|
if (node.typeArguments) {
|
|
for (var _i = 0, _a = node.typeArguments; _i < _a.length; _i++) {
|
|
var typeNode = _a[_i];
|
|
if (!isIndependentType(typeNode)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function isIndependentType(node) {
|
|
switch (node.kind) {
|
|
case 117:
|
|
case 132:
|
|
case 130:
|
|
case 120:
|
|
case 133:
|
|
case 103:
|
|
case 135:
|
|
case 93:
|
|
case 127:
|
|
case 166:
|
|
return true;
|
|
case 160:
|
|
return isIndependentType(node.elementType);
|
|
case 155:
|
|
return isIndependentTypeReference(node);
|
|
}
|
|
return false;
|
|
}
|
|
function isIndependentVariableLikeDeclaration(node) {
|
|
return node.type && isIndependentType(node.type) || !node.type && !node.initializer;
|
|
}
|
|
function isIndependentFunctionLikeDeclaration(node) {
|
|
if (node.kind !== 148 && (!node.type || !isIndependentType(node.type))) {
|
|
return false;
|
|
}
|
|
for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
|
|
var parameter = _a[_i];
|
|
if (!isIndependentVariableLikeDeclaration(parameter)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function isIndependentMember(symbol) {
|
|
if (symbol.declarations && symbol.declarations.length === 1) {
|
|
var declaration = symbol.declarations[0];
|
|
if (declaration) {
|
|
switch (declaration.kind) {
|
|
case 145:
|
|
case 144:
|
|
return isIndependentVariableLikeDeclaration(declaration);
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
return isIndependentFunctionLikeDeclaration(declaration);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function createSymbolTable(symbols) {
|
|
var result = {};
|
|
for (var _i = 0, symbols_1 = symbols; _i < symbols_1.length; _i++) {
|
|
var symbol = symbols_1[_i];
|
|
result[symbol.name] = symbol;
|
|
}
|
|
return result;
|
|
}
|
|
function createInstantiatedSymbolTable(symbols, mapper, mappingThisOnly) {
|
|
var result = {};
|
|
for (var _i = 0, symbols_2 = symbols; _i < symbols_2.length; _i++) {
|
|
var symbol = symbols_2[_i];
|
|
result[symbol.name] = mappingThisOnly && isIndependentMember(symbol) ? symbol : instantiateSymbol(symbol, mapper);
|
|
}
|
|
return result;
|
|
}
|
|
function addInheritedMembers(symbols, baseSymbols) {
|
|
for (var _i = 0, baseSymbols_1 = baseSymbols; _i < baseSymbols_1.length; _i++) {
|
|
var s = baseSymbols_1[_i];
|
|
if (!ts.hasProperty(symbols, s.name)) {
|
|
symbols[s.name] = s;
|
|
}
|
|
}
|
|
}
|
|
function resolveDeclaredMembers(type) {
|
|
if (!type.declaredProperties) {
|
|
var symbol = type.symbol;
|
|
type.declaredProperties = getNamedMembers(symbol.members);
|
|
type.declaredCallSignatures = getSignaturesOfSymbol(symbol.members["__call"]);
|
|
type.declaredConstructSignatures = getSignaturesOfSymbol(symbol.members["__new"]);
|
|
type.declaredStringIndexInfo = getIndexInfoOfSymbol(symbol, 0);
|
|
type.declaredNumberIndexInfo = getIndexInfoOfSymbol(symbol, 1);
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeWithThisArgument(type, thisArgument) {
|
|
if (type.flags & 4096) {
|
|
return createTypeReference(type.target, ts.concatenate(type.typeArguments, [thisArgument || type.target.thisType]));
|
|
}
|
|
return type;
|
|
}
|
|
function resolveObjectTypeMembers(type, source, typeParameters, typeArguments) {
|
|
var mapper = identityMapper;
|
|
var members = source.symbol.members;
|
|
var callSignatures = source.declaredCallSignatures;
|
|
var constructSignatures = source.declaredConstructSignatures;
|
|
var stringIndexInfo = source.declaredStringIndexInfo;
|
|
var numberIndexInfo = source.declaredNumberIndexInfo;
|
|
if (!ts.rangeEquals(typeParameters, typeArguments, 0, typeParameters.length)) {
|
|
mapper = createTypeMapper(typeParameters, typeArguments);
|
|
members = createInstantiatedSymbolTable(source.declaredProperties, mapper, typeParameters.length === 1);
|
|
callSignatures = instantiateList(source.declaredCallSignatures, mapper, instantiateSignature);
|
|
constructSignatures = instantiateList(source.declaredConstructSignatures, mapper, instantiateSignature);
|
|
stringIndexInfo = instantiateIndexInfo(source.declaredStringIndexInfo, mapper);
|
|
numberIndexInfo = instantiateIndexInfo(source.declaredNumberIndexInfo, mapper);
|
|
}
|
|
var baseTypes = getBaseTypes(source);
|
|
if (baseTypes.length) {
|
|
if (members === source.symbol.members) {
|
|
members = createSymbolTable(source.declaredProperties);
|
|
}
|
|
var thisArgument = ts.lastOrUndefined(typeArguments);
|
|
for (var _i = 0, baseTypes_1 = baseTypes; _i < baseTypes_1.length; _i++) {
|
|
var baseType = baseTypes_1[_i];
|
|
var instantiatedBaseType = thisArgument ? getTypeWithThisArgument(instantiateType(baseType, mapper), thisArgument) : baseType;
|
|
addInheritedMembers(members, getPropertiesOfObjectType(instantiatedBaseType));
|
|
callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(instantiatedBaseType, 0));
|
|
constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(instantiatedBaseType, 1));
|
|
stringIndexInfo = stringIndexInfo || getIndexInfoOfType(instantiatedBaseType, 0);
|
|
numberIndexInfo = numberIndexInfo || getIndexInfoOfType(instantiatedBaseType, 1);
|
|
}
|
|
}
|
|
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
function resolveClassOrInterfaceMembers(type) {
|
|
resolveObjectTypeMembers(type, resolveDeclaredMembers(type), emptyArray, emptyArray);
|
|
}
|
|
function resolveTypeReferenceMembers(type) {
|
|
var source = resolveDeclaredMembers(type.target);
|
|
var typeParameters = ts.concatenate(source.typeParameters, [source.thisType]);
|
|
var typeArguments = type.typeArguments && type.typeArguments.length === typeParameters.length ?
|
|
type.typeArguments : ts.concatenate(type.typeArguments, [type]);
|
|
resolveObjectTypeMembers(type, source, typeParameters, typeArguments);
|
|
}
|
|
function createSignature(declaration, typeParameters, thisParameter, parameters, resolvedReturnType, typePredicate, minArgumentCount, hasRestParameter, hasStringLiterals) {
|
|
var sig = new Signature(checker);
|
|
sig.declaration = declaration;
|
|
sig.typeParameters = typeParameters;
|
|
sig.parameters = parameters;
|
|
sig.thisParameter = thisParameter;
|
|
sig.resolvedReturnType = resolvedReturnType;
|
|
sig.typePredicate = typePredicate;
|
|
sig.minArgumentCount = minArgumentCount;
|
|
sig.hasRestParameter = hasRestParameter;
|
|
sig.hasStringLiterals = hasStringLiterals;
|
|
return sig;
|
|
}
|
|
function cloneSignature(sig) {
|
|
return createSignature(sig.declaration, sig.typeParameters, sig.thisParameter, sig.parameters, sig.resolvedReturnType, sig.typePredicate, sig.minArgumentCount, sig.hasRestParameter, sig.hasStringLiterals);
|
|
}
|
|
function getDefaultConstructSignatures(classType) {
|
|
var baseConstructorType = getBaseConstructorTypeOfClass(classType);
|
|
var baseSignatures = getSignaturesOfType(baseConstructorType, 1);
|
|
if (baseSignatures.length === 0) {
|
|
return [createSignature(undefined, classType.localTypeParameters, undefined, emptyArray, classType, undefined, 0, false, false)];
|
|
}
|
|
var baseTypeNode = getBaseTypeNodeOfClass(classType);
|
|
var typeArguments = ts.map(baseTypeNode.typeArguments, getTypeFromTypeNode);
|
|
var typeArgCount = typeArguments ? typeArguments.length : 0;
|
|
var result = [];
|
|
for (var _i = 0, baseSignatures_1 = baseSignatures; _i < baseSignatures_1.length; _i++) {
|
|
var baseSig = baseSignatures_1[_i];
|
|
var typeParamCount = baseSig.typeParameters ? baseSig.typeParameters.length : 0;
|
|
if (typeParamCount === typeArgCount) {
|
|
var sig = typeParamCount ? getSignatureInstantiation(baseSig, typeArguments) : cloneSignature(baseSig);
|
|
sig.typeParameters = classType.localTypeParameters;
|
|
sig.resolvedReturnType = classType;
|
|
result.push(sig);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function createTupleTypeMemberSymbols(memberTypes) {
|
|
var members = {};
|
|
for (var i = 0; i < memberTypes.length; i++) {
|
|
var symbol = createSymbol(4 | 67108864, "" + i);
|
|
symbol.type = memberTypes[i];
|
|
members[i] = symbol;
|
|
}
|
|
return members;
|
|
}
|
|
function resolveTupleTypeMembers(type) {
|
|
var arrayElementType = getUnionType(type.elementTypes, true);
|
|
var arrayType = resolveStructuredTypeMembers(createTypeFromGenericGlobalType(globalArrayType, [arrayElementType, type]));
|
|
var members = createTupleTypeMemberSymbols(type.elementTypes);
|
|
addInheritedMembers(members, arrayType.properties);
|
|
setObjectTypeMembers(type, members, arrayType.callSignatures, arrayType.constructSignatures, arrayType.stringIndexInfo, arrayType.numberIndexInfo);
|
|
}
|
|
function findMatchingSignature(signatureList, signature, partialMatch, ignoreThisTypes, ignoreReturnTypes) {
|
|
for (var _i = 0, signatureList_1 = signatureList; _i < signatureList_1.length; _i++) {
|
|
var s = signatureList_1[_i];
|
|
if (compareSignaturesIdentical(s, signature, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypesIdentical)) {
|
|
return s;
|
|
}
|
|
}
|
|
}
|
|
function findMatchingSignatures(signatureLists, signature, listIndex) {
|
|
if (signature.typeParameters) {
|
|
if (listIndex > 0) {
|
|
return undefined;
|
|
}
|
|
for (var i = 1; i < signatureLists.length; i++) {
|
|
if (!findMatchingSignature(signatureLists[i], signature, false, false, false)) {
|
|
return undefined;
|
|
}
|
|
}
|
|
return [signature];
|
|
}
|
|
var result = undefined;
|
|
for (var i = 0; i < signatureLists.length; i++) {
|
|
var match = i === listIndex ? signature : findMatchingSignature(signatureLists[i], signature, true, true, true);
|
|
if (!match) {
|
|
return undefined;
|
|
}
|
|
if (!ts.contains(result, match)) {
|
|
(result || (result = [])).push(match);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function getUnionSignatures(types, kind) {
|
|
var signatureLists = ts.map(types, function (t) { return getSignaturesOfType(t, kind); });
|
|
var result = undefined;
|
|
for (var i = 0; i < signatureLists.length; i++) {
|
|
for (var _i = 0, _a = signatureLists[i]; _i < _a.length; _i++) {
|
|
var signature = _a[_i];
|
|
if (!result || !findMatchingSignature(result, signature, false, true, true)) {
|
|
var unionSignatures = findMatchingSignatures(signatureLists, signature, i);
|
|
if (unionSignatures) {
|
|
var s = signature;
|
|
if (unionSignatures.length > 1) {
|
|
s = cloneSignature(signature);
|
|
if (ts.forEach(unionSignatures, function (sig) { return sig.thisParameter; })) {
|
|
var thisType = getUnionType(ts.map(unionSignatures, function (sig) { return getTypeOfSymbol(sig.thisParameter) || anyType; }));
|
|
s.thisParameter = createTransientSymbol(signature.thisParameter, thisType);
|
|
}
|
|
s.resolvedReturnType = undefined;
|
|
s.unionSignatures = unionSignatures;
|
|
}
|
|
(result || (result = [])).push(s);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result || emptyArray;
|
|
}
|
|
function getUnionIndexInfo(types, kind) {
|
|
var indexTypes = [];
|
|
var isAnyReadonly = false;
|
|
for (var _i = 0, types_1 = types; _i < types_1.length; _i++) {
|
|
var type = types_1[_i];
|
|
var indexInfo = getIndexInfoOfType(type, kind);
|
|
if (!indexInfo) {
|
|
return undefined;
|
|
}
|
|
indexTypes.push(indexInfo.type);
|
|
isAnyReadonly = isAnyReadonly || indexInfo.isReadonly;
|
|
}
|
|
return createIndexInfo(getUnionType(indexTypes), isAnyReadonly);
|
|
}
|
|
function resolveUnionTypeMembers(type) {
|
|
var callSignatures = getUnionSignatures(type.types, 0);
|
|
var constructSignatures = getUnionSignatures(type.types, 1);
|
|
var stringIndexInfo = getUnionIndexInfo(type.types, 0);
|
|
var numberIndexInfo = getUnionIndexInfo(type.types, 1);
|
|
setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
function intersectTypes(type1, type2) {
|
|
return !type1 ? type2 : !type2 ? type1 : getIntersectionType([type1, type2]);
|
|
}
|
|
function intersectIndexInfos(info1, info2) {
|
|
return !info1 ? info2 : !info2 ? info1 : createIndexInfo(getIntersectionType([info1.type, info2.type]), info1.isReadonly && info2.isReadonly);
|
|
}
|
|
function resolveIntersectionTypeMembers(type) {
|
|
var callSignatures = emptyArray;
|
|
var constructSignatures = emptyArray;
|
|
var stringIndexInfo = undefined;
|
|
var numberIndexInfo = undefined;
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
callSignatures = ts.concatenate(callSignatures, getSignaturesOfType(t, 0));
|
|
constructSignatures = ts.concatenate(constructSignatures, getSignaturesOfType(t, 1));
|
|
stringIndexInfo = intersectIndexInfos(stringIndexInfo, getIndexInfoOfType(t, 0));
|
|
numberIndexInfo = intersectIndexInfos(numberIndexInfo, getIndexInfoOfType(t, 1));
|
|
}
|
|
setObjectTypeMembers(type, emptySymbols, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
function resolveAnonymousTypeMembers(type) {
|
|
var symbol = type.symbol;
|
|
if (type.target) {
|
|
var members = createInstantiatedSymbolTable(getPropertiesOfObjectType(type.target), type.mapper, false);
|
|
var callSignatures = instantiateList(getSignaturesOfType(type.target, 0), type.mapper, instantiateSignature);
|
|
var constructSignatures = instantiateList(getSignaturesOfType(type.target, 1), type.mapper, instantiateSignature);
|
|
var stringIndexInfo = instantiateIndexInfo(getIndexInfoOfType(type.target, 0), type.mapper);
|
|
var numberIndexInfo = instantiateIndexInfo(getIndexInfoOfType(type.target, 1), type.mapper);
|
|
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
else if (symbol.flags & 2048) {
|
|
var members = symbol.members;
|
|
var callSignatures = getSignaturesOfSymbol(members["__call"]);
|
|
var constructSignatures = getSignaturesOfSymbol(members["__new"]);
|
|
var stringIndexInfo = getIndexInfoOfSymbol(symbol, 0);
|
|
var numberIndexInfo = getIndexInfoOfSymbol(symbol, 1);
|
|
setObjectTypeMembers(type, members, callSignatures, constructSignatures, stringIndexInfo, numberIndexInfo);
|
|
}
|
|
else {
|
|
var members = emptySymbols;
|
|
var constructSignatures = emptyArray;
|
|
if (symbol.flags & 1952) {
|
|
members = getExportsOfSymbol(symbol);
|
|
}
|
|
if (symbol.flags & 32) {
|
|
var classType = getDeclaredTypeOfClassOrInterface(symbol);
|
|
constructSignatures = getSignaturesOfSymbol(symbol.members["__constructor"]);
|
|
if (!constructSignatures.length) {
|
|
constructSignatures = getDefaultConstructSignatures(classType);
|
|
}
|
|
var baseConstructorType = getBaseConstructorTypeOfClass(classType);
|
|
if (baseConstructorType.flags & 80896) {
|
|
members = createSymbolTable(getNamedMembers(members));
|
|
addInheritedMembers(members, getPropertiesOfObjectType(baseConstructorType));
|
|
}
|
|
}
|
|
var numberIndexInfo = symbol.flags & 384 ? enumNumberIndexInfo : undefined;
|
|
setObjectTypeMembers(type, members, emptyArray, constructSignatures, undefined, numberIndexInfo);
|
|
if (symbol.flags & (16 | 8192)) {
|
|
type.callSignatures = getSignaturesOfSymbol(symbol);
|
|
}
|
|
}
|
|
}
|
|
function resolveStructuredTypeMembers(type) {
|
|
if (!type.members) {
|
|
if (type.flags & 4096) {
|
|
resolveTypeReferenceMembers(type);
|
|
}
|
|
else if (type.flags & (1024 | 2048)) {
|
|
resolveClassOrInterfaceMembers(type);
|
|
}
|
|
else if (type.flags & 65536) {
|
|
resolveAnonymousTypeMembers(type);
|
|
}
|
|
else if (type.flags & 8192) {
|
|
resolveTupleTypeMembers(type);
|
|
}
|
|
else if (type.flags & 16384) {
|
|
resolveUnionTypeMembers(type);
|
|
}
|
|
else if (type.flags & 32768) {
|
|
resolveIntersectionTypeMembers(type);
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function getPropertiesOfObjectType(type) {
|
|
if (type.flags & 80896) {
|
|
return resolveStructuredTypeMembers(type).properties;
|
|
}
|
|
return emptyArray;
|
|
}
|
|
function getPropertyOfObjectType(type, name) {
|
|
if (type.flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if (ts.hasProperty(resolved.members, name)) {
|
|
var symbol = resolved.members[name];
|
|
if (symbolIsValue(symbol)) {
|
|
return symbol;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getPropertiesOfUnionOrIntersectionType(type) {
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var current = _a[_i];
|
|
for (var _b = 0, _c = getPropertiesOfType(current); _b < _c.length; _b++) {
|
|
var prop = _c[_b];
|
|
getPropertyOfUnionOrIntersectionType(type, prop.name);
|
|
}
|
|
if (type.flags & 16384) {
|
|
break;
|
|
}
|
|
}
|
|
return type.resolvedProperties ? symbolsToArray(type.resolvedProperties) : emptyArray;
|
|
}
|
|
function getPropertiesOfType(type) {
|
|
type = getApparentType(type);
|
|
return type.flags & 49152 ? getPropertiesOfUnionOrIntersectionType(type) : getPropertiesOfObjectType(type);
|
|
}
|
|
function getApparentTypeOfTypeParameter(type) {
|
|
if (!type.resolvedApparentType) {
|
|
var constraintType = getConstraintOfTypeParameter(type);
|
|
while (constraintType && constraintType.flags & 512) {
|
|
constraintType = getConstraintOfTypeParameter(constraintType);
|
|
}
|
|
type.resolvedApparentType = getTypeWithThisArgument(constraintType || emptyObjectType, type);
|
|
}
|
|
return type.resolvedApparentType;
|
|
}
|
|
function getApparentType(type) {
|
|
if (type.flags & 512) {
|
|
type = getApparentTypeOfTypeParameter(type);
|
|
}
|
|
if (type.flags & 258) {
|
|
type = globalStringType;
|
|
}
|
|
else if (type.flags & 132) {
|
|
type = globalNumberType;
|
|
}
|
|
else if (type.flags & 8) {
|
|
type = globalBooleanType;
|
|
}
|
|
else if (type.flags & 16777216) {
|
|
type = getGlobalESSymbolType();
|
|
}
|
|
return type;
|
|
}
|
|
function createUnionOrIntersectionProperty(containingType, name) {
|
|
var types = containingType.types;
|
|
var props;
|
|
var commonFlags = (containingType.flags & 32768) ? 536870912 : 0;
|
|
var isReadonly = false;
|
|
for (var _i = 0, types_2 = types; _i < types_2.length; _i++) {
|
|
var current = types_2[_i];
|
|
var type = getApparentType(current);
|
|
if (type !== unknownType) {
|
|
var prop = getPropertyOfType(type, name);
|
|
if (prop && !(getDeclarationFlagsFromSymbol(prop) & (8 | 16))) {
|
|
commonFlags &= prop.flags;
|
|
if (!props) {
|
|
props = [prop];
|
|
}
|
|
else if (!ts.contains(props, prop)) {
|
|
props.push(prop);
|
|
}
|
|
if (isReadonlySymbol(prop)) {
|
|
isReadonly = true;
|
|
}
|
|
}
|
|
else if (containingType.flags & 16384) {
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
if (!props) {
|
|
return undefined;
|
|
}
|
|
if (props.length === 1) {
|
|
return props[0];
|
|
}
|
|
var propTypes = [];
|
|
var declarations = [];
|
|
for (var _a = 0, props_1 = props; _a < props_1.length; _a++) {
|
|
var prop = props_1[_a];
|
|
if (prop.declarations) {
|
|
ts.addRange(declarations, prop.declarations);
|
|
}
|
|
propTypes.push(getTypeOfSymbol(prop));
|
|
}
|
|
var result = createSymbol(4 |
|
|
67108864 |
|
|
268435456 |
|
|
commonFlags, name);
|
|
result.containingType = containingType;
|
|
result.declarations = declarations;
|
|
result.isReadonly = isReadonly;
|
|
result.type = containingType.flags & 16384 ? getUnionType(propTypes) : getIntersectionType(propTypes);
|
|
return result;
|
|
}
|
|
function getPropertyOfUnionOrIntersectionType(type, name) {
|
|
var properties = type.resolvedProperties || (type.resolvedProperties = {});
|
|
if (ts.hasProperty(properties, name)) {
|
|
return properties[name];
|
|
}
|
|
var property = createUnionOrIntersectionProperty(type, name);
|
|
if (property) {
|
|
properties[name] = property;
|
|
}
|
|
return property;
|
|
}
|
|
function getPropertyOfType(type, name) {
|
|
type = getApparentType(type);
|
|
if (type.flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if (ts.hasProperty(resolved.members, name)) {
|
|
var symbol = resolved.members[name];
|
|
if (symbolIsValue(symbol)) {
|
|
return symbol;
|
|
}
|
|
}
|
|
if (resolved === anyFunctionType || resolved.callSignatures.length || resolved.constructSignatures.length) {
|
|
var symbol = getPropertyOfObjectType(globalFunctionType, name);
|
|
if (symbol) {
|
|
return symbol;
|
|
}
|
|
}
|
|
return getPropertyOfObjectType(globalObjectType, name);
|
|
}
|
|
if (type.flags & 49152) {
|
|
return getPropertyOfUnionOrIntersectionType(type, name);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getSignaturesOfStructuredType(type, kind) {
|
|
if (type.flags & 130048) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
return kind === 0 ? resolved.callSignatures : resolved.constructSignatures;
|
|
}
|
|
return emptyArray;
|
|
}
|
|
function getSignaturesOfType(type, kind) {
|
|
return getSignaturesOfStructuredType(getApparentType(type), kind);
|
|
}
|
|
function getIndexInfoOfStructuredType(type, kind) {
|
|
if (type.flags & 130048) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
return kind === 0 ? resolved.stringIndexInfo : resolved.numberIndexInfo;
|
|
}
|
|
}
|
|
function getIndexTypeOfStructuredType(type, kind) {
|
|
var info = getIndexInfoOfStructuredType(type, kind);
|
|
return info && info.type;
|
|
}
|
|
function getIndexInfoOfType(type, kind) {
|
|
return getIndexInfoOfStructuredType(getApparentType(type), kind);
|
|
}
|
|
function getIndexTypeOfType(type, kind) {
|
|
return getIndexTypeOfStructuredType(getApparentType(type), kind);
|
|
}
|
|
function getImplicitIndexTypeOfType(type, kind) {
|
|
if (isObjectLiteralType(type)) {
|
|
var propTypes = [];
|
|
for (var _i = 0, _a = getPropertiesOfType(type); _i < _a.length; _i++) {
|
|
var prop = _a[_i];
|
|
if (kind === 0 || isNumericLiteralName(prop.name)) {
|
|
propTypes.push(getTypeOfSymbol(prop));
|
|
}
|
|
}
|
|
if (propTypes.length) {
|
|
return getUnionType(propTypes);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getTypeParametersFromJSDocTemplate(declaration) {
|
|
if (declaration.flags & 134217728) {
|
|
var templateTag = ts.getJSDocTemplateTag(declaration);
|
|
if (templateTag) {
|
|
return getTypeParametersFromDeclaration(templateTag.typeParameters);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getTypeParametersFromDeclaration(typeParameterDeclarations) {
|
|
var result = [];
|
|
ts.forEach(typeParameterDeclarations, function (node) {
|
|
var tp = getDeclaredTypeOfTypeParameter(node.symbol);
|
|
if (!ts.contains(result, tp)) {
|
|
result.push(tp);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
function symbolsToArray(symbols) {
|
|
var result = [];
|
|
for (var id in symbols) {
|
|
if (!isReservedMemberName(id)) {
|
|
result.push(symbols[id]);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function isJSDocOptionalParameter(node) {
|
|
if (node.flags & 134217728) {
|
|
if (node.type && node.type.kind === 268) {
|
|
return true;
|
|
}
|
|
var paramTag = ts.getCorrespondingJSDocParameterTag(node);
|
|
if (paramTag) {
|
|
if (paramTag.isBracketed) {
|
|
return true;
|
|
}
|
|
if (paramTag.typeExpression) {
|
|
return paramTag.typeExpression.type.kind === 268;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isOptionalParameter(node) {
|
|
if (ts.hasQuestionToken(node) || isJSDocOptionalParameter(node)) {
|
|
return true;
|
|
}
|
|
if (node.initializer) {
|
|
var signatureDeclaration = node.parent;
|
|
var signature = getSignatureFromDeclaration(signatureDeclaration);
|
|
var parameterIndex = ts.indexOf(signatureDeclaration.parameters, node);
|
|
ts.Debug.assert(parameterIndex >= 0);
|
|
return parameterIndex >= signature.minArgumentCount;
|
|
}
|
|
return false;
|
|
}
|
|
function createTypePredicateFromTypePredicateNode(node) {
|
|
if (node.parameterName.kind === 69) {
|
|
var parameterName = node.parameterName;
|
|
return {
|
|
kind: 1,
|
|
parameterName: parameterName ? parameterName.text : undefined,
|
|
parameterIndex: parameterName ? getTypePredicateParameterIndex(node.parent.parameters, parameterName) : undefined,
|
|
type: getTypeFromTypeNode(node.type)
|
|
};
|
|
}
|
|
else {
|
|
return {
|
|
kind: 0,
|
|
type: getTypeFromTypeNode(node.type)
|
|
};
|
|
}
|
|
}
|
|
function getSignatureFromDeclaration(declaration) {
|
|
var links = getNodeLinks(declaration);
|
|
if (!links.resolvedSignature) {
|
|
var parameters = [];
|
|
var hasStringLiterals = false;
|
|
var minArgumentCount = -1;
|
|
var thisParameter = undefined;
|
|
var hasThisParameter = void 0;
|
|
var isJSConstructSignature = ts.isJSDocConstructSignature(declaration);
|
|
for (var i = isJSConstructSignature ? 1 : 0, n = declaration.parameters.length; i < n; i++) {
|
|
var param = declaration.parameters[i];
|
|
var paramSymbol = param.symbol;
|
|
if (paramSymbol && !!(paramSymbol.flags & 4) && !ts.isBindingPattern(param.name)) {
|
|
var resolvedSymbol = resolveName(param, paramSymbol.name, 107455, undefined, undefined);
|
|
paramSymbol = resolvedSymbol;
|
|
}
|
|
if (i === 0 && paramSymbol.name === "this") {
|
|
hasThisParameter = true;
|
|
thisParameter = param.symbol;
|
|
}
|
|
else {
|
|
parameters.push(paramSymbol);
|
|
}
|
|
if (param.type && param.type.kind === 166) {
|
|
hasStringLiterals = true;
|
|
}
|
|
if (param.initializer || param.questionToken || param.dotDotDotToken || isJSDocOptionalParameter(param)) {
|
|
if (minArgumentCount < 0) {
|
|
minArgumentCount = i - (hasThisParameter ? 1 : 0);
|
|
}
|
|
}
|
|
else {
|
|
minArgumentCount = -1;
|
|
}
|
|
}
|
|
if ((declaration.kind === 149 || declaration.kind === 150) &&
|
|
!ts.hasDynamicName(declaration) &&
|
|
(!hasThisParameter || !thisParameter)) {
|
|
var otherKind = declaration.kind === 149 ? 150 : 149;
|
|
var other = ts.getDeclarationOfKind(declaration.symbol, otherKind);
|
|
if (other) {
|
|
thisParameter = getAnnotatedAccessorThisParameter(other);
|
|
}
|
|
}
|
|
if (minArgumentCount < 0) {
|
|
minArgumentCount = declaration.parameters.length - (hasThisParameter ? 1 : 0);
|
|
}
|
|
if (isJSConstructSignature) {
|
|
minArgumentCount--;
|
|
}
|
|
var classType = declaration.kind === 148 ?
|
|
getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol))
|
|
: undefined;
|
|
var typeParameters = classType ? classType.localTypeParameters :
|
|
declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) :
|
|
getTypeParametersFromJSDocTemplate(declaration);
|
|
var returnType = getSignatureReturnTypeFromDeclaration(declaration, minArgumentCount, isJSConstructSignature, classType);
|
|
var typePredicate = declaration.type && declaration.type.kind === 154 ?
|
|
createTypePredicateFromTypePredicateNode(declaration.type) :
|
|
undefined;
|
|
links.resolvedSignature = createSignature(declaration, typeParameters, thisParameter, parameters, returnType, typePredicate, minArgumentCount, ts.hasRestParameter(declaration), hasStringLiterals);
|
|
}
|
|
return links.resolvedSignature;
|
|
}
|
|
function getSignatureReturnTypeFromDeclaration(declaration, minArgumentCount, isJSConstructSignature, classType) {
|
|
if (isJSConstructSignature) {
|
|
return getTypeFromTypeNode(declaration.parameters[0].type);
|
|
}
|
|
else if (classType) {
|
|
return classType;
|
|
}
|
|
else if (declaration.type) {
|
|
return getTypeFromTypeNode(declaration.type);
|
|
}
|
|
if (declaration.flags & 134217728) {
|
|
var type = getReturnTypeFromJSDocComment(declaration);
|
|
if (type && type !== unknownType) {
|
|
return type;
|
|
}
|
|
}
|
|
if (declaration.kind === 149 && !ts.hasDynamicName(declaration)) {
|
|
var setter = ts.getDeclarationOfKind(declaration.symbol, 150);
|
|
return getAnnotatedAccessorType(setter);
|
|
}
|
|
if (ts.nodeIsMissing(declaration.body)) {
|
|
return anyType;
|
|
}
|
|
}
|
|
function getSignaturesOfSymbol(symbol) {
|
|
if (!symbol)
|
|
return emptyArray;
|
|
var result = [];
|
|
for (var i = 0, len = symbol.declarations.length; i < len; i++) {
|
|
var node = symbol.declarations[i];
|
|
switch (node.kind) {
|
|
case 156:
|
|
case 157:
|
|
case 220:
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 149:
|
|
case 150:
|
|
case 179:
|
|
case 180:
|
|
case 269:
|
|
if (i > 0 && node.body) {
|
|
var previous = symbol.declarations[i - 1];
|
|
if (node.parent === previous.parent && node.kind === previous.kind && node.pos === previous.end) {
|
|
break;
|
|
}
|
|
}
|
|
result.push(getSignatureFromDeclaration(node));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function resolveExternalModuleTypeByLiteral(name) {
|
|
var moduleSym = resolveExternalModuleName(name, name);
|
|
if (moduleSym) {
|
|
var resolvedModuleSymbol = resolveExternalModuleSymbol(moduleSym);
|
|
if (resolvedModuleSymbol) {
|
|
return getTypeOfSymbol(resolvedModuleSymbol);
|
|
}
|
|
}
|
|
return anyType;
|
|
}
|
|
function getThisTypeOfSignature(signature) {
|
|
if (signature.thisParameter) {
|
|
return getTypeOfSymbol(signature.thisParameter);
|
|
}
|
|
}
|
|
function getReturnTypeOfSignature(signature) {
|
|
if (!signature.resolvedReturnType) {
|
|
if (!pushTypeResolution(signature, 3)) {
|
|
return unknownType;
|
|
}
|
|
var type = void 0;
|
|
if (signature.target) {
|
|
type = instantiateType(getReturnTypeOfSignature(signature.target), signature.mapper);
|
|
}
|
|
else if (signature.unionSignatures) {
|
|
type = getUnionType(ts.map(signature.unionSignatures, getReturnTypeOfSignature));
|
|
}
|
|
else {
|
|
type = getReturnTypeFromBody(signature.declaration);
|
|
}
|
|
if (!popTypeResolution()) {
|
|
type = anyType;
|
|
if (compilerOptions.noImplicitAny) {
|
|
var declaration = signature.declaration;
|
|
if (declaration.name) {
|
|
error(declaration.name, ts.Diagnostics._0_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions, ts.declarationNameToString(declaration.name));
|
|
}
|
|
else {
|
|
error(declaration, ts.Diagnostics.Function_implicitly_has_return_type_any_because_it_does_not_have_a_return_type_annotation_and_is_referenced_directly_or_indirectly_in_one_of_its_return_expressions);
|
|
}
|
|
}
|
|
}
|
|
signature.resolvedReturnType = type;
|
|
}
|
|
return signature.resolvedReturnType;
|
|
}
|
|
function getRestTypeOfSignature(signature) {
|
|
if (signature.hasRestParameter) {
|
|
var type = getTypeOfSymbol(ts.lastOrUndefined(signature.parameters));
|
|
if (type.flags & 4096 && type.target === globalArrayType) {
|
|
return type.typeArguments[0];
|
|
}
|
|
}
|
|
return anyType;
|
|
}
|
|
function getSignatureInstantiation(signature, typeArguments) {
|
|
return instantiateSignature(signature, createTypeMapper(signature.typeParameters, typeArguments), true);
|
|
}
|
|
function getErasedSignature(signature) {
|
|
if (!signature.typeParameters)
|
|
return signature;
|
|
if (!signature.erasedSignatureCache) {
|
|
signature.erasedSignatureCache = instantiateSignature(signature, createTypeEraser(signature.typeParameters), true);
|
|
}
|
|
return signature.erasedSignatureCache;
|
|
}
|
|
function getOrCreateTypeFromSignature(signature) {
|
|
if (!signature.isolatedSignatureType) {
|
|
var isConstructor = signature.declaration.kind === 148 || signature.declaration.kind === 152;
|
|
var type = createObjectType(65536 | 262144);
|
|
type.members = emptySymbols;
|
|
type.properties = emptyArray;
|
|
type.callSignatures = !isConstructor ? [signature] : emptyArray;
|
|
type.constructSignatures = isConstructor ? [signature] : emptyArray;
|
|
signature.isolatedSignatureType = type;
|
|
}
|
|
return signature.isolatedSignatureType;
|
|
}
|
|
function getIndexSymbol(symbol) {
|
|
return symbol.members["__index"];
|
|
}
|
|
function getIndexDeclarationOfSymbol(symbol, kind) {
|
|
var syntaxKind = kind === 1 ? 130 : 132;
|
|
var indexSymbol = getIndexSymbol(symbol);
|
|
if (indexSymbol) {
|
|
for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
var node = decl;
|
|
if (node.parameters.length === 1) {
|
|
var parameter = node.parameters[0];
|
|
if (parameter && parameter.type && parameter.type.kind === syntaxKind) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function createIndexInfo(type, isReadonly, declaration) {
|
|
return { type: type, isReadonly: isReadonly, declaration: declaration };
|
|
}
|
|
function getIndexInfoOfSymbol(symbol, kind) {
|
|
var declaration = getIndexDeclarationOfSymbol(symbol, kind);
|
|
if (declaration) {
|
|
return createIndexInfo(declaration.type ? getTypeFromTypeNode(declaration.type) : anyType, (declaration.flags & 64) !== 0, declaration);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getConstraintDeclaration(type) {
|
|
return ts.getDeclarationOfKind(type.symbol, 141).constraint;
|
|
}
|
|
function hasConstraintReferenceTo(type, target) {
|
|
var checked;
|
|
while (type && !(type.flags & 33554432) && type.flags & 512 && !ts.contains(checked, type)) {
|
|
if (type === target) {
|
|
return true;
|
|
}
|
|
(checked || (checked = [])).push(type);
|
|
var constraintDeclaration = getConstraintDeclaration(type);
|
|
type = constraintDeclaration && getTypeFromTypeNode(constraintDeclaration);
|
|
}
|
|
return false;
|
|
}
|
|
function getConstraintOfTypeParameter(typeParameter) {
|
|
if (!typeParameter.constraint) {
|
|
if (typeParameter.target) {
|
|
var targetConstraint = getConstraintOfTypeParameter(typeParameter.target);
|
|
typeParameter.constraint = targetConstraint ? instantiateType(targetConstraint, typeParameter.mapper) : noConstraintType;
|
|
}
|
|
else {
|
|
var constraintDeclaration = getConstraintDeclaration(typeParameter);
|
|
var constraint = getTypeFromTypeNode(constraintDeclaration);
|
|
if (hasConstraintReferenceTo(constraint, typeParameter)) {
|
|
error(constraintDeclaration, ts.Diagnostics.Type_parameter_0_has_a_circular_constraint, typeToString(typeParameter));
|
|
constraint = unknownType;
|
|
}
|
|
typeParameter.constraint = constraint;
|
|
}
|
|
}
|
|
return typeParameter.constraint === noConstraintType ? undefined : typeParameter.constraint;
|
|
}
|
|
function getParentSymbolOfTypeParameter(typeParameter) {
|
|
return getSymbolOfNode(ts.getDeclarationOfKind(typeParameter.symbol, 141).parent);
|
|
}
|
|
function getTypeListId(types) {
|
|
if (types) {
|
|
switch (types.length) {
|
|
case 1:
|
|
return "" + types[0].id;
|
|
case 2:
|
|
return types[0].id + "," + types[1].id;
|
|
default:
|
|
var result = "";
|
|
for (var i = 0; i < types.length; i++) {
|
|
if (i > 0) {
|
|
result += ",";
|
|
}
|
|
result += types[i].id;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
function getPropagatingFlagsOfTypes(types, excludeKinds) {
|
|
var result = 0;
|
|
for (var _i = 0, types_3 = types; _i < types_3.length; _i++) {
|
|
var type = types_3[_i];
|
|
if (!(type.flags & excludeKinds)) {
|
|
result |= type.flags;
|
|
}
|
|
}
|
|
return result & 14680064;
|
|
}
|
|
function createTypeReference(target, typeArguments) {
|
|
var id = getTypeListId(typeArguments);
|
|
var type = target.instantiations[id];
|
|
if (!type) {
|
|
var propagatedFlags = typeArguments ? getPropagatingFlagsOfTypes(typeArguments, 0) : 0;
|
|
var flags = 4096 | propagatedFlags;
|
|
type = target.instantiations[id] = createObjectType(flags, target.symbol);
|
|
type.target = target;
|
|
type.typeArguments = typeArguments;
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeFromClassOrInterfaceReference(node, symbol) {
|
|
var type = getDeclaredTypeOfSymbol(getMergedSymbol(symbol));
|
|
var typeParameters = type.localTypeParameters;
|
|
if (typeParameters) {
|
|
if (!node.typeArguments || node.typeArguments.length !== typeParameters.length) {
|
|
error(node, ts.Diagnostics.Generic_type_0_requires_1_type_argument_s, typeToString(type, undefined, 1), typeParameters.length);
|
|
return unknownType;
|
|
}
|
|
return createTypeReference(type, ts.concatenate(type.outerTypeParameters, ts.map(node.typeArguments, getTypeFromTypeNode)));
|
|
}
|
|
if (node.typeArguments) {
|
|
error(node, ts.Diagnostics.Type_0_is_not_generic, typeToString(type));
|
|
return unknownType;
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeFromTypeAliasReference(node, symbol) {
|
|
var type = getDeclaredTypeOfSymbol(symbol);
|
|
var links = getSymbolLinks(symbol);
|
|
var typeParameters = links.typeParameters;
|
|
if (typeParameters) {
|
|
if (!node.typeArguments || node.typeArguments.length !== typeParameters.length) {
|
|
error(node, ts.Diagnostics.Generic_type_0_requires_1_type_argument_s, symbolToString(symbol), typeParameters.length);
|
|
return unknownType;
|
|
}
|
|
var typeArguments = ts.map(node.typeArguments, getTypeFromTypeNode);
|
|
var id = getTypeListId(typeArguments);
|
|
return links.instantiations[id] || (links.instantiations[id] = instantiateType(type, createTypeMapper(typeParameters, typeArguments)));
|
|
}
|
|
if (node.typeArguments) {
|
|
error(node, ts.Diagnostics.Type_0_is_not_generic, symbolToString(symbol));
|
|
return unknownType;
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeFromNonGenericTypeReference(node, symbol) {
|
|
if (node.typeArguments) {
|
|
error(node, ts.Diagnostics.Type_0_is_not_generic, symbolToString(symbol));
|
|
return unknownType;
|
|
}
|
|
return getDeclaredTypeOfSymbol(symbol);
|
|
}
|
|
function getTypeReferenceName(node) {
|
|
switch (node.kind) {
|
|
case 155:
|
|
return node.typeName;
|
|
case 267:
|
|
return node.name;
|
|
case 194:
|
|
if (ts.isSupportedExpressionWithTypeArguments(node)) {
|
|
return node.expression;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function resolveTypeReferenceName(node, typeReferenceName) {
|
|
if (!typeReferenceName) {
|
|
return unknownSymbol;
|
|
}
|
|
return resolveEntityName(typeReferenceName, 793056) || unknownSymbol;
|
|
}
|
|
function getTypeReferenceType(node, symbol) {
|
|
if (symbol === unknownSymbol) {
|
|
return unknownType;
|
|
}
|
|
if (symbol.flags & (32 | 64)) {
|
|
return getTypeFromClassOrInterfaceReference(node, symbol);
|
|
}
|
|
if (symbol.flags & 524288) {
|
|
return getTypeFromTypeAliasReference(node, symbol);
|
|
}
|
|
if (symbol.flags & 107455 && node.kind === 267) {
|
|
return getTypeOfSymbol(symbol);
|
|
}
|
|
return getTypeFromNonGenericTypeReference(node, symbol);
|
|
}
|
|
function getTypeFromTypeReference(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
var symbol = void 0;
|
|
var type = void 0;
|
|
if (node.kind === 267) {
|
|
var typeReferenceName = getTypeReferenceName(node);
|
|
symbol = resolveTypeReferenceName(node, typeReferenceName);
|
|
type = getTypeReferenceType(node, symbol);
|
|
links.resolvedSymbol = symbol;
|
|
links.resolvedType = type;
|
|
}
|
|
else {
|
|
var typeNameOrExpression = node.kind === 155 ? node.typeName :
|
|
ts.isSupportedExpressionWithTypeArguments(node) ? node.expression :
|
|
undefined;
|
|
symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793056) || unknownSymbol;
|
|
type = symbol === unknownSymbol ? unknownType :
|
|
symbol.flags & (32 | 64) ? getTypeFromClassOrInterfaceReference(node, symbol) :
|
|
symbol.flags & 524288 ? getTypeFromTypeAliasReference(node, symbol) :
|
|
getTypeFromNonGenericTypeReference(node, symbol);
|
|
}
|
|
links.resolvedSymbol = symbol;
|
|
links.resolvedType = type;
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeFromTypeQueryNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = getWidenedType(checkExpression(node.exprName));
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeOfGlobalSymbol(symbol, arity) {
|
|
function getTypeDeclaration(symbol) {
|
|
var declarations = symbol.declarations;
|
|
for (var _i = 0, declarations_3 = declarations; _i < declarations_3.length; _i++) {
|
|
var declaration = declarations_3[_i];
|
|
switch (declaration.kind) {
|
|
case 221:
|
|
case 222:
|
|
case 224:
|
|
return declaration;
|
|
}
|
|
}
|
|
}
|
|
if (!symbol) {
|
|
return arity ? emptyGenericType : emptyObjectType;
|
|
}
|
|
var type = getDeclaredTypeOfSymbol(symbol);
|
|
if (!(type.flags & 80896)) {
|
|
error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_be_a_class_or_interface_type, symbol.name);
|
|
return arity ? emptyGenericType : emptyObjectType;
|
|
}
|
|
if ((type.typeParameters ? type.typeParameters.length : 0) !== arity) {
|
|
error(getTypeDeclaration(symbol), ts.Diagnostics.Global_type_0_must_have_1_type_parameter_s, symbol.name, arity);
|
|
return arity ? emptyGenericType : emptyObjectType;
|
|
}
|
|
return type;
|
|
}
|
|
function getGlobalValueSymbol(name) {
|
|
return getGlobalSymbol(name, 107455, ts.Diagnostics.Cannot_find_global_value_0);
|
|
}
|
|
function getGlobalTypeSymbol(name) {
|
|
return getGlobalSymbol(name, 793056, ts.Diagnostics.Cannot_find_global_type_0);
|
|
}
|
|
function getGlobalSymbol(name, meaning, diagnostic) {
|
|
return resolveName(undefined, name, meaning, diagnostic, name);
|
|
}
|
|
function getGlobalType(name, arity) {
|
|
if (arity === void 0) { arity = 0; }
|
|
return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), arity);
|
|
}
|
|
function getExportedTypeFromNamespace(namespace, name) {
|
|
var namespaceSymbol = getGlobalSymbol(namespace, 1536, undefined);
|
|
var typeSymbol = namespaceSymbol && getSymbol(namespaceSymbol.exports, name, 793056);
|
|
return typeSymbol && getDeclaredTypeOfSymbol(typeSymbol);
|
|
}
|
|
function createTypedPropertyDescriptorType(propertyType) {
|
|
var globalTypedPropertyDescriptorType = getGlobalTypedPropertyDescriptorType();
|
|
return globalTypedPropertyDescriptorType !== emptyGenericType
|
|
? createTypeReference(globalTypedPropertyDescriptorType, [propertyType])
|
|
: emptyObjectType;
|
|
}
|
|
function createTypeFromGenericGlobalType(genericGlobalType, typeArguments) {
|
|
return genericGlobalType !== emptyGenericType ? createTypeReference(genericGlobalType, typeArguments) : emptyObjectType;
|
|
}
|
|
function createIterableType(elementType) {
|
|
return createTypeFromGenericGlobalType(getGlobalIterableType(), [elementType]);
|
|
}
|
|
function createIterableIteratorType(elementType) {
|
|
return createTypeFromGenericGlobalType(getGlobalIterableIteratorType(), [elementType]);
|
|
}
|
|
function createArrayType(elementType) {
|
|
return createTypeFromGenericGlobalType(globalArrayType, [elementType]);
|
|
}
|
|
function getTypeFromArrayTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = createArrayType(getTypeFromTypeNode(node.elementType));
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function createTupleType(elementTypes) {
|
|
var id = getTypeListId(elementTypes);
|
|
return tupleTypes[id] || (tupleTypes[id] = createNewTupleType(elementTypes));
|
|
}
|
|
function createNewTupleType(elementTypes) {
|
|
var propagatedFlags = getPropagatingFlagsOfTypes(elementTypes, 0);
|
|
var type = createObjectType(8192 | propagatedFlags);
|
|
type.elementTypes = elementTypes;
|
|
return type;
|
|
}
|
|
function getTypeFromTupleTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = createTupleType(ts.map(node.elementTypes, getTypeFromTypeNode));
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function addTypeToSet(typeSet, type, typeSetKind) {
|
|
if (type.flags & typeSetKind) {
|
|
addTypesToSet(typeSet, type.types, typeSetKind);
|
|
}
|
|
else if (type.flags & (1 | 32 | 64)) {
|
|
if (type.flags & 1)
|
|
typeSet.containsAny = true;
|
|
if (type.flags & 32)
|
|
typeSet.containsUndefined = true;
|
|
if (type.flags & 64)
|
|
typeSet.containsNull = true;
|
|
if (!(type.flags & 2097152))
|
|
typeSet.containsNonWideningType = true;
|
|
}
|
|
else if (type !== neverType && !ts.contains(typeSet, type)) {
|
|
typeSet.push(type);
|
|
}
|
|
}
|
|
function addTypesToSet(typeSet, types, typeSetKind) {
|
|
for (var _i = 0, types_4 = types; _i < types_4.length; _i++) {
|
|
var type = types_4[_i];
|
|
addTypeToSet(typeSet, type, typeSetKind);
|
|
}
|
|
}
|
|
function isSubtypeOfAny(candidate, types) {
|
|
for (var i = 0, len = types.length; i < len; i++) {
|
|
if (candidate !== types[i] && isTypeSubtypeOf(candidate, types[i])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function removeSubtypes(types) {
|
|
var i = types.length;
|
|
while (i > 0) {
|
|
i--;
|
|
if (isSubtypeOfAny(types[i], types)) {
|
|
types.splice(i, 1);
|
|
}
|
|
}
|
|
}
|
|
function getUnionType(types, noSubtypeReduction) {
|
|
if (types.length === 0) {
|
|
return neverType;
|
|
}
|
|
if (types.length === 1) {
|
|
return types[0];
|
|
}
|
|
var typeSet = [];
|
|
addTypesToSet(typeSet, types, 16384);
|
|
if (typeSet.containsAny) {
|
|
return anyType;
|
|
}
|
|
if (strictNullChecks) {
|
|
if (typeSet.containsNull)
|
|
typeSet.push(nullType);
|
|
if (typeSet.containsUndefined)
|
|
typeSet.push(undefinedType);
|
|
}
|
|
if (!noSubtypeReduction) {
|
|
removeSubtypes(typeSet);
|
|
}
|
|
if (typeSet.length === 0) {
|
|
return typeSet.containsNull ? typeSet.containsNonWideningType ? nullType : nullWideningType :
|
|
typeSet.containsUndefined ? typeSet.containsNonWideningType ? undefinedType : undefinedWideningType :
|
|
neverType;
|
|
}
|
|
else if (typeSet.length === 1) {
|
|
return typeSet[0];
|
|
}
|
|
var id = getTypeListId(typeSet);
|
|
var type = unionTypes[id];
|
|
if (!type) {
|
|
var propagatedFlags = getPropagatingFlagsOfTypes(typeSet, 96);
|
|
type = unionTypes[id] = createObjectType(16384 | propagatedFlags);
|
|
type.types = typeSet;
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeFromUnionTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = getUnionType(ts.map(node.types, getTypeFromTypeNode), true);
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getIntersectionType(types) {
|
|
if (types.length === 0) {
|
|
return emptyObjectType;
|
|
}
|
|
var typeSet = [];
|
|
addTypesToSet(typeSet, types, 32768);
|
|
if (typeSet.containsAny) {
|
|
return anyType;
|
|
}
|
|
if (strictNullChecks) {
|
|
if (typeSet.containsNull)
|
|
typeSet.push(nullType);
|
|
if (typeSet.containsUndefined)
|
|
typeSet.push(undefinedType);
|
|
}
|
|
if (typeSet.length === 1) {
|
|
return typeSet[0];
|
|
}
|
|
var id = getTypeListId(typeSet);
|
|
var type = intersectionTypes[id];
|
|
if (!type) {
|
|
var propagatedFlags = getPropagatingFlagsOfTypes(typeSet, 96);
|
|
type = intersectionTypes[id] = createObjectType(32768 | propagatedFlags);
|
|
type.types = typeSet;
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeFromIntersectionTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = getIntersectionType(ts.map(node.types, getTypeFromTypeNode));
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = createObjectType(65536, node.symbol);
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getStringLiteralTypeForText(text) {
|
|
if (ts.hasProperty(stringLiteralTypes, text)) {
|
|
return stringLiteralTypes[text];
|
|
}
|
|
var type = stringLiteralTypes[text] = createType(256);
|
|
type.text = text;
|
|
return type;
|
|
}
|
|
function getTypeFromStringLiteralTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = getStringLiteralTypeForText(ts.unescapeIdentifier(node.text));
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeFromJSDocVariadicType(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
var type = getTypeFromTypeNode(node.type);
|
|
links.resolvedType = type ? createArrayType(type) : unknownType;
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeFromJSDocTupleType(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
var types = ts.map(node.types, getTypeFromTypeNode);
|
|
links.resolvedType = createTupleType(types);
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getThisType(node) {
|
|
var container = ts.getThisContainer(node, false);
|
|
var parent = container && container.parent;
|
|
if (parent && (ts.isClassLike(parent) || parent.kind === 222)) {
|
|
if (!(container.flags & 32) &&
|
|
(container.kind !== 148 || ts.isNodeDescendentOf(node, container.body))) {
|
|
return getDeclaredTypeOfClassOrInterface(getSymbolOfNode(parent)).thisType;
|
|
}
|
|
}
|
|
error(node, ts.Diagnostics.A_this_type_is_available_only_in_a_non_static_member_of_a_class_or_interface);
|
|
return unknownType;
|
|
}
|
|
function getTypeFromThisTypeNode(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = getThisType(node);
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getTypeFromTypeNode(node) {
|
|
switch (node.kind) {
|
|
case 117:
|
|
case 258:
|
|
case 259:
|
|
return anyType;
|
|
case 132:
|
|
return stringType;
|
|
case 130:
|
|
return numberType;
|
|
case 120:
|
|
return booleanType;
|
|
case 133:
|
|
return esSymbolType;
|
|
case 103:
|
|
return voidType;
|
|
case 135:
|
|
return undefinedType;
|
|
case 93:
|
|
return nullType;
|
|
case 127:
|
|
return neverType;
|
|
case 165:
|
|
case 97:
|
|
return getTypeFromThisTypeNode(node);
|
|
case 166:
|
|
return getTypeFromStringLiteralTypeNode(node);
|
|
case 155:
|
|
case 267:
|
|
return getTypeFromTypeReference(node);
|
|
case 154:
|
|
return booleanType;
|
|
case 194:
|
|
return getTypeFromTypeReference(node);
|
|
case 158:
|
|
return getTypeFromTypeQueryNode(node);
|
|
case 160:
|
|
case 260:
|
|
return getTypeFromArrayTypeNode(node);
|
|
case 161:
|
|
return getTypeFromTupleTypeNode(node);
|
|
case 162:
|
|
case 261:
|
|
return getTypeFromUnionTypeNode(node);
|
|
case 163:
|
|
return getTypeFromIntersectionTypeNode(node);
|
|
case 164:
|
|
case 263:
|
|
case 264:
|
|
case 271:
|
|
case 272:
|
|
case 268:
|
|
return getTypeFromTypeNode(node.type);
|
|
case 156:
|
|
case 157:
|
|
case 159:
|
|
case 281:
|
|
case 269:
|
|
case 265:
|
|
return getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
|
|
case 69:
|
|
case 139:
|
|
var symbol = getSymbolAtLocation(node);
|
|
return symbol && getDeclaredTypeOfSymbol(symbol);
|
|
case 262:
|
|
return getTypeFromJSDocTupleType(node);
|
|
case 270:
|
|
return getTypeFromJSDocVariadicType(node);
|
|
default:
|
|
return unknownType;
|
|
}
|
|
}
|
|
function instantiateList(items, mapper, instantiator) {
|
|
if (items && items.length) {
|
|
var result = [];
|
|
for (var _i = 0, items_1 = items; _i < items_1.length; _i++) {
|
|
var v = items_1[_i];
|
|
result.push(instantiator(v, mapper));
|
|
}
|
|
return result;
|
|
}
|
|
return items;
|
|
}
|
|
function createUnaryTypeMapper(source, target) {
|
|
return function (t) { return t === source ? target : t; };
|
|
}
|
|
function createBinaryTypeMapper(source1, target1, source2, target2) {
|
|
return function (t) { return t === source1 ? target1 : t === source2 ? target2 : t; };
|
|
}
|
|
function createArrayTypeMapper(sources, targets) {
|
|
return function (t) {
|
|
for (var i = 0; i < sources.length; i++) {
|
|
if (t === sources[i]) {
|
|
return targets ? targets[i] : anyType;
|
|
}
|
|
}
|
|
return t;
|
|
};
|
|
}
|
|
function createTypeMapper(sources, targets) {
|
|
var count = sources.length;
|
|
var mapper = count == 1 ? createUnaryTypeMapper(sources[0], targets ? targets[0] : anyType) :
|
|
count == 2 ? createBinaryTypeMapper(sources[0], targets ? targets[0] : anyType, sources[1], targets ? targets[1] : anyType) :
|
|
createArrayTypeMapper(sources, targets);
|
|
mapper.mappedTypes = sources;
|
|
return mapper;
|
|
}
|
|
function createTypeEraser(sources) {
|
|
return createTypeMapper(sources, undefined);
|
|
}
|
|
function getInferenceMapper(context) {
|
|
if (!context.mapper) {
|
|
var mapper = function (t) {
|
|
var typeParameters = context.typeParameters;
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
if (t === typeParameters[i]) {
|
|
context.inferences[i].isFixed = true;
|
|
return getInferredType(context, i);
|
|
}
|
|
}
|
|
return t;
|
|
};
|
|
mapper.mappedTypes = context.typeParameters;
|
|
mapper.context = context;
|
|
context.mapper = mapper;
|
|
}
|
|
return context.mapper;
|
|
}
|
|
function identityMapper(type) {
|
|
return type;
|
|
}
|
|
function combineTypeMappers(mapper1, mapper2) {
|
|
var mapper = function (t) { return instantiateType(mapper1(t), mapper2); };
|
|
mapper.mappedTypes = mapper1.mappedTypes;
|
|
return mapper;
|
|
}
|
|
function cloneTypeParameter(typeParameter) {
|
|
var result = createType(512);
|
|
result.symbol = typeParameter.symbol;
|
|
result.target = typeParameter;
|
|
return result;
|
|
}
|
|
function cloneTypePredicate(predicate, mapper) {
|
|
if (ts.isIdentifierTypePredicate(predicate)) {
|
|
return {
|
|
kind: 1,
|
|
parameterName: predicate.parameterName,
|
|
parameterIndex: predicate.parameterIndex,
|
|
type: instantiateType(predicate.type, mapper)
|
|
};
|
|
}
|
|
else {
|
|
return {
|
|
kind: 0,
|
|
type: instantiateType(predicate.type, mapper)
|
|
};
|
|
}
|
|
}
|
|
function instantiateSignature(signature, mapper, eraseTypeParameters) {
|
|
var freshTypeParameters;
|
|
var freshTypePredicate;
|
|
if (signature.typeParameters && !eraseTypeParameters) {
|
|
freshTypeParameters = ts.map(signature.typeParameters, cloneTypeParameter);
|
|
mapper = combineTypeMappers(createTypeMapper(signature.typeParameters, freshTypeParameters), mapper);
|
|
for (var _i = 0, freshTypeParameters_1 = freshTypeParameters; _i < freshTypeParameters_1.length; _i++) {
|
|
var tp = freshTypeParameters_1[_i];
|
|
tp.mapper = mapper;
|
|
}
|
|
}
|
|
if (signature.typePredicate) {
|
|
freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper);
|
|
}
|
|
var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasStringLiterals);
|
|
result.target = signature;
|
|
result.mapper = mapper;
|
|
return result;
|
|
}
|
|
function instantiateSymbol(symbol, mapper) {
|
|
if (symbol.flags & 16777216) {
|
|
var links = getSymbolLinks(symbol);
|
|
symbol = links.target;
|
|
mapper = combineTypeMappers(links.mapper, mapper);
|
|
}
|
|
var result = createSymbol(16777216 | 67108864 | symbol.flags, symbol.name);
|
|
result.declarations = symbol.declarations;
|
|
result.parent = symbol.parent;
|
|
result.target = symbol;
|
|
result.mapper = mapper;
|
|
if (symbol.valueDeclaration) {
|
|
result.valueDeclaration = symbol.valueDeclaration;
|
|
}
|
|
return result;
|
|
}
|
|
function instantiateAnonymousType(type, mapper) {
|
|
if (mapper.instantiations) {
|
|
var cachedType = mapper.instantiations[type.id];
|
|
if (cachedType) {
|
|
return cachedType;
|
|
}
|
|
}
|
|
else {
|
|
mapper.instantiations = [];
|
|
}
|
|
var result = createObjectType(65536 | 131072, type.symbol);
|
|
result.target = type;
|
|
result.mapper = mapper;
|
|
mapper.instantiations[type.id] = result;
|
|
return result;
|
|
}
|
|
function isSymbolInScopeOfMappedTypeParameter(symbol, mapper) {
|
|
var mappedTypes = mapper.mappedTypes;
|
|
var node = symbol.declarations[0].parent;
|
|
while (node) {
|
|
switch (node.kind) {
|
|
case 156:
|
|
case 157:
|
|
case 220:
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 149:
|
|
case 150:
|
|
case 179:
|
|
case 180:
|
|
case 221:
|
|
case 192:
|
|
case 222:
|
|
case 223:
|
|
var declaration = node;
|
|
if (declaration.typeParameters) {
|
|
for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) {
|
|
var d = _a[_i];
|
|
if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
if (ts.isClassLike(node) || node.kind === 222) {
|
|
var thisType = getDeclaredTypeOfClassOrInterface(getSymbolOfNode(node)).thisType;
|
|
if (thisType && ts.contains(mappedTypes, thisType)) {
|
|
return true;
|
|
}
|
|
}
|
|
break;
|
|
case 225:
|
|
case 256:
|
|
return false;
|
|
}
|
|
node = node.parent;
|
|
}
|
|
return false;
|
|
}
|
|
function instantiateType(type, mapper) {
|
|
if (type && mapper !== identityMapper) {
|
|
if (type.flags & 512) {
|
|
return mapper(type);
|
|
}
|
|
if (type.flags & 65536) {
|
|
return type.symbol &&
|
|
type.symbol.flags & (16 | 8192 | 32 | 2048 | 4096) &&
|
|
(type.flags & 131072 || isSymbolInScopeOfMappedTypeParameter(type.symbol, mapper)) ?
|
|
instantiateAnonymousType(type, mapper) : type;
|
|
}
|
|
if (type.flags & 4096) {
|
|
return createTypeReference(type.target, instantiateList(type.typeArguments, mapper, instantiateType));
|
|
}
|
|
if (type.flags & 8192) {
|
|
return createTupleType(instantiateList(type.elementTypes, mapper, instantiateType));
|
|
}
|
|
if (type.flags & 16384) {
|
|
return getUnionType(instantiateList(type.types, mapper, instantiateType), true);
|
|
}
|
|
if (type.flags & 32768) {
|
|
return getIntersectionType(instantiateList(type.types, mapper, instantiateType));
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function instantiateIndexInfo(info, mapper) {
|
|
return info && createIndexInfo(instantiateType(info.type, mapper), info.isReadonly, info.declaration);
|
|
}
|
|
function isContextSensitive(node) {
|
|
ts.Debug.assert(node.kind !== 147 || ts.isObjectLiteralMethod(node));
|
|
switch (node.kind) {
|
|
case 179:
|
|
case 180:
|
|
return isContextSensitiveFunctionLikeDeclaration(node);
|
|
case 171:
|
|
return ts.forEach(node.properties, isContextSensitive);
|
|
case 170:
|
|
return ts.forEach(node.elements, isContextSensitive);
|
|
case 188:
|
|
return isContextSensitive(node.whenTrue) ||
|
|
isContextSensitive(node.whenFalse);
|
|
case 187:
|
|
return node.operatorToken.kind === 52 &&
|
|
(isContextSensitive(node.left) || isContextSensitive(node.right));
|
|
case 253:
|
|
return isContextSensitive(node.initializer);
|
|
case 147:
|
|
case 146:
|
|
return isContextSensitiveFunctionLikeDeclaration(node);
|
|
case 178:
|
|
return isContextSensitive(node.expression);
|
|
}
|
|
return false;
|
|
}
|
|
function isContextSensitiveFunctionLikeDeclaration(node) {
|
|
var areAllParametersUntyped = !ts.forEach(node.parameters, function (p) { return p.type; });
|
|
var isNullaryArrow = node.kind === 180 && !node.parameters.length;
|
|
return !node.typeParameters && areAllParametersUntyped && !isNullaryArrow;
|
|
}
|
|
function isContextSensitiveFunctionOrObjectLiteralMethod(func) {
|
|
return (isFunctionExpressionOrArrowFunction(func) || ts.isObjectLiteralMethod(func)) && isContextSensitiveFunctionLikeDeclaration(func);
|
|
}
|
|
function getTypeWithoutSignatures(type) {
|
|
if (type.flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if (resolved.constructSignatures.length) {
|
|
var result = createObjectType(65536, type.symbol);
|
|
result.members = resolved.members;
|
|
result.properties = resolved.properties;
|
|
result.callSignatures = emptyArray;
|
|
result.constructSignatures = emptyArray;
|
|
type = result;
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function isTypeIdenticalTo(source, target) {
|
|
return checkTypeRelatedTo(source, target, identityRelation, undefined);
|
|
}
|
|
function compareTypesIdentical(source, target) {
|
|
return checkTypeRelatedTo(source, target, identityRelation, undefined) ? -1 : 0;
|
|
}
|
|
function compareTypesAssignable(source, target) {
|
|
return checkTypeRelatedTo(source, target, assignableRelation, undefined) ? -1 : 0;
|
|
}
|
|
function isTypeSubtypeOf(source, target) {
|
|
return checkTypeSubtypeOf(source, target, undefined);
|
|
}
|
|
function isTypeAssignableTo(source, target) {
|
|
return checkTypeAssignableTo(source, target, undefined);
|
|
}
|
|
function isTypeComparableTo(source, target) {
|
|
return checkTypeComparableTo(source, target, undefined);
|
|
}
|
|
function areTypesComparable(type1, type2) {
|
|
return isTypeComparableTo(type1, type2) || isTypeComparableTo(type2, type1);
|
|
}
|
|
function checkTypeSubtypeOf(source, target, errorNode, headMessage, containingMessageChain) {
|
|
return checkTypeRelatedTo(source, target, subtypeRelation, errorNode, headMessage, containingMessageChain);
|
|
}
|
|
function checkTypeAssignableTo(source, target, errorNode, headMessage, containingMessageChain) {
|
|
return checkTypeRelatedTo(source, target, assignableRelation, errorNode, headMessage, containingMessageChain);
|
|
}
|
|
function checkTypeComparableTo(source, target, errorNode, headMessage, containingMessageChain) {
|
|
return checkTypeRelatedTo(source, target, comparableRelation, errorNode, headMessage, containingMessageChain);
|
|
}
|
|
function isSignatureAssignableTo(source, target, ignoreReturnTypes) {
|
|
return compareSignaturesRelated(source, target, ignoreReturnTypes, false, undefined, compareTypesAssignable) !== 0;
|
|
}
|
|
function compareSignaturesRelated(source, target, ignoreReturnTypes, reportErrors, errorReporter, compareTypes) {
|
|
if (source === target) {
|
|
return -1;
|
|
}
|
|
if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) {
|
|
return 0;
|
|
}
|
|
source = getErasedSignature(source);
|
|
target = getErasedSignature(target);
|
|
var result = -1;
|
|
var sourceThisType = getThisTypeOfSignature(source);
|
|
if (sourceThisType && sourceThisType !== voidType) {
|
|
var targetThisType = getThisTypeOfSignature(target);
|
|
if (targetThisType) {
|
|
var related = compareTypes(sourceThisType, targetThisType, false)
|
|
|| compareTypes(targetThisType, sourceThisType, reportErrors);
|
|
if (!related) {
|
|
if (reportErrors) {
|
|
errorReporter(ts.Diagnostics.The_this_types_of_each_signature_are_incompatible);
|
|
}
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
}
|
|
var sourceMax = getNumNonRestParameters(source);
|
|
var targetMax = getNumNonRestParameters(target);
|
|
var checkCount = getNumParametersToCheckForSignatureRelatability(source, sourceMax, target, targetMax);
|
|
var sourceParams = source.parameters;
|
|
var targetParams = target.parameters;
|
|
for (var i = 0; i < checkCount; i++) {
|
|
var s = i < sourceMax ? getTypeOfParameter(sourceParams[i]) : getRestTypeOfSignature(source);
|
|
var t = i < targetMax ? getTypeOfParameter(targetParams[i]) : getRestTypeOfSignature(target);
|
|
var related = compareTypes(s, t, false) || compareTypes(t, s, reportErrors);
|
|
if (!related) {
|
|
if (reportErrors) {
|
|
errorReporter(ts.Diagnostics.Types_of_parameters_0_and_1_are_incompatible, sourceParams[i < sourceMax ? i : sourceMax].name, targetParams[i < targetMax ? i : targetMax].name);
|
|
}
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
if (!ignoreReturnTypes) {
|
|
var targetReturnType = getReturnTypeOfSignature(target);
|
|
if (targetReturnType === voidType) {
|
|
return result;
|
|
}
|
|
var sourceReturnType = getReturnTypeOfSignature(source);
|
|
if (target.typePredicate) {
|
|
if (source.typePredicate) {
|
|
result &= compareTypePredicateRelatedTo(source.typePredicate, target.typePredicate, reportErrors, errorReporter, compareTypes);
|
|
}
|
|
else if (ts.isIdentifierTypePredicate(target.typePredicate)) {
|
|
if (reportErrors) {
|
|
errorReporter(ts.Diagnostics.Signature_0_must_have_a_type_predicate, signatureToString(source));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
else {
|
|
result &= compareTypes(sourceReturnType, targetReturnType, reportErrors);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function compareTypePredicateRelatedTo(source, target, reportErrors, errorReporter, compareTypes) {
|
|
if (source.kind !== target.kind) {
|
|
if (reportErrors) {
|
|
errorReporter(ts.Diagnostics.A_this_based_type_guard_is_not_compatible_with_a_parameter_based_type_guard);
|
|
errorReporter(ts.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
|
|
}
|
|
return 0;
|
|
}
|
|
if (source.kind === 1) {
|
|
var sourceIdentifierPredicate = source;
|
|
var targetIdentifierPredicate = target;
|
|
if (sourceIdentifierPredicate.parameterIndex !== targetIdentifierPredicate.parameterIndex) {
|
|
if (reportErrors) {
|
|
errorReporter(ts.Diagnostics.Parameter_0_is_not_in_the_same_position_as_parameter_1, sourceIdentifierPredicate.parameterName, targetIdentifierPredicate.parameterName);
|
|
errorReporter(ts.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
var related = compareTypes(source.type, target.type, reportErrors);
|
|
if (related === 0 && reportErrors) {
|
|
errorReporter(ts.Diagnostics.Type_predicate_0_is_not_assignable_to_1, typePredicateToString(source), typePredicateToString(target));
|
|
}
|
|
return related;
|
|
}
|
|
function isImplementationCompatibleWithOverload(implementation, overload) {
|
|
var erasedSource = getErasedSignature(implementation);
|
|
var erasedTarget = getErasedSignature(overload);
|
|
var sourceReturnType = getReturnTypeOfSignature(erasedSource);
|
|
var targetReturnType = getReturnTypeOfSignature(erasedTarget);
|
|
if (targetReturnType === voidType
|
|
|| checkTypeRelatedTo(targetReturnType, sourceReturnType, assignableRelation, undefined)
|
|
|| checkTypeRelatedTo(sourceReturnType, targetReturnType, assignableRelation, undefined)) {
|
|
return isSignatureAssignableTo(erasedSource, erasedTarget, true);
|
|
}
|
|
return false;
|
|
}
|
|
function getNumNonRestParameters(signature) {
|
|
var numParams = signature.parameters.length;
|
|
return signature.hasRestParameter ?
|
|
numParams - 1 :
|
|
numParams;
|
|
}
|
|
function getNumParametersToCheckForSignatureRelatability(source, sourceNonRestParamCount, target, targetNonRestParamCount) {
|
|
if (source.hasRestParameter === target.hasRestParameter) {
|
|
if (source.hasRestParameter) {
|
|
return Math.max(sourceNonRestParamCount, targetNonRestParamCount) + 1;
|
|
}
|
|
else {
|
|
return Math.min(sourceNonRestParamCount, targetNonRestParamCount);
|
|
}
|
|
}
|
|
else {
|
|
return source.hasRestParameter ?
|
|
targetNonRestParamCount :
|
|
sourceNonRestParamCount;
|
|
}
|
|
}
|
|
function checkTypeRelatedTo(source, target, relation, errorNode, headMessage, containingMessageChain) {
|
|
var errorInfo;
|
|
var sourceStack;
|
|
var targetStack;
|
|
var maybeStack;
|
|
var expandingFlags;
|
|
var depth = 0;
|
|
var overflow = false;
|
|
ts.Debug.assert(relation !== identityRelation || !errorNode, "no error reporting in identity checking");
|
|
var result = isRelatedTo(source, target, !!errorNode, headMessage);
|
|
if (overflow) {
|
|
error(errorNode, ts.Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target));
|
|
}
|
|
else if (errorInfo) {
|
|
if (containingMessageChain) {
|
|
errorInfo = ts.concatenateDiagnosticMessageChains(containingMessageChain, errorInfo);
|
|
}
|
|
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(errorNode, errorInfo));
|
|
}
|
|
return result !== 0;
|
|
function reportError(message, arg0, arg1, arg2) {
|
|
ts.Debug.assert(!!errorNode);
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2);
|
|
}
|
|
function reportRelationError(message, source, target) {
|
|
var sourceType = typeToString(source);
|
|
var targetType = typeToString(target);
|
|
if (sourceType === targetType) {
|
|
sourceType = typeToString(source, undefined, 128);
|
|
targetType = typeToString(target, undefined, 128);
|
|
}
|
|
if (!message) {
|
|
message = relation === comparableRelation ?
|
|
ts.Diagnostics.Type_0_is_not_comparable_to_type_1 :
|
|
ts.Diagnostics.Type_0_is_not_assignable_to_type_1;
|
|
}
|
|
reportError(message, sourceType, targetType);
|
|
}
|
|
function isRelatedTo(source, target, reportErrors, headMessage) {
|
|
var result;
|
|
if (source === target)
|
|
return -1;
|
|
if (relation === identityRelation) {
|
|
return isIdenticalTo(source, target);
|
|
}
|
|
if (!(target.flags & 134217728)) {
|
|
if (target.flags & 1 || source.flags & 134217728)
|
|
return -1;
|
|
if (source.flags & 32) {
|
|
if (!strictNullChecks || target.flags & (32 | 16))
|
|
return -1;
|
|
}
|
|
if (source.flags & 64) {
|
|
if (!strictNullChecks || target.flags & 64)
|
|
return -1;
|
|
}
|
|
if (source.flags & 128 && target === numberType)
|
|
return -1;
|
|
if (source.flags & 128 && target.flags & 128) {
|
|
if (result = enumRelatedTo(source, target, reportErrors)) {
|
|
return result;
|
|
}
|
|
}
|
|
if (source.flags & 256 && target === stringType)
|
|
return -1;
|
|
if (relation === assignableRelation || relation === comparableRelation) {
|
|
if (source.flags & 1)
|
|
return -1;
|
|
if (source === numberType && target.flags & 128)
|
|
return -1;
|
|
}
|
|
if (source.flags & 8 && target.flags & 8) {
|
|
return -1;
|
|
}
|
|
}
|
|
if (source.flags & 1048576) {
|
|
if (hasExcessProperties(source, target, reportErrors)) {
|
|
if (reportErrors) {
|
|
reportRelationError(headMessage, source, target);
|
|
}
|
|
return 0;
|
|
}
|
|
if (target.flags & 49152) {
|
|
source = getRegularTypeOfObjectLiteral(source);
|
|
}
|
|
}
|
|
var saveErrorInfo = errorInfo;
|
|
if (source.flags & 16384) {
|
|
if (relation === comparableRelation) {
|
|
result = someTypeRelatedToType(source, target, reportErrors);
|
|
}
|
|
else {
|
|
result = eachTypeRelatedToType(source, target, reportErrors);
|
|
}
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
else if (target.flags & 32768) {
|
|
result = typeRelatedToEachType(source, target, reportErrors);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
else {
|
|
if (source.flags & 32768) {
|
|
if (result = someTypeRelatedToType(source, target, false)) {
|
|
return result;
|
|
}
|
|
}
|
|
if (target.flags & 16384) {
|
|
if (result = typeRelatedToSomeType(source, target, reportErrors && !(source.flags & 16777726))) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
if (source.flags & 512) {
|
|
var constraint = getConstraintOfTypeParameter(source);
|
|
if (!constraint || constraint.flags & 1) {
|
|
constraint = emptyObjectType;
|
|
}
|
|
constraint = getTypeWithThisArgument(constraint, source);
|
|
var reportConstraintErrors = reportErrors && constraint !== emptyObjectType;
|
|
if (result = isRelatedTo(constraint, target, reportConstraintErrors)) {
|
|
errorInfo = saveErrorInfo;
|
|
return result;
|
|
}
|
|
}
|
|
else {
|
|
if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
|
|
if (result = typeArgumentsRelatedTo(source, target, reportErrors)) {
|
|
return result;
|
|
}
|
|
}
|
|
var apparentSource = getApparentType(source);
|
|
if (apparentSource.flags & (80896 | 32768) && target.flags & 80896) {
|
|
var reportStructuralErrors = reportErrors && errorInfo === saveErrorInfo && !(source.flags & 16777726);
|
|
if (result = objectTypeRelatedTo(apparentSource, source, target, reportStructuralErrors)) {
|
|
errorInfo = saveErrorInfo;
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
if (reportErrors) {
|
|
reportRelationError(headMessage, source, target);
|
|
}
|
|
return 0;
|
|
}
|
|
function isIdenticalTo(source, target) {
|
|
var result;
|
|
if (source.flags & 80896 && target.flags & 80896) {
|
|
if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
|
|
if (result = typeArgumentsRelatedTo(source, target, false)) {
|
|
return result;
|
|
}
|
|
}
|
|
return objectTypeRelatedTo(source, source, target, false);
|
|
}
|
|
if (source.flags & 16384 && target.flags & 16384 ||
|
|
source.flags & 32768 && target.flags & 32768) {
|
|
if (result = eachTypeRelatedToSomeType(source, target, false)) {
|
|
if (result &= eachTypeRelatedToSomeType(target, source, false)) {
|
|
return result;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function isKnownProperty(type, name) {
|
|
if (type.flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if ((relation === assignableRelation || relation === comparableRelation) && (type === globalObjectType || isEmptyObjectType(resolved)) ||
|
|
resolved.stringIndexInfo ||
|
|
(resolved.numberIndexInfo && isNumericLiteralName(name)) ||
|
|
getPropertyOfType(type, name)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if (type.flags & 49152) {
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (isKnownProperty(t, name)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isEmptyObjectType(t) {
|
|
return t.properties.length === 0 &&
|
|
t.callSignatures.length === 0 &&
|
|
t.constructSignatures.length === 0 &&
|
|
!t.stringIndexInfo &&
|
|
!t.numberIndexInfo;
|
|
}
|
|
function hasExcessProperties(source, target, reportErrors) {
|
|
if (!(target.flags & 67108864) && maybeTypeOfKind(target, 80896)) {
|
|
for (var _i = 0, _a = getPropertiesOfObjectType(source); _i < _a.length; _i++) {
|
|
var prop = _a[_i];
|
|
if (!isKnownProperty(target, prop.name)) {
|
|
if (reportErrors) {
|
|
ts.Debug.assert(!!errorNode);
|
|
errorNode = prop.valueDeclaration;
|
|
reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target));
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function eachTypeRelatedToSomeType(source, target, reportErrors) {
|
|
var result = -1;
|
|
var sourceTypes = source.types;
|
|
for (var _i = 0, sourceTypes_1 = sourceTypes; _i < sourceTypes_1.length; _i++) {
|
|
var sourceType = sourceTypes_1[_i];
|
|
var related = typeRelatedToSomeType(sourceType, target, false);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function typeRelatedToSomeType(source, target, reportErrors) {
|
|
var targetTypes = target.types;
|
|
var len = targetTypes.length;
|
|
while (len >= 2 && targetTypes[len - 1].flags & 96) {
|
|
var related = isRelatedTo(source, targetTypes[len - 1], false);
|
|
if (related) {
|
|
return related;
|
|
}
|
|
len--;
|
|
}
|
|
for (var i = 0; i < len; i++) {
|
|
var related = isRelatedTo(source, targetTypes[i], reportErrors && i === len - 1);
|
|
if (related) {
|
|
return related;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function typeRelatedToEachType(source, target, reportErrors) {
|
|
var result = -1;
|
|
var targetTypes = target.types;
|
|
for (var _i = 0, targetTypes_1 = targetTypes; _i < targetTypes_1.length; _i++) {
|
|
var targetType = targetTypes_1[_i];
|
|
var related = isRelatedTo(source, targetType, reportErrors);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function someTypeRelatedToType(source, target, reportErrors) {
|
|
var sourceTypes = source.types;
|
|
var len = sourceTypes.length;
|
|
while (len >= 2 && sourceTypes[len - 1].flags & 96) {
|
|
var related = isRelatedTo(sourceTypes[len - 1], target, false);
|
|
if (related) {
|
|
return related;
|
|
}
|
|
len--;
|
|
}
|
|
for (var i = 0; i < len; i++) {
|
|
var related = isRelatedTo(sourceTypes[i], target, reportErrors && i === len - 1);
|
|
if (related) {
|
|
return related;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function eachTypeRelatedToType(source, target, reportErrors) {
|
|
var result = -1;
|
|
var sourceTypes = source.types;
|
|
for (var _i = 0, sourceTypes_2 = sourceTypes; _i < sourceTypes_2.length; _i++) {
|
|
var sourceType = sourceTypes_2[_i];
|
|
var related = isRelatedTo(sourceType, target, reportErrors);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function typeArgumentsRelatedTo(source, target, reportErrors) {
|
|
var sources = source.typeArguments || emptyArray;
|
|
var targets = target.typeArguments || emptyArray;
|
|
if (sources.length !== targets.length && relation === identityRelation) {
|
|
return 0;
|
|
}
|
|
var length = sources.length <= targets.length ? sources.length : targets.length;
|
|
var result = -1;
|
|
for (var i = 0; i < length; i++) {
|
|
var related = isRelatedTo(sources[i], targets[i], reportErrors);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function objectTypeRelatedTo(source, originalSource, target, reportErrors) {
|
|
if (overflow) {
|
|
return 0;
|
|
}
|
|
var id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id;
|
|
var related = relation[id];
|
|
if (related !== undefined) {
|
|
if (reportErrors && related === 2) {
|
|
relation[id] = 3;
|
|
}
|
|
else {
|
|
return related === 1 ? -1 : 0;
|
|
}
|
|
}
|
|
if (depth > 0) {
|
|
for (var i = 0; i < depth; i++) {
|
|
if (maybeStack[i][id]) {
|
|
return 1;
|
|
}
|
|
}
|
|
if (depth === 100) {
|
|
overflow = true;
|
|
return 0;
|
|
}
|
|
}
|
|
else {
|
|
sourceStack = [];
|
|
targetStack = [];
|
|
maybeStack = [];
|
|
expandingFlags = 0;
|
|
}
|
|
sourceStack[depth] = source;
|
|
targetStack[depth] = target;
|
|
maybeStack[depth] = {};
|
|
maybeStack[depth][id] = 1;
|
|
depth++;
|
|
var saveExpandingFlags = expandingFlags;
|
|
if (!(expandingFlags & 1) && isDeeplyNestedGeneric(source, sourceStack, depth))
|
|
expandingFlags |= 1;
|
|
if (!(expandingFlags & 2) && isDeeplyNestedGeneric(target, targetStack, depth))
|
|
expandingFlags |= 2;
|
|
var result;
|
|
if (expandingFlags === 3) {
|
|
result = 1;
|
|
}
|
|
else {
|
|
result = propertiesRelatedTo(source, target, reportErrors);
|
|
if (result) {
|
|
result &= signaturesRelatedTo(source, target, 0, reportErrors);
|
|
if (result) {
|
|
result &= signaturesRelatedTo(source, target, 1, reportErrors);
|
|
if (result) {
|
|
result &= indexTypesRelatedTo(source, originalSource, target, 0, reportErrors);
|
|
if (result) {
|
|
result &= indexTypesRelatedTo(source, originalSource, target, 1, reportErrors);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
expandingFlags = saveExpandingFlags;
|
|
depth--;
|
|
if (result) {
|
|
var maybeCache = maybeStack[depth];
|
|
var destinationCache = (result === -1 || depth === 0) ? relation : maybeStack[depth - 1];
|
|
ts.copyMap(maybeCache, destinationCache);
|
|
}
|
|
else {
|
|
relation[id] = reportErrors ? 3 : 2;
|
|
}
|
|
return result;
|
|
}
|
|
function propertiesRelatedTo(source, target, reportErrors) {
|
|
if (relation === identityRelation) {
|
|
return propertiesIdenticalTo(source, target);
|
|
}
|
|
var result = -1;
|
|
var properties = getPropertiesOfObjectType(target);
|
|
var requireOptionalProperties = relation === subtypeRelation && !(source.flags & 524288);
|
|
for (var _i = 0, properties_1 = properties; _i < properties_1.length; _i++) {
|
|
var targetProp = properties_1[_i];
|
|
var sourceProp = getPropertyOfType(source, targetProp.name);
|
|
if (sourceProp !== targetProp) {
|
|
if (!sourceProp) {
|
|
if (!(targetProp.flags & 536870912) || requireOptionalProperties) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_missing_in_type_1, symbolToString(targetProp), typeToString(source));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
else if (!(targetProp.flags & 134217728)) {
|
|
var sourcePropFlags = getDeclarationFlagsFromSymbol(sourceProp);
|
|
var targetPropFlags = getDeclarationFlagsFromSymbol(targetProp);
|
|
if (sourcePropFlags & 8 || targetPropFlags & 8) {
|
|
if (sourceProp.valueDeclaration !== targetProp.valueDeclaration) {
|
|
if (reportErrors) {
|
|
if (sourcePropFlags & 8 && targetPropFlags & 8) {
|
|
reportError(ts.Diagnostics.Types_have_separate_declarations_of_a_private_property_0, symbolToString(targetProp));
|
|
}
|
|
else {
|
|
reportError(ts.Diagnostics.Property_0_is_private_in_type_1_but_not_in_type_2, symbolToString(targetProp), typeToString(sourcePropFlags & 8 ? source : target), typeToString(sourcePropFlags & 8 ? target : source));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
else if (targetPropFlags & 16) {
|
|
var sourceDeclaredInClass = sourceProp.parent && sourceProp.parent.flags & 32;
|
|
var sourceClass = sourceDeclaredInClass ? getDeclaredTypeOfSymbol(getParentOfSymbol(sourceProp)) : undefined;
|
|
var targetClass = getDeclaredTypeOfSymbol(getParentOfSymbol(targetProp));
|
|
if (!sourceClass || !hasBaseType(sourceClass, targetClass)) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_protected_but_type_1_is_not_a_class_derived_from_2, symbolToString(targetProp), typeToString(sourceClass || source), typeToString(targetClass));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
else if (sourcePropFlags & 16) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_protected_in_type_1_but_public_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
|
|
}
|
|
return 0;
|
|
}
|
|
var related = isRelatedTo(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp), reportErrors);
|
|
if (!related) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Types_of_property_0_are_incompatible, symbolToString(targetProp));
|
|
}
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
if (sourceProp.flags & 536870912 && !(targetProp.flags & 536870912)) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_optional_in_type_1_but_required_in_type_2, symbolToString(targetProp), typeToString(source), typeToString(target));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function propertiesIdenticalTo(source, target) {
|
|
if (!(source.flags & 80896 && target.flags & 80896)) {
|
|
return 0;
|
|
}
|
|
var sourceProperties = getPropertiesOfObjectType(source);
|
|
var targetProperties = getPropertiesOfObjectType(target);
|
|
if (sourceProperties.length !== targetProperties.length) {
|
|
return 0;
|
|
}
|
|
var result = -1;
|
|
for (var _i = 0, sourceProperties_1 = sourceProperties; _i < sourceProperties_1.length; _i++) {
|
|
var sourceProp = sourceProperties_1[_i];
|
|
var targetProp = getPropertyOfObjectType(target, sourceProp.name);
|
|
if (!targetProp) {
|
|
return 0;
|
|
}
|
|
var related = compareProperties(sourceProp, targetProp, isRelatedTo);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function signaturesRelatedTo(source, target, kind, reportErrors) {
|
|
if (relation === identityRelation) {
|
|
return signaturesIdenticalTo(source, target, kind);
|
|
}
|
|
if (target === anyFunctionType || source === anyFunctionType) {
|
|
return -1;
|
|
}
|
|
var sourceSignatures = getSignaturesOfType(source, kind);
|
|
var targetSignatures = getSignaturesOfType(target, kind);
|
|
if (kind === 1 && sourceSignatures.length && targetSignatures.length) {
|
|
if (isAbstractConstructorType(source) && !isAbstractConstructorType(target)) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type);
|
|
}
|
|
return 0;
|
|
}
|
|
if (!constructorVisibilitiesAreCompatible(sourceSignatures[0], targetSignatures[0], reportErrors)) {
|
|
return 0;
|
|
}
|
|
}
|
|
var result = -1;
|
|
var saveErrorInfo = errorInfo;
|
|
outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) {
|
|
var t = targetSignatures_1[_i];
|
|
var shouldElaborateErrors = reportErrors;
|
|
for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) {
|
|
var s = sourceSignatures_1[_a];
|
|
var related = signatureRelatedTo(s, t, shouldElaborateErrors);
|
|
if (related) {
|
|
result &= related;
|
|
errorInfo = saveErrorInfo;
|
|
continue outer;
|
|
}
|
|
shouldElaborateErrors = false;
|
|
}
|
|
if (shouldElaborateErrors) {
|
|
reportError(ts.Diagnostics.Type_0_provides_no_match_for_the_signature_1, typeToString(source), signatureToString(t, undefined, undefined, kind));
|
|
}
|
|
return 0;
|
|
}
|
|
return result;
|
|
}
|
|
function signatureRelatedTo(source, target, reportErrors) {
|
|
return compareSignaturesRelated(source, target, false, reportErrors, reportError, isRelatedTo);
|
|
}
|
|
function signaturesIdenticalTo(source, target, kind) {
|
|
var sourceSignatures = getSignaturesOfType(source, kind);
|
|
var targetSignatures = getSignaturesOfType(target, kind);
|
|
if (sourceSignatures.length !== targetSignatures.length) {
|
|
return 0;
|
|
}
|
|
var result = -1;
|
|
for (var i = 0, len = sourceSignatures.length; i < len; i++) {
|
|
var related = compareSignaturesIdentical(sourceSignatures[i], targetSignatures[i], false, false, false, isRelatedTo);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
return result;
|
|
}
|
|
function eachPropertyRelatedTo(source, target, kind, reportErrors) {
|
|
var result = -1;
|
|
for (var _i = 0, _a = getPropertiesOfObjectType(source); _i < _a.length; _i++) {
|
|
var prop = _a[_i];
|
|
if (kind === 0 || isNumericLiteralName(prop.name)) {
|
|
var related = isRelatedTo(getTypeOfSymbol(prop), target, reportErrors);
|
|
if (!related) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_incompatible_with_index_signature, symbolToString(prop));
|
|
}
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function indexInfoRelatedTo(sourceInfo, targetInfo, reportErrors) {
|
|
var related = isRelatedTo(sourceInfo.type, targetInfo.type, reportErrors);
|
|
if (!related && reportErrors) {
|
|
reportError(ts.Diagnostics.Index_signatures_are_incompatible);
|
|
}
|
|
return related;
|
|
}
|
|
function indexTypesRelatedTo(source, originalSource, target, kind, reportErrors) {
|
|
if (relation === identityRelation) {
|
|
return indexTypesIdenticalTo(source, target, kind);
|
|
}
|
|
var targetInfo = getIndexInfoOfType(target, kind);
|
|
if (!targetInfo || ((targetInfo.type.flags & 1) && !(originalSource.flags & 16777726))) {
|
|
return -1;
|
|
}
|
|
var sourceInfo = getIndexInfoOfType(source, kind) ||
|
|
kind === 1 && getIndexInfoOfType(source, 0);
|
|
if (sourceInfo) {
|
|
return indexInfoRelatedTo(sourceInfo, targetInfo, reportErrors);
|
|
}
|
|
if (isObjectLiteralType(source)) {
|
|
var related = -1;
|
|
if (kind === 0) {
|
|
var sourceNumberInfo = getIndexInfoOfType(source, 1);
|
|
if (sourceNumberInfo) {
|
|
related = indexInfoRelatedTo(sourceNumberInfo, targetInfo, reportErrors);
|
|
}
|
|
}
|
|
if (related) {
|
|
related &= eachPropertyRelatedTo(source, targetInfo.type, kind, reportErrors);
|
|
}
|
|
return related;
|
|
}
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Index_signature_is_missing_in_type_0, typeToString(source));
|
|
}
|
|
return 0;
|
|
}
|
|
function indexTypesIdenticalTo(source, target, indexKind) {
|
|
var targetInfo = getIndexInfoOfType(target, indexKind);
|
|
var sourceInfo = getIndexInfoOfType(source, indexKind);
|
|
if (!sourceInfo && !targetInfo) {
|
|
return -1;
|
|
}
|
|
if (sourceInfo && targetInfo && sourceInfo.isReadonly === targetInfo.isReadonly) {
|
|
return isRelatedTo(sourceInfo.type, targetInfo.type);
|
|
}
|
|
return 0;
|
|
}
|
|
function enumRelatedTo(source, target, reportErrors) {
|
|
if (source.symbol.name !== target.symbol.name ||
|
|
source.symbol.flags & 128 ||
|
|
target.symbol.flags & 128) {
|
|
return 0;
|
|
}
|
|
var targetEnumType = getTypeOfSymbol(target.symbol);
|
|
for (var _i = 0, _a = getPropertiesOfType(getTypeOfSymbol(source.symbol)); _i < _a.length; _i++) {
|
|
var property = _a[_i];
|
|
if (property.flags & 8) {
|
|
var targetProperty = getPropertyOfType(targetEnumType, property.name);
|
|
if (!targetProperty || !(targetProperty.flags & 8)) {
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Property_0_is_missing_in_type_1, property.name, typeToString(target, undefined, 128));
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function constructorVisibilitiesAreCompatible(sourceSignature, targetSignature, reportErrors) {
|
|
if (!sourceSignature.declaration || !targetSignature.declaration) {
|
|
return true;
|
|
}
|
|
var sourceAccessibility = sourceSignature.declaration.flags & (8 | 16);
|
|
var targetAccessibility = targetSignature.declaration.flags & (8 | 16);
|
|
if (targetAccessibility === 8) {
|
|
return true;
|
|
}
|
|
if (targetAccessibility === 16 && sourceAccessibility !== 8) {
|
|
return true;
|
|
}
|
|
if (targetAccessibility !== 16 && !sourceAccessibility) {
|
|
return true;
|
|
}
|
|
if (reportErrors) {
|
|
reportError(ts.Diagnostics.Cannot_assign_a_0_constructor_type_to_a_1_constructor_type, visibilityToString(sourceAccessibility), visibilityToString(targetAccessibility));
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
function isAbstractConstructorType(type) {
|
|
if (type.flags & 65536) {
|
|
var symbol = type.symbol;
|
|
if (symbol && symbol.flags & 32) {
|
|
var declaration = getClassLikeDeclarationOfSymbol(symbol);
|
|
if (declaration && declaration.flags & 128) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isDeeplyNestedGeneric(type, stack, depth) {
|
|
if (type.flags & (4096 | 131072) && depth >= 5) {
|
|
var symbol = type.symbol;
|
|
var count = 0;
|
|
for (var i = 0; i < depth; i++) {
|
|
var t = stack[i];
|
|
if (t.flags & (4096 | 131072) && t.symbol === symbol) {
|
|
count++;
|
|
if (count >= 5)
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isPropertyIdenticalTo(sourceProp, targetProp) {
|
|
return compareProperties(sourceProp, targetProp, compareTypesIdentical) !== 0;
|
|
}
|
|
function compareProperties(sourceProp, targetProp, compareTypes) {
|
|
if (sourceProp === targetProp) {
|
|
return -1;
|
|
}
|
|
var sourcePropAccessibility = getDeclarationFlagsFromSymbol(sourceProp) & (8 | 16);
|
|
var targetPropAccessibility = getDeclarationFlagsFromSymbol(targetProp) & (8 | 16);
|
|
if (sourcePropAccessibility !== targetPropAccessibility) {
|
|
return 0;
|
|
}
|
|
if (sourcePropAccessibility) {
|
|
if (getTargetSymbol(sourceProp) !== getTargetSymbol(targetProp)) {
|
|
return 0;
|
|
}
|
|
}
|
|
else {
|
|
if ((sourceProp.flags & 536870912) !== (targetProp.flags & 536870912)) {
|
|
return 0;
|
|
}
|
|
}
|
|
if (isReadonlySymbol(sourceProp) !== isReadonlySymbol(targetProp)) {
|
|
return 0;
|
|
}
|
|
return compareTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
|
|
}
|
|
function isMatchingSignature(source, target, partialMatch) {
|
|
if (source.parameters.length === target.parameters.length &&
|
|
source.minArgumentCount === target.minArgumentCount &&
|
|
source.hasRestParameter === target.hasRestParameter) {
|
|
return true;
|
|
}
|
|
if (partialMatch && source.minArgumentCount <= target.minArgumentCount && (source.hasRestParameter && !target.hasRestParameter ||
|
|
source.hasRestParameter === target.hasRestParameter && source.parameters.length >= target.parameters.length)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function compareSignaturesIdentical(source, target, partialMatch, ignoreThisTypes, ignoreReturnTypes, compareTypes) {
|
|
if (source === target) {
|
|
return -1;
|
|
}
|
|
if (!(isMatchingSignature(source, target, partialMatch))) {
|
|
return 0;
|
|
}
|
|
if ((source.typeParameters ? source.typeParameters.length : 0) !== (target.typeParameters ? target.typeParameters.length : 0)) {
|
|
return 0;
|
|
}
|
|
source = getErasedSignature(source);
|
|
target = getErasedSignature(target);
|
|
var result = -1;
|
|
if (!ignoreThisTypes) {
|
|
var sourceThisType = getThisTypeOfSignature(source);
|
|
if (sourceThisType) {
|
|
var targetThisType = getThisTypeOfSignature(target);
|
|
if (targetThisType) {
|
|
var related = compareTypes(sourceThisType, targetThisType);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
}
|
|
}
|
|
var targetLen = target.parameters.length;
|
|
for (var i = 0; i < targetLen; i++) {
|
|
var s = isRestParameterIndex(source, i) ? getRestTypeOfSignature(source) : getTypeOfParameter(source.parameters[i]);
|
|
var t = isRestParameterIndex(target, i) ? getRestTypeOfSignature(target) : getTypeOfParameter(target.parameters[i]);
|
|
var related = compareTypes(s, t);
|
|
if (!related) {
|
|
return 0;
|
|
}
|
|
result &= related;
|
|
}
|
|
if (!ignoreReturnTypes) {
|
|
result &= compareTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
|
|
}
|
|
return result;
|
|
}
|
|
function isRestParameterIndex(signature, parameterIndex) {
|
|
return signature.hasRestParameter && parameterIndex >= signature.parameters.length - 1;
|
|
}
|
|
function isSupertypeOfEach(candidate, types) {
|
|
for (var _i = 0, types_5 = types; _i < types_5.length; _i++) {
|
|
var t = types_5[_i];
|
|
if (candidate !== t && !isTypeSubtypeOf(t, candidate))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function getCombinedFlagsOfTypes(types) {
|
|
var flags = 0;
|
|
for (var _i = 0, types_6 = types; _i < types_6.length; _i++) {
|
|
var t = types_6[_i];
|
|
flags |= t.flags;
|
|
}
|
|
return flags;
|
|
}
|
|
function getCommonSupertype(types) {
|
|
if (!strictNullChecks) {
|
|
return ts.forEach(types, function (t) { return isSupertypeOfEach(t, types) ? t : undefined; });
|
|
}
|
|
var primaryTypes = ts.filter(types, function (t) { return !(t.flags & 96); });
|
|
if (!primaryTypes.length) {
|
|
return getUnionType(types);
|
|
}
|
|
var supertype = ts.forEach(primaryTypes, function (t) { return isSupertypeOfEach(t, primaryTypes) ? t : undefined; });
|
|
return supertype && addTypeKind(supertype, getCombinedFlagsOfTypes(types) & 96);
|
|
}
|
|
function reportNoCommonSupertypeError(types, errorLocation, errorMessageChainHead) {
|
|
var bestSupertype;
|
|
var bestSupertypeDownfallType;
|
|
var bestSupertypeScore = 0;
|
|
for (var i = 0; i < types.length; i++) {
|
|
var score = 0;
|
|
var downfallType = undefined;
|
|
for (var j = 0; j < types.length; j++) {
|
|
if (isTypeSubtypeOf(types[j], types[i])) {
|
|
score++;
|
|
}
|
|
else if (!downfallType) {
|
|
downfallType = types[j];
|
|
}
|
|
}
|
|
ts.Debug.assert(!!downfallType, "If there is no common supertype, each type should have a downfallType");
|
|
if (score > bestSupertypeScore) {
|
|
bestSupertype = types[i];
|
|
bestSupertypeDownfallType = downfallType;
|
|
bestSupertypeScore = score;
|
|
}
|
|
if (bestSupertypeScore === types.length - 1) {
|
|
break;
|
|
}
|
|
}
|
|
checkTypeSubtypeOf(bestSupertypeDownfallType, bestSupertype, errorLocation, ts.Diagnostics.Type_argument_candidate_1_is_not_a_valid_type_argument_because_it_is_not_a_supertype_of_candidate_0, errorMessageChainHead);
|
|
}
|
|
function isArrayType(type) {
|
|
return type.flags & 4096 && type.target === globalArrayType;
|
|
}
|
|
function isArrayLikeType(type) {
|
|
return type.flags & 4096 && (type.target === globalArrayType || type.target === globalReadonlyArrayType) ||
|
|
!(type.flags & 96) && isTypeAssignableTo(type, anyReadonlyArrayType);
|
|
}
|
|
function isTupleLikeType(type) {
|
|
return !!getPropertyOfType(type, "0");
|
|
}
|
|
function isStringLiteralUnionType(type) {
|
|
return type.flags & 256 ? true :
|
|
type.flags & 16384 ? ts.forEach(type.types, isStringLiteralUnionType) :
|
|
false;
|
|
}
|
|
function isTupleType(type) {
|
|
return !!(type.flags & 8192);
|
|
}
|
|
function getCombinedTypeFlags(type) {
|
|
return type.flags & 16384 ? getCombinedFlagsOfTypes(type.types) : type.flags;
|
|
}
|
|
function addTypeKind(type, kind) {
|
|
if ((getCombinedTypeFlags(type) & kind) === kind) {
|
|
return type;
|
|
}
|
|
var types = [type];
|
|
if (kind & 2)
|
|
types.push(stringType);
|
|
if (kind & 4)
|
|
types.push(numberType);
|
|
if (kind & 8)
|
|
types.push(booleanType);
|
|
if (kind & 16)
|
|
types.push(voidType);
|
|
if (kind & 32)
|
|
types.push(undefinedType);
|
|
if (kind & 64)
|
|
types.push(nullType);
|
|
return getUnionType(types);
|
|
}
|
|
function getNonNullableType(type) {
|
|
return strictNullChecks ? getTypeWithFacts(type, 524288) : type;
|
|
}
|
|
function isObjectLiteralType(type) {
|
|
return type.symbol && (type.symbol.flags & (4096 | 2048)) !== 0 &&
|
|
getSignaturesOfType(type, 0).length === 0 &&
|
|
getSignaturesOfType(type, 1).length === 0;
|
|
}
|
|
function createTransientSymbol(source, type) {
|
|
var symbol = createSymbol(source.flags | 67108864, source.name);
|
|
symbol.declarations = source.declarations;
|
|
symbol.parent = source.parent;
|
|
symbol.type = type;
|
|
symbol.target = source;
|
|
if (source.valueDeclaration) {
|
|
symbol.valueDeclaration = source.valueDeclaration;
|
|
}
|
|
return symbol;
|
|
}
|
|
function transformTypeOfMembers(type, f) {
|
|
var members = {};
|
|
for (var _i = 0, _a = getPropertiesOfObjectType(type); _i < _a.length; _i++) {
|
|
var property = _a[_i];
|
|
var original = getTypeOfSymbol(property);
|
|
var updated = f(original);
|
|
members[property.name] = updated === original ? property : createTransientSymbol(property, updated);
|
|
}
|
|
;
|
|
return members;
|
|
}
|
|
function getRegularTypeOfObjectLiteral(type) {
|
|
if (!(type.flags & 1048576)) {
|
|
return type;
|
|
}
|
|
var regularType = type.regularType;
|
|
if (regularType) {
|
|
return regularType;
|
|
}
|
|
var resolved = type;
|
|
var members = transformTypeOfMembers(type, getRegularTypeOfObjectLiteral);
|
|
var regularNew = createAnonymousType(resolved.symbol, members, resolved.callSignatures, resolved.constructSignatures, resolved.stringIndexInfo, resolved.numberIndexInfo);
|
|
regularNew.flags = resolved.flags & ~1048576;
|
|
type.regularType = regularNew;
|
|
return regularNew;
|
|
}
|
|
function getWidenedTypeOfObjectLiteral(type) {
|
|
var members = transformTypeOfMembers(type, function (prop) {
|
|
var widened = getWidenedType(prop);
|
|
return prop === widened ? prop : widened;
|
|
});
|
|
var stringIndexInfo = getIndexInfoOfType(type, 0);
|
|
var numberIndexInfo = getIndexInfoOfType(type, 1);
|
|
return createAnonymousType(type.symbol, members, emptyArray, emptyArray, stringIndexInfo && createIndexInfo(getWidenedType(stringIndexInfo.type), stringIndexInfo.isReadonly), numberIndexInfo && createIndexInfo(getWidenedType(numberIndexInfo.type), numberIndexInfo.isReadonly));
|
|
}
|
|
function getWidenedConstituentType(type) {
|
|
return type.flags & 96 ? type : getWidenedType(type);
|
|
}
|
|
function getWidenedType(type) {
|
|
if (type.flags & 6291456) {
|
|
if (type.flags & 96) {
|
|
return anyType;
|
|
}
|
|
if (type.flags & 524288) {
|
|
return getWidenedTypeOfObjectLiteral(type);
|
|
}
|
|
if (type.flags & 16384) {
|
|
return getUnionType(ts.map(type.types, getWidenedConstituentType), true);
|
|
}
|
|
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) {
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (reportWideningErrorsInType(t)) {
|
|
errorReported = true;
|
|
}
|
|
}
|
|
}
|
|
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) {
|
|
for (var _d = 0, _e = getPropertiesOfObjectType(type); _d < _e.length; _d++) {
|
|
var p = _e[_d];
|
|
var t = getTypeOfSymbol(p);
|
|
if (t.flags & 2097152) {
|
|
if (!reportWideningErrorsInType(t)) {
|
|
error(p.valueDeclaration, ts.Diagnostics.Object_literal_s_property_0_implicitly_has_an_1_type, p.name, typeToString(getWidenedType(t)));
|
|
}
|
|
errorReported = true;
|
|
}
|
|
}
|
|
}
|
|
return errorReported;
|
|
}
|
|
function reportImplicitAnyError(declaration, type) {
|
|
var typeAsString = typeToString(getWidenedType(type));
|
|
var diagnostic;
|
|
switch (declaration.kind) {
|
|
case 145:
|
|
case 144:
|
|
diagnostic = ts.Diagnostics.Member_0_implicitly_has_an_1_type;
|
|
break;
|
|
case 142:
|
|
diagnostic = declaration.dotDotDotToken ?
|
|
ts.Diagnostics.Rest_parameter_0_implicitly_has_an_any_type :
|
|
ts.Diagnostics.Parameter_0_implicitly_has_an_1_type;
|
|
break;
|
|
case 169:
|
|
diagnostic = ts.Diagnostics.Binding_element_0_implicitly_has_an_1_type;
|
|
break;
|
|
case 220:
|
|
case 147:
|
|
case 146:
|
|
case 149:
|
|
case 150:
|
|
case 179:
|
|
case 180:
|
|
if (!declaration.name) {
|
|
error(declaration, ts.Diagnostics.Function_expression_which_lacks_return_type_annotation_implicitly_has_an_0_return_type, typeAsString);
|
|
return;
|
|
}
|
|
diagnostic = ts.Diagnostics._0_which_lacks_return_type_annotation_implicitly_has_an_1_return_type;
|
|
break;
|
|
default:
|
|
diagnostic = ts.Diagnostics.Variable_0_implicitly_has_an_1_type;
|
|
}
|
|
error(declaration, diagnostic, ts.declarationNameToString(declaration.name), typeAsString);
|
|
}
|
|
function reportErrorsFromWidening(declaration, type) {
|
|
if (produceDiagnostics && compilerOptions.noImplicitAny && type.flags & 2097152) {
|
|
if (!reportWideningErrorsInType(type)) {
|
|
reportImplicitAnyError(declaration, type);
|
|
}
|
|
}
|
|
}
|
|
function forEachMatchingParameterType(source, target, callback) {
|
|
var sourceMax = source.parameters.length;
|
|
var targetMax = target.parameters.length;
|
|
var count;
|
|
if (source.hasRestParameter && target.hasRestParameter) {
|
|
count = Math.max(sourceMax, targetMax);
|
|
}
|
|
else if (source.hasRestParameter) {
|
|
count = targetMax;
|
|
}
|
|
else if (target.hasRestParameter) {
|
|
count = sourceMax;
|
|
}
|
|
else {
|
|
count = Math.min(sourceMax, targetMax);
|
|
}
|
|
for (var i = 0; i < count; i++) {
|
|
callback(getTypeAtPosition(source, i), getTypeAtPosition(target, i));
|
|
}
|
|
}
|
|
function createInferenceContext(typeParameters, inferUnionTypes) {
|
|
var inferences = ts.map(typeParameters, createTypeInferencesObject);
|
|
return {
|
|
typeParameters: typeParameters,
|
|
inferUnionTypes: inferUnionTypes,
|
|
inferences: inferences,
|
|
inferredTypes: new Array(typeParameters.length)
|
|
};
|
|
}
|
|
function createTypeInferencesObject() {
|
|
return {
|
|
primary: undefined,
|
|
secondary: undefined,
|
|
isFixed: false
|
|
};
|
|
}
|
|
function inferTypes(context, source, target) {
|
|
var sourceStack;
|
|
var targetStack;
|
|
var depth = 0;
|
|
var inferiority = 0;
|
|
var visited = {};
|
|
inferFromTypes(source, target);
|
|
function isInProcess(source, target) {
|
|
for (var i = 0; i < depth; i++) {
|
|
if (source === sourceStack[i] && target === targetStack[i]) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function inferFromTypes(source, target) {
|
|
if (source.flags & 16384 && target.flags & 16384 ||
|
|
source.flags & 32768 && target.flags & 32768) {
|
|
var matchingTypes = void 0;
|
|
for (var _i = 0, _a = target.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (typeIdenticalToSomeType(t, source.types)) {
|
|
(matchingTypes || (matchingTypes = [])).push(t);
|
|
inferFromTypes(t, t);
|
|
}
|
|
}
|
|
if (matchingTypes) {
|
|
source = removeTypesFromUnionOrIntersection(source, matchingTypes);
|
|
target = removeTypesFromUnionOrIntersection(target, matchingTypes);
|
|
}
|
|
}
|
|
if (target.flags & 512) {
|
|
if (source.flags & 8388608) {
|
|
return;
|
|
}
|
|
var typeParameters = context.typeParameters;
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
if (target === typeParameters[i]) {
|
|
var inferences = context.inferences[i];
|
|
if (!inferences.isFixed) {
|
|
var candidates = inferiority ?
|
|
inferences.secondary || (inferences.secondary = []) :
|
|
inferences.primary || (inferences.primary = []);
|
|
if (!ts.contains(candidates, source)) {
|
|
candidates.push(source);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
else if (source.flags & 4096 && target.flags & 4096 && source.target === target.target) {
|
|
var sourceTypes = source.typeArguments || emptyArray;
|
|
var targetTypes = target.typeArguments || emptyArray;
|
|
var count = sourceTypes.length < targetTypes.length ? sourceTypes.length : targetTypes.length;
|
|
for (var i = 0; i < count; i++) {
|
|
inferFromTypes(sourceTypes[i], targetTypes[i]);
|
|
}
|
|
}
|
|
else if (source.flags & 8192 && target.flags & 8192 && source.elementTypes.length === target.elementTypes.length) {
|
|
var sourceTypes = source.elementTypes;
|
|
var targetTypes = target.elementTypes;
|
|
for (var i = 0; i < sourceTypes.length; i++) {
|
|
inferFromTypes(sourceTypes[i], targetTypes[i]);
|
|
}
|
|
}
|
|
else if (target.flags & 49152) {
|
|
var targetTypes = target.types;
|
|
var typeParameterCount = 0;
|
|
var typeParameter = void 0;
|
|
for (var _b = 0, targetTypes_2 = targetTypes; _b < targetTypes_2.length; _b++) {
|
|
var t = targetTypes_2[_b];
|
|
if (t.flags & 512 && ts.contains(context.typeParameters, t)) {
|
|
typeParameter = t;
|
|
typeParameterCount++;
|
|
}
|
|
else {
|
|
inferFromTypes(source, t);
|
|
}
|
|
}
|
|
if (typeParameterCount === 1) {
|
|
inferiority++;
|
|
inferFromTypes(source, typeParameter);
|
|
inferiority--;
|
|
}
|
|
}
|
|
else if (source.flags & 49152) {
|
|
var sourceTypes = source.types;
|
|
for (var _c = 0, sourceTypes_3 = sourceTypes; _c < sourceTypes_3.length; _c++) {
|
|
var sourceType = sourceTypes_3[_c];
|
|
inferFromTypes(sourceType, target);
|
|
}
|
|
}
|
|
else {
|
|
source = getApparentType(source);
|
|
if (source.flags & 80896 && (target.flags & 4096 && target.typeArguments ||
|
|
target.flags & 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;
|
|
}
|
|
var key = source.id + "," + target.id;
|
|
if (ts.hasProperty(visited, key)) {
|
|
return;
|
|
}
|
|
visited[key] = true;
|
|
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);
|
|
depth--;
|
|
}
|
|
}
|
|
}
|
|
function inferFromProperties(source, target) {
|
|
var properties = getPropertiesOfObjectType(target);
|
|
for (var _i = 0, properties_2 = properties; _i < properties_2.length; _i++) {
|
|
var targetProp = properties_2[_i];
|
|
var sourceProp = getPropertyOfObjectType(source, targetProp.name);
|
|
if (sourceProp) {
|
|
inferFromTypes(getTypeOfSymbol(sourceProp), getTypeOfSymbol(targetProp));
|
|
}
|
|
}
|
|
}
|
|
function inferFromSignatures(source, target, kind) {
|
|
var sourceSignatures = getSignaturesOfType(source, kind);
|
|
var targetSignatures = getSignaturesOfType(target, kind);
|
|
var sourceLen = sourceSignatures.length;
|
|
var targetLen = targetSignatures.length;
|
|
var len = sourceLen < targetLen ? sourceLen : targetLen;
|
|
for (var i = 0; i < len; i++) {
|
|
inferFromSignature(getErasedSignature(sourceSignatures[sourceLen - len + i]), getErasedSignature(targetSignatures[targetLen - len + i]));
|
|
}
|
|
}
|
|
function inferFromSignature(source, target) {
|
|
forEachMatchingParameterType(source, target, inferFromTypes);
|
|
if (source.typePredicate && target.typePredicate && source.typePredicate.kind === target.typePredicate.kind) {
|
|
inferFromTypes(source.typePredicate.type, target.typePredicate.type);
|
|
}
|
|
else {
|
|
inferFromTypes(getReturnTypeOfSignature(source), getReturnTypeOfSignature(target));
|
|
}
|
|
}
|
|
function inferFromIndexTypes(source, target) {
|
|
var targetStringIndexType = getIndexTypeOfType(target, 0);
|
|
if (targetStringIndexType) {
|
|
var sourceIndexType = getIndexTypeOfType(source, 0) ||
|
|
getImplicitIndexTypeOfType(source, 0);
|
|
if (sourceIndexType) {
|
|
inferFromTypes(sourceIndexType, targetStringIndexType);
|
|
}
|
|
}
|
|
var targetNumberIndexType = getIndexTypeOfType(target, 1);
|
|
if (targetNumberIndexType) {
|
|
var sourceIndexType = getIndexTypeOfType(source, 1) ||
|
|
getIndexTypeOfType(source, 0) ||
|
|
getImplicitIndexTypeOfType(source, 1);
|
|
if (sourceIndexType) {
|
|
inferFromTypes(sourceIndexType, targetNumberIndexType);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function typeIdenticalToSomeType(type, types) {
|
|
for (var _i = 0, types_7 = types; _i < types_7.length; _i++) {
|
|
var t = types_7[_i];
|
|
if (isTypeIdenticalTo(t, type)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function removeTypesFromUnionOrIntersection(type, typesToRemove) {
|
|
var reducedTypes = [];
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (!typeIdenticalToSomeType(t, typesToRemove)) {
|
|
reducedTypes.push(t);
|
|
}
|
|
}
|
|
return type.flags & 16384 ? getUnionType(reducedTypes, true) : getIntersectionType(reducedTypes);
|
|
}
|
|
function getInferenceCandidates(context, index) {
|
|
var inferences = context.inferences[index];
|
|
return inferences.primary || inferences.secondary || emptyArray;
|
|
}
|
|
function getInferredType(context, index) {
|
|
var inferredType = context.inferredTypes[index];
|
|
var inferenceSucceeded;
|
|
if (!inferredType) {
|
|
var inferences = getInferenceCandidates(context, index);
|
|
if (inferences.length) {
|
|
var unionOrSuperType = context.inferUnionTypes ? getUnionType(inferences) : getCommonSupertype(inferences);
|
|
inferredType = unionOrSuperType ? getWidenedType(unionOrSuperType) : unknownType;
|
|
inferenceSucceeded = !!unionOrSuperType;
|
|
}
|
|
else {
|
|
inferredType = emptyObjectType;
|
|
inferenceSucceeded = true;
|
|
}
|
|
context.inferredTypes[index] = inferredType;
|
|
if (inferenceSucceeded) {
|
|
var constraint = getConstraintOfTypeParameter(context.typeParameters[index]);
|
|
if (constraint) {
|
|
var instantiatedConstraint = instantiateType(constraint, getInferenceMapper(context));
|
|
if (!isTypeAssignableTo(inferredType, getTypeWithThisArgument(instantiatedConstraint, inferredType))) {
|
|
context.inferredTypes[index] = inferredType = instantiatedConstraint;
|
|
}
|
|
}
|
|
}
|
|
else if (context.failedTypeParameterIndex === undefined || context.failedTypeParameterIndex > index) {
|
|
context.failedTypeParameterIndex = index;
|
|
}
|
|
}
|
|
return inferredType;
|
|
}
|
|
function getInferredTypes(context) {
|
|
for (var i = 0; i < context.inferredTypes.length; i++) {
|
|
getInferredType(context, i);
|
|
}
|
|
return context.inferredTypes;
|
|
}
|
|
function getResolvedSymbol(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedSymbol) {
|
|
links.resolvedSymbol = !ts.nodeIsMissing(node) && resolveName(node, node.text, 107455 | 1048576, ts.Diagnostics.Cannot_find_name_0, node) || unknownSymbol;
|
|
}
|
|
return links.resolvedSymbol;
|
|
}
|
|
function isInTypeQuery(node) {
|
|
while (node) {
|
|
switch (node.kind) {
|
|
case 158:
|
|
return true;
|
|
case 69:
|
|
case 139:
|
|
node = node.parent;
|
|
continue;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
ts.Debug.fail("should not get here");
|
|
}
|
|
function getFlowCacheKey(node) {
|
|
if (node.kind === 69) {
|
|
var symbol = getResolvedSymbol(node);
|
|
return symbol !== unknownSymbol ? "" + getSymbolId(symbol) : undefined;
|
|
}
|
|
if (node.kind === 97) {
|
|
return "0";
|
|
}
|
|
if (node.kind === 172) {
|
|
var key = getFlowCacheKey(node.expression);
|
|
return key && key + "." + node.name.text;
|
|
}
|
|
return undefined;
|
|
}
|
|
function isNullOrUndefinedLiteral(node) {
|
|
return node.kind === 93 ||
|
|
node.kind === 69 && getResolvedSymbol(node) === undefinedSymbol;
|
|
}
|
|
function getLeftmostIdentifierOrThis(node) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
case 97:
|
|
return node;
|
|
case 172:
|
|
return getLeftmostIdentifierOrThis(node.expression);
|
|
}
|
|
return undefined;
|
|
}
|
|
function isMatchingReference(source, target) {
|
|
if (source.kind === target.kind) {
|
|
switch (source.kind) {
|
|
case 69:
|
|
return getResolvedSymbol(source) === getResolvedSymbol(target);
|
|
case 97:
|
|
return true;
|
|
case 172:
|
|
return source.name.text === target.name.text &&
|
|
isMatchingReference(source.expression, target.expression);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function containsMatchingReference(source, target) {
|
|
while (source.kind === 172) {
|
|
source = source.expression;
|
|
if (isMatchingReference(source, target)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isOrContainsMatchingReference(source, target) {
|
|
return isMatchingReference(source, target) || containsMatchingReference(source, target);
|
|
}
|
|
function hasMatchingArgument(callExpression, reference) {
|
|
if (callExpression.arguments) {
|
|
for (var _i = 0, _a = callExpression.arguments; _i < _a.length; _i++) {
|
|
var argument = _a[_i];
|
|
if (isOrContainsMatchingReference(reference, argument)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
if (callExpression.expression.kind === 172 &&
|
|
isOrContainsMatchingReference(reference, callExpression.expression.expression)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function getFlowNodeId(flow) {
|
|
if (!flow.id) {
|
|
flow.id = nextFlowId;
|
|
nextFlowId++;
|
|
}
|
|
return flow.id;
|
|
}
|
|
function typeMaybeAssignableTo(source, target) {
|
|
if (!(source.flags & 16384)) {
|
|
return isTypeAssignableTo(source, target);
|
|
}
|
|
for (var _i = 0, _a = source.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (isTypeAssignableTo(t, target)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function getAssignmentReducedType(declaredType, assignedType) {
|
|
if (declaredType !== assignedType && declaredType.flags & 16384) {
|
|
var reducedTypes = ts.filter(declaredType.types, function (t) { return typeMaybeAssignableTo(assignedType, t); });
|
|
if (reducedTypes.length) {
|
|
return reducedTypes.length === 1 ? reducedTypes[0] : getUnionType(reducedTypes);
|
|
}
|
|
}
|
|
return declaredType;
|
|
}
|
|
function getTypeFacts(type) {
|
|
var flags = type.flags;
|
|
if (flags & 258) {
|
|
return strictNullChecks ? 4079361 : 4194049;
|
|
}
|
|
if (flags & 132) {
|
|
return strictNullChecks ? 4079234 : 4193922;
|
|
}
|
|
if (flags & 8) {
|
|
return strictNullChecks ? 4078980 : 4193668;
|
|
}
|
|
if (flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
return resolved.callSignatures.length || resolved.constructSignatures.length || isTypeSubtypeOf(type, globalFunctionType) ?
|
|
strictNullChecks ? 1970144 : 4181984 :
|
|
strictNullChecks ? 1972176 : 4184016;
|
|
}
|
|
if (flags & (16 | 32)) {
|
|
return 2457472;
|
|
}
|
|
if (flags & 64) {
|
|
return 2340752;
|
|
}
|
|
if (flags & 16777216) {
|
|
return strictNullChecks ? 1981320 : 4193160;
|
|
}
|
|
if (flags & 512) {
|
|
var constraint = getConstraintOfTypeParameter(type);
|
|
return constraint ? getTypeFacts(constraint) : 4194303;
|
|
}
|
|
if (flags & 32768) {
|
|
return ts.reduceLeft(type.types, function (flags, type) { return flags |= getTypeFacts(type); }, 0);
|
|
}
|
|
return 4194303;
|
|
}
|
|
function getTypeWithFacts(type, include) {
|
|
if (!(type.flags & 16384)) {
|
|
return getTypeFacts(type) & include ? type : neverType;
|
|
}
|
|
var firstType;
|
|
var types;
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var t = _a[_i];
|
|
if (getTypeFacts(t) & include) {
|
|
if (!firstType) {
|
|
firstType = t;
|
|
}
|
|
else {
|
|
if (!types) {
|
|
types = [firstType];
|
|
}
|
|
types.push(t);
|
|
}
|
|
}
|
|
}
|
|
return firstType ? types ? getUnionType(types, true) : firstType : neverType;
|
|
}
|
|
function getTypeWithDefault(type, defaultExpression) {
|
|
if (defaultExpression) {
|
|
var defaultType = checkExpression(defaultExpression);
|
|
return getUnionType([getTypeWithFacts(type, 131072), defaultType]);
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeOfDestructuredProperty(type, name) {
|
|
var text = getTextOfPropertyName(name);
|
|
return getTypeOfPropertyOfType(type, text) ||
|
|
isNumericLiteralName(text) && getIndexTypeOfType(type, 1) ||
|
|
getIndexTypeOfType(type, 0) ||
|
|
unknownType;
|
|
}
|
|
function getTypeOfDestructuredArrayElement(type, index) {
|
|
return isTupleLikeType(type) && getTypeOfPropertyOfType(type, "" + index) ||
|
|
checkIteratedTypeOrElementType(type, undefined, false) ||
|
|
unknownType;
|
|
}
|
|
function getTypeOfDestructuredSpreadElement(type) {
|
|
return createArrayType(checkIteratedTypeOrElementType(type, undefined, false) || unknownType);
|
|
}
|
|
function getAssignedTypeOfBinaryExpression(node) {
|
|
return node.parent.kind === 170 || node.parent.kind === 253 ?
|
|
getTypeWithDefault(getAssignedType(node), node.right) :
|
|
checkExpression(node.right);
|
|
}
|
|
function getAssignedTypeOfArrayLiteralElement(node, element) {
|
|
return getTypeOfDestructuredArrayElement(getAssignedType(node), ts.indexOf(node.elements, element));
|
|
}
|
|
function getAssignedTypeOfSpreadElement(node) {
|
|
return getTypeOfDestructuredSpreadElement(getAssignedType(node.parent));
|
|
}
|
|
function getAssignedTypeOfPropertyAssignment(node) {
|
|
return getTypeOfDestructuredProperty(getAssignedType(node.parent), node.name);
|
|
}
|
|
function getAssignedTypeOfShorthandPropertyAssignment(node) {
|
|
return getTypeWithDefault(getAssignedTypeOfPropertyAssignment(node), node.objectAssignmentInitializer);
|
|
}
|
|
function getAssignedType(node) {
|
|
var parent = node.parent;
|
|
switch (parent.kind) {
|
|
case 207:
|
|
return stringType;
|
|
case 208:
|
|
return checkRightHandSideOfForOf(parent.expression) || unknownType;
|
|
case 187:
|
|
return getAssignedTypeOfBinaryExpression(parent);
|
|
case 181:
|
|
return undefinedType;
|
|
case 170:
|
|
return getAssignedTypeOfArrayLiteralElement(parent, node);
|
|
case 191:
|
|
return getAssignedTypeOfSpreadElement(parent);
|
|
case 253:
|
|
return getAssignedTypeOfPropertyAssignment(parent);
|
|
case 254:
|
|
return getAssignedTypeOfShorthandPropertyAssignment(parent);
|
|
}
|
|
return unknownType;
|
|
}
|
|
function getInitialTypeOfBindingElement(node) {
|
|
var pattern = node.parent;
|
|
var parentType = getInitialType(pattern.parent);
|
|
var type = pattern.kind === 167 ?
|
|
getTypeOfDestructuredProperty(parentType, node.propertyName || node.name) :
|
|
!node.dotDotDotToken ?
|
|
getTypeOfDestructuredArrayElement(parentType, ts.indexOf(pattern.elements, node)) :
|
|
getTypeOfDestructuredSpreadElement(parentType);
|
|
return getTypeWithDefault(type, node.initializer);
|
|
}
|
|
function getTypeOfInitializer(node) {
|
|
var links = getNodeLinks(node);
|
|
return links.resolvedType || checkExpression(node);
|
|
}
|
|
function getInitialTypeOfVariableDeclaration(node) {
|
|
if (node.initializer) {
|
|
return getTypeOfInitializer(node.initializer);
|
|
}
|
|
if (node.parent.parent.kind === 207) {
|
|
return stringType;
|
|
}
|
|
if (node.parent.parent.kind === 208) {
|
|
return checkRightHandSideOfForOf(node.parent.parent.expression) || unknownType;
|
|
}
|
|
return unknownType;
|
|
}
|
|
function getInitialType(node) {
|
|
return node.kind === 218 ?
|
|
getInitialTypeOfVariableDeclaration(node) :
|
|
getInitialTypeOfBindingElement(node);
|
|
}
|
|
function getReferenceFromExpression(node) {
|
|
switch (node.kind) {
|
|
case 178:
|
|
return getReferenceFromExpression(node.expression);
|
|
case 187:
|
|
switch (node.operatorToken.kind) {
|
|
case 56:
|
|
return getReferenceFromExpression(node.left);
|
|
case 24:
|
|
return getReferenceFromExpression(node.right);
|
|
}
|
|
}
|
|
return node;
|
|
}
|
|
function getTypeOfSwitchClause(clause) {
|
|
if (clause.kind === 249) {
|
|
var expr = clause.expression;
|
|
return expr.kind === 9 ? getStringLiteralTypeForText(expr.text) : checkExpression(expr);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getSwitchClauseTypes(switchStatement) {
|
|
var links = getNodeLinks(switchStatement);
|
|
if (!links.switchTypes) {
|
|
var types = ts.map(switchStatement.caseBlock.clauses, getTypeOfSwitchClause);
|
|
links.switchTypes = ts.forEach(types, function (t) { return !t || t.flags & 256; }) ? types : emptyArray;
|
|
}
|
|
return links.switchTypes;
|
|
}
|
|
function eachTypeContainedIn(source, types) {
|
|
return source.flags & 16384 ? !ts.forEach(source.types, function (t) { return !ts.contains(types, t); }) : ts.contains(types, source);
|
|
}
|
|
function filterType(type, f) {
|
|
return type.flags & 16384 ?
|
|
getUnionType(ts.filter(type.types, f)) :
|
|
f(type) ? type : neverType;
|
|
}
|
|
function getFlowTypeOfReference(reference, declaredType, assumeInitialized, includeOuterFunctions) {
|
|
var key;
|
|
if (!reference.flowNode || assumeInitialized && !(declaredType.flags & 16908175)) {
|
|
return declaredType;
|
|
}
|
|
var initialType = assumeInitialized ? declaredType : addTypeKind(declaredType, 32);
|
|
var visitedFlowStart = visitedFlowCount;
|
|
var result = getTypeAtFlowNode(reference.flowNode);
|
|
visitedFlowCount = visitedFlowStart;
|
|
if (reference.parent.kind === 196 && getTypeWithFacts(result, 524288) === neverType) {
|
|
return declaredType;
|
|
}
|
|
return result;
|
|
function getTypeAtFlowNode(flow) {
|
|
while (true) {
|
|
if (flow.flags & 512) {
|
|
for (var i = visitedFlowStart; i < visitedFlowCount; i++) {
|
|
if (visitedFlowNodes[i] === flow) {
|
|
return visitedFlowTypes[i];
|
|
}
|
|
}
|
|
}
|
|
var type = void 0;
|
|
if (flow.flags & 16) {
|
|
type = getTypeAtFlowAssignment(flow);
|
|
if (!type) {
|
|
flow = flow.antecedent;
|
|
continue;
|
|
}
|
|
}
|
|
else if (flow.flags & 96) {
|
|
type = getTypeAtFlowCondition(flow);
|
|
}
|
|
else if (flow.flags & 128) {
|
|
type = getTypeAtSwitchClause(flow);
|
|
}
|
|
else if (flow.flags & 12) {
|
|
if (flow.antecedents.length === 1) {
|
|
flow = flow.antecedents[0];
|
|
continue;
|
|
}
|
|
type = flow.flags & 4 ?
|
|
getTypeAtFlowBranchLabel(flow) :
|
|
getTypeAtFlowLoopLabel(flow);
|
|
}
|
|
else if (flow.flags & 2) {
|
|
var container = flow.container;
|
|
if (container && includeOuterFunctions) {
|
|
flow = container.flowNode;
|
|
continue;
|
|
}
|
|
type = initialType;
|
|
}
|
|
else {
|
|
type = declaredType;
|
|
}
|
|
if (flow.flags & 512) {
|
|
visitedFlowNodes[visitedFlowCount] = flow;
|
|
visitedFlowTypes[visitedFlowCount] = type;
|
|
visitedFlowCount++;
|
|
}
|
|
return type;
|
|
}
|
|
}
|
|
function getTypeAtFlowAssignment(flow) {
|
|
var node = flow.node;
|
|
if ((node.kind === 218 || node.kind === 169) &&
|
|
reference.kind === 69 &&
|
|
getExportSymbolOfValueSymbolIfExported(getResolvedSymbol(reference)) === getSymbolOfNode(node)) {
|
|
return declaredType.flags & 16384 ?
|
|
getAssignmentReducedType(declaredType, getInitialType(node)) :
|
|
declaredType;
|
|
}
|
|
if (isMatchingReference(reference, node)) {
|
|
return declaredType.flags & 16384 ?
|
|
getAssignmentReducedType(declaredType, getAssignedType(node)) :
|
|
declaredType;
|
|
}
|
|
if (containsMatchingReference(reference, node)) {
|
|
return declaredType;
|
|
}
|
|
return undefined;
|
|
}
|
|
function getTypeAtFlowCondition(flow) {
|
|
var type = getTypeAtFlowNode(flow.antecedent);
|
|
if (type !== neverType) {
|
|
var assumeTrue = (flow.flags & 32) !== 0;
|
|
type = narrowType(type, flow.expression, assumeTrue);
|
|
if (type === neverType) {
|
|
type = narrowType(declaredType, flow.expression, assumeTrue);
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeAtSwitchClause(flow) {
|
|
var type = getTypeAtFlowNode(flow.antecedent);
|
|
return narrowTypeBySwitchOnDiscriminant(type, flow.switchStatement, flow.clauseStart, flow.clauseEnd);
|
|
}
|
|
function getTypeAtFlowBranchLabel(flow) {
|
|
var antecedentTypes = [];
|
|
for (var _i = 0, _a = flow.antecedents; _i < _a.length; _i++) {
|
|
var antecedent = _a[_i];
|
|
var type = getTypeAtFlowNode(antecedent);
|
|
if (type === declaredType && declaredType === initialType) {
|
|
return type;
|
|
}
|
|
if (!ts.contains(antecedentTypes, type)) {
|
|
antecedentTypes.push(type);
|
|
}
|
|
}
|
|
return getUnionType(antecedentTypes);
|
|
}
|
|
function getTypeAtFlowLoopLabel(flow) {
|
|
var id = getFlowNodeId(flow);
|
|
var cache = flowLoopCaches[id] || (flowLoopCaches[id] = {});
|
|
if (!key) {
|
|
key = getFlowCacheKey(reference);
|
|
}
|
|
if (cache[key]) {
|
|
return cache[key];
|
|
}
|
|
for (var i = flowLoopStart; i < flowLoopCount; i++) {
|
|
if (flowLoopNodes[i] === flow && flowLoopKeys[i] === key) {
|
|
return getUnionType(flowLoopTypes[i]);
|
|
}
|
|
}
|
|
var antecedentTypes = [];
|
|
flowLoopNodes[flowLoopCount] = flow;
|
|
flowLoopKeys[flowLoopCount] = key;
|
|
flowLoopTypes[flowLoopCount] = antecedentTypes;
|
|
for (var _i = 0, _a = flow.antecedents; _i < _a.length; _i++) {
|
|
var antecedent = _a[_i];
|
|
flowLoopCount++;
|
|
var type = getTypeAtFlowNode(antecedent);
|
|
flowLoopCount--;
|
|
if (cache[key]) {
|
|
return cache[key];
|
|
}
|
|
if (!ts.contains(antecedentTypes, type)) {
|
|
antecedentTypes.push(type);
|
|
}
|
|
if (type === declaredType) {
|
|
break;
|
|
}
|
|
}
|
|
return cache[key] = getUnionType(antecedentTypes);
|
|
}
|
|
function narrowTypeByTruthiness(type, expr, assumeTrue) {
|
|
return isMatchingReference(reference, expr) ? getTypeWithFacts(type, assumeTrue ? 1048576 : 2097152) : type;
|
|
}
|
|
function narrowTypeByBinaryExpression(type, expr, assumeTrue) {
|
|
switch (expr.operatorToken.kind) {
|
|
case 56:
|
|
return narrowTypeByTruthiness(type, expr.left, assumeTrue);
|
|
case 30:
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
var left = expr.left;
|
|
var operator = expr.operatorToken.kind;
|
|
var right = expr.right;
|
|
if (isNullOrUndefinedLiteral(right)) {
|
|
return narrowTypeByNullCheck(type, left, operator, right, assumeTrue);
|
|
}
|
|
if (isNullOrUndefinedLiteral(left)) {
|
|
return narrowTypeByNullCheck(type, right, operator, left, assumeTrue);
|
|
}
|
|
if (left.kind === 182 && right.kind === 9) {
|
|
return narrowTypeByTypeof(type, left, operator, right, assumeTrue);
|
|
}
|
|
if (right.kind === 182 && left.kind === 9) {
|
|
return narrowTypeByTypeof(type, right, operator, left, assumeTrue);
|
|
}
|
|
if (left.kind === 172) {
|
|
return narrowTypeByDiscriminant(type, left, operator, right, assumeTrue);
|
|
}
|
|
if (right.kind === 172) {
|
|
return narrowTypeByDiscriminant(type, right, operator, left, assumeTrue);
|
|
}
|
|
break;
|
|
case 91:
|
|
return narrowTypeByInstanceof(type, expr, assumeTrue);
|
|
case 24:
|
|
return narrowType(type, expr.right, assumeTrue);
|
|
}
|
|
return type;
|
|
}
|
|
function narrowTypeByNullCheck(type, target, operator, literal, assumeTrue) {
|
|
if (operator === 31 || operator === 33) {
|
|
assumeTrue = !assumeTrue;
|
|
}
|
|
if (!strictNullChecks || !isMatchingReference(reference, getReferenceFromExpression(target))) {
|
|
return type;
|
|
}
|
|
var doubleEquals = operator === 30 || operator === 31;
|
|
var facts = doubleEquals ?
|
|
assumeTrue ? 65536 : 524288 :
|
|
literal.kind === 93 ?
|
|
assumeTrue ? 32768 : 262144 :
|
|
assumeTrue ? 16384 : 131072;
|
|
return getTypeWithFacts(type, facts);
|
|
}
|
|
function narrowTypeByTypeof(type, typeOfExpr, operator, literal, assumeTrue) {
|
|
var target = getReferenceFromExpression(typeOfExpr.expression);
|
|
if (!isMatchingReference(reference, target)) {
|
|
if (containsMatchingReference(reference, target)) {
|
|
return declaredType;
|
|
}
|
|
return type;
|
|
}
|
|
if (operator === 31 || operator === 33) {
|
|
assumeTrue = !assumeTrue;
|
|
}
|
|
if (assumeTrue && !(type.flags & 16384)) {
|
|
var targetType = ts.getProperty(typeofTypesByName, literal.text);
|
|
if (targetType && isTypeSubtypeOf(targetType, type)) {
|
|
return targetType;
|
|
}
|
|
}
|
|
var facts = assumeTrue ?
|
|
ts.getProperty(typeofEQFacts, literal.text) || 64 :
|
|
ts.getProperty(typeofNEFacts, literal.text) || 8192;
|
|
return getTypeWithFacts(type, facts);
|
|
}
|
|
function narrowTypeByDiscriminant(type, propAccess, operator, value, assumeTrue) {
|
|
if (!isMatchingReference(reference, propAccess.expression)) {
|
|
return type;
|
|
}
|
|
var propName = propAccess.name.text;
|
|
var propType = getTypeOfPropertyOfType(type, propName);
|
|
if (!propType || !isStringLiteralUnionType(propType)) {
|
|
return type;
|
|
}
|
|
var discriminantType = value.kind === 9 ? getStringLiteralTypeForText(value.text) : checkExpression(value);
|
|
if (!isStringLiteralUnionType(discriminantType)) {
|
|
return type;
|
|
}
|
|
if (operator === 31 || operator === 33) {
|
|
assumeTrue = !assumeTrue;
|
|
}
|
|
if (assumeTrue) {
|
|
return filterType(type, function (t) { return areTypesComparable(getTypeOfPropertyOfType(t, propName), discriminantType); });
|
|
}
|
|
if (discriminantType.flags & 256) {
|
|
return filterType(type, function (t) { return getTypeOfPropertyOfType(t, propName) !== discriminantType; });
|
|
}
|
|
return type;
|
|
}
|
|
function narrowTypeBySwitchOnDiscriminant(type, switchStatement, clauseStart, clauseEnd) {
|
|
if (!isMatchingReference(reference, switchStatement.expression.expression)) {
|
|
return type;
|
|
}
|
|
var propName = switchStatement.expression.name.text;
|
|
var propType = getTypeOfPropertyOfType(type, propName);
|
|
if (!propType || !isStringLiteralUnionType(propType)) {
|
|
return type;
|
|
}
|
|
var switchTypes = getSwitchClauseTypes(switchStatement);
|
|
if (!switchTypes.length) {
|
|
return type;
|
|
}
|
|
var clauseTypes = switchTypes.slice(clauseStart, clauseEnd);
|
|
var hasDefaultClause = clauseStart === clauseEnd || ts.contains(clauseTypes, undefined);
|
|
var caseTypes = hasDefaultClause ? ts.filter(clauseTypes, function (t) { return !!t; }) : clauseTypes;
|
|
var discriminantType = caseTypes.length ? getUnionType(caseTypes) : undefined;
|
|
var caseType = discriminantType && filterType(type, function (t) { return isTypeComparableTo(discriminantType, getTypeOfPropertyOfType(t, propName)); });
|
|
if (!hasDefaultClause) {
|
|
return caseType;
|
|
}
|
|
var defaultType = filterType(type, function (t) { return !eachTypeContainedIn(getTypeOfPropertyOfType(t, propName), switchTypes); });
|
|
return caseType ? getUnionType([caseType, defaultType]) : defaultType;
|
|
}
|
|
function narrowTypeByInstanceof(type, expr, assumeTrue) {
|
|
var left = getReferenceFromExpression(expr.left);
|
|
if (!isMatchingReference(reference, left)) {
|
|
if (containsMatchingReference(reference, left)) {
|
|
return declaredType;
|
|
}
|
|
return type;
|
|
}
|
|
if (isTypeAny(type)) {
|
|
return type;
|
|
}
|
|
var rightType = checkExpression(expr.right);
|
|
if (!isTypeSubtypeOf(rightType, globalFunctionType)) {
|
|
return type;
|
|
}
|
|
var targetType;
|
|
var prototypeProperty = getPropertyOfType(rightType, "prototype");
|
|
if (prototypeProperty) {
|
|
var prototypePropertyType = getTypeOfSymbol(prototypeProperty);
|
|
if (!isTypeAny(prototypePropertyType)) {
|
|
targetType = prototypePropertyType;
|
|
}
|
|
}
|
|
if (!targetType) {
|
|
var constructSignatures = void 0;
|
|
if (rightType.flags & 2048) {
|
|
constructSignatures = resolveDeclaredMembers(rightType).declaredConstructSignatures;
|
|
}
|
|
else if (rightType.flags & 65536) {
|
|
constructSignatures = getSignaturesOfType(rightType, 1);
|
|
}
|
|
if (constructSignatures && constructSignatures.length) {
|
|
targetType = getUnionType(ts.map(constructSignatures, function (signature) { return getReturnTypeOfSignature(getErasedSignature(signature)); }));
|
|
}
|
|
}
|
|
if (targetType) {
|
|
return getNarrowedType(type, targetType, assumeTrue);
|
|
}
|
|
return type;
|
|
}
|
|
function getNarrowedType(type, candidate, assumeTrue) {
|
|
if (!assumeTrue) {
|
|
return type.flags & 16384 ?
|
|
getUnionType(ts.filter(type.types, function (t) { return !isTypeSubtypeOf(t, candidate); })) :
|
|
type;
|
|
}
|
|
if (type.flags & 16384) {
|
|
var assignableConstituents = ts.filter(type.types, function (t) { return isTypeAssignableTo(t, candidate); });
|
|
if (assignableConstituents.length) {
|
|
return getUnionType(assignableConstituents);
|
|
}
|
|
}
|
|
var targetType = type.flags & 512 ? getApparentType(type) : type;
|
|
return isTypeAssignableTo(candidate, targetType) ? candidate :
|
|
isTypeAssignableTo(type, candidate) ? type :
|
|
getIntersectionType([type, candidate]);
|
|
}
|
|
function narrowTypeByTypePredicate(type, callExpression, assumeTrue) {
|
|
if (type.flags & 1 || !hasMatchingArgument(callExpression, reference)) {
|
|
return type;
|
|
}
|
|
var signature = getResolvedSignature(callExpression);
|
|
var predicate = signature.typePredicate;
|
|
if (!predicate) {
|
|
return type;
|
|
}
|
|
if (ts.isIdentifierTypePredicate(predicate)) {
|
|
var predicateArgument = callExpression.arguments[predicate.parameterIndex];
|
|
if (predicateArgument) {
|
|
if (isMatchingReference(reference, predicateArgument)) {
|
|
return getNarrowedType(type, predicate.type, assumeTrue);
|
|
}
|
|
if (containsMatchingReference(reference, predicateArgument)) {
|
|
return declaredType;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var invokedExpression = skipParenthesizedNodes(callExpression.expression);
|
|
if (invokedExpression.kind === 173 || invokedExpression.kind === 172) {
|
|
var accessExpression = invokedExpression;
|
|
var possibleReference = skipParenthesizedNodes(accessExpression.expression);
|
|
if (isMatchingReference(reference, possibleReference)) {
|
|
return getNarrowedType(type, predicate.type, assumeTrue);
|
|
}
|
|
if (containsMatchingReference(reference, possibleReference)) {
|
|
return declaredType;
|
|
}
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function narrowType(type, expr, assumeTrue) {
|
|
switch (expr.kind) {
|
|
case 69:
|
|
case 97:
|
|
case 172:
|
|
return narrowTypeByTruthiness(type, expr, assumeTrue);
|
|
case 174:
|
|
return narrowTypeByTypePredicate(type, expr, assumeTrue);
|
|
case 178:
|
|
return narrowType(type, expr.expression, assumeTrue);
|
|
case 187:
|
|
return narrowTypeByBinaryExpression(type, expr, assumeTrue);
|
|
case 185:
|
|
if (expr.operator === 49) {
|
|
return narrowType(type, expr.operand, !assumeTrue);
|
|
}
|
|
break;
|
|
}
|
|
return type;
|
|
}
|
|
}
|
|
function getTypeOfSymbolAtLocation(symbol, location) {
|
|
if (location.kind === 69) {
|
|
if (ts.isRightSideOfQualifiedNameOrPropertyAccess(location)) {
|
|
location = location.parent;
|
|
}
|
|
if (ts.isExpression(location) && !ts.isAssignmentTarget(location)) {
|
|
var type = checkExpression(location);
|
|
if (getExportSymbolOfValueSymbolIfExported(getNodeLinks(location).resolvedSymbol) === symbol) {
|
|
return type;
|
|
}
|
|
}
|
|
}
|
|
return getTypeOfSymbol(symbol);
|
|
}
|
|
function skipParenthesizedNodes(expression) {
|
|
while (expression.kind === 178) {
|
|
expression = expression.expression;
|
|
}
|
|
return expression;
|
|
}
|
|
function getControlFlowContainer(node) {
|
|
while (true) {
|
|
node = node.parent;
|
|
if (ts.isFunctionLike(node) || node.kind === 226 || node.kind === 256 || node.kind === 145) {
|
|
return node;
|
|
}
|
|
}
|
|
}
|
|
function isDeclarationIncludedInFlow(reference, declaration, includeOuterFunctions) {
|
|
var declarationContainer = getControlFlowContainer(declaration);
|
|
var container = getControlFlowContainer(reference);
|
|
while (container !== declarationContainer &&
|
|
(container.kind === 179 || container.kind === 180) &&
|
|
(includeOuterFunctions || ts.getImmediatelyInvokedFunctionExpression(container))) {
|
|
container = getControlFlowContainer(container);
|
|
}
|
|
return container === declarationContainer;
|
|
}
|
|
function checkIdentifier(node) {
|
|
var symbol = getResolvedSymbol(node);
|
|
if (symbol === argumentsSymbol) {
|
|
var container = ts.getContainingFunction(node);
|
|
if (container.kind === 180) {
|
|
if (languageVersion < 2) {
|
|
error(node, ts.Diagnostics.The_arguments_object_cannot_be_referenced_in_an_arrow_function_in_ES3_and_ES5_Consider_using_a_standard_function_expression);
|
|
}
|
|
}
|
|
if (node.flags & 33554432) {
|
|
getNodeLinks(container).flags |= 8192;
|
|
}
|
|
}
|
|
if (symbol.flags & 8388608 && !isInTypeQuery(node) && !isConstEnumOrConstEnumOnlyModule(resolveAlias(symbol))) {
|
|
markAliasSymbolAsReferenced(symbol);
|
|
}
|
|
var localOrExportSymbol = getExportSymbolOfValueSymbolIfExported(symbol);
|
|
if (languageVersion === 2
|
|
&& localOrExportSymbol.flags & 32
|
|
&& localOrExportSymbol.valueDeclaration.kind === 221
|
|
&& ts.nodeIsDecorated(localOrExportSymbol.valueDeclaration)) {
|
|
var container = ts.getContainingClass(node);
|
|
while (container !== undefined) {
|
|
if (container === localOrExportSymbol.valueDeclaration && container.name !== node) {
|
|
getNodeLinks(container).flags |= 524288;
|
|
getNodeLinks(node).flags |= 1048576;
|
|
break;
|
|
}
|
|
container = ts.getContainingClass(container);
|
|
}
|
|
}
|
|
checkCollisionWithCapturedSuperVariable(node, node);
|
|
checkCollisionWithCapturedThisVariable(node, node);
|
|
checkNestedBlockScopedBinding(node, symbol);
|
|
var type = getTypeOfSymbol(localOrExportSymbol);
|
|
if (!(localOrExportSymbol.flags & 3) || ts.isAssignmentTarget(node)) {
|
|
return type;
|
|
}
|
|
var declaration = localOrExportSymbol.valueDeclaration;
|
|
var includeOuterFunctions = isReadonlySymbol(localOrExportSymbol);
|
|
var assumeInitialized = !strictNullChecks || (type.flags & 1) !== 0 || !declaration ||
|
|
ts.getRootDeclaration(declaration).kind === 142 || ts.isInAmbientContext(declaration) ||
|
|
!isDeclarationIncludedInFlow(node, declaration, includeOuterFunctions);
|
|
var flowType = getFlowTypeOfReference(node, type, assumeInitialized, includeOuterFunctions);
|
|
if (!assumeInitialized && !(getCombinedTypeFlags(type) & 32) && getCombinedTypeFlags(flowType) & 32) {
|
|
error(node, ts.Diagnostics.Variable_0_is_used_before_being_assigned, symbolToString(symbol));
|
|
return type;
|
|
}
|
|
return flowType;
|
|
}
|
|
function isInsideFunction(node, threshold) {
|
|
var current = node;
|
|
while (current && current !== threshold) {
|
|
if (ts.isFunctionLike(current)) {
|
|
return true;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
return false;
|
|
}
|
|
function checkNestedBlockScopedBinding(node, symbol) {
|
|
if (languageVersion >= 2 ||
|
|
(symbol.flags & (2 | 32)) === 0 ||
|
|
symbol.valueDeclaration.parent.kind === 252) {
|
|
return;
|
|
}
|
|
var container = ts.getEnclosingBlockScopeContainer(symbol.valueDeclaration);
|
|
var usedInFunction = isInsideFunction(node.parent, container);
|
|
var current = container;
|
|
var containedInIterationStatement = false;
|
|
while (current && !ts.nodeStartsNewLexicalEnvironment(current)) {
|
|
if (ts.isIterationStatement(current, false)) {
|
|
containedInIterationStatement = true;
|
|
break;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
if (containedInIterationStatement) {
|
|
if (usedInFunction) {
|
|
getNodeLinks(current).flags |= 65536;
|
|
}
|
|
if (container.kind === 206 &&
|
|
ts.getAncestor(symbol.valueDeclaration, 219).parent === container &&
|
|
isAssignedInBodyOfForStatement(node, container)) {
|
|
getNodeLinks(symbol.valueDeclaration).flags |= 2097152;
|
|
}
|
|
getNodeLinks(symbol.valueDeclaration).flags |= 262144;
|
|
}
|
|
if (usedInFunction) {
|
|
getNodeLinks(symbol.valueDeclaration).flags |= 131072;
|
|
}
|
|
}
|
|
function isAssignedInBodyOfForStatement(node, container) {
|
|
var current = node;
|
|
while (current.parent.kind === 178) {
|
|
current = current.parent;
|
|
}
|
|
var isAssigned = false;
|
|
if (ts.isAssignmentTarget(current)) {
|
|
isAssigned = true;
|
|
}
|
|
else if ((current.parent.kind === 185 || current.parent.kind === 186)) {
|
|
var expr = current.parent;
|
|
isAssigned = expr.operator === 41 || expr.operator === 42;
|
|
}
|
|
if (!isAssigned) {
|
|
return false;
|
|
}
|
|
while (current !== container) {
|
|
if (current === container.statement) {
|
|
return true;
|
|
}
|
|
else {
|
|
current = current.parent;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function captureLexicalThis(node, container) {
|
|
getNodeLinks(node).flags |= 2;
|
|
if (container.kind === 145 || container.kind === 148) {
|
|
var classNode = container.parent;
|
|
getNodeLinks(classNode).flags |= 4;
|
|
}
|
|
else {
|
|
getNodeLinks(container).flags |= 4;
|
|
}
|
|
}
|
|
function findFirstSuperCall(n) {
|
|
if (ts.isSuperCallExpression(n)) {
|
|
return n;
|
|
}
|
|
else if (ts.isFunctionLike(n)) {
|
|
return undefined;
|
|
}
|
|
return ts.forEachChild(n, findFirstSuperCall);
|
|
}
|
|
function getSuperCallInConstructor(constructor) {
|
|
var links = getNodeLinks(constructor);
|
|
if (links.hasSuperCall === undefined) {
|
|
links.superCall = findFirstSuperCall(constructor.body);
|
|
links.hasSuperCall = links.superCall ? true : false;
|
|
}
|
|
return links.superCall;
|
|
}
|
|
function classDeclarationExtendsNull(classDecl) {
|
|
var classSymbol = getSymbolOfNode(classDecl);
|
|
var classInstanceType = getDeclaredTypeOfSymbol(classSymbol);
|
|
var baseConstructorType = getBaseConstructorTypeOfClass(classInstanceType);
|
|
return baseConstructorType === nullWideningType;
|
|
}
|
|
function checkThisExpression(node) {
|
|
var container = ts.getThisContainer(node, true);
|
|
var needToCaptureLexicalThis = false;
|
|
if (container.kind === 148) {
|
|
var containingClassDecl = container.parent;
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(containingClassDecl);
|
|
if (baseTypeNode && !classDeclarationExtendsNull(containingClassDecl)) {
|
|
var superCall = getSuperCallInConstructor(container);
|
|
if (!superCall || superCall.end > node.pos) {
|
|
error(node, ts.Diagnostics.super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class);
|
|
}
|
|
}
|
|
}
|
|
if (container.kind === 180) {
|
|
container = ts.getThisContainer(container, false);
|
|
needToCaptureLexicalThis = (languageVersion < 2);
|
|
}
|
|
switch (container.kind) {
|
|
case 225:
|
|
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_module_or_namespace_body);
|
|
break;
|
|
case 224:
|
|
error(node, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
|
|
break;
|
|
case 148:
|
|
if (isInConstructorArgumentInitializer(node, container)) {
|
|
error(node, ts.Diagnostics.this_cannot_be_referenced_in_constructor_arguments);
|
|
}
|
|
break;
|
|
case 145:
|
|
case 144:
|
|
if (container.flags & 32) {
|
|
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_static_property_initializer);
|
|
}
|
|
break;
|
|
case 140:
|
|
error(node, ts.Diagnostics.this_cannot_be_referenced_in_a_computed_property_name);
|
|
break;
|
|
}
|
|
if (needToCaptureLexicalThis) {
|
|
captureLexicalThis(node, container);
|
|
}
|
|
if (ts.isFunctionLike(container) &&
|
|
(!isInParameterInitializerBeforeContainingFunction(node) || getFunctionLikeThisParameter(container))) {
|
|
if (container.kind === 179 &&
|
|
ts.isInJavaScriptFile(container.parent) &&
|
|
ts.getSpecialPropertyAssignmentKind(container.parent) === 3) {
|
|
var className = container.parent
|
|
.left
|
|
.expression
|
|
.expression;
|
|
var classSymbol = checkExpression(className).symbol;
|
|
if (classSymbol && classSymbol.members && (classSymbol.flags & 16)) {
|
|
return getInferredClassType(classSymbol);
|
|
}
|
|
}
|
|
var type = getContextuallyTypedThisType(container);
|
|
if (type) {
|
|
return type;
|
|
}
|
|
var thisType = getThisTypeOfDeclaration(container);
|
|
if (thisType) {
|
|
return thisType;
|
|
}
|
|
}
|
|
if (ts.isClassLike(container.parent)) {
|
|
var symbol = getSymbolOfNode(container.parent);
|
|
var type = container.flags & 32 ? getTypeOfSymbol(symbol) : getDeclaredTypeOfSymbol(symbol).thisType;
|
|
return getFlowTypeOfReference(node, type, true, true);
|
|
}
|
|
if (ts.isInJavaScriptFile(node)) {
|
|
var type = getTypeForThisExpressionFromJSDoc(container);
|
|
if (type && type !== unknownType) {
|
|
return type;
|
|
}
|
|
}
|
|
if (compilerOptions.noImplicitThis) {
|
|
error(node, ts.Diagnostics.this_implicitly_has_type_any_because_it_does_not_have_a_type_annotation);
|
|
}
|
|
return anyType;
|
|
}
|
|
function getTypeForThisExpressionFromJSDoc(node) {
|
|
var typeTag = ts.getJSDocTypeTag(node);
|
|
if (typeTag && typeTag.typeExpression && typeTag.typeExpression.type && typeTag.typeExpression.type.kind === 269) {
|
|
var jsDocFunctionType = typeTag.typeExpression.type;
|
|
if (jsDocFunctionType.parameters.length > 0 && jsDocFunctionType.parameters[0].type.kind === 272) {
|
|
return getTypeFromTypeNode(jsDocFunctionType.parameters[0].type);
|
|
}
|
|
}
|
|
}
|
|
function isInConstructorArgumentInitializer(node, constructorDecl) {
|
|
for (var n = node; n && n !== constructorDecl; n = n.parent) {
|
|
if (n.kind === 142) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkSuperExpression(node) {
|
|
var isCallExpression = node.parent.kind === 174 && node.parent.expression === node;
|
|
var container = ts.getSuperContainer(node, true);
|
|
var needToCaptureLexicalThis = false;
|
|
if (!isCallExpression) {
|
|
while (container && container.kind === 180) {
|
|
container = ts.getSuperContainer(container, true);
|
|
needToCaptureLexicalThis = languageVersion < 2;
|
|
}
|
|
}
|
|
var canUseSuperExpression = isLegalUsageOfSuperExpression(container);
|
|
var nodeCheckFlag = 0;
|
|
if (!canUseSuperExpression) {
|
|
var current = node;
|
|
while (current && current !== container && current.kind !== 140) {
|
|
current = current.parent;
|
|
}
|
|
if (current && current.kind === 140) {
|
|
error(node, ts.Diagnostics.super_cannot_be_referenced_in_a_computed_property_name);
|
|
}
|
|
else if (isCallExpression) {
|
|
error(node, ts.Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors);
|
|
}
|
|
else if (!container || !container.parent || !(ts.isClassLike(container.parent) || container.parent.kind === 171)) {
|
|
error(node, ts.Diagnostics.super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions);
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class);
|
|
}
|
|
return unknownType;
|
|
}
|
|
if ((container.flags & 32) || isCallExpression) {
|
|
nodeCheckFlag = 512;
|
|
}
|
|
else {
|
|
nodeCheckFlag = 256;
|
|
}
|
|
getNodeLinks(node).flags |= nodeCheckFlag;
|
|
if (container.kind === 147 && container.flags & 256) {
|
|
if (ts.isSuperPropertyOrElementAccess(node.parent) && ts.isAssignmentTarget(node.parent)) {
|
|
getNodeLinks(container).flags |= 4096;
|
|
}
|
|
else {
|
|
getNodeLinks(container).flags |= 2048;
|
|
}
|
|
}
|
|
if (needToCaptureLexicalThis) {
|
|
captureLexicalThis(node.parent, container);
|
|
}
|
|
if (container.parent.kind === 171) {
|
|
if (languageVersion < 2) {
|
|
error(node, ts.Diagnostics.super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher);
|
|
return unknownType;
|
|
}
|
|
else {
|
|
return anyType;
|
|
}
|
|
}
|
|
var classLikeDeclaration = container.parent;
|
|
var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(classLikeDeclaration));
|
|
var baseClassType = classType && getBaseTypes(classType)[0];
|
|
if (!baseClassType) {
|
|
if (!ts.getClassExtendsHeritageClauseElement(classLikeDeclaration)) {
|
|
error(node, ts.Diagnostics.super_can_only_be_referenced_in_a_derived_class);
|
|
}
|
|
return unknownType;
|
|
}
|
|
if (container.kind === 148 && isInConstructorArgumentInitializer(node, container)) {
|
|
error(node, ts.Diagnostics.super_cannot_be_referenced_in_constructor_arguments);
|
|
return unknownType;
|
|
}
|
|
return nodeCheckFlag === 512
|
|
? getBaseConstructorTypeOfClass(classType)
|
|
: getTypeWithThisArgument(baseClassType, classType.thisType);
|
|
function isLegalUsageOfSuperExpression(container) {
|
|
if (!container) {
|
|
return false;
|
|
}
|
|
if (isCallExpression) {
|
|
return container.kind === 148;
|
|
}
|
|
else {
|
|
if (ts.isClassLike(container.parent) || container.parent.kind === 171) {
|
|
if (container.flags & 32) {
|
|
return container.kind === 147 ||
|
|
container.kind === 146 ||
|
|
container.kind === 149 ||
|
|
container.kind === 150;
|
|
}
|
|
else {
|
|
return container.kind === 147 ||
|
|
container.kind === 146 ||
|
|
container.kind === 149 ||
|
|
container.kind === 150 ||
|
|
container.kind === 145 ||
|
|
container.kind === 144 ||
|
|
container.kind === 148;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
function getContextuallyTypedThisType(func) {
|
|
if (isContextSensitiveFunctionOrObjectLiteralMethod(func) && func.kind !== 180) {
|
|
var contextualSignature = getContextualSignature(func);
|
|
if (contextualSignature) {
|
|
return getThisTypeOfSignature(contextualSignature);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextuallyTypedParameterType(parameter) {
|
|
var func = parameter.parent;
|
|
if (isContextSensitiveFunctionOrObjectLiteralMethod(func)) {
|
|
var iife = ts.getImmediatelyInvokedFunctionExpression(func);
|
|
if (iife) {
|
|
var indexOfParameter = ts.indexOf(func.parameters, parameter);
|
|
if (iife.arguments && indexOfParameter < iife.arguments.length) {
|
|
if (parameter.dotDotDotToken) {
|
|
var restTypes = [];
|
|
for (var i = indexOfParameter; i < iife.arguments.length; i++) {
|
|
restTypes.push(getTypeOfExpression(iife.arguments[i]));
|
|
}
|
|
return createArrayType(getUnionType(restTypes));
|
|
}
|
|
var links = getNodeLinks(iife);
|
|
var cached = links.resolvedSignature;
|
|
links.resolvedSignature = anySignature;
|
|
var type = checkExpression(iife.arguments[indexOfParameter]);
|
|
links.resolvedSignature = cached;
|
|
return type;
|
|
}
|
|
}
|
|
var contextualSignature = getContextualSignature(func);
|
|
if (contextualSignature) {
|
|
var funcHasRestParameters = ts.hasRestParameter(func);
|
|
var len = func.parameters.length - (funcHasRestParameters ? 1 : 0);
|
|
var indexOfParameter = ts.indexOf(func.parameters, parameter);
|
|
if (indexOfParameter < len) {
|
|
return getTypeAtPosition(contextualSignature, indexOfParameter);
|
|
}
|
|
if (funcHasRestParameters &&
|
|
indexOfParameter === (func.parameters.length - 1) &&
|
|
isRestParameterIndex(contextualSignature, func.parameters.length - 1)) {
|
|
return getTypeOfSymbol(ts.lastOrUndefined(contextualSignature.parameters));
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForInitializerExpression(node) {
|
|
var declaration = node.parent;
|
|
if (node === declaration.initializer) {
|
|
if (declaration.type) {
|
|
return getTypeFromTypeNode(declaration.type);
|
|
}
|
|
if (declaration.kind === 142) {
|
|
var type = getContextuallyTypedParameterType(declaration);
|
|
if (type) {
|
|
return type;
|
|
}
|
|
}
|
|
if (ts.isBindingPattern(declaration.name)) {
|
|
return getTypeFromBindingPattern(declaration.name, true);
|
|
}
|
|
if (ts.isBindingPattern(declaration.parent)) {
|
|
var parentDeclaration = declaration.parent.parent;
|
|
var name_12 = declaration.propertyName || declaration.name;
|
|
if (ts.isVariableLike(parentDeclaration) &&
|
|
parentDeclaration.type &&
|
|
!ts.isBindingPattern(name_12)) {
|
|
var text = getTextOfPropertyName(name_12);
|
|
if (text) {
|
|
return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForReturnExpression(node) {
|
|
var func = ts.getContainingFunction(node);
|
|
if (ts.isAsyncFunctionLike(func)) {
|
|
var contextualReturnType = getContextualReturnType(func);
|
|
if (contextualReturnType) {
|
|
return getPromisedType(contextualReturnType);
|
|
}
|
|
return undefined;
|
|
}
|
|
if (func && !func.asteriskToken) {
|
|
return getContextualReturnType(func);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForYieldOperand(node) {
|
|
var func = ts.getContainingFunction(node);
|
|
if (func) {
|
|
var contextualReturnType = getContextualReturnType(func);
|
|
if (contextualReturnType) {
|
|
return node.asteriskToken
|
|
? contextualReturnType
|
|
: getElementTypeOfIterableIterator(contextualReturnType);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function isInParameterInitializerBeforeContainingFunction(node) {
|
|
while (node.parent && !ts.isFunctionLike(node.parent)) {
|
|
if (node.parent.kind === 142 && node.parent.initializer === node) {
|
|
return true;
|
|
}
|
|
node = node.parent;
|
|
}
|
|
return false;
|
|
}
|
|
function getContextualReturnType(functionDecl) {
|
|
if (functionDecl.type ||
|
|
functionDecl.kind === 148 ||
|
|
functionDecl.kind === 149 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 150))) {
|
|
return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl));
|
|
}
|
|
var signature = getContextualSignatureForFunctionLikeDeclaration(functionDecl);
|
|
if (signature) {
|
|
return getReturnTypeOfSignature(signature);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForArgument(callTarget, arg) {
|
|
var args = getEffectiveCallArguments(callTarget);
|
|
var argIndex = ts.indexOf(args, arg);
|
|
if (argIndex >= 0) {
|
|
var signature = getResolvedOrAnySignature(callTarget);
|
|
return getTypeAtPosition(signature, argIndex);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForSubstitutionExpression(template, substitutionExpression) {
|
|
if (template.parent.kind === 176) {
|
|
return getContextualTypeForArgument(template.parent, substitutionExpression);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForBinaryOperand(node) {
|
|
var binaryExpression = node.parent;
|
|
var operator = binaryExpression.operatorToken.kind;
|
|
if (operator >= 56 && operator <= 68) {
|
|
if (node === binaryExpression.right) {
|
|
return checkExpression(binaryExpression.left);
|
|
}
|
|
}
|
|
else if (operator === 52) {
|
|
var type = getContextualType(binaryExpression);
|
|
if (!type && node === binaryExpression.right) {
|
|
type = checkExpression(binaryExpression.left);
|
|
}
|
|
return type;
|
|
}
|
|
else if (operator === 51 || operator === 24) {
|
|
if (node === binaryExpression.right) {
|
|
return getContextualType(binaryExpression);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function applyToContextualType(type, mapper) {
|
|
if (!(type.flags & 16384)) {
|
|
return mapper(type);
|
|
}
|
|
var types = type.types;
|
|
var mappedType;
|
|
var mappedTypes;
|
|
for (var _i = 0, types_8 = types; _i < types_8.length; _i++) {
|
|
var current = types_8[_i];
|
|
var t = mapper(current);
|
|
if (t) {
|
|
if (!mappedType) {
|
|
mappedType = t;
|
|
}
|
|
else if (!mappedTypes) {
|
|
mappedTypes = [mappedType, t];
|
|
}
|
|
else {
|
|
mappedTypes.push(t);
|
|
}
|
|
}
|
|
}
|
|
return mappedTypes ? getUnionType(mappedTypes) : mappedType;
|
|
}
|
|
function getTypeOfPropertyOfContextualType(type, name) {
|
|
return applyToContextualType(type, function (t) {
|
|
var prop = t.flags & 130048 ? getPropertyOfType(t, name) : undefined;
|
|
return prop ? getTypeOfSymbol(prop) : undefined;
|
|
});
|
|
}
|
|
function getIndexTypeOfContextualType(type, kind) {
|
|
return applyToContextualType(type, function (t) { return getIndexTypeOfStructuredType(t, kind); });
|
|
}
|
|
function contextualTypeIsTupleLikeType(type) {
|
|
return !!(type.flags & 16384 ? ts.forEach(type.types, isTupleLikeType) : isTupleLikeType(type));
|
|
}
|
|
function getContextualTypeForObjectLiteralMethod(node) {
|
|
ts.Debug.assert(ts.isObjectLiteralMethod(node));
|
|
if (isInsideWithStatementBody(node)) {
|
|
return undefined;
|
|
}
|
|
return getContextualTypeForObjectLiteralElement(node);
|
|
}
|
|
function getContextualTypeForObjectLiteralElement(element) {
|
|
var objectLiteral = element.parent;
|
|
var type = getApparentTypeOfContextualType(objectLiteral);
|
|
if (type) {
|
|
if (!ts.hasDynamicName(element)) {
|
|
var symbolName = getSymbolOfNode(element).name;
|
|
var propertyType = getTypeOfPropertyOfContextualType(type, symbolName);
|
|
if (propertyType) {
|
|
return propertyType;
|
|
}
|
|
}
|
|
return isNumericName(element.name) && getIndexTypeOfContextualType(type, 1) ||
|
|
getIndexTypeOfContextualType(type, 0);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForElementExpression(node) {
|
|
var arrayLiteral = node.parent;
|
|
var type = getApparentTypeOfContextualType(arrayLiteral);
|
|
if (type) {
|
|
var index = ts.indexOf(arrayLiteral.elements, node);
|
|
return getTypeOfPropertyOfContextualType(type, "" + index)
|
|
|| getIndexTypeOfContextualType(type, 1)
|
|
|| (languageVersion >= 2 ? getElementTypeOfIterable(type, undefined) : undefined);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getContextualTypeForConditionalOperand(node) {
|
|
var conditional = node.parent;
|
|
return node === conditional.whenTrue || node === conditional.whenFalse ? getContextualType(conditional) : undefined;
|
|
}
|
|
function getContextualTypeForJsxAttribute(attribute) {
|
|
var kind = attribute.kind;
|
|
var jsxElement = attribute.parent;
|
|
var attrsType = getJsxElementAttributesType(jsxElement);
|
|
if (attribute.kind === 246) {
|
|
if (!attrsType || isTypeAny(attrsType)) {
|
|
return undefined;
|
|
}
|
|
return getTypeOfPropertyOfType(attrsType, attribute.name.text);
|
|
}
|
|
else if (attribute.kind === 247) {
|
|
return attrsType;
|
|
}
|
|
ts.Debug.fail("Expected JsxAttribute or JsxSpreadAttribute, got ts.SyntaxKind[" + kind + "]");
|
|
}
|
|
function getApparentTypeOfContextualType(node) {
|
|
var type = getContextualType(node);
|
|
return type && getApparentType(type);
|
|
}
|
|
function getContextualType(node) {
|
|
if (isInsideWithStatementBody(node)) {
|
|
return undefined;
|
|
}
|
|
if (node.contextualType) {
|
|
return node.contextualType;
|
|
}
|
|
var parent = node.parent;
|
|
switch (parent.kind) {
|
|
case 218:
|
|
case 142:
|
|
case 145:
|
|
case 144:
|
|
case 169:
|
|
return getContextualTypeForInitializerExpression(node);
|
|
case 180:
|
|
case 211:
|
|
return getContextualTypeForReturnExpression(node);
|
|
case 190:
|
|
return getContextualTypeForYieldOperand(parent);
|
|
case 174:
|
|
case 175:
|
|
return getContextualTypeForArgument(parent, node);
|
|
case 177:
|
|
case 195:
|
|
return getTypeFromTypeNode(parent.type);
|
|
case 187:
|
|
return getContextualTypeForBinaryOperand(node);
|
|
case 253:
|
|
return getContextualTypeForObjectLiteralElement(parent);
|
|
case 170:
|
|
return getContextualTypeForElementExpression(node);
|
|
case 188:
|
|
return getContextualTypeForConditionalOperand(node);
|
|
case 197:
|
|
ts.Debug.assert(parent.parent.kind === 189);
|
|
return getContextualTypeForSubstitutionExpression(parent.parent, node);
|
|
case 178:
|
|
return getContextualType(parent);
|
|
case 248:
|
|
return getContextualType(parent);
|
|
case 246:
|
|
case 247:
|
|
return getContextualTypeForJsxAttribute(parent);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getNonGenericSignature(type) {
|
|
var signatures = getSignaturesOfStructuredType(type, 0);
|
|
if (signatures.length === 1) {
|
|
var signature = signatures[0];
|
|
if (!signature.typeParameters) {
|
|
return signature;
|
|
}
|
|
}
|
|
}
|
|
function isFunctionExpressionOrArrowFunction(node) {
|
|
return node.kind === 179 || node.kind === 180;
|
|
}
|
|
function getContextualSignatureForFunctionLikeDeclaration(node) {
|
|
return isFunctionExpressionOrArrowFunction(node) || ts.isObjectLiteralMethod(node)
|
|
? getContextualSignature(node)
|
|
: undefined;
|
|
}
|
|
function getContextualTypeForFunctionLikeDeclaration(node) {
|
|
return ts.isObjectLiteralMethod(node) ?
|
|
getContextualTypeForObjectLiteralMethod(node) :
|
|
getApparentTypeOfContextualType(node);
|
|
}
|
|
function getContextualSignature(node) {
|
|
ts.Debug.assert(node.kind !== 147 || ts.isObjectLiteralMethod(node));
|
|
var type = getContextualTypeForFunctionLikeDeclaration(node);
|
|
if (!type) {
|
|
return undefined;
|
|
}
|
|
if (!(type.flags & 16384)) {
|
|
return getNonGenericSignature(type);
|
|
}
|
|
var signatureList;
|
|
var types = type.types;
|
|
for (var _i = 0, types_9 = types; _i < types_9.length; _i++) {
|
|
var current = types_9[_i];
|
|
var signature = getNonGenericSignature(current);
|
|
if (signature) {
|
|
if (!signatureList) {
|
|
signatureList = [signature];
|
|
}
|
|
else if (!compareSignaturesIdentical(signatureList[0], signature, false, true, true, compareTypesIdentical)) {
|
|
return undefined;
|
|
}
|
|
else {
|
|
signatureList.push(signature);
|
|
}
|
|
}
|
|
}
|
|
var result;
|
|
if (signatureList) {
|
|
result = cloneSignature(signatureList[0]);
|
|
result.resolvedReturnType = undefined;
|
|
result.unionSignatures = signatureList;
|
|
}
|
|
return result;
|
|
}
|
|
function isInferentialContext(mapper) {
|
|
return mapper && mapper.context;
|
|
}
|
|
function checkSpreadElementExpression(node, contextualMapper) {
|
|
var arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper);
|
|
return checkIteratedTypeOrElementType(arrayOrIterableType, node.expression, false);
|
|
}
|
|
function hasDefaultValue(node) {
|
|
return (node.kind === 169 && !!node.initializer) ||
|
|
(node.kind === 187 && node.operatorToken.kind === 56);
|
|
}
|
|
function checkArrayLiteral(node, contextualMapper) {
|
|
var elements = node.elements;
|
|
var hasSpreadElement = false;
|
|
var elementTypes = [];
|
|
var inDestructuringPattern = ts.isAssignmentTarget(node);
|
|
for (var _i = 0, elements_1 = elements; _i < elements_1.length; _i++) {
|
|
var e = elements_1[_i];
|
|
if (inDestructuringPattern && e.kind === 191) {
|
|
var restArrayType = checkExpression(e.expression, contextualMapper);
|
|
var restElementType = getIndexTypeOfType(restArrayType, 1) ||
|
|
(languageVersion >= 2 ? getElementTypeOfIterable(restArrayType, undefined) : undefined);
|
|
if (restElementType) {
|
|
elementTypes.push(restElementType);
|
|
}
|
|
}
|
|
else {
|
|
var type = checkExpression(e, contextualMapper);
|
|
elementTypes.push(type);
|
|
}
|
|
hasSpreadElement = hasSpreadElement || e.kind === 191;
|
|
}
|
|
if (!hasSpreadElement) {
|
|
if (inDestructuringPattern && elementTypes.length) {
|
|
var type = createNewTupleType(elementTypes);
|
|
type.pattern = node;
|
|
return type;
|
|
}
|
|
var contextualType = getApparentTypeOfContextualType(node);
|
|
if (contextualType && contextualTypeIsTupleLikeType(contextualType)) {
|
|
var pattern = contextualType.pattern;
|
|
if (pattern && (pattern.kind === 168 || pattern.kind === 170)) {
|
|
var patternElements = pattern.elements;
|
|
for (var i = elementTypes.length; i < patternElements.length; i++) {
|
|
var patternElement = patternElements[i];
|
|
if (hasDefaultValue(patternElement)) {
|
|
elementTypes.push(contextualType.elementTypes[i]);
|
|
}
|
|
else {
|
|
if (patternElement.kind !== 193) {
|
|
error(patternElement, ts.Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
|
|
}
|
|
elementTypes.push(unknownType);
|
|
}
|
|
}
|
|
}
|
|
if (elementTypes.length) {
|
|
return createTupleType(elementTypes);
|
|
}
|
|
}
|
|
}
|
|
return createArrayType(elementTypes.length ? getUnionType(elementTypes) : strictNullChecks ? neverType : undefinedWideningType);
|
|
}
|
|
function isNumericName(name) {
|
|
return name.kind === 140 ? isNumericComputedName(name) : isNumericLiteralName(name.text);
|
|
}
|
|
function isNumericComputedName(name) {
|
|
return isTypeAnyOrAllConstituentTypesHaveKind(checkComputedPropertyName(name), 132);
|
|
}
|
|
function isTypeAnyOrAllConstituentTypesHaveKind(type, kind) {
|
|
return isTypeAny(type) || isTypeOfKind(type, kind);
|
|
}
|
|
function isNumericLiteralName(name) {
|
|
return (+name).toString() === name;
|
|
}
|
|
function checkComputedPropertyName(node) {
|
|
var links = getNodeLinks(node.expression);
|
|
if (!links.resolvedType) {
|
|
links.resolvedType = checkExpression(node.expression);
|
|
if (!isTypeAnyOrAllConstituentTypesHaveKind(links.resolvedType, 132 | 258 | 16777216)) {
|
|
error(node, ts.Diagnostics.A_computed_property_name_must_be_of_type_string_number_symbol_or_any);
|
|
}
|
|
else {
|
|
checkThatExpressionIsProperSymbolReference(node.expression, links.resolvedType, true);
|
|
}
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function getObjectLiteralIndexInfo(node, properties, kind) {
|
|
var propTypes = [];
|
|
for (var i = 0; i < properties.length; i++) {
|
|
if (kind === 0 || isNumericName(node.properties[i].name)) {
|
|
propTypes.push(getTypeOfSymbol(properties[i]));
|
|
}
|
|
}
|
|
var unionType = propTypes.length ? getUnionType(propTypes) : undefinedType;
|
|
return createIndexInfo(unionType, false);
|
|
}
|
|
function checkObjectLiteral(node, contextualMapper) {
|
|
var inDestructuringPattern = ts.isAssignmentTarget(node);
|
|
checkGrammarObjectLiteralExpression(node, inDestructuringPattern);
|
|
var propertiesTable = {};
|
|
var propertiesArray = [];
|
|
var contextualType = getApparentTypeOfContextualType(node);
|
|
var contextualTypeHasPattern = contextualType && contextualType.pattern &&
|
|
(contextualType.pattern.kind === 167 || contextualType.pattern.kind === 171);
|
|
var typeFlags = 0;
|
|
var patternWithComputedProperties = false;
|
|
var hasComputedStringProperty = false;
|
|
var hasComputedNumberProperty = false;
|
|
for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
|
|
var memberDecl = _a[_i];
|
|
var member = memberDecl.symbol;
|
|
if (memberDecl.kind === 253 ||
|
|
memberDecl.kind === 254 ||
|
|
ts.isObjectLiteralMethod(memberDecl)) {
|
|
var type = void 0;
|
|
if (memberDecl.kind === 253) {
|
|
type = checkPropertyAssignment(memberDecl, contextualMapper);
|
|
}
|
|
else if (memberDecl.kind === 147) {
|
|
type = checkObjectLiteralMethod(memberDecl, contextualMapper);
|
|
}
|
|
else {
|
|
ts.Debug.assert(memberDecl.kind === 254);
|
|
type = checkExpression(memberDecl.name, contextualMapper);
|
|
}
|
|
typeFlags |= type.flags;
|
|
var prop = createSymbol(4 | 67108864 | member.flags, member.name);
|
|
if (inDestructuringPattern) {
|
|
var isOptional = (memberDecl.kind === 253 && hasDefaultValue(memberDecl.initializer)) ||
|
|
(memberDecl.kind === 254 && memberDecl.objectAssignmentInitializer);
|
|
if (isOptional) {
|
|
prop.flags |= 536870912;
|
|
}
|
|
if (ts.hasDynamicName(memberDecl)) {
|
|
patternWithComputedProperties = true;
|
|
}
|
|
}
|
|
else if (contextualTypeHasPattern && !(contextualType.flags & 67108864)) {
|
|
var impliedProp = getPropertyOfType(contextualType, member.name);
|
|
if (impliedProp) {
|
|
prop.flags |= impliedProp.flags & 536870912;
|
|
}
|
|
else if (!compilerOptions.suppressExcessPropertyErrors) {
|
|
error(memberDecl.name, ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(member), typeToString(contextualType));
|
|
}
|
|
}
|
|
prop.declarations = member.declarations;
|
|
prop.parent = member.parent;
|
|
if (member.valueDeclaration) {
|
|
prop.valueDeclaration = member.valueDeclaration;
|
|
}
|
|
prop.type = type;
|
|
prop.target = member;
|
|
member = prop;
|
|
}
|
|
else {
|
|
ts.Debug.assert(memberDecl.kind === 149 || memberDecl.kind === 150);
|
|
checkAccessorDeclaration(memberDecl);
|
|
}
|
|
if (ts.hasDynamicName(memberDecl)) {
|
|
if (isNumericName(memberDecl.name)) {
|
|
hasComputedNumberProperty = true;
|
|
}
|
|
else {
|
|
hasComputedStringProperty = true;
|
|
}
|
|
}
|
|
else {
|
|
propertiesTable[member.name] = member;
|
|
}
|
|
propertiesArray.push(member);
|
|
}
|
|
if (contextualTypeHasPattern) {
|
|
for (var _b = 0, _c = getPropertiesOfType(contextualType); _b < _c.length; _b++) {
|
|
var prop = _c[_b];
|
|
if (!ts.hasProperty(propertiesTable, prop.name)) {
|
|
if (!(prop.flags & 536870912)) {
|
|
error(prop.valueDeclaration || prop.bindingElement, ts.Diagnostics.Initializer_provides_no_value_for_this_binding_element_and_the_binding_element_has_no_default_value);
|
|
}
|
|
propertiesTable[prop.name] = prop;
|
|
propertiesArray.push(prop);
|
|
}
|
|
}
|
|
}
|
|
var stringIndexInfo = hasComputedStringProperty ? getObjectLiteralIndexInfo(node, propertiesArray, 0) : undefined;
|
|
var numberIndexInfo = hasComputedNumberProperty ? getObjectLiteralIndexInfo(node, propertiesArray, 1) : undefined;
|
|
var result = createAnonymousType(node.symbol, propertiesTable, emptyArray, emptyArray, stringIndexInfo, numberIndexInfo);
|
|
var freshObjectLiteralFlag = compilerOptions.suppressExcessPropertyErrors ? 0 : 1048576;
|
|
result.flags |= 524288 | 4194304 | freshObjectLiteralFlag | (typeFlags & 14680064) | (patternWithComputedProperties ? 67108864 : 0);
|
|
if (inDestructuringPattern) {
|
|
result.pattern = node;
|
|
}
|
|
return result;
|
|
}
|
|
function checkJsxSelfClosingElement(node) {
|
|
checkJsxOpeningLikeElement(node);
|
|
return jsxElementType || anyType;
|
|
}
|
|
function checkJsxElement(node) {
|
|
checkJsxOpeningLikeElement(node.openingElement);
|
|
if (isJsxIntrinsicIdentifier(node.closingElement.tagName)) {
|
|
getIntrinsicTagSymbol(node.closingElement);
|
|
}
|
|
else {
|
|
checkExpression(node.closingElement.tagName);
|
|
}
|
|
for (var _i = 0, _a = node.children; _i < _a.length; _i++) {
|
|
var child = _a[_i];
|
|
switch (child.kind) {
|
|
case 248:
|
|
checkJsxExpression(child);
|
|
break;
|
|
case 241:
|
|
checkJsxElement(child);
|
|
break;
|
|
case 242:
|
|
checkJsxSelfClosingElement(child);
|
|
break;
|
|
}
|
|
}
|
|
return jsxElementType || anyType;
|
|
}
|
|
function isUnhyphenatedJsxName(name) {
|
|
return name.indexOf("-") < 0;
|
|
}
|
|
function isJsxIntrinsicIdentifier(tagName) {
|
|
if (tagName.kind === 172 || tagName.kind === 97) {
|
|
return false;
|
|
}
|
|
else {
|
|
return ts.isIntrinsicJsxName(tagName.text);
|
|
}
|
|
}
|
|
function checkJsxAttribute(node, elementAttributesType, nameTable) {
|
|
var correspondingPropType = undefined;
|
|
if (elementAttributesType === emptyObjectType && isUnhyphenatedJsxName(node.name.text)) {
|
|
error(node.parent, ts.Diagnostics.JSX_element_class_does_not_support_attributes_because_it_does_not_have_a_0_property, getJsxElementPropertiesName());
|
|
}
|
|
else if (elementAttributesType && !isTypeAny(elementAttributesType)) {
|
|
var correspondingPropSymbol = getPropertyOfType(elementAttributesType, node.name.text);
|
|
correspondingPropType = correspondingPropSymbol && getTypeOfSymbol(correspondingPropSymbol);
|
|
if (isUnhyphenatedJsxName(node.name.text)) {
|
|
var indexerType = getIndexTypeOfType(elementAttributesType, 0);
|
|
if (indexerType) {
|
|
correspondingPropType = indexerType;
|
|
}
|
|
else {
|
|
if (!correspondingPropType) {
|
|
error(node.name, ts.Diagnostics.Property_0_does_not_exist_on_type_1, node.name.text, typeToString(elementAttributesType));
|
|
return unknownType;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var exprType;
|
|
if (node.initializer) {
|
|
exprType = checkExpression(node.initializer);
|
|
}
|
|
else {
|
|
exprType = booleanType;
|
|
}
|
|
if (correspondingPropType) {
|
|
checkTypeAssignableTo(exprType, correspondingPropType, node);
|
|
}
|
|
nameTable[node.name.text] = true;
|
|
return exprType;
|
|
}
|
|
function checkJsxSpreadAttribute(node, elementAttributesType, nameTable) {
|
|
var type = checkExpression(node.expression);
|
|
var props = getPropertiesOfType(type);
|
|
for (var _i = 0, props_2 = props; _i < props_2.length; _i++) {
|
|
var prop = props_2[_i];
|
|
if (!nameTable[prop.name]) {
|
|
var targetPropSym = getPropertyOfType(elementAttributesType, prop.name);
|
|
if (targetPropSym) {
|
|
var msg = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Property_0_of_JSX_spread_attribute_is_not_assignable_to_target_property, prop.name);
|
|
checkTypeAssignableTo(getTypeOfSymbol(prop), getTypeOfSymbol(targetPropSym), node, undefined, msg);
|
|
}
|
|
nameTable[prop.name] = true;
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function getJsxType(name) {
|
|
if (jsxTypes[name] === undefined) {
|
|
return jsxTypes[name] = getExportedTypeFromNamespace(JsxNames.JSX, name) || unknownType;
|
|
}
|
|
return jsxTypes[name];
|
|
}
|
|
function getIntrinsicTagSymbol(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedSymbol) {
|
|
var intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
|
|
if (intrinsicElementsType !== unknownType) {
|
|
var intrinsicProp = getPropertyOfType(intrinsicElementsType, node.tagName.text);
|
|
if (intrinsicProp) {
|
|
links.jsxFlags |= 1;
|
|
return links.resolvedSymbol = intrinsicProp;
|
|
}
|
|
var indexSignatureType = getIndexTypeOfType(intrinsicElementsType, 0);
|
|
if (indexSignatureType) {
|
|
links.jsxFlags |= 2;
|
|
return links.resolvedSymbol = intrinsicElementsType.symbol;
|
|
}
|
|
error(node, ts.Diagnostics.Property_0_does_not_exist_on_type_1, node.tagName.text, "JSX." + JsxNames.IntrinsicElements);
|
|
return links.resolvedSymbol = unknownSymbol;
|
|
}
|
|
else {
|
|
if (compilerOptions.noImplicitAny) {
|
|
error(node, ts.Diagnostics.JSX_element_implicitly_has_type_any_because_no_interface_JSX_0_exists, JsxNames.IntrinsicElements);
|
|
}
|
|
return links.resolvedSymbol = unknownSymbol;
|
|
}
|
|
}
|
|
return links.resolvedSymbol;
|
|
}
|
|
function getJsxElementInstanceType(node, valueType) {
|
|
ts.Debug.assert(!(valueType.flags & 16384));
|
|
if (isTypeAny(valueType)) {
|
|
return anyType;
|
|
}
|
|
var signatures = getSignaturesOfType(valueType, 1);
|
|
if (signatures.length === 0) {
|
|
signatures = getSignaturesOfType(valueType, 0);
|
|
if (signatures.length === 0) {
|
|
error(node.tagName, ts.Diagnostics.JSX_element_type_0_does_not_have_any_construct_or_call_signatures, ts.getTextOfNode(node.tagName));
|
|
return unknownType;
|
|
}
|
|
}
|
|
return getUnionType(signatures.map(getReturnTypeOfSignature));
|
|
}
|
|
function getJsxElementPropertiesName() {
|
|
var jsxNamespace = getGlobalSymbol(JsxNames.JSX, 1536, undefined);
|
|
var attribsPropTypeSym = jsxNamespace && getSymbol(jsxNamespace.exports, JsxNames.ElementAttributesPropertyNameContainer, 793056);
|
|
var attribPropType = attribsPropTypeSym && getDeclaredTypeOfSymbol(attribsPropTypeSym);
|
|
var attribProperties = attribPropType && getPropertiesOfType(attribPropType);
|
|
if (attribProperties) {
|
|
if (attribProperties.length === 0) {
|
|
return "";
|
|
}
|
|
else if (attribProperties.length === 1) {
|
|
return attribProperties[0].name;
|
|
}
|
|
else {
|
|
error(attribsPropTypeSym.declarations[0], ts.Diagnostics.The_global_type_JSX_0_may_not_have_more_than_one_property, JsxNames.ElementAttributesPropertyNameContainer);
|
|
return undefined;
|
|
}
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
function getResolvedJsxType(node, elemType, elemClassType) {
|
|
if (!elemType) {
|
|
elemType = checkExpression(node.tagName);
|
|
}
|
|
if (elemType.flags & 16384) {
|
|
var types = elemType.types;
|
|
return getUnionType(types.map(function (type) {
|
|
return getResolvedJsxType(node, type, elemClassType);
|
|
}));
|
|
}
|
|
if (elemType.flags & 2) {
|
|
return anyType;
|
|
}
|
|
else if (elemType.flags & 256) {
|
|
var intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements);
|
|
if (intrinsicElementsType !== unknownType) {
|
|
var stringLiteralTypeName = elemType.text;
|
|
var intrinsicProp = getPropertyOfType(intrinsicElementsType, stringLiteralTypeName);
|
|
if (intrinsicProp) {
|
|
return getTypeOfSymbol(intrinsicProp);
|
|
}
|
|
var indexSignatureType = getIndexTypeOfType(intrinsicElementsType, 0);
|
|
if (indexSignatureType) {
|
|
return indexSignatureType;
|
|
}
|
|
error(node, ts.Diagnostics.Property_0_does_not_exist_on_type_1, stringLiteralTypeName, "JSX." + JsxNames.IntrinsicElements);
|
|
}
|
|
return anyType;
|
|
}
|
|
var elemInstanceType = getJsxElementInstanceType(node, elemType);
|
|
if (!elemClassType || !isTypeAssignableTo(elemInstanceType, elemClassType)) {
|
|
if (jsxElementType) {
|
|
var callSignatures = elemType && getSignaturesOfType(elemType, 0);
|
|
var callSignature = callSignatures && callSignatures.length > 0 && callSignatures[0];
|
|
var callReturnType = callSignature && getReturnTypeOfSignature(callSignature);
|
|
var paramType = callReturnType && (callSignature.parameters.length === 0 ? emptyObjectType : getTypeOfSymbol(callSignature.parameters[0]));
|
|
if (callReturnType && isTypeAssignableTo(callReturnType, jsxElementType)) {
|
|
var intrinsicAttributes = getJsxType(JsxNames.IntrinsicAttributes);
|
|
if (intrinsicAttributes !== unknownType) {
|
|
paramType = intersectTypes(intrinsicAttributes, paramType);
|
|
}
|
|
return paramType;
|
|
}
|
|
}
|
|
}
|
|
if (elemClassType) {
|
|
checkTypeRelatedTo(elemInstanceType, elemClassType, assignableRelation, node, ts.Diagnostics.JSX_element_type_0_is_not_a_constructor_function_for_JSX_elements);
|
|
}
|
|
if (isTypeAny(elemInstanceType)) {
|
|
return elemInstanceType;
|
|
}
|
|
var propsName = getJsxElementPropertiesName();
|
|
if (propsName === undefined) {
|
|
return anyType;
|
|
}
|
|
else if (propsName === "") {
|
|
return elemInstanceType;
|
|
}
|
|
else {
|
|
var attributesType = getTypeOfPropertyOfType(elemInstanceType, propsName);
|
|
if (!attributesType) {
|
|
return emptyObjectType;
|
|
}
|
|
else if (isTypeAny(attributesType) || (attributesType === unknownType)) {
|
|
return attributesType;
|
|
}
|
|
else if (attributesType.flags & 16384) {
|
|
error(node.tagName, ts.Diagnostics.JSX_element_attributes_type_0_may_not_be_a_union_type, typeToString(attributesType));
|
|
return anyType;
|
|
}
|
|
else {
|
|
var apparentAttributesType = attributesType;
|
|
var intrinsicClassAttribs = getJsxType(JsxNames.IntrinsicClassAttributes);
|
|
if (intrinsicClassAttribs !== unknownType) {
|
|
var typeParams = getLocalTypeParametersOfClassOrInterfaceOrTypeAlias(intrinsicClassAttribs.symbol);
|
|
if (typeParams) {
|
|
if (typeParams.length === 1) {
|
|
apparentAttributesType = intersectTypes(createTypeReference(intrinsicClassAttribs, [elemInstanceType]), apparentAttributesType);
|
|
}
|
|
}
|
|
else {
|
|
apparentAttributesType = intersectTypes(attributesType, intrinsicClassAttribs);
|
|
}
|
|
}
|
|
var intrinsicAttribs = getJsxType(JsxNames.IntrinsicAttributes);
|
|
if (intrinsicAttribs !== unknownType) {
|
|
apparentAttributesType = intersectTypes(intrinsicAttribs, apparentAttributesType);
|
|
}
|
|
return apparentAttributesType;
|
|
}
|
|
}
|
|
}
|
|
function getJsxElementAttributesType(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedJsxType) {
|
|
if (isJsxIntrinsicIdentifier(node.tagName)) {
|
|
var symbol = getIntrinsicTagSymbol(node);
|
|
if (links.jsxFlags & 1) {
|
|
return links.resolvedJsxType = getTypeOfSymbol(symbol);
|
|
}
|
|
else if (links.jsxFlags & 2) {
|
|
return links.resolvedJsxType = getIndexInfoOfSymbol(symbol, 0).type;
|
|
}
|
|
else {
|
|
return links.resolvedJsxType = unknownType;
|
|
}
|
|
}
|
|
else {
|
|
var elemClassType = getJsxGlobalElementClassType();
|
|
return links.resolvedJsxType = getResolvedJsxType(node, undefined, elemClassType);
|
|
}
|
|
}
|
|
return links.resolvedJsxType;
|
|
}
|
|
function getJsxAttributePropertySymbol(attrib) {
|
|
var attributesType = getJsxElementAttributesType(attrib.parent);
|
|
var prop = getPropertyOfType(attributesType, attrib.name.text);
|
|
return prop || unknownSymbol;
|
|
}
|
|
function getJsxGlobalElementClassType() {
|
|
if (!jsxElementClassType) {
|
|
jsxElementClassType = getExportedTypeFromNamespace(JsxNames.JSX, JsxNames.ElementClass);
|
|
}
|
|
return jsxElementClassType;
|
|
}
|
|
function getJsxIntrinsicTagNames() {
|
|
var intrinsics = getJsxType(JsxNames.IntrinsicElements);
|
|
return intrinsics ? getPropertiesOfType(intrinsics) : emptyArray;
|
|
}
|
|
function checkJsxPreconditions(errorNode) {
|
|
if ((compilerOptions.jsx || 0) === 0) {
|
|
error(errorNode, ts.Diagnostics.Cannot_use_JSX_unless_the_jsx_flag_is_provided);
|
|
}
|
|
if (jsxElementType === undefined) {
|
|
if (compilerOptions.noImplicitAny) {
|
|
error(errorNode, ts.Diagnostics.JSX_element_implicitly_has_type_any_because_the_global_type_JSX_Element_does_not_exist);
|
|
}
|
|
}
|
|
}
|
|
function checkJsxOpeningLikeElement(node) {
|
|
checkGrammarJsxElement(node);
|
|
checkJsxPreconditions(node);
|
|
var reactRefErr = compilerOptions.jsx === 2 ? ts.Diagnostics.Cannot_find_name_0 : undefined;
|
|
var reactNamespace = compilerOptions.reactNamespace ? compilerOptions.reactNamespace : "React";
|
|
var reactSym = resolveName(node.tagName, reactNamespace, 107455, reactRefErr, reactNamespace);
|
|
if (reactSym) {
|
|
getSymbolLinks(reactSym).referenced = true;
|
|
}
|
|
var targetAttributesType = getJsxElementAttributesType(node);
|
|
var nameTable = {};
|
|
var sawSpreadedAny = false;
|
|
for (var i = node.attributes.length - 1; i >= 0; i--) {
|
|
if (node.attributes[i].kind === 246) {
|
|
checkJsxAttribute((node.attributes[i]), targetAttributesType, nameTable);
|
|
}
|
|
else {
|
|
ts.Debug.assert(node.attributes[i].kind === 247);
|
|
var spreadType = checkJsxSpreadAttribute((node.attributes[i]), targetAttributesType, nameTable);
|
|
if (isTypeAny(spreadType)) {
|
|
sawSpreadedAny = true;
|
|
}
|
|
}
|
|
}
|
|
if (targetAttributesType && !sawSpreadedAny) {
|
|
var targetProperties = getPropertiesOfType(targetAttributesType);
|
|
for (var i = 0; i < targetProperties.length; i++) {
|
|
if (!(targetProperties[i].flags & 536870912) &&
|
|
nameTable[targetProperties[i].name] === undefined) {
|
|
error(node, ts.Diagnostics.Property_0_is_missing_in_type_1, targetProperties[i].name, typeToString(targetAttributesType));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkJsxExpression(node) {
|
|
if (node.expression) {
|
|
return checkExpression(node.expression);
|
|
}
|
|
else {
|
|
return unknownType;
|
|
}
|
|
}
|
|
function getDeclarationKindFromSymbol(s) {
|
|
return s.valueDeclaration ? s.valueDeclaration.kind : 145;
|
|
}
|
|
function getDeclarationFlagsFromSymbol(s) {
|
|
return s.valueDeclaration ? ts.getCombinedNodeFlags(s.valueDeclaration) : s.flags & 134217728 ? 4 | 32 : 0;
|
|
}
|
|
function checkClassPropertyAccess(node, left, type, prop) {
|
|
var flags = getDeclarationFlagsFromSymbol(prop);
|
|
var declaringClass = getDeclaredTypeOfSymbol(getParentOfSymbol(prop));
|
|
var errorNode = node.kind === 172 || node.kind === 218 ?
|
|
node.name :
|
|
node.right;
|
|
if (left.kind === 95) {
|
|
if (languageVersion < 2 && getDeclarationKindFromSymbol(prop) !== 147) {
|
|
error(errorNode, ts.Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword);
|
|
return false;
|
|
}
|
|
if (flags & 128) {
|
|
error(errorNode, ts.Diagnostics.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, symbolToString(prop), typeToString(declaringClass));
|
|
return false;
|
|
}
|
|
}
|
|
if (!(flags & (8 | 16))) {
|
|
return true;
|
|
}
|
|
if (flags & 8) {
|
|
var declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop));
|
|
if (!isNodeWithinClass(node, declaringClassDeclaration)) {
|
|
error(errorNode, ts.Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(declaringClass));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
if (left.kind === 95) {
|
|
return true;
|
|
}
|
|
var enclosingClass = forEachEnclosingClass(node, function (enclosingDeclaration) {
|
|
var enclosingClass = getDeclaredTypeOfSymbol(getSymbolOfNode(enclosingDeclaration));
|
|
return hasBaseType(enclosingClass, declaringClass) ? enclosingClass : undefined;
|
|
});
|
|
if (!enclosingClass) {
|
|
error(errorNode, ts.Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(declaringClass));
|
|
return false;
|
|
}
|
|
if (flags & 32) {
|
|
return true;
|
|
}
|
|
if (type.flags & 33554432) {
|
|
type = getConstraintOfTypeParameter(type);
|
|
}
|
|
if (!(getTargetType(type).flags & (1024 | 2048) && hasBaseType(type, enclosingClass))) {
|
|
error(errorNode, ts.Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function checkNonNullExpression(node) {
|
|
var type = checkExpression(node);
|
|
if (strictNullChecks) {
|
|
var kind = getCombinedTypeFlags(type) & 96;
|
|
if (kind) {
|
|
error(node, kind & 32 ? kind & 64 ?
|
|
ts.Diagnostics.Object_is_possibly_null_or_undefined :
|
|
ts.Diagnostics.Object_is_possibly_undefined :
|
|
ts.Diagnostics.Object_is_possibly_null);
|
|
}
|
|
return getNonNullableType(type);
|
|
}
|
|
return type;
|
|
}
|
|
function checkPropertyAccessExpression(node) {
|
|
return checkPropertyAccessExpressionOrQualifiedName(node, node.expression, node.name);
|
|
}
|
|
function checkQualifiedName(node) {
|
|
return checkPropertyAccessExpressionOrQualifiedName(node, node.left, node.right);
|
|
}
|
|
function checkPropertyAccessExpressionOrQualifiedName(node, left, right) {
|
|
var type = checkNonNullExpression(left);
|
|
if (isTypeAny(type)) {
|
|
return type;
|
|
}
|
|
var apparentType = getApparentType(getWidenedType(type));
|
|
if (apparentType === unknownType || (type.flags & 512 && isTypeAny(apparentType))) {
|
|
return apparentType;
|
|
}
|
|
var prop = getPropertyOfType(apparentType, right.text);
|
|
if (!prop) {
|
|
if (right.text && !checkAndReportErrorForExtendingInterface(node)) {
|
|
error(right, ts.Diagnostics.Property_0_does_not_exist_on_type_1, ts.declarationNameToString(right), typeToString(type.flags & 33554432 ? apparentType : type));
|
|
}
|
|
return unknownType;
|
|
}
|
|
if (noUnusedIdentifiers &&
|
|
(prop.flags & 106500) &&
|
|
prop.valueDeclaration && (prop.valueDeclaration.flags & 8)) {
|
|
if (prop.flags & 16777216) {
|
|
getSymbolLinks(prop).target.isReferenced = true;
|
|
}
|
|
else {
|
|
prop.isReferenced = true;
|
|
}
|
|
}
|
|
getNodeLinks(node).resolvedSymbol = prop;
|
|
if (prop.parent && prop.parent.flags & 32) {
|
|
checkClassPropertyAccess(node, left, apparentType, prop);
|
|
}
|
|
var propType = getTypeOfSymbol(prop);
|
|
if (node.kind !== 172 || ts.isAssignmentTarget(node) ||
|
|
!(prop.flags & (3 | 4 | 98304)) &&
|
|
!(prop.flags & 8192 && propType.flags & 16384)) {
|
|
return propType;
|
|
}
|
|
return getFlowTypeOfReference(node, propType, true, false);
|
|
}
|
|
function isValidPropertyAccess(node, propertyName) {
|
|
var left = node.kind === 172
|
|
? node.expression
|
|
: node.left;
|
|
var type = checkExpression(left);
|
|
if (type !== unknownType && !isTypeAny(type)) {
|
|
var prop = getPropertyOfType(getWidenedType(type), propertyName);
|
|
if (prop && prop.parent && prop.parent.flags & 32) {
|
|
return checkClassPropertyAccess(node, left, type, prop);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function getForInVariableSymbol(node) {
|
|
var initializer = node.initializer;
|
|
if (initializer.kind === 219) {
|
|
var variable = initializer.declarations[0];
|
|
if (variable && !ts.isBindingPattern(variable.name)) {
|
|
return getSymbolOfNode(variable);
|
|
}
|
|
}
|
|
else if (initializer.kind === 69) {
|
|
return getResolvedSymbol(initializer);
|
|
}
|
|
return undefined;
|
|
}
|
|
function hasNumericPropertyNames(type) {
|
|
return getIndexTypeOfType(type, 1) && !getIndexTypeOfType(type, 0);
|
|
}
|
|
function isForInVariableForNumericPropertyNames(expr) {
|
|
var e = skipParenthesizedNodes(expr);
|
|
if (e.kind === 69) {
|
|
var symbol = getResolvedSymbol(e);
|
|
if (symbol.flags & 3) {
|
|
var child = expr;
|
|
var node = expr.parent;
|
|
while (node) {
|
|
if (node.kind === 207 &&
|
|
child === node.statement &&
|
|
getForInVariableSymbol(node) === symbol &&
|
|
hasNumericPropertyNames(checkExpression(node.expression))) {
|
|
return true;
|
|
}
|
|
child = node;
|
|
node = node.parent;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkIndexedAccess(node) {
|
|
if (!node.argumentExpression) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
if (node.parent.kind === 175 && node.parent.expression === node) {
|
|
var start = ts.skipTrivia(sourceFile.text, node.expression.end);
|
|
var end = node.end;
|
|
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.new_T_cannot_be_used_to_create_an_array_Use_new_Array_T_instead);
|
|
}
|
|
else {
|
|
var start = node.end - "]".length;
|
|
var end = node.end;
|
|
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Expression_expected);
|
|
}
|
|
}
|
|
var objectType = getApparentType(checkNonNullExpression(node.expression));
|
|
var indexType = node.argumentExpression ? checkExpression(node.argumentExpression) : unknownType;
|
|
if (objectType === unknownType) {
|
|
return unknownType;
|
|
}
|
|
var isConstEnum = isConstEnumObjectType(objectType);
|
|
if (isConstEnum &&
|
|
(!node.argumentExpression || node.argumentExpression.kind !== 9)) {
|
|
error(node.argumentExpression, ts.Diagnostics.A_const_enum_member_can_only_be_accessed_using_a_string_literal);
|
|
return unknownType;
|
|
}
|
|
if (node.argumentExpression) {
|
|
var name_13 = getPropertyNameForIndexedAccess(node.argumentExpression, indexType);
|
|
if (name_13 !== undefined) {
|
|
var prop = getPropertyOfType(objectType, name_13);
|
|
if (prop) {
|
|
getNodeLinks(node).resolvedSymbol = prop;
|
|
return getTypeOfSymbol(prop);
|
|
}
|
|
else if (isConstEnum) {
|
|
error(node.argumentExpression, ts.Diagnostics.Property_0_does_not_exist_on_const_enum_1, name_13, symbolToString(objectType.symbol));
|
|
return unknownType;
|
|
}
|
|
}
|
|
}
|
|
if (isTypeAnyOrAllConstituentTypesHaveKind(indexType, 258 | 132 | 16777216)) {
|
|
if (isTypeAnyOrAllConstituentTypesHaveKind(indexType, 132) || isForInVariableForNumericPropertyNames(node.argumentExpression)) {
|
|
var numberIndexInfo = getIndexInfoOfType(objectType, 1);
|
|
if (numberIndexInfo) {
|
|
getNodeLinks(node).resolvedIndexInfo = numberIndexInfo;
|
|
return numberIndexInfo.type;
|
|
}
|
|
}
|
|
var stringIndexInfo = getIndexInfoOfType(objectType, 0);
|
|
if (stringIndexInfo) {
|
|
getNodeLinks(node).resolvedIndexInfo = stringIndexInfo;
|
|
return stringIndexInfo.type;
|
|
}
|
|
if (compilerOptions.noImplicitAny && !compilerOptions.suppressImplicitAnyIndexErrors && !isTypeAny(objectType)) {
|
|
error(node, getIndexTypeOfType(objectType, 1) ?
|
|
ts.Diagnostics.Element_implicitly_has_an_any_type_because_index_expression_is_not_of_type_number :
|
|
ts.Diagnostics.Index_signature_of_object_type_implicitly_has_an_any_type);
|
|
}
|
|
return anyType;
|
|
}
|
|
error(node, ts.Diagnostics.An_index_expression_argument_must_be_of_type_string_number_symbol_or_any);
|
|
return unknownType;
|
|
}
|
|
function getPropertyNameForIndexedAccess(indexArgumentExpression, indexArgumentType) {
|
|
if (indexArgumentExpression.kind === 9 || indexArgumentExpression.kind === 8) {
|
|
return indexArgumentExpression.text;
|
|
}
|
|
if (indexArgumentExpression.kind === 173 || indexArgumentExpression.kind === 172) {
|
|
var value = getConstantValue(indexArgumentExpression);
|
|
if (value !== undefined) {
|
|
return value.toString();
|
|
}
|
|
}
|
|
if (checkThatExpressionIsProperSymbolReference(indexArgumentExpression, indexArgumentType, false)) {
|
|
var rightHandSideName = indexArgumentExpression.name.text;
|
|
return ts.getPropertyNameForKnownSymbolName(rightHandSideName);
|
|
}
|
|
return undefined;
|
|
}
|
|
function checkThatExpressionIsProperSymbolReference(expression, expressionType, reportError) {
|
|
if (expressionType === unknownType) {
|
|
return false;
|
|
}
|
|
if (!ts.isWellKnownSymbolSyntactically(expression)) {
|
|
return false;
|
|
}
|
|
if ((expressionType.flags & 16777216) === 0) {
|
|
if (reportError) {
|
|
error(expression, ts.Diagnostics.A_computed_property_name_of_the_form_0_must_be_of_type_symbol, ts.getTextOfNode(expression));
|
|
}
|
|
return false;
|
|
}
|
|
var leftHandSide = expression.expression;
|
|
var leftHandSideSymbol = getResolvedSymbol(leftHandSide);
|
|
if (!leftHandSideSymbol) {
|
|
return false;
|
|
}
|
|
var globalESSymbol = getGlobalESSymbolConstructorSymbol();
|
|
if (!globalESSymbol) {
|
|
return false;
|
|
}
|
|
if (leftHandSideSymbol !== globalESSymbol) {
|
|
if (reportError) {
|
|
error(leftHandSide, ts.Diagnostics.Symbol_reference_does_not_refer_to_the_global_Symbol_constructor_object);
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function resolveUntypedCall(node) {
|
|
if (node.kind === 176) {
|
|
checkExpression(node.template);
|
|
}
|
|
else if (node.kind !== 143) {
|
|
ts.forEach(node.arguments, function (argument) {
|
|
checkExpression(argument);
|
|
});
|
|
}
|
|
return anySignature;
|
|
}
|
|
function resolveErrorCall(node) {
|
|
resolveUntypedCall(node);
|
|
return unknownSignature;
|
|
}
|
|
function reorderCandidates(signatures, result) {
|
|
var lastParent;
|
|
var lastSymbol;
|
|
var cutoffIndex = 0;
|
|
var index;
|
|
var specializedIndex = -1;
|
|
var spliceIndex;
|
|
ts.Debug.assert(!result.length);
|
|
for (var _i = 0, signatures_2 = signatures; _i < signatures_2.length; _i++) {
|
|
var signature = signatures_2[_i];
|
|
var symbol = signature.declaration && getSymbolOfNode(signature.declaration);
|
|
var parent_9 = signature.declaration && signature.declaration.parent;
|
|
if (!lastSymbol || symbol === lastSymbol) {
|
|
if (lastParent && parent_9 === lastParent) {
|
|
index++;
|
|
}
|
|
else {
|
|
lastParent = parent_9;
|
|
index = cutoffIndex;
|
|
}
|
|
}
|
|
else {
|
|
index = cutoffIndex = result.length;
|
|
lastParent = parent_9;
|
|
}
|
|
lastSymbol = symbol;
|
|
if (signature.hasStringLiterals) {
|
|
specializedIndex++;
|
|
spliceIndex = specializedIndex;
|
|
cutoffIndex++;
|
|
}
|
|
else {
|
|
spliceIndex = index;
|
|
}
|
|
result.splice(spliceIndex, 0, signature);
|
|
}
|
|
}
|
|
function getSpreadArgumentIndex(args) {
|
|
for (var i = 0; i < args.length; i++) {
|
|
var arg = args[i];
|
|
if (arg && arg.kind === 191) {
|
|
return i;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function hasCorrectArity(node, args, signature, signatureHelpTrailingComma) {
|
|
if (signatureHelpTrailingComma === void 0) { signatureHelpTrailingComma = false; }
|
|
var argCount;
|
|
var typeArguments;
|
|
var callIsIncomplete;
|
|
var isDecorator;
|
|
var spreadArgIndex = -1;
|
|
if (node.kind === 176) {
|
|
var tagExpression = node;
|
|
argCount = args.length;
|
|
typeArguments = undefined;
|
|
if (tagExpression.template.kind === 189) {
|
|
var templateExpression = tagExpression.template;
|
|
var lastSpan = ts.lastOrUndefined(templateExpression.templateSpans);
|
|
ts.Debug.assert(lastSpan !== undefined);
|
|
callIsIncomplete = ts.nodeIsMissing(lastSpan.literal) || !!lastSpan.literal.isUnterminated;
|
|
}
|
|
else {
|
|
var templateLiteral = tagExpression.template;
|
|
ts.Debug.assert(templateLiteral.kind === 11);
|
|
callIsIncomplete = !!templateLiteral.isUnterminated;
|
|
}
|
|
}
|
|
else if (node.kind === 143) {
|
|
isDecorator = true;
|
|
typeArguments = undefined;
|
|
argCount = getEffectiveArgumentCount(node, undefined, signature);
|
|
}
|
|
else {
|
|
var callExpression = node;
|
|
if (!callExpression.arguments) {
|
|
ts.Debug.assert(callExpression.kind === 175);
|
|
return signature.minArgumentCount === 0;
|
|
}
|
|
argCount = signatureHelpTrailingComma ? args.length + 1 : args.length;
|
|
callIsIncomplete = callExpression.arguments.end === callExpression.end;
|
|
typeArguments = callExpression.typeArguments;
|
|
spreadArgIndex = getSpreadArgumentIndex(args);
|
|
}
|
|
var hasRightNumberOfTypeArgs = !typeArguments ||
|
|
(signature.typeParameters && typeArguments.length === signature.typeParameters.length);
|
|
if (!hasRightNumberOfTypeArgs) {
|
|
return false;
|
|
}
|
|
if (spreadArgIndex >= 0) {
|
|
return isRestParameterIndex(signature, spreadArgIndex);
|
|
}
|
|
if (!signature.hasRestParameter && argCount > signature.parameters.length) {
|
|
return false;
|
|
}
|
|
var hasEnoughArguments = argCount >= signature.minArgumentCount;
|
|
return callIsIncomplete || hasEnoughArguments;
|
|
}
|
|
function getSingleCallSignature(type) {
|
|
if (type.flags & 80896) {
|
|
var resolved = resolveStructuredTypeMembers(type);
|
|
if (resolved.callSignatures.length === 1 && resolved.constructSignatures.length === 0 &&
|
|
resolved.properties.length === 0 && !resolved.stringIndexInfo && !resolved.numberIndexInfo) {
|
|
return resolved.callSignatures[0];
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) {
|
|
var context = createInferenceContext(signature.typeParameters, true);
|
|
forEachMatchingParameterType(contextualSignature, signature, function (source, target) {
|
|
inferTypes(context, instantiateType(source, contextualMapper), target);
|
|
});
|
|
return getSignatureInstantiation(signature, getInferredTypes(context));
|
|
}
|
|
function inferTypeArguments(node, signature, args, excludeArgument, context) {
|
|
var typeParameters = signature.typeParameters;
|
|
var inferenceMapper = getInferenceMapper(context);
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
if (!context.inferences[i].isFixed) {
|
|
context.inferredTypes[i] = undefined;
|
|
}
|
|
}
|
|
if (context.failedTypeParameterIndex !== undefined && !context.inferences[context.failedTypeParameterIndex].isFixed) {
|
|
context.failedTypeParameterIndex = undefined;
|
|
}
|
|
var thisType = getThisTypeOfSignature(signature);
|
|
if (thisType) {
|
|
var thisArgumentNode = getThisArgumentOfCall(node);
|
|
var thisArgumentType = thisArgumentNode ? checkExpression(thisArgumentNode) : voidType;
|
|
inferTypes(context, thisArgumentType, thisType);
|
|
}
|
|
var argCount = getEffectiveArgumentCount(node, args, signature);
|
|
for (var i = 0; i < argCount; i++) {
|
|
var arg = getEffectiveArgument(node, args, i);
|
|
if (arg === undefined || arg.kind !== 193) {
|
|
var paramType = getTypeAtPosition(signature, i);
|
|
var argType = getEffectiveArgumentType(node, i, arg);
|
|
if (argType === undefined) {
|
|
var mapper = excludeArgument && excludeArgument[i] !== undefined ? identityMapper : inferenceMapper;
|
|
argType = checkExpressionWithContextualType(arg, paramType, mapper);
|
|
}
|
|
inferTypes(context, argType, paramType);
|
|
}
|
|
}
|
|
if (excludeArgument) {
|
|
for (var i = 0; i < argCount; i++) {
|
|
if (excludeArgument[i] === false) {
|
|
var arg = args[i];
|
|
var paramType = getTypeAtPosition(signature, i);
|
|
inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType);
|
|
}
|
|
}
|
|
}
|
|
getInferredTypes(context);
|
|
}
|
|
function checkTypeArguments(signature, typeArgumentNodes, typeArgumentTypes, reportErrors, headMessage) {
|
|
var typeParameters = signature.typeParameters;
|
|
var typeArgumentsAreAssignable = true;
|
|
var mapper;
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
if (typeArgumentsAreAssignable) {
|
|
var constraint = getConstraintOfTypeParameter(typeParameters[i]);
|
|
if (constraint) {
|
|
var errorInfo = void 0;
|
|
var typeArgumentHeadMessage = ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1;
|
|
if (reportErrors && headMessage) {
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, typeArgumentHeadMessage);
|
|
typeArgumentHeadMessage = headMessage;
|
|
}
|
|
if (!mapper) {
|
|
mapper = createTypeMapper(typeParameters, typeArgumentTypes);
|
|
}
|
|
var typeArgument = typeArgumentTypes[i];
|
|
typeArgumentsAreAssignable = checkTypeAssignableTo(typeArgument, getTypeWithThisArgument(instantiateType(constraint, mapper), typeArgument), reportErrors ? typeArgumentNodes[i] : undefined, typeArgumentHeadMessage, errorInfo);
|
|
}
|
|
}
|
|
}
|
|
return typeArgumentsAreAssignable;
|
|
}
|
|
function checkApplicableSignature(node, args, signature, relation, excludeArgument, reportErrors) {
|
|
var thisType = getThisTypeOfSignature(signature);
|
|
if (thisType && thisType !== voidType && node.kind !== 175) {
|
|
var thisArgumentNode = getThisArgumentOfCall(node);
|
|
var thisArgumentType = thisArgumentNode ? checkExpression(thisArgumentNode) : voidType;
|
|
var errorNode = reportErrors ? (thisArgumentNode || node) : undefined;
|
|
var headMessage_1 = ts.Diagnostics.The_this_context_of_type_0_is_not_assignable_to_method_s_this_of_type_1;
|
|
if (!checkTypeRelatedTo(thisArgumentType, getThisTypeOfSignature(signature), relation, errorNode, headMessage_1)) {
|
|
return false;
|
|
}
|
|
}
|
|
var headMessage = ts.Diagnostics.Argument_of_type_0_is_not_assignable_to_parameter_of_type_1;
|
|
var argCount = getEffectiveArgumentCount(node, args, signature);
|
|
for (var i = 0; i < argCount; i++) {
|
|
var arg = getEffectiveArgument(node, args, i);
|
|
if (arg === undefined || arg.kind !== 193) {
|
|
var paramType = getTypeAtPosition(signature, i);
|
|
var argType = getEffectiveArgumentType(node, i, arg);
|
|
if (argType === undefined) {
|
|
argType = arg.kind === 9 && !reportErrors
|
|
? getStringLiteralTypeForText(arg.text)
|
|
: checkExpressionWithContextualType(arg, paramType, excludeArgument && excludeArgument[i] ? identityMapper : undefined);
|
|
}
|
|
var errorNode = reportErrors ? getEffectiveArgumentErrorNode(node, i, arg) : undefined;
|
|
if (!checkTypeRelatedTo(argType, paramType, relation, errorNode, headMessage)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function getThisArgumentOfCall(node) {
|
|
if (node.kind === 174) {
|
|
var callee = node.expression;
|
|
if (callee.kind === 172) {
|
|
return callee.expression;
|
|
}
|
|
else if (callee.kind === 173) {
|
|
return callee.expression;
|
|
}
|
|
}
|
|
}
|
|
function getEffectiveCallArguments(node) {
|
|
var args;
|
|
if (node.kind === 176) {
|
|
var template = node.template;
|
|
args = [undefined];
|
|
if (template.kind === 189) {
|
|
ts.forEach(template.templateSpans, function (span) {
|
|
args.push(span.expression);
|
|
});
|
|
}
|
|
}
|
|
else if (node.kind === 143) {
|
|
return undefined;
|
|
}
|
|
else {
|
|
args = node.arguments || emptyArray;
|
|
}
|
|
return args;
|
|
}
|
|
function getEffectiveArgumentCount(node, args, signature) {
|
|
if (node.kind === 143) {
|
|
switch (node.parent.kind) {
|
|
case 221:
|
|
case 192:
|
|
return 1;
|
|
case 145:
|
|
return 2;
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
if (languageVersion === 0) {
|
|
return 2;
|
|
}
|
|
return signature.parameters.length >= 3 ? 3 : 2;
|
|
case 142:
|
|
return 3;
|
|
}
|
|
}
|
|
else {
|
|
return args.length;
|
|
}
|
|
}
|
|
function getEffectiveDecoratorFirstArgumentType(node) {
|
|
if (node.kind === 221) {
|
|
var classSymbol = getSymbolOfNode(node);
|
|
return getTypeOfSymbol(classSymbol);
|
|
}
|
|
if (node.kind === 142) {
|
|
node = node.parent;
|
|
if (node.kind === 148) {
|
|
var classSymbol = getSymbolOfNode(node);
|
|
return getTypeOfSymbol(classSymbol);
|
|
}
|
|
}
|
|
if (node.kind === 145 ||
|
|
node.kind === 147 ||
|
|
node.kind === 149 ||
|
|
node.kind === 150) {
|
|
return getParentTypeOfClassElement(node);
|
|
}
|
|
ts.Debug.fail("Unsupported decorator target.");
|
|
return unknownType;
|
|
}
|
|
function getEffectiveDecoratorSecondArgumentType(node) {
|
|
if (node.kind === 221) {
|
|
ts.Debug.fail("Class decorators should not have a second synthetic argument.");
|
|
return unknownType;
|
|
}
|
|
if (node.kind === 142) {
|
|
node = node.parent;
|
|
if (node.kind === 148) {
|
|
return anyType;
|
|
}
|
|
}
|
|
if (node.kind === 145 ||
|
|
node.kind === 147 ||
|
|
node.kind === 149 ||
|
|
node.kind === 150) {
|
|
var element = node;
|
|
switch (element.name.kind) {
|
|
case 69:
|
|
case 8:
|
|
case 9:
|
|
return getStringLiteralTypeForText(element.name.text);
|
|
case 140:
|
|
var nameType = checkComputedPropertyName(element.name);
|
|
if (isTypeOfKind(nameType, 16777216)) {
|
|
return nameType;
|
|
}
|
|
else {
|
|
return stringType;
|
|
}
|
|
default:
|
|
ts.Debug.fail("Unsupported property name.");
|
|
return unknownType;
|
|
}
|
|
}
|
|
ts.Debug.fail("Unsupported decorator target.");
|
|
return unknownType;
|
|
}
|
|
function getEffectiveDecoratorThirdArgumentType(node) {
|
|
if (node.kind === 221) {
|
|
ts.Debug.fail("Class decorators should not have a third synthetic argument.");
|
|
return unknownType;
|
|
}
|
|
if (node.kind === 142) {
|
|
return numberType;
|
|
}
|
|
if (node.kind === 145) {
|
|
ts.Debug.fail("Property decorators should not have a third synthetic argument.");
|
|
return unknownType;
|
|
}
|
|
if (node.kind === 147 ||
|
|
node.kind === 149 ||
|
|
node.kind === 150) {
|
|
var propertyType = getTypeOfNode(node);
|
|
return createTypedPropertyDescriptorType(propertyType);
|
|
}
|
|
ts.Debug.fail("Unsupported decorator target.");
|
|
return unknownType;
|
|
}
|
|
function getEffectiveDecoratorArgumentType(node, argIndex) {
|
|
if (argIndex === 0) {
|
|
return getEffectiveDecoratorFirstArgumentType(node.parent);
|
|
}
|
|
else if (argIndex === 1) {
|
|
return getEffectiveDecoratorSecondArgumentType(node.parent);
|
|
}
|
|
else if (argIndex === 2) {
|
|
return getEffectiveDecoratorThirdArgumentType(node.parent);
|
|
}
|
|
ts.Debug.fail("Decorators should not have a fourth synthetic argument.");
|
|
return unknownType;
|
|
}
|
|
function getEffectiveArgumentType(node, argIndex, arg) {
|
|
if (node.kind === 143) {
|
|
return getEffectiveDecoratorArgumentType(node, argIndex);
|
|
}
|
|
else if (argIndex === 0 && node.kind === 176) {
|
|
return getGlobalTemplateStringsArrayType();
|
|
}
|
|
return undefined;
|
|
}
|
|
function getEffectiveArgument(node, args, argIndex) {
|
|
if (node.kind === 143 ||
|
|
(argIndex === 0 && node.kind === 176)) {
|
|
return undefined;
|
|
}
|
|
return args[argIndex];
|
|
}
|
|
function getEffectiveArgumentErrorNode(node, argIndex, arg) {
|
|
if (node.kind === 143) {
|
|
return node.expression;
|
|
}
|
|
else if (argIndex === 0 && node.kind === 176) {
|
|
return node.template;
|
|
}
|
|
else {
|
|
return arg;
|
|
}
|
|
}
|
|
function resolveCall(node, signatures, candidatesOutArray, headMessage) {
|
|
var isTaggedTemplate = node.kind === 176;
|
|
var isDecorator = node.kind === 143;
|
|
var typeArguments;
|
|
if (!isTaggedTemplate && !isDecorator) {
|
|
typeArguments = node.typeArguments;
|
|
if (node.expression.kind !== 95) {
|
|
ts.forEach(typeArguments, checkSourceElement);
|
|
}
|
|
}
|
|
var candidates = candidatesOutArray || [];
|
|
reorderCandidates(signatures, candidates);
|
|
if (!candidates.length) {
|
|
reportError(ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
|
|
return resolveErrorCall(node);
|
|
}
|
|
var args = getEffectiveCallArguments(node);
|
|
var excludeArgument;
|
|
if (!isDecorator) {
|
|
for (var i = isTaggedTemplate ? 1 : 0; i < args.length; i++) {
|
|
if (isContextSensitive(args[i])) {
|
|
if (!excludeArgument) {
|
|
excludeArgument = new Array(args.length);
|
|
}
|
|
excludeArgument[i] = true;
|
|
}
|
|
}
|
|
}
|
|
var candidateForArgumentError;
|
|
var candidateForTypeArgumentError;
|
|
var resultOfFailedInference;
|
|
var result;
|
|
var signatureHelpTrailingComma = candidatesOutArray && node.kind === 174 && node.arguments.hasTrailingComma;
|
|
if (candidates.length > 1) {
|
|
result = chooseOverload(candidates, subtypeRelation, signatureHelpTrailingComma);
|
|
}
|
|
if (!result) {
|
|
candidateForArgumentError = undefined;
|
|
candidateForTypeArgumentError = undefined;
|
|
resultOfFailedInference = undefined;
|
|
result = chooseOverload(candidates, assignableRelation, signatureHelpTrailingComma);
|
|
}
|
|
if (result) {
|
|
return result;
|
|
}
|
|
if (candidateForArgumentError) {
|
|
checkApplicableSignature(node, args, candidateForArgumentError, assignableRelation, undefined, true);
|
|
}
|
|
else if (candidateForTypeArgumentError) {
|
|
if (!isTaggedTemplate && !isDecorator && typeArguments) {
|
|
var typeArguments_2 = node.typeArguments;
|
|
checkTypeArguments(candidateForTypeArgumentError, typeArguments_2, ts.map(typeArguments_2, getTypeFromTypeNode), true, headMessage);
|
|
}
|
|
else {
|
|
ts.Debug.assert(resultOfFailedInference.failedTypeParameterIndex >= 0);
|
|
var failedTypeParameter = candidateForTypeArgumentError.typeParameters[resultOfFailedInference.failedTypeParameterIndex];
|
|
var inferenceCandidates = getInferenceCandidates(resultOfFailedInference, resultOfFailedInference.failedTypeParameterIndex);
|
|
var diagnosticChainHead = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.The_type_argument_for_type_parameter_0_cannot_be_inferred_from_the_usage_Consider_specifying_the_type_arguments_explicitly, typeToString(failedTypeParameter));
|
|
if (headMessage) {
|
|
diagnosticChainHead = ts.chainDiagnosticMessages(diagnosticChainHead, headMessage);
|
|
}
|
|
reportNoCommonSupertypeError(inferenceCandidates, node.expression || node.tag, diagnosticChainHead);
|
|
}
|
|
}
|
|
else {
|
|
reportError(ts.Diagnostics.Supplied_parameters_do_not_match_any_signature_of_call_target);
|
|
}
|
|
if (!produceDiagnostics) {
|
|
for (var _i = 0, candidates_1 = candidates; _i < candidates_1.length; _i++) {
|
|
var candidate = candidates_1[_i];
|
|
if (hasCorrectArity(node, args, candidate)) {
|
|
if (candidate.typeParameters && typeArguments) {
|
|
candidate = getSignatureInstantiation(candidate, ts.map(typeArguments, getTypeFromTypeNode));
|
|
}
|
|
return candidate;
|
|
}
|
|
}
|
|
}
|
|
return resolveErrorCall(node);
|
|
function reportError(message, arg0, arg1, arg2) {
|
|
var errorInfo;
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, message, arg0, arg1, arg2);
|
|
if (headMessage) {
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, headMessage);
|
|
}
|
|
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(node, errorInfo));
|
|
}
|
|
function chooseOverload(candidates, relation, signatureHelpTrailingComma) {
|
|
if (signatureHelpTrailingComma === void 0) { signatureHelpTrailingComma = false; }
|
|
for (var _i = 0, candidates_2 = candidates; _i < candidates_2.length; _i++) {
|
|
var originalCandidate = candidates_2[_i];
|
|
if (!hasCorrectArity(node, args, originalCandidate, signatureHelpTrailingComma)) {
|
|
continue;
|
|
}
|
|
var candidate = void 0;
|
|
var typeArgumentsAreValid = void 0;
|
|
var inferenceContext = originalCandidate.typeParameters
|
|
? createInferenceContext(originalCandidate.typeParameters, false)
|
|
: undefined;
|
|
while (true) {
|
|
candidate = originalCandidate;
|
|
if (candidate.typeParameters) {
|
|
var typeArgumentTypes = void 0;
|
|
if (typeArguments) {
|
|
typeArgumentTypes = ts.map(typeArguments, getTypeFromTypeNode);
|
|
typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, false);
|
|
}
|
|
else {
|
|
inferTypeArguments(node, candidate, args, excludeArgument, inferenceContext);
|
|
typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
|
|
typeArgumentTypes = inferenceContext.inferredTypes;
|
|
}
|
|
if (!typeArgumentsAreValid) {
|
|
break;
|
|
}
|
|
candidate = getSignatureInstantiation(candidate, typeArgumentTypes);
|
|
}
|
|
if (!checkApplicableSignature(node, args, candidate, relation, excludeArgument, false)) {
|
|
break;
|
|
}
|
|
var index = excludeArgument ? ts.indexOf(excludeArgument, true) : -1;
|
|
if (index < 0) {
|
|
return candidate;
|
|
}
|
|
excludeArgument[index] = false;
|
|
}
|
|
if (originalCandidate.typeParameters) {
|
|
var instantiatedCandidate = candidate;
|
|
if (typeArgumentsAreValid) {
|
|
candidateForArgumentError = instantiatedCandidate;
|
|
}
|
|
else {
|
|
candidateForTypeArgumentError = originalCandidate;
|
|
if (!typeArguments) {
|
|
resultOfFailedInference = inferenceContext;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
ts.Debug.assert(originalCandidate === candidate);
|
|
candidateForArgumentError = originalCandidate;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
}
|
|
function resolveCallExpression(node, candidatesOutArray) {
|
|
if (node.expression.kind === 95) {
|
|
var superType = checkSuperExpression(node.expression);
|
|
if (superType !== unknownType) {
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(ts.getContainingClass(node));
|
|
if (baseTypeNode) {
|
|
var baseConstructors = getInstantiatedConstructorsForTypeArguments(superType, baseTypeNode.typeArguments);
|
|
return resolveCall(node, baseConstructors, candidatesOutArray);
|
|
}
|
|
}
|
|
return resolveUntypedCall(node);
|
|
}
|
|
var funcType = checkNonNullExpression(node.expression);
|
|
var apparentType = getApparentType(funcType);
|
|
if (apparentType === unknownType) {
|
|
return resolveErrorCall(node);
|
|
}
|
|
var callSignatures = getSignaturesOfType(apparentType, 0);
|
|
var constructSignatures = getSignaturesOfType(apparentType, 1);
|
|
if (isTypeAny(funcType) ||
|
|
(isTypeAny(apparentType) && funcType.flags & 512) ||
|
|
(!callSignatures.length && !constructSignatures.length && !(funcType.flags & 16384) && isTypeAssignableTo(funcType, globalFunctionType))) {
|
|
if (funcType !== unknownType && node.typeArguments) {
|
|
error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
|
|
}
|
|
return resolveUntypedCall(node);
|
|
}
|
|
if (!callSignatures.length) {
|
|
if (constructSignatures.length) {
|
|
error(node, ts.Diagnostics.Value_of_type_0_is_not_callable_Did_you_mean_to_include_new, typeToString(funcType));
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
|
|
}
|
|
return resolveErrorCall(node);
|
|
}
|
|
return resolveCall(node, callSignatures, candidatesOutArray);
|
|
}
|
|
function resolveNewExpression(node, candidatesOutArray) {
|
|
if (node.arguments && languageVersion < 1) {
|
|
var spreadIndex = getSpreadArgumentIndex(node.arguments);
|
|
if (spreadIndex >= 0) {
|
|
error(node.arguments[spreadIndex], ts.Diagnostics.Spread_operator_in_new_expressions_is_only_available_when_targeting_ECMAScript_5_and_higher);
|
|
}
|
|
}
|
|
var expressionType = checkNonNullExpression(node.expression);
|
|
expressionType = getApparentType(expressionType);
|
|
if (expressionType === unknownType) {
|
|
return resolveErrorCall(node);
|
|
}
|
|
var valueDecl = expressionType.symbol && getClassLikeDeclarationOfSymbol(expressionType.symbol);
|
|
if (valueDecl && valueDecl.flags & 128) {
|
|
error(node, ts.Diagnostics.Cannot_create_an_instance_of_the_abstract_class_0, ts.declarationNameToString(valueDecl.name));
|
|
return resolveErrorCall(node);
|
|
}
|
|
if (isTypeAny(expressionType)) {
|
|
if (node.typeArguments) {
|
|
error(node, ts.Diagnostics.Untyped_function_calls_may_not_accept_type_arguments);
|
|
}
|
|
return resolveUntypedCall(node);
|
|
}
|
|
var constructSignatures = getSignaturesOfType(expressionType, 1);
|
|
if (constructSignatures.length) {
|
|
if (!isConstructorAccessible(node, constructSignatures[0])) {
|
|
return resolveErrorCall(node);
|
|
}
|
|
return resolveCall(node, constructSignatures, candidatesOutArray);
|
|
}
|
|
var callSignatures = getSignaturesOfType(expressionType, 0);
|
|
if (callSignatures.length) {
|
|
var signature = resolveCall(node, callSignatures, candidatesOutArray);
|
|
if (getReturnTypeOfSignature(signature) !== voidType) {
|
|
error(node, ts.Diagnostics.Only_a_void_function_can_be_called_with_the_new_keyword);
|
|
}
|
|
if (getThisTypeOfSignature(signature) === voidType) {
|
|
error(node, ts.Diagnostics.A_function_that_is_called_with_the_new_keyword_cannot_have_a_this_type_that_is_void);
|
|
}
|
|
return signature;
|
|
}
|
|
error(node, ts.Diagnostics.Cannot_use_new_with_an_expression_whose_type_lacks_a_call_or_construct_signature);
|
|
return resolveErrorCall(node);
|
|
}
|
|
function isConstructorAccessible(node, signature) {
|
|
if (!signature || !signature.declaration) {
|
|
return true;
|
|
}
|
|
var declaration = signature.declaration;
|
|
var flags = declaration.flags;
|
|
if (!(flags & (8 | 16))) {
|
|
return true;
|
|
}
|
|
var declaringClassDeclaration = getClassLikeDeclarationOfSymbol(declaration.parent.symbol);
|
|
var declaringClass = getDeclaredTypeOfSymbol(declaration.parent.symbol);
|
|
if (!isNodeWithinClass(node, declaringClassDeclaration)) {
|
|
if (flags & 8) {
|
|
error(node, ts.Diagnostics.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration, typeToString(declaringClass));
|
|
}
|
|
if (flags & 16) {
|
|
error(node, ts.Diagnostics.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration, typeToString(declaringClass));
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function resolveTaggedTemplateExpression(node, candidatesOutArray) {
|
|
var tagType = checkExpression(node.tag);
|
|
var apparentType = getApparentType(tagType);
|
|
if (apparentType === unknownType) {
|
|
return resolveErrorCall(node);
|
|
}
|
|
var callSignatures = getSignaturesOfType(apparentType, 0);
|
|
if (isTypeAny(tagType) || (!callSignatures.length && !(tagType.flags & 16384) && isTypeAssignableTo(tagType, globalFunctionType))) {
|
|
return resolveUntypedCall(node);
|
|
}
|
|
if (!callSignatures.length) {
|
|
error(node, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
|
|
return resolveErrorCall(node);
|
|
}
|
|
return resolveCall(node, callSignatures, candidatesOutArray);
|
|
}
|
|
function getDiagnosticHeadMessageForDecoratorResolution(node) {
|
|
switch (node.parent.kind) {
|
|
case 221:
|
|
case 192:
|
|
return ts.Diagnostics.Unable_to_resolve_signature_of_class_decorator_when_called_as_an_expression;
|
|
case 142:
|
|
return ts.Diagnostics.Unable_to_resolve_signature_of_parameter_decorator_when_called_as_an_expression;
|
|
case 145:
|
|
return ts.Diagnostics.Unable_to_resolve_signature_of_property_decorator_when_called_as_an_expression;
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
return ts.Diagnostics.Unable_to_resolve_signature_of_method_decorator_when_called_as_an_expression;
|
|
}
|
|
}
|
|
function resolveDecorator(node, candidatesOutArray) {
|
|
var funcType = checkExpression(node.expression);
|
|
var apparentType = getApparentType(funcType);
|
|
if (apparentType === unknownType) {
|
|
return resolveErrorCall(node);
|
|
}
|
|
var callSignatures = getSignaturesOfType(apparentType, 0);
|
|
if (funcType === anyType || (!callSignatures.length && !(funcType.flags & 16384) && isTypeAssignableTo(funcType, globalFunctionType))) {
|
|
return resolveUntypedCall(node);
|
|
}
|
|
var headMessage = getDiagnosticHeadMessageForDecoratorResolution(node);
|
|
if (!callSignatures.length) {
|
|
var errorInfo = void 0;
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature);
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, headMessage);
|
|
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(node, errorInfo));
|
|
return resolveErrorCall(node);
|
|
}
|
|
return resolveCall(node, callSignatures, candidatesOutArray, headMessage);
|
|
}
|
|
function resolveSignature(node, candidatesOutArray) {
|
|
switch (node.kind) {
|
|
case 174:
|
|
return resolveCallExpression(node, candidatesOutArray);
|
|
case 175:
|
|
return resolveNewExpression(node, candidatesOutArray);
|
|
case 176:
|
|
return resolveTaggedTemplateExpression(node, candidatesOutArray);
|
|
case 143:
|
|
return resolveDecorator(node, candidatesOutArray);
|
|
}
|
|
ts.Debug.fail("Branch in 'resolveSignature' should be unreachable.");
|
|
}
|
|
function getResolvedSignature(node, candidatesOutArray) {
|
|
var links = getNodeLinks(node);
|
|
var cached = links.resolvedSignature;
|
|
if (cached && cached !== anySignature && !candidatesOutArray) {
|
|
return cached;
|
|
}
|
|
links.resolvedSignature = anySignature;
|
|
var result = resolveSignature(node, candidatesOutArray);
|
|
links.resolvedSignature = flowLoopStart === flowLoopCount ? result : cached;
|
|
return result;
|
|
}
|
|
function getResolvedOrAnySignature(node) {
|
|
return getNodeLinks(node).resolvedSignature === anySignature ? anySignature : getResolvedSignature(node);
|
|
}
|
|
function getInferredClassType(symbol) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (!links.inferredClassType) {
|
|
links.inferredClassType = createAnonymousType(symbol, symbol.members, emptyArray, emptyArray, undefined, undefined);
|
|
}
|
|
return links.inferredClassType;
|
|
}
|
|
function checkCallExpression(node) {
|
|
checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments);
|
|
var signature = getResolvedSignature(node);
|
|
if (node.expression.kind === 95) {
|
|
return voidType;
|
|
}
|
|
if (node.kind === 175) {
|
|
var declaration = signature.declaration;
|
|
if (declaration &&
|
|
declaration.kind !== 148 &&
|
|
declaration.kind !== 152 &&
|
|
declaration.kind !== 157 &&
|
|
!ts.isJSDocConstructSignature(declaration)) {
|
|
var funcSymbol = node.expression.kind === 69 ?
|
|
getResolvedSymbol(node.expression) :
|
|
checkExpression(node.expression).symbol;
|
|
if (funcSymbol && funcSymbol.members && (funcSymbol.flags & 16 || ts.isDeclarationOfFunctionExpression(funcSymbol))) {
|
|
return getInferredClassType(funcSymbol);
|
|
}
|
|
else if (compilerOptions.noImplicitAny) {
|
|
error(node, ts.Diagnostics.new_expression_whose_target_lacks_a_construct_signature_implicitly_has_an_any_type);
|
|
}
|
|
return anyType;
|
|
}
|
|
}
|
|
if (ts.isInJavaScriptFile(node) && ts.isRequireCall(node, true)) {
|
|
return resolveExternalModuleTypeByLiteral(node.arguments[0]);
|
|
}
|
|
return getReturnTypeOfSignature(signature);
|
|
}
|
|
function checkTaggedTemplateExpression(node) {
|
|
return getReturnTypeOfSignature(getResolvedSignature(node));
|
|
}
|
|
function checkAssertion(node) {
|
|
var exprType = getRegularTypeOfObjectLiteral(checkExpression(node.expression));
|
|
checkSourceElement(node.type);
|
|
var targetType = getTypeFromTypeNode(node.type);
|
|
if (produceDiagnostics && targetType !== unknownType) {
|
|
var widenedType = getWidenedType(exprType);
|
|
if (!isTypeComparableTo(targetType, widenedType)) {
|
|
checkTypeComparableTo(exprType, targetType, node, ts.Diagnostics.Type_0_cannot_be_converted_to_type_1);
|
|
}
|
|
}
|
|
return targetType;
|
|
}
|
|
function checkNonNullAssertion(node) {
|
|
return getNonNullableType(checkExpression(node.expression));
|
|
}
|
|
function getTypeOfParameter(symbol) {
|
|
var type = getTypeOfSymbol(symbol);
|
|
if (strictNullChecks) {
|
|
var declaration = symbol.valueDeclaration;
|
|
if (declaration && declaration.initializer) {
|
|
return addTypeKind(type, 32);
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function getTypeAtPosition(signature, pos) {
|
|
return signature.hasRestParameter ?
|
|
pos < signature.parameters.length - 1 ? getTypeOfParameter(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
|
|
pos < signature.parameters.length ? getTypeOfParameter(signature.parameters[pos]) : anyType;
|
|
}
|
|
function assignContextualParameterTypes(signature, context, mapper) {
|
|
var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0);
|
|
for (var i = 0; i < len; i++) {
|
|
var parameter = signature.parameters[i];
|
|
var contextualParameterType = getTypeAtPosition(context, i);
|
|
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
|
|
}
|
|
if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) {
|
|
var parameter = ts.lastOrUndefined(signature.parameters);
|
|
var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters));
|
|
assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper);
|
|
}
|
|
}
|
|
function assignBindingElementTypes(node) {
|
|
if (ts.isBindingPattern(node.name)) {
|
|
for (var _i = 0, _a = node.name.elements; _i < _a.length; _i++) {
|
|
var element = _a[_i];
|
|
if (element.kind !== 193) {
|
|
if (element.name.kind === 69) {
|
|
getSymbolLinks(getSymbolOfNode(element)).type = getTypeForBindingElement(element);
|
|
}
|
|
assignBindingElementTypes(element);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper) {
|
|
var links = getSymbolLinks(parameter);
|
|
if (!links.type) {
|
|
links.type = instantiateType(contextualType, mapper);
|
|
if (links.type === emptyObjectType &&
|
|
(parameter.valueDeclaration.name.kind === 167 ||
|
|
parameter.valueDeclaration.name.kind === 168)) {
|
|
links.type = getTypeFromBindingPattern(parameter.valueDeclaration.name);
|
|
}
|
|
assignBindingElementTypes(parameter.valueDeclaration);
|
|
}
|
|
else if (isInferentialContext(mapper)) {
|
|
inferTypes(mapper.context, links.type, instantiateType(contextualType, mapper));
|
|
}
|
|
}
|
|
function getReturnTypeFromJSDocComment(func) {
|
|
var returnTag = ts.getJSDocReturnTag(func);
|
|
if (returnTag && returnTag.typeExpression) {
|
|
return getTypeFromTypeNode(returnTag.typeExpression.type);
|
|
}
|
|
return undefined;
|
|
}
|
|
function createPromiseType(promisedType) {
|
|
var globalPromiseType = getGlobalPromiseType();
|
|
if (globalPromiseType !== emptyGenericType) {
|
|
promisedType = getAwaitedType(promisedType);
|
|
return createTypeReference(globalPromiseType, [promisedType]);
|
|
}
|
|
return emptyObjectType;
|
|
}
|
|
function createPromiseReturnType(func, promisedType) {
|
|
var promiseType = createPromiseType(promisedType);
|
|
if (promiseType === emptyObjectType) {
|
|
error(func, ts.Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
|
|
return unknownType;
|
|
}
|
|
return promiseType;
|
|
}
|
|
function getReturnTypeFromBody(func, contextualMapper) {
|
|
var contextualSignature = getContextualSignatureForFunctionLikeDeclaration(func);
|
|
if (!func.body) {
|
|
return unknownType;
|
|
}
|
|
var isAsync = ts.isAsyncFunctionLike(func);
|
|
var type;
|
|
if (func.body.kind !== 199) {
|
|
type = checkExpressionCached(func.body, contextualMapper);
|
|
if (isAsync) {
|
|
type = checkAwaitedType(type, func, ts.Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
|
|
}
|
|
}
|
|
else {
|
|
var types = void 0;
|
|
var funcIsGenerator = !!func.asteriskToken;
|
|
if (funcIsGenerator) {
|
|
types = checkAndAggregateYieldOperandTypes(func, contextualMapper);
|
|
if (types.length === 0) {
|
|
var iterableIteratorAny = createIterableIteratorType(anyType);
|
|
if (compilerOptions.noImplicitAny) {
|
|
error(func.asteriskToken, ts.Diagnostics.Generator_implicitly_has_type_0_because_it_does_not_yield_any_values_Consider_supplying_a_return_type, typeToString(iterableIteratorAny));
|
|
}
|
|
return iterableIteratorAny;
|
|
}
|
|
}
|
|
else {
|
|
types = checkAndAggregateReturnExpressionTypes(func, contextualMapper);
|
|
if (!types) {
|
|
return isAsync ? createPromiseReturnType(func, neverType) : neverType;
|
|
}
|
|
if (types.length === 0) {
|
|
return isAsync ? createPromiseReturnType(func, voidType) : voidType;
|
|
}
|
|
}
|
|
type = contextualSignature ? getUnionType(types) : getCommonSupertype(types);
|
|
if (!type) {
|
|
if (funcIsGenerator) {
|
|
error(func, ts.Diagnostics.No_best_common_type_exists_among_yield_expressions);
|
|
return createIterableIteratorType(unknownType);
|
|
}
|
|
else {
|
|
error(func, ts.Diagnostics.No_best_common_type_exists_among_return_expressions);
|
|
return isAsync ? createPromiseReturnType(func, getUnionType(types)) : getUnionType(types);
|
|
}
|
|
}
|
|
if (funcIsGenerator) {
|
|
type = createIterableIteratorType(type);
|
|
}
|
|
}
|
|
if (!contextualSignature) {
|
|
reportErrorsFromWidening(func, type);
|
|
}
|
|
var widenedType = getWidenedType(type);
|
|
return isAsync ? createPromiseReturnType(func, widenedType) : widenedType;
|
|
}
|
|
function checkAndAggregateYieldOperandTypes(func, contextualMapper) {
|
|
var aggregatedTypes = [];
|
|
ts.forEachYieldExpression(func.body, function (yieldExpression) {
|
|
var expr = yieldExpression.expression;
|
|
if (expr) {
|
|
var type = checkExpressionCached(expr, contextualMapper);
|
|
if (yieldExpression.asteriskToken) {
|
|
type = checkElementTypeOfIterable(type, yieldExpression.expression);
|
|
}
|
|
if (!ts.contains(aggregatedTypes, type)) {
|
|
aggregatedTypes.push(type);
|
|
}
|
|
}
|
|
});
|
|
return aggregatedTypes;
|
|
}
|
|
function isExhaustiveSwitchStatement(node) {
|
|
var expr = node.expression;
|
|
if (!node.possiblyExhaustive || expr.kind !== 172) {
|
|
return false;
|
|
}
|
|
var type = checkExpression(expr.expression);
|
|
if (!(type.flags & 16384)) {
|
|
return false;
|
|
}
|
|
var propName = expr.name.text;
|
|
var propType = getTypeOfPropertyOfType(type, propName);
|
|
if (!propType || !isStringLiteralUnionType(propType)) {
|
|
return false;
|
|
}
|
|
var switchTypes = getSwitchClauseTypes(node);
|
|
if (!switchTypes.length) {
|
|
return false;
|
|
}
|
|
return eachTypeContainedIn(propType, switchTypes);
|
|
}
|
|
function functionHasImplicitReturn(func) {
|
|
if (!(func.flags & 32768)) {
|
|
return false;
|
|
}
|
|
var lastStatement = ts.lastOrUndefined(func.body.statements);
|
|
if (lastStatement && lastStatement.kind === 213 && isExhaustiveSwitchStatement(lastStatement)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function checkAndAggregateReturnExpressionTypes(func, contextualMapper) {
|
|
var isAsync = ts.isAsyncFunctionLike(func);
|
|
var aggregatedTypes = [];
|
|
var hasReturnWithNoExpression = functionHasImplicitReturn(func);
|
|
var hasReturnOfTypeNever = false;
|
|
ts.forEachReturnStatement(func.body, function (returnStatement) {
|
|
var expr = returnStatement.expression;
|
|
if (expr) {
|
|
var type = checkExpressionCached(expr, contextualMapper);
|
|
if (isAsync) {
|
|
type = checkAwaitedType(type, func, ts.Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
|
|
}
|
|
if (type === neverType) {
|
|
hasReturnOfTypeNever = true;
|
|
}
|
|
else if (!ts.contains(aggregatedTypes, type)) {
|
|
aggregatedTypes.push(type);
|
|
}
|
|
}
|
|
else {
|
|
hasReturnWithNoExpression = true;
|
|
}
|
|
});
|
|
if (aggregatedTypes.length === 0 && !hasReturnWithNoExpression && (hasReturnOfTypeNever ||
|
|
func.kind === 179 || func.kind === 180)) {
|
|
return undefined;
|
|
}
|
|
if (strictNullChecks && aggregatedTypes.length && hasReturnWithNoExpression) {
|
|
if (!ts.contains(aggregatedTypes, undefinedType)) {
|
|
aggregatedTypes.push(undefinedType);
|
|
}
|
|
}
|
|
return aggregatedTypes;
|
|
}
|
|
function checkAllCodePathsInNonVoidFunctionReturnOrThrow(func, returnType) {
|
|
if (!produceDiagnostics) {
|
|
return;
|
|
}
|
|
if (returnType && maybeTypeOfKind(returnType, 1 | 16)) {
|
|
return;
|
|
}
|
|
if (ts.nodeIsMissing(func.body) || func.body.kind !== 199 || !functionHasImplicitReturn(func)) {
|
|
return;
|
|
}
|
|
var hasExplicitReturn = func.flags & 65536;
|
|
if (returnType === neverType) {
|
|
error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point);
|
|
}
|
|
else if (returnType && !hasExplicitReturn) {
|
|
error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value);
|
|
}
|
|
else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) {
|
|
error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined);
|
|
}
|
|
else if (compilerOptions.noImplicitReturns) {
|
|
if (!returnType) {
|
|
if (!hasExplicitReturn) {
|
|
return;
|
|
}
|
|
var inferredReturnType = getReturnTypeOfSignature(getSignatureFromDeclaration(func));
|
|
if (isUnwrappedReturnTypeVoidOrAny(func, inferredReturnType)) {
|
|
return;
|
|
}
|
|
}
|
|
error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value);
|
|
}
|
|
}
|
|
function checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper) {
|
|
ts.Debug.assert(node.kind !== 147 || ts.isObjectLiteralMethod(node));
|
|
var hasGrammarError = checkGrammarFunctionLikeDeclaration(node);
|
|
if (!hasGrammarError && node.kind === 179) {
|
|
checkGrammarForGenerator(node);
|
|
}
|
|
if (contextualMapper === identityMapper && isContextSensitive(node)) {
|
|
checkNodeDeferred(node);
|
|
return anyFunctionType;
|
|
}
|
|
var links = getNodeLinks(node);
|
|
var type = getTypeOfSymbol(node.symbol);
|
|
var contextSensitive = isContextSensitive(node);
|
|
var mightFixTypeParameters = contextSensitive && isInferentialContext(contextualMapper);
|
|
if (mightFixTypeParameters || !(links.flags & 1024)) {
|
|
var contextualSignature = getContextualSignature(node);
|
|
var contextChecked = !!(links.flags & 1024);
|
|
if (mightFixTypeParameters || !contextChecked) {
|
|
links.flags |= 1024;
|
|
if (contextualSignature) {
|
|
var signature = getSignaturesOfType(type, 0)[0];
|
|
if (contextSensitive) {
|
|
assignContextualParameterTypes(signature, contextualSignature, contextualMapper || identityMapper);
|
|
}
|
|
if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) {
|
|
var returnType = getReturnTypeFromBody(node, contextualMapper);
|
|
if (!signature.resolvedReturnType) {
|
|
signature.resolvedReturnType = returnType;
|
|
}
|
|
}
|
|
}
|
|
if (!contextChecked) {
|
|
checkSignatureDeclaration(node);
|
|
checkNodeDeferred(node);
|
|
}
|
|
}
|
|
}
|
|
if (produceDiagnostics && node.kind !== 147 && node.kind !== 146) {
|
|
checkCollisionWithCapturedSuperVariable(node, node.name);
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
}
|
|
return type;
|
|
}
|
|
function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) {
|
|
ts.Debug.assert(node.kind !== 147 || ts.isObjectLiteralMethod(node));
|
|
var isAsync = ts.isAsyncFunctionLike(node);
|
|
var returnOrPromisedType = node.type && (isAsync ? checkAsyncFunctionReturnType(node) : getTypeFromTypeNode(node.type));
|
|
if (!node.asteriskToken) {
|
|
checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType);
|
|
}
|
|
if (node.body) {
|
|
if (!node.type) {
|
|
getReturnTypeOfSignature(getSignatureFromDeclaration(node));
|
|
}
|
|
if (node.body.kind === 199) {
|
|
checkSourceElement(node.body);
|
|
}
|
|
else {
|
|
var exprType = checkExpression(node.body);
|
|
if (returnOrPromisedType) {
|
|
if (isAsync) {
|
|
var awaitedType = checkAwaitedType(exprType, node.body, ts.Diagnostics.Expression_body_for_async_arrow_function_does_not_have_a_valid_callable_then_member);
|
|
checkTypeAssignableTo(awaitedType, returnOrPromisedType, node.body);
|
|
}
|
|
else {
|
|
checkTypeAssignableTo(exprType, returnOrPromisedType, node.body);
|
|
}
|
|
}
|
|
}
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkArithmeticOperandType(operand, type, diagnostic) {
|
|
if (!isTypeAnyOrAllConstituentTypesHaveKind(type, 132)) {
|
|
error(operand, diagnostic);
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function isReadonlySymbol(symbol) {
|
|
return symbol.isReadonly ||
|
|
symbol.flags & 4 && (getDeclarationFlagsFromSymbol(symbol) & 64) !== 0 ||
|
|
symbol.flags & 3 && (getDeclarationFlagsFromSymbol(symbol) & 2048) !== 0 ||
|
|
symbol.flags & 98304 && !(symbol.flags & 65536) ||
|
|
(symbol.flags & 8) !== 0;
|
|
}
|
|
function isReferenceToReadonlyEntity(expr, symbol) {
|
|
if (isReadonlySymbol(symbol)) {
|
|
if (symbol.flags & 4 &&
|
|
(expr.kind === 172 || expr.kind === 173) &&
|
|
expr.expression.kind === 97) {
|
|
var func = ts.getContainingFunction(expr);
|
|
if (!(func && func.kind === 148))
|
|
return true;
|
|
return !(func.parent === symbol.valueDeclaration.parent || func === symbol.valueDeclaration.parent);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isReferenceThroughNamespaceImport(expr) {
|
|
if (expr.kind === 172 || expr.kind === 173) {
|
|
var node = skipParenthesizedNodes(expr.expression);
|
|
if (node.kind === 69) {
|
|
var symbol = getNodeLinks(node).resolvedSymbol;
|
|
if (symbol.flags & 8388608) {
|
|
var declaration = getDeclarationOfAliasSymbol(symbol);
|
|
return declaration && declaration.kind === 232;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkReferenceExpression(expr, invalidReferenceMessage, constantVariableMessage) {
|
|
var node = skipParenthesizedNodes(expr);
|
|
if (node.kind !== 69 && node.kind !== 172 && node.kind !== 173) {
|
|
error(expr, invalidReferenceMessage);
|
|
return false;
|
|
}
|
|
var links = getNodeLinks(node);
|
|
var symbol = getExportSymbolOfValueSymbolIfExported(links.resolvedSymbol);
|
|
if (symbol) {
|
|
if (symbol !== unknownSymbol && symbol !== argumentsSymbol) {
|
|
if (node.kind === 69 && !(symbol.flags & 3)) {
|
|
error(expr, invalidReferenceMessage);
|
|
return false;
|
|
}
|
|
if (isReferenceToReadonlyEntity(node, symbol) || isReferenceThroughNamespaceImport(node)) {
|
|
error(expr, constantVariableMessage);
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else if (node.kind === 173) {
|
|
if (links.resolvedIndexInfo && links.resolvedIndexInfo.isReadonly) {
|
|
error(expr, constantVariableMessage);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function checkDeleteExpression(node) {
|
|
checkExpression(node.expression);
|
|
return booleanType;
|
|
}
|
|
function checkTypeOfExpression(node) {
|
|
checkExpression(node.expression);
|
|
return stringType;
|
|
}
|
|
function checkVoidExpression(node) {
|
|
checkExpression(node.expression);
|
|
return undefinedWideningType;
|
|
}
|
|
function checkAwaitExpression(node) {
|
|
if (produceDiagnostics) {
|
|
if (!(node.flags & 33554432)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.await_expression_is_only_allowed_within_an_async_function);
|
|
}
|
|
if (isInParameterInitializerBeforeContainingFunction(node)) {
|
|
error(node, ts.Diagnostics.await_expressions_cannot_be_used_in_a_parameter_initializer);
|
|
}
|
|
}
|
|
var operandType = checkExpression(node.expression);
|
|
return checkAwaitedType(operandType, node);
|
|
}
|
|
function checkPrefixUnaryExpression(node) {
|
|
var operandType = checkExpression(node.operand);
|
|
switch (node.operator) {
|
|
case 35:
|
|
case 36:
|
|
case 50:
|
|
if (maybeTypeOfKind(operandType, 16777216)) {
|
|
error(node.operand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(node.operator));
|
|
}
|
|
return numberType;
|
|
case 49:
|
|
return booleanType;
|
|
case 41:
|
|
case 42:
|
|
var ok = checkArithmeticOperandType(node.operand, getNonNullableType(operandType), ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
|
|
if (ok) {
|
|
checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant_or_a_read_only_property);
|
|
}
|
|
return numberType;
|
|
}
|
|
return unknownType;
|
|
}
|
|
function checkPostfixUnaryExpression(node) {
|
|
var operandType = checkExpression(node.operand);
|
|
var ok = checkArithmeticOperandType(node.operand, getNonNullableType(operandType), ts.Diagnostics.An_arithmetic_operand_must_be_of_type_any_number_or_an_enum_type);
|
|
if (ok) {
|
|
checkReferenceExpression(node.operand, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_property_or_indexer, ts.Diagnostics.The_operand_of_an_increment_or_decrement_operator_cannot_be_a_constant_or_a_read_only_property);
|
|
}
|
|
return numberType;
|
|
}
|
|
function maybeTypeOfKind(type, kind) {
|
|
if (type.flags & kind) {
|
|
return true;
|
|
}
|
|
if (type.flags & 49152) {
|
|
var types = type.types;
|
|
for (var _i = 0, types_10 = types; _i < types_10.length; _i++) {
|
|
var t = types_10[_i];
|
|
if (maybeTypeOfKind(t, kind)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isTypeOfKind(type, kind) {
|
|
if (type.flags & kind) {
|
|
return true;
|
|
}
|
|
if (type.flags & 16384) {
|
|
var types = type.types;
|
|
for (var _i = 0, types_11 = types; _i < types_11.length; _i++) {
|
|
var t = types_11[_i];
|
|
if (!isTypeOfKind(t, kind)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
if (type.flags & 32768) {
|
|
var types = type.types;
|
|
for (var _a = 0, types_12 = types; _a < types_12.length; _a++) {
|
|
var t = types_12[_a];
|
|
if (isTypeOfKind(t, kind)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function isConstEnumObjectType(type) {
|
|
return type.flags & (80896 | 65536) && type.symbol && isConstEnumSymbol(type.symbol);
|
|
}
|
|
function isConstEnumSymbol(symbol) {
|
|
return (symbol.flags & 128) !== 0;
|
|
}
|
|
function checkInstanceOfExpression(left, right, leftType, rightType) {
|
|
if (isTypeOfKind(leftType, 16777726)) {
|
|
error(left, ts.Diagnostics.The_left_hand_side_of_an_instanceof_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
|
|
}
|
|
if (!(isTypeAny(rightType) || isTypeSubtypeOf(rightType, globalFunctionType))) {
|
|
error(right, ts.Diagnostics.The_right_hand_side_of_an_instanceof_expression_must_be_of_type_any_or_of_a_type_assignable_to_the_Function_interface_type);
|
|
}
|
|
return booleanType;
|
|
}
|
|
function checkInExpression(left, right, leftType, rightType) {
|
|
if (!isTypeAnyOrAllConstituentTypesHaveKind(leftType, 258 | 132 | 16777216)) {
|
|
error(left, ts.Diagnostics.The_left_hand_side_of_an_in_expression_must_be_of_type_any_string_number_or_symbol);
|
|
}
|
|
if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, 80896 | 512)) {
|
|
error(right, ts.Diagnostics.The_right_hand_side_of_an_in_expression_must_be_of_type_any_an_object_type_or_a_type_parameter);
|
|
}
|
|
return booleanType;
|
|
}
|
|
function checkObjectLiteralAssignment(node, sourceType, contextualMapper) {
|
|
var properties = node.properties;
|
|
for (var _i = 0, properties_3 = properties; _i < properties_3.length; _i++) {
|
|
var p = properties_3[_i];
|
|
checkObjectLiteralDestructuringPropertyAssignment(sourceType, p, contextualMapper);
|
|
}
|
|
return sourceType;
|
|
}
|
|
function checkObjectLiteralDestructuringPropertyAssignment(objectLiteralType, property, contextualMapper) {
|
|
if (property.kind === 253 || property.kind === 254) {
|
|
var name_14 = property.name;
|
|
if (name_14.kind === 140) {
|
|
checkComputedPropertyName(name_14);
|
|
}
|
|
if (isComputedNonLiteralName(name_14)) {
|
|
return undefined;
|
|
}
|
|
var text = getTextOfPropertyName(name_14);
|
|
var type = isTypeAny(objectLiteralType)
|
|
? objectLiteralType
|
|
: getTypeOfPropertyOfType(objectLiteralType, text) ||
|
|
isNumericLiteralName(text) && getIndexTypeOfType(objectLiteralType, 1) ||
|
|
getIndexTypeOfType(objectLiteralType, 0);
|
|
if (type) {
|
|
if (property.kind === 254) {
|
|
return checkDestructuringAssignment(property, type);
|
|
}
|
|
else {
|
|
return checkDestructuringAssignment(property.initializer, type);
|
|
}
|
|
}
|
|
else {
|
|
error(name_14, ts.Diagnostics.Type_0_has_no_property_1_and_no_string_index_signature, typeToString(objectLiteralType), ts.declarationNameToString(name_14));
|
|
}
|
|
}
|
|
else {
|
|
error(property, ts.Diagnostics.Property_assignment_expected);
|
|
}
|
|
}
|
|
function checkArrayLiteralAssignment(node, sourceType, contextualMapper) {
|
|
var elementType = checkIteratedTypeOrElementType(sourceType, node, false) || unknownType;
|
|
var elements = node.elements;
|
|
for (var i = 0; i < elements.length; i++) {
|
|
checkArrayLiteralDestructuringElementAssignment(node, sourceType, i, elementType, contextualMapper);
|
|
}
|
|
return sourceType;
|
|
}
|
|
function checkArrayLiteralDestructuringElementAssignment(node, sourceType, elementIndex, elementType, contextualMapper) {
|
|
var elements = node.elements;
|
|
var element = elements[elementIndex];
|
|
if (element.kind !== 193) {
|
|
if (element.kind !== 191) {
|
|
var propName = "" + elementIndex;
|
|
var type = isTypeAny(sourceType)
|
|
? sourceType
|
|
: isTupleLikeType(sourceType)
|
|
? getTypeOfPropertyOfType(sourceType, propName)
|
|
: elementType;
|
|
if (type) {
|
|
return checkDestructuringAssignment(element, type, contextualMapper);
|
|
}
|
|
else {
|
|
if (isTupleType(sourceType)) {
|
|
error(element, ts.Diagnostics.Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2, typeToString(sourceType), sourceType.elementTypes.length, elements.length);
|
|
}
|
|
else {
|
|
error(element, ts.Diagnostics.Type_0_has_no_property_1, typeToString(sourceType), propName);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (elementIndex < elements.length - 1) {
|
|
error(element, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
|
|
}
|
|
else {
|
|
var restExpression = element.expression;
|
|
if (restExpression.kind === 187 && restExpression.operatorToken.kind === 56) {
|
|
error(restExpression.operatorToken, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
|
|
}
|
|
else {
|
|
return checkDestructuringAssignment(restExpression, createArrayType(elementType), contextualMapper);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function checkDestructuringAssignment(exprOrAssignment, sourceType, contextualMapper) {
|
|
var target;
|
|
if (exprOrAssignment.kind === 254) {
|
|
var prop = exprOrAssignment;
|
|
if (prop.objectAssignmentInitializer) {
|
|
if (strictNullChecks &&
|
|
!(getCombinedTypeFlags(checkExpression(prop.objectAssignmentInitializer)) & 32)) {
|
|
sourceType = getTypeWithFacts(sourceType, 131072);
|
|
}
|
|
checkBinaryLikeExpression(prop.name, prop.equalsToken, prop.objectAssignmentInitializer, contextualMapper);
|
|
}
|
|
target = exprOrAssignment.name;
|
|
}
|
|
else {
|
|
target = exprOrAssignment;
|
|
}
|
|
if (target.kind === 187 && target.operatorToken.kind === 56) {
|
|
checkBinaryExpression(target, contextualMapper);
|
|
target = target.left;
|
|
}
|
|
if (target.kind === 171) {
|
|
return checkObjectLiteralAssignment(target, sourceType, contextualMapper);
|
|
}
|
|
if (target.kind === 170) {
|
|
return checkArrayLiteralAssignment(target, sourceType, contextualMapper);
|
|
}
|
|
return checkReferenceAssignment(target, sourceType, contextualMapper);
|
|
}
|
|
function checkReferenceAssignment(target, sourceType, contextualMapper) {
|
|
var targetType = checkExpression(target, contextualMapper);
|
|
if (checkReferenceExpression(target, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant_or_a_read_only_property)) {
|
|
checkTypeAssignableTo(sourceType, targetType, target, undefined);
|
|
}
|
|
return sourceType;
|
|
}
|
|
function isTypeEqualityComparableTo(source, target) {
|
|
return (target.flags & 96) !== 0 || isTypeComparableTo(source, target);
|
|
}
|
|
function checkBinaryExpression(node, contextualMapper) {
|
|
return checkBinaryLikeExpression(node.left, node.operatorToken, node.right, contextualMapper, node);
|
|
}
|
|
function checkBinaryLikeExpression(left, operatorToken, right, contextualMapper, errorNode) {
|
|
var operator = operatorToken.kind;
|
|
if (operator === 56 && (left.kind === 171 || left.kind === 170)) {
|
|
return checkDestructuringAssignment(left, checkExpression(right, contextualMapper), contextualMapper);
|
|
}
|
|
var leftType = checkExpression(left, contextualMapper);
|
|
var rightType = checkExpression(right, contextualMapper);
|
|
switch (operator) {
|
|
case 37:
|
|
case 38:
|
|
case 59:
|
|
case 60:
|
|
case 39:
|
|
case 61:
|
|
case 40:
|
|
case 62:
|
|
case 36:
|
|
case 58:
|
|
case 43:
|
|
case 63:
|
|
case 44:
|
|
case 64:
|
|
case 45:
|
|
case 65:
|
|
case 47:
|
|
case 67:
|
|
case 48:
|
|
case 68:
|
|
case 46:
|
|
case 66:
|
|
if (leftType.flags & 96)
|
|
leftType = rightType;
|
|
if (rightType.flags & 96)
|
|
rightType = leftType;
|
|
leftType = getNonNullableType(leftType);
|
|
rightType = getNonNullableType(rightType);
|
|
var suggestedOperator = void 0;
|
|
if ((leftType.flags & 8) &&
|
|
(rightType.flags & 8) &&
|
|
(suggestedOperator = getSuggestedBooleanOperator(operatorToken.kind)) !== undefined) {
|
|
error(errorNode || operatorToken, ts.Diagnostics.The_0_operator_is_not_allowed_for_boolean_types_Consider_using_1_instead, ts.tokenToString(operatorToken.kind), ts.tokenToString(suggestedOperator));
|
|
}
|
|
else {
|
|
var leftOk = checkArithmeticOperandType(left, leftType, ts.Diagnostics.The_left_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
|
|
var rightOk = checkArithmeticOperandType(right, rightType, ts.Diagnostics.The_right_hand_side_of_an_arithmetic_operation_must_be_of_type_any_number_or_an_enum_type);
|
|
if (leftOk && rightOk) {
|
|
checkAssignmentOperator(numberType);
|
|
}
|
|
}
|
|
return numberType;
|
|
case 35:
|
|
case 57:
|
|
if (leftType.flags & 96)
|
|
leftType = rightType;
|
|
if (rightType.flags & 96)
|
|
rightType = leftType;
|
|
leftType = getNonNullableType(leftType);
|
|
rightType = getNonNullableType(rightType);
|
|
var resultType = void 0;
|
|
if (isTypeOfKind(leftType, 132) && isTypeOfKind(rightType, 132)) {
|
|
resultType = numberType;
|
|
}
|
|
else {
|
|
if (isTypeOfKind(leftType, 258) || isTypeOfKind(rightType, 258)) {
|
|
resultType = stringType;
|
|
}
|
|
else if (isTypeAny(leftType) || isTypeAny(rightType)) {
|
|
resultType = leftType === unknownType || rightType === unknownType ? unknownType : anyType;
|
|
}
|
|
if (resultType && !checkForDisallowedESSymbolOperand(operator)) {
|
|
return resultType;
|
|
}
|
|
}
|
|
if (!resultType) {
|
|
reportOperatorError();
|
|
return anyType;
|
|
}
|
|
if (operator === 57) {
|
|
checkAssignmentOperator(resultType);
|
|
}
|
|
return resultType;
|
|
case 25:
|
|
case 27:
|
|
case 28:
|
|
case 29:
|
|
if (checkForDisallowedESSymbolOperand(operator)) {
|
|
if (!isTypeComparableTo(leftType, rightType) && !isTypeComparableTo(rightType, leftType)) {
|
|
reportOperatorError();
|
|
}
|
|
}
|
|
return booleanType;
|
|
case 30:
|
|
case 31:
|
|
case 32:
|
|
case 33:
|
|
if (!isTypeEqualityComparableTo(leftType, rightType) && !isTypeEqualityComparableTo(rightType, leftType)) {
|
|
reportOperatorError();
|
|
}
|
|
return booleanType;
|
|
case 91:
|
|
return checkInstanceOfExpression(left, right, leftType, rightType);
|
|
case 90:
|
|
return checkInExpression(left, right, leftType, rightType);
|
|
case 51:
|
|
return strictNullChecks ? addTypeKind(rightType, getCombinedTypeFlags(leftType) & 112) : rightType;
|
|
case 52:
|
|
return getUnionType([getNonNullableType(leftType), rightType]);
|
|
case 56:
|
|
checkAssignmentOperator(rightType);
|
|
return getRegularTypeOfObjectLiteral(rightType);
|
|
case 24:
|
|
return rightType;
|
|
}
|
|
function checkForDisallowedESSymbolOperand(operator) {
|
|
var offendingSymbolOperand = maybeTypeOfKind(leftType, 16777216) ? left :
|
|
maybeTypeOfKind(rightType, 16777216) ? right :
|
|
undefined;
|
|
if (offendingSymbolOperand) {
|
|
error(offendingSymbolOperand, ts.Diagnostics.The_0_operator_cannot_be_applied_to_type_symbol, ts.tokenToString(operator));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function getSuggestedBooleanOperator(operator) {
|
|
switch (operator) {
|
|
case 47:
|
|
case 67:
|
|
return 52;
|
|
case 48:
|
|
case 68:
|
|
return 33;
|
|
case 46:
|
|
case 66:
|
|
return 51;
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|
|
function checkAssignmentOperator(valueType) {
|
|
if (produceDiagnostics && operator >= 56 && operator <= 68) {
|
|
var ok = checkReferenceExpression(left, ts.Diagnostics.Invalid_left_hand_side_of_assignment_expression, ts.Diagnostics.Left_hand_side_of_assignment_expression_cannot_be_a_constant_or_a_read_only_property);
|
|
if (ok) {
|
|
checkTypeAssignableTo(valueType, leftType, left, undefined);
|
|
}
|
|
}
|
|
}
|
|
function reportOperatorError() {
|
|
error(errorNode || operatorToken, ts.Diagnostics.Operator_0_cannot_be_applied_to_types_1_and_2, ts.tokenToString(operatorToken.kind), typeToString(leftType), typeToString(rightType));
|
|
}
|
|
}
|
|
function isYieldExpressionInClass(node) {
|
|
var current = node;
|
|
var parent = node.parent;
|
|
while (parent) {
|
|
if (ts.isFunctionLike(parent) && current === parent.body) {
|
|
return false;
|
|
}
|
|
else if (ts.isClassLike(current)) {
|
|
return true;
|
|
}
|
|
current = parent;
|
|
parent = parent.parent;
|
|
}
|
|
return false;
|
|
}
|
|
function checkYieldExpression(node) {
|
|
if (produceDiagnostics) {
|
|
if (!(node.flags & 8388608) || isYieldExpressionInClass(node)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.A_yield_expression_is_only_allowed_in_a_generator_body);
|
|
}
|
|
if (isInParameterInitializerBeforeContainingFunction(node)) {
|
|
error(node, ts.Diagnostics.yield_expressions_cannot_be_used_in_a_parameter_initializer);
|
|
}
|
|
}
|
|
if (node.expression) {
|
|
var func = ts.getContainingFunction(node);
|
|
if (func && func.asteriskToken) {
|
|
var expressionType = checkExpressionCached(node.expression, undefined);
|
|
var expressionElementType = void 0;
|
|
var nodeIsYieldStar = !!node.asteriskToken;
|
|
if (nodeIsYieldStar) {
|
|
expressionElementType = checkElementTypeOfIterable(expressionType, node.expression);
|
|
}
|
|
if (func.type) {
|
|
var signatureElementType = getElementTypeOfIterableIterator(getTypeFromTypeNode(func.type)) || anyType;
|
|
if (nodeIsYieldStar) {
|
|
checkTypeAssignableTo(expressionElementType, signatureElementType, node.expression, undefined);
|
|
}
|
|
else {
|
|
checkTypeAssignableTo(expressionType, signatureElementType, node.expression, undefined);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return anyType;
|
|
}
|
|
function checkConditionalExpression(node, contextualMapper) {
|
|
checkExpression(node.condition);
|
|
var type1 = checkExpression(node.whenTrue, contextualMapper);
|
|
var type2 = checkExpression(node.whenFalse, contextualMapper);
|
|
return getUnionType([type1, type2]);
|
|
}
|
|
function checkStringLiteralExpression(node) {
|
|
var contextualType = getContextualType(node);
|
|
if (contextualType && isStringLiteralUnionType(contextualType)) {
|
|
return getStringLiteralTypeForText(node.text);
|
|
}
|
|
return stringType;
|
|
}
|
|
function checkTemplateExpression(node) {
|
|
ts.forEach(node.templateSpans, function (templateSpan) {
|
|
checkExpression(templateSpan.expression);
|
|
});
|
|
return stringType;
|
|
}
|
|
function checkExpressionWithContextualType(node, contextualType, contextualMapper) {
|
|
var saveContextualType = node.contextualType;
|
|
node.contextualType = contextualType;
|
|
var result = checkExpression(node, contextualMapper);
|
|
node.contextualType = saveContextualType;
|
|
return result;
|
|
}
|
|
function checkExpressionCached(node, contextualMapper) {
|
|
var links = getNodeLinks(node);
|
|
if (!links.resolvedType) {
|
|
var saveFlowLoopStart = flowLoopStart;
|
|
flowLoopStart = flowLoopCount;
|
|
links.resolvedType = checkExpression(node, contextualMapper);
|
|
flowLoopStart = saveFlowLoopStart;
|
|
}
|
|
return links.resolvedType;
|
|
}
|
|
function checkPropertyAssignment(node, contextualMapper) {
|
|
if (node.name.kind === 140) {
|
|
checkComputedPropertyName(node.name);
|
|
}
|
|
return checkExpression(node.initializer, contextualMapper);
|
|
}
|
|
function checkObjectLiteralMethod(node, contextualMapper) {
|
|
checkGrammarMethod(node);
|
|
if (node.name.kind === 140) {
|
|
checkComputedPropertyName(node.name);
|
|
}
|
|
var uninstantiatedType = checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
|
|
return instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
|
|
}
|
|
function instantiateTypeWithSingleGenericCallSignature(node, type, contextualMapper) {
|
|
if (isInferentialContext(contextualMapper)) {
|
|
var signature = getSingleCallSignature(type);
|
|
if (signature && signature.typeParameters) {
|
|
var contextualType = getApparentTypeOfContextualType(node);
|
|
if (contextualType) {
|
|
var contextualSignature = getSingleCallSignature(contextualType);
|
|
if (contextualSignature && !contextualSignature.typeParameters) {
|
|
return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function checkExpression(node, contextualMapper) {
|
|
var type;
|
|
if (node.kind === 139) {
|
|
type = checkQualifiedName(node);
|
|
}
|
|
else {
|
|
var uninstantiatedType = checkExpressionWorker(node, contextualMapper);
|
|
type = instantiateTypeWithSingleGenericCallSignature(node, uninstantiatedType, contextualMapper);
|
|
}
|
|
if (isConstEnumObjectType(type)) {
|
|
var ok = (node.parent.kind === 172 && node.parent.expression === node) ||
|
|
(node.parent.kind === 173 && node.parent.expression === node) ||
|
|
((node.kind === 69 || node.kind === 139) && isInRightSideOfImportOrExportAssignment(node));
|
|
if (!ok) {
|
|
error(node, ts.Diagnostics.const_enums_can_only_be_used_in_property_or_index_access_expressions_or_the_right_hand_side_of_an_import_declaration_or_export_assignment);
|
|
}
|
|
}
|
|
return type;
|
|
}
|
|
function checkNumericLiteral(node) {
|
|
checkGrammarNumericLiteral(node);
|
|
return numberType;
|
|
}
|
|
function checkExpressionWorker(node, contextualMapper) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
return checkIdentifier(node);
|
|
case 97:
|
|
return checkThisExpression(node);
|
|
case 95:
|
|
return checkSuperExpression(node);
|
|
case 93:
|
|
return nullWideningType;
|
|
case 99:
|
|
case 84:
|
|
return booleanType;
|
|
case 8:
|
|
return checkNumericLiteral(node);
|
|
case 189:
|
|
return checkTemplateExpression(node);
|
|
case 9:
|
|
return checkStringLiteralExpression(node);
|
|
case 11:
|
|
return stringType;
|
|
case 10:
|
|
return globalRegExpType;
|
|
case 170:
|
|
return checkArrayLiteral(node, contextualMapper);
|
|
case 171:
|
|
return checkObjectLiteral(node, contextualMapper);
|
|
case 172:
|
|
return checkPropertyAccessExpression(node);
|
|
case 173:
|
|
return checkIndexedAccess(node);
|
|
case 174:
|
|
case 175:
|
|
return checkCallExpression(node);
|
|
case 176:
|
|
return checkTaggedTemplateExpression(node);
|
|
case 178:
|
|
return checkExpression(node.expression, contextualMapper);
|
|
case 192:
|
|
return checkClassExpression(node);
|
|
case 179:
|
|
case 180:
|
|
return checkFunctionExpressionOrObjectLiteralMethod(node, contextualMapper);
|
|
case 182:
|
|
return checkTypeOfExpression(node);
|
|
case 177:
|
|
case 195:
|
|
return checkAssertion(node);
|
|
case 196:
|
|
return checkNonNullAssertion(node);
|
|
case 181:
|
|
return checkDeleteExpression(node);
|
|
case 183:
|
|
return checkVoidExpression(node);
|
|
case 184:
|
|
return checkAwaitExpression(node);
|
|
case 185:
|
|
return checkPrefixUnaryExpression(node);
|
|
case 186:
|
|
return checkPostfixUnaryExpression(node);
|
|
case 187:
|
|
return checkBinaryExpression(node, contextualMapper);
|
|
case 188:
|
|
return checkConditionalExpression(node, contextualMapper);
|
|
case 191:
|
|
return checkSpreadElementExpression(node, contextualMapper);
|
|
case 193:
|
|
return undefinedWideningType;
|
|
case 190:
|
|
return checkYieldExpression(node);
|
|
case 248:
|
|
return checkJsxExpression(node);
|
|
case 241:
|
|
return checkJsxElement(node);
|
|
case 242:
|
|
return checkJsxSelfClosingElement(node);
|
|
case 243:
|
|
ts.Debug.fail("Shouldn't ever directly check a JsxOpeningElement");
|
|
}
|
|
return unknownType;
|
|
}
|
|
function checkTypeParameter(node) {
|
|
if (node.expression) {
|
|
grammarErrorOnFirstToken(node.expression, ts.Diagnostics.Type_expected);
|
|
}
|
|
checkSourceElement(node.constraint);
|
|
getConstraintOfTypeParameter(getDeclaredTypeOfTypeParameter(getSymbolOfNode(node)));
|
|
if (produceDiagnostics) {
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_parameter_name_cannot_be_0);
|
|
}
|
|
}
|
|
function checkParameter(node) {
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
|
checkVariableLikeDeclaration(node);
|
|
var func = ts.getContainingFunction(node);
|
|
if (node.flags & 92) {
|
|
func = ts.getContainingFunction(node);
|
|
if (!(func.kind === 148 && ts.nodeIsPresent(func.body))) {
|
|
error(node, ts.Diagnostics.A_parameter_property_is_only_allowed_in_a_constructor_implementation);
|
|
}
|
|
}
|
|
if (node.questionToken && ts.isBindingPattern(node.name) && func.body) {
|
|
error(node, ts.Diagnostics.A_binding_pattern_parameter_cannot_be_optional_in_an_implementation_signature);
|
|
}
|
|
if (node.name.text === "this") {
|
|
if (ts.indexOf(func.parameters, node) !== 0) {
|
|
error(node, ts.Diagnostics.A_this_parameter_must_be_the_first_parameter);
|
|
}
|
|
if (func.kind === 148 || func.kind === 152 || func.kind === 157) {
|
|
error(node, ts.Diagnostics.A_constructor_cannot_have_a_this_parameter);
|
|
}
|
|
}
|
|
if (node.dotDotDotToken && !ts.isBindingPattern(node.name) && !isArrayType(getTypeOfSymbol(node.symbol))) {
|
|
error(node, ts.Diagnostics.A_rest_parameter_must_be_of_an_array_type);
|
|
}
|
|
}
|
|
function isSyntacticallyValidGenerator(node) {
|
|
if (!node.asteriskToken || !node.body) {
|
|
return false;
|
|
}
|
|
return node.kind === 147 ||
|
|
node.kind === 220 ||
|
|
node.kind === 179;
|
|
}
|
|
function getTypePredicateParameterIndex(parameterList, parameter) {
|
|
if (parameterList) {
|
|
for (var i = 0; i < parameterList.length; i++) {
|
|
var param = parameterList[i];
|
|
if (param.name.kind === 69 &&
|
|
param.name.text === parameter.text) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function checkTypePredicate(node) {
|
|
var parent = getTypePredicateParent(node);
|
|
if (!parent) {
|
|
error(node, ts.Diagnostics.A_type_predicate_is_only_allowed_in_return_type_position_for_functions_and_methods);
|
|
return;
|
|
}
|
|
var typePredicate = getSignatureFromDeclaration(parent).typePredicate;
|
|
if (!typePredicate) {
|
|
return;
|
|
}
|
|
var parameterName = node.parameterName;
|
|
if (ts.isThisTypePredicate(typePredicate)) {
|
|
getTypeFromThisTypeNode(parameterName);
|
|
}
|
|
else {
|
|
if (typePredicate.parameterIndex >= 0) {
|
|
if (parent.parameters[typePredicate.parameterIndex].dotDotDotToken) {
|
|
error(parameterName, ts.Diagnostics.A_type_predicate_cannot_reference_a_rest_parameter);
|
|
}
|
|
else {
|
|
var leadingError = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.A_type_predicate_s_type_must_be_assignable_to_its_parameter_s_type);
|
|
checkTypeAssignableTo(typePredicate.type, getTypeOfNode(parent.parameters[typePredicate.parameterIndex]), node.type, undefined, leadingError);
|
|
}
|
|
}
|
|
else if (parameterName) {
|
|
var hasReportedError = false;
|
|
for (var _i = 0, _a = parent.parameters; _i < _a.length; _i++) {
|
|
var name_15 = _a[_i].name;
|
|
if (ts.isBindingPattern(name_15) &&
|
|
checkIfTypePredicateVariableIsDeclaredInBindingPattern(name_15, parameterName, typePredicate.parameterName)) {
|
|
hasReportedError = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!hasReportedError) {
|
|
error(node.parameterName, ts.Diagnostics.Cannot_find_parameter_0, typePredicate.parameterName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getTypePredicateParent(node) {
|
|
switch (node.parent.kind) {
|
|
case 180:
|
|
case 151:
|
|
case 220:
|
|
case 179:
|
|
case 156:
|
|
case 147:
|
|
case 146:
|
|
var parent_10 = node.parent;
|
|
if (node === parent_10.type) {
|
|
return parent_10;
|
|
}
|
|
}
|
|
}
|
|
function checkIfTypePredicateVariableIsDeclaredInBindingPattern(pattern, predicateVariableNode, predicateVariableName) {
|
|
for (var _i = 0, _a = pattern.elements; _i < _a.length; _i++) {
|
|
var name_16 = _a[_i].name;
|
|
if (name_16.kind === 69 &&
|
|
name_16.text === predicateVariableName) {
|
|
error(predicateVariableNode, ts.Diagnostics.A_type_predicate_cannot_reference_element_0_in_a_binding_pattern, predicateVariableName);
|
|
return true;
|
|
}
|
|
else if (name_16.kind === 168 ||
|
|
name_16.kind === 167) {
|
|
if (checkIfTypePredicateVariableIsDeclaredInBindingPattern(name_16, predicateVariableNode, predicateVariableName)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkSignatureDeclaration(node) {
|
|
if (node.kind === 153) {
|
|
checkGrammarIndexSignature(node);
|
|
}
|
|
else if (node.kind === 156 || node.kind === 220 || node.kind === 157 ||
|
|
node.kind === 151 || node.kind === 148 ||
|
|
node.kind === 152) {
|
|
checkGrammarFunctionLikeDeclaration(node);
|
|
}
|
|
checkTypeParameters(node.typeParameters);
|
|
ts.forEach(node.parameters, checkParameter);
|
|
if (node.type) {
|
|
checkSourceElement(node.type);
|
|
}
|
|
if (produceDiagnostics) {
|
|
checkCollisionWithArgumentsInGeneratedCode(node);
|
|
if (compilerOptions.noImplicitAny && !node.type) {
|
|
switch (node.kind) {
|
|
case 152:
|
|
error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
|
|
break;
|
|
case 151:
|
|
error(node, ts.Diagnostics.Call_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type);
|
|
break;
|
|
}
|
|
}
|
|
if (node.type) {
|
|
if (languageVersion >= 2 && isSyntacticallyValidGenerator(node)) {
|
|
var returnType = getTypeFromTypeNode(node.type);
|
|
if (returnType === voidType) {
|
|
error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation);
|
|
}
|
|
else {
|
|
var generatorElementType = getElementTypeOfIterableIterator(returnType) || anyType;
|
|
var iterableIteratorInstantiation = createIterableIteratorType(generatorElementType);
|
|
checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type);
|
|
}
|
|
}
|
|
else if (ts.isAsyncFunctionLike(node)) {
|
|
checkAsyncFunctionReturnType(node);
|
|
}
|
|
}
|
|
if (noUnusedIdentifiers && !node.body) {
|
|
checkUnusedTypeParameters(node);
|
|
}
|
|
}
|
|
}
|
|
function checkClassForDuplicateDeclarations(node) {
|
|
var getter = 1, setter = 2, property = getter | setter;
|
|
var instanceNames = {};
|
|
var staticNames = {};
|
|
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
|
|
var member = _a[_i];
|
|
if (member.kind === 148) {
|
|
for (var _b = 0, _c = member.parameters; _b < _c.length; _b++) {
|
|
var param = _c[_b];
|
|
if (ts.isParameterPropertyDeclaration(param)) {
|
|
addName(instanceNames, param.name, param.name.text, property);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var isStatic = ts.forEach(member.modifiers, function (m) { return m.kind === 113; });
|
|
var names = isStatic ? staticNames : instanceNames;
|
|
var memberName = member.name && ts.getPropertyNameForPropertyNameNode(member.name);
|
|
if (memberName) {
|
|
switch (member.kind) {
|
|
case 149:
|
|
addName(names, member.name, memberName, getter);
|
|
break;
|
|
case 150:
|
|
addName(names, member.name, memberName, setter);
|
|
break;
|
|
case 145:
|
|
addName(names, member.name, memberName, property);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function addName(names, location, name, meaning) {
|
|
if (ts.hasProperty(names, name)) {
|
|
var prev = names[name];
|
|
if (prev & meaning) {
|
|
error(location, ts.Diagnostics.Duplicate_identifier_0, ts.getTextOfNode(location));
|
|
}
|
|
else {
|
|
names[name] = prev | meaning;
|
|
}
|
|
}
|
|
else {
|
|
names[name] = meaning;
|
|
}
|
|
}
|
|
}
|
|
function checkObjectTypeForDuplicateDeclarations(node) {
|
|
var names = {};
|
|
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
|
|
var member = _a[_i];
|
|
if (member.kind == 144) {
|
|
var memberName = void 0;
|
|
switch (member.name.kind) {
|
|
case 9:
|
|
case 8:
|
|
case 69:
|
|
memberName = member.name.text;
|
|
break;
|
|
default:
|
|
continue;
|
|
}
|
|
if (ts.hasProperty(names, memberName)) {
|
|
error(member.symbol.valueDeclaration.name, ts.Diagnostics.Duplicate_identifier_0, memberName);
|
|
error(member.name, ts.Diagnostics.Duplicate_identifier_0, memberName);
|
|
}
|
|
else {
|
|
names[memberName] = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkTypeForDuplicateIndexSignatures(node) {
|
|
if (node.kind === 222) {
|
|
var nodeSymbol = getSymbolOfNode(node);
|
|
if (nodeSymbol.declarations.length > 0 && nodeSymbol.declarations[0] !== node) {
|
|
return;
|
|
}
|
|
}
|
|
var indexSymbol = getIndexSymbol(getSymbolOfNode(node));
|
|
if (indexSymbol) {
|
|
var seenNumericIndexer = false;
|
|
var seenStringIndexer = false;
|
|
for (var _i = 0, _a = indexSymbol.declarations; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
var declaration = decl;
|
|
if (declaration.parameters.length === 1 && declaration.parameters[0].type) {
|
|
switch (declaration.parameters[0].type.kind) {
|
|
case 132:
|
|
if (!seenStringIndexer) {
|
|
seenStringIndexer = true;
|
|
}
|
|
else {
|
|
error(declaration, ts.Diagnostics.Duplicate_string_index_signature);
|
|
}
|
|
break;
|
|
case 130:
|
|
if (!seenNumericIndexer) {
|
|
seenNumericIndexer = true;
|
|
}
|
|
else {
|
|
error(declaration, ts.Diagnostics.Duplicate_number_index_signature);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkPropertyDeclaration(node) {
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarProperty(node) || checkGrammarComputedPropertyName(node.name);
|
|
checkVariableLikeDeclaration(node);
|
|
}
|
|
function checkMethodDeclaration(node) {
|
|
checkGrammarMethod(node) || checkGrammarComputedPropertyName(node.name);
|
|
checkFunctionOrMethodDeclaration(node);
|
|
if (node.flags & 128 && node.body) {
|
|
error(node, ts.Diagnostics.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, ts.declarationNameToString(node.name));
|
|
}
|
|
}
|
|
function checkConstructorDeclaration(node) {
|
|
checkSignatureDeclaration(node);
|
|
checkGrammarConstructorTypeParameters(node) || checkGrammarConstructorTypeAnnotation(node);
|
|
checkSourceElement(node.body);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
var symbol = getSymbolOfNode(node);
|
|
var firstDeclaration = ts.getDeclarationOfKind(symbol, node.kind);
|
|
if (node === firstDeclaration) {
|
|
checkFunctionOrConstructorSymbol(symbol);
|
|
}
|
|
if (ts.nodeIsMissing(node.body)) {
|
|
return;
|
|
}
|
|
if (!produceDiagnostics) {
|
|
return;
|
|
}
|
|
function containsSuperCallAsComputedPropertyName(n) {
|
|
return n.name && containsSuperCall(n.name);
|
|
}
|
|
function containsSuperCall(n) {
|
|
if (ts.isSuperCallExpression(n)) {
|
|
return true;
|
|
}
|
|
else if (ts.isFunctionLike(n)) {
|
|
return false;
|
|
}
|
|
else if (ts.isClassLike(n)) {
|
|
return ts.forEach(n.members, containsSuperCallAsComputedPropertyName);
|
|
}
|
|
return ts.forEachChild(n, containsSuperCall);
|
|
}
|
|
function markThisReferencesAsErrors(n) {
|
|
if (n.kind === 97) {
|
|
error(n, ts.Diagnostics.this_cannot_be_referenced_in_current_location);
|
|
}
|
|
else if (n.kind !== 179 && n.kind !== 220) {
|
|
ts.forEachChild(n, markThisReferencesAsErrors);
|
|
}
|
|
}
|
|
function isInstancePropertyWithInitializer(n) {
|
|
return n.kind === 145 &&
|
|
!(n.flags & 32) &&
|
|
!!n.initializer;
|
|
}
|
|
var containingClassDecl = node.parent;
|
|
if (ts.getClassExtendsHeritageClauseElement(containingClassDecl)) {
|
|
var classExtendsNull = classDeclarationExtendsNull(containingClassDecl);
|
|
var superCall = getSuperCallInConstructor(node);
|
|
if (superCall) {
|
|
if (classExtendsNull) {
|
|
error(superCall, ts.Diagnostics.A_constructor_cannot_contain_a_super_call_when_its_class_extends_null);
|
|
}
|
|
var superCallShouldBeFirst = ts.forEach(node.parent.members, isInstancePropertyWithInitializer) ||
|
|
ts.forEach(node.parameters, function (p) { return p.flags & 92; });
|
|
if (superCallShouldBeFirst) {
|
|
var statements = node.body.statements;
|
|
var superCallStatement = void 0;
|
|
for (var _i = 0, statements_2 = statements; _i < statements_2.length; _i++) {
|
|
var statement = statements_2[_i];
|
|
if (statement.kind === 202 && ts.isSuperCallExpression(statement.expression)) {
|
|
superCallStatement = statement;
|
|
break;
|
|
}
|
|
if (!ts.isPrologueDirective(statement)) {
|
|
break;
|
|
}
|
|
}
|
|
if (!superCallStatement) {
|
|
error(node, ts.Diagnostics.A_super_call_must_be_the_first_statement_in_the_constructor_when_a_class_contains_initialized_properties_or_has_parameter_properties);
|
|
}
|
|
}
|
|
}
|
|
else if (!classExtendsNull) {
|
|
error(node, ts.Diagnostics.Constructors_for_derived_classes_must_contain_a_super_call);
|
|
}
|
|
}
|
|
}
|
|
function checkAccessorDeclaration(node) {
|
|
if (produceDiagnostics) {
|
|
checkGrammarFunctionLikeDeclaration(node) || checkGrammarAccessor(node) || checkGrammarComputedPropertyName(node.name);
|
|
checkDecorators(node);
|
|
checkSignatureDeclaration(node);
|
|
if (node.kind === 149) {
|
|
if (!ts.isInAmbientContext(node) && ts.nodeIsPresent(node.body) && (node.flags & 32768)) {
|
|
if (node.flags & 65536) {
|
|
if (compilerOptions.noImplicitReturns) {
|
|
error(node.name, ts.Diagnostics.Not_all_code_paths_return_a_value);
|
|
}
|
|
}
|
|
else {
|
|
error(node.name, ts.Diagnostics.A_get_accessor_must_return_a_value);
|
|
}
|
|
}
|
|
}
|
|
if (node.name.kind === 140) {
|
|
checkComputedPropertyName(node.name);
|
|
}
|
|
if (!ts.hasDynamicName(node)) {
|
|
var otherKind = node.kind === 149 ? 150 : 149;
|
|
var otherAccessor = ts.getDeclarationOfKind(node.symbol, otherKind);
|
|
if (otherAccessor) {
|
|
if (((node.flags & 28) !== (otherAccessor.flags & 28))) {
|
|
error(node.name, ts.Diagnostics.Getter_and_setter_accessors_do_not_agree_in_visibility);
|
|
}
|
|
if (((node.flags & 128) !== (otherAccessor.flags & 128))) {
|
|
error(node.name, ts.Diagnostics.Accessors_must_both_be_abstract_or_non_abstract);
|
|
}
|
|
checkAccessorDeclarationTypesIdentical(node, otherAccessor, getAnnotatedAccessorType, ts.Diagnostics.get_and_set_accessor_must_have_the_same_type);
|
|
checkAccessorDeclarationTypesIdentical(node, otherAccessor, getThisTypeOfDeclaration, ts.Diagnostics.get_and_set_accessor_must_have_the_same_this_type);
|
|
}
|
|
}
|
|
getTypeOfAccessors(getSymbolOfNode(node));
|
|
}
|
|
if (node.parent.kind !== 171) {
|
|
checkSourceElement(node.body);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
else {
|
|
checkNodeDeferred(node);
|
|
}
|
|
}
|
|
function checkAccessorDeclarationTypesIdentical(first, second, getAnnotatedType, message) {
|
|
var firstType = getAnnotatedType(first);
|
|
var secondType = getAnnotatedType(second);
|
|
if (firstType && secondType && !isTypeIdenticalTo(firstType, secondType)) {
|
|
error(first, message);
|
|
}
|
|
}
|
|
function checkAccessorDeferred(node) {
|
|
checkSourceElement(node.body);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
function checkMissingDeclaration(node) {
|
|
checkDecorators(node);
|
|
}
|
|
function checkTypeArgumentConstraints(typeParameters, typeArgumentNodes) {
|
|
var typeArguments;
|
|
var mapper;
|
|
var result = true;
|
|
for (var i = 0; i < typeParameters.length; i++) {
|
|
var constraint = getConstraintOfTypeParameter(typeParameters[i]);
|
|
if (constraint) {
|
|
if (!typeArguments) {
|
|
typeArguments = ts.map(typeArgumentNodes, getTypeFromTypeNode);
|
|
mapper = createTypeMapper(typeParameters, typeArguments);
|
|
}
|
|
var typeArgument = typeArguments[i];
|
|
result = result && checkTypeAssignableTo(typeArgument, getTypeWithThisArgument(instantiateType(constraint, mapper), typeArgument), typeArgumentNodes[i], ts.Diagnostics.Type_0_does_not_satisfy_the_constraint_1);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function checkTypeReferenceNode(node) {
|
|
checkGrammarTypeArguments(node, node.typeArguments);
|
|
var type = getTypeFromTypeReference(node);
|
|
if (type !== unknownType) {
|
|
if (node.typeArguments) {
|
|
ts.forEach(node.typeArguments, checkSourceElement);
|
|
if (produceDiagnostics) {
|
|
var symbol = getNodeLinks(node).resolvedSymbol;
|
|
var typeParameters = symbol.flags & 524288 ? getSymbolLinks(symbol).typeParameters : type.target.localTypeParameters;
|
|
checkTypeArgumentConstraints(typeParameters, node.typeArguments);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkTypeQuery(node) {
|
|
getTypeFromTypeQueryNode(node);
|
|
}
|
|
function checkTypeLiteral(node) {
|
|
ts.forEach(node.members, checkSourceElement);
|
|
if (produceDiagnostics) {
|
|
var type = getTypeFromTypeLiteralOrFunctionOrConstructorTypeNode(node);
|
|
checkIndexConstraints(type);
|
|
checkTypeForDuplicateIndexSignatures(node);
|
|
checkObjectTypeForDuplicateDeclarations(node);
|
|
}
|
|
}
|
|
function checkArrayType(node) {
|
|
checkSourceElement(node.elementType);
|
|
}
|
|
function checkTupleType(node) {
|
|
var hasErrorFromDisallowedTrailingComma = checkGrammarForDisallowedTrailingComma(node.elementTypes);
|
|
if (!hasErrorFromDisallowedTrailingComma && node.elementTypes.length === 0) {
|
|
grammarErrorOnNode(node, ts.Diagnostics.A_tuple_type_element_list_cannot_be_empty);
|
|
}
|
|
ts.forEach(node.elementTypes, checkSourceElement);
|
|
}
|
|
function checkUnionOrIntersectionType(node) {
|
|
ts.forEach(node.types, checkSourceElement);
|
|
}
|
|
function isPrivateWithinAmbient(node) {
|
|
return (node.flags & 8) && ts.isInAmbientContext(node);
|
|
}
|
|
function getEffectiveDeclarationFlags(n, flagsToCheck) {
|
|
var flags = ts.getCombinedNodeFlags(n);
|
|
if (n.parent.kind !== 222 &&
|
|
n.parent.kind !== 221 &&
|
|
n.parent.kind !== 192 &&
|
|
ts.isInAmbientContext(n)) {
|
|
if (!(flags & 2)) {
|
|
flags |= 1;
|
|
}
|
|
flags |= 2;
|
|
}
|
|
return flags & flagsToCheck;
|
|
}
|
|
function checkFunctionOrConstructorSymbol(symbol) {
|
|
if (!produceDiagnostics) {
|
|
return;
|
|
}
|
|
function getCanonicalOverload(overloads, implementation) {
|
|
var implementationSharesContainerWithFirstOverload = implementation !== undefined && implementation.parent === overloads[0].parent;
|
|
return implementationSharesContainerWithFirstOverload ? implementation : overloads[0];
|
|
}
|
|
function checkFlagAgreementBetweenOverloads(overloads, implementation, flagsToCheck, someOverloadFlags, allOverloadFlags) {
|
|
var someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
|
|
if (someButNotAllOverloadFlags !== 0) {
|
|
var canonicalFlags_1 = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck);
|
|
ts.forEach(overloads, function (o) {
|
|
var deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags_1;
|
|
if (deviation & 1) {
|
|
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_exported_or_non_exported);
|
|
}
|
|
else if (deviation & 2) {
|
|
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
|
|
}
|
|
else if (deviation & (8 | 16)) {
|
|
error(o.name || o, ts.Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
|
|
}
|
|
else if (deviation & 128) {
|
|
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_abstract_or_non_abstract);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function checkQuestionTokenAgreementBetweenOverloads(overloads, implementation, someHaveQuestionToken, allHaveQuestionToken) {
|
|
if (someHaveQuestionToken !== allHaveQuestionToken) {
|
|
var canonicalHasQuestionToken_1 = ts.hasQuestionToken(getCanonicalOverload(overloads, implementation));
|
|
ts.forEach(overloads, function (o) {
|
|
var deviation = ts.hasQuestionToken(o) !== canonicalHasQuestionToken_1;
|
|
if (deviation) {
|
|
error(o.name, ts.Diagnostics.Overload_signatures_must_all_be_optional_or_required);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
var flagsToCheck = 1 | 2 | 8 | 16 | 128;
|
|
var someNodeFlags = 0;
|
|
var allNodeFlags = flagsToCheck;
|
|
var someHaveQuestionToken = false;
|
|
var allHaveQuestionToken = true;
|
|
var hasOverloads = false;
|
|
var bodyDeclaration;
|
|
var lastSeenNonAmbientDeclaration;
|
|
var previousDeclaration;
|
|
var declarations = symbol.declarations;
|
|
var isConstructor = (symbol.flags & 16384) !== 0;
|
|
function reportImplementationExpectedError(node) {
|
|
if (node.name && ts.nodeIsMissing(node.name)) {
|
|
return;
|
|
}
|
|
var seen = false;
|
|
var subsequentNode = ts.forEachChild(node.parent, function (c) {
|
|
if (seen) {
|
|
return c;
|
|
}
|
|
else {
|
|
seen = c === node;
|
|
}
|
|
});
|
|
if (subsequentNode && subsequentNode.pos === node.end) {
|
|
if (subsequentNode.kind === node.kind) {
|
|
var errorNode_1 = subsequentNode.name || subsequentNode;
|
|
if (node.name && subsequentNode.name && node.name.text === subsequentNode.name.text) {
|
|
var reportError = (node.kind === 147 || node.kind === 146) &&
|
|
(node.flags & 32) !== (subsequentNode.flags & 32);
|
|
if (reportError) {
|
|
var diagnostic = node.flags & 32 ? ts.Diagnostics.Function_overload_must_be_static : ts.Diagnostics.Function_overload_must_not_be_static;
|
|
error(errorNode_1, diagnostic);
|
|
}
|
|
return;
|
|
}
|
|
else if (ts.nodeIsPresent(subsequentNode.body)) {
|
|
error(errorNode_1, ts.Diagnostics.Function_implementation_name_must_be_0, ts.declarationNameToString(node.name));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
var errorNode = node.name || node;
|
|
if (isConstructor) {
|
|
error(errorNode, ts.Diagnostics.Constructor_implementation_is_missing);
|
|
}
|
|
else {
|
|
if (node.flags & 128) {
|
|
error(errorNode, ts.Diagnostics.All_declarations_of_an_abstract_method_must_be_consecutive);
|
|
}
|
|
else {
|
|
error(errorNode, ts.Diagnostics.Function_implementation_is_missing_or_not_immediately_following_the_declaration);
|
|
}
|
|
}
|
|
}
|
|
var duplicateFunctionDeclaration = false;
|
|
var multipleConstructorImplementation = false;
|
|
for (var _i = 0, declarations_4 = declarations; _i < declarations_4.length; _i++) {
|
|
var current = declarations_4[_i];
|
|
var node = current;
|
|
var inAmbientContext = ts.isInAmbientContext(node);
|
|
var inAmbientContextOrInterface = node.parent.kind === 222 || node.parent.kind === 159 || inAmbientContext;
|
|
if (inAmbientContextOrInterface) {
|
|
previousDeclaration = undefined;
|
|
}
|
|
if (node.kind === 220 || node.kind === 147 || node.kind === 146 || node.kind === 148) {
|
|
var currentNodeFlags = getEffectiveDeclarationFlags(node, flagsToCheck);
|
|
someNodeFlags |= currentNodeFlags;
|
|
allNodeFlags &= currentNodeFlags;
|
|
someHaveQuestionToken = someHaveQuestionToken || ts.hasQuestionToken(node);
|
|
allHaveQuestionToken = allHaveQuestionToken && ts.hasQuestionToken(node);
|
|
if (ts.nodeIsPresent(node.body) && bodyDeclaration) {
|
|
if (isConstructor) {
|
|
multipleConstructorImplementation = true;
|
|
}
|
|
else {
|
|
duplicateFunctionDeclaration = true;
|
|
}
|
|
}
|
|
else if (previousDeclaration && previousDeclaration.parent === node.parent && previousDeclaration.end !== node.pos) {
|
|
reportImplementationExpectedError(previousDeclaration);
|
|
}
|
|
if (ts.nodeIsPresent(node.body)) {
|
|
if (!bodyDeclaration) {
|
|
bodyDeclaration = node;
|
|
}
|
|
}
|
|
else {
|
|
hasOverloads = true;
|
|
}
|
|
previousDeclaration = node;
|
|
if (!inAmbientContextOrInterface) {
|
|
lastSeenNonAmbientDeclaration = node;
|
|
}
|
|
}
|
|
}
|
|
if (multipleConstructorImplementation) {
|
|
ts.forEach(declarations, function (declaration) {
|
|
error(declaration, ts.Diagnostics.Multiple_constructor_implementations_are_not_allowed);
|
|
});
|
|
}
|
|
if (duplicateFunctionDeclaration) {
|
|
ts.forEach(declarations, function (declaration) {
|
|
error(declaration.name, ts.Diagnostics.Duplicate_function_implementation);
|
|
});
|
|
}
|
|
if (lastSeenNonAmbientDeclaration && !lastSeenNonAmbientDeclaration.body &&
|
|
!(lastSeenNonAmbientDeclaration.flags & 128) && !lastSeenNonAmbientDeclaration.questionToken) {
|
|
reportImplementationExpectedError(lastSeenNonAmbientDeclaration);
|
|
}
|
|
if (hasOverloads) {
|
|
checkFlagAgreementBetweenOverloads(declarations, bodyDeclaration, flagsToCheck, someNodeFlags, allNodeFlags);
|
|
checkQuestionTokenAgreementBetweenOverloads(declarations, bodyDeclaration, someHaveQuestionToken, allHaveQuestionToken);
|
|
if (bodyDeclaration) {
|
|
var signatures = getSignaturesOfSymbol(symbol);
|
|
var bodySignature = getSignatureFromDeclaration(bodyDeclaration);
|
|
for (var _a = 0, signatures_3 = signatures; _a < signatures_3.length; _a++) {
|
|
var signature = signatures_3[_a];
|
|
if (!isImplementationCompatibleWithOverload(bodySignature, signature)) {
|
|
error(signature.declaration, ts.Diagnostics.Overload_signature_is_not_compatible_with_function_implementation);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkExportsOnMergedDeclarations(node) {
|
|
if (!produceDiagnostics) {
|
|
return;
|
|
}
|
|
var symbol = node.localSymbol;
|
|
if (!symbol) {
|
|
symbol = getSymbolOfNode(node);
|
|
if (!(symbol.flags & 7340032)) {
|
|
return;
|
|
}
|
|
}
|
|
if (ts.getDeclarationOfKind(symbol, node.kind) !== node) {
|
|
return;
|
|
}
|
|
var exportedDeclarationSpaces = 0;
|
|
var nonExportedDeclarationSpaces = 0;
|
|
var defaultExportedDeclarationSpaces = 0;
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var d = _a[_i];
|
|
var declarationSpaces = getDeclarationSpaces(d);
|
|
var effectiveDeclarationFlags = getEffectiveDeclarationFlags(d, 1 | 512);
|
|
if (effectiveDeclarationFlags & 1) {
|
|
if (effectiveDeclarationFlags & 512) {
|
|
defaultExportedDeclarationSpaces |= declarationSpaces;
|
|
}
|
|
else {
|
|
exportedDeclarationSpaces |= declarationSpaces;
|
|
}
|
|
}
|
|
else {
|
|
nonExportedDeclarationSpaces |= declarationSpaces;
|
|
}
|
|
}
|
|
var nonDefaultExportedDeclarationSpaces = exportedDeclarationSpaces | nonExportedDeclarationSpaces;
|
|
var commonDeclarationSpacesForExportsAndLocals = exportedDeclarationSpaces & nonExportedDeclarationSpaces;
|
|
var commonDeclarationSpacesForDefaultAndNonDefault = defaultExportedDeclarationSpaces & nonDefaultExportedDeclarationSpaces;
|
|
if (commonDeclarationSpacesForExportsAndLocals || commonDeclarationSpacesForDefaultAndNonDefault) {
|
|
for (var _b = 0, _c = symbol.declarations; _b < _c.length; _b++) {
|
|
var d = _c[_b];
|
|
var declarationSpaces = getDeclarationSpaces(d);
|
|
if (declarationSpaces & commonDeclarationSpacesForDefaultAndNonDefault) {
|
|
error(d.name, ts.Diagnostics.Merged_declaration_0_cannot_include_a_default_export_declaration_Consider_adding_a_separate_export_default_0_declaration_instead, ts.declarationNameToString(d.name));
|
|
}
|
|
else if (declarationSpaces & commonDeclarationSpacesForExportsAndLocals) {
|
|
error(d.name, ts.Diagnostics.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local, ts.declarationNameToString(d.name));
|
|
}
|
|
}
|
|
}
|
|
function getDeclarationSpaces(d) {
|
|
switch (d.kind) {
|
|
case 222:
|
|
return 2097152;
|
|
case 225:
|
|
return ts.isAmbientModule(d) || ts.getModuleInstanceState(d) !== 0
|
|
? 4194304 | 1048576
|
|
: 4194304;
|
|
case 221:
|
|
case 224:
|
|
return 2097152 | 1048576;
|
|
case 229:
|
|
var result_1 = 0;
|
|
var target = resolveAlias(getSymbolOfNode(d));
|
|
ts.forEach(target.declarations, function (d) { result_1 |= getDeclarationSpaces(d); });
|
|
return result_1;
|
|
default:
|
|
return 1048576;
|
|
}
|
|
}
|
|
}
|
|
function checkNonThenableType(type, location, message) {
|
|
type = getWidenedType(type);
|
|
if (!isTypeAny(type) && !isTypeNever(type) && isTypeAssignableTo(type, getGlobalThenableType())) {
|
|
if (location) {
|
|
if (!message) {
|
|
message = ts.Diagnostics.Operand_for_await_does_not_have_a_valid_callable_then_member;
|
|
}
|
|
error(location, message);
|
|
}
|
|
return unknownType;
|
|
}
|
|
return type;
|
|
}
|
|
function getPromisedType(promise) {
|
|
if (isTypeAny(promise)) {
|
|
return undefined;
|
|
}
|
|
if (promise.flags & 4096) {
|
|
if (promise.target === tryGetGlobalPromiseType()
|
|
|| promise.target === getGlobalPromiseLikeType()) {
|
|
return promise.typeArguments[0];
|
|
}
|
|
}
|
|
var globalPromiseLikeType = getInstantiatedGlobalPromiseLikeType();
|
|
if (globalPromiseLikeType === emptyObjectType || !isTypeAssignableTo(promise, globalPromiseLikeType)) {
|
|
return undefined;
|
|
}
|
|
var thenFunction = getTypeOfPropertyOfType(promise, "then");
|
|
if (!thenFunction || isTypeAny(thenFunction)) {
|
|
return undefined;
|
|
}
|
|
var thenSignatures = getSignaturesOfType(thenFunction, 0);
|
|
if (thenSignatures.length === 0) {
|
|
return undefined;
|
|
}
|
|
var onfulfilledParameterType = getTypeWithFacts(getUnionType(ts.map(thenSignatures, getTypeOfFirstParameterOfSignature)), 131072);
|
|
if (isTypeAny(onfulfilledParameterType)) {
|
|
return undefined;
|
|
}
|
|
var onfulfilledParameterSignatures = getSignaturesOfType(onfulfilledParameterType, 0);
|
|
if (onfulfilledParameterSignatures.length === 0) {
|
|
return undefined;
|
|
}
|
|
return getUnionType(ts.map(onfulfilledParameterSignatures, getTypeOfFirstParameterOfSignature));
|
|
}
|
|
function getTypeOfFirstParameterOfSignature(signature) {
|
|
return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType;
|
|
}
|
|
function getAwaitedType(type) {
|
|
return checkAwaitedType(type, undefined, undefined);
|
|
}
|
|
function checkAwaitedType(type, location, message) {
|
|
return checkAwaitedTypeWorker(type);
|
|
function checkAwaitedTypeWorker(type) {
|
|
if (type.flags & 16384) {
|
|
var types = [];
|
|
for (var _i = 0, _a = type.types; _i < _a.length; _i++) {
|
|
var constituentType = _a[_i];
|
|
types.push(checkAwaitedTypeWorker(constituentType));
|
|
}
|
|
return getUnionType(types);
|
|
}
|
|
else {
|
|
var promisedType = getPromisedType(type);
|
|
if (promisedType === undefined) {
|
|
return checkNonThenableType(type, location, message);
|
|
}
|
|
else {
|
|
if (type.id === promisedType.id || ts.indexOf(awaitedTypeStack, promisedType.id) >= 0) {
|
|
if (location) {
|
|
error(location, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_the_fulfillment_callback_of_its_own_then_method, symbolToString(type.symbol));
|
|
}
|
|
return unknownType;
|
|
}
|
|
awaitedTypeStack.push(type.id);
|
|
var awaitedType = checkAwaitedTypeWorker(promisedType);
|
|
awaitedTypeStack.pop();
|
|
return awaitedType;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkCorrectPromiseType(returnType, location) {
|
|
if (returnType === unknownType) {
|
|
return unknownType;
|
|
}
|
|
var globalPromiseType = getGlobalPromiseType();
|
|
if (globalPromiseType === emptyGenericType
|
|
|| globalPromiseType === getTargetType(returnType)) {
|
|
return checkAwaitedType(returnType, location, ts.Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
|
|
}
|
|
error(location, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type);
|
|
return unknownType;
|
|
}
|
|
function checkAsyncFunctionReturnType(node) {
|
|
if (languageVersion >= 2) {
|
|
var returnType = getTypeFromTypeNode(node.type);
|
|
return checkCorrectPromiseType(returnType, node.type);
|
|
}
|
|
var globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType();
|
|
if (globalPromiseConstructorLikeType === emptyObjectType) {
|
|
return unknownType;
|
|
}
|
|
var promiseType = getTypeFromTypeNode(node.type);
|
|
if (promiseType === unknownType && compilerOptions.isolatedModules) {
|
|
return unknownType;
|
|
}
|
|
var promiseConstructor = getNodeLinks(node.type).resolvedSymbol;
|
|
if (!promiseConstructor || !symbolIsValue(promiseConstructor)) {
|
|
var typeName = promiseConstructor
|
|
? symbolToString(promiseConstructor)
|
|
: typeToString(promiseType);
|
|
error(node, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type, typeName);
|
|
return unknownType;
|
|
}
|
|
checkReturnTypeAnnotationAsExpression(node);
|
|
var promiseConstructorType = getTypeOfSymbol(promiseConstructor);
|
|
if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type)) {
|
|
return unknownType;
|
|
}
|
|
var promiseName = ts.getEntityNameFromTypeNode(node.type);
|
|
var promiseNameOrNamespaceRoot = getFirstIdentifier(promiseName);
|
|
var rootSymbol = getSymbol(node.locals, promiseNameOrNamespaceRoot.text, 107455);
|
|
if (rootSymbol) {
|
|
error(rootSymbol.valueDeclaration, ts.Diagnostics.Duplicate_identifier_0_Compiler_uses_declaration_1_to_support_async_functions, promiseNameOrNamespaceRoot.text, getFullyQualifiedName(promiseConstructor));
|
|
return unknownType;
|
|
}
|
|
return checkAwaitedType(promiseType, node, ts.Diagnostics.An_async_function_or_method_must_have_a_valid_awaitable_return_type);
|
|
}
|
|
function checkDecorator(node) {
|
|
var signature = getResolvedSignature(node);
|
|
var returnType = getReturnTypeOfSignature(signature);
|
|
if (returnType.flags & 1) {
|
|
return;
|
|
}
|
|
var expectedReturnType;
|
|
var headMessage = getDiagnosticHeadMessageForDecoratorResolution(node);
|
|
var errorInfo;
|
|
switch (node.parent.kind) {
|
|
case 221:
|
|
var classSymbol = getSymbolOfNode(node.parent);
|
|
var classConstructorType = getTypeOfSymbol(classSymbol);
|
|
expectedReturnType = getUnionType([classConstructorType, voidType]);
|
|
break;
|
|
case 142:
|
|
expectedReturnType = voidType;
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.The_return_type_of_a_parameter_decorator_function_must_be_either_void_or_any);
|
|
break;
|
|
case 145:
|
|
expectedReturnType = voidType;
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.The_return_type_of_a_property_decorator_function_must_be_either_void_or_any);
|
|
break;
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
var methodType = getTypeOfNode(node.parent);
|
|
var descriptorType = createTypedPropertyDescriptorType(methodType);
|
|
expectedReturnType = getUnionType([descriptorType, voidType]);
|
|
break;
|
|
}
|
|
checkTypeAssignableTo(returnType, expectedReturnType, node, headMessage, errorInfo);
|
|
}
|
|
function checkTypeNodeAsExpression(node) {
|
|
if (node && node.kind === 155) {
|
|
var root = getFirstIdentifier(node.typeName);
|
|
var meaning = root.parent.kind === 155 ? 793056 : 1536;
|
|
var rootSymbol = resolveName(root, root.text, meaning | 8388608, undefined, undefined);
|
|
if (rootSymbol && rootSymbol.flags & 8388608) {
|
|
var aliasTarget = resolveAlias(rootSymbol);
|
|
if (aliasTarget.flags & 107455 && !isConstEnumOrConstEnumOnlyModule(resolveAlias(rootSymbol))) {
|
|
markAliasSymbolAsReferenced(rootSymbol);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkTypeAnnotationAsExpression(node) {
|
|
checkTypeNodeAsExpression(node.type);
|
|
}
|
|
function checkReturnTypeAnnotationAsExpression(node) {
|
|
checkTypeNodeAsExpression(node.type);
|
|
}
|
|
function checkParameterTypeAnnotationsAsExpressions(node) {
|
|
for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) {
|
|
var parameter = _a[_i];
|
|
checkTypeAnnotationAsExpression(parameter);
|
|
}
|
|
}
|
|
function checkDecorators(node) {
|
|
if (!node.decorators) {
|
|
return;
|
|
}
|
|
if (!ts.nodeCanBeDecorated(node)) {
|
|
return;
|
|
}
|
|
if (!compilerOptions.experimentalDecorators) {
|
|
error(node, ts.Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_to_remove_this_warning);
|
|
}
|
|
if (compilerOptions.emitDecoratorMetadata) {
|
|
switch (node.kind) {
|
|
case 221:
|
|
var constructor = ts.getFirstConstructorWithBody(node);
|
|
if (constructor) {
|
|
checkParameterTypeAnnotationsAsExpressions(constructor);
|
|
}
|
|
break;
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
checkParameterTypeAnnotationsAsExpressions(node);
|
|
checkReturnTypeAnnotationAsExpression(node);
|
|
break;
|
|
case 145:
|
|
case 142:
|
|
checkTypeAnnotationAsExpression(node);
|
|
break;
|
|
}
|
|
}
|
|
ts.forEach(node.decorators, checkDecorator);
|
|
}
|
|
function checkFunctionDeclaration(node) {
|
|
if (produceDiagnostics) {
|
|
checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node);
|
|
checkCollisionWithCapturedSuperVariable(node, node.name);
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
}
|
|
}
|
|
function checkFunctionOrMethodDeclaration(node) {
|
|
checkDecorators(node);
|
|
checkSignatureDeclaration(node);
|
|
var isAsync = ts.isAsyncFunctionLike(node);
|
|
if (node.name && node.name.kind === 140) {
|
|
checkComputedPropertyName(node.name);
|
|
}
|
|
if (!ts.hasDynamicName(node)) {
|
|
var symbol = getSymbolOfNode(node);
|
|
var localSymbol = node.localSymbol || symbol;
|
|
var firstDeclaration = ts.forEach(localSymbol.declarations, function (declaration) { return declaration.kind === node.kind && !ts.isSourceFileJavaScript(ts.getSourceFileOfNode(declaration)) ?
|
|
declaration : undefined; });
|
|
if (node === firstDeclaration) {
|
|
checkFunctionOrConstructorSymbol(localSymbol);
|
|
}
|
|
if (symbol.parent) {
|
|
if (ts.getDeclarationOfKind(symbol, node.kind) === node) {
|
|
checkFunctionOrConstructorSymbol(symbol);
|
|
}
|
|
}
|
|
}
|
|
checkSourceElement(node.body);
|
|
if (!node.asteriskToken) {
|
|
var returnOrPromisedType = node.type && (isAsync ? checkAsyncFunctionReturnType(node) : getTypeFromTypeNode(node.type));
|
|
checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType);
|
|
}
|
|
if (produceDiagnostics && !node.type) {
|
|
if (compilerOptions.noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) {
|
|
reportImplicitAnyError(node, anyType);
|
|
}
|
|
if (node.asteriskToken && ts.nodeIsPresent(node.body)) {
|
|
getReturnTypeOfSignature(getSignatureFromDeclaration(node));
|
|
}
|
|
}
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
function registerForUnusedIdentifiersCheck(node) {
|
|
if (deferredUnusedIdentifierNodes) {
|
|
deferredUnusedIdentifierNodes.push(node);
|
|
}
|
|
}
|
|
function checkUnusedIdentifiers() {
|
|
if (deferredUnusedIdentifierNodes) {
|
|
for (var _i = 0, deferredUnusedIdentifierNodes_1 = deferredUnusedIdentifierNodes; _i < deferredUnusedIdentifierNodes_1.length; _i++) {
|
|
var node = deferredUnusedIdentifierNodes_1[_i];
|
|
switch (node.kind) {
|
|
case 256:
|
|
case 225:
|
|
checkUnusedModuleMembers(node);
|
|
break;
|
|
case 221:
|
|
case 192:
|
|
checkUnusedClassMembers(node);
|
|
checkUnusedTypeParameters(node);
|
|
break;
|
|
case 222:
|
|
checkUnusedTypeParameters(node);
|
|
break;
|
|
case 199:
|
|
case 227:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
checkUnusedLocalsAndParameters(node);
|
|
break;
|
|
case 148:
|
|
case 179:
|
|
case 220:
|
|
case 180:
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
if (node.body) {
|
|
checkUnusedLocalsAndParameters(node);
|
|
}
|
|
checkUnusedTypeParameters(node);
|
|
break;
|
|
case 146:
|
|
case 151:
|
|
case 152:
|
|
case 153:
|
|
case 156:
|
|
case 157:
|
|
checkUnusedTypeParameters(node);
|
|
break;
|
|
}
|
|
;
|
|
}
|
|
}
|
|
}
|
|
function checkUnusedLocalsAndParameters(node) {
|
|
if (node.parent.kind !== 222 && noUnusedIdentifiers && !ts.isInAmbientContext(node)) {
|
|
var _loop_1 = function(key) {
|
|
if (ts.hasProperty(node.locals, key)) {
|
|
var local_1 = node.locals[key];
|
|
if (!local_1.isReferenced) {
|
|
if (local_1.valueDeclaration && local_1.valueDeclaration.kind === 142) {
|
|
var parameter = local_1.valueDeclaration;
|
|
if (compilerOptions.noUnusedParameters &&
|
|
!ts.isParameterPropertyDeclaration(parameter) &&
|
|
!parameterIsThisKeyword(parameter) &&
|
|
!parameterNameStartsWithUnderscore(parameter)) {
|
|
error(local_1.valueDeclaration.name, ts.Diagnostics._0_is_declared_but_never_used, local_1.name);
|
|
}
|
|
}
|
|
else if (compilerOptions.noUnusedLocals) {
|
|
ts.forEach(local_1.declarations, function (d) { return error(d.name || d, ts.Diagnostics._0_is_declared_but_never_used, local_1.name); });
|
|
}
|
|
}
|
|
}
|
|
};
|
|
for (var key in node.locals) {
|
|
_loop_1(key);
|
|
}
|
|
}
|
|
}
|
|
function parameterIsThisKeyword(parameter) {
|
|
return parameter.name && parameter.name.originalKeywordKind === 97;
|
|
}
|
|
function parameterNameStartsWithUnderscore(parameter) {
|
|
return parameter.name && parameter.name.kind === 69 && parameter.name.text.charCodeAt(0) === 95;
|
|
}
|
|
function checkUnusedClassMembers(node) {
|
|
if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) {
|
|
if (node.members) {
|
|
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
|
|
var member = _a[_i];
|
|
if (member.kind === 147 || member.kind === 145) {
|
|
if (!member.symbol.isReferenced && member.flags & 8) {
|
|
error(member.name, ts.Diagnostics._0_is_declared_but_never_used, member.symbol.name);
|
|
}
|
|
}
|
|
else if (member.kind === 148) {
|
|
for (var _b = 0, _c = member.parameters; _b < _c.length; _b++) {
|
|
var parameter = _c[_b];
|
|
if (!parameter.symbol.isReferenced && parameter.flags & 8) {
|
|
error(parameter.name, ts.Diagnostics._0_is_declared_but_never_used, parameter.symbol.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkUnusedTypeParameters(node) {
|
|
if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) {
|
|
if (node.typeParameters) {
|
|
var symbol = getSymbolOfNode(node);
|
|
var lastDeclaration = symbol && symbol.declarations && ts.lastOrUndefined(symbol.declarations);
|
|
if (lastDeclaration !== node) {
|
|
return;
|
|
}
|
|
for (var _i = 0, _a = node.typeParameters; _i < _a.length; _i++) {
|
|
var typeParameter = _a[_i];
|
|
if (!getMergedSymbol(typeParameter.symbol).isReferenced) {
|
|
error(typeParameter.name, ts.Diagnostics._0_is_declared_but_never_used, typeParameter.symbol.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkUnusedModuleMembers(node) {
|
|
if (compilerOptions.noUnusedLocals && !ts.isInAmbientContext(node)) {
|
|
for (var key in node.locals) {
|
|
if (ts.hasProperty(node.locals, key)) {
|
|
var local = node.locals[key];
|
|
if (!local.isReferenced && !local.exportSymbol) {
|
|
for (var _i = 0, _a = local.declarations; _i < _a.length; _i++) {
|
|
var declaration = _a[_i];
|
|
if (!ts.isAmbientModule(declaration)) {
|
|
error(declaration.name, ts.Diagnostics._0_is_declared_but_never_used, local.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkBlock(node) {
|
|
if (node.kind === 199) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
}
|
|
ts.forEach(node.statements, checkSourceElement);
|
|
if (node.locals) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkCollisionWithArgumentsInGeneratedCode(node) {
|
|
if (!ts.hasDeclaredRestParameter(node) || ts.isInAmbientContext(node) || ts.nodeIsMissing(node.body)) {
|
|
return;
|
|
}
|
|
ts.forEach(node.parameters, function (p) {
|
|
if (p.name && !ts.isBindingPattern(p.name) && p.name.text === argumentsSymbol.name) {
|
|
error(p, ts.Diagnostics.Duplicate_identifier_arguments_Compiler_uses_arguments_to_initialize_rest_parameters);
|
|
}
|
|
});
|
|
}
|
|
function needCollisionCheckForIdentifier(node, identifier, name) {
|
|
if (!(identifier && identifier.text === name)) {
|
|
return false;
|
|
}
|
|
if (node.kind === 145 ||
|
|
node.kind === 144 ||
|
|
node.kind === 147 ||
|
|
node.kind === 146 ||
|
|
node.kind === 149 ||
|
|
node.kind === 150) {
|
|
return false;
|
|
}
|
|
if (ts.isInAmbientContext(node)) {
|
|
return false;
|
|
}
|
|
var root = ts.getRootDeclaration(node);
|
|
if (root.kind === 142 && ts.nodeIsMissing(root.parent.body)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function checkCollisionWithCapturedThisVariable(node, name) {
|
|
if (needCollisionCheckForIdentifier(node, name, "_this")) {
|
|
potentialThisCollisions.push(node);
|
|
}
|
|
}
|
|
function checkIfThisIsCapturedInEnclosingScope(node) {
|
|
var current = node;
|
|
while (current) {
|
|
if (getNodeCheckFlags(current) & 4) {
|
|
var isDeclaration_1 = node.kind !== 69;
|
|
if (isDeclaration_1) {
|
|
error(node.name, ts.Diagnostics.Duplicate_identifier_this_Compiler_uses_variable_declaration_this_to_capture_this_reference);
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.Expression_resolves_to_variable_declaration_this_that_compiler_uses_to_capture_this_reference);
|
|
}
|
|
return;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
function checkCollisionWithCapturedSuperVariable(node, name) {
|
|
if (!needCollisionCheckForIdentifier(node, name, "_super")) {
|
|
return;
|
|
}
|
|
var enclosingClass = ts.getContainingClass(node);
|
|
if (!enclosingClass || ts.isInAmbientContext(enclosingClass)) {
|
|
return;
|
|
}
|
|
if (ts.getClassExtendsHeritageClauseElement(enclosingClass)) {
|
|
var isDeclaration_2 = node.kind !== 69;
|
|
if (isDeclaration_2) {
|
|
error(node, ts.Diagnostics.Duplicate_identifier_super_Compiler_uses_super_to_capture_base_class_reference);
|
|
}
|
|
else {
|
|
error(node, ts.Diagnostics.Expression_resolves_to_super_that_compiler_uses_to_capture_base_class_reference);
|
|
}
|
|
}
|
|
}
|
|
function checkCollisionWithRequireExportsInGeneratedCode(node, name) {
|
|
if (!needCollisionCheckForIdentifier(node, name, "require") && !needCollisionCheckForIdentifier(node, name, "exports")) {
|
|
return;
|
|
}
|
|
if (node.kind === 225 && ts.getModuleInstanceState(node) !== 1) {
|
|
return;
|
|
}
|
|
var parent = getDeclarationContainer(node);
|
|
if (parent.kind === 256 && ts.isExternalOrCommonJsModule(parent)) {
|
|
error(name, ts.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module, ts.declarationNameToString(name), ts.declarationNameToString(name));
|
|
}
|
|
}
|
|
function checkCollisionWithGlobalPromiseInGeneratedCode(node, name) {
|
|
if (!needCollisionCheckForIdentifier(node, name, "Promise")) {
|
|
return;
|
|
}
|
|
if (node.kind === 225 && ts.getModuleInstanceState(node) !== 1) {
|
|
return;
|
|
}
|
|
var parent = getDeclarationContainer(node);
|
|
if (parent.kind === 256 && ts.isExternalOrCommonJsModule(parent) && parent.flags & 2097152) {
|
|
error(name, ts.Diagnostics.Duplicate_identifier_0_Compiler_reserves_name_1_in_top_level_scope_of_a_module_containing_async_functions, ts.declarationNameToString(name), ts.declarationNameToString(name));
|
|
}
|
|
}
|
|
function checkVarDeclaredNamesNotShadowed(node) {
|
|
if ((ts.getCombinedNodeFlags(node) & 3072) !== 0 || ts.isParameterDeclaration(node)) {
|
|
return;
|
|
}
|
|
if (node.kind === 218 && !node.initializer) {
|
|
return;
|
|
}
|
|
var symbol = getSymbolOfNode(node);
|
|
if (symbol.flags & 1) {
|
|
var localDeclarationSymbol = resolveName(node, node.name.text, 3, undefined, undefined);
|
|
if (localDeclarationSymbol &&
|
|
localDeclarationSymbol !== symbol &&
|
|
localDeclarationSymbol.flags & 2) {
|
|
if (getDeclarationFlagsFromSymbol(localDeclarationSymbol) & 3072) {
|
|
var varDeclList = ts.getAncestor(localDeclarationSymbol.valueDeclaration, 219);
|
|
var container = varDeclList.parent.kind === 200 && varDeclList.parent.parent
|
|
? varDeclList.parent.parent
|
|
: undefined;
|
|
var namesShareScope = container &&
|
|
(container.kind === 199 && ts.isFunctionLike(container.parent) ||
|
|
container.kind === 226 ||
|
|
container.kind === 225 ||
|
|
container.kind === 256);
|
|
if (!namesShareScope) {
|
|
var name_17 = symbolToString(localDeclarationSymbol);
|
|
error(node, ts.Diagnostics.Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1, name_17, name_17);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkParameterInitializer(node) {
|
|
if (ts.getRootDeclaration(node).kind !== 142) {
|
|
return;
|
|
}
|
|
var func = ts.getContainingFunction(node);
|
|
visit(node.initializer);
|
|
function visit(n) {
|
|
if (ts.isTypeNode(n) || ts.isDeclarationName(n)) {
|
|
return;
|
|
}
|
|
if (n.kind === 172) {
|
|
return visit(n.expression);
|
|
}
|
|
else if (n.kind === 69) {
|
|
var symbol = resolveName(n, n.text, 107455 | 8388608, undefined, undefined);
|
|
if (!symbol || symbol === unknownSymbol || !symbol.valueDeclaration) {
|
|
return;
|
|
}
|
|
if (symbol.valueDeclaration === node) {
|
|
error(n, ts.Diagnostics.Parameter_0_cannot_be_referenced_in_its_initializer, ts.declarationNameToString(node.name));
|
|
return;
|
|
}
|
|
var enclosingContainer = ts.getEnclosingBlockScopeContainer(symbol.valueDeclaration);
|
|
if (enclosingContainer === func) {
|
|
if (symbol.valueDeclaration.kind === 142) {
|
|
if (symbol.valueDeclaration.pos < node.pos) {
|
|
return;
|
|
}
|
|
var current = n;
|
|
while (current !== node.initializer) {
|
|
if (ts.isFunctionLike(current.parent)) {
|
|
return;
|
|
}
|
|
if (current.parent.kind === 145 &&
|
|
!(current.parent.flags & 32) &&
|
|
ts.isClassLike(current.parent.parent)) {
|
|
return;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
error(n, ts.Diagnostics.Initializer_of_parameter_0_cannot_reference_identifier_1_declared_after_it, ts.declarationNameToString(node.name), ts.declarationNameToString(n));
|
|
}
|
|
}
|
|
else {
|
|
return ts.forEachChild(n, visit);
|
|
}
|
|
}
|
|
}
|
|
function checkVariableLikeDeclaration(node) {
|
|
checkDecorators(node);
|
|
checkSourceElement(node.type);
|
|
if (node.name.kind === 140) {
|
|
checkComputedPropertyName(node.name);
|
|
if (node.initializer) {
|
|
checkExpressionCached(node.initializer);
|
|
}
|
|
}
|
|
if (node.kind === 169) {
|
|
if (node.propertyName && node.propertyName.kind === 140) {
|
|
checkComputedPropertyName(node.propertyName);
|
|
}
|
|
var parent_11 = node.parent.parent;
|
|
var parentType = getTypeForBindingElementParent(parent_11);
|
|
var name_18 = node.propertyName || node.name;
|
|
var property = getPropertyOfType(parentType, getTextOfPropertyName(name_18));
|
|
if (parent_11.initializer && property && getParentOfSymbol(property)) {
|
|
checkClassPropertyAccess(parent_11, parent_11.initializer, parentType, property);
|
|
}
|
|
}
|
|
if (ts.isBindingPattern(node.name)) {
|
|
ts.forEach(node.name.elements, checkSourceElement);
|
|
}
|
|
if (node.initializer && ts.getRootDeclaration(node).kind === 142 && ts.nodeIsMissing(ts.getContainingFunction(node).body)) {
|
|
error(node, ts.Diagnostics.A_parameter_initializer_is_only_allowed_in_a_function_or_constructor_implementation);
|
|
return;
|
|
}
|
|
if (ts.isBindingPattern(node.name)) {
|
|
if (node.initializer && node.parent.parent.kind !== 207) {
|
|
checkTypeAssignableTo(checkExpressionCached(node.initializer), getWidenedTypeForVariableLikeDeclaration(node), node, undefined);
|
|
checkParameterInitializer(node);
|
|
}
|
|
return;
|
|
}
|
|
var symbol = getSymbolOfNode(node);
|
|
var type = getTypeOfVariableOrParameterOrProperty(symbol);
|
|
if (node === symbol.valueDeclaration) {
|
|
if (node.initializer && node.parent.parent.kind !== 207) {
|
|
checkTypeAssignableTo(checkExpressionCached(node.initializer), type, node, undefined);
|
|
checkParameterInitializer(node);
|
|
}
|
|
}
|
|
else {
|
|
var declarationType = getWidenedTypeForVariableLikeDeclaration(node);
|
|
if (type !== unknownType && declarationType !== unknownType && !isTypeIdenticalTo(type, declarationType)) {
|
|
error(node.name, ts.Diagnostics.Subsequent_variable_declarations_must_have_the_same_type_Variable_0_must_be_of_type_1_but_here_has_type_2, ts.declarationNameToString(node.name), typeToString(type), typeToString(declarationType));
|
|
}
|
|
if (node.initializer) {
|
|
checkTypeAssignableTo(checkExpressionCached(node.initializer), declarationType, node, undefined);
|
|
}
|
|
if (!areDeclarationFlagsIdentical(node, symbol.valueDeclaration)) {
|
|
error(symbol.valueDeclaration.name, ts.Diagnostics.All_declarations_of_0_must_have_identical_modifiers, ts.declarationNameToString(node.name));
|
|
error(node.name, ts.Diagnostics.All_declarations_of_0_must_have_identical_modifiers, ts.declarationNameToString(node.name));
|
|
}
|
|
}
|
|
if (node.kind !== 145 && node.kind !== 144) {
|
|
checkExportsOnMergedDeclarations(node);
|
|
if (node.kind === 218 || node.kind === 169) {
|
|
checkVarDeclaredNamesNotShadowed(node);
|
|
}
|
|
checkCollisionWithCapturedSuperVariable(node, node.name);
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
}
|
|
}
|
|
function areDeclarationFlagsIdentical(left, right) {
|
|
if ((left.kind === 142 && right.kind === 218) ||
|
|
(left.kind === 218 && right.kind === 142)) {
|
|
return true;
|
|
}
|
|
if (ts.hasQuestionToken(left) !== ts.hasQuestionToken(right)) {
|
|
return false;
|
|
}
|
|
var interestingFlags = 8 |
|
|
16 |
|
|
256 |
|
|
128 |
|
|
64 |
|
|
32;
|
|
return (left.flags & interestingFlags) === (right.flags & interestingFlags);
|
|
}
|
|
function checkVariableDeclaration(node) {
|
|
checkGrammarVariableDeclaration(node);
|
|
return checkVariableLikeDeclaration(node);
|
|
}
|
|
function checkBindingElement(node) {
|
|
checkGrammarBindingElement(node);
|
|
return checkVariableLikeDeclaration(node);
|
|
}
|
|
function checkVariableStatement(node) {
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarVariableDeclarationList(node.declarationList) || checkGrammarForDisallowedLetOrConstStatement(node);
|
|
ts.forEach(node.declarationList.declarations, checkSourceElement);
|
|
}
|
|
function checkGrammarDisallowedModifiersOnObjectLiteralExpressionMethod(node) {
|
|
if (node.modifiers && node.parent.kind === 171) {
|
|
if (ts.isAsyncFunctionLike(node)) {
|
|
if (node.modifiers.length > 1) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
|
|
}
|
|
}
|
|
else {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
|
|
}
|
|
}
|
|
}
|
|
function checkExpressionStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
checkExpression(node.expression);
|
|
}
|
|
function checkIfStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
checkExpression(node.expression);
|
|
checkSourceElement(node.thenStatement);
|
|
if (node.thenStatement.kind === 201) {
|
|
error(node.thenStatement, ts.Diagnostics.The_body_of_an_if_statement_cannot_be_the_empty_statement);
|
|
}
|
|
checkSourceElement(node.elseStatement);
|
|
}
|
|
function checkDoStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
checkSourceElement(node.statement);
|
|
checkExpression(node.expression);
|
|
}
|
|
function checkWhileStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
checkExpression(node.expression);
|
|
checkSourceElement(node.statement);
|
|
}
|
|
function checkForStatement(node) {
|
|
if (!checkGrammarStatementInAmbientContext(node)) {
|
|
if (node.initializer && node.initializer.kind === 219) {
|
|
checkGrammarVariableDeclarationList(node.initializer);
|
|
}
|
|
}
|
|
if (node.initializer) {
|
|
if (node.initializer.kind === 219) {
|
|
ts.forEach(node.initializer.declarations, checkVariableDeclaration);
|
|
}
|
|
else {
|
|
checkExpression(node.initializer);
|
|
}
|
|
}
|
|
if (node.condition)
|
|
checkExpression(node.condition);
|
|
if (node.incrementor)
|
|
checkExpression(node.incrementor);
|
|
checkSourceElement(node.statement);
|
|
if (node.locals) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkForOfStatement(node) {
|
|
checkGrammarForInOrForOfStatement(node);
|
|
if (node.initializer.kind === 219) {
|
|
checkForInOrForOfVariableDeclaration(node);
|
|
}
|
|
else {
|
|
var varExpr = node.initializer;
|
|
var iteratedType = checkRightHandSideOfForOf(node.expression);
|
|
if (varExpr.kind === 170 || varExpr.kind === 171) {
|
|
checkDestructuringAssignment(varExpr, iteratedType || unknownType);
|
|
}
|
|
else {
|
|
var leftType = checkExpression(varExpr);
|
|
checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_of_statement, ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_be_a_constant_or_a_read_only_property);
|
|
if (iteratedType) {
|
|
checkTypeAssignableTo(iteratedType, leftType, varExpr, undefined);
|
|
}
|
|
}
|
|
}
|
|
checkSourceElement(node.statement);
|
|
if (node.locals) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkForInStatement(node) {
|
|
checkGrammarForInOrForOfStatement(node);
|
|
if (node.initializer.kind === 219) {
|
|
var variable = node.initializer.declarations[0];
|
|
if (variable && ts.isBindingPattern(variable.name)) {
|
|
error(variable.name, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
|
|
}
|
|
checkForInOrForOfVariableDeclaration(node);
|
|
}
|
|
else {
|
|
var varExpr = node.initializer;
|
|
var leftType = checkExpression(varExpr);
|
|
if (varExpr.kind === 170 || varExpr.kind === 171) {
|
|
error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern);
|
|
}
|
|
else if (!isTypeAnyOrAllConstituentTypesHaveKind(leftType, 258)) {
|
|
error(varExpr, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_must_be_of_type_string_or_any);
|
|
}
|
|
else {
|
|
checkReferenceExpression(varExpr, ts.Diagnostics.Invalid_left_hand_side_in_for_in_statement, ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_be_a_constant_or_a_read_only_property);
|
|
}
|
|
}
|
|
var rightType = checkNonNullExpression(node.expression);
|
|
if (!isTypeAnyOrAllConstituentTypesHaveKind(rightType, 80896 | 512)) {
|
|
error(node.expression, ts.Diagnostics.The_right_hand_side_of_a_for_in_statement_must_be_of_type_any_an_object_type_or_a_type_parameter);
|
|
}
|
|
checkSourceElement(node.statement);
|
|
if (node.locals) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkForInOrForOfVariableDeclaration(iterationStatement) {
|
|
var variableDeclarationList = iterationStatement.initializer;
|
|
if (variableDeclarationList.declarations.length >= 1) {
|
|
var decl = variableDeclarationList.declarations[0];
|
|
checkVariableDeclaration(decl);
|
|
}
|
|
}
|
|
function checkRightHandSideOfForOf(rhsExpression) {
|
|
var expressionType = checkNonNullExpression(rhsExpression);
|
|
return checkIteratedTypeOrElementType(expressionType, rhsExpression, true);
|
|
}
|
|
function checkIteratedTypeOrElementType(inputType, errorNode, allowStringInput) {
|
|
if (isTypeAny(inputType)) {
|
|
return inputType;
|
|
}
|
|
if (languageVersion >= 2) {
|
|
return checkElementTypeOfIterable(inputType, errorNode);
|
|
}
|
|
if (allowStringInput) {
|
|
return checkElementTypeOfArrayOrString(inputType, errorNode);
|
|
}
|
|
if (isArrayLikeType(inputType)) {
|
|
var indexType = getIndexTypeOfType(inputType, 1);
|
|
if (indexType) {
|
|
return indexType;
|
|
}
|
|
}
|
|
if (errorNode) {
|
|
error(errorNode, ts.Diagnostics.Type_0_is_not_an_array_type, typeToString(inputType));
|
|
}
|
|
return unknownType;
|
|
}
|
|
function checkElementTypeOfIterable(iterable, errorNode) {
|
|
var elementType = getElementTypeOfIterable(iterable, errorNode);
|
|
if (errorNode && elementType) {
|
|
checkTypeAssignableTo(iterable, createIterableType(elementType), errorNode);
|
|
}
|
|
return elementType || anyType;
|
|
}
|
|
function getElementTypeOfIterable(type, errorNode) {
|
|
if (isTypeAny(type)) {
|
|
return undefined;
|
|
}
|
|
var typeAsIterable = type;
|
|
if (!typeAsIterable.iterableElementType) {
|
|
if ((type.flags & 4096) && type.target === getGlobalIterableType()) {
|
|
typeAsIterable.iterableElementType = type.typeArguments[0];
|
|
}
|
|
else {
|
|
var iteratorFunction = getTypeOfPropertyOfType(type, ts.getPropertyNameForKnownSymbolName("iterator"));
|
|
if (isTypeAny(iteratorFunction)) {
|
|
return undefined;
|
|
}
|
|
var iteratorFunctionSignatures = iteratorFunction ? getSignaturesOfType(iteratorFunction, 0) : emptyArray;
|
|
if (iteratorFunctionSignatures.length === 0) {
|
|
if (errorNode) {
|
|
error(errorNode, ts.Diagnostics.Type_must_have_a_Symbol_iterator_method_that_returns_an_iterator);
|
|
}
|
|
return undefined;
|
|
}
|
|
typeAsIterable.iterableElementType = getElementTypeOfIterator(getUnionType(ts.map(iteratorFunctionSignatures, getReturnTypeOfSignature)), errorNode);
|
|
}
|
|
}
|
|
return typeAsIterable.iterableElementType;
|
|
}
|
|
function getElementTypeOfIterator(type, errorNode) {
|
|
if (isTypeAny(type)) {
|
|
return undefined;
|
|
}
|
|
var typeAsIterator = type;
|
|
if (!typeAsIterator.iteratorElementType) {
|
|
if ((type.flags & 4096) && type.target === getGlobalIteratorType()) {
|
|
typeAsIterator.iteratorElementType = type.typeArguments[0];
|
|
}
|
|
else {
|
|
var iteratorNextFunction = getTypeOfPropertyOfType(type, "next");
|
|
if (isTypeAny(iteratorNextFunction)) {
|
|
return undefined;
|
|
}
|
|
var iteratorNextFunctionSignatures = iteratorNextFunction ? getSignaturesOfType(iteratorNextFunction, 0) : emptyArray;
|
|
if (iteratorNextFunctionSignatures.length === 0) {
|
|
if (errorNode) {
|
|
error(errorNode, ts.Diagnostics.An_iterator_must_have_a_next_method);
|
|
}
|
|
return undefined;
|
|
}
|
|
var iteratorNextResult = getUnionType(ts.map(iteratorNextFunctionSignatures, getReturnTypeOfSignature));
|
|
if (isTypeAny(iteratorNextResult)) {
|
|
return undefined;
|
|
}
|
|
var iteratorNextValue = getTypeOfPropertyOfType(iteratorNextResult, "value");
|
|
if (!iteratorNextValue) {
|
|
if (errorNode) {
|
|
error(errorNode, ts.Diagnostics.The_type_returned_by_the_next_method_of_an_iterator_must_have_a_value_property);
|
|
}
|
|
return undefined;
|
|
}
|
|
typeAsIterator.iteratorElementType = iteratorNextValue;
|
|
}
|
|
}
|
|
return typeAsIterator.iteratorElementType;
|
|
}
|
|
function getElementTypeOfIterableIterator(type) {
|
|
if (isTypeAny(type)) {
|
|
return undefined;
|
|
}
|
|
if ((type.flags & 4096) && type.target === getGlobalIterableIteratorType()) {
|
|
return type.typeArguments[0];
|
|
}
|
|
return getElementTypeOfIterable(type, undefined) ||
|
|
getElementTypeOfIterator(type, undefined);
|
|
}
|
|
function checkElementTypeOfArrayOrString(arrayOrStringType, errorNode) {
|
|
ts.Debug.assert(languageVersion < 2);
|
|
var arrayType = arrayOrStringType;
|
|
if (arrayOrStringType.flags & 16384) {
|
|
arrayType = getUnionType(ts.filter(arrayOrStringType.types, function (t) { return !(t.flags & 258); }));
|
|
}
|
|
else if (arrayOrStringType.flags & 258) {
|
|
arrayType = neverType;
|
|
}
|
|
var hasStringConstituent = arrayOrStringType !== arrayType;
|
|
var reportedError = false;
|
|
if (hasStringConstituent) {
|
|
if (languageVersion < 1) {
|
|
error(errorNode, ts.Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher);
|
|
reportedError = true;
|
|
}
|
|
if (arrayType === neverType) {
|
|
return stringType;
|
|
}
|
|
}
|
|
if (!isArrayLikeType(arrayType)) {
|
|
if (!reportedError) {
|
|
var diagnostic = hasStringConstituent
|
|
? ts.Diagnostics.Type_0_is_not_an_array_type
|
|
: ts.Diagnostics.Type_0_is_not_an_array_type_or_a_string_type;
|
|
error(errorNode, diagnostic, typeToString(arrayType));
|
|
}
|
|
return hasStringConstituent ? stringType : unknownType;
|
|
}
|
|
var arrayElementType = getIndexTypeOfType(arrayType, 1) || unknownType;
|
|
if (hasStringConstituent) {
|
|
if (arrayElementType.flags & 258) {
|
|
return stringType;
|
|
}
|
|
return getUnionType([arrayElementType, stringType]);
|
|
}
|
|
return arrayElementType;
|
|
}
|
|
function checkBreakOrContinueStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node);
|
|
}
|
|
function isGetAccessorWithAnnotatedSetAccessor(node) {
|
|
return !!(node.kind === 149 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 150)));
|
|
}
|
|
function isUnwrappedReturnTypeVoidOrAny(func, returnType) {
|
|
var unwrappedReturnType = ts.isAsyncFunctionLike(func) ? getPromisedType(returnType) : returnType;
|
|
return unwrappedReturnType && maybeTypeOfKind(unwrappedReturnType, 16 | 1);
|
|
}
|
|
function checkReturnStatement(node) {
|
|
if (!checkGrammarStatementInAmbientContext(node)) {
|
|
var functionBlock = ts.getContainingFunction(node);
|
|
if (!functionBlock) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.A_return_statement_can_only_be_used_within_a_function_body);
|
|
}
|
|
}
|
|
var func = ts.getContainingFunction(node);
|
|
if (func) {
|
|
var signature = getSignatureFromDeclaration(func);
|
|
var returnType = getReturnTypeOfSignature(signature);
|
|
if (strictNullChecks || node.expression || returnType === neverType) {
|
|
var exprType = node.expression ? checkExpressionCached(node.expression) : undefinedType;
|
|
if (func.asteriskToken) {
|
|
return;
|
|
}
|
|
if (func.kind === 150) {
|
|
if (node.expression) {
|
|
error(node.expression, ts.Diagnostics.Setters_cannot_return_a_value);
|
|
}
|
|
}
|
|
else if (func.kind === 148) {
|
|
if (node.expression && !checkTypeAssignableTo(exprType, returnType, node.expression)) {
|
|
error(node.expression, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class);
|
|
}
|
|
}
|
|
else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) {
|
|
if (ts.isAsyncFunctionLike(func)) {
|
|
var promisedType = getPromisedType(returnType);
|
|
var awaitedType = checkAwaitedType(exprType, node.expression || node, ts.Diagnostics.Return_expression_in_async_function_does_not_have_a_valid_callable_then_member);
|
|
if (promisedType) {
|
|
checkTypeAssignableTo(awaitedType, promisedType, node.expression || node);
|
|
}
|
|
}
|
|
else {
|
|
checkTypeAssignableTo(exprType, returnType, node.expression || node);
|
|
}
|
|
}
|
|
}
|
|
else if (func.kind !== 148 && compilerOptions.noImplicitReturns && !isUnwrappedReturnTypeVoidOrAny(func, returnType)) {
|
|
error(node, ts.Diagnostics.Not_all_code_paths_return_a_value);
|
|
}
|
|
}
|
|
}
|
|
function checkWithStatement(node) {
|
|
if (!checkGrammarStatementInAmbientContext(node)) {
|
|
if (node.flags & 33554432) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.with_statements_are_not_allowed_in_an_async_function_block);
|
|
}
|
|
}
|
|
checkExpression(node.expression);
|
|
error(node.expression, ts.Diagnostics.All_symbols_within_a_with_block_will_be_resolved_to_any);
|
|
}
|
|
function checkSwitchStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
var firstDefaultClause;
|
|
var hasDuplicateDefaultClause = false;
|
|
var expressionType = checkExpression(node.expression);
|
|
ts.forEach(node.caseBlock.clauses, function (clause) {
|
|
if (clause.kind === 250 && !hasDuplicateDefaultClause) {
|
|
if (firstDefaultClause === undefined) {
|
|
firstDefaultClause = clause;
|
|
}
|
|
else {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
var start = ts.skipTrivia(sourceFile.text, clause.pos);
|
|
var end = clause.statements.length > 0 ? clause.statements[0].pos : clause.end;
|
|
grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement);
|
|
hasDuplicateDefaultClause = true;
|
|
}
|
|
}
|
|
if (produceDiagnostics && clause.kind === 249) {
|
|
var caseClause = clause;
|
|
var caseType = checkExpression(caseClause.expression);
|
|
if (!isTypeEqualityComparableTo(expressionType, caseType)) {
|
|
checkTypeComparableTo(caseType, expressionType, caseClause.expression, undefined);
|
|
}
|
|
}
|
|
ts.forEach(clause.statements, checkSourceElement);
|
|
});
|
|
if (node.caseBlock.locals) {
|
|
registerForUnusedIdentifiersCheck(node.caseBlock);
|
|
}
|
|
}
|
|
function checkLabeledStatement(node) {
|
|
if (!checkGrammarStatementInAmbientContext(node)) {
|
|
var current = node.parent;
|
|
while (current) {
|
|
if (ts.isFunctionLike(current)) {
|
|
break;
|
|
}
|
|
if (current.kind === 214 && current.label.text === node.label.text) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
grammarErrorOnNode(node.label, ts.Diagnostics.Duplicate_label_0, ts.getTextOfNodeFromSourceText(sourceFile.text, node.label));
|
|
break;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
}
|
|
checkSourceElement(node.statement);
|
|
}
|
|
function checkThrowStatement(node) {
|
|
if (!checkGrammarStatementInAmbientContext(node)) {
|
|
if (node.expression === undefined) {
|
|
grammarErrorAfterFirstToken(node, ts.Diagnostics.Line_break_not_permitted_here);
|
|
}
|
|
}
|
|
if (node.expression) {
|
|
checkExpression(node.expression);
|
|
}
|
|
}
|
|
function checkTryStatement(node) {
|
|
checkGrammarStatementInAmbientContext(node);
|
|
checkBlock(node.tryBlock);
|
|
var catchClause = node.catchClause;
|
|
if (catchClause) {
|
|
if (catchClause.variableDeclaration) {
|
|
if (catchClause.variableDeclaration.name.kind !== 69) {
|
|
grammarErrorOnFirstToken(catchClause.variableDeclaration.name, ts.Diagnostics.Catch_clause_variable_name_must_be_an_identifier);
|
|
}
|
|
else if (catchClause.variableDeclaration.type) {
|
|
grammarErrorOnFirstToken(catchClause.variableDeclaration.type, ts.Diagnostics.Catch_clause_variable_cannot_have_a_type_annotation);
|
|
}
|
|
else if (catchClause.variableDeclaration.initializer) {
|
|
grammarErrorOnFirstToken(catchClause.variableDeclaration.initializer, ts.Diagnostics.Catch_clause_variable_cannot_have_an_initializer);
|
|
}
|
|
else {
|
|
var identifierName = catchClause.variableDeclaration.name.text;
|
|
var locals = catchClause.block.locals;
|
|
if (locals && ts.hasProperty(locals, identifierName)) {
|
|
var localSymbol = locals[identifierName];
|
|
if (localSymbol && (localSymbol.flags & 2) !== 0) {
|
|
grammarErrorOnNode(localSymbol.valueDeclaration, ts.Diagnostics.Cannot_redeclare_identifier_0_in_catch_clause, identifierName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
checkBlock(catchClause.block);
|
|
}
|
|
if (node.finallyBlock) {
|
|
checkBlock(node.finallyBlock);
|
|
}
|
|
}
|
|
function checkIndexConstraints(type) {
|
|
var declaredNumberIndexer = getIndexDeclarationOfSymbol(type.symbol, 1);
|
|
var declaredStringIndexer = getIndexDeclarationOfSymbol(type.symbol, 0);
|
|
var stringIndexType = getIndexTypeOfType(type, 0);
|
|
var numberIndexType = getIndexTypeOfType(type, 1);
|
|
if (stringIndexType || numberIndexType) {
|
|
ts.forEach(getPropertiesOfObjectType(type), function (prop) {
|
|
var propType = getTypeOfSymbol(prop);
|
|
checkIndexConstraintForProperty(prop, propType, type, declaredStringIndexer, stringIndexType, 0);
|
|
checkIndexConstraintForProperty(prop, propType, type, declaredNumberIndexer, numberIndexType, 1);
|
|
});
|
|
if (type.flags & 1024 && ts.isClassLike(type.symbol.valueDeclaration)) {
|
|
var classDeclaration = type.symbol.valueDeclaration;
|
|
for (var _i = 0, _a = classDeclaration.members; _i < _a.length; _i++) {
|
|
var member = _a[_i];
|
|
if (!(member.flags & 32) && ts.hasDynamicName(member)) {
|
|
var propType = getTypeOfSymbol(member.symbol);
|
|
checkIndexConstraintForProperty(member.symbol, propType, type, declaredStringIndexer, stringIndexType, 0);
|
|
checkIndexConstraintForProperty(member.symbol, propType, type, declaredNumberIndexer, numberIndexType, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
var errorNode;
|
|
if (stringIndexType && numberIndexType) {
|
|
errorNode = declaredNumberIndexer || declaredStringIndexer;
|
|
if (!errorNode && (type.flags & 2048)) {
|
|
var someBaseTypeHasBothIndexers = ts.forEach(getBaseTypes(type), function (base) { return getIndexTypeOfType(base, 0) && getIndexTypeOfType(base, 1); });
|
|
errorNode = someBaseTypeHasBothIndexers ? undefined : type.symbol.declarations[0];
|
|
}
|
|
}
|
|
if (errorNode && !isTypeAssignableTo(numberIndexType, stringIndexType)) {
|
|
error(errorNode, ts.Diagnostics.Numeric_index_type_0_is_not_assignable_to_string_index_type_1, typeToString(numberIndexType), typeToString(stringIndexType));
|
|
}
|
|
function checkIndexConstraintForProperty(prop, propertyType, containingType, indexDeclaration, indexType, indexKind) {
|
|
if (!indexType) {
|
|
return;
|
|
}
|
|
if (indexKind === 1 && !isNumericName(prop.valueDeclaration.name)) {
|
|
return;
|
|
}
|
|
var errorNode;
|
|
if (prop.valueDeclaration.name.kind === 140 || prop.parent === containingType.symbol) {
|
|
errorNode = prop.valueDeclaration;
|
|
}
|
|
else if (indexDeclaration) {
|
|
errorNode = indexDeclaration;
|
|
}
|
|
else if (containingType.flags & 2048) {
|
|
var someBaseClassHasBothPropertyAndIndexer = ts.forEach(getBaseTypes(containingType), function (base) { return getPropertyOfObjectType(base, prop.name) && getIndexTypeOfType(base, indexKind); });
|
|
errorNode = someBaseClassHasBothPropertyAndIndexer ? undefined : containingType.symbol.declarations[0];
|
|
}
|
|
if (errorNode && !isTypeAssignableTo(propertyType, indexType)) {
|
|
var errorMessage = indexKind === 0
|
|
? ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_string_index_type_2
|
|
: ts.Diagnostics.Property_0_of_type_1_is_not_assignable_to_numeric_index_type_2;
|
|
error(errorNode, errorMessage, symbolToString(prop), typeToString(propertyType), typeToString(indexType));
|
|
}
|
|
}
|
|
}
|
|
function checkTypeNameIsReserved(name, message) {
|
|
switch (name.text) {
|
|
case "any":
|
|
case "number":
|
|
case "boolean":
|
|
case "string":
|
|
case "symbol":
|
|
case "void":
|
|
error(name, message, name.text);
|
|
}
|
|
}
|
|
function checkTypeParameters(typeParameterDeclarations) {
|
|
if (typeParameterDeclarations) {
|
|
for (var i = 0, n = typeParameterDeclarations.length; i < n; i++) {
|
|
var node = typeParameterDeclarations[i];
|
|
checkTypeParameter(node);
|
|
if (produceDiagnostics) {
|
|
for (var j = 0; j < i; j++) {
|
|
if (typeParameterDeclarations[j].symbol === node.symbol) {
|
|
error(node.name, ts.Diagnostics.Duplicate_identifier_0, ts.declarationNameToString(node.name));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkTypeParameterListsIdentical(node, symbol) {
|
|
if (symbol.declarations.length === 1) {
|
|
return;
|
|
}
|
|
var firstDecl;
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var declaration = _a[_i];
|
|
if (declaration.kind === 221 || declaration.kind === 222) {
|
|
if (!firstDecl) {
|
|
firstDecl = declaration;
|
|
}
|
|
else if (!areTypeParametersIdentical(firstDecl.typeParameters, node.typeParameters)) {
|
|
error(node.name, ts.Diagnostics.All_declarations_of_0_must_have_identical_type_parameters, node.name.text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkClassExpression(node) {
|
|
checkClassLikeDeclaration(node);
|
|
checkNodeDeferred(node);
|
|
return getTypeOfSymbol(getSymbolOfNode(node));
|
|
}
|
|
function checkClassExpressionDeferred(node) {
|
|
ts.forEach(node.members, checkSourceElement);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
function checkClassDeclaration(node) {
|
|
if (!node.name && !(node.flags & 512)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name);
|
|
}
|
|
checkClassLikeDeclaration(node);
|
|
ts.forEach(node.members, checkSourceElement);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
function checkClassLikeDeclaration(node) {
|
|
checkGrammarClassDeclarationHeritageClauses(node);
|
|
checkDecorators(node);
|
|
if (node.name) {
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Class_name_cannot_be_0);
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
}
|
|
checkTypeParameters(node.typeParameters);
|
|
checkExportsOnMergedDeclarations(node);
|
|
var symbol = getSymbolOfNode(node);
|
|
var type = getDeclaredTypeOfSymbol(symbol);
|
|
var typeWithThis = getTypeWithThisArgument(type);
|
|
var staticType = getTypeOfSymbol(symbol);
|
|
checkTypeParameterListsIdentical(node, symbol);
|
|
checkClassForDuplicateDeclarations(node);
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
|
|
if (baseTypeNode) {
|
|
var baseTypes = getBaseTypes(type);
|
|
if (baseTypes.length && produceDiagnostics) {
|
|
var baseType_1 = baseTypes[0];
|
|
var staticBaseType = getBaseConstructorTypeOfClass(type);
|
|
checkBaseTypeAccessibility(staticBaseType, baseTypeNode);
|
|
checkSourceElement(baseTypeNode.expression);
|
|
if (baseTypeNode.typeArguments) {
|
|
ts.forEach(baseTypeNode.typeArguments, checkSourceElement);
|
|
for (var _i = 0, _a = getConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments); _i < _a.length; _i++) {
|
|
var constructor = _a[_i];
|
|
if (!checkTypeArgumentConstraints(constructor.typeParameters, baseTypeNode.typeArguments)) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
checkTypeAssignableTo(typeWithThis, getTypeWithThisArgument(baseType_1, type.thisType), node.name || node, ts.Diagnostics.Class_0_incorrectly_extends_base_class_1);
|
|
checkTypeAssignableTo(staticType, getTypeWithoutSignatures(staticBaseType), node.name || node, ts.Diagnostics.Class_static_side_0_incorrectly_extends_base_class_static_side_1);
|
|
if (!(staticBaseType.symbol && staticBaseType.symbol.flags & 32)) {
|
|
var constructors = getInstantiatedConstructorsForTypeArguments(staticBaseType, baseTypeNode.typeArguments);
|
|
if (ts.forEach(constructors, function (sig) { return getReturnTypeOfSignature(sig) !== baseType_1; })) {
|
|
error(baseTypeNode.expression, ts.Diagnostics.Base_constructors_must_all_have_the_same_return_type);
|
|
}
|
|
}
|
|
checkKindsOfPropertyMemberOverrides(type, baseType_1);
|
|
}
|
|
}
|
|
var implementedTypeNodes = ts.getClassImplementsHeritageClauseElements(node);
|
|
if (implementedTypeNodes) {
|
|
for (var _b = 0, implementedTypeNodes_1 = implementedTypeNodes; _b < implementedTypeNodes_1.length; _b++) {
|
|
var typeRefNode = implementedTypeNodes_1[_b];
|
|
if (!ts.isSupportedExpressionWithTypeArguments(typeRefNode)) {
|
|
error(typeRefNode.expression, ts.Diagnostics.A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments);
|
|
}
|
|
checkTypeReferenceNode(typeRefNode);
|
|
if (produceDiagnostics) {
|
|
var t = getTypeFromTypeNode(typeRefNode);
|
|
if (t !== unknownType) {
|
|
var declaredType = (t.flags & 4096) ? t.target : t;
|
|
if (declaredType.flags & (1024 | 2048)) {
|
|
checkTypeAssignableTo(typeWithThis, getTypeWithThisArgument(t, type.thisType), node.name || node, ts.Diagnostics.Class_0_incorrectly_implements_interface_1);
|
|
}
|
|
else {
|
|
error(typeRefNode, ts.Diagnostics.A_class_may_only_implement_another_class_or_interface);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (produceDiagnostics) {
|
|
checkIndexConstraints(type);
|
|
checkTypeForDuplicateIndexSignatures(node);
|
|
}
|
|
}
|
|
function checkBaseTypeAccessibility(type, node) {
|
|
var signatures = getSignaturesOfType(type, 1);
|
|
if (signatures.length) {
|
|
var declaration = signatures[0].declaration;
|
|
if (declaration && declaration.flags & 8) {
|
|
var typeClassDeclaration = getClassLikeDeclarationOfSymbol(type.symbol);
|
|
if (!isNodeWithinClass(node, typeClassDeclaration)) {
|
|
error(node, ts.Diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, node.expression.text);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getTargetSymbol(s) {
|
|
return s.flags & 16777216 ? getSymbolLinks(s).target : s;
|
|
}
|
|
function getClassLikeDeclarationOfSymbol(symbol) {
|
|
return ts.forEach(symbol.declarations, function (d) { return ts.isClassLike(d) ? d : undefined; });
|
|
}
|
|
function checkKindsOfPropertyMemberOverrides(type, baseType) {
|
|
var baseProperties = getPropertiesOfObjectType(baseType);
|
|
for (var _i = 0, baseProperties_1 = baseProperties; _i < baseProperties_1.length; _i++) {
|
|
var baseProperty = baseProperties_1[_i];
|
|
var base = getTargetSymbol(baseProperty);
|
|
if (base.flags & 134217728) {
|
|
continue;
|
|
}
|
|
var derived = getTargetSymbol(getPropertyOfObjectType(type, base.name));
|
|
var baseDeclarationFlags = getDeclarationFlagsFromSymbol(base);
|
|
ts.Debug.assert(!!derived, "derived should point to something, even if it is the base class' declaration.");
|
|
if (derived) {
|
|
if (derived === base) {
|
|
var derivedClassDecl = getClassLikeDeclarationOfSymbol(type.symbol);
|
|
if (baseDeclarationFlags & 128 && (!derivedClassDecl || !(derivedClassDecl.flags & 128))) {
|
|
if (derivedClassDecl.kind === 192) {
|
|
error(derivedClassDecl, ts.Diagnostics.Non_abstract_class_expression_does_not_implement_inherited_abstract_member_0_from_class_1, symbolToString(baseProperty), typeToString(baseType));
|
|
}
|
|
else {
|
|
error(derivedClassDecl, ts.Diagnostics.Non_abstract_class_0_does_not_implement_inherited_abstract_member_1_from_class_2, typeToString(type), symbolToString(baseProperty), typeToString(baseType));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
var derivedDeclarationFlags = getDeclarationFlagsFromSymbol(derived);
|
|
if ((baseDeclarationFlags & 8) || (derivedDeclarationFlags & 8)) {
|
|
continue;
|
|
}
|
|
if ((baseDeclarationFlags & 32) !== (derivedDeclarationFlags & 32)) {
|
|
continue;
|
|
}
|
|
if ((base.flags & derived.flags & 8192) || ((base.flags & 98308) && (derived.flags & 98308))) {
|
|
continue;
|
|
}
|
|
var errorMessage = void 0;
|
|
if (base.flags & 8192) {
|
|
if (derived.flags & 98304) {
|
|
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_accessor;
|
|
}
|
|
else {
|
|
ts.Debug.assert((derived.flags & 4) !== 0);
|
|
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_function_1_but_extended_class_2_defines_it_as_instance_member_property;
|
|
}
|
|
}
|
|
else if (base.flags & 4) {
|
|
ts.Debug.assert((derived.flags & 8192) !== 0);
|
|
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_property_1_but_extended_class_2_defines_it_as_instance_member_function;
|
|
}
|
|
else {
|
|
ts.Debug.assert((base.flags & 98304) !== 0);
|
|
ts.Debug.assert((derived.flags & 8192) !== 0);
|
|
errorMessage = ts.Diagnostics.Class_0_defines_instance_member_accessor_1_but_extended_class_2_defines_it_as_instance_member_function;
|
|
}
|
|
error(derived.valueDeclaration.name, errorMessage, typeToString(baseType), symbolToString(base), typeToString(type));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isAccessor(kind) {
|
|
return kind === 149 || kind === 150;
|
|
}
|
|
function areTypeParametersIdentical(list1, list2) {
|
|
if (!list1 && !list2) {
|
|
return true;
|
|
}
|
|
if (!list1 || !list2 || list1.length !== list2.length) {
|
|
return false;
|
|
}
|
|
for (var i = 0, len = list1.length; i < len; i++) {
|
|
var tp1 = list1[i];
|
|
var tp2 = list2[i];
|
|
if (tp1.name.text !== tp2.name.text) {
|
|
return false;
|
|
}
|
|
if (!tp1.constraint && !tp2.constraint) {
|
|
continue;
|
|
}
|
|
if (!tp1.constraint || !tp2.constraint) {
|
|
return false;
|
|
}
|
|
if (!isTypeIdenticalTo(getTypeFromTypeNode(tp1.constraint), getTypeFromTypeNode(tp2.constraint))) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function checkInheritedPropertiesAreIdentical(type, typeNode) {
|
|
var baseTypes = getBaseTypes(type);
|
|
if (baseTypes.length < 2) {
|
|
return true;
|
|
}
|
|
var seen = {};
|
|
ts.forEach(resolveDeclaredMembers(type).declaredProperties, function (p) { seen[p.name] = { prop: p, containingType: type }; });
|
|
var ok = true;
|
|
for (var _i = 0, baseTypes_2 = baseTypes; _i < baseTypes_2.length; _i++) {
|
|
var base = baseTypes_2[_i];
|
|
var properties = getPropertiesOfObjectType(getTypeWithThisArgument(base, type.thisType));
|
|
for (var _a = 0, properties_4 = properties; _a < properties_4.length; _a++) {
|
|
var prop = properties_4[_a];
|
|
if (!ts.hasProperty(seen, prop.name)) {
|
|
seen[prop.name] = { prop: prop, containingType: base };
|
|
}
|
|
else {
|
|
var existing = seen[prop.name];
|
|
var isInheritedProperty = existing.containingType !== type;
|
|
if (isInheritedProperty && !isPropertyIdenticalTo(existing.prop, prop)) {
|
|
ok = false;
|
|
var typeName1 = typeToString(existing.containingType);
|
|
var typeName2 = typeToString(base);
|
|
var errorInfo = ts.chainDiagnosticMessages(undefined, ts.Diagnostics.Named_property_0_of_types_1_and_2_are_not_identical, symbolToString(prop), typeName1, typeName2);
|
|
errorInfo = ts.chainDiagnosticMessages(errorInfo, ts.Diagnostics.Interface_0_cannot_simultaneously_extend_types_1_and_2, typeToString(type), typeName1, typeName2);
|
|
diagnostics.add(ts.createDiagnosticForNodeFromMessageChain(typeNode, errorInfo));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return ok;
|
|
}
|
|
function checkInterfaceDeclaration(node) {
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarInterfaceDeclaration(node);
|
|
checkTypeParameters(node.typeParameters);
|
|
if (produceDiagnostics) {
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Interface_name_cannot_be_0);
|
|
checkExportsOnMergedDeclarations(node);
|
|
var symbol = getSymbolOfNode(node);
|
|
checkTypeParameterListsIdentical(node, symbol);
|
|
var firstInterfaceDecl = ts.getDeclarationOfKind(symbol, 222);
|
|
if (node === firstInterfaceDecl) {
|
|
var type = getDeclaredTypeOfSymbol(symbol);
|
|
var typeWithThis = getTypeWithThisArgument(type);
|
|
if (checkInheritedPropertiesAreIdentical(type, node.name)) {
|
|
for (var _i = 0, _a = getBaseTypes(type); _i < _a.length; _i++) {
|
|
var baseType = _a[_i];
|
|
checkTypeAssignableTo(typeWithThis, getTypeWithThisArgument(baseType, type.thisType), node.name, ts.Diagnostics.Interface_0_incorrectly_extends_interface_1);
|
|
}
|
|
checkIndexConstraints(type);
|
|
}
|
|
}
|
|
checkObjectTypeForDuplicateDeclarations(node);
|
|
}
|
|
ts.forEach(ts.getInterfaceBaseTypeNodes(node), function (heritageElement) {
|
|
if (!ts.isSupportedExpressionWithTypeArguments(heritageElement)) {
|
|
error(heritageElement.expression, ts.Diagnostics.An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments);
|
|
}
|
|
checkTypeReferenceNode(heritageElement);
|
|
});
|
|
ts.forEach(node.members, checkSourceElement);
|
|
if (produceDiagnostics) {
|
|
checkTypeForDuplicateIndexSignatures(node);
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
function checkTypeAliasDeclaration(node) {
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Type_alias_name_cannot_be_0);
|
|
checkSourceElement(node.type);
|
|
}
|
|
function computeEnumMemberValues(node) {
|
|
var nodeLinks = getNodeLinks(node);
|
|
if (!(nodeLinks.flags & 16384)) {
|
|
var enumSymbol = getSymbolOfNode(node);
|
|
var enumType = getDeclaredTypeOfSymbol(enumSymbol);
|
|
var autoValue = 0;
|
|
var ambient = ts.isInAmbientContext(node);
|
|
var enumIsConst = ts.isConst(node);
|
|
for (var _i = 0, _a = node.members; _i < _a.length; _i++) {
|
|
var member = _a[_i];
|
|
if (isComputedNonLiteralName(member.name)) {
|
|
error(member.name, ts.Diagnostics.Computed_property_names_are_not_allowed_in_enums);
|
|
}
|
|
else {
|
|
var text = getTextOfPropertyName(member.name);
|
|
if (isNumericLiteralName(text)) {
|
|
error(member.name, ts.Diagnostics.An_enum_member_cannot_have_a_numeric_name);
|
|
}
|
|
}
|
|
var previousEnumMemberIsNonConstant = autoValue === undefined;
|
|
var initializer = member.initializer;
|
|
if (initializer) {
|
|
autoValue = computeConstantValueForEnumMemberInitializer(initializer, enumType, enumIsConst, ambient);
|
|
}
|
|
else if (ambient && !enumIsConst) {
|
|
autoValue = undefined;
|
|
}
|
|
else if (previousEnumMemberIsNonConstant) {
|
|
error(member.name, ts.Diagnostics.Enum_member_must_have_initializer);
|
|
}
|
|
if (autoValue !== undefined) {
|
|
getNodeLinks(member).enumMemberValue = autoValue;
|
|
autoValue++;
|
|
}
|
|
}
|
|
nodeLinks.flags |= 16384;
|
|
}
|
|
function computeConstantValueForEnumMemberInitializer(initializer, enumType, enumIsConst, ambient) {
|
|
var reportError = true;
|
|
var value = evalConstant(initializer);
|
|
if (reportError) {
|
|
if (value === undefined) {
|
|
if (enumIsConst) {
|
|
error(initializer, ts.Diagnostics.In_const_enum_declarations_member_initializer_must_be_constant_expression);
|
|
}
|
|
else if (ambient) {
|
|
error(initializer, ts.Diagnostics.In_ambient_enum_declarations_member_initializer_must_be_constant_expression);
|
|
}
|
|
else {
|
|
checkTypeAssignableTo(checkExpression(initializer), enumType, initializer, undefined);
|
|
}
|
|
}
|
|
else if (enumIsConst) {
|
|
if (isNaN(value)) {
|
|
error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN);
|
|
}
|
|
else if (!isFinite(value)) {
|
|
error(initializer, ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value);
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
function evalConstant(e) {
|
|
switch (e.kind) {
|
|
case 185:
|
|
var value_1 = evalConstant(e.operand);
|
|
if (value_1 === undefined) {
|
|
return undefined;
|
|
}
|
|
switch (e.operator) {
|
|
case 35: return value_1;
|
|
case 36: return -value_1;
|
|
case 50: return ~value_1;
|
|
}
|
|
return undefined;
|
|
case 187:
|
|
var left = evalConstant(e.left);
|
|
if (left === undefined) {
|
|
return undefined;
|
|
}
|
|
var right = evalConstant(e.right);
|
|
if (right === undefined) {
|
|
return undefined;
|
|
}
|
|
switch (e.operatorToken.kind) {
|
|
case 47: return left | right;
|
|
case 46: return left & right;
|
|
case 44: return left >> right;
|
|
case 45: return left >>> right;
|
|
case 43: return left << right;
|
|
case 48: return left ^ right;
|
|
case 37: return left * right;
|
|
case 39: return left / right;
|
|
case 35: return left + right;
|
|
case 36: return left - right;
|
|
case 40: return left % right;
|
|
}
|
|
return undefined;
|
|
case 8:
|
|
return +e.text;
|
|
case 178:
|
|
return evalConstant(e.expression);
|
|
case 69:
|
|
case 173:
|
|
case 172:
|
|
var member = initializer.parent;
|
|
var currentType = getTypeOfSymbol(getSymbolOfNode(member.parent));
|
|
var enumType_1;
|
|
var propertyName = void 0;
|
|
if (e.kind === 69) {
|
|
enumType_1 = currentType;
|
|
propertyName = e.text;
|
|
}
|
|
else {
|
|
var expression = void 0;
|
|
if (e.kind === 173) {
|
|
if (e.argumentExpression === undefined ||
|
|
e.argumentExpression.kind !== 9) {
|
|
return undefined;
|
|
}
|
|
expression = e.expression;
|
|
propertyName = e.argumentExpression.text;
|
|
}
|
|
else {
|
|
expression = e.expression;
|
|
propertyName = e.name.text;
|
|
}
|
|
var current = expression;
|
|
while (current) {
|
|
if (current.kind === 69) {
|
|
break;
|
|
}
|
|
else if (current.kind === 172) {
|
|
current = current.expression;
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
enumType_1 = checkExpression(expression);
|
|
if (!(enumType_1.symbol && (enumType_1.symbol.flags & 384))) {
|
|
return undefined;
|
|
}
|
|
}
|
|
if (propertyName === undefined) {
|
|
return undefined;
|
|
}
|
|
var property = getPropertyOfObjectType(enumType_1, propertyName);
|
|
if (!property || !(property.flags & 8)) {
|
|
return undefined;
|
|
}
|
|
var propertyDecl = property.valueDeclaration;
|
|
if (member === propertyDecl) {
|
|
return undefined;
|
|
}
|
|
if (!isBlockScopedNameDeclaredBeforeUse(propertyDecl, member)) {
|
|
reportError = false;
|
|
error(e, ts.Diagnostics.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums);
|
|
return undefined;
|
|
}
|
|
return getNodeLinks(propertyDecl).enumMemberValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkEnumDeclaration(node) {
|
|
if (!produceDiagnostics) {
|
|
return;
|
|
}
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Enum_name_cannot_be_0);
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
checkExportsOnMergedDeclarations(node);
|
|
computeEnumMemberValues(node);
|
|
var enumIsConst = ts.isConst(node);
|
|
if (compilerOptions.isolatedModules && enumIsConst && ts.isInAmbientContext(node)) {
|
|
error(node.name, ts.Diagnostics.Ambient_const_enums_are_not_allowed_when_the_isolatedModules_flag_is_provided);
|
|
}
|
|
var enumSymbol = getSymbolOfNode(node);
|
|
var firstDeclaration = ts.getDeclarationOfKind(enumSymbol, node.kind);
|
|
if (node === firstDeclaration) {
|
|
if (enumSymbol.declarations.length > 1) {
|
|
ts.forEach(enumSymbol.declarations, function (decl) {
|
|
if (ts.isConstEnumDeclaration(decl) !== enumIsConst) {
|
|
error(decl.name, ts.Diagnostics.Enum_declarations_must_all_be_const_or_non_const);
|
|
}
|
|
});
|
|
}
|
|
var seenEnumMissingInitialInitializer_1 = false;
|
|
ts.forEach(enumSymbol.declarations, function (declaration) {
|
|
if (declaration.kind !== 224) {
|
|
return false;
|
|
}
|
|
var enumDeclaration = declaration;
|
|
if (!enumDeclaration.members.length) {
|
|
return false;
|
|
}
|
|
var firstEnumMember = enumDeclaration.members[0];
|
|
if (!firstEnumMember.initializer) {
|
|
if (seenEnumMissingInitialInitializer_1) {
|
|
error(firstEnumMember.name, ts.Diagnostics.In_an_enum_with_multiple_declarations_only_one_declaration_can_omit_an_initializer_for_its_first_enum_element);
|
|
}
|
|
else {
|
|
seenEnumMissingInitialInitializer_1 = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function getFirstNonAmbientClassOrFunctionDeclaration(symbol) {
|
|
var declarations = symbol.declarations;
|
|
for (var _i = 0, declarations_5 = declarations; _i < declarations_5.length; _i++) {
|
|
var declaration = declarations_5[_i];
|
|
if ((declaration.kind === 221 ||
|
|
(declaration.kind === 220 && ts.nodeIsPresent(declaration.body))) &&
|
|
!ts.isInAmbientContext(declaration)) {
|
|
return declaration;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function inSameLexicalScope(node1, node2) {
|
|
var container1 = ts.getEnclosingBlockScopeContainer(node1);
|
|
var container2 = ts.getEnclosingBlockScopeContainer(node2);
|
|
if (isGlobalSourceFile(container1)) {
|
|
return isGlobalSourceFile(container2);
|
|
}
|
|
else if (isGlobalSourceFile(container2)) {
|
|
return false;
|
|
}
|
|
else {
|
|
return container1 === container2;
|
|
}
|
|
}
|
|
function checkModuleDeclaration(node) {
|
|
if (produceDiagnostics) {
|
|
var isGlobalAugmentation = ts.isGlobalScopeAugmentation(node);
|
|
var inAmbientContext = ts.isInAmbientContext(node);
|
|
if (isGlobalAugmentation && !inAmbientContext) {
|
|
error(node.name, ts.Diagnostics.Augmentations_for_the_global_scope_should_have_declare_modifier_unless_they_appear_in_already_ambient_context);
|
|
}
|
|
var isAmbientExternalModule = ts.isAmbientModule(node);
|
|
var contextErrorMessage = isAmbientExternalModule
|
|
? ts.Diagnostics.An_ambient_module_declaration_is_only_allowed_at_the_top_level_in_a_file
|
|
: ts.Diagnostics.A_namespace_declaration_is_only_allowed_in_a_namespace_or_module;
|
|
if (checkGrammarModuleElementContext(node, contextErrorMessage)) {
|
|
return;
|
|
}
|
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node)) {
|
|
if (!inAmbientContext && node.name.kind === 9) {
|
|
grammarErrorOnNode(node.name, ts.Diagnostics.Only_ambient_modules_can_use_quoted_names);
|
|
}
|
|
}
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
checkExportsOnMergedDeclarations(node);
|
|
var symbol = getSymbolOfNode(node);
|
|
if (symbol.flags & 512
|
|
&& symbol.declarations.length > 1
|
|
&& !inAmbientContext
|
|
&& ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.isolatedModules)) {
|
|
var firstNonAmbientClassOrFunc = getFirstNonAmbientClassOrFunctionDeclaration(symbol);
|
|
if (firstNonAmbientClassOrFunc) {
|
|
if (ts.getSourceFileOfNode(node) !== ts.getSourceFileOfNode(firstNonAmbientClassOrFunc)) {
|
|
error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_in_a_different_file_from_a_class_or_function_with_which_it_is_merged);
|
|
}
|
|
else if (node.pos < firstNonAmbientClassOrFunc.pos) {
|
|
error(node.name, ts.Diagnostics.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged);
|
|
}
|
|
}
|
|
var mergedClass = ts.getDeclarationOfKind(symbol, 221);
|
|
if (mergedClass &&
|
|
inSameLexicalScope(node, mergedClass)) {
|
|
getNodeLinks(node).flags |= 32768;
|
|
}
|
|
}
|
|
if (isAmbientExternalModule) {
|
|
if (ts.isExternalModuleAugmentation(node)) {
|
|
var checkBody = isGlobalAugmentation || (getSymbolOfNode(node).flags & 33554432);
|
|
if (checkBody && node.body) {
|
|
for (var _i = 0, _a = node.body.statements; _i < _a.length; _i++) {
|
|
var statement = _a[_i];
|
|
checkModuleAugmentationElement(statement, isGlobalAugmentation);
|
|
}
|
|
}
|
|
}
|
|
else if (isGlobalSourceFile(node.parent)) {
|
|
if (isGlobalAugmentation) {
|
|
error(node.name, ts.Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations);
|
|
}
|
|
else if (ts.isExternalModuleNameRelative(node.name.text)) {
|
|
error(node.name, ts.Diagnostics.Ambient_module_declaration_cannot_specify_relative_module_name);
|
|
}
|
|
}
|
|
else {
|
|
if (isGlobalAugmentation) {
|
|
error(node.name, ts.Diagnostics.Augmentations_for_the_global_scope_can_only_be_directly_nested_in_external_modules_or_ambient_module_declarations);
|
|
}
|
|
else {
|
|
error(node.name, ts.Diagnostics.Ambient_modules_cannot_be_nested_in_other_modules_or_namespaces);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (compilerOptions.noImplicitAny && !node.body) {
|
|
reportImplicitAnyError(node, anyType);
|
|
}
|
|
if (node.body) {
|
|
checkSourceElement(node.body);
|
|
if (!ts.isGlobalScopeAugmentation(node)) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
}
|
|
}
|
|
function checkModuleAugmentationElement(node, isGlobalAugmentation) {
|
|
switch (node.kind) {
|
|
case 200:
|
|
for (var _i = 0, _a = node.declarationList.declarations; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
checkModuleAugmentationElement(decl, isGlobalAugmentation);
|
|
}
|
|
break;
|
|
case 235:
|
|
case 236:
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.Exports_and_export_assignments_are_not_permitted_in_module_augmentations);
|
|
break;
|
|
case 229:
|
|
case 230:
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.Imports_are_not_permitted_in_module_augmentations_Consider_moving_them_to_the_enclosing_external_module);
|
|
break;
|
|
case 169:
|
|
case 218:
|
|
var name_19 = node.name;
|
|
if (ts.isBindingPattern(name_19)) {
|
|
for (var _b = 0, _c = name_19.elements; _b < _c.length; _b++) {
|
|
var el = _c[_b];
|
|
checkModuleAugmentationElement(el, isGlobalAugmentation);
|
|
}
|
|
break;
|
|
}
|
|
case 221:
|
|
case 224:
|
|
case 220:
|
|
case 222:
|
|
case 225:
|
|
case 223:
|
|
if (isGlobalAugmentation) {
|
|
return;
|
|
}
|
|
var symbol = getSymbolOfNode(node);
|
|
if (symbol) {
|
|
var reportError = !(symbol.flags & 33554432);
|
|
if (!reportError) {
|
|
reportError = ts.isExternalModuleAugmentation(symbol.parent.declarations[0]);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
function getFirstIdentifier(node) {
|
|
while (true) {
|
|
if (node.kind === 139) {
|
|
node = node.left;
|
|
}
|
|
else if (node.kind === 172) {
|
|
node = node.expression;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
ts.Debug.assert(node.kind === 69);
|
|
return node;
|
|
}
|
|
function checkExternalImportOrExportDeclaration(node) {
|
|
var moduleName = ts.getExternalModuleName(node);
|
|
if (!ts.nodeIsMissing(moduleName) && moduleName.kind !== 9) {
|
|
error(moduleName, ts.Diagnostics.String_literal_expected);
|
|
return false;
|
|
}
|
|
var inAmbientExternalModule = node.parent.kind === 226 && ts.isAmbientModule(node.parent.parent);
|
|
if (node.parent.kind !== 256 && !inAmbientExternalModule) {
|
|
error(moduleName, node.kind === 236 ?
|
|
ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace :
|
|
ts.Diagnostics.Import_declarations_in_a_namespace_cannot_reference_a_module);
|
|
return false;
|
|
}
|
|
if (inAmbientExternalModule && ts.isExternalModuleNameRelative(moduleName.text)) {
|
|
if (!isTopLevelInExternalModuleAugmentation(node)) {
|
|
error(node, ts.Diagnostics.Import_or_export_declaration_in_an_ambient_module_declaration_cannot_reference_module_through_relative_module_name);
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function checkAliasSymbol(node) {
|
|
var symbol = getSymbolOfNode(node);
|
|
var target = resolveAlias(symbol);
|
|
if (target !== unknownSymbol) {
|
|
var excludedMeanings = (symbol.flags & (107455 | 1048576) ? 107455 : 0) |
|
|
(symbol.flags & 793056 ? 793056 : 0) |
|
|
(symbol.flags & 1536 ? 1536 : 0);
|
|
if (target.flags & excludedMeanings) {
|
|
var message = node.kind === 238 ?
|
|
ts.Diagnostics.Export_declaration_conflicts_with_exported_declaration_of_0 :
|
|
ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0;
|
|
error(node, message, symbolToString(symbol));
|
|
}
|
|
}
|
|
}
|
|
function checkImportBinding(node) {
|
|
checkCollisionWithCapturedThisVariable(node, node.name);
|
|
checkCollisionWithRequireExportsInGeneratedCode(node, node.name);
|
|
checkCollisionWithGlobalPromiseInGeneratedCode(node, node.name);
|
|
checkAliasSymbol(node);
|
|
}
|
|
function checkImportDeclaration(node) {
|
|
if (checkGrammarModuleElementContext(node, ts.Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
|
|
return;
|
|
}
|
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 1023)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.An_import_declaration_cannot_have_modifiers);
|
|
}
|
|
if (checkExternalImportOrExportDeclaration(node)) {
|
|
var importClause = node.importClause;
|
|
if (importClause) {
|
|
if (importClause.name) {
|
|
checkImportBinding(importClause);
|
|
}
|
|
if (importClause.namedBindings) {
|
|
if (importClause.namedBindings.kind === 232) {
|
|
checkImportBinding(importClause.namedBindings);
|
|
}
|
|
else {
|
|
ts.forEach(importClause.namedBindings.elements, checkImportBinding);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkImportEqualsDeclaration(node) {
|
|
if (checkGrammarModuleElementContext(node, ts.Diagnostics.An_import_declaration_can_only_be_used_in_a_namespace_or_module)) {
|
|
return;
|
|
}
|
|
checkGrammarDecorators(node) || checkGrammarModifiers(node);
|
|
if (ts.isInternalModuleImportEqualsDeclaration(node) || checkExternalImportOrExportDeclaration(node)) {
|
|
checkImportBinding(node);
|
|
if (node.flags & 1) {
|
|
markExportAsReferenced(node);
|
|
}
|
|
if (ts.isInternalModuleImportEqualsDeclaration(node)) {
|
|
var target = resolveAlias(getSymbolOfNode(node));
|
|
if (target !== unknownSymbol) {
|
|
if (target.flags & 107455) {
|
|
var moduleName = getFirstIdentifier(node.moduleReference);
|
|
if (!(resolveEntityName(moduleName, 107455 | 1536).flags & 1536)) {
|
|
error(moduleName, ts.Diagnostics.Module_0_is_hidden_by_a_local_declaration_with_the_same_name, ts.declarationNameToString(moduleName));
|
|
}
|
|
}
|
|
if (target.flags & 793056) {
|
|
checkTypeNameIsReserved(node.name, ts.Diagnostics.Import_name_cannot_be_0);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (modulekind === ts.ModuleKind.ES6 && !ts.isInAmbientContext(node)) {
|
|
grammarErrorOnNode(node, ts.Diagnostics.Import_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_import_Asterisk_as_ns_from_mod_import_a_from_mod_import_d_from_mod_or_another_module_format_instead);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkExportDeclaration(node) {
|
|
if (checkGrammarModuleElementContext(node, ts.Diagnostics.An_export_declaration_can_only_be_used_in_a_module)) {
|
|
return;
|
|
}
|
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 1023)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_declaration_cannot_have_modifiers);
|
|
}
|
|
if (!node.moduleSpecifier || checkExternalImportOrExportDeclaration(node)) {
|
|
if (node.exportClause) {
|
|
ts.forEach(node.exportClause.elements, checkExportSpecifier);
|
|
var inAmbientExternalModule = node.parent.kind === 226 && ts.isAmbientModule(node.parent.parent);
|
|
if (node.parent.kind !== 256 && !inAmbientExternalModule) {
|
|
error(node, ts.Diagnostics.Export_declarations_are_not_permitted_in_a_namespace);
|
|
}
|
|
}
|
|
else {
|
|
var moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
|
|
if (moduleSymbol && hasExportAssignmentSymbol(moduleSymbol)) {
|
|
error(node.moduleSpecifier, ts.Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarModuleElementContext(node, errorMessage) {
|
|
if (node.parent.kind !== 256 && node.parent.kind !== 226 && node.parent.kind !== 225) {
|
|
return grammarErrorOnFirstToken(node, errorMessage);
|
|
}
|
|
}
|
|
function checkExportSpecifier(node) {
|
|
checkAliasSymbol(node);
|
|
if (!node.parent.parent.moduleSpecifier) {
|
|
var exportedName = node.propertyName || node.name;
|
|
var symbol = resolveName(exportedName, exportedName.text, 107455 | 793056 | 1536 | 8388608, undefined, undefined);
|
|
if (symbol && (symbol === undefinedSymbol || isGlobalSourceFile(getDeclarationContainer(symbol.declarations[0])))) {
|
|
error(exportedName, ts.Diagnostics.Cannot_export_0_Only_local_declarations_can_be_exported_from_a_module, exportedName.text);
|
|
}
|
|
else {
|
|
markExportAsReferenced(node);
|
|
}
|
|
}
|
|
}
|
|
function checkExportAssignment(node) {
|
|
if (checkGrammarModuleElementContext(node, ts.Diagnostics.An_export_assignment_can_only_be_used_in_a_module)) {
|
|
return;
|
|
}
|
|
var container = node.parent.kind === 256 ? node.parent : node.parent.parent;
|
|
if (container.kind === 225 && !ts.isAmbientModule(container)) {
|
|
error(node, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_namespace);
|
|
return;
|
|
}
|
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && (node.flags & 1023)) {
|
|
grammarErrorOnFirstToken(node, ts.Diagnostics.An_export_assignment_cannot_have_modifiers);
|
|
}
|
|
if (node.expression.kind === 69) {
|
|
markExportAsReferenced(node);
|
|
}
|
|
else {
|
|
checkExpressionCached(node.expression);
|
|
}
|
|
checkExternalModuleExports(container);
|
|
if (node.isExportEquals && !ts.isInAmbientContext(node)) {
|
|
if (modulekind === ts.ModuleKind.ES6) {
|
|
grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_cannot_be_used_when_targeting_ECMAScript_2015_modules_Consider_using_export_default_or_another_module_format_instead);
|
|
}
|
|
else if (modulekind === ts.ModuleKind.System) {
|
|
grammarErrorOnNode(node, ts.Diagnostics.Export_assignment_is_not_supported_when_module_flag_is_system);
|
|
}
|
|
}
|
|
}
|
|
function hasExportedMembers(moduleSymbol) {
|
|
for (var id in moduleSymbol.exports) {
|
|
if (id !== "export=") {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkExternalModuleExports(node) {
|
|
var moduleSymbol = getSymbolOfNode(node);
|
|
var links = getSymbolLinks(moduleSymbol);
|
|
if (!links.exportsChecked) {
|
|
var exportEqualsSymbol = moduleSymbol.exports["export="];
|
|
if (exportEqualsSymbol && hasExportedMembers(moduleSymbol)) {
|
|
var declaration = getDeclarationOfAliasSymbol(exportEqualsSymbol) || exportEqualsSymbol.valueDeclaration;
|
|
if (!isTopLevelInExternalModuleAugmentation(declaration)) {
|
|
error(declaration, ts.Diagnostics.An_export_assignment_cannot_be_used_in_a_module_with_other_exported_elements);
|
|
}
|
|
}
|
|
var exports = getExportsOfModule(moduleSymbol);
|
|
for (var id in exports) {
|
|
if (id === "__export") {
|
|
continue;
|
|
}
|
|
var _a = exports[id], declarations = _a.declarations, flags = _a.flags;
|
|
if (flags & (1536 | 64 | 384)) {
|
|
continue;
|
|
}
|
|
var exportedDeclarationsCount = ts.countWhere(declarations, isNotOverload);
|
|
if (flags & 524288 && exportedDeclarationsCount <= 2) {
|
|
continue;
|
|
}
|
|
if (exportedDeclarationsCount > 1) {
|
|
for (var _i = 0, declarations_6 = declarations; _i < declarations_6.length; _i++) {
|
|
var declaration = declarations_6[_i];
|
|
if (isNotOverload(declaration)) {
|
|
diagnostics.add(ts.createDiagnosticForNode(declaration, ts.Diagnostics.Cannot_redeclare_exported_variable_0, id));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
links.exportsChecked = true;
|
|
}
|
|
function isNotOverload(declaration) {
|
|
return declaration.kind !== 220 || !!declaration.body;
|
|
}
|
|
}
|
|
function checkSourceElement(node) {
|
|
if (!node) {
|
|
return;
|
|
}
|
|
var kind = node.kind;
|
|
if (cancellationToken) {
|
|
switch (kind) {
|
|
case 225:
|
|
case 221:
|
|
case 222:
|
|
case 220:
|
|
cancellationToken.throwIfCancellationRequested();
|
|
}
|
|
}
|
|
switch (kind) {
|
|
case 141:
|
|
return checkTypeParameter(node);
|
|
case 142:
|
|
return checkParameter(node);
|
|
case 145:
|
|
case 144:
|
|
return checkPropertyDeclaration(node);
|
|
case 156:
|
|
case 157:
|
|
case 151:
|
|
case 152:
|
|
return checkSignatureDeclaration(node);
|
|
case 153:
|
|
return checkSignatureDeclaration(node);
|
|
case 147:
|
|
case 146:
|
|
return checkMethodDeclaration(node);
|
|
case 148:
|
|
return checkConstructorDeclaration(node);
|
|
case 149:
|
|
case 150:
|
|
return checkAccessorDeclaration(node);
|
|
case 155:
|
|
return checkTypeReferenceNode(node);
|
|
case 154:
|
|
return checkTypePredicate(node);
|
|
case 158:
|
|
return checkTypeQuery(node);
|
|
case 159:
|
|
return checkTypeLiteral(node);
|
|
case 160:
|
|
return checkArrayType(node);
|
|
case 161:
|
|
return checkTupleType(node);
|
|
case 162:
|
|
case 163:
|
|
return checkUnionOrIntersectionType(node);
|
|
case 164:
|
|
return checkSourceElement(node.type);
|
|
case 220:
|
|
return checkFunctionDeclaration(node);
|
|
case 199:
|
|
case 226:
|
|
return checkBlock(node);
|
|
case 200:
|
|
return checkVariableStatement(node);
|
|
case 202:
|
|
return checkExpressionStatement(node);
|
|
case 203:
|
|
return checkIfStatement(node);
|
|
case 204:
|
|
return checkDoStatement(node);
|
|
case 205:
|
|
return checkWhileStatement(node);
|
|
case 206:
|
|
return checkForStatement(node);
|
|
case 207:
|
|
return checkForInStatement(node);
|
|
case 208:
|
|
return checkForOfStatement(node);
|
|
case 209:
|
|
case 210:
|
|
return checkBreakOrContinueStatement(node);
|
|
case 211:
|
|
return checkReturnStatement(node);
|
|
case 212:
|
|
return checkWithStatement(node);
|
|
case 213:
|
|
return checkSwitchStatement(node);
|
|
case 214:
|
|
return checkLabeledStatement(node);
|
|
case 215:
|
|
return checkThrowStatement(node);
|
|
case 216:
|
|
return checkTryStatement(node);
|
|
case 218:
|
|
return checkVariableDeclaration(node);
|
|
case 169:
|
|
return checkBindingElement(node);
|
|
case 221:
|
|
return checkClassDeclaration(node);
|
|
case 222:
|
|
return checkInterfaceDeclaration(node);
|
|
case 223:
|
|
return checkTypeAliasDeclaration(node);
|
|
case 224:
|
|
return checkEnumDeclaration(node);
|
|
case 225:
|
|
return checkModuleDeclaration(node);
|
|
case 230:
|
|
return checkImportDeclaration(node);
|
|
case 229:
|
|
return checkImportEqualsDeclaration(node);
|
|
case 236:
|
|
return checkExportDeclaration(node);
|
|
case 235:
|
|
return checkExportAssignment(node);
|
|
case 201:
|
|
checkGrammarStatementInAmbientContext(node);
|
|
return;
|
|
case 217:
|
|
checkGrammarStatementInAmbientContext(node);
|
|
return;
|
|
case 239:
|
|
return checkMissingDeclaration(node);
|
|
}
|
|
}
|
|
function checkNodeDeferred(node) {
|
|
if (deferredNodes) {
|
|
deferredNodes.push(node);
|
|
}
|
|
}
|
|
function checkDeferredNodes() {
|
|
for (var _i = 0, deferredNodes_1 = deferredNodes; _i < deferredNodes_1.length; _i++) {
|
|
var node = deferredNodes_1[_i];
|
|
switch (node.kind) {
|
|
case 179:
|
|
case 180:
|
|
case 147:
|
|
case 146:
|
|
checkFunctionExpressionOrObjectLiteralMethodDeferred(node);
|
|
break;
|
|
case 149:
|
|
case 150:
|
|
checkAccessorDeferred(node);
|
|
break;
|
|
case 192:
|
|
checkClassExpressionDeferred(node);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function checkSourceFile(node) {
|
|
var start = new Date().getTime();
|
|
checkSourceFileWorker(node);
|
|
ts.checkTime += new Date().getTime() - start;
|
|
}
|
|
function checkSourceFileWorker(node) {
|
|
var links = getNodeLinks(node);
|
|
if (!(links.flags & 1)) {
|
|
if (compilerOptions.skipLibCheck && node.isDeclarationFile || compilerOptions.skipDefaultLibCheck && node.hasNoDefaultLib) {
|
|
return;
|
|
}
|
|
checkGrammarSourceFile(node);
|
|
potentialThisCollisions.length = 0;
|
|
deferredNodes = [];
|
|
deferredUnusedIdentifierNodes = produceDiagnostics && noUnusedIdentifiers ? [] : undefined;
|
|
ts.forEach(node.statements, checkSourceElement);
|
|
checkDeferredNodes();
|
|
if (ts.isExternalModule(node)) {
|
|
registerForUnusedIdentifiersCheck(node);
|
|
}
|
|
if (!node.isDeclarationFile) {
|
|
checkUnusedIdentifiers();
|
|
}
|
|
deferredNodes = undefined;
|
|
deferredUnusedIdentifierNodes = undefined;
|
|
if (ts.isExternalOrCommonJsModule(node)) {
|
|
checkExternalModuleExports(node);
|
|
}
|
|
if (potentialThisCollisions.length) {
|
|
ts.forEach(potentialThisCollisions, checkIfThisIsCapturedInEnclosingScope);
|
|
potentialThisCollisions.length = 0;
|
|
}
|
|
links.flags |= 1;
|
|
}
|
|
}
|
|
function getDiagnostics(sourceFile, ct) {
|
|
try {
|
|
cancellationToken = ct;
|
|
return getDiagnosticsWorker(sourceFile);
|
|
}
|
|
finally {
|
|
cancellationToken = undefined;
|
|
}
|
|
}
|
|
function getDiagnosticsWorker(sourceFile) {
|
|
throwIfNonDiagnosticsProducing();
|
|
if (sourceFile) {
|
|
checkSourceFile(sourceFile);
|
|
return diagnostics.getDiagnostics(sourceFile.fileName);
|
|
}
|
|
ts.forEach(host.getSourceFiles(), checkSourceFile);
|
|
return diagnostics.getDiagnostics();
|
|
}
|
|
function getGlobalDiagnostics() {
|
|
throwIfNonDiagnosticsProducing();
|
|
return diagnostics.getGlobalDiagnostics();
|
|
}
|
|
function throwIfNonDiagnosticsProducing() {
|
|
if (!produceDiagnostics) {
|
|
throw new Error("Trying to get diagnostics from a type checker that does not produce them.");
|
|
}
|
|
}
|
|
function isInsideWithStatementBody(node) {
|
|
if (node) {
|
|
while (node.parent) {
|
|
if (node.parent.kind === 212 && node.parent.statement === node) {
|
|
return true;
|
|
}
|
|
node = node.parent;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function getSymbolsInScope(location, meaning) {
|
|
var symbols = {};
|
|
var memberFlags = 0;
|
|
if (isInsideWithStatementBody(location)) {
|
|
return [];
|
|
}
|
|
populateSymbols();
|
|
return symbolsToArray(symbols);
|
|
function populateSymbols() {
|
|
while (location) {
|
|
if (location.locals && !isGlobalSourceFile(location)) {
|
|
copySymbols(location.locals, meaning);
|
|
}
|
|
switch (location.kind) {
|
|
case 256:
|
|
if (!ts.isExternalOrCommonJsModule(location)) {
|
|
break;
|
|
}
|
|
case 225:
|
|
copySymbols(getSymbolOfNode(location).exports, meaning & 8914931);
|
|
break;
|
|
case 224:
|
|
copySymbols(getSymbolOfNode(location).exports, meaning & 8);
|
|
break;
|
|
case 192:
|
|
var className = location.name;
|
|
if (className) {
|
|
copySymbol(location.symbol, meaning);
|
|
}
|
|
case 221:
|
|
case 222:
|
|
if (!(memberFlags & 32)) {
|
|
copySymbols(getSymbolOfNode(location).members, meaning & 793056);
|
|
}
|
|
break;
|
|
case 179:
|
|
var funcName = location.name;
|
|
if (funcName) {
|
|
copySymbol(location.symbol, meaning);
|
|
}
|
|
break;
|
|
}
|
|
if (ts.introducesArgumentsExoticObject(location)) {
|
|
copySymbol(argumentsSymbol, meaning);
|
|
}
|
|
memberFlags = location.flags;
|
|
location = location.parent;
|
|
}
|
|
copySymbols(globals, meaning);
|
|
}
|
|
function copySymbol(symbol, meaning) {
|
|
if (symbol.flags & meaning) {
|
|
var id = symbol.name;
|
|
if (!ts.hasProperty(symbols, id)) {
|
|
symbols[id] = symbol;
|
|
}
|
|
}
|
|
}
|
|
function copySymbols(source, meaning) {
|
|
if (meaning) {
|
|
for (var id in source) {
|
|
var symbol = source[id];
|
|
copySymbol(symbol, meaning);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function isTypeDeclarationName(name) {
|
|
return name.kind === 69 &&
|
|
isTypeDeclaration(name.parent) &&
|
|
name.parent.name === name;
|
|
}
|
|
function isTypeDeclaration(node) {
|
|
switch (node.kind) {
|
|
case 141:
|
|
case 221:
|
|
case 222:
|
|
case 223:
|
|
case 224:
|
|
return true;
|
|
}
|
|
}
|
|
function isTypeReferenceIdentifier(entityName) {
|
|
var node = entityName;
|
|
while (node.parent && node.parent.kind === 139) {
|
|
node = node.parent;
|
|
}
|
|
return node.parent && (node.parent.kind === 155 || node.parent.kind === 267);
|
|
}
|
|
function isHeritageClauseElementIdentifier(entityName) {
|
|
var node = entityName;
|
|
while (node.parent && node.parent.kind === 172) {
|
|
node = node.parent;
|
|
}
|
|
return node.parent && node.parent.kind === 194;
|
|
}
|
|
function forEachEnclosingClass(node, callback) {
|
|
var result;
|
|
while (true) {
|
|
node = ts.getContainingClass(node);
|
|
if (!node)
|
|
break;
|
|
if (result = callback(node))
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
function isNodeWithinClass(node, classDeclaration) {
|
|
return !!forEachEnclosingClass(node, function (n) { return n === classDeclaration; });
|
|
}
|
|
function getLeftSideOfImportEqualsOrExportAssignment(nodeOnRightSide) {
|
|
while (nodeOnRightSide.parent.kind === 139) {
|
|
nodeOnRightSide = nodeOnRightSide.parent;
|
|
}
|
|
if (nodeOnRightSide.parent.kind === 229) {
|
|
return nodeOnRightSide.parent.moduleReference === nodeOnRightSide && nodeOnRightSide.parent;
|
|
}
|
|
if (nodeOnRightSide.parent.kind === 235) {
|
|
return nodeOnRightSide.parent.expression === nodeOnRightSide && nodeOnRightSide.parent;
|
|
}
|
|
return undefined;
|
|
}
|
|
function isInRightSideOfImportOrExportAssignment(node) {
|
|
return getLeftSideOfImportEqualsOrExportAssignment(node) !== undefined;
|
|
}
|
|
function getSymbolOfEntityNameOrPropertyAccessExpression(entityName) {
|
|
if (ts.isDeclarationName(entityName)) {
|
|
return getSymbolOfNode(entityName.parent);
|
|
}
|
|
if (ts.isInJavaScriptFile(entityName) && entityName.parent.kind === 172) {
|
|
var specialPropertyAssignmentKind = ts.getSpecialPropertyAssignmentKind(entityName.parent.parent);
|
|
switch (specialPropertyAssignmentKind) {
|
|
case 1:
|
|
case 3:
|
|
return getSymbolOfNode(entityName.parent);
|
|
case 4:
|
|
case 2:
|
|
return getSymbolOfNode(entityName.parent.parent);
|
|
default:
|
|
}
|
|
}
|
|
if (entityName.parent.kind === 235) {
|
|
return resolveEntityName(entityName, 107455 | 793056 | 1536 | 8388608);
|
|
}
|
|
if (entityName.kind !== 172) {
|
|
if (isInRightSideOfImportOrExportAssignment(entityName)) {
|
|
var importEqualsDeclaration = ts.getAncestor(entityName, 229);
|
|
ts.Debug.assert(importEqualsDeclaration !== undefined);
|
|
return getSymbolOfPartOfRightHandSideOfImportEquals(entityName, importEqualsDeclaration, true);
|
|
}
|
|
}
|
|
if (ts.isRightSideOfQualifiedNameOrPropertyAccess(entityName)) {
|
|
entityName = entityName.parent;
|
|
}
|
|
if (isHeritageClauseElementIdentifier(entityName)) {
|
|
var meaning = 0;
|
|
if (entityName.parent.kind === 194) {
|
|
meaning = 793056;
|
|
if (ts.isExpressionWithTypeArgumentsInClassExtendsClause(entityName.parent)) {
|
|
meaning |= 107455;
|
|
}
|
|
}
|
|
else {
|
|
meaning = 1536;
|
|
}
|
|
meaning |= 8388608;
|
|
return resolveEntityName(entityName, meaning);
|
|
}
|
|
else if (ts.isExpression(entityName)) {
|
|
if (ts.nodeIsMissing(entityName)) {
|
|
return undefined;
|
|
}
|
|
if (entityName.kind === 69) {
|
|
if (ts.isJSXTagName(entityName) && isJsxIntrinsicIdentifier(entityName)) {
|
|
return getIntrinsicTagSymbol(entityName.parent);
|
|
}
|
|
return resolveEntityName(entityName, 107455, false, true);
|
|
}
|
|
else if (entityName.kind === 172) {
|
|
var symbol = getNodeLinks(entityName).resolvedSymbol;
|
|
if (!symbol) {
|
|
checkPropertyAccessExpression(entityName);
|
|
}
|
|
return getNodeLinks(entityName).resolvedSymbol;
|
|
}
|
|
else if (entityName.kind === 139) {
|
|
var symbol = getNodeLinks(entityName).resolvedSymbol;
|
|
if (!symbol) {
|
|
checkQualifiedName(entityName);
|
|
}
|
|
return getNodeLinks(entityName).resolvedSymbol;
|
|
}
|
|
}
|
|
else if (isTypeReferenceIdentifier(entityName)) {
|
|
var meaning = (entityName.parent.kind === 155 || entityName.parent.kind === 267) ? 793056 : 1536;
|
|
return resolveEntityName(entityName, meaning, false, true);
|
|
}
|
|
else if (entityName.parent.kind === 246) {
|
|
return getJsxAttributePropertySymbol(entityName.parent);
|
|
}
|
|
if (entityName.parent.kind === 154) {
|
|
return resolveEntityName(entityName, 1);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getSymbolAtLocation(node) {
|
|
if (node.kind === 256) {
|
|
return ts.isExternalModule(node) ? getMergedSymbol(node.symbol) : undefined;
|
|
}
|
|
if (isInsideWithStatementBody(node)) {
|
|
return undefined;
|
|
}
|
|
if (ts.isDeclarationName(node)) {
|
|
return getSymbolOfNode(node.parent);
|
|
}
|
|
else if (ts.isLiteralComputedPropertyDeclarationName(node)) {
|
|
return getSymbolOfNode(node.parent.parent);
|
|
}
|
|
if (node.kind === 69) {
|
|
if (isInRightSideOfImportOrExportAssignment(node)) {
|
|
return getSymbolOfEntityNameOrPropertyAccessExpression(node);
|
|
}
|
|
else if (node.parent.kind === 169 &&
|
|
node.parent.parent.kind === 167 &&
|
|
node === node.parent.propertyName) {
|
|
var typeOfPattern = getTypeOfNode(node.parent.parent);
|
|
var propertyDeclaration = typeOfPattern && getPropertyOfType(typeOfPattern, node.text);
|
|
if (propertyDeclaration) {
|
|
return propertyDeclaration;
|
|
}
|
|
}
|
|
}
|
|
switch (node.kind) {
|
|
case 69:
|
|
case 172:
|
|
case 139:
|
|
return getSymbolOfEntityNameOrPropertyAccessExpression(node);
|
|
case 97:
|
|
var container = ts.getThisContainer(node, false);
|
|
if (ts.isFunctionLike(container)) {
|
|
var sig = getSignatureFromDeclaration(container);
|
|
if (sig.thisParameter) {
|
|
return sig.thisParameter;
|
|
}
|
|
}
|
|
case 95:
|
|
var type = ts.isExpression(node) ? checkExpression(node) : getTypeFromTypeNode(node);
|
|
return type.symbol;
|
|
case 165:
|
|
return getTypeFromTypeNode(node).symbol;
|
|
case 121:
|
|
var constructorDeclaration = node.parent;
|
|
if (constructorDeclaration && constructorDeclaration.kind === 148) {
|
|
return constructorDeclaration.parent.symbol;
|
|
}
|
|
return undefined;
|
|
case 9:
|
|
if ((ts.isExternalModuleImportEqualsDeclaration(node.parent.parent) &&
|
|
ts.getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) ||
|
|
((node.parent.kind === 230 || node.parent.kind === 236) &&
|
|
node.parent.moduleSpecifier === node)) {
|
|
return resolveExternalModuleName(node, node);
|
|
}
|
|
case 8:
|
|
if (node.parent.kind === 173 && node.parent.argumentExpression === node) {
|
|
var objectType = checkExpression(node.parent.expression);
|
|
if (objectType === unknownType)
|
|
return undefined;
|
|
var apparentType = getApparentType(objectType);
|
|
if (apparentType === unknownType)
|
|
return undefined;
|
|
return getPropertyOfType(apparentType, node.text);
|
|
}
|
|
break;
|
|
}
|
|
return undefined;
|
|
}
|
|
function getShorthandAssignmentValueSymbol(location) {
|
|
if (location && location.kind === 254) {
|
|
return resolveEntityName(location.name, 107455 | 8388608);
|
|
}
|
|
return undefined;
|
|
}
|
|
function getExportSpecifierLocalTargetSymbol(node) {
|
|
return node.parent.parent.moduleSpecifier ?
|
|
getExternalModuleMember(node.parent.parent, node) :
|
|
resolveEntityName(node.propertyName || node.name, 107455 | 793056 | 1536 | 8388608);
|
|
}
|
|
function getTypeOfNode(node) {
|
|
if (isInsideWithStatementBody(node)) {
|
|
return unknownType;
|
|
}
|
|
if (ts.isTypeNode(node)) {
|
|
return getTypeFromTypeNode(node);
|
|
}
|
|
if (ts.isExpression(node)) {
|
|
return getTypeOfExpression(node);
|
|
}
|
|
if (ts.isExpressionWithTypeArgumentsInClassExtendsClause(node)) {
|
|
return getBaseTypes(getDeclaredTypeOfSymbol(getSymbolOfNode(node.parent.parent)))[0];
|
|
}
|
|
if (isTypeDeclaration(node)) {
|
|
var symbol = getSymbolOfNode(node);
|
|
return getDeclaredTypeOfSymbol(symbol);
|
|
}
|
|
if (isTypeDeclarationName(node)) {
|
|
var symbol = getSymbolAtLocation(node);
|
|
return symbol && getDeclaredTypeOfSymbol(symbol);
|
|
}
|
|
if (ts.isDeclaration(node)) {
|
|
var symbol = getSymbolOfNode(node);
|
|
return getTypeOfSymbol(symbol);
|
|
}
|
|
if (ts.isDeclarationName(node)) {
|
|
var symbol = getSymbolAtLocation(node);
|
|
return symbol && getTypeOfSymbol(symbol);
|
|
}
|
|
if (ts.isBindingPattern(node)) {
|
|
return getTypeForVariableLikeDeclaration(node.parent, true);
|
|
}
|
|
if (isInRightSideOfImportOrExportAssignment(node)) {
|
|
var symbol = getSymbolAtLocation(node);
|
|
var declaredType = symbol && getDeclaredTypeOfSymbol(symbol);
|
|
return declaredType !== unknownType ? declaredType : getTypeOfSymbol(symbol);
|
|
}
|
|
return unknownType;
|
|
}
|
|
function getTypeOfArrayLiteralOrObjectLiteralDestructuringAssignment(expr) {
|
|
ts.Debug.assert(expr.kind === 171 || expr.kind === 170);
|
|
if (expr.parent.kind === 208) {
|
|
var iteratedType = checkRightHandSideOfForOf(expr.parent.expression);
|
|
return checkDestructuringAssignment(expr, iteratedType || unknownType);
|
|
}
|
|
if (expr.parent.kind === 187) {
|
|
var iteratedType = checkExpression(expr.parent.right);
|
|
return checkDestructuringAssignment(expr, iteratedType || unknownType);
|
|
}
|
|
if (expr.parent.kind === 253) {
|
|
var typeOfParentObjectLiteral = getTypeOfArrayLiteralOrObjectLiteralDestructuringAssignment(expr.parent.parent);
|
|
return checkObjectLiteralDestructuringPropertyAssignment(typeOfParentObjectLiteral || unknownType, expr.parent);
|
|
}
|
|
ts.Debug.assert(expr.parent.kind === 170);
|
|
var typeOfArrayLiteral = getTypeOfArrayLiteralOrObjectLiteralDestructuringAssignment(expr.parent);
|
|
var elementType = checkIteratedTypeOrElementType(typeOfArrayLiteral || unknownType, expr.parent, false) || unknownType;
|
|
return checkArrayLiteralDestructuringElementAssignment(expr.parent, typeOfArrayLiteral, ts.indexOf(expr.parent.elements, expr), elementType || unknownType);
|
|
}
|
|
function getPropertySymbolOfDestructuringAssignment(location) {
|
|
var typeOfObjectLiteral = getTypeOfArrayLiteralOrObjectLiteralDestructuringAssignment(location.parent.parent);
|
|
return typeOfObjectLiteral && getPropertyOfType(typeOfObjectLiteral, location.text);
|
|
}
|
|
function getTypeOfExpression(expr) {
|
|
if (ts.isRightSideOfQualifiedNameOrPropertyAccess(expr)) {
|
|
expr = expr.parent;
|
|
}
|
|
return checkExpression(expr);
|
|
}
|
|
function getParentTypeOfClassElement(node) {
|
|
var classSymbol = getSymbolOfNode(node.parent);
|
|
return node.flags & 32
|
|
? getTypeOfSymbol(classSymbol)
|
|
: getDeclaredTypeOfSymbol(classSymbol);
|
|
}
|
|
function getAugmentedPropertiesOfType(type) {
|
|
type = getApparentType(type);
|
|
var propsByName = createSymbolTable(getPropertiesOfType(type));
|
|
if (getSignaturesOfType(type, 0).length || getSignaturesOfType(type, 1).length) {
|
|
ts.forEach(getPropertiesOfType(globalFunctionType), function (p) {
|
|
if (!ts.hasProperty(propsByName, p.name)) {
|
|
propsByName[p.name] = p;
|
|
}
|
|
});
|
|
}
|
|
return getNamedMembers(propsByName);
|
|
}
|
|
function getRootSymbols(symbol) {
|
|
if (symbol.flags & 268435456) {
|
|
var symbols_3 = [];
|
|
var name_20 = symbol.name;
|
|
ts.forEach(getSymbolLinks(symbol).containingType.types, function (t) {
|
|
var symbol = getPropertyOfType(t, name_20);
|
|
if (symbol) {
|
|
symbols_3.push(symbol);
|
|
}
|
|
});
|
|
return symbols_3;
|
|
}
|
|
else if (symbol.flags & 67108864) {
|
|
var target = void 0;
|
|
var next = symbol;
|
|
while (next = getSymbolLinks(next).target) {
|
|
target = next;
|
|
}
|
|
if (target) {
|
|
return [target];
|
|
}
|
|
}
|
|
return [symbol];
|
|
}
|
|
function isArgumentsLocalBinding(node) {
|
|
return getReferencedValueSymbol(node) === argumentsSymbol;
|
|
}
|
|
function moduleExportsSomeValue(moduleReferenceExpression) {
|
|
var moduleSymbol = resolveExternalModuleName(moduleReferenceExpression.parent, moduleReferenceExpression);
|
|
if (!moduleSymbol) {
|
|
return true;
|
|
}
|
|
var hasExportAssignment = hasExportAssignmentSymbol(moduleSymbol);
|
|
moduleSymbol = resolveExternalModuleSymbol(moduleSymbol);
|
|
var symbolLinks = getSymbolLinks(moduleSymbol);
|
|
if (symbolLinks.exportsSomeValue === undefined) {
|
|
symbolLinks.exportsSomeValue = hasExportAssignment
|
|
? !!(moduleSymbol.flags & 107455)
|
|
: ts.forEachValue(getExportsOfModule(moduleSymbol), isValue);
|
|
}
|
|
return symbolLinks.exportsSomeValue;
|
|
function isValue(s) {
|
|
s = resolveSymbol(s);
|
|
return s && !!(s.flags & 107455);
|
|
}
|
|
}
|
|
function getReferencedExportContainer(node) {
|
|
var symbol = getReferencedValueSymbol(node);
|
|
if (symbol) {
|
|
if (symbol.flags & 1048576) {
|
|
var exportSymbol = getMergedSymbol(symbol.exportSymbol);
|
|
if (exportSymbol.flags & 944) {
|
|
return undefined;
|
|
}
|
|
symbol = exportSymbol;
|
|
}
|
|
var parentSymbol = getParentOfSymbol(symbol);
|
|
if (parentSymbol) {
|
|
if (parentSymbol.flags & 512 && parentSymbol.valueDeclaration.kind === 256) {
|
|
if (parentSymbol.valueDeclaration === ts.getSourceFileOfNode(node)) {
|
|
return parentSymbol.valueDeclaration;
|
|
}
|
|
}
|
|
for (var n = node.parent; n; n = n.parent) {
|
|
if ((n.kind === 225 || n.kind === 224) && getSymbolOfNode(n) === parentSymbol) {
|
|
return n;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getReferencedImportDeclaration(node) {
|
|
var symbol = getReferencedValueSymbol(node);
|
|
return symbol && symbol.flags & 8388608 ? getDeclarationOfAliasSymbol(symbol) : undefined;
|
|
}
|
|
function isSymbolOfDeclarationWithCollidingName(symbol) {
|
|
if (symbol.flags & 418) {
|
|
var links = getSymbolLinks(symbol);
|
|
if (links.isDeclarationWithCollidingName === undefined) {
|
|
var container = ts.getEnclosingBlockScopeContainer(symbol.valueDeclaration);
|
|
if (ts.isStatementWithLocals(container)) {
|
|
var nodeLinks_1 = getNodeLinks(symbol.valueDeclaration);
|
|
if (!!resolveName(container.parent, symbol.name, 107455, undefined, undefined)) {
|
|
links.isDeclarationWithCollidingName = true;
|
|
}
|
|
else if (nodeLinks_1.flags & 131072) {
|
|
var isDeclaredInLoop = nodeLinks_1.flags & 262144;
|
|
var inLoopInitializer = ts.isIterationStatement(container, false);
|
|
var inLoopBodyBlock = container.kind === 199 && ts.isIterationStatement(container.parent, false);
|
|
links.isDeclarationWithCollidingName = !ts.isBlockScopedContainerTopLevel(container) && (!isDeclaredInLoop || (!inLoopInitializer && !inLoopBodyBlock));
|
|
}
|
|
else {
|
|
links.isDeclarationWithCollidingName = false;
|
|
}
|
|
}
|
|
}
|
|
return links.isDeclarationWithCollidingName;
|
|
}
|
|
return false;
|
|
}
|
|
function getReferencedDeclarationWithCollidingName(node) {
|
|
var symbol = getReferencedValueSymbol(node);
|
|
return symbol && isSymbolOfDeclarationWithCollidingName(symbol) ? symbol.valueDeclaration : undefined;
|
|
}
|
|
function isDeclarationWithCollidingName(node) {
|
|
return isSymbolOfDeclarationWithCollidingName(getSymbolOfNode(node));
|
|
}
|
|
function isValueAliasDeclaration(node) {
|
|
switch (node.kind) {
|
|
case 229:
|
|
case 231:
|
|
case 232:
|
|
case 234:
|
|
case 238:
|
|
return isAliasResolvedToValue(getSymbolOfNode(node));
|
|
case 236:
|
|
var exportClause = node.exportClause;
|
|
return exportClause && ts.forEach(exportClause.elements, isValueAliasDeclaration);
|
|
case 235:
|
|
return node.expression && node.expression.kind === 69 ? isAliasResolvedToValue(getSymbolOfNode(node)) : true;
|
|
}
|
|
return false;
|
|
}
|
|
function isTopLevelValueImportEqualsWithEntityName(node) {
|
|
if (node.parent.kind !== 256 || !ts.isInternalModuleImportEqualsDeclaration(node)) {
|
|
return false;
|
|
}
|
|
var isValue = isAliasResolvedToValue(getSymbolOfNode(node));
|
|
return isValue && node.moduleReference && !ts.nodeIsMissing(node.moduleReference);
|
|
}
|
|
function isAliasResolvedToValue(symbol) {
|
|
var target = resolveAlias(symbol);
|
|
if (target === unknownSymbol) {
|
|
return true;
|
|
}
|
|
return target.flags & 107455 &&
|
|
(compilerOptions.preserveConstEnums || !isConstEnumOrConstEnumOnlyModule(target));
|
|
}
|
|
function isConstEnumOrConstEnumOnlyModule(s) {
|
|
return isConstEnumSymbol(s) || s.constEnumOnlyModule;
|
|
}
|
|
function isReferencedAliasDeclaration(node, checkChildren) {
|
|
if (ts.isAliasSymbolDeclaration(node)) {
|
|
var symbol = getSymbolOfNode(node);
|
|
if (getSymbolLinks(symbol).referenced) {
|
|
return true;
|
|
}
|
|
}
|
|
if (checkChildren) {
|
|
return ts.forEachChild(node, function (node) { return isReferencedAliasDeclaration(node, checkChildren); });
|
|
}
|
|
return false;
|
|
}
|
|
function isImplementationOfOverload(node) {
|
|
if (ts.nodeIsPresent(node.body)) {
|
|
var symbol = getSymbolOfNode(node);
|
|
var signaturesOfSymbol = getSignaturesOfSymbol(symbol);
|
|
return signaturesOfSymbol.length > 1 ||
|
|
(signaturesOfSymbol.length === 1 && signaturesOfSymbol[0].declaration !== node);
|
|
}
|
|
return false;
|
|
}
|
|
function getNodeCheckFlags(node) {
|
|
return getNodeLinks(node).flags;
|
|
}
|
|
function getEnumMemberValue(node) {
|
|
computeEnumMemberValues(node.parent);
|
|
return getNodeLinks(node).enumMemberValue;
|
|
}
|
|
function getConstantValue(node) {
|
|
if (node.kind === 255) {
|
|
return getEnumMemberValue(node);
|
|
}
|
|
var symbol = getNodeLinks(node).resolvedSymbol;
|
|
if (symbol && (symbol.flags & 8)) {
|
|
if (ts.isConstEnumDeclaration(symbol.valueDeclaration.parent)) {
|
|
return getEnumMemberValue(symbol.valueDeclaration);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function isFunctionType(type) {
|
|
return type.flags & 80896 && getSignaturesOfType(type, 0).length > 0;
|
|
}
|
|
function getTypeReferenceSerializationKind(typeName) {
|
|
var valueSymbol = resolveEntityName(typeName, 107455, true);
|
|
var constructorType = valueSymbol ? getTypeOfSymbol(valueSymbol) : undefined;
|
|
if (constructorType && isConstructorType(constructorType)) {
|
|
return ts.TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue;
|
|
}
|
|
var typeSymbol = resolveEntityName(typeName, 793056, true);
|
|
if (!typeSymbol) {
|
|
return ts.TypeReferenceSerializationKind.ObjectType;
|
|
}
|
|
var type = getDeclaredTypeOfSymbol(typeSymbol);
|
|
if (type === unknownType) {
|
|
return ts.TypeReferenceSerializationKind.Unknown;
|
|
}
|
|
else if (type.flags & 1) {
|
|
return ts.TypeReferenceSerializationKind.ObjectType;
|
|
}
|
|
else if (isTypeOfKind(type, 16)) {
|
|
return ts.TypeReferenceSerializationKind.VoidType;
|
|
}
|
|
else if (isTypeOfKind(type, 8)) {
|
|
return ts.TypeReferenceSerializationKind.BooleanType;
|
|
}
|
|
else if (isTypeOfKind(type, 132)) {
|
|
return ts.TypeReferenceSerializationKind.NumberLikeType;
|
|
}
|
|
else if (isTypeOfKind(type, 258)) {
|
|
return ts.TypeReferenceSerializationKind.StringLikeType;
|
|
}
|
|
else if (isTypeOfKind(type, 8192)) {
|
|
return ts.TypeReferenceSerializationKind.ArrayLikeType;
|
|
}
|
|
else if (isTypeOfKind(type, 16777216)) {
|
|
return ts.TypeReferenceSerializationKind.ESSymbolType;
|
|
}
|
|
else if (isFunctionType(type)) {
|
|
return ts.TypeReferenceSerializationKind.TypeWithCallSignature;
|
|
}
|
|
else if (isArrayType(type)) {
|
|
return ts.TypeReferenceSerializationKind.ArrayLikeType;
|
|
}
|
|
else {
|
|
return ts.TypeReferenceSerializationKind.ObjectType;
|
|
}
|
|
}
|
|
function writeTypeOfDeclaration(declaration, enclosingDeclaration, flags, writer) {
|
|
var symbol = getSymbolOfNode(declaration);
|
|
var type = symbol && !(symbol.flags & (2048 | 131072))
|
|
? getTypeOfSymbol(symbol)
|
|
: unknownType;
|
|
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
|
|
}
|
|
function writeReturnTypeOfSignatureDeclaration(signatureDeclaration, enclosingDeclaration, flags, writer) {
|
|
var signature = getSignatureFromDeclaration(signatureDeclaration);
|
|
getSymbolDisplayBuilder().buildTypeDisplay(getReturnTypeOfSignature(signature), writer, enclosingDeclaration, flags);
|
|
}
|
|
function writeTypeOfExpression(expr, enclosingDeclaration, flags, writer) {
|
|
var type = getWidenedType(getTypeOfExpression(expr));
|
|
getSymbolDisplayBuilder().buildTypeDisplay(type, writer, enclosingDeclaration, flags);
|
|
}
|
|
function writeBaseConstructorTypeOfClass(node, enclosingDeclaration, flags, writer) {
|
|
var classType = getDeclaredTypeOfSymbol(getSymbolOfNode(node));
|
|
resolveBaseTypesOfClass(classType);
|
|
var baseType = classType.resolvedBaseTypes.length ? classType.resolvedBaseTypes[0] : unknownType;
|
|
getSymbolDisplayBuilder().buildTypeDisplay(baseType, writer, enclosingDeclaration, flags);
|
|
}
|
|
function hasGlobalName(name) {
|
|
return ts.hasProperty(globals, name);
|
|
}
|
|
function getReferencedValueSymbol(reference) {
|
|
return getNodeLinks(reference).resolvedSymbol ||
|
|
resolveName(reference, reference.text, 107455 | 1048576 | 8388608, undefined, undefined);
|
|
}
|
|
function getReferencedValueDeclaration(reference) {
|
|
ts.Debug.assert(!ts.nodeIsSynthesized(reference));
|
|
var symbol = getReferencedValueSymbol(reference);
|
|
return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration;
|
|
}
|
|
function createResolver() {
|
|
var resolvedTypeReferenceDirectives = host.getResolvedTypeReferenceDirectives();
|
|
var fileToDirective;
|
|
if (resolvedTypeReferenceDirectives) {
|
|
fileToDirective = ts.createFileMap();
|
|
for (var key in resolvedTypeReferenceDirectives) {
|
|
if (!ts.hasProperty(resolvedTypeReferenceDirectives, key)) {
|
|
continue;
|
|
}
|
|
var resolvedDirective = resolvedTypeReferenceDirectives[key];
|
|
if (!resolvedDirective) {
|
|
continue;
|
|
}
|
|
var file = host.getSourceFile(resolvedDirective.resolvedFileName);
|
|
fileToDirective.set(file.path, key);
|
|
}
|
|
}
|
|
return {
|
|
getReferencedExportContainer: getReferencedExportContainer,
|
|
getReferencedImportDeclaration: getReferencedImportDeclaration,
|
|
getReferencedDeclarationWithCollidingName: getReferencedDeclarationWithCollidingName,
|
|
isDeclarationWithCollidingName: isDeclarationWithCollidingName,
|
|
isValueAliasDeclaration: isValueAliasDeclaration,
|
|
hasGlobalName: hasGlobalName,
|
|
isReferencedAliasDeclaration: isReferencedAliasDeclaration,
|
|
getNodeCheckFlags: getNodeCheckFlags,
|
|
isTopLevelValueImportEqualsWithEntityName: isTopLevelValueImportEqualsWithEntityName,
|
|
isDeclarationVisible: isDeclarationVisible,
|
|
isImplementationOfOverload: isImplementationOfOverload,
|
|
writeTypeOfDeclaration: writeTypeOfDeclaration,
|
|
writeReturnTypeOfSignatureDeclaration: writeReturnTypeOfSignatureDeclaration,
|
|
writeTypeOfExpression: writeTypeOfExpression,
|
|
writeBaseConstructorTypeOfClass: writeBaseConstructorTypeOfClass,
|
|
isSymbolAccessible: isSymbolAccessible,
|
|
isEntityNameVisible: isEntityNameVisible,
|
|
getConstantValue: getConstantValue,
|
|
collectLinkedAliases: collectLinkedAliases,
|
|
getReferencedValueDeclaration: getReferencedValueDeclaration,
|
|
getTypeReferenceSerializationKind: getTypeReferenceSerializationKind,
|
|
isOptionalParameter: isOptionalParameter,
|
|
moduleExportsSomeValue: moduleExportsSomeValue,
|
|
isArgumentsLocalBinding: isArgumentsLocalBinding,
|
|
getExternalModuleFileFromDeclaration: getExternalModuleFileFromDeclaration,
|
|
getTypeReferenceDirectivesForEntityName: getTypeReferenceDirectivesForEntityName,
|
|
getTypeReferenceDirectivesForSymbol: getTypeReferenceDirectivesForSymbol
|
|
};
|
|
function getTypeReferenceDirectivesForEntityName(node) {
|
|
if (!fileToDirective) {
|
|
return undefined;
|
|
}
|
|
var meaning = (node.kind === 172) || (node.kind === 69 && isInTypeQuery(node))
|
|
? 107455 | 1048576
|
|
: 793056 | 1536;
|
|
var symbol = resolveEntityName(node, meaning, true);
|
|
return symbol && symbol !== unknownSymbol ? getTypeReferenceDirectivesForSymbol(symbol, meaning) : undefined;
|
|
}
|
|
function getTypeReferenceDirectivesForSymbol(symbol, meaning) {
|
|
if (!fileToDirective) {
|
|
return undefined;
|
|
}
|
|
if (!isSymbolFromTypeDeclarationFile(symbol)) {
|
|
return undefined;
|
|
}
|
|
var typeReferenceDirectives;
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
if (decl.symbol && decl.symbol.flags & meaning) {
|
|
var file = ts.getSourceFileOfNode(decl);
|
|
var typeReferenceDirective = fileToDirective.get(file.path);
|
|
if (typeReferenceDirective) {
|
|
(typeReferenceDirectives || (typeReferenceDirectives = [])).push(typeReferenceDirective);
|
|
}
|
|
}
|
|
}
|
|
return typeReferenceDirectives;
|
|
}
|
|
function isSymbolFromTypeDeclarationFile(symbol) {
|
|
if (!symbol.declarations) {
|
|
return false;
|
|
}
|
|
var current = symbol;
|
|
while (true) {
|
|
var parent_12 = getParentOfSymbol(current);
|
|
if (parent_12) {
|
|
current = parent_12;
|
|
}
|
|
else {
|
|
break;
|
|
}
|
|
}
|
|
if (current.valueDeclaration && current.valueDeclaration.kind === 256 && current.flags & 512) {
|
|
return false;
|
|
}
|
|
for (var _i = 0, _a = symbol.declarations; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
var file = ts.getSourceFileOfNode(decl);
|
|
if (fileToDirective.contains(file.path)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
function getExternalModuleFileFromDeclaration(declaration) {
|
|
var specifier = ts.getExternalModuleName(declaration);
|
|
var moduleSymbol = resolveExternalModuleNameWorker(specifier, specifier, undefined);
|
|
if (!moduleSymbol) {
|
|
return undefined;
|
|
}
|
|
return ts.getDeclarationOfKind(moduleSymbol, 256);
|
|
}
|
|
function initializeTypeChecker() {
|
|
ts.forEach(host.getSourceFiles(), function (file) {
|
|
ts.bindSourceFile(file, compilerOptions);
|
|
});
|
|
var augmentations;
|
|
ts.forEach(host.getSourceFiles(), function (file) {
|
|
if (!ts.isExternalOrCommonJsModule(file)) {
|
|
mergeSymbolTable(globals, file.locals);
|
|
}
|
|
if (file.patternAmbientModules && file.patternAmbientModules.length) {
|
|
patternAmbientModules = ts.concatenate(patternAmbientModules, file.patternAmbientModules);
|
|
}
|
|
if (file.moduleAugmentations.length) {
|
|
(augmentations || (augmentations = [])).push(file.moduleAugmentations);
|
|
}
|
|
if (file.symbol && file.symbol.globalExports) {
|
|
mergeSymbolTable(globals, file.symbol.globalExports);
|
|
}
|
|
});
|
|
if (augmentations) {
|
|
for (var _i = 0, augmentations_1 = augmentations; _i < augmentations_1.length; _i++) {
|
|
var list = augmentations_1[_i];
|
|
for (var _a = 0, list_2 = list; _a < list_2.length; _a++) {
|
|
var augmentation = list_2[_a];
|
|
mergeModuleAugmentation(augmentation);
|
|
}
|
|
}
|
|
}
|
|
addToSymbolTable(globals, builtinGlobals, ts.Diagnostics.Declaration_name_conflicts_with_built_in_global_identifier_0);
|
|
getSymbolLinks(undefinedSymbol).type = undefinedWideningType;
|
|
getSymbolLinks(argumentsSymbol).type = getGlobalType("IArguments");
|
|
getSymbolLinks(unknownSymbol).type = unknownType;
|
|
globalArrayType = getGlobalType("Array", 1);
|
|
globalObjectType = getGlobalType("Object");
|
|
globalFunctionType = getGlobalType("Function");
|
|
globalStringType = getGlobalType("String");
|
|
globalNumberType = getGlobalType("Number");
|
|
globalBooleanType = getGlobalType("Boolean");
|
|
globalRegExpType = getGlobalType("RegExp");
|
|
jsxElementType = getExportedTypeFromNamespace("JSX", JsxNames.Element);
|
|
getGlobalClassDecoratorType = ts.memoize(function () { return getGlobalType("ClassDecorator"); });
|
|
getGlobalPropertyDecoratorType = ts.memoize(function () { return getGlobalType("PropertyDecorator"); });
|
|
getGlobalMethodDecoratorType = ts.memoize(function () { return getGlobalType("MethodDecorator"); });
|
|
getGlobalParameterDecoratorType = ts.memoize(function () { return getGlobalType("ParameterDecorator"); });
|
|
getGlobalTypedPropertyDescriptorType = ts.memoize(function () { return getGlobalType("TypedPropertyDescriptor", 1); });
|
|
getGlobalESSymbolConstructorSymbol = ts.memoize(function () { return getGlobalValueSymbol("Symbol"); });
|
|
getGlobalPromiseType = ts.memoize(function () { return getGlobalType("Promise", 1); });
|
|
tryGetGlobalPromiseType = ts.memoize(function () { return getGlobalSymbol("Promise", 793056, undefined) && getGlobalPromiseType(); });
|
|
getGlobalPromiseLikeType = ts.memoize(function () { return getGlobalType("PromiseLike", 1); });
|
|
getInstantiatedGlobalPromiseLikeType = ts.memoize(createInstantiatedPromiseLikeType);
|
|
getGlobalPromiseConstructorSymbol = ts.memoize(function () { return getGlobalValueSymbol("Promise"); });
|
|
getGlobalPromiseConstructorLikeType = ts.memoize(function () { return getGlobalType("PromiseConstructorLike"); });
|
|
getGlobalThenableType = ts.memoize(createThenableType);
|
|
getGlobalTemplateStringsArrayType = ts.memoize(function () { return getGlobalType("TemplateStringsArray"); });
|
|
if (languageVersion >= 2) {
|
|
getGlobalESSymbolType = ts.memoize(function () { return getGlobalType("Symbol"); });
|
|
getGlobalIterableType = ts.memoize(function () { return getGlobalType("Iterable", 1); });
|
|
getGlobalIteratorType = ts.memoize(function () { return getGlobalType("Iterator", 1); });
|
|
getGlobalIterableIteratorType = ts.memoize(function () { return getGlobalType("IterableIterator", 1); });
|
|
}
|
|
else {
|
|
getGlobalESSymbolType = ts.memoize(function () { return emptyObjectType; });
|
|
getGlobalIterableType = ts.memoize(function () { return emptyGenericType; });
|
|
getGlobalIteratorType = ts.memoize(function () { return emptyGenericType; });
|
|
getGlobalIterableIteratorType = ts.memoize(function () { return emptyGenericType; });
|
|
}
|
|
anyArrayType = createArrayType(anyType);
|
|
var symbol = getGlobalSymbol("ReadonlyArray", 793056, undefined);
|
|
globalReadonlyArrayType = symbol && getTypeOfGlobalSymbol(symbol, 1);
|
|
anyReadonlyArrayType = globalReadonlyArrayType ? createTypeFromGenericGlobalType(globalReadonlyArrayType, [anyType]) : anyArrayType;
|
|
}
|
|
function createInstantiatedPromiseLikeType() {
|
|
var promiseLikeType = getGlobalPromiseLikeType();
|
|
if (promiseLikeType !== emptyGenericType) {
|
|
return createTypeReference(promiseLikeType, [anyType]);
|
|
}
|
|
return emptyObjectType;
|
|
}
|
|
function createThenableType() {
|
|
var thenPropertySymbol = createSymbol(67108864 | 4, "then");
|
|
getSymbolLinks(thenPropertySymbol).type = globalFunctionType;
|
|
var thenableType = createObjectType(65536);
|
|
thenableType.properties = [thenPropertySymbol];
|
|
thenableType.members = createSymbolTable(thenableType.properties);
|
|
thenableType.callSignatures = [];
|
|
thenableType.constructSignatures = [];
|
|
return thenableType;
|
|
}
|
|
function checkGrammarDecorators(node) {
|
|
if (!node.decorators) {
|
|
return false;
|
|
}
|
|
if (!ts.nodeCanBeDecorated(node)) {
|
|
if (node.kind === 147 && !ts.nodeIsPresent(node.body)) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.A_decorator_can_only_decorate_a_method_implementation_not_an_overload);
|
|
}
|
|
else {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_are_not_valid_here);
|
|
}
|
|
}
|
|
else if (node.kind === 149 || node.kind === 150) {
|
|
var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
|
|
if (accessors.firstAccessor.decorators && node === accessors.secondAccessor) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Decorators_cannot_be_applied_to_multiple_get_Slashset_accessors_of_the_same_name);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkGrammarModifiers(node) {
|
|
switch (node.kind) {
|
|
case 149:
|
|
case 150:
|
|
case 148:
|
|
case 145:
|
|
case 144:
|
|
case 147:
|
|
case 146:
|
|
case 153:
|
|
case 225:
|
|
case 230:
|
|
case 229:
|
|
case 236:
|
|
case 235:
|
|
case 179:
|
|
case 180:
|
|
case 142:
|
|
break;
|
|
case 220:
|
|
if (node.modifiers && (node.modifiers.length > 1 || node.modifiers[0].kind !== 118) &&
|
|
node.parent.kind !== 226 && node.parent.kind !== 256) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
|
|
}
|
|
break;
|
|
case 221:
|
|
case 222:
|
|
case 200:
|
|
case 223:
|
|
if (node.modifiers && node.parent.kind !== 226 && node.parent.kind !== 256) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
|
|
}
|
|
break;
|
|
case 224:
|
|
if (node.modifiers && (node.modifiers.length > 1 || node.modifiers[0].kind !== 74) &&
|
|
node.parent.kind !== 226 && node.parent.kind !== 256) {
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.Modifiers_cannot_appear_here);
|
|
}
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
if (!node.modifiers) {
|
|
return;
|
|
}
|
|
var lastStatic, lastPrivate, lastProtected, lastDeclare, lastAsync, lastReadonly;
|
|
var flags = 0;
|
|
for (var _i = 0, _a = node.modifiers; _i < _a.length; _i++) {
|
|
var modifier = _a[_i];
|
|
if (modifier.kind !== 128) {
|
|
if (node.kind === 144 || node.kind === 146) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_type_member, ts.tokenToString(modifier.kind));
|
|
}
|
|
if (node.kind === 153) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_an_index_signature, ts.tokenToString(modifier.kind));
|
|
}
|
|
}
|
|
switch (modifier.kind) {
|
|
case 74:
|
|
if (node.kind !== 224 && node.parent.kind === 221) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_class_member_cannot_have_the_0_keyword, ts.tokenToString(74));
|
|
}
|
|
break;
|
|
case 112:
|
|
case 111:
|
|
case 110:
|
|
var text = visibilityToString(ts.modifierToFlag(modifier.kind));
|
|
if (modifier.kind === 111) {
|
|
lastProtected = modifier;
|
|
}
|
|
else if (modifier.kind === 110) {
|
|
lastPrivate = modifier;
|
|
}
|
|
if (flags & 28) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics.Accessibility_modifier_already_seen);
|
|
}
|
|
else if (flags & 32) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "static");
|
|
}
|
|
else if (flags & 64) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "readonly");
|
|
}
|
|
else if (flags & 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "async");
|
|
}
|
|
else if (node.parent.kind === 226 || node.parent.kind === 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, text);
|
|
}
|
|
else if (flags & 128) {
|
|
if (modifier.kind === 110) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, text, "abstract");
|
|
}
|
|
else {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract");
|
|
}
|
|
}
|
|
flags |= ts.modifierToFlag(modifier.kind);
|
|
break;
|
|
case 113:
|
|
if (flags & 32) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "static");
|
|
}
|
|
else if (flags & 64) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "static", "readonly");
|
|
}
|
|
else if (flags & 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "static", "async");
|
|
}
|
|
else if (node.parent.kind === 226 || node.parent.kind === 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_module_or_namespace_element, "static");
|
|
}
|
|
else if (node.kind === 142) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "static");
|
|
}
|
|
else if (flags & 128) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
|
|
}
|
|
flags |= 32;
|
|
lastStatic = modifier;
|
|
break;
|
|
case 128:
|
|
if (flags & 64) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "readonly");
|
|
}
|
|
else if (node.kind !== 145 && node.kind !== 144 && node.kind !== 153 && node.kind !== 142) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics.readonly_modifier_can_only_appear_on_a_property_declaration_or_index_signature);
|
|
}
|
|
flags |= 64;
|
|
lastReadonly = modifier;
|
|
break;
|
|
case 82:
|
|
if (flags & 1) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "export");
|
|
}
|
|
else if (flags & 2) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "declare");
|
|
}
|
|
else if (flags & 128) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "abstract");
|
|
}
|
|
else if (flags & 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_must_precede_1_modifier, "export", "async");
|
|
}
|
|
else if (node.parent.kind === 221) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "export");
|
|
}
|
|
else if (node.kind === 142) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "export");
|
|
}
|
|
flags |= 1;
|
|
break;
|
|
case 122:
|
|
if (flags & 2) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "declare");
|
|
}
|
|
else if (flags & 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
|
|
}
|
|
else if (node.parent.kind === 221) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_class_element, "declare");
|
|
}
|
|
else if (node.kind === 142) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "declare");
|
|
}
|
|
else if (ts.isInAmbientContext(node.parent) && node.parent.kind === 226) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context);
|
|
}
|
|
flags |= 2;
|
|
lastDeclare = modifier;
|
|
break;
|
|
case 115:
|
|
if (flags & 128) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "abstract");
|
|
}
|
|
if (node.kind !== 221) {
|
|
if (node.kind !== 147 &&
|
|
node.kind !== 145 &&
|
|
node.kind !== 149 &&
|
|
node.kind !== 150) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics.abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration);
|
|
}
|
|
if (!(node.parent.kind === 221 && node.parent.flags & 128)) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics.Abstract_methods_can_only_appear_within_an_abstract_class);
|
|
}
|
|
if (flags & 32) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract");
|
|
}
|
|
if (flags & 8) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "private", "abstract");
|
|
}
|
|
}
|
|
flags |= 128;
|
|
break;
|
|
case 118:
|
|
if (flags & 256) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_already_seen, "async");
|
|
}
|
|
else if (flags & 2 || ts.isInAmbientContext(node.parent)) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_be_used_in_an_ambient_context, "async");
|
|
}
|
|
else if (node.kind === 142) {
|
|
return grammarErrorOnNode(modifier, ts.Diagnostics._0_modifier_cannot_appear_on_a_parameter, "async");
|
|
}
|
|
flags |= 256;
|
|
lastAsync = modifier;
|
|
break;
|
|
}
|
|
}
|
|
if (node.kind === 148) {
|
|
if (flags & 32) {
|
|
return grammarErrorOnNode(lastStatic, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "static");
|
|
}
|
|
if (flags & 128) {
|
|
return grammarErrorOnNode(lastStatic, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "abstract");
|
|
}
|
|
else if (flags & 256) {
|
|
return grammarErrorOnNode(lastAsync, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "async");
|
|
}
|
|
else if (flags & 64) {
|
|
return grammarErrorOnNode(lastReadonly, ts.Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "readonly");
|
|
}
|
|
return;
|
|
}
|
|
else if ((node.kind === 230 || node.kind === 229) && flags & 2) {
|
|
return grammarErrorOnNode(lastDeclare, ts.Diagnostics.A_0_modifier_cannot_be_used_with_an_import_declaration, "declare");
|
|
}
|
|
else if (node.kind === 142 && (flags & 92) && ts.isBindingPattern(node.name)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_parameter_property_may_not_be_declared_using_a_binding_pattern);
|
|
}
|
|
else if (node.kind === 142 && (flags & 92) && node.dotDotDotToken) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_parameter_property_cannot_be_declared_using_a_rest_parameter);
|
|
}
|
|
if (flags & 256) {
|
|
return checkGrammarAsyncModifier(node, lastAsync);
|
|
}
|
|
}
|
|
function checkGrammarAsyncModifier(node, asyncModifier) {
|
|
if (languageVersion < 2) {
|
|
return grammarErrorOnNode(asyncModifier, ts.Diagnostics.Async_functions_are_only_available_when_targeting_ECMAScript_2015_or_higher);
|
|
}
|
|
switch (node.kind) {
|
|
case 147:
|
|
case 220:
|
|
case 179:
|
|
case 180:
|
|
if (!node.asteriskToken) {
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
return grammarErrorOnNode(asyncModifier, ts.Diagnostics._0_modifier_cannot_be_used_here, "async");
|
|
}
|
|
function checkGrammarForDisallowedTrailingComma(list) {
|
|
if (list && list.hasTrailingComma) {
|
|
var start = list.end - ",".length;
|
|
var end = list.end;
|
|
var sourceFile = ts.getSourceFileOfNode(list[0]);
|
|
return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Trailing_comma_not_allowed);
|
|
}
|
|
}
|
|
function checkGrammarTypeParameterList(node, typeParameters, file) {
|
|
if (checkGrammarForDisallowedTrailingComma(typeParameters)) {
|
|
return true;
|
|
}
|
|
if (typeParameters && typeParameters.length === 0) {
|
|
var start = typeParameters.pos - "<".length;
|
|
var end = ts.skipTrivia(file.text, typeParameters.end) + ">".length;
|
|
return grammarErrorAtPos(file, start, end - start, ts.Diagnostics.Type_parameter_list_cannot_be_empty);
|
|
}
|
|
}
|
|
function checkGrammarParameterList(parameters) {
|
|
var seenOptionalParameter = false;
|
|
var parameterCount = parameters.length;
|
|
for (var i = 0; i < parameterCount; i++) {
|
|
var parameter = parameters[i];
|
|
if (parameter.dotDotDotToken) {
|
|
if (i !== (parameterCount - 1)) {
|
|
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
|
|
}
|
|
if (ts.isBindingPattern(parameter.name)) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
|
|
}
|
|
if (parameter.questionToken) {
|
|
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_rest_parameter_cannot_be_optional);
|
|
}
|
|
if (parameter.initializer) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_rest_parameter_cannot_have_an_initializer);
|
|
}
|
|
}
|
|
else if (parameter.questionToken) {
|
|
seenOptionalParameter = true;
|
|
if (parameter.initializer) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
|
|
}
|
|
}
|
|
else if (seenOptionalParameter && !parameter.initializer) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.A_required_parameter_cannot_follow_an_optional_parameter);
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarFunctionLikeDeclaration(node) {
|
|
var file = ts.getSourceFileOfNode(node);
|
|
return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarTypeParameterList(node, node.typeParameters, file) ||
|
|
checkGrammarParameterList(node.parameters) || checkGrammarArrowFunction(node, file);
|
|
}
|
|
function checkGrammarArrowFunction(node, file) {
|
|
if (node.kind === 180) {
|
|
var arrowFunction = node;
|
|
var startLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.pos).line;
|
|
var endLine = ts.getLineAndCharacterOfPosition(file, arrowFunction.equalsGreaterThanToken.end).line;
|
|
if (startLine !== endLine) {
|
|
return grammarErrorOnNode(arrowFunction.equalsGreaterThanToken, ts.Diagnostics.Line_terminator_not_permitted_before_arrow);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkGrammarIndexSignatureParameters(node) {
|
|
var parameter = node.parameters[0];
|
|
if (node.parameters.length !== 1) {
|
|
if (parameter) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
|
|
}
|
|
else {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_exactly_one_parameter);
|
|
}
|
|
}
|
|
if (parameter.dotDotDotToken) {
|
|
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.An_index_signature_cannot_have_a_rest_parameter);
|
|
}
|
|
if (parameter.flags & 1023) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_accessibility_modifier);
|
|
}
|
|
if (parameter.questionToken) {
|
|
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.An_index_signature_parameter_cannot_have_a_question_mark);
|
|
}
|
|
if (parameter.initializer) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_cannot_have_an_initializer);
|
|
}
|
|
if (!parameter.type) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_must_have_a_type_annotation);
|
|
}
|
|
if (parameter.type.kind !== 132 && parameter.type.kind !== 130) {
|
|
return grammarErrorOnNode(parameter.name, ts.Diagnostics.An_index_signature_parameter_type_must_be_string_or_number);
|
|
}
|
|
if (!node.type) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.An_index_signature_must_have_a_type_annotation);
|
|
}
|
|
}
|
|
function checkGrammarIndexSignature(node) {
|
|
return checkGrammarDecorators(node) || checkGrammarModifiers(node) || checkGrammarIndexSignatureParameters(node);
|
|
}
|
|
function checkGrammarForAtLeastOneTypeArgument(node, typeArguments) {
|
|
if (typeArguments && typeArguments.length === 0) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
var start = typeArguments.pos - "<".length;
|
|
var end = ts.skipTrivia(sourceFile.text, typeArguments.end) + ">".length;
|
|
return grammarErrorAtPos(sourceFile, start, end - start, ts.Diagnostics.Type_argument_list_cannot_be_empty);
|
|
}
|
|
}
|
|
function checkGrammarTypeArguments(node, typeArguments) {
|
|
return checkGrammarForDisallowedTrailingComma(typeArguments) ||
|
|
checkGrammarForAtLeastOneTypeArgument(node, typeArguments);
|
|
}
|
|
function checkGrammarForOmittedArgument(node, args) {
|
|
if (args) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
for (var _i = 0, args_1 = args; _i < args_1.length; _i++) {
|
|
var arg = args_1[_i];
|
|
if (arg.kind === 193) {
|
|
return grammarErrorAtPos(sourceFile, arg.pos, 0, ts.Diagnostics.Argument_expression_expected);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarArguments(node, args) {
|
|
return checkGrammarForOmittedArgument(node, args);
|
|
}
|
|
function checkGrammarHeritageClause(node) {
|
|
var types = node.types;
|
|
if (checkGrammarForDisallowedTrailingComma(types)) {
|
|
return true;
|
|
}
|
|
if (types && types.length === 0) {
|
|
var listType = ts.tokenToString(node.token);
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
return grammarErrorAtPos(sourceFile, types.pos, 0, ts.Diagnostics._0_list_cannot_be_empty, listType);
|
|
}
|
|
}
|
|
function checkGrammarClassDeclarationHeritageClauses(node) {
|
|
var seenExtendsClause = false;
|
|
var seenImplementsClause = false;
|
|
if (!checkGrammarDecorators(node) && !checkGrammarModifiers(node) && node.heritageClauses) {
|
|
for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
|
|
var heritageClause = _a[_i];
|
|
if (heritageClause.token === 83) {
|
|
if (seenExtendsClause) {
|
|
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
|
|
}
|
|
if (seenImplementsClause) {
|
|
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_must_precede_implements_clause);
|
|
}
|
|
if (heritageClause.types.length > 1) {
|
|
return grammarErrorOnFirstToken(heritageClause.types[1], ts.Diagnostics.Classes_can_only_extend_a_single_class);
|
|
}
|
|
seenExtendsClause = true;
|
|
}
|
|
else {
|
|
ts.Debug.assert(heritageClause.token === 106);
|
|
if (seenImplementsClause) {
|
|
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.implements_clause_already_seen);
|
|
}
|
|
seenImplementsClause = true;
|
|
}
|
|
checkGrammarHeritageClause(heritageClause);
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarInterfaceDeclaration(node) {
|
|
var seenExtendsClause = false;
|
|
if (node.heritageClauses) {
|
|
for (var _i = 0, _a = node.heritageClauses; _i < _a.length; _i++) {
|
|
var heritageClause = _a[_i];
|
|
if (heritageClause.token === 83) {
|
|
if (seenExtendsClause) {
|
|
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.extends_clause_already_seen);
|
|
}
|
|
seenExtendsClause = true;
|
|
}
|
|
else {
|
|
ts.Debug.assert(heritageClause.token === 106);
|
|
return grammarErrorOnFirstToken(heritageClause, ts.Diagnostics.Interface_declaration_cannot_have_implements_clause);
|
|
}
|
|
checkGrammarHeritageClause(heritageClause);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkGrammarComputedPropertyName(node) {
|
|
if (node.kind !== 140) {
|
|
return false;
|
|
}
|
|
var computedPropertyName = node;
|
|
if (computedPropertyName.expression.kind === 187 && computedPropertyName.expression.operatorToken.kind === 24) {
|
|
return grammarErrorOnNode(computedPropertyName.expression, ts.Diagnostics.A_comma_expression_is_not_allowed_in_a_computed_property_name);
|
|
}
|
|
}
|
|
function checkGrammarForGenerator(node) {
|
|
if (node.asteriskToken) {
|
|
ts.Debug.assert(node.kind === 220 ||
|
|
node.kind === 179 ||
|
|
node.kind === 147);
|
|
if (ts.isInAmbientContext(node)) {
|
|
return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.Generators_are_not_allowed_in_an_ambient_context);
|
|
}
|
|
if (!node.body) {
|
|
return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.An_overload_signature_cannot_be_declared_as_a_generator);
|
|
}
|
|
if (languageVersion < 2) {
|
|
return grammarErrorOnNode(node.asteriskToken, ts.Diagnostics.Generators_are_only_available_when_targeting_ECMAScript_2015_or_higher);
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarForInvalidQuestionMark(node, questionToken, message) {
|
|
if (questionToken) {
|
|
return grammarErrorOnNode(questionToken, message);
|
|
}
|
|
}
|
|
function checkGrammarObjectLiteralExpression(node, inDestructuring) {
|
|
var seen = {};
|
|
var Property = 1;
|
|
var GetAccessor = 2;
|
|
var SetAccessor = 4;
|
|
var GetOrSetAccessor = GetAccessor | SetAccessor;
|
|
var _loop_2 = function(prop) {
|
|
var name_21 = prop.name;
|
|
if (prop.kind === 193 ||
|
|
name_21.kind === 140) {
|
|
checkGrammarComputedPropertyName(name_21);
|
|
}
|
|
if (prop.kind === 254 && !inDestructuring && prop.objectAssignmentInitializer) {
|
|
return { value: grammarErrorOnNode(prop.equalsToken, ts.Diagnostics.can_only_be_used_in_an_object_literal_property_inside_a_destructuring_assignment) };
|
|
}
|
|
ts.forEach(prop.modifiers, function (mod) {
|
|
if (mod.kind !== 118 || prop.kind !== 147) {
|
|
grammarErrorOnNode(mod, ts.Diagnostics._0_modifier_cannot_be_used_here, ts.getTextOfNode(mod));
|
|
}
|
|
});
|
|
var currentKind = void 0;
|
|
if (prop.kind === 253 || prop.kind === 254) {
|
|
checkGrammarForInvalidQuestionMark(prop, prop.questionToken, ts.Diagnostics.An_object_member_cannot_be_declared_optional);
|
|
if (name_21.kind === 8) {
|
|
checkGrammarNumericLiteral(name_21);
|
|
}
|
|
currentKind = Property;
|
|
}
|
|
else if (prop.kind === 147) {
|
|
currentKind = Property;
|
|
}
|
|
else if (prop.kind === 149) {
|
|
currentKind = GetAccessor;
|
|
}
|
|
else if (prop.kind === 150) {
|
|
currentKind = SetAccessor;
|
|
}
|
|
else {
|
|
ts.Debug.fail("Unexpected syntax kind:" + prop.kind);
|
|
}
|
|
var effectiveName = ts.getPropertyNameForPropertyNameNode(name_21);
|
|
if (effectiveName === undefined) {
|
|
return "continue";
|
|
}
|
|
if (!ts.hasProperty(seen, effectiveName)) {
|
|
seen[effectiveName] = currentKind;
|
|
}
|
|
else {
|
|
var existingKind = seen[effectiveName];
|
|
if (currentKind === Property && existingKind === Property) {
|
|
grammarErrorOnNode(name_21, ts.Diagnostics.Duplicate_identifier_0, ts.getTextOfNode(name_21));
|
|
}
|
|
else if ((currentKind & GetOrSetAccessor) && (existingKind & GetOrSetAccessor)) {
|
|
if (existingKind !== GetOrSetAccessor && currentKind !== existingKind) {
|
|
seen[effectiveName] = currentKind | existingKind;
|
|
}
|
|
else {
|
|
return { value: grammarErrorOnNode(name_21, ts.Diagnostics.An_object_literal_cannot_have_multiple_get_Slashset_accessors_with_the_same_name) };
|
|
}
|
|
}
|
|
else {
|
|
return { value: grammarErrorOnNode(name_21, ts.Diagnostics.An_object_literal_cannot_have_property_and_accessor_with_the_same_name) };
|
|
}
|
|
}
|
|
};
|
|
for (var _i = 0, _a = node.properties; _i < _a.length; _i++) {
|
|
var prop = _a[_i];
|
|
var state_3 = _loop_2(prop);
|
|
if (typeof state_3 === "object") return state_3.value;
|
|
}
|
|
}
|
|
function checkGrammarJsxElement(node) {
|
|
var seen = {};
|
|
for (var _i = 0, _a = node.attributes; _i < _a.length; _i++) {
|
|
var attr = _a[_i];
|
|
if (attr.kind === 247) {
|
|
continue;
|
|
}
|
|
var jsxAttr = attr;
|
|
var name_22 = jsxAttr.name;
|
|
if (!ts.hasProperty(seen, name_22.text)) {
|
|
seen[name_22.text] = true;
|
|
}
|
|
else {
|
|
return grammarErrorOnNode(name_22, ts.Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name);
|
|
}
|
|
var initializer = jsxAttr.initializer;
|
|
if (initializer && initializer.kind === 248 && !initializer.expression) {
|
|
return grammarErrorOnNode(jsxAttr.initializer, ts.Diagnostics.JSX_attributes_must_only_be_assigned_a_non_empty_expression);
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarForInOrForOfStatement(forInOrOfStatement) {
|
|
if (checkGrammarStatementInAmbientContext(forInOrOfStatement)) {
|
|
return true;
|
|
}
|
|
if (forInOrOfStatement.initializer.kind === 219) {
|
|
var variableList = forInOrOfStatement.initializer;
|
|
if (!checkGrammarVariableDeclarationList(variableList)) {
|
|
var declarations = variableList.declarations;
|
|
if (!declarations.length) {
|
|
return false;
|
|
}
|
|
if (declarations.length > 1) {
|
|
var diagnostic = forInOrOfStatement.kind === 207
|
|
? ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_in_statement
|
|
: ts.Diagnostics.Only_a_single_variable_declaration_is_allowed_in_a_for_of_statement;
|
|
return grammarErrorOnFirstToken(variableList.declarations[1], diagnostic);
|
|
}
|
|
var firstDeclaration = declarations[0];
|
|
if (firstDeclaration.initializer) {
|
|
var diagnostic = forInOrOfStatement.kind === 207
|
|
? ts.Diagnostics.The_variable_declaration_of_a_for_in_statement_cannot_have_an_initializer
|
|
: ts.Diagnostics.The_variable_declaration_of_a_for_of_statement_cannot_have_an_initializer;
|
|
return grammarErrorOnNode(firstDeclaration.name, diagnostic);
|
|
}
|
|
if (firstDeclaration.type) {
|
|
var diagnostic = forInOrOfStatement.kind === 207
|
|
? ts.Diagnostics.The_left_hand_side_of_a_for_in_statement_cannot_use_a_type_annotation
|
|
: ts.Diagnostics.The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation;
|
|
return grammarErrorOnNode(firstDeclaration, diagnostic);
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function checkGrammarAccessor(accessor) {
|
|
var kind = accessor.kind;
|
|
if (languageVersion < 1) {
|
|
return grammarErrorOnNode(accessor.name, ts.Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher);
|
|
}
|
|
else if (ts.isInAmbientContext(accessor)) {
|
|
return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_be_declared_in_an_ambient_context);
|
|
}
|
|
else if (accessor.body === undefined && !(accessor.flags & 128)) {
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(accessor), accessor.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
|
|
}
|
|
else if (accessor.typeParameters) {
|
|
return grammarErrorOnNode(accessor.name, ts.Diagnostics.An_accessor_cannot_have_type_parameters);
|
|
}
|
|
else if (!doesAccessorHaveCorrectParameterCount(accessor)) {
|
|
return grammarErrorOnNode(accessor.name, kind === 149 ?
|
|
ts.Diagnostics.A_get_accessor_cannot_have_parameters :
|
|
ts.Diagnostics.A_set_accessor_must_have_exactly_one_parameter);
|
|
}
|
|
else if (kind === 150) {
|
|
if (accessor.type) {
|
|
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_cannot_have_a_return_type_annotation);
|
|
}
|
|
else {
|
|
var parameter = accessor.parameters[0];
|
|
if (parameter.dotDotDotToken) {
|
|
return grammarErrorOnNode(parameter.dotDotDotToken, ts.Diagnostics.A_set_accessor_cannot_have_rest_parameter);
|
|
}
|
|
else if (parameter.questionToken) {
|
|
return grammarErrorOnNode(parameter.questionToken, ts.Diagnostics.A_set_accessor_cannot_have_an_optional_parameter);
|
|
}
|
|
else if (parameter.initializer) {
|
|
return grammarErrorOnNode(accessor.name, ts.Diagnostics.A_set_accessor_parameter_cannot_have_an_initializer);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function doesAccessorHaveCorrectParameterCount(accessor) {
|
|
return getAccessorThisParameter(accessor) || accessor.parameters.length === (accessor.kind === 149 ? 0 : 1);
|
|
}
|
|
function getAccessorThisParameter(accessor) {
|
|
if (accessor.parameters.length === (accessor.kind === 149 ? 1 : 2) &&
|
|
accessor.parameters[0].name.kind === 69 &&
|
|
accessor.parameters[0].name.originalKeywordKind === 97) {
|
|
return accessor.parameters[0];
|
|
}
|
|
}
|
|
function getFunctionLikeThisParameter(func) {
|
|
if (func.parameters.length &&
|
|
func.parameters[0].name.kind === 69 &&
|
|
func.parameters[0].name.originalKeywordKind === 97) {
|
|
return func.parameters[0];
|
|
}
|
|
}
|
|
function checkGrammarForNonSymbolComputedProperty(node, message) {
|
|
if (ts.isDynamicName(node)) {
|
|
return grammarErrorOnNode(node, message);
|
|
}
|
|
}
|
|
function checkGrammarMethod(node) {
|
|
if (checkGrammarDisallowedModifiersOnObjectLiteralExpressionMethod(node) ||
|
|
checkGrammarFunctionLikeDeclaration(node) ||
|
|
checkGrammarForGenerator(node)) {
|
|
return true;
|
|
}
|
|
if (node.parent.kind === 171) {
|
|
if (checkGrammarForInvalidQuestionMark(node, node.questionToken, ts.Diagnostics.An_object_member_cannot_be_declared_optional)) {
|
|
return true;
|
|
}
|
|
else if (node.body === undefined) {
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.end - 1, ";".length, ts.Diagnostics._0_expected, "{");
|
|
}
|
|
}
|
|
if (ts.isClassLike(node.parent)) {
|
|
if (ts.isInAmbientContext(node)) {
|
|
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_ambient_context_must_directly_refer_to_a_built_in_symbol);
|
|
}
|
|
else if (!node.body) {
|
|
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_method_overload_must_directly_refer_to_a_built_in_symbol);
|
|
}
|
|
}
|
|
else if (node.parent.kind === 222) {
|
|
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol);
|
|
}
|
|
else if (node.parent.kind === 159) {
|
|
return checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol);
|
|
}
|
|
}
|
|
function checkGrammarBreakOrContinueStatement(node) {
|
|
var current = node;
|
|
while (current) {
|
|
if (ts.isFunctionLike(current)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.Jump_target_cannot_cross_function_boundary);
|
|
}
|
|
switch (current.kind) {
|
|
case 214:
|
|
if (node.label && current.label.text === node.label.text) {
|
|
var isMisplacedContinueLabel = node.kind === 209
|
|
&& !ts.isIterationStatement(current.statement, true);
|
|
if (isMisplacedContinueLabel) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement);
|
|
}
|
|
return false;
|
|
}
|
|
break;
|
|
case 213:
|
|
if (node.kind === 210 && !node.label) {
|
|
return false;
|
|
}
|
|
break;
|
|
default:
|
|
if (ts.isIterationStatement(current, false) && !node.label) {
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
current = current.parent;
|
|
}
|
|
if (node.label) {
|
|
var message = node.kind === 210
|
|
? ts.Diagnostics.A_break_statement_can_only_jump_to_a_label_of_an_enclosing_statement
|
|
: ts.Diagnostics.A_continue_statement_can_only_jump_to_a_label_of_an_enclosing_iteration_statement;
|
|
return grammarErrorOnNode(node, message);
|
|
}
|
|
else {
|
|
var message = node.kind === 210
|
|
? ts.Diagnostics.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement
|
|
: ts.Diagnostics.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement;
|
|
return grammarErrorOnNode(node, message);
|
|
}
|
|
}
|
|
function checkGrammarBindingElement(node) {
|
|
if (node.dotDotDotToken) {
|
|
var elements = node.parent.elements;
|
|
if (node !== ts.lastOrUndefined(elements)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern);
|
|
}
|
|
if (node.name.kind === 168 || node.name.kind === 167) {
|
|
return grammarErrorOnNode(node.name, ts.Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
|
|
}
|
|
if (node.initializer) {
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - 1, 1, ts.Diagnostics.A_rest_element_cannot_have_an_initializer);
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarVariableDeclaration(node) {
|
|
if (node.parent.parent.kind !== 207 && node.parent.parent.kind !== 208) {
|
|
if (ts.isInAmbientContext(node)) {
|
|
if (node.initializer) {
|
|
var equalsTokenLength = "=".length;
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.initializer.pos - equalsTokenLength, equalsTokenLength, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
|
|
}
|
|
}
|
|
else if (!node.initializer) {
|
|
if (ts.isBindingPattern(node.name) && !ts.isBindingPattern(node.parent)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.A_destructuring_declaration_must_have_an_initializer);
|
|
}
|
|
if (ts.isConst(node)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_must_be_initialized);
|
|
}
|
|
}
|
|
}
|
|
var checkLetConstNames = (ts.isLet(node) || ts.isConst(node));
|
|
return checkLetConstNames && checkGrammarNameInLetOrConstDeclarations(node.name);
|
|
}
|
|
function checkGrammarNameInLetOrConstDeclarations(name) {
|
|
if (name.kind === 69) {
|
|
if (name.originalKeywordKind === 108) {
|
|
return grammarErrorOnNode(name, ts.Diagnostics.let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations);
|
|
}
|
|
}
|
|
else {
|
|
var elements = name.elements;
|
|
for (var _i = 0, elements_2 = elements; _i < elements_2.length; _i++) {
|
|
var element = elements_2[_i];
|
|
if (element.kind !== 193) {
|
|
checkGrammarNameInLetOrConstDeclarations(element.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarVariableDeclarationList(declarationList) {
|
|
var declarations = declarationList.declarations;
|
|
if (checkGrammarForDisallowedTrailingComma(declarationList.declarations)) {
|
|
return true;
|
|
}
|
|
if (!declarationList.declarations.length) {
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(declarationList), declarations.pos, declarations.end - declarations.pos, ts.Diagnostics.Variable_declaration_list_cannot_be_empty);
|
|
}
|
|
}
|
|
function allowLetAndConstDeclarations(parent) {
|
|
switch (parent.kind) {
|
|
case 203:
|
|
case 204:
|
|
case 205:
|
|
case 212:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
return false;
|
|
case 214:
|
|
return allowLetAndConstDeclarations(parent.parent);
|
|
}
|
|
return true;
|
|
}
|
|
function checkGrammarForDisallowedLetOrConstStatement(node) {
|
|
if (!allowLetAndConstDeclarations(node.parent)) {
|
|
if (ts.isLet(node.declarationList)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.let_declarations_can_only_be_declared_inside_a_block);
|
|
}
|
|
else if (ts.isConst(node.declarationList)) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.const_declarations_can_only_be_declared_inside_a_block);
|
|
}
|
|
}
|
|
}
|
|
function hasParseDiagnostics(sourceFile) {
|
|
return sourceFile.parseDiagnostics.length > 0;
|
|
}
|
|
function grammarErrorOnFirstToken(node, message, arg0, arg1, arg2) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
if (!hasParseDiagnostics(sourceFile)) {
|
|
var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
|
|
diagnostics.add(ts.createFileDiagnostic(sourceFile, span.start, span.length, message, arg0, arg1, arg2));
|
|
return true;
|
|
}
|
|
}
|
|
function grammarErrorAtPos(sourceFile, start, length, message, arg0, arg1, arg2) {
|
|
if (!hasParseDiagnostics(sourceFile)) {
|
|
diagnostics.add(ts.createFileDiagnostic(sourceFile, start, length, message, arg0, arg1, arg2));
|
|
return true;
|
|
}
|
|
}
|
|
function grammarErrorOnNode(node, message, arg0, arg1, arg2) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
if (!hasParseDiagnostics(sourceFile)) {
|
|
diagnostics.add(ts.createDiagnosticForNode(node, message, arg0, arg1, arg2));
|
|
return true;
|
|
}
|
|
}
|
|
function checkGrammarConstructorTypeParameters(node) {
|
|
if (node.typeParameters) {
|
|
return grammarErrorAtPos(ts.getSourceFileOfNode(node), node.typeParameters.pos, node.typeParameters.end - node.typeParameters.pos, ts.Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration);
|
|
}
|
|
}
|
|
function checkGrammarConstructorTypeAnnotation(node) {
|
|
if (node.type) {
|
|
return grammarErrorOnNode(node.type, ts.Diagnostics.Type_annotation_cannot_appear_on_a_constructor_declaration);
|
|
}
|
|
}
|
|
function checkGrammarProperty(node) {
|
|
if (ts.isClassLike(node.parent)) {
|
|
if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_class_property_declaration_must_directly_refer_to_a_built_in_symbol)) {
|
|
return true;
|
|
}
|
|
}
|
|
else if (node.parent.kind === 222) {
|
|
if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_an_interface_must_directly_refer_to_a_built_in_symbol)) {
|
|
return true;
|
|
}
|
|
if (node.initializer) {
|
|
return grammarErrorOnNode(node.initializer, ts.Diagnostics.An_interface_property_cannot_have_an_initializer);
|
|
}
|
|
}
|
|
else if (node.parent.kind === 159) {
|
|
if (checkGrammarForNonSymbolComputedProperty(node.name, ts.Diagnostics.A_computed_property_name_in_a_type_literal_must_directly_refer_to_a_built_in_symbol)) {
|
|
return true;
|
|
}
|
|
if (node.initializer) {
|
|
return grammarErrorOnNode(node.initializer, ts.Diagnostics.A_type_literal_property_cannot_have_an_initializer);
|
|
}
|
|
}
|
|
if (ts.isInAmbientContext(node) && node.initializer) {
|
|
return grammarErrorOnFirstToken(node.initializer, ts.Diagnostics.Initializers_are_not_allowed_in_ambient_contexts);
|
|
}
|
|
}
|
|
function checkGrammarTopLevelElementForRequiredDeclareModifier(node) {
|
|
if (node.kind === 222 ||
|
|
node.kind === 223 ||
|
|
node.kind === 230 ||
|
|
node.kind === 229 ||
|
|
node.kind === 236 ||
|
|
node.kind === 235 ||
|
|
(node.flags & 2) ||
|
|
(node.flags & (1 | 512))) {
|
|
return false;
|
|
}
|
|
return grammarErrorOnFirstToken(node, ts.Diagnostics.A_declare_modifier_is_required_for_a_top_level_declaration_in_a_d_ts_file);
|
|
}
|
|
function checkGrammarTopLevelElementsForRequiredDeclareModifier(file) {
|
|
for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
|
|
var decl = _a[_i];
|
|
if (ts.isDeclaration(decl) || decl.kind === 200) {
|
|
if (checkGrammarTopLevelElementForRequiredDeclareModifier(decl)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarSourceFile(node) {
|
|
return ts.isInAmbientContext(node) && checkGrammarTopLevelElementsForRequiredDeclareModifier(node);
|
|
}
|
|
function checkGrammarStatementInAmbientContext(node) {
|
|
if (ts.isInAmbientContext(node)) {
|
|
if (isAccessor(node.parent.kind)) {
|
|
return getNodeLinks(node).hasReportedStatementInAmbientContext = true;
|
|
}
|
|
var links = getNodeLinks(node);
|
|
if (!links.hasReportedStatementInAmbientContext && ts.isFunctionLike(node.parent)) {
|
|
return getNodeLinks(node).hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts);
|
|
}
|
|
if (node.parent.kind === 199 || node.parent.kind === 226 || node.parent.kind === 256) {
|
|
var links_1 = getNodeLinks(node.parent);
|
|
if (!links_1.hasReportedStatementInAmbientContext) {
|
|
return links_1.hasReportedStatementInAmbientContext = grammarErrorOnFirstToken(node, ts.Diagnostics.Statements_are_not_allowed_in_ambient_contexts);
|
|
}
|
|
}
|
|
else {
|
|
}
|
|
}
|
|
}
|
|
function checkGrammarNumericLiteral(node) {
|
|
if (node.isOctalLiteral && languageVersion >= 1) {
|
|
return grammarErrorOnNode(node, ts.Diagnostics.Octal_literals_are_not_available_when_targeting_ECMAScript_5_and_higher);
|
|
}
|
|
}
|
|
function grammarErrorAfterFirstToken(node, message, arg0, arg1, arg2) {
|
|
var sourceFile = ts.getSourceFileOfNode(node);
|
|
if (!hasParseDiagnostics(sourceFile)) {
|
|
var span = ts.getSpanOfTokenAtPosition(sourceFile, node.pos);
|
|
diagnostics.add(ts.createFileDiagnostic(sourceFile, ts.textSpanEnd(span), 0, message, arg0, arg1, arg2));
|
|
return true;
|
|
}
|
|
}
|
|
var _a;
|
|
}
|
|
ts.createTypeChecker = createTypeChecker;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
var nullSourceMapWriter;
|
|
var defaultLastEncodedSourceMapSpan = {
|
|
emittedLine: 1,
|
|
emittedColumn: 1,
|
|
sourceLine: 1,
|
|
sourceColumn: 1,
|
|
sourceIndex: 0
|
|
};
|
|
function getNullSourceMapWriter() {
|
|
if (nullSourceMapWriter === undefined) {
|
|
nullSourceMapWriter = {
|
|
getSourceMapData: function () { return undefined; },
|
|
setSourceFile: function (sourceFile) { },
|
|
emitStart: function (range) { },
|
|
emitEnd: function (range, stopOverridingSpan) { },
|
|
emitPos: function (pos) { },
|
|
changeEmitSourcePos: function () { },
|
|
getText: function () { return undefined; },
|
|
getSourceMappingURL: function () { return undefined; },
|
|
initialize: function (filePath, sourceMapFilePath, sourceFiles, isBundledEmit) { },
|
|
reset: function () { }
|
|
};
|
|
}
|
|
return nullSourceMapWriter;
|
|
}
|
|
ts.getNullSourceMapWriter = getNullSourceMapWriter;
|
|
function createSourceMapWriter(host, writer) {
|
|
var compilerOptions = host.getCompilerOptions();
|
|
var currentSourceFile;
|
|
var sourceMapDir;
|
|
var stopOverridingSpan = false;
|
|
var modifyLastSourcePos = false;
|
|
var sourceMapSourceIndex;
|
|
var lastRecordedSourceMapSpan;
|
|
var lastEncodedSourceMapSpan;
|
|
var lastEncodedNameIndex;
|
|
var sourceMapData;
|
|
return {
|
|
getSourceMapData: function () { return sourceMapData; },
|
|
setSourceFile: setSourceFile,
|
|
emitPos: emitPos,
|
|
emitStart: emitStart,
|
|
emitEnd: emitEnd,
|
|
changeEmitSourcePos: changeEmitSourcePos,
|
|
getText: getText,
|
|
getSourceMappingURL: getSourceMappingURL,
|
|
initialize: initialize,
|
|
reset: reset
|
|
};
|
|
function initialize(filePath, sourceMapFilePath, sourceFiles, isBundledEmit) {
|
|
if (sourceMapData) {
|
|
reset();
|
|
}
|
|
currentSourceFile = undefined;
|
|
sourceMapSourceIndex = -1;
|
|
lastRecordedSourceMapSpan = undefined;
|
|
lastEncodedSourceMapSpan = defaultLastEncodedSourceMapSpan;
|
|
lastEncodedNameIndex = 0;
|
|
sourceMapData = {
|
|
sourceMapFilePath: sourceMapFilePath,
|
|
jsSourceMappingURL: !compilerOptions.inlineSourceMap ? ts.getBaseFileName(ts.normalizeSlashes(sourceMapFilePath)) : undefined,
|
|
sourceMapFile: ts.getBaseFileName(ts.normalizeSlashes(filePath)),
|
|
sourceMapSourceRoot: compilerOptions.sourceRoot || "",
|
|
sourceMapSources: [],
|
|
inputSourceFileNames: [],
|
|
sourceMapNames: [],
|
|
sourceMapMappings: "",
|
|
sourceMapSourcesContent: compilerOptions.inlineSources ? [] : undefined,
|
|
sourceMapDecodedMappings: []
|
|
};
|
|
sourceMapData.sourceMapSourceRoot = ts.normalizeSlashes(sourceMapData.sourceMapSourceRoot);
|
|
if (sourceMapData.sourceMapSourceRoot.length && sourceMapData.sourceMapSourceRoot.charCodeAt(sourceMapData.sourceMapSourceRoot.length - 1) !== 47) {
|
|
sourceMapData.sourceMapSourceRoot += ts.directorySeparator;
|
|
}
|
|
if (compilerOptions.mapRoot) {
|
|
sourceMapDir = ts.normalizeSlashes(compilerOptions.mapRoot);
|
|
if (!isBundledEmit) {
|
|
ts.Debug.assert(sourceFiles.length === 1);
|
|
sourceMapDir = ts.getDirectoryPath(ts.getSourceFilePathInNewDir(sourceFiles[0], host, sourceMapDir));
|
|
}
|
|
if (!ts.isRootedDiskPath(sourceMapDir) && !ts.isUrl(sourceMapDir)) {
|
|
sourceMapDir = ts.combinePaths(host.getCommonSourceDirectory(), sourceMapDir);
|
|
sourceMapData.jsSourceMappingURL = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizePath(filePath)), ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL), host.getCurrentDirectory(), host.getCanonicalFileName, true);
|
|
}
|
|
else {
|
|
sourceMapData.jsSourceMappingURL = ts.combinePaths(sourceMapDir, sourceMapData.jsSourceMappingURL);
|
|
}
|
|
}
|
|
else {
|
|
sourceMapDir = ts.getDirectoryPath(ts.normalizePath(filePath));
|
|
}
|
|
}
|
|
function reset() {
|
|
currentSourceFile = undefined;
|
|
sourceMapDir = undefined;
|
|
sourceMapSourceIndex = undefined;
|
|
lastRecordedSourceMapSpan = undefined;
|
|
lastEncodedSourceMapSpan = undefined;
|
|
lastEncodedNameIndex = undefined;
|
|
sourceMapData = undefined;
|
|
}
|
|
function updateLastEncodedAndRecordedSpans() {
|
|
if (modifyLastSourcePos) {
|
|
modifyLastSourcePos = false;
|
|
lastRecordedSourceMapSpan.emittedLine = lastEncodedSourceMapSpan.emittedLine;
|
|
lastRecordedSourceMapSpan.emittedColumn = lastEncodedSourceMapSpan.emittedColumn;
|
|
sourceMapData.sourceMapDecodedMappings.pop();
|
|
lastEncodedSourceMapSpan = sourceMapData.sourceMapDecodedMappings.length ?
|
|
sourceMapData.sourceMapDecodedMappings[sourceMapData.sourceMapDecodedMappings.length - 1] :
|
|
defaultLastEncodedSourceMapSpan;
|
|
var sourceMapMappings = sourceMapData.sourceMapMappings;
|
|
var lenthToSet = sourceMapMappings.length - 1;
|
|
for (; lenthToSet >= 0; lenthToSet--) {
|
|
var currentChar = sourceMapMappings.charAt(lenthToSet);
|
|
if (currentChar === ",") {
|
|
break;
|
|
}
|
|
if (currentChar === ";" && lenthToSet !== 0 && sourceMapMappings.charAt(lenthToSet - 1) !== ";") {
|
|
break;
|
|
}
|
|
}
|
|
sourceMapData.sourceMapMappings = sourceMapMappings.substr(0, Math.max(0, lenthToSet));
|
|
}
|
|
}
|
|
function encodeLastRecordedSourceMapSpan() {
|
|
if (!lastRecordedSourceMapSpan || lastRecordedSourceMapSpan === lastEncodedSourceMapSpan) {
|
|
return;
|
|
}
|
|
var prevEncodedEmittedColumn = lastEncodedSourceMapSpan.emittedColumn;
|
|
if (lastEncodedSourceMapSpan.emittedLine === lastRecordedSourceMapSpan.emittedLine) {
|
|
if (sourceMapData.sourceMapMappings) {
|
|
sourceMapData.sourceMapMappings += ",";
|
|
}
|
|
}
|
|
else {
|
|
for (var encodedLine = lastEncodedSourceMapSpan.emittedLine; encodedLine < lastRecordedSourceMapSpan.emittedLine; encodedLine++) {
|
|
sourceMapData.sourceMapMappings += ";";
|
|
}
|
|
prevEncodedEmittedColumn = 1;
|
|
}
|
|
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.emittedColumn - prevEncodedEmittedColumn);
|
|
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceIndex - lastEncodedSourceMapSpan.sourceIndex);
|
|
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceLine - lastEncodedSourceMapSpan.sourceLine);
|
|
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.sourceColumn - lastEncodedSourceMapSpan.sourceColumn);
|
|
if (lastRecordedSourceMapSpan.nameIndex >= 0) {
|
|
ts.Debug.assert(false, "We do not support name index right now, Make sure to update updateLastEncodedAndRecordedSpans when we start using this");
|
|
sourceMapData.sourceMapMappings += base64VLQFormatEncode(lastRecordedSourceMapSpan.nameIndex - lastEncodedNameIndex);
|
|
lastEncodedNameIndex = lastRecordedSourceMapSpan.nameIndex;
|
|
}
|
|
lastEncodedSourceMapSpan = lastRecordedSourceMapSpan;
|
|
sourceMapData.sourceMapDecodedMappings.push(lastEncodedSourceMapSpan);
|
|
}
|
|
function emitPos(pos) {
|
|
if (pos === -1) {
|
|
return;
|
|
}
|
|
var sourceLinePos = ts.getLineAndCharacterOfPosition(currentSourceFile, pos);
|
|
sourceLinePos.line++;
|
|
sourceLinePos.character++;
|
|
var emittedLine = writer.getLine();
|
|
var emittedColumn = writer.getColumn();
|
|
if (!lastRecordedSourceMapSpan ||
|
|
lastRecordedSourceMapSpan.emittedLine !== emittedLine ||
|
|
lastRecordedSourceMapSpan.emittedColumn !== emittedColumn ||
|
|
(lastRecordedSourceMapSpan.sourceIndex === sourceMapSourceIndex &&
|
|
(lastRecordedSourceMapSpan.sourceLine > sourceLinePos.line ||
|
|
(lastRecordedSourceMapSpan.sourceLine === sourceLinePos.line && lastRecordedSourceMapSpan.sourceColumn > sourceLinePos.character)))) {
|
|
encodeLastRecordedSourceMapSpan();
|
|
lastRecordedSourceMapSpan = {
|
|
emittedLine: emittedLine,
|
|
emittedColumn: emittedColumn,
|
|
sourceLine: sourceLinePos.line,
|
|
sourceColumn: sourceLinePos.character,
|
|
sourceIndex: sourceMapSourceIndex
|
|
};
|
|
stopOverridingSpan = false;
|
|
}
|
|
else if (!stopOverridingSpan) {
|
|
lastRecordedSourceMapSpan.sourceLine = sourceLinePos.line;
|
|
lastRecordedSourceMapSpan.sourceColumn = sourceLinePos.character;
|
|
lastRecordedSourceMapSpan.sourceIndex = sourceMapSourceIndex;
|
|
}
|
|
updateLastEncodedAndRecordedSpans();
|
|
}
|
|
function getStartPos(range) {
|
|
var rangeHasDecorators = !!range.decorators;
|
|
return range.pos !== -1 ? ts.skipTrivia(currentSourceFile.text, rangeHasDecorators ? range.decorators.end : range.pos) : -1;
|
|
}
|
|
function emitStart(range) {
|
|
emitPos(getStartPos(range));
|
|
}
|
|
function emitEnd(range, stopOverridingEnd) {
|
|
emitPos(range.end);
|
|
stopOverridingSpan = stopOverridingEnd;
|
|
}
|
|
function changeEmitSourcePos() {
|
|
ts.Debug.assert(!modifyLastSourcePos);
|
|
modifyLastSourcePos = true;
|
|
}
|
|
function setSourceFile(sourceFile) {
|
|
currentSourceFile = sourceFile;
|
|
var sourcesDirectoryPath = compilerOptions.sourceRoot ? host.getCommonSourceDirectory() : sourceMapDir;
|
|
var source = ts.getRelativePathToDirectoryOrUrl(sourcesDirectoryPath, currentSourceFile.fileName, host.getCurrentDirectory(), host.getCanonicalFileName, true);
|
|
sourceMapSourceIndex = ts.indexOf(sourceMapData.sourceMapSources, source);
|
|
if (sourceMapSourceIndex === -1) {
|
|
sourceMapSourceIndex = sourceMapData.sourceMapSources.length;
|
|
sourceMapData.sourceMapSources.push(source);
|
|
sourceMapData.inputSourceFileNames.push(sourceFile.fileName);
|
|
if (compilerOptions.inlineSources) {
|
|
sourceMapData.sourceMapSourcesContent.push(sourceFile.text);
|
|
}
|
|
}
|
|
}
|
|
function getText() {
|
|
encodeLastRecordedSourceMapSpan();
|
|
return ts.stringify({
|
|
version: 3,
|
|
file: sourceMapData.sourceMapFile,
|
|
sourceRoot: sourceMapData.sourceMapSourceRoot,
|
|
sources: sourceMapData.sourceMapSources,
|
|
names: sourceMapData.sourceMapNames,
|
|
mappings: sourceMapData.sourceMapMappings,
|
|
sourcesContent: sourceMapData.sourceMapSourcesContent
|
|
});
|
|
}
|
|
function getSourceMappingURL() {
|
|
if (compilerOptions.inlineSourceMap) {
|
|
var base64SourceMapText = ts.convertToBase64(getText());
|
|
return sourceMapData.jsSourceMappingURL = "data:application/json;base64," + base64SourceMapText;
|
|
}
|
|
else {
|
|
return sourceMapData.jsSourceMappingURL;
|
|
}
|
|
}
|
|
}
|
|
ts.createSourceMapWriter = createSourceMapWriter;
|
|
var base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
function base64FormatEncode(inValue) {
|
|
if (inValue < 64) {
|
|
return base64Chars.charAt(inValue);
|
|
}
|
|
throw TypeError(inValue + ": not a 64 based value");
|
|
}
|
|
function base64VLQFormatEncode(inValue) {
|
|
if (inValue < 0) {
|
|
inValue = ((-inValue) << 1) + 1;
|
|
}
|
|
else {
|
|
inValue = inValue << 1;
|
|
}
|
|
var encodedStr = "";
|
|
do {
|
|
var currentDigit = inValue & 31;
|
|
inValue = inValue >> 5;
|
|
if (inValue > 0) {
|
|
currentDigit = currentDigit | 32;
|
|
}
|
|
encodedStr = encodedStr + base64FormatEncode(currentDigit);
|
|
} while (inValue > 0);
|
|
return encodedStr;
|
|
}
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function getDeclarationDiagnostics(host, resolver, targetSourceFile) {
|
|
var declarationDiagnostics = ts.createDiagnosticCollection();
|
|
ts.forEachExpectedEmitFile(host, getDeclarationDiagnosticsFromFile, targetSourceFile);
|
|
return declarationDiagnostics.getDiagnostics(targetSourceFile ? targetSourceFile.fileName : undefined);
|
|
function getDeclarationDiagnosticsFromFile(_a, sources, isBundledEmit) {
|
|
var declarationFilePath = _a.declarationFilePath;
|
|
emitDeclarations(host, resolver, declarationDiagnostics, declarationFilePath, sources, isBundledEmit);
|
|
}
|
|
}
|
|
ts.getDeclarationDiagnostics = getDeclarationDiagnostics;
|
|
function emitDeclarations(host, resolver, emitterDiagnostics, declarationFilePath, sourceFiles, isBundledEmit) {
|
|
var newLine = host.getNewLine();
|
|
var compilerOptions = host.getCompilerOptions();
|
|
var write;
|
|
var writeLine;
|
|
var increaseIndent;
|
|
var decreaseIndent;
|
|
var writeTextOfNode;
|
|
var writer;
|
|
createAndSetNewTextWriterWithSymbolWriter();
|
|
var enclosingDeclaration;
|
|
var resultHasExternalModuleIndicator;
|
|
var currentText;
|
|
var currentLineMap;
|
|
var currentIdentifiers;
|
|
var isCurrentFileExternalModule;
|
|
var reportedDeclarationError = false;
|
|
var errorNameNode;
|
|
var emitJsDocComments = compilerOptions.removeComments ? function (declaration) { } : writeJsDocComments;
|
|
var emit = compilerOptions.stripInternal ? stripInternal : emitNode;
|
|
var noDeclare;
|
|
var moduleElementDeclarationEmitInfo = [];
|
|
var asynchronousSubModuleDeclarationEmitInfo;
|
|
var referencesOutput = "";
|
|
var usedTypeDirectiveReferences;
|
|
var emittedReferencedFiles = [];
|
|
var addedGlobalFileReference = false;
|
|
var allSourcesModuleElementDeclarationEmitInfo = [];
|
|
ts.forEach(sourceFiles, function (sourceFile) {
|
|
if (ts.isSourceFileJavaScript(sourceFile)) {
|
|
return;
|
|
}
|
|
if (!compilerOptions.noResolve) {
|
|
ts.forEach(sourceFile.referencedFiles, function (fileReference) {
|
|
var referencedFile = ts.tryResolveScriptReference(host, sourceFile, fileReference);
|
|
if (referencedFile && !ts.contains(emittedReferencedFiles, referencedFile)) {
|
|
if (writeReferencePath(referencedFile, !isBundledEmit && !addedGlobalFileReference)) {
|
|
addedGlobalFileReference = true;
|
|
}
|
|
emittedReferencedFiles.push(referencedFile);
|
|
}
|
|
});
|
|
}
|
|
resultHasExternalModuleIndicator = false;
|
|
if (!isBundledEmit || !ts.isExternalModule(sourceFile)) {
|
|
noDeclare = false;
|
|
emitSourceFile(sourceFile);
|
|
}
|
|
else if (ts.isExternalModule(sourceFile)) {
|
|
noDeclare = true;
|
|
write("declare module \"" + ts.getResolvedExternalModuleName(host, sourceFile) + "\" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
emitSourceFile(sourceFile);
|
|
decreaseIndent();
|
|
write("}");
|
|
writeLine();
|
|
}
|
|
if (moduleElementDeclarationEmitInfo.length) {
|
|
var oldWriter = writer;
|
|
ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
|
|
if (aliasEmitInfo.isVisible && !aliasEmitInfo.asynchronousOutput) {
|
|
ts.Debug.assert(aliasEmitInfo.node.kind === 230);
|
|
createAndSetNewTextWriterWithSymbolWriter();
|
|
ts.Debug.assert(aliasEmitInfo.indent === 0 || (aliasEmitInfo.indent === 1 && isBundledEmit));
|
|
for (var i = 0; i < aliasEmitInfo.indent; i++) {
|
|
increaseIndent();
|
|
}
|
|
writeImportDeclaration(aliasEmitInfo.node);
|
|
aliasEmitInfo.asynchronousOutput = writer.getText();
|
|
for (var i = 0; i < aliasEmitInfo.indent; i++) {
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
});
|
|
setWriter(oldWriter);
|
|
allSourcesModuleElementDeclarationEmitInfo = allSourcesModuleElementDeclarationEmitInfo.concat(moduleElementDeclarationEmitInfo);
|
|
moduleElementDeclarationEmitInfo = [];
|
|
}
|
|
if (!isBundledEmit && ts.isExternalModule(sourceFile) && sourceFile.moduleAugmentations.length && !resultHasExternalModuleIndicator) {
|
|
write("export {};");
|
|
writeLine();
|
|
}
|
|
});
|
|
if (usedTypeDirectiveReferences) {
|
|
for (var directive in usedTypeDirectiveReferences) {
|
|
if (ts.hasProperty(usedTypeDirectiveReferences, directive)) {
|
|
referencesOutput += "/// <reference types=\"" + directive + "\" />" + newLine;
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
reportedDeclarationError: reportedDeclarationError,
|
|
moduleElementDeclarationEmitInfo: allSourcesModuleElementDeclarationEmitInfo,
|
|
synchronousDeclarationOutput: writer.getText(),
|
|
referencesOutput: referencesOutput
|
|
};
|
|
function hasInternalAnnotation(range) {
|
|
var comment = currentText.substring(range.pos, range.end);
|
|
return comment.indexOf("@internal") >= 0;
|
|
}
|
|
function stripInternal(node) {
|
|
if (node) {
|
|
var leadingCommentRanges = ts.getLeadingCommentRanges(currentText, node.pos);
|
|
if (ts.forEach(leadingCommentRanges, hasInternalAnnotation)) {
|
|
return;
|
|
}
|
|
emitNode(node);
|
|
}
|
|
}
|
|
function createAndSetNewTextWriterWithSymbolWriter() {
|
|
var writer = ts.createTextWriter(newLine);
|
|
writer.trackSymbol = trackSymbol;
|
|
writer.reportInaccessibleThisError = reportInaccessibleThisError;
|
|
writer.writeKeyword = writer.write;
|
|
writer.writeOperator = writer.write;
|
|
writer.writePunctuation = writer.write;
|
|
writer.writeSpace = writer.write;
|
|
writer.writeStringLiteral = writer.writeLiteral;
|
|
writer.writeParameter = writer.write;
|
|
writer.writeSymbol = writer.write;
|
|
setWriter(writer);
|
|
}
|
|
function setWriter(newWriter) {
|
|
writer = newWriter;
|
|
write = newWriter.write;
|
|
writeTextOfNode = newWriter.writeTextOfNode;
|
|
writeLine = newWriter.writeLine;
|
|
increaseIndent = newWriter.increaseIndent;
|
|
decreaseIndent = newWriter.decreaseIndent;
|
|
}
|
|
function writeAsynchronousModuleElements(nodes) {
|
|
var oldWriter = writer;
|
|
ts.forEach(nodes, function (declaration) {
|
|
var nodeToCheck;
|
|
if (declaration.kind === 218) {
|
|
nodeToCheck = declaration.parent.parent;
|
|
}
|
|
else if (declaration.kind === 233 || declaration.kind === 234 || declaration.kind === 231) {
|
|
ts.Debug.fail("We should be getting ImportDeclaration instead to write");
|
|
}
|
|
else {
|
|
nodeToCheck = declaration;
|
|
}
|
|
var moduleElementEmitInfo = ts.forEach(moduleElementDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
|
|
if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
|
|
moduleElementEmitInfo = ts.forEach(asynchronousSubModuleDeclarationEmitInfo, function (declEmitInfo) { return declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined; });
|
|
}
|
|
if (moduleElementEmitInfo) {
|
|
if (moduleElementEmitInfo.node.kind === 230) {
|
|
moduleElementEmitInfo.isVisible = true;
|
|
}
|
|
else {
|
|
createAndSetNewTextWriterWithSymbolWriter();
|
|
for (var declarationIndent = moduleElementEmitInfo.indent; declarationIndent; declarationIndent--) {
|
|
increaseIndent();
|
|
}
|
|
if (nodeToCheck.kind === 225) {
|
|
ts.Debug.assert(asynchronousSubModuleDeclarationEmitInfo === undefined);
|
|
asynchronousSubModuleDeclarationEmitInfo = [];
|
|
}
|
|
writeModuleElement(nodeToCheck);
|
|
if (nodeToCheck.kind === 225) {
|
|
moduleElementEmitInfo.subModuleElementDeclarationEmitInfo = asynchronousSubModuleDeclarationEmitInfo;
|
|
asynchronousSubModuleDeclarationEmitInfo = undefined;
|
|
}
|
|
moduleElementEmitInfo.asynchronousOutput = writer.getText();
|
|
}
|
|
}
|
|
});
|
|
setWriter(oldWriter);
|
|
}
|
|
function recordTypeReferenceDirectivesIfNecessary(typeReferenceDirectives) {
|
|
if (!typeReferenceDirectives) {
|
|
return;
|
|
}
|
|
if (!usedTypeDirectiveReferences) {
|
|
usedTypeDirectiveReferences = {};
|
|
}
|
|
for (var _i = 0, typeReferenceDirectives_1 = typeReferenceDirectives; _i < typeReferenceDirectives_1.length; _i++) {
|
|
var directive = typeReferenceDirectives_1[_i];
|
|
if (!ts.hasProperty(usedTypeDirectiveReferences, directive)) {
|
|
usedTypeDirectiveReferences[directive] = directive;
|
|
}
|
|
}
|
|
}
|
|
function handleSymbolAccessibilityError(symbolAccessibilityResult) {
|
|
if (symbolAccessibilityResult.accessibility === 0) {
|
|
if (symbolAccessibilityResult && symbolAccessibilityResult.aliasesToMakeVisible) {
|
|
writeAsynchronousModuleElements(symbolAccessibilityResult.aliasesToMakeVisible);
|
|
}
|
|
}
|
|
else {
|
|
reportedDeclarationError = true;
|
|
var errorInfo = writer.getSymbolAccessibilityDiagnostic(symbolAccessibilityResult);
|
|
if (errorInfo) {
|
|
if (errorInfo.typeName) {
|
|
emitterDiagnostics.add(ts.createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, ts.getTextOfNodeFromSourceText(currentText, errorInfo.typeName), symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName));
|
|
}
|
|
else {
|
|
emitterDiagnostics.add(ts.createDiagnosticForNode(symbolAccessibilityResult.errorNode || errorInfo.errorNode, errorInfo.diagnosticMessage, symbolAccessibilityResult.errorSymbolName, symbolAccessibilityResult.errorModuleName));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function trackSymbol(symbol, enclosingDeclaration, meaning) {
|
|
handleSymbolAccessibilityError(resolver.isSymbolAccessible(symbol, enclosingDeclaration, meaning));
|
|
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForSymbol(symbol, meaning));
|
|
}
|
|
function reportInaccessibleThisError() {
|
|
if (errorNameNode) {
|
|
reportedDeclarationError = true;
|
|
emitterDiagnostics.add(ts.createDiagnosticForNode(errorNameNode, ts.Diagnostics.The_inferred_type_of_0_references_an_inaccessible_this_type_A_type_annotation_is_necessary, ts.declarationNameToString(errorNameNode)));
|
|
}
|
|
}
|
|
function writeTypeOfDeclaration(declaration, type, getSymbolAccessibilityDiagnostic) {
|
|
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
|
|
write(": ");
|
|
if (type) {
|
|
emitType(type);
|
|
}
|
|
else {
|
|
errorNameNode = declaration.name;
|
|
resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, 2, writer);
|
|
errorNameNode = undefined;
|
|
}
|
|
}
|
|
function writeReturnTypeAtSignature(signature, getSymbolAccessibilityDiagnostic) {
|
|
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
|
|
write(": ");
|
|
if (signature.type) {
|
|
emitType(signature.type);
|
|
}
|
|
else {
|
|
errorNameNode = signature.name;
|
|
resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, 2, writer);
|
|
errorNameNode = undefined;
|
|
}
|
|
}
|
|
function emitLines(nodes) {
|
|
for (var _i = 0, nodes_2 = nodes; _i < nodes_2.length; _i++) {
|
|
var node = nodes_2[_i];
|
|
emit(node);
|
|
}
|
|
}
|
|
function emitSeparatedList(nodes, separator, eachNodeEmitFn, canEmitFn) {
|
|
var currentWriterPos = writer.getTextPos();
|
|
for (var _i = 0, nodes_3 = nodes; _i < nodes_3.length; _i++) {
|
|
var node = nodes_3[_i];
|
|
if (!canEmitFn || canEmitFn(node)) {
|
|
if (currentWriterPos !== writer.getTextPos()) {
|
|
write(separator);
|
|
}
|
|
currentWriterPos = writer.getTextPos();
|
|
eachNodeEmitFn(node);
|
|
}
|
|
}
|
|
}
|
|
function emitCommaList(nodes, eachNodeEmitFn, canEmitFn) {
|
|
emitSeparatedList(nodes, ", ", eachNodeEmitFn, canEmitFn);
|
|
}
|
|
function writeJsDocComments(declaration) {
|
|
if (declaration) {
|
|
var jsDocComments = ts.getJsDocCommentsFromText(declaration, currentText);
|
|
ts.emitNewLineBeforeLeadingComments(currentLineMap, writer, declaration, jsDocComments);
|
|
ts.emitComments(currentText, currentLineMap, writer, jsDocComments, true, newLine, ts.writeCommentRange);
|
|
}
|
|
}
|
|
function emitTypeWithNewGetSymbolAccessibilityDiagnostic(type, getSymbolAccessibilityDiagnostic) {
|
|
writer.getSymbolAccessibilityDiagnostic = getSymbolAccessibilityDiagnostic;
|
|
emitType(type);
|
|
}
|
|
function emitType(type) {
|
|
switch (type.kind) {
|
|
case 117:
|
|
case 132:
|
|
case 130:
|
|
case 120:
|
|
case 133:
|
|
case 103:
|
|
case 135:
|
|
case 93:
|
|
case 127:
|
|
case 165:
|
|
case 166:
|
|
return writeTextOfNode(currentText, type);
|
|
case 194:
|
|
return emitExpressionWithTypeArguments(type);
|
|
case 155:
|
|
return emitTypeReference(type);
|
|
case 158:
|
|
return emitTypeQuery(type);
|
|
case 160:
|
|
return emitArrayType(type);
|
|
case 161:
|
|
return emitTupleType(type);
|
|
case 162:
|
|
return emitUnionType(type);
|
|
case 163:
|
|
return emitIntersectionType(type);
|
|
case 164:
|
|
return emitParenType(type);
|
|
case 156:
|
|
case 157:
|
|
return emitSignatureDeclarationWithJsDocComments(type);
|
|
case 159:
|
|
return emitTypeLiteral(type);
|
|
case 69:
|
|
return emitEntityName(type);
|
|
case 139:
|
|
return emitEntityName(type);
|
|
case 154:
|
|
return emitTypePredicate(type);
|
|
}
|
|
function writeEntityName(entityName) {
|
|
if (entityName.kind === 69) {
|
|
writeTextOfNode(currentText, entityName);
|
|
}
|
|
else {
|
|
var left = entityName.kind === 139 ? entityName.left : entityName.expression;
|
|
var right = entityName.kind === 139 ? entityName.right : entityName.name;
|
|
writeEntityName(left);
|
|
write(".");
|
|
writeTextOfNode(currentText, right);
|
|
}
|
|
}
|
|
function emitEntityName(entityName) {
|
|
var visibilityResult = resolver.isEntityNameVisible(entityName, entityName.parent.kind === 229 ? entityName.parent : enclosingDeclaration);
|
|
handleSymbolAccessibilityError(visibilityResult);
|
|
recordTypeReferenceDirectivesIfNecessary(resolver.getTypeReferenceDirectivesForEntityName(entityName));
|
|
writeEntityName(entityName);
|
|
}
|
|
function emitExpressionWithTypeArguments(node) {
|
|
if (ts.isSupportedExpressionWithTypeArguments(node)) {
|
|
ts.Debug.assert(node.expression.kind === 69 || node.expression.kind === 172);
|
|
emitEntityName(node.expression);
|
|
if (node.typeArguments) {
|
|
write("<");
|
|
emitCommaList(node.typeArguments, emitType);
|
|
write(">");
|
|
}
|
|
}
|
|
}
|
|
function emitTypeReference(type) {
|
|
emitEntityName(type.typeName);
|
|
if (type.typeArguments) {
|
|
write("<");
|
|
emitCommaList(type.typeArguments, emitType);
|
|
write(">");
|
|
}
|
|
}
|
|
function emitTypePredicate(type) {
|
|
writeTextOfNode(currentText, type.parameterName);
|
|
write(" is ");
|
|
emitType(type.type);
|
|
}
|
|
function emitTypeQuery(type) {
|
|
write("typeof ");
|
|
emitEntityName(type.exprName);
|
|
}
|
|
function emitArrayType(type) {
|
|
emitType(type.elementType);
|
|
write("[]");
|
|
}
|
|
function emitTupleType(type) {
|
|
write("[");
|
|
emitCommaList(type.elementTypes, emitType);
|
|
write("]");
|
|
}
|
|
function emitUnionType(type) {
|
|
emitSeparatedList(type.types, " | ", emitType);
|
|
}
|
|
function emitIntersectionType(type) {
|
|
emitSeparatedList(type.types, " & ", emitType);
|
|
}
|
|
function emitParenType(type) {
|
|
write("(");
|
|
emitType(type.type);
|
|
write(")");
|
|
}
|
|
function emitTypeLiteral(type) {
|
|
write("{");
|
|
if (type.members.length) {
|
|
writeLine();
|
|
increaseIndent();
|
|
emitLines(type.members);
|
|
decreaseIndent();
|
|
}
|
|
write("}");
|
|
}
|
|
}
|
|
function emitSourceFile(node) {
|
|
currentText = node.text;
|
|
currentLineMap = ts.getLineStarts(node);
|
|
currentIdentifiers = node.identifiers;
|
|
isCurrentFileExternalModule = ts.isExternalModule(node);
|
|
enclosingDeclaration = node;
|
|
ts.emitDetachedComments(currentText, currentLineMap, writer, ts.writeCommentRange, node, newLine, true);
|
|
emitLines(node.statements);
|
|
}
|
|
function getExportDefaultTempVariableName() {
|
|
var baseName = "_default";
|
|
if (!ts.hasProperty(currentIdentifiers, baseName)) {
|
|
return baseName;
|
|
}
|
|
var count = 0;
|
|
while (true) {
|
|
count++;
|
|
var name_23 = baseName + "_" + count;
|
|
if (!ts.hasProperty(currentIdentifiers, name_23)) {
|
|
return name_23;
|
|
}
|
|
}
|
|
}
|
|
function emitExportAssignment(node) {
|
|
if (node.expression.kind === 69) {
|
|
write(node.isExportEquals ? "export = " : "export default ");
|
|
writeTextOfNode(currentText, node.expression);
|
|
}
|
|
else {
|
|
var tempVarName = getExportDefaultTempVariableName();
|
|
if (!noDeclare) {
|
|
write("declare ");
|
|
}
|
|
write("var ");
|
|
write(tempVarName);
|
|
write(": ");
|
|
writer.getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic;
|
|
resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, 2, writer);
|
|
write(";");
|
|
writeLine();
|
|
write(node.isExportEquals ? "export = " : "export default ");
|
|
write(tempVarName);
|
|
}
|
|
write(";");
|
|
writeLine();
|
|
if (node.expression.kind === 69) {
|
|
var nodes = resolver.collectLinkedAliases(node.expression);
|
|
writeAsynchronousModuleElements(nodes);
|
|
}
|
|
function getDefaultExportAccessibilityDiagnostic(diagnostic) {
|
|
return {
|
|
diagnosticMessage: ts.Diagnostics.Default_export_of_the_module_has_or_is_using_private_name_0,
|
|
errorNode: node
|
|
};
|
|
}
|
|
}
|
|
function isModuleElementVisible(node) {
|
|
return resolver.isDeclarationVisible(node);
|
|
}
|
|
function emitModuleElement(node, isModuleElementVisible) {
|
|
if (isModuleElementVisible) {
|
|
writeModuleElement(node);
|
|
}
|
|
else if (node.kind === 229 ||
|
|
(node.parent.kind === 256 && isCurrentFileExternalModule)) {
|
|
var isVisible = void 0;
|
|
if (asynchronousSubModuleDeclarationEmitInfo && node.parent.kind !== 256) {
|
|
asynchronousSubModuleDeclarationEmitInfo.push({
|
|
node: node,
|
|
outputPos: writer.getTextPos(),
|
|
indent: writer.getIndent(),
|
|
isVisible: isVisible
|
|
});
|
|
}
|
|
else {
|
|
if (node.kind === 230) {
|
|
var importDeclaration = node;
|
|
if (importDeclaration.importClause) {
|
|
isVisible = (importDeclaration.importClause.name && resolver.isDeclarationVisible(importDeclaration.importClause)) ||
|
|
isVisibleNamedBinding(importDeclaration.importClause.namedBindings);
|
|
}
|
|
}
|
|
moduleElementDeclarationEmitInfo.push({
|
|
node: node,
|
|
outputPos: writer.getTextPos(),
|
|
indent: writer.getIndent(),
|
|
isVisible: isVisible
|
|
});
|
|
}
|
|
}
|
|
}
|
|
function writeModuleElement(node) {
|
|
switch (node.kind) {
|
|
case 220:
|
|
return writeFunctionDeclaration(node);
|
|
case 200:
|
|
return writeVariableStatement(node);
|
|
case 222:
|
|
return writeInterfaceDeclaration(node);
|
|
case 221:
|
|
return writeClassDeclaration(node);
|
|
case 223:
|
|
return writeTypeAliasDeclaration(node);
|
|
case 224:
|
|
return writeEnumDeclaration(node);
|
|
case 225:
|
|
return writeModuleDeclaration(node);
|
|
case 229:
|
|
return writeImportEqualsDeclaration(node);
|
|
case 230:
|
|
return writeImportDeclaration(node);
|
|
default:
|
|
ts.Debug.fail("Unknown symbol kind");
|
|
}
|
|
}
|
|
function emitModuleElementDeclarationFlags(node) {
|
|
if (node.parent.kind === 256) {
|
|
if (node.flags & 1) {
|
|
write("export ");
|
|
}
|
|
if (node.flags & 512) {
|
|
write("default ");
|
|
}
|
|
else if (node.kind !== 222 && !noDeclare) {
|
|
write("declare ");
|
|
}
|
|
}
|
|
}
|
|
function emitClassMemberDeclarationFlags(flags) {
|
|
if (flags & 8) {
|
|
write("private ");
|
|
}
|
|
else if (flags & 16) {
|
|
write("protected ");
|
|
}
|
|
if (flags & 32) {
|
|
write("static ");
|
|
}
|
|
if (flags & 64) {
|
|
write("readonly ");
|
|
}
|
|
if (flags & 128) {
|
|
write("abstract ");
|
|
}
|
|
}
|
|
function writeImportEqualsDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
if (node.flags & 1) {
|
|
write("export ");
|
|
}
|
|
write("import ");
|
|
writeTextOfNode(currentText, node.name);
|
|
write(" = ");
|
|
if (ts.isInternalModuleImportEqualsDeclaration(node)) {
|
|
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.moduleReference, getImportEntityNameVisibilityError);
|
|
write(";");
|
|
}
|
|
else {
|
|
write("require(");
|
|
emitExternalModuleSpecifier(node);
|
|
write(");");
|
|
}
|
|
writer.writeLine();
|
|
function getImportEntityNameVisibilityError(symbolAccessibilityResult) {
|
|
return {
|
|
diagnosticMessage: ts.Diagnostics.Import_declaration_0_is_using_private_name_1,
|
|
errorNode: node,
|
|
typeName: node.name
|
|
};
|
|
}
|
|
}
|
|
function isVisibleNamedBinding(namedBindings) {
|
|
if (namedBindings) {
|
|
if (namedBindings.kind === 232) {
|
|
return resolver.isDeclarationVisible(namedBindings);
|
|
}
|
|
else {
|
|
return ts.forEach(namedBindings.elements, function (namedImport) { return resolver.isDeclarationVisible(namedImport); });
|
|
}
|
|
}
|
|
}
|
|
function writeImportDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
if (node.flags & 1) {
|
|
write("export ");
|
|
}
|
|
write("import ");
|
|
if (node.importClause) {
|
|
var currentWriterPos = writer.getTextPos();
|
|
if (node.importClause.name && resolver.isDeclarationVisible(node.importClause)) {
|
|
writeTextOfNode(currentText, node.importClause.name);
|
|
}
|
|
if (node.importClause.namedBindings && isVisibleNamedBinding(node.importClause.namedBindings)) {
|
|
if (currentWriterPos !== writer.getTextPos()) {
|
|
write(", ");
|
|
}
|
|
if (node.importClause.namedBindings.kind === 232) {
|
|
write("* as ");
|
|
writeTextOfNode(currentText, node.importClause.namedBindings.name);
|
|
}
|
|
else {
|
|
write("{ ");
|
|
emitCommaList(node.importClause.namedBindings.elements, emitImportOrExportSpecifier, resolver.isDeclarationVisible);
|
|
write(" }");
|
|
}
|
|
}
|
|
write(" from ");
|
|
}
|
|
emitExternalModuleSpecifier(node);
|
|
write(";");
|
|
writer.writeLine();
|
|
}
|
|
function emitExternalModuleSpecifier(parent) {
|
|
resultHasExternalModuleIndicator = resultHasExternalModuleIndicator || parent.kind !== 225;
|
|
var moduleSpecifier;
|
|
if (parent.kind === 229) {
|
|
var node = parent;
|
|
moduleSpecifier = ts.getExternalModuleImportEqualsDeclarationExpression(node);
|
|
}
|
|
else if (parent.kind === 225) {
|
|
moduleSpecifier = parent.name;
|
|
}
|
|
else {
|
|
var node = parent;
|
|
moduleSpecifier = node.moduleSpecifier;
|
|
}
|
|
if (moduleSpecifier.kind === 9 && isBundledEmit && (compilerOptions.out || compilerOptions.outFile)) {
|
|
var moduleName = ts.getExternalModuleNameFromDeclaration(host, resolver, parent);
|
|
if (moduleName) {
|
|
write('"');
|
|
write(moduleName);
|
|
write('"');
|
|
return;
|
|
}
|
|
}
|
|
writeTextOfNode(currentText, moduleSpecifier);
|
|
}
|
|
function emitImportOrExportSpecifier(node) {
|
|
if (node.propertyName) {
|
|
writeTextOfNode(currentText, node.propertyName);
|
|
write(" as ");
|
|
}
|
|
writeTextOfNode(currentText, node.name);
|
|
}
|
|
function emitExportSpecifier(node) {
|
|
emitImportOrExportSpecifier(node);
|
|
var nodes = resolver.collectLinkedAliases(node.propertyName || node.name);
|
|
writeAsynchronousModuleElements(nodes);
|
|
}
|
|
function emitExportDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
write("export ");
|
|
if (node.exportClause) {
|
|
write("{ ");
|
|
emitCommaList(node.exportClause.elements, emitExportSpecifier);
|
|
write(" }");
|
|
}
|
|
else {
|
|
write("*");
|
|
}
|
|
if (node.moduleSpecifier) {
|
|
write(" from ");
|
|
emitExternalModuleSpecifier(node);
|
|
}
|
|
write(";");
|
|
writer.writeLine();
|
|
}
|
|
function writeModuleDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
if (ts.isGlobalScopeAugmentation(node)) {
|
|
write("global ");
|
|
}
|
|
else {
|
|
if (node.flags & 4096) {
|
|
write("namespace ");
|
|
}
|
|
else {
|
|
write("module ");
|
|
}
|
|
if (ts.isExternalModuleAugmentation(node)) {
|
|
emitExternalModuleSpecifier(node);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node.name);
|
|
}
|
|
}
|
|
while (node.body && node.body.kind !== 226) {
|
|
node = node.body;
|
|
write(".");
|
|
writeTextOfNode(currentText, node.name);
|
|
}
|
|
var prevEnclosingDeclaration = enclosingDeclaration;
|
|
if (node.body) {
|
|
enclosingDeclaration = node;
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
emitLines(node.body.statements);
|
|
decreaseIndent();
|
|
write("}");
|
|
writeLine();
|
|
enclosingDeclaration = prevEnclosingDeclaration;
|
|
}
|
|
else {
|
|
write(";");
|
|
}
|
|
}
|
|
function writeTypeAliasDeclaration(node) {
|
|
var prevEnclosingDeclaration = enclosingDeclaration;
|
|
enclosingDeclaration = node;
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
write("type ");
|
|
writeTextOfNode(currentText, node.name);
|
|
emitTypeParameters(node.typeParameters);
|
|
write(" = ");
|
|
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.type, getTypeAliasDeclarationVisibilityError);
|
|
write(";");
|
|
writeLine();
|
|
enclosingDeclaration = prevEnclosingDeclaration;
|
|
function getTypeAliasDeclarationVisibilityError(symbolAccessibilityResult) {
|
|
return {
|
|
diagnosticMessage: ts.Diagnostics.Exported_type_alias_0_has_or_is_using_private_name_1,
|
|
errorNode: node.type,
|
|
typeName: node.name
|
|
};
|
|
}
|
|
}
|
|
function writeEnumDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
if (ts.isConst(node)) {
|
|
write("const ");
|
|
}
|
|
write("enum ");
|
|
writeTextOfNode(currentText, node.name);
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
emitLines(node.members);
|
|
decreaseIndent();
|
|
write("}");
|
|
writeLine();
|
|
}
|
|
function emitEnumMemberDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
writeTextOfNode(currentText, node.name);
|
|
var enumMemberValue = resolver.getConstantValue(node);
|
|
if (enumMemberValue !== undefined) {
|
|
write(" = ");
|
|
write(enumMemberValue.toString());
|
|
}
|
|
write(",");
|
|
writeLine();
|
|
}
|
|
function isPrivateMethodTypeParameter(node) {
|
|
return node.parent.kind === 147 && (node.parent.flags & 8);
|
|
}
|
|
function emitTypeParameters(typeParameters) {
|
|
function emitTypeParameter(node) {
|
|
increaseIndent();
|
|
emitJsDocComments(node);
|
|
decreaseIndent();
|
|
writeTextOfNode(currentText, node.name);
|
|
if (node.constraint && !isPrivateMethodTypeParameter(node)) {
|
|
write(" extends ");
|
|
if (node.parent.kind === 156 ||
|
|
node.parent.kind === 157 ||
|
|
(node.parent.parent && node.parent.parent.kind === 159)) {
|
|
ts.Debug.assert(node.parent.kind === 147 ||
|
|
node.parent.kind === 146 ||
|
|
node.parent.kind === 156 ||
|
|
node.parent.kind === 157 ||
|
|
node.parent.kind === 151 ||
|
|
node.parent.kind === 152);
|
|
emitType(node.constraint);
|
|
}
|
|
else {
|
|
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node.constraint, getTypeParameterConstraintVisibilityError);
|
|
}
|
|
}
|
|
function getTypeParameterConstraintVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage;
|
|
switch (node.parent.kind) {
|
|
case 221:
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_class_has_or_is_using_private_name_1;
|
|
break;
|
|
case 222:
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1;
|
|
break;
|
|
case 152:
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
|
|
break;
|
|
case 151:
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
|
|
break;
|
|
case 147:
|
|
case 146:
|
|
if (node.parent.flags & 32) {
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else if (node.parent.parent.kind === 221) {
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else {
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
|
|
}
|
|
break;
|
|
case 220:
|
|
diagnosticMessage = ts.Diagnostics.Type_parameter_0_of_exported_function_has_or_is_using_private_name_1;
|
|
break;
|
|
default:
|
|
ts.Debug.fail("This is unknown parent for type parameter: " + node.parent.kind);
|
|
}
|
|
return {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: node,
|
|
typeName: node.name
|
|
};
|
|
}
|
|
}
|
|
if (typeParameters) {
|
|
write("<");
|
|
emitCommaList(typeParameters, emitTypeParameter);
|
|
write(">");
|
|
}
|
|
}
|
|
function emitHeritageClause(typeReferences, isImplementsList) {
|
|
if (typeReferences) {
|
|
write(isImplementsList ? " implements " : " extends ");
|
|
emitCommaList(typeReferences, emitTypeOfTypeReference);
|
|
}
|
|
function emitTypeOfTypeReference(node) {
|
|
if (ts.isSupportedExpressionWithTypeArguments(node)) {
|
|
emitTypeWithNewGetSymbolAccessibilityDiagnostic(node, getHeritageClauseVisibilityError);
|
|
}
|
|
else if (!isImplementsList && node.expression.kind === 93) {
|
|
write("null");
|
|
}
|
|
else {
|
|
writer.getSymbolAccessibilityDiagnostic = getHeritageClauseVisibilityError;
|
|
resolver.writeBaseConstructorTypeOfClass(enclosingDeclaration, enclosingDeclaration, 2, writer);
|
|
}
|
|
function getHeritageClauseVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage;
|
|
if (node.parent.parent.kind === 221) {
|
|
diagnosticMessage = isImplementsList ?
|
|
ts.Diagnostics.Implements_clause_of_exported_class_0_has_or_is_using_private_name_1 :
|
|
ts.Diagnostics.Extends_clause_of_exported_class_0_has_or_is_using_private_name_1;
|
|
}
|
|
else {
|
|
diagnosticMessage = ts.Diagnostics.Extends_clause_of_exported_interface_0_has_or_is_using_private_name_1;
|
|
}
|
|
return {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: node,
|
|
typeName: node.parent.parent.name
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function writeClassDeclaration(node) {
|
|
function emitParameterProperties(constructorDeclaration) {
|
|
if (constructorDeclaration) {
|
|
ts.forEach(constructorDeclaration.parameters, function (param) {
|
|
if (param.flags & 92) {
|
|
emitPropertyDeclaration(param);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
if (node.flags & 128) {
|
|
write("abstract ");
|
|
}
|
|
write("class ");
|
|
writeTextOfNode(currentText, node.name);
|
|
var prevEnclosingDeclaration = enclosingDeclaration;
|
|
enclosingDeclaration = node;
|
|
emitTypeParameters(node.typeParameters);
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
|
|
if (baseTypeNode) {
|
|
emitHeritageClause([baseTypeNode], false);
|
|
}
|
|
emitHeritageClause(ts.getClassImplementsHeritageClauseElements(node), true);
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
emitParameterProperties(ts.getFirstConstructorWithBody(node));
|
|
emitLines(node.members);
|
|
decreaseIndent();
|
|
write("}");
|
|
writeLine();
|
|
enclosingDeclaration = prevEnclosingDeclaration;
|
|
}
|
|
function writeInterfaceDeclaration(node) {
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
write("interface ");
|
|
writeTextOfNode(currentText, node.name);
|
|
var prevEnclosingDeclaration = enclosingDeclaration;
|
|
enclosingDeclaration = node;
|
|
emitTypeParameters(node.typeParameters);
|
|
emitHeritageClause(ts.getInterfaceBaseTypeNodes(node), false);
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
emitLines(node.members);
|
|
decreaseIndent();
|
|
write("}");
|
|
writeLine();
|
|
enclosingDeclaration = prevEnclosingDeclaration;
|
|
}
|
|
function emitPropertyDeclaration(node) {
|
|
if (ts.hasDynamicName(node)) {
|
|
return;
|
|
}
|
|
emitJsDocComments(node);
|
|
emitClassMemberDeclarationFlags(node.flags);
|
|
emitVariableDeclaration(node);
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
function emitVariableDeclaration(node) {
|
|
if (node.kind !== 218 || resolver.isDeclarationVisible(node)) {
|
|
if (ts.isBindingPattern(node.name)) {
|
|
emitBindingPattern(node.name);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node.name);
|
|
if ((node.kind === 145 || node.kind === 144 || node.kind === 142) && ts.hasQuestionToken(node)) {
|
|
write("?");
|
|
}
|
|
if ((node.kind === 145 || node.kind === 144) && node.parent.kind === 159) {
|
|
emitTypeOfVariableDeclarationFromTypeLiteral(node);
|
|
}
|
|
else if (!(node.flags & 8)) {
|
|
writeTypeOfDeclaration(node, node.type, getVariableDeclarationTypeVisibilityError);
|
|
}
|
|
}
|
|
}
|
|
function getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
|
|
if (node.kind === 218) {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Exported_variable_0_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Exported_variable_0_has_or_is_using_private_name_1;
|
|
}
|
|
else if (node.kind === 145 || node.kind === 144) {
|
|
if (node.flags & 32) {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Public_static_property_0_of_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else if (node.parent.kind === 221) {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Public_property_0_of_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Property_0_of_exported_interface_has_or_is_using_private_name_1;
|
|
}
|
|
}
|
|
}
|
|
function getVariableDeclarationTypeVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
|
|
return diagnosticMessage !== undefined ? {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: node,
|
|
typeName: node.name
|
|
} : undefined;
|
|
}
|
|
function emitBindingPattern(bindingPattern) {
|
|
var elements = [];
|
|
for (var _i = 0, _a = bindingPattern.elements; _i < _a.length; _i++) {
|
|
var element = _a[_i];
|
|
if (element.kind !== 193) {
|
|
elements.push(element);
|
|
}
|
|
}
|
|
emitCommaList(elements, emitBindingElement);
|
|
}
|
|
function emitBindingElement(bindingElement) {
|
|
function getBindingElementTypeVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage = getVariableDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
|
|
return diagnosticMessage !== undefined ? {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: bindingElement,
|
|
typeName: bindingElement.name
|
|
} : undefined;
|
|
}
|
|
if (bindingElement.name) {
|
|
if (ts.isBindingPattern(bindingElement.name)) {
|
|
emitBindingPattern(bindingElement.name);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, bindingElement.name);
|
|
writeTypeOfDeclaration(bindingElement, undefined, getBindingElementTypeVisibilityError);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitTypeOfVariableDeclarationFromTypeLiteral(node) {
|
|
if (node.type) {
|
|
write(": ");
|
|
emitType(node.type);
|
|
}
|
|
}
|
|
function isVariableStatementVisible(node) {
|
|
return ts.forEach(node.declarationList.declarations, function (varDeclaration) { return resolver.isDeclarationVisible(varDeclaration); });
|
|
}
|
|
function writeVariableStatement(node) {
|
|
emitJsDocComments(node);
|
|
emitModuleElementDeclarationFlags(node);
|
|
if (ts.isLet(node.declarationList)) {
|
|
write("let ");
|
|
}
|
|
else if (ts.isConst(node.declarationList)) {
|
|
write("const ");
|
|
}
|
|
else {
|
|
write("var ");
|
|
}
|
|
emitCommaList(node.declarationList.declarations, emitVariableDeclaration, resolver.isDeclarationVisible);
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
function emitAccessorDeclaration(node) {
|
|
if (ts.hasDynamicName(node)) {
|
|
return;
|
|
}
|
|
var accessors = ts.getAllAccessorDeclarations(node.parent.members, node);
|
|
var accessorWithTypeAnnotation;
|
|
if (node === accessors.firstAccessor) {
|
|
emitJsDocComments(accessors.getAccessor);
|
|
emitJsDocComments(accessors.setAccessor);
|
|
emitClassMemberDeclarationFlags(node.flags | (accessors.setAccessor ? 0 : 64));
|
|
writeTextOfNode(currentText, node.name);
|
|
if (!(node.flags & 8)) {
|
|
accessorWithTypeAnnotation = node;
|
|
var type = getTypeAnnotationFromAccessor(node);
|
|
if (!type) {
|
|
var anotherAccessor = node.kind === 149 ? accessors.setAccessor : accessors.getAccessor;
|
|
type = getTypeAnnotationFromAccessor(anotherAccessor);
|
|
if (type) {
|
|
accessorWithTypeAnnotation = anotherAccessor;
|
|
}
|
|
}
|
|
writeTypeOfDeclaration(node, type, getAccessorDeclarationTypeVisibilityError);
|
|
}
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
function getTypeAnnotationFromAccessor(accessor) {
|
|
if (accessor) {
|
|
return accessor.kind === 149
|
|
? accessor.type
|
|
: accessor.parameters.length > 0
|
|
? accessor.parameters[0].type
|
|
: undefined;
|
|
}
|
|
}
|
|
function getAccessorDeclarationTypeVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage;
|
|
if (accessorWithTypeAnnotation.kind === 150) {
|
|
if (accessorWithTypeAnnotation.parent.flags & 32) {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_public_static_property_setter_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_public_property_setter_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
return {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: accessorWithTypeAnnotation.parameters[0],
|
|
typeName: accessorWithTypeAnnotation.name
|
|
};
|
|
}
|
|
else {
|
|
if (accessorWithTypeAnnotation.flags & 32) {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
|
|
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_public_static_property_getter_from_exported_class_has_or_is_using_private_name_0;
|
|
}
|
|
else {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
|
|
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_public_property_getter_from_exported_class_has_or_is_using_private_name_0;
|
|
}
|
|
return {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: accessorWithTypeAnnotation.name,
|
|
typeName: undefined
|
|
};
|
|
}
|
|
}
|
|
}
|
|
function writeFunctionDeclaration(node) {
|
|
if (ts.hasDynamicName(node)) {
|
|
return;
|
|
}
|
|
if (!resolver.isImplementationOfOverload(node)) {
|
|
emitJsDocComments(node);
|
|
if (node.kind === 220) {
|
|
emitModuleElementDeclarationFlags(node);
|
|
}
|
|
else if (node.kind === 147 || node.kind === 148) {
|
|
emitClassMemberDeclarationFlags(node.flags);
|
|
}
|
|
if (node.kind === 220) {
|
|
write("function ");
|
|
writeTextOfNode(currentText, node.name);
|
|
}
|
|
else if (node.kind === 148) {
|
|
write("constructor");
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node.name);
|
|
if (ts.hasQuestionToken(node)) {
|
|
write("?");
|
|
}
|
|
}
|
|
emitSignatureDeclaration(node);
|
|
}
|
|
}
|
|
function emitSignatureDeclarationWithJsDocComments(node) {
|
|
emitJsDocComments(node);
|
|
emitSignatureDeclaration(node);
|
|
}
|
|
function emitSignatureDeclaration(node) {
|
|
var prevEnclosingDeclaration = enclosingDeclaration;
|
|
enclosingDeclaration = node;
|
|
var closeParenthesizedFunctionType = false;
|
|
if (node.kind === 153) {
|
|
emitClassMemberDeclarationFlags(node.flags);
|
|
write("[");
|
|
}
|
|
else {
|
|
if (node.kind === 152 || node.kind === 157) {
|
|
write("new ");
|
|
}
|
|
else if (node.kind === 156) {
|
|
var currentOutput = writer.getText();
|
|
if (node.typeParameters && currentOutput.charAt(currentOutput.length - 1) === "<") {
|
|
closeParenthesizedFunctionType = true;
|
|
write("(");
|
|
}
|
|
}
|
|
emitTypeParameters(node.typeParameters);
|
|
write("(");
|
|
}
|
|
emitCommaList(node.parameters, emitParameterDeclaration);
|
|
if (node.kind === 153) {
|
|
write("]");
|
|
}
|
|
else {
|
|
write(")");
|
|
}
|
|
var isFunctionTypeOrConstructorType = node.kind === 156 || node.kind === 157;
|
|
if (isFunctionTypeOrConstructorType || node.parent.kind === 159) {
|
|
if (node.type) {
|
|
write(isFunctionTypeOrConstructorType ? " => " : ": ");
|
|
emitType(node.type);
|
|
}
|
|
}
|
|
else if (node.kind !== 148 && !(node.flags & 8)) {
|
|
writeReturnTypeAtSignature(node, getReturnTypeVisibilityError);
|
|
}
|
|
enclosingDeclaration = prevEnclosingDeclaration;
|
|
if (!isFunctionTypeOrConstructorType) {
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
else if (closeParenthesizedFunctionType) {
|
|
write(")");
|
|
}
|
|
function getReturnTypeVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage;
|
|
switch (node.kind) {
|
|
case 152:
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_0;
|
|
break;
|
|
case 151:
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_call_signature_from_exported_interface_has_or_is_using_private_name_0;
|
|
break;
|
|
case 153:
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_index_signature_from_exported_interface_has_or_is_using_private_name_0;
|
|
break;
|
|
case 147:
|
|
case 146:
|
|
if (node.flags & 32) {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
|
|
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_public_static_method_from_exported_class_has_or_is_using_private_name_0;
|
|
}
|
|
else if (node.parent.kind === 221) {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
|
|
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_public_method_from_exported_class_has_or_is_using_private_name_0;
|
|
}
|
|
else {
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_method_from_exported_interface_has_or_is_using_private_name_0;
|
|
}
|
|
break;
|
|
case 220:
|
|
diagnosticMessage = symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_external_module_1_but_cannot_be_named :
|
|
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_name_0_from_private_module_1 :
|
|
ts.Diagnostics.Return_type_of_exported_function_has_or_is_using_private_name_0;
|
|
break;
|
|
default:
|
|
ts.Debug.fail("This is unknown kind for signature: " + node.kind);
|
|
}
|
|
return {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: node.name || node
|
|
};
|
|
}
|
|
}
|
|
function emitParameterDeclaration(node) {
|
|
increaseIndent();
|
|
emitJsDocComments(node);
|
|
if (node.dotDotDotToken) {
|
|
write("...");
|
|
}
|
|
if (ts.isBindingPattern(node.name)) {
|
|
emitBindingPattern(node.name);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node.name);
|
|
}
|
|
if (resolver.isOptionalParameter(node)) {
|
|
write("?");
|
|
}
|
|
decreaseIndent();
|
|
if (node.parent.kind === 156 ||
|
|
node.parent.kind === 157 ||
|
|
node.parent.parent.kind === 159) {
|
|
emitTypeOfVariableDeclarationFromTypeLiteral(node);
|
|
}
|
|
else if (!(node.parent.flags & 8)) {
|
|
writeTypeOfDeclaration(node, node.type, getParameterDeclarationTypeVisibilityError);
|
|
}
|
|
function getParameterDeclarationTypeVisibilityError(symbolAccessibilityResult) {
|
|
var diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult);
|
|
return diagnosticMessage !== undefined ? {
|
|
diagnosticMessage: diagnosticMessage,
|
|
errorNode: node,
|
|
typeName: node.name
|
|
} : undefined;
|
|
}
|
|
function getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccessibilityResult) {
|
|
switch (node.parent.kind) {
|
|
case 148:
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_constructor_from_exported_class_has_or_is_using_private_name_1;
|
|
case 152:
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_constructor_signature_from_exported_interface_has_or_is_using_private_name_1;
|
|
case 151:
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_call_signature_from_exported_interface_has_or_is_using_private_name_1;
|
|
case 147:
|
|
case 146:
|
|
if (node.parent.flags & 32) {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_public_static_method_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else if (node.parent.parent.kind === 221) {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_public_method_from_exported_class_has_or_is_using_private_name_1;
|
|
}
|
|
else {
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_method_from_exported_interface_has_or_is_using_private_name_1;
|
|
}
|
|
case 220:
|
|
return symbolAccessibilityResult.errorModuleName ?
|
|
symbolAccessibilityResult.accessibility === 2 ?
|
|
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_external_module_2_but_cannot_be_named :
|
|
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_name_1_from_private_module_2 :
|
|
ts.Diagnostics.Parameter_0_of_exported_function_has_or_is_using_private_name_1;
|
|
default:
|
|
ts.Debug.fail("This is unknown parent for parameter: " + node.parent.kind);
|
|
}
|
|
}
|
|
function emitBindingPattern(bindingPattern) {
|
|
if (bindingPattern.kind === 167) {
|
|
write("{");
|
|
emitCommaList(bindingPattern.elements, emitBindingElement);
|
|
write("}");
|
|
}
|
|
else if (bindingPattern.kind === 168) {
|
|
write("[");
|
|
var elements = bindingPattern.elements;
|
|
emitCommaList(elements, emitBindingElement);
|
|
if (elements && elements.hasTrailingComma) {
|
|
write(", ");
|
|
}
|
|
write("]");
|
|
}
|
|
}
|
|
function emitBindingElement(bindingElement) {
|
|
if (bindingElement.kind === 193) {
|
|
write(" ");
|
|
}
|
|
else if (bindingElement.kind === 169) {
|
|
if (bindingElement.propertyName) {
|
|
writeTextOfNode(currentText, bindingElement.propertyName);
|
|
write(": ");
|
|
}
|
|
if (bindingElement.name) {
|
|
if (ts.isBindingPattern(bindingElement.name)) {
|
|
emitBindingPattern(bindingElement.name);
|
|
}
|
|
else {
|
|
ts.Debug.assert(bindingElement.name.kind === 69);
|
|
if (bindingElement.dotDotDotToken) {
|
|
write("...");
|
|
}
|
|
writeTextOfNode(currentText, bindingElement.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitNode(node) {
|
|
switch (node.kind) {
|
|
case 220:
|
|
case 225:
|
|
case 229:
|
|
case 222:
|
|
case 221:
|
|
case 223:
|
|
case 224:
|
|
return emitModuleElement(node, isModuleElementVisible(node));
|
|
case 200:
|
|
return emitModuleElement(node, isVariableStatementVisible(node));
|
|
case 230:
|
|
return emitModuleElement(node, !node.importClause);
|
|
case 236:
|
|
return emitExportDeclaration(node);
|
|
case 148:
|
|
case 147:
|
|
case 146:
|
|
return writeFunctionDeclaration(node);
|
|
case 152:
|
|
case 151:
|
|
case 153:
|
|
return emitSignatureDeclarationWithJsDocComments(node);
|
|
case 149:
|
|
case 150:
|
|
return emitAccessorDeclaration(node);
|
|
case 145:
|
|
case 144:
|
|
return emitPropertyDeclaration(node);
|
|
case 255:
|
|
return emitEnumMemberDeclaration(node);
|
|
case 235:
|
|
return emitExportAssignment(node);
|
|
case 256:
|
|
return emitSourceFile(node);
|
|
}
|
|
}
|
|
function writeReferencePath(referencedFile, addBundledFileReference) {
|
|
var declFileName;
|
|
var addedBundledEmitReference = false;
|
|
if (ts.isDeclarationFile(referencedFile)) {
|
|
declFileName = referencedFile.fileName;
|
|
}
|
|
else {
|
|
ts.forEachExpectedEmitFile(host, getDeclFileName, referencedFile);
|
|
}
|
|
if (declFileName) {
|
|
declFileName = ts.getRelativePathToDirectoryOrUrl(ts.getDirectoryPath(ts.normalizeSlashes(declarationFilePath)), declFileName, host.getCurrentDirectory(), host.getCanonicalFileName, false);
|
|
referencesOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
|
|
}
|
|
return addedBundledEmitReference;
|
|
function getDeclFileName(emitFileNames, sourceFiles, isBundledEmit) {
|
|
if (isBundledEmit && !addBundledFileReference) {
|
|
return;
|
|
}
|
|
ts.Debug.assert(!!emitFileNames.declarationFilePath || ts.isSourceFileJavaScript(referencedFile), "Declaration file is not present only for javascript files");
|
|
declFileName = emitFileNames.declarationFilePath || emitFileNames.jsFilePath;
|
|
addedBundledEmitReference = isBundledEmit;
|
|
}
|
|
}
|
|
}
|
|
function writeDeclarationFile(declarationFilePath, sourceFiles, isBundledEmit, host, resolver, emitterDiagnostics) {
|
|
var emitDeclarationResult = emitDeclarations(host, resolver, emitterDiagnostics, declarationFilePath, sourceFiles, isBundledEmit);
|
|
var emitSkipped = emitDeclarationResult.reportedDeclarationError || host.isEmitBlocked(declarationFilePath) || host.getCompilerOptions().noEmit;
|
|
if (!emitSkipped) {
|
|
var declarationOutput = emitDeclarationResult.referencesOutput
|
|
+ getDeclarationOutput(emitDeclarationResult.synchronousDeclarationOutput, emitDeclarationResult.moduleElementDeclarationEmitInfo);
|
|
ts.writeFile(host, emitterDiagnostics, declarationFilePath, declarationOutput, host.getCompilerOptions().emitBOM, sourceFiles);
|
|
}
|
|
return emitSkipped;
|
|
function getDeclarationOutput(synchronousDeclarationOutput, moduleElementDeclarationEmitInfo) {
|
|
var appliedSyncOutputPos = 0;
|
|
var declarationOutput = "";
|
|
ts.forEach(moduleElementDeclarationEmitInfo, function (aliasEmitInfo) {
|
|
if (aliasEmitInfo.asynchronousOutput) {
|
|
declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos, aliasEmitInfo.outputPos);
|
|
declarationOutput += getDeclarationOutput(aliasEmitInfo.asynchronousOutput, aliasEmitInfo.subModuleElementDeclarationEmitInfo);
|
|
appliedSyncOutputPos = aliasEmitInfo.outputPos;
|
|
}
|
|
});
|
|
declarationOutput += synchronousDeclarationOutput.substring(appliedSyncOutputPos);
|
|
return declarationOutput;
|
|
}
|
|
}
|
|
ts.writeDeclarationFile = writeDeclarationFile;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
function getResolvedExternalModuleName(host, file) {
|
|
return file.moduleName || ts.getExternalModuleNameFromPath(host, file.fileName);
|
|
}
|
|
ts.getResolvedExternalModuleName = getResolvedExternalModuleName;
|
|
function getExternalModuleNameFromDeclaration(host, resolver, declaration) {
|
|
var file = resolver.getExternalModuleFileFromDeclaration(declaration);
|
|
if (!file || ts.isDeclarationFile(file)) {
|
|
return undefined;
|
|
}
|
|
return getResolvedExternalModuleName(host, file);
|
|
}
|
|
ts.getExternalModuleNameFromDeclaration = getExternalModuleNameFromDeclaration;
|
|
var entities = {
|
|
"quot": 0x0022,
|
|
"amp": 0x0026,
|
|
"apos": 0x0027,
|
|
"lt": 0x003C,
|
|
"gt": 0x003E,
|
|
"nbsp": 0x00A0,
|
|
"iexcl": 0x00A1,
|
|
"cent": 0x00A2,
|
|
"pound": 0x00A3,
|
|
"curren": 0x00A4,
|
|
"yen": 0x00A5,
|
|
"brvbar": 0x00A6,
|
|
"sect": 0x00A7,
|
|
"uml": 0x00A8,
|
|
"copy": 0x00A9,
|
|
"ordf": 0x00AA,
|
|
"laquo": 0x00AB,
|
|
"not": 0x00AC,
|
|
"shy": 0x00AD,
|
|
"reg": 0x00AE,
|
|
"macr": 0x00AF,
|
|
"deg": 0x00B0,
|
|
"plusmn": 0x00B1,
|
|
"sup2": 0x00B2,
|
|
"sup3": 0x00B3,
|
|
"acute": 0x00B4,
|
|
"micro": 0x00B5,
|
|
"para": 0x00B6,
|
|
"middot": 0x00B7,
|
|
"cedil": 0x00B8,
|
|
"sup1": 0x00B9,
|
|
"ordm": 0x00BA,
|
|
"raquo": 0x00BB,
|
|
"frac14": 0x00BC,
|
|
"frac12": 0x00BD,
|
|
"frac34": 0x00BE,
|
|
"iquest": 0x00BF,
|
|
"Agrave": 0x00C0,
|
|
"Aacute": 0x00C1,
|
|
"Acirc": 0x00C2,
|
|
"Atilde": 0x00C3,
|
|
"Auml": 0x00C4,
|
|
"Aring": 0x00C5,
|
|
"AElig": 0x00C6,
|
|
"Ccedil": 0x00C7,
|
|
"Egrave": 0x00C8,
|
|
"Eacute": 0x00C9,
|
|
"Ecirc": 0x00CA,
|
|
"Euml": 0x00CB,
|
|
"Igrave": 0x00CC,
|
|
"Iacute": 0x00CD,
|
|
"Icirc": 0x00CE,
|
|
"Iuml": 0x00CF,
|
|
"ETH": 0x00D0,
|
|
"Ntilde": 0x00D1,
|
|
"Ograve": 0x00D2,
|
|
"Oacute": 0x00D3,
|
|
"Ocirc": 0x00D4,
|
|
"Otilde": 0x00D5,
|
|
"Ouml": 0x00D6,
|
|
"times": 0x00D7,
|
|
"Oslash": 0x00D8,
|
|
"Ugrave": 0x00D9,
|
|
"Uacute": 0x00DA,
|
|
"Ucirc": 0x00DB,
|
|
"Uuml": 0x00DC,
|
|
"Yacute": 0x00DD,
|
|
"THORN": 0x00DE,
|
|
"szlig": 0x00DF,
|
|
"agrave": 0x00E0,
|
|
"aacute": 0x00E1,
|
|
"acirc": 0x00E2,
|
|
"atilde": 0x00E3,
|
|
"auml": 0x00E4,
|
|
"aring": 0x00E5,
|
|
"aelig": 0x00E6,
|
|
"ccedil": 0x00E7,
|
|
"egrave": 0x00E8,
|
|
"eacute": 0x00E9,
|
|
"ecirc": 0x00EA,
|
|
"euml": 0x00EB,
|
|
"igrave": 0x00EC,
|
|
"iacute": 0x00ED,
|
|
"icirc": 0x00EE,
|
|
"iuml": 0x00EF,
|
|
"eth": 0x00F0,
|
|
"ntilde": 0x00F1,
|
|
"ograve": 0x00F2,
|
|
"oacute": 0x00F3,
|
|
"ocirc": 0x00F4,
|
|
"otilde": 0x00F5,
|
|
"ouml": 0x00F6,
|
|
"divide": 0x00F7,
|
|
"oslash": 0x00F8,
|
|
"ugrave": 0x00F9,
|
|
"uacute": 0x00FA,
|
|
"ucirc": 0x00FB,
|
|
"uuml": 0x00FC,
|
|
"yacute": 0x00FD,
|
|
"thorn": 0x00FE,
|
|
"yuml": 0x00FF,
|
|
"OElig": 0x0152,
|
|
"oelig": 0x0153,
|
|
"Scaron": 0x0160,
|
|
"scaron": 0x0161,
|
|
"Yuml": 0x0178,
|
|
"fnof": 0x0192,
|
|
"circ": 0x02C6,
|
|
"tilde": 0x02DC,
|
|
"Alpha": 0x0391,
|
|
"Beta": 0x0392,
|
|
"Gamma": 0x0393,
|
|
"Delta": 0x0394,
|
|
"Epsilon": 0x0395,
|
|
"Zeta": 0x0396,
|
|
"Eta": 0x0397,
|
|
"Theta": 0x0398,
|
|
"Iota": 0x0399,
|
|
"Kappa": 0x039A,
|
|
"Lambda": 0x039B,
|
|
"Mu": 0x039C,
|
|
"Nu": 0x039D,
|
|
"Xi": 0x039E,
|
|
"Omicron": 0x039F,
|
|
"Pi": 0x03A0,
|
|
"Rho": 0x03A1,
|
|
"Sigma": 0x03A3,
|
|
"Tau": 0x03A4,
|
|
"Upsilon": 0x03A5,
|
|
"Phi": 0x03A6,
|
|
"Chi": 0x03A7,
|
|
"Psi": 0x03A8,
|
|
"Omega": 0x03A9,
|
|
"alpha": 0x03B1,
|
|
"beta": 0x03B2,
|
|
"gamma": 0x03B3,
|
|
"delta": 0x03B4,
|
|
"epsilon": 0x03B5,
|
|
"zeta": 0x03B6,
|
|
"eta": 0x03B7,
|
|
"theta": 0x03B8,
|
|
"iota": 0x03B9,
|
|
"kappa": 0x03BA,
|
|
"lambda": 0x03BB,
|
|
"mu": 0x03BC,
|
|
"nu": 0x03BD,
|
|
"xi": 0x03BE,
|
|
"omicron": 0x03BF,
|
|
"pi": 0x03C0,
|
|
"rho": 0x03C1,
|
|
"sigmaf": 0x03C2,
|
|
"sigma": 0x03C3,
|
|
"tau": 0x03C4,
|
|
"upsilon": 0x03C5,
|
|
"phi": 0x03C6,
|
|
"chi": 0x03C7,
|
|
"psi": 0x03C8,
|
|
"omega": 0x03C9,
|
|
"thetasym": 0x03D1,
|
|
"upsih": 0x03D2,
|
|
"piv": 0x03D6,
|
|
"ensp": 0x2002,
|
|
"emsp": 0x2003,
|
|
"thinsp": 0x2009,
|
|
"zwnj": 0x200C,
|
|
"zwj": 0x200D,
|
|
"lrm": 0x200E,
|
|
"rlm": 0x200F,
|
|
"ndash": 0x2013,
|
|
"mdash": 0x2014,
|
|
"lsquo": 0x2018,
|
|
"rsquo": 0x2019,
|
|
"sbquo": 0x201A,
|
|
"ldquo": 0x201C,
|
|
"rdquo": 0x201D,
|
|
"bdquo": 0x201E,
|
|
"dagger": 0x2020,
|
|
"Dagger": 0x2021,
|
|
"bull": 0x2022,
|
|
"hellip": 0x2026,
|
|
"permil": 0x2030,
|
|
"prime": 0x2032,
|
|
"Prime": 0x2033,
|
|
"lsaquo": 0x2039,
|
|
"rsaquo": 0x203A,
|
|
"oline": 0x203E,
|
|
"frasl": 0x2044,
|
|
"euro": 0x20AC,
|
|
"image": 0x2111,
|
|
"weierp": 0x2118,
|
|
"real": 0x211C,
|
|
"trade": 0x2122,
|
|
"alefsym": 0x2135,
|
|
"larr": 0x2190,
|
|
"uarr": 0x2191,
|
|
"rarr": 0x2192,
|
|
"darr": 0x2193,
|
|
"harr": 0x2194,
|
|
"crarr": 0x21B5,
|
|
"lArr": 0x21D0,
|
|
"uArr": 0x21D1,
|
|
"rArr": 0x21D2,
|
|
"dArr": 0x21D3,
|
|
"hArr": 0x21D4,
|
|
"forall": 0x2200,
|
|
"part": 0x2202,
|
|
"exist": 0x2203,
|
|
"empty": 0x2205,
|
|
"nabla": 0x2207,
|
|
"isin": 0x2208,
|
|
"notin": 0x2209,
|
|
"ni": 0x220B,
|
|
"prod": 0x220F,
|
|
"sum": 0x2211,
|
|
"minus": 0x2212,
|
|
"lowast": 0x2217,
|
|
"radic": 0x221A,
|
|
"prop": 0x221D,
|
|
"infin": 0x221E,
|
|
"ang": 0x2220,
|
|
"and": 0x2227,
|
|
"or": 0x2228,
|
|
"cap": 0x2229,
|
|
"cup": 0x222A,
|
|
"int": 0x222B,
|
|
"there4": 0x2234,
|
|
"sim": 0x223C,
|
|
"cong": 0x2245,
|
|
"asymp": 0x2248,
|
|
"ne": 0x2260,
|
|
"equiv": 0x2261,
|
|
"le": 0x2264,
|
|
"ge": 0x2265,
|
|
"sub": 0x2282,
|
|
"sup": 0x2283,
|
|
"nsub": 0x2284,
|
|
"sube": 0x2286,
|
|
"supe": 0x2287,
|
|
"oplus": 0x2295,
|
|
"otimes": 0x2297,
|
|
"perp": 0x22A5,
|
|
"sdot": 0x22C5,
|
|
"lceil": 0x2308,
|
|
"rceil": 0x2309,
|
|
"lfloor": 0x230A,
|
|
"rfloor": 0x230B,
|
|
"lang": 0x2329,
|
|
"rang": 0x232A,
|
|
"loz": 0x25CA,
|
|
"spades": 0x2660,
|
|
"clubs": 0x2663,
|
|
"hearts": 0x2665,
|
|
"diams": 0x2666
|
|
};
|
|
function emitFiles(resolver, host, targetSourceFile) {
|
|
var extendsHelper = "\nvar __extends = (this && this.__extends) || function (d, b) {\n for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n};";
|
|
var assignHelper = "\nvar __assign = (this && this.__assign) || Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n};";
|
|
var decorateHelper = "\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};";
|
|
var metadataHelper = "\nvar __metadata = (this && this.__metadata) || function (k, v) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(k, v);\n};";
|
|
var paramHelper = "\nvar __param = (this && this.__param) || function (paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n};";
|
|
var awaiterHelper = "\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator.throw(value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments)).next());\n });\n};";
|
|
var compilerOptions = host.getCompilerOptions();
|
|
var languageVersion = ts.getEmitScriptTarget(compilerOptions);
|
|
var modulekind = ts.getEmitModuleKind(compilerOptions);
|
|
var sourceMapDataList = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
|
|
var emittedFilesList = compilerOptions.listEmittedFiles ? [] : undefined;
|
|
var emitterDiagnostics = ts.createDiagnosticCollection();
|
|
var emitSkipped = false;
|
|
var newLine = host.getNewLine();
|
|
var emitJavaScript = createFileEmitter();
|
|
ts.forEachExpectedEmitFile(host, emitFile, targetSourceFile);
|
|
return {
|
|
emitSkipped: emitSkipped,
|
|
diagnostics: emitterDiagnostics.getDiagnostics(),
|
|
emittedFiles: emittedFilesList,
|
|
sourceMaps: sourceMapDataList
|
|
};
|
|
function isUniqueLocalName(name, container) {
|
|
for (var node = container; ts.isNodeDescendentOf(node, container); node = node.nextContainer) {
|
|
if (node.locals && ts.hasProperty(node.locals, name)) {
|
|
if (node.locals[name].flags & (107455 | 1048576 | 8388608)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function setLabeledJump(state, isBreak, labelText, labelMarker) {
|
|
if (isBreak) {
|
|
if (!state.labeledNonLocalBreaks) {
|
|
state.labeledNonLocalBreaks = {};
|
|
}
|
|
state.labeledNonLocalBreaks[labelText] = labelMarker;
|
|
}
|
|
else {
|
|
if (!state.labeledNonLocalContinues) {
|
|
state.labeledNonLocalContinues = {};
|
|
}
|
|
state.labeledNonLocalContinues[labelText] = labelMarker;
|
|
}
|
|
}
|
|
function hoistVariableDeclarationFromLoop(state, declaration) {
|
|
if (!state.hoistedLocalVariables) {
|
|
state.hoistedLocalVariables = [];
|
|
}
|
|
visit(declaration.name);
|
|
function visit(node) {
|
|
if (node.kind === 69) {
|
|
state.hoistedLocalVariables.push(node);
|
|
}
|
|
else {
|
|
for (var _a = 0, _b = node.elements; _a < _b.length; _a++) {
|
|
var element = _b[_a];
|
|
visit(element.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function createFileEmitter() {
|
|
var writer = ts.createTextWriter(newLine);
|
|
var write = writer.write, writeTextOfNode = writer.writeTextOfNode, writeLine = writer.writeLine, increaseIndent = writer.increaseIndent, decreaseIndent = writer.decreaseIndent;
|
|
var sourceMap = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? ts.createSourceMapWriter(host, writer) : ts.getNullSourceMapWriter();
|
|
var setSourceFile = sourceMap.setSourceFile, emitStart = sourceMap.emitStart, emitEnd = sourceMap.emitEnd, emitPos = sourceMap.emitPos;
|
|
var currentSourceFile;
|
|
var currentText;
|
|
var currentLineMap;
|
|
var currentFileIdentifiers;
|
|
var renamedDependencies;
|
|
var isEs6Module;
|
|
var isCurrentFileExternalModule;
|
|
var exportFunctionForFile;
|
|
var contextObjectForFile;
|
|
var generatedNameSet;
|
|
var nodeToGeneratedName;
|
|
var computedPropertyNamesToGeneratedNames;
|
|
var decoratedClassAliases;
|
|
var convertedLoopState;
|
|
var extendsEmitted;
|
|
var assignEmitted;
|
|
var decorateEmitted;
|
|
var paramEmitted;
|
|
var awaiterEmitted;
|
|
var tempFlags = 0;
|
|
var tempVariables;
|
|
var tempParameters;
|
|
var externalImports;
|
|
var exportSpecifiers;
|
|
var exportEquals;
|
|
var hasExportStarsToExportValues;
|
|
var detachedCommentsInfo;
|
|
var sourceMapData;
|
|
var isOwnFileEmit;
|
|
var emitLeadingCommentsOfPosition = compilerOptions.removeComments ? function (pos) { } : emitLeadingCommentsOfPositionWorker;
|
|
var setSourceMapWriterEmit = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? changeSourceMapEmit : function (writer) { };
|
|
var moduleEmitDelegates = (_a = {},
|
|
_a[ts.ModuleKind.ES6] = emitES6Module,
|
|
_a[ts.ModuleKind.AMD] = emitAMDModule,
|
|
_a[ts.ModuleKind.System] = emitSystemModule,
|
|
_a[ts.ModuleKind.UMD] = emitUMDModule,
|
|
_a[ts.ModuleKind.CommonJS] = emitCommonJSModule,
|
|
_a
|
|
);
|
|
var bundleEmitDelegates = (_b = {},
|
|
_b[ts.ModuleKind.ES6] = function () { },
|
|
_b[ts.ModuleKind.AMD] = emitAMDModule,
|
|
_b[ts.ModuleKind.System] = emitSystemModule,
|
|
_b[ts.ModuleKind.UMD] = function () { },
|
|
_b[ts.ModuleKind.CommonJS] = function () { },
|
|
_b
|
|
);
|
|
return doEmit;
|
|
function doEmit(jsFilePath, sourceMapFilePath, sourceFiles, isBundledEmit) {
|
|
sourceMap.initialize(jsFilePath, sourceMapFilePath, sourceFiles, isBundledEmit);
|
|
generatedNameSet = {};
|
|
nodeToGeneratedName = [];
|
|
decoratedClassAliases = [];
|
|
isOwnFileEmit = !isBundledEmit;
|
|
if (isBundledEmit && modulekind) {
|
|
ts.forEach(sourceFiles, emitEmitHelpers);
|
|
}
|
|
ts.forEach(sourceFiles, emitSourceFile);
|
|
writeLine();
|
|
var sourceMappingURL = sourceMap.getSourceMappingURL();
|
|
if (sourceMappingURL) {
|
|
write("//# " + "sourceMappingURL" + "=" + sourceMappingURL);
|
|
}
|
|
writeEmittedFiles(writer.getText(), jsFilePath, sourceMapFilePath, compilerOptions.emitBOM, sourceFiles);
|
|
sourceMap.reset();
|
|
writer.reset();
|
|
currentSourceFile = undefined;
|
|
currentText = undefined;
|
|
currentLineMap = undefined;
|
|
exportFunctionForFile = undefined;
|
|
contextObjectForFile = undefined;
|
|
generatedNameSet = undefined;
|
|
nodeToGeneratedName = undefined;
|
|
decoratedClassAliases = undefined;
|
|
computedPropertyNamesToGeneratedNames = undefined;
|
|
convertedLoopState = undefined;
|
|
extendsEmitted = false;
|
|
decorateEmitted = false;
|
|
paramEmitted = false;
|
|
awaiterEmitted = false;
|
|
assignEmitted = false;
|
|
tempFlags = 0;
|
|
tempVariables = undefined;
|
|
tempParameters = undefined;
|
|
externalImports = undefined;
|
|
exportSpecifiers = undefined;
|
|
exportEquals = undefined;
|
|
hasExportStarsToExportValues = undefined;
|
|
detachedCommentsInfo = undefined;
|
|
sourceMapData = undefined;
|
|
isEs6Module = false;
|
|
renamedDependencies = undefined;
|
|
isCurrentFileExternalModule = false;
|
|
}
|
|
function emitSourceFile(sourceFile) {
|
|
currentSourceFile = sourceFile;
|
|
currentText = sourceFile.text;
|
|
currentLineMap = ts.getLineStarts(sourceFile);
|
|
exportFunctionForFile = undefined;
|
|
contextObjectForFile = undefined;
|
|
isEs6Module = sourceFile.symbol && sourceFile.symbol.exports && !!sourceFile.symbol.exports["___esModule"];
|
|
renamedDependencies = sourceFile.renamedDependencies;
|
|
currentFileIdentifiers = sourceFile.identifiers;
|
|
isCurrentFileExternalModule = ts.isExternalModule(sourceFile);
|
|
setSourceFile(sourceFile);
|
|
emitNodeWithCommentsAndWithoutSourcemap(sourceFile);
|
|
}
|
|
function isUniqueName(name) {
|
|
return !resolver.hasGlobalName(name) &&
|
|
!ts.hasProperty(currentFileIdentifiers, name) &&
|
|
!ts.hasProperty(generatedNameSet, name);
|
|
}
|
|
function makeTempVariableName(flags) {
|
|
if (flags && !(tempFlags & flags)) {
|
|
var name_24 = flags === 268435456 ? "_i" : "_n";
|
|
if (isUniqueName(name_24)) {
|
|
tempFlags |= flags;
|
|
return name_24;
|
|
}
|
|
}
|
|
while (true) {
|
|
var count = tempFlags & 268435455;
|
|
tempFlags++;
|
|
if (count !== 8 && count !== 13) {
|
|
var name_25 = count < 26 ? "_" + String.fromCharCode(97 + count) : "_" + (count - 26);
|
|
if (isUniqueName(name_25)) {
|
|
return name_25;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function makeUniqueName(baseName) {
|
|
if (baseName.charCodeAt(baseName.length - 1) !== 95) {
|
|
baseName += "_";
|
|
}
|
|
var i = 1;
|
|
while (true) {
|
|
var generatedName = baseName + i;
|
|
if (isUniqueName(generatedName)) {
|
|
return generatedNameSet[generatedName] = generatedName;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
function generateNameForModuleOrEnum(node) {
|
|
var name = node.name.text;
|
|
return isUniqueLocalName(name, node) ? name : makeUniqueName(name);
|
|
}
|
|
function generateNameForImportOrExportDeclaration(node) {
|
|
var expr = ts.getExternalModuleName(node);
|
|
var baseName = expr.kind === 9 ?
|
|
ts.escapeIdentifier(ts.makeIdentifierFromModuleName(expr.text)) : "module";
|
|
return makeUniqueName(baseName);
|
|
}
|
|
function generateNameForExportDefault() {
|
|
return makeUniqueName("default");
|
|
}
|
|
function generateNameForClassExpression() {
|
|
return makeUniqueName("class");
|
|
}
|
|
function generateNameForNode(node) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
return makeUniqueName(node.text);
|
|
case 225:
|
|
case 224:
|
|
return generateNameForModuleOrEnum(node);
|
|
case 230:
|
|
case 236:
|
|
return generateNameForImportOrExportDeclaration(node);
|
|
case 220:
|
|
case 221:
|
|
case 235:
|
|
return generateNameForExportDefault();
|
|
case 192:
|
|
return generateNameForClassExpression();
|
|
default:
|
|
ts.Debug.fail();
|
|
}
|
|
}
|
|
function getGeneratedNameForNode(node) {
|
|
var id = ts.getNodeId(node);
|
|
return nodeToGeneratedName[id] || (nodeToGeneratedName[id] = ts.unescapeIdentifier(generateNameForNode(node)));
|
|
}
|
|
function writeEmittedFiles(emitOutput, jsFilePath, sourceMapFilePath, writeByteOrderMark, sourceFiles) {
|
|
if (compilerOptions.sourceMap && !compilerOptions.inlineSourceMap) {
|
|
ts.writeFile(host, emitterDiagnostics, sourceMapFilePath, sourceMap.getText(), false, sourceFiles);
|
|
}
|
|
if (sourceMapDataList) {
|
|
sourceMapDataList.push(sourceMap.getSourceMapData());
|
|
}
|
|
ts.writeFile(host, emitterDiagnostics, jsFilePath, emitOutput, writeByteOrderMark, sourceFiles);
|
|
}
|
|
function createTempVariable(flags) {
|
|
var result = ts.createSynthesizedNode(69);
|
|
result.text = makeTempVariableName(flags);
|
|
return result;
|
|
}
|
|
function recordTempDeclaration(name) {
|
|
if (!tempVariables) {
|
|
tempVariables = [];
|
|
}
|
|
tempVariables.push(name);
|
|
}
|
|
function createAndRecordTempVariable(flags) {
|
|
var temp = createTempVariable(flags);
|
|
recordTempDeclaration(temp);
|
|
return temp;
|
|
}
|
|
function emitTempDeclarations(newLine) {
|
|
if (tempVariables) {
|
|
if (newLine) {
|
|
writeLine();
|
|
}
|
|
else {
|
|
write(" ");
|
|
}
|
|
write("var ");
|
|
emitCommaList(tempVariables);
|
|
write(";");
|
|
}
|
|
}
|
|
function emitToken(tokenKind, startPos, emitFn) {
|
|
var tokenStartPos = ts.skipTrivia(currentText, startPos);
|
|
emitPos(tokenStartPos);
|
|
var tokenString = ts.tokenToString(tokenKind);
|
|
if (emitFn) {
|
|
emitFn();
|
|
}
|
|
else {
|
|
write(tokenString);
|
|
}
|
|
var tokenEndPos = tokenStartPos + tokenString.length;
|
|
emitPos(tokenEndPos);
|
|
return tokenEndPos;
|
|
}
|
|
function emitOptional(prefix, node) {
|
|
if (node) {
|
|
write(prefix);
|
|
emit(node);
|
|
}
|
|
}
|
|
function emitParenthesizedIf(node, parenthesized) {
|
|
if (parenthesized) {
|
|
write("(");
|
|
}
|
|
emit(node);
|
|
if (parenthesized) {
|
|
write(")");
|
|
}
|
|
}
|
|
function emitLinePreservingList(parent, nodes, allowTrailingComma, spacesBetweenBraces) {
|
|
ts.Debug.assert(nodes.length > 0);
|
|
increaseIndent();
|
|
if (nodeStartPositionsAreOnSameLine(parent, nodes[0])) {
|
|
if (spacesBetweenBraces) {
|
|
write(" ");
|
|
}
|
|
}
|
|
else {
|
|
writeLine();
|
|
}
|
|
for (var i = 0, n = nodes.length; i < n; i++) {
|
|
if (i) {
|
|
if (nodeEndIsOnSameLineAsNodeStart(nodes[i - 1], nodes[i])) {
|
|
write(", ");
|
|
}
|
|
else {
|
|
write(",");
|
|
writeLine();
|
|
}
|
|
}
|
|
emit(nodes[i]);
|
|
}
|
|
if (nodes.hasTrailingComma && allowTrailingComma) {
|
|
write(",");
|
|
}
|
|
decreaseIndent();
|
|
if (nodeEndPositionsAreOnSameLine(parent, ts.lastOrUndefined(nodes))) {
|
|
if (spacesBetweenBraces) {
|
|
write(" ");
|
|
}
|
|
}
|
|
else {
|
|
writeLine();
|
|
}
|
|
}
|
|
function emitList(nodes, start, count, multiLine, trailingComma, leadingComma, noTrailingNewLine, emitNode) {
|
|
if (!emitNode) {
|
|
emitNode = emit;
|
|
}
|
|
for (var i = 0; i < count; i++) {
|
|
if (multiLine) {
|
|
if (i || leadingComma) {
|
|
write(",");
|
|
}
|
|
writeLine();
|
|
}
|
|
else {
|
|
if (i || leadingComma) {
|
|
write(", ");
|
|
}
|
|
}
|
|
var node = nodes[start + i];
|
|
emitTrailingCommentsOfPosition(node.pos);
|
|
emitNode(node);
|
|
leadingComma = true;
|
|
}
|
|
if (trailingComma) {
|
|
write(",");
|
|
}
|
|
if (multiLine && !noTrailingNewLine) {
|
|
writeLine();
|
|
}
|
|
return count;
|
|
}
|
|
function emitCommaList(nodes) {
|
|
if (nodes) {
|
|
emitList(nodes, 0, nodes.length, false, false);
|
|
}
|
|
}
|
|
function emitLines(nodes) {
|
|
emitLinesStartingAt(nodes, 0);
|
|
}
|
|
function emitLinesStartingAt(nodes, startIndex) {
|
|
for (var i = startIndex; i < nodes.length; i++) {
|
|
writeLine();
|
|
emit(nodes[i]);
|
|
}
|
|
}
|
|
function isBinaryOrOctalIntegerLiteral(node, text) {
|
|
if (node.kind === 8 && text.length > 1) {
|
|
switch (text.charCodeAt(1)) {
|
|
case 98:
|
|
case 66:
|
|
case 111:
|
|
case 79:
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function emitLiteral(node) {
|
|
var text = getLiteralText(node);
|
|
if ((compilerOptions.sourceMap || compilerOptions.inlineSourceMap) && (node.kind === 9 || ts.isTemplateLiteralKind(node.kind))) {
|
|
writer.writeLiteral(text);
|
|
}
|
|
else if (languageVersion < 2 && isBinaryOrOctalIntegerLiteral(node, text)) {
|
|
write(node.text);
|
|
}
|
|
else {
|
|
write(text);
|
|
}
|
|
}
|
|
function getLiteralText(node) {
|
|
if (languageVersion < 2 && (ts.isTemplateLiteralKind(node.kind) || node.hasExtendedUnicodeEscape)) {
|
|
return getQuotedEscapedLiteralText('"', node.text, '"');
|
|
}
|
|
if (node.parent) {
|
|
return ts.getTextOfNodeFromSourceText(currentText, node);
|
|
}
|
|
switch (node.kind) {
|
|
case 9:
|
|
return getQuotedEscapedLiteralText('"', node.text, '"');
|
|
case 11:
|
|
return getQuotedEscapedLiteralText("`", node.text, "`");
|
|
case 12:
|
|
return getQuotedEscapedLiteralText("`", node.text, "${");
|
|
case 13:
|
|
return getQuotedEscapedLiteralText("}", node.text, "${");
|
|
case 14:
|
|
return getQuotedEscapedLiteralText("}", node.text, "`");
|
|
case 8:
|
|
return node.text;
|
|
}
|
|
ts.Debug.fail("Literal kind '" + node.kind + "' not accounted for.");
|
|
}
|
|
function getQuotedEscapedLiteralText(leftQuote, text, rightQuote) {
|
|
return leftQuote + ts.escapeNonAsciiCharacters(ts.escapeString(text)) + rightQuote;
|
|
}
|
|
function emitDownlevelRawTemplateLiteral(node) {
|
|
var text = ts.getTextOfNodeFromSourceText(currentText, node);
|
|
var isLast = node.kind === 11 || node.kind === 14;
|
|
text = text.substring(1, text.length - (isLast ? 1 : 2));
|
|
text = text.replace(/\r\n?/g, "\n");
|
|
text = ts.escapeString(text);
|
|
write("\"" + text + "\"");
|
|
}
|
|
function emitDownlevelTaggedTemplateArray(node, literalEmitter) {
|
|
write("[");
|
|
if (node.template.kind === 11) {
|
|
literalEmitter(node.template);
|
|
}
|
|
else {
|
|
literalEmitter(node.template.head);
|
|
ts.forEach(node.template.templateSpans, function (child) {
|
|
write(", ");
|
|
literalEmitter(child.literal);
|
|
});
|
|
}
|
|
write("]");
|
|
}
|
|
function emitDownlevelTaggedTemplate(node) {
|
|
var tempVariable = createAndRecordTempVariable(0);
|
|
write("(");
|
|
emit(tempVariable);
|
|
write(" = ");
|
|
emitDownlevelTaggedTemplateArray(node, emit);
|
|
write(", ");
|
|
emit(tempVariable);
|
|
write(".raw = ");
|
|
emitDownlevelTaggedTemplateArray(node, emitDownlevelRawTemplateLiteral);
|
|
write(", ");
|
|
emitParenthesizedIf(node.tag, needsParenthesisForPropertyAccessOrInvocation(node.tag));
|
|
write("(");
|
|
emit(tempVariable);
|
|
if (node.template.kind === 189) {
|
|
ts.forEach(node.template.templateSpans, function (templateSpan) {
|
|
write(", ");
|
|
var needsParens = templateSpan.expression.kind === 187
|
|
&& templateSpan.expression.operatorToken.kind === 24;
|
|
emitParenthesizedIf(templateSpan.expression, needsParens);
|
|
});
|
|
}
|
|
write("))");
|
|
}
|
|
function emitTemplateExpression(node) {
|
|
if (languageVersion >= 2) {
|
|
ts.forEachChild(node, emit);
|
|
return;
|
|
}
|
|
var emitOuterParens = ts.isExpression(node.parent)
|
|
&& templateNeedsParens(node, node.parent);
|
|
if (emitOuterParens) {
|
|
write("(");
|
|
}
|
|
var headEmitted = false;
|
|
if (shouldEmitTemplateHead()) {
|
|
emitLiteral(node.head);
|
|
headEmitted = true;
|
|
}
|
|
for (var i = 0, n = node.templateSpans.length; i < n; i++) {
|
|
var templateSpan = node.templateSpans[i];
|
|
var needsParens = templateSpan.expression.kind !== 178
|
|
&& comparePrecedenceToBinaryPlus(templateSpan.expression) !== 1;
|
|
if (i > 0 || headEmitted) {
|
|
write(" + ");
|
|
}
|
|
emitParenthesizedIf(templateSpan.expression, needsParens);
|
|
if (templateSpan.literal.text.length !== 0) {
|
|
write(" + ");
|
|
emitLiteral(templateSpan.literal);
|
|
}
|
|
}
|
|
if (emitOuterParens) {
|
|
write(")");
|
|
}
|
|
function shouldEmitTemplateHead() {
|
|
ts.Debug.assert(node.templateSpans.length !== 0);
|
|
return node.head.text.length !== 0 || node.templateSpans[0].literal.text.length === 0;
|
|
}
|
|
function templateNeedsParens(template, parent) {
|
|
switch (parent.kind) {
|
|
case 174:
|
|
case 175:
|
|
return parent.expression === template;
|
|
case 176:
|
|
case 178:
|
|
return false;
|
|
default:
|
|
return comparePrecedenceToBinaryPlus(parent) !== -1;
|
|
}
|
|
}
|
|
function comparePrecedenceToBinaryPlus(expression) {
|
|
switch (expression.kind) {
|
|
case 187:
|
|
switch (expression.operatorToken.kind) {
|
|
case 37:
|
|
case 39:
|
|
case 40:
|
|
return 1;
|
|
case 35:
|
|
case 36:
|
|
return 0;
|
|
default:
|
|
return -1;
|
|
}
|
|
case 190:
|
|
case 188:
|
|
return -1;
|
|
default:
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
function emitTemplateSpan(span) {
|
|
emit(span.expression);
|
|
emit(span.literal);
|
|
}
|
|
function jsxEmitReact(node) {
|
|
function emitTagName(name) {
|
|
if (name.kind === 69 && ts.isIntrinsicJsxName(name.text)) {
|
|
write('"');
|
|
emit(name);
|
|
write('"');
|
|
}
|
|
else {
|
|
emit(name);
|
|
}
|
|
}
|
|
function emitAttributeName(name) {
|
|
if (/^[A-Za-z_]\w*$/.test(name.text)) {
|
|
emit(name);
|
|
}
|
|
else {
|
|
write('"');
|
|
emit(name);
|
|
write('"');
|
|
}
|
|
}
|
|
function emitJsxAttribute(node) {
|
|
emitAttributeName(node.name);
|
|
write(": ");
|
|
if (node.initializer) {
|
|
emit(node.initializer);
|
|
}
|
|
else {
|
|
write("true");
|
|
}
|
|
}
|
|
function emitJsxElement(openingNode, children) {
|
|
var syntheticReactRef = ts.createSynthesizedNode(69);
|
|
syntheticReactRef.text = compilerOptions.reactNamespace ? compilerOptions.reactNamespace : "React";
|
|
syntheticReactRef.parent = openingNode;
|
|
emitLeadingComments(openingNode);
|
|
emitExpressionIdentifier(syntheticReactRef);
|
|
write(".createElement(");
|
|
emitTagName(openingNode.tagName);
|
|
write(", ");
|
|
if (openingNode.attributes.length === 0) {
|
|
write("null");
|
|
}
|
|
else {
|
|
var attrs = openingNode.attributes;
|
|
if (ts.forEach(attrs, function (attr) { return attr.kind === 247; })) {
|
|
write("__assign(");
|
|
var haveOpenedObjectLiteral = false;
|
|
for (var i = 0; i < attrs.length; i++) {
|
|
if (attrs[i].kind === 247) {
|
|
if (i === 0) {
|
|
write("{}, ");
|
|
}
|
|
if (haveOpenedObjectLiteral) {
|
|
write("}");
|
|
haveOpenedObjectLiteral = false;
|
|
}
|
|
if (i > 0) {
|
|
write(", ");
|
|
}
|
|
emit(attrs[i].expression);
|
|
}
|
|
else {
|
|
ts.Debug.assert(attrs[i].kind === 246);
|
|
if (haveOpenedObjectLiteral) {
|
|
write(", ");
|
|
}
|
|
else {
|
|
haveOpenedObjectLiteral = true;
|
|
if (i > 0) {
|
|
write(", ");
|
|
}
|
|
write("{");
|
|
}
|
|
emitJsxAttribute(attrs[i]);
|
|
}
|
|
}
|
|
if (haveOpenedObjectLiteral)
|
|
write("}");
|
|
write(")");
|
|
}
|
|
else {
|
|
write("{");
|
|
for (var i = 0, n = attrs.length; i < n; i++) {
|
|
if (i > 0) {
|
|
write(", ");
|
|
}
|
|
emitJsxAttribute(attrs[i]);
|
|
}
|
|
write("}");
|
|
}
|
|
}
|
|
if (children) {
|
|
var firstChild = void 0;
|
|
var multipleEmittableChildren = false;
|
|
for (var i = 0, n = children.length; i < n; i++) {
|
|
var jsxChild = children[i];
|
|
if (isJsxChildEmittable(jsxChild)) {
|
|
if (!firstChild) {
|
|
write(", ");
|
|
firstChild = jsxChild;
|
|
}
|
|
else {
|
|
if (!multipleEmittableChildren) {
|
|
multipleEmittableChildren = true;
|
|
increaseIndent();
|
|
writeLine();
|
|
emit(firstChild);
|
|
}
|
|
write(", ");
|
|
writeLine();
|
|
emit(jsxChild);
|
|
}
|
|
}
|
|
}
|
|
if (multipleEmittableChildren) {
|
|
decreaseIndent();
|
|
}
|
|
else if (firstChild) {
|
|
if (firstChild.kind !== 241 && firstChild.kind !== 242) {
|
|
emit(firstChild);
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
writeLine();
|
|
emit(firstChild);
|
|
writeLine();
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
}
|
|
write(")");
|
|
emitTrailingComments(openingNode);
|
|
}
|
|
if (node.kind === 241) {
|
|
emitJsxElement(node.openingElement, node.children);
|
|
}
|
|
else {
|
|
ts.Debug.assert(node.kind === 242);
|
|
emitJsxElement(node);
|
|
}
|
|
}
|
|
function jsxEmitPreserve(node) {
|
|
function emitJsxAttribute(node) {
|
|
emit(node.name);
|
|
if (node.initializer) {
|
|
write("=");
|
|
emit(node.initializer);
|
|
}
|
|
}
|
|
function emitJsxSpreadAttribute(node) {
|
|
write("{...");
|
|
emit(node.expression);
|
|
write("}");
|
|
}
|
|
function emitAttributes(attribs) {
|
|
for (var i = 0, n = attribs.length; i < n; i++) {
|
|
if (i > 0) {
|
|
write(" ");
|
|
}
|
|
if (attribs[i].kind === 247) {
|
|
emitJsxSpreadAttribute(attribs[i]);
|
|
}
|
|
else {
|
|
ts.Debug.assert(attribs[i].kind === 246);
|
|
emitJsxAttribute(attribs[i]);
|
|
}
|
|
}
|
|
}
|
|
function emitJsxOpeningOrSelfClosingElement(node) {
|
|
write("<");
|
|
emit(node.tagName);
|
|
if (node.attributes.length > 0 || (node.kind === 242)) {
|
|
write(" ");
|
|
}
|
|
emitAttributes(node.attributes);
|
|
if (node.kind === 242) {
|
|
write("/>");
|
|
}
|
|
else {
|
|
write(">");
|
|
}
|
|
}
|
|
function emitJsxClosingElement(node) {
|
|
write("</");
|
|
emit(node.tagName);
|
|
write(">");
|
|
}
|
|
function emitJsxElement(node) {
|
|
emitJsxOpeningOrSelfClosingElement(node.openingElement);
|
|
for (var i = 0, n = node.children.length; i < n; i++) {
|
|
emit(node.children[i]);
|
|
}
|
|
emitJsxClosingElement(node.closingElement);
|
|
}
|
|
if (node.kind === 241) {
|
|
emitJsxElement(node);
|
|
}
|
|
else {
|
|
ts.Debug.assert(node.kind === 242);
|
|
emitJsxOpeningOrSelfClosingElement(node);
|
|
}
|
|
}
|
|
function emitExpressionForPropertyName(node) {
|
|
ts.Debug.assert(node.kind !== 169);
|
|
if (node.kind === 9) {
|
|
emitLiteral(node);
|
|
}
|
|
else if (node.kind === 140) {
|
|
if (ts.nodeIsDecorated(node.parent)) {
|
|
if (!computedPropertyNamesToGeneratedNames) {
|
|
computedPropertyNamesToGeneratedNames = [];
|
|
}
|
|
var generatedName = computedPropertyNamesToGeneratedNames[ts.getNodeId(node)];
|
|
if (generatedName) {
|
|
write(generatedName);
|
|
return;
|
|
}
|
|
generatedName = createAndRecordTempVariable(0).text;
|
|
computedPropertyNamesToGeneratedNames[ts.getNodeId(node)] = generatedName;
|
|
write(generatedName);
|
|
write(" = ");
|
|
}
|
|
emit(node.expression);
|
|
}
|
|
else {
|
|
write('"');
|
|
if (node.kind === 8) {
|
|
write(node.text);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node);
|
|
}
|
|
write('"');
|
|
}
|
|
}
|
|
function isExpressionIdentifier(node) {
|
|
var parent = node.parent;
|
|
switch (parent.kind) {
|
|
case 170:
|
|
case 195:
|
|
case 184:
|
|
case 187:
|
|
case 174:
|
|
case 249:
|
|
case 140:
|
|
case 188:
|
|
case 143:
|
|
case 181:
|
|
case 204:
|
|
case 173:
|
|
case 235:
|
|
case 202:
|
|
case 194:
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
case 203:
|
|
case 245:
|
|
case 242:
|
|
case 243:
|
|
case 247:
|
|
case 248:
|
|
case 175:
|
|
case 196:
|
|
case 178:
|
|
case 186:
|
|
case 185:
|
|
case 211:
|
|
case 254:
|
|
case 191:
|
|
case 213:
|
|
case 176:
|
|
case 197:
|
|
case 215:
|
|
case 177:
|
|
case 182:
|
|
case 183:
|
|
case 205:
|
|
case 212:
|
|
case 190:
|
|
return true;
|
|
case 169:
|
|
case 255:
|
|
case 142:
|
|
case 253:
|
|
case 145:
|
|
case 218:
|
|
return parent.initializer === node;
|
|
case 172:
|
|
return parent.expression === node;
|
|
case 180:
|
|
case 179:
|
|
return parent.body === node;
|
|
case 229:
|
|
return parent.moduleReference === node;
|
|
case 139:
|
|
return parent.left === node;
|
|
}
|
|
return false;
|
|
}
|
|
function emitExpressionIdentifier(node) {
|
|
var container = resolver.getReferencedExportContainer(node);
|
|
if (container) {
|
|
if (container.kind === 256) {
|
|
if (modulekind !== ts.ModuleKind.ES6 && modulekind !== ts.ModuleKind.System) {
|
|
write("exports.");
|
|
}
|
|
}
|
|
else {
|
|
write(getGeneratedNameForNode(container));
|
|
write(".");
|
|
}
|
|
}
|
|
else {
|
|
if (modulekind !== ts.ModuleKind.ES6) {
|
|
var declaration = resolver.getReferencedImportDeclaration(node);
|
|
if (declaration) {
|
|
if (declaration.kind === 231) {
|
|
write(getGeneratedNameForNode(declaration.parent));
|
|
write(languageVersion === 0 ? '["default"]' : ".default");
|
|
return;
|
|
}
|
|
else if (declaration.kind === 234) {
|
|
write(getGeneratedNameForNode(declaration.parent.parent.parent));
|
|
var name_26 = declaration.propertyName || declaration.name;
|
|
var identifier = ts.getTextOfNodeFromSourceText(currentText, name_26);
|
|
if (languageVersion === 0 && identifier === "default") {
|
|
write('["default"]');
|
|
}
|
|
else {
|
|
write(".");
|
|
write(identifier);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
if (languageVersion < 2) {
|
|
var declaration = resolver.getReferencedDeclarationWithCollidingName(node);
|
|
if (declaration) {
|
|
write(getGeneratedNameForNode(declaration.name));
|
|
return;
|
|
}
|
|
}
|
|
else if (resolver.getNodeCheckFlags(node) & 1048576) {
|
|
var declaration = resolver.getReferencedValueDeclaration(node);
|
|
if (declaration) {
|
|
var classAlias = decoratedClassAliases[ts.getNodeId(declaration)];
|
|
if (classAlias !== undefined) {
|
|
write(classAlias);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (ts.nodeIsSynthesized(node)) {
|
|
write(node.text);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node);
|
|
}
|
|
}
|
|
function isNameOfNestedBlockScopedRedeclarationOrCapturedBinding(node) {
|
|
if (languageVersion < 2) {
|
|
var parent_13 = node.parent;
|
|
switch (parent_13.kind) {
|
|
case 169:
|
|
case 221:
|
|
case 224:
|
|
case 218:
|
|
return parent_13.name === node && resolver.isDeclarationWithCollidingName(parent_13);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function getClassExpressionInPropertyAccessInStaticPropertyDeclaration(node) {
|
|
if (languageVersion >= 2) {
|
|
var parent_14 = node.parent;
|
|
if (parent_14.kind === 172 && parent_14.expression === node) {
|
|
parent_14 = parent_14.parent;
|
|
while (parent_14 && parent_14.kind !== 145) {
|
|
parent_14 = parent_14.parent;
|
|
}
|
|
return parent_14 && parent_14.kind === 145 && (parent_14.flags & 32) !== 0 &&
|
|
parent_14.parent.kind === 192 ? parent_14.parent : undefined;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function emitIdentifier(node) {
|
|
if (convertedLoopState) {
|
|
if (node.text == "arguments" && resolver.isArgumentsLocalBinding(node)) {
|
|
var name_27 = convertedLoopState.argumentsName || (convertedLoopState.argumentsName = makeUniqueName("arguments"));
|
|
write(name_27);
|
|
return;
|
|
}
|
|
}
|
|
if (!node.parent) {
|
|
write(node.text);
|
|
}
|
|
else if (isExpressionIdentifier(node)) {
|
|
var classExpression = getClassExpressionInPropertyAccessInStaticPropertyDeclaration(node);
|
|
if (classExpression) {
|
|
var declaration = resolver.getReferencedValueDeclaration(node);
|
|
if (declaration === classExpression) {
|
|
write(getGeneratedNameForNode(declaration.name));
|
|
return;
|
|
}
|
|
}
|
|
emitExpressionIdentifier(node);
|
|
}
|
|
else if (isNameOfNestedBlockScopedRedeclarationOrCapturedBinding(node)) {
|
|
write(getGeneratedNameForNode(node));
|
|
}
|
|
else if (ts.nodeIsSynthesized(node)) {
|
|
write(node.text);
|
|
}
|
|
else {
|
|
writeTextOfNode(currentText, node);
|
|
}
|
|
}
|
|
function emitThis(node) {
|
|
if (resolver.getNodeCheckFlags(node) & 2) {
|
|
write("_this");
|
|
}
|
|
else if (convertedLoopState) {
|
|
write(convertedLoopState.thisName || (convertedLoopState.thisName = makeUniqueName("this")));
|
|
}
|
|
else {
|
|
write("this");
|
|
}
|
|
}
|
|
function emitSuper(node) {
|
|
if (languageVersion >= 2) {
|
|
write("super");
|
|
}
|
|
else {
|
|
var flags = resolver.getNodeCheckFlags(node);
|
|
if (flags & 256) {
|
|
write("_super.prototype");
|
|
}
|
|
else {
|
|
write("_super");
|
|
}
|
|
}
|
|
}
|
|
function emitObjectBindingPattern(node) {
|
|
write("{ ");
|
|
var elements = node.elements;
|
|
emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
|
|
write(" }");
|
|
}
|
|
function emitArrayBindingPattern(node) {
|
|
write("[");
|
|
var elements = node.elements;
|
|
emitList(elements, 0, elements.length, false, elements.hasTrailingComma);
|
|
write("]");
|
|
}
|
|
function emitBindingElement(node) {
|
|
if (node.propertyName) {
|
|
emit(node.propertyName);
|
|
write(": ");
|
|
}
|
|
if (node.dotDotDotToken) {
|
|
write("...");
|
|
}
|
|
if (ts.isBindingPattern(node.name)) {
|
|
emit(node.name);
|
|
}
|
|
else {
|
|
emitModuleMemberName(node);
|
|
}
|
|
emitOptional(" = ", node.initializer);
|
|
}
|
|
function emitSpreadElementExpression(node) {
|
|
write("...");
|
|
emit(node.expression);
|
|
}
|
|
function emitYieldExpression(node) {
|
|
write(ts.tokenToString(114));
|
|
if (node.asteriskToken) {
|
|
write("*");
|
|
}
|
|
if (node.expression) {
|
|
write(" ");
|
|
emit(node.expression);
|
|
}
|
|
}
|
|
function emitAwaitExpression(node) {
|
|
var needsParenthesis = needsParenthesisForAwaitExpressionAsYield(node);
|
|
if (needsParenthesis) {
|
|
write("(");
|
|
}
|
|
write(ts.tokenToString(114));
|
|
write(" ");
|
|
emit(node.expression);
|
|
if (needsParenthesis) {
|
|
write(")");
|
|
}
|
|
}
|
|
function needsParenthesisForAwaitExpressionAsYield(node) {
|
|
if (node.parent.kind === 187 && !ts.isAssignmentOperator(node.parent.operatorToken.kind)) {
|
|
return true;
|
|
}
|
|
else if (node.parent.kind === 188 && node.parent.condition === node) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function needsParenthesisForPropertyAccessOrInvocation(node) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
case 170:
|
|
case 172:
|
|
case 173:
|
|
case 174:
|
|
case 178:
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function emitListWithSpread(elements, needsUniqueCopy, multiLine, trailingComma, useConcat) {
|
|
var pos = 0;
|
|
var group = 0;
|
|
var length = elements.length;
|
|
while (pos < length) {
|
|
if (group === 1 && useConcat) {
|
|
write(".concat(");
|
|
}
|
|
else if (group > 0) {
|
|
write(", ");
|
|
}
|
|
var e = elements[pos];
|
|
if (e.kind === 191) {
|
|
e = e.expression;
|
|
emitParenthesizedIf(e, group === 0 && needsParenthesisForPropertyAccessOrInvocation(e));
|
|
pos++;
|
|
if (pos === length && group === 0 && needsUniqueCopy && e.kind !== 170) {
|
|
write(".slice()");
|
|
}
|
|
}
|
|
else {
|
|
var i = pos;
|
|
while (i < length && elements[i].kind !== 191) {
|
|
i++;
|
|
}
|
|
write("[");
|
|
if (multiLine) {
|
|
increaseIndent();
|
|
}
|
|
emitList(elements, pos, i - pos, multiLine, trailingComma && i === length);
|
|
if (multiLine) {
|
|
decreaseIndent();
|
|
}
|
|
write("]");
|
|
pos = i;
|
|
}
|
|
group++;
|
|
}
|
|
if (group > 1) {
|
|
if (useConcat) {
|
|
write(")");
|
|
}
|
|
}
|
|
}
|
|
function isSpreadElementExpression(node) {
|
|
return node.kind === 191;
|
|
}
|
|
function emitArrayLiteral(node) {
|
|
var elements = node.elements;
|
|
if (elements.length === 0) {
|
|
write("[]");
|
|
}
|
|
else if (languageVersion >= 2 || !ts.forEach(elements, isSpreadElementExpression)) {
|
|
write("[");
|
|
emitLinePreservingList(node, node.elements, elements.hasTrailingComma, false);
|
|
write("]");
|
|
}
|
|
else {
|
|
emitListWithSpread(elements, true, node.multiLine, elements.hasTrailingComma, true);
|
|
}
|
|
}
|
|
function emitObjectLiteralBody(node, numElements) {
|
|
if (numElements === 0) {
|
|
write("{}");
|
|
return;
|
|
}
|
|
write("{");
|
|
if (numElements > 0) {
|
|
var properties = node.properties;
|
|
if (numElements === properties.length) {
|
|
emitLinePreservingList(node, properties, languageVersion >= 1, true);
|
|
}
|
|
else {
|
|
var multiLine = node.multiLine;
|
|
if (!multiLine) {
|
|
write(" ");
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
}
|
|
emitList(properties, 0, numElements, multiLine, false);
|
|
if (!multiLine) {
|
|
write(" ");
|
|
}
|
|
else {
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
}
|
|
write("}");
|
|
}
|
|
function emitDownlevelObjectLiteralWithComputedProperties(node, firstComputedPropertyIndex) {
|
|
var multiLine = node.multiLine;
|
|
var properties = node.properties;
|
|
write("(");
|
|
if (multiLine) {
|
|
increaseIndent();
|
|
}
|
|
var tempVar = createAndRecordTempVariable(0);
|
|
emit(tempVar);
|
|
write(" = ");
|
|
emitObjectLiteralBody(node, firstComputedPropertyIndex);
|
|
for (var i = firstComputedPropertyIndex, n = properties.length; i < n; i++) {
|
|
writeComma();
|
|
var property = properties[i];
|
|
emitStart(property);
|
|
if (property.kind === 149 || property.kind === 150) {
|
|
var accessors = ts.getAllAccessorDeclarations(node.properties, property);
|
|
if (property !== accessors.firstAccessor) {
|
|
continue;
|
|
}
|
|
write("Object.defineProperty(");
|
|
emit(tempVar);
|
|
write(", ");
|
|
emitStart(property.name);
|
|
emitExpressionForPropertyName(property.name);
|
|
emitEnd(property.name);
|
|
write(", {");
|
|
increaseIndent();
|
|
if (accessors.getAccessor) {
|
|
writeLine();
|
|
emitLeadingComments(accessors.getAccessor);
|
|
write("get: ");
|
|
emitStart(accessors.getAccessor);
|
|
write("function ");
|
|
emitSignatureAndBody(accessors.getAccessor);
|
|
emitEnd(accessors.getAccessor);
|
|
emitTrailingComments(accessors.getAccessor);
|
|
write(",");
|
|
}
|
|
if (accessors.setAccessor) {
|
|
writeLine();
|
|
emitLeadingComments(accessors.setAccessor);
|
|
write("set: ");
|
|
emitStart(accessors.setAccessor);
|
|
write("function ");
|
|
emitSignatureAndBody(accessors.setAccessor);
|
|
emitEnd(accessors.setAccessor);
|
|
emitTrailingComments(accessors.setAccessor);
|
|
write(",");
|
|
}
|
|
writeLine();
|
|
write("enumerable: true,");
|
|
writeLine();
|
|
write("configurable: true");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("})");
|
|
emitEnd(property);
|
|
}
|
|
else {
|
|
emitLeadingComments(property);
|
|
emitStart(property.name);
|
|
emit(tempVar);
|
|
emitMemberAccessForPropertyName(property.name);
|
|
emitEnd(property.name);
|
|
write(" = ");
|
|
if (property.kind === 253) {
|
|
emit(property.initializer);
|
|
}
|
|
else if (property.kind === 254) {
|
|
emitExpressionIdentifier(property.name);
|
|
}
|
|
else if (property.kind === 147) {
|
|
emitFunctionDeclaration(property);
|
|
}
|
|
else {
|
|
ts.Debug.fail("ObjectLiteralElement type not accounted for: " + property.kind);
|
|
}
|
|
}
|
|
emitEnd(property);
|
|
}
|
|
writeComma();
|
|
emit(tempVar);
|
|
if (multiLine) {
|
|
decreaseIndent();
|
|
writeLine();
|
|
}
|
|
write(")");
|
|
function writeComma() {
|
|
if (multiLine) {
|
|
write(",");
|
|
writeLine();
|
|
}
|
|
else {
|
|
write(", ");
|
|
}
|
|
}
|
|
}
|
|
function emitObjectLiteral(node) {
|
|
var properties = node.properties;
|
|
if (languageVersion < 2) {
|
|
var numProperties = properties.length;
|
|
var numInitialNonComputedProperties = numProperties;
|
|
for (var i = 0, n = properties.length; i < n; i++) {
|
|
if (properties[i].name.kind === 140) {
|
|
numInitialNonComputedProperties = i;
|
|
break;
|
|
}
|
|
}
|
|
var hasComputedProperty = numInitialNonComputedProperties !== properties.length;
|
|
if (hasComputedProperty) {
|
|
emitDownlevelObjectLiteralWithComputedProperties(node, numInitialNonComputedProperties);
|
|
return;
|
|
}
|
|
}
|
|
emitObjectLiteralBody(node, properties.length);
|
|
}
|
|
function createBinaryExpression(left, operator, right, startsOnNewLine) {
|
|
var result = ts.createSynthesizedNode(187, startsOnNewLine);
|
|
result.operatorToken = ts.createSynthesizedNode(operator);
|
|
result.left = left;
|
|
result.right = right;
|
|
return result;
|
|
}
|
|
function createPropertyAccessExpression(expression, name) {
|
|
var result = ts.createSynthesizedNode(172);
|
|
result.expression = parenthesizeForAccess(expression);
|
|
result.name = name;
|
|
return result;
|
|
}
|
|
function createElementAccessExpression(expression, argumentExpression) {
|
|
var result = ts.createSynthesizedNode(173);
|
|
result.expression = parenthesizeForAccess(expression);
|
|
result.argumentExpression = argumentExpression;
|
|
return result;
|
|
}
|
|
function parenthesizeForAccess(expr) {
|
|
while (expr.kind === 177 ||
|
|
expr.kind === 195 ||
|
|
expr.kind === 196) {
|
|
expr = expr.expression;
|
|
}
|
|
if (ts.isLeftHandSideExpression(expr) &&
|
|
expr.kind !== 175 &&
|
|
expr.kind !== 8) {
|
|
return expr;
|
|
}
|
|
var node = ts.createSynthesizedNode(178);
|
|
node.expression = expr;
|
|
return node;
|
|
}
|
|
function emitComputedPropertyName(node) {
|
|
write("[");
|
|
emitExpressionForPropertyName(node);
|
|
write("]");
|
|
}
|
|
function emitMethod(node) {
|
|
if (languageVersion >= 2 && node.asteriskToken) {
|
|
write("*");
|
|
}
|
|
emit(node.name);
|
|
if (languageVersion < 2) {
|
|
write(": function ");
|
|
}
|
|
emitSignatureAndBody(node);
|
|
}
|
|
function emitPropertyAssignment(node) {
|
|
emit(node.name);
|
|
write(": ");
|
|
emitTrailingCommentsOfPosition(node.initializer.pos);
|
|
emit(node.initializer);
|
|
}
|
|
function isExportReference(node) {
|
|
var container = resolver.getReferencedExportContainer(node);
|
|
return !!container;
|
|
}
|
|
function isImportedReference(node) {
|
|
var declaration = resolver.getReferencedImportDeclaration(node);
|
|
return declaration && (declaration.kind === 231 || declaration.kind === 234);
|
|
}
|
|
function emitShorthandPropertyAssignment(node) {
|
|
writeTextOfNode(currentText, node.name);
|
|
if (languageVersion < 2 || (modulekind !== ts.ModuleKind.ES6 && isImportedReference(node.name)) || isExportReference(node.name)) {
|
|
write(": ");
|
|
emitExpressionIdentifier(node.name);
|
|
}
|
|
if (languageVersion >= 2 && node.objectAssignmentInitializer) {
|
|
write(" = ");
|
|
emit(node.objectAssignmentInitializer);
|
|
}
|
|
}
|
|
function tryEmitConstantValue(node) {
|
|
var constantValue = tryGetConstEnumValue(node);
|
|
if (constantValue !== undefined) {
|
|
write(constantValue.toString());
|
|
if (!compilerOptions.removeComments) {
|
|
var propertyName = node.kind === 172 ? ts.declarationNameToString(node.name) : ts.getTextOfNode(node.argumentExpression);
|
|
write(" /* " + propertyName + " */");
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function tryGetConstEnumValue(node) {
|
|
if (compilerOptions.isolatedModules) {
|
|
return undefined;
|
|
}
|
|
return node.kind === 172 || node.kind === 173
|
|
? resolver.getConstantValue(node)
|
|
: undefined;
|
|
}
|
|
function indentIfOnDifferentLines(parent, node1, node2, valueToWriteWhenNotIndenting) {
|
|
var realNodesAreOnDifferentLines = !ts.nodeIsSynthesized(parent) && !nodeEndIsOnSameLineAsNodeStart(node1, node2);
|
|
var synthesizedNodeIsOnDifferentLine = synthesizedNodeStartsOnNewLine(node2);
|
|
if (realNodesAreOnDifferentLines || synthesizedNodeIsOnDifferentLine) {
|
|
increaseIndent();
|
|
writeLine();
|
|
return true;
|
|
}
|
|
else {
|
|
if (valueToWriteWhenNotIndenting) {
|
|
write(valueToWriteWhenNotIndenting);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
function emitPropertyAccess(node) {
|
|
if (tryEmitConstantValue(node)) {
|
|
return;
|
|
}
|
|
if (languageVersion === 2 &&
|
|
node.expression.kind === 95 &&
|
|
isInAsyncMethodWithSuperInES6(node)) {
|
|
var name_28 = ts.createSynthesizedNode(9);
|
|
name_28.text = node.name.text;
|
|
emitSuperAccessInAsyncMethod(node.expression, name_28);
|
|
return;
|
|
}
|
|
emit(node.expression);
|
|
var dotRangeStart = ts.nodeIsSynthesized(node.expression) ? -1 : node.expression.end;
|
|
var dotRangeEnd = ts.nodeIsSynthesized(node.expression) ? -1 : ts.skipTrivia(currentText, node.expression.end) + 1;
|
|
var dotToken = { pos: dotRangeStart, end: dotRangeEnd };
|
|
var indentedBeforeDot = indentIfOnDifferentLines(node, node.expression, dotToken);
|
|
var shouldEmitSpace = false;
|
|
if (!indentedBeforeDot) {
|
|
if (node.expression.kind === 8) {
|
|
var text = ts.getTextOfNodeFromSourceText(currentText, node.expression);
|
|
shouldEmitSpace = text.indexOf(ts.tokenToString(21)) < 0;
|
|
}
|
|
else {
|
|
var constantValue = tryGetConstEnumValue(node.expression);
|
|
shouldEmitSpace = isFinite(constantValue) && Math.floor(constantValue) === constantValue;
|
|
}
|
|
}
|
|
if (shouldEmitSpace) {
|
|
write(" .");
|
|
}
|
|
else {
|
|
write(".");
|
|
}
|
|
var indentedAfterDot = indentIfOnDifferentLines(node, dotToken, node.name);
|
|
emit(node.name);
|
|
decreaseIndentIf(indentedBeforeDot, indentedAfterDot);
|
|
}
|
|
function emitQualifiedName(node) {
|
|
emit(node.left);
|
|
write(".");
|
|
emit(node.right);
|
|
}
|
|
function emitQualifiedNameAsExpression(node, useFallback) {
|
|
if (node.left.kind === 69) {
|
|
emitEntityNameAsExpression(node.left, useFallback);
|
|
}
|
|
else if (useFallback) {
|
|
var temp = createAndRecordTempVariable(0);
|
|
write("(");
|
|
emitNodeWithoutSourceMap(temp);
|
|
write(" = ");
|
|
emitEntityNameAsExpression(node.left, true);
|
|
write(") && ");
|
|
emitNodeWithoutSourceMap(temp);
|
|
}
|
|
else {
|
|
emitEntityNameAsExpression(node.left, false);
|
|
}
|
|
write(".");
|
|
emit(node.right);
|
|
}
|
|
function emitEntityNameAsExpression(node, useFallback) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
if (useFallback) {
|
|
write("typeof ");
|
|
emitExpressionIdentifier(node);
|
|
write(" !== 'undefined' && ");
|
|
}
|
|
emitExpressionIdentifier(node);
|
|
break;
|
|
case 139:
|
|
emitQualifiedNameAsExpression(node, useFallback);
|
|
break;
|
|
default:
|
|
emitNodeWithoutSourceMap(node);
|
|
break;
|
|
}
|
|
}
|
|
function emitIndexedAccess(node) {
|
|
if (tryEmitConstantValue(node)) {
|
|
return;
|
|
}
|
|
if (languageVersion === 2 &&
|
|
node.expression.kind === 95 &&
|
|
isInAsyncMethodWithSuperInES6(node)) {
|
|
emitSuperAccessInAsyncMethod(node.expression, node.argumentExpression);
|
|
return;
|
|
}
|
|
emit(node.expression);
|
|
write("[");
|
|
emit(node.argumentExpression);
|
|
write("]");
|
|
}
|
|
function hasSpreadElement(elements) {
|
|
return ts.forEach(elements, function (e) { return e.kind === 191; });
|
|
}
|
|
function skipParentheses(node) {
|
|
while (node.kind === 178 ||
|
|
node.kind === 177 ||
|
|
node.kind === 195 ||
|
|
node.kind === 196) {
|
|
node = node.expression;
|
|
}
|
|
return node;
|
|
}
|
|
function emitCallTarget(node) {
|
|
if (node.kind === 69 || node.kind === 97 || node.kind === 95) {
|
|
emit(node);
|
|
return node;
|
|
}
|
|
var temp = createAndRecordTempVariable(0);
|
|
write("(");
|
|
emit(temp);
|
|
write(" = ");
|
|
emit(node);
|
|
write(")");
|
|
return temp;
|
|
}
|
|
function emitCallWithSpread(node) {
|
|
var target;
|
|
var expr = skipParentheses(node.expression);
|
|
if (expr.kind === 172) {
|
|
target = emitCallTarget(expr.expression);
|
|
write(".");
|
|
emit(expr.name);
|
|
}
|
|
else if (expr.kind === 173) {
|
|
target = emitCallTarget(expr.expression);
|
|
write("[");
|
|
emit(expr.argumentExpression);
|
|
write("]");
|
|
}
|
|
else if (expr.kind === 95) {
|
|
target = expr;
|
|
write("_super");
|
|
}
|
|
else {
|
|
emit(node.expression);
|
|
}
|
|
write(".apply(");
|
|
if (target) {
|
|
if (target.kind === 95) {
|
|
emitThis(target);
|
|
}
|
|
else {
|
|
emit(target);
|
|
}
|
|
}
|
|
else {
|
|
write("void 0");
|
|
}
|
|
write(", ");
|
|
emitListWithSpread(node.arguments, false, false, false, true);
|
|
write(")");
|
|
}
|
|
function isInAsyncMethodWithSuperInES6(node) {
|
|
if (languageVersion === 2) {
|
|
var container = ts.getSuperContainer(node, false);
|
|
if (container && resolver.getNodeCheckFlags(container) & (2048 | 4096)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function emitSuperAccessInAsyncMethod(superNode, argumentExpression) {
|
|
var container = ts.getSuperContainer(superNode, false);
|
|
var isSuperBinding = resolver.getNodeCheckFlags(container) & 4096;
|
|
write("_super(");
|
|
emit(argumentExpression);
|
|
write(isSuperBinding ? ").value" : ")");
|
|
}
|
|
function emitCallExpression(node) {
|
|
if (languageVersion < 2 && hasSpreadElement(node.arguments)) {
|
|
emitCallWithSpread(node);
|
|
return;
|
|
}
|
|
var expression = node.expression;
|
|
var superCall = false;
|
|
var isAsyncMethodWithSuper = false;
|
|
if (expression.kind === 95) {
|
|
emitSuper(expression);
|
|
superCall = true;
|
|
}
|
|
else {
|
|
superCall = ts.isSuperPropertyOrElementAccess(expression);
|
|
isAsyncMethodWithSuper = superCall && isInAsyncMethodWithSuperInES6(node);
|
|
emit(expression);
|
|
}
|
|
if (superCall && (languageVersion < 2 || isAsyncMethodWithSuper)) {
|
|
write(".call(");
|
|
emitThis(expression);
|
|
if (node.arguments.length) {
|
|
write(", ");
|
|
emitCommaList(node.arguments);
|
|
}
|
|
write(")");
|
|
}
|
|
else {
|
|
write("(");
|
|
emitCommaList(node.arguments);
|
|
write(")");
|
|
}
|
|
}
|
|
function emitNewExpression(node) {
|
|
write("new ");
|
|
if (languageVersion === 1 &&
|
|
node.arguments &&
|
|
hasSpreadElement(node.arguments)) {
|
|
write("(");
|
|
var target = emitCallTarget(node.expression);
|
|
write(".bind.apply(");
|
|
emit(target);
|
|
write(", [void 0].concat(");
|
|
emitListWithSpread(node.arguments, false, false, false, false);
|
|
write(")))");
|
|
write("()");
|
|
}
|
|
else {
|
|
emit(node.expression);
|
|
if (node.arguments) {
|
|
write("(");
|
|
emitCommaList(node.arguments);
|
|
write(")");
|
|
}
|
|
}
|
|
}
|
|
function emitTaggedTemplateExpression(node) {
|
|
if (languageVersion >= 2) {
|
|
emit(node.tag);
|
|
write(" ");
|
|
emit(node.template);
|
|
}
|
|
else {
|
|
emitDownlevelTaggedTemplate(node);
|
|
}
|
|
}
|
|
function emitParenExpression(node) {
|
|
if (!ts.nodeIsSynthesized(node) && node.parent.kind !== 180) {
|
|
if (node.expression.kind === 177 ||
|
|
node.expression.kind === 195 ||
|
|
node.expression.kind === 196) {
|
|
var operand = node.expression.expression;
|
|
while (operand.kind === 177 ||
|
|
operand.kind === 195 ||
|
|
operand.kind === 196) {
|
|
operand = operand.expression;
|
|
}
|
|
if (operand.kind !== 185 &&
|
|
operand.kind !== 183 &&
|
|
operand.kind !== 182 &&
|
|
operand.kind !== 181 &&
|
|
operand.kind !== 186 &&
|
|
operand.kind !== 175 &&
|
|
!(operand.kind === 174 && node.parent.kind === 175) &&
|
|
!(operand.kind === 179 && node.parent.kind === 174) &&
|
|
!(operand.kind === 8 && node.parent.kind === 172)) {
|
|
emit(operand);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
write("(");
|
|
emit(node.expression);
|
|
write(")");
|
|
}
|
|
function emitDeleteExpression(node) {
|
|
write(ts.tokenToString(78));
|
|
write(" ");
|
|
emit(node.expression);
|
|
}
|
|
function emitVoidExpression(node) {
|
|
write(ts.tokenToString(103));
|
|
write(" ");
|
|
emit(node.expression);
|
|
}
|
|
function emitTypeOfExpression(node) {
|
|
write(ts.tokenToString(101));
|
|
write(" ");
|
|
emit(node.expression);
|
|
}
|
|
function isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node) {
|
|
if (!isCurrentFileSystemExternalModule() || node.kind !== 69 || ts.nodeIsSynthesized(node)) {
|
|
return false;
|
|
}
|
|
var isVariableDeclarationOrBindingElement = node.parent && (node.parent.kind === 218 || node.parent.kind === 169);
|
|
var targetDeclaration = isVariableDeclarationOrBindingElement
|
|
? node.parent
|
|
: resolver.getReferencedValueDeclaration(node);
|
|
return isSourceFileLevelDeclarationInSystemJsModule(targetDeclaration, true);
|
|
}
|
|
function isNameOfExportedDeclarationInNonES6Module(node) {
|
|
if (modulekind === ts.ModuleKind.System || node.kind !== 69 || ts.nodeIsSynthesized(node)) {
|
|
return false;
|
|
}
|
|
return !exportEquals && exportSpecifiers && ts.hasProperty(exportSpecifiers, node.text);
|
|
}
|
|
function emitPrefixUnaryExpression(node) {
|
|
var isPlusPlusOrMinusMinus = (node.operator === 41
|
|
|| node.operator === 42);
|
|
var externalExportChanged = isPlusPlusOrMinusMinus &&
|
|
isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
|
|
if (externalExportChanged) {
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithoutSourceMap(node.operand);
|
|
write("\", ");
|
|
}
|
|
var internalExportChanged = isPlusPlusOrMinusMinus &&
|
|
isNameOfExportedDeclarationInNonES6Module(node.operand);
|
|
if (internalExportChanged) {
|
|
emitAliasEqual(node.operand);
|
|
}
|
|
write(ts.tokenToString(node.operator));
|
|
if (node.operand.kind === 185) {
|
|
var operand = node.operand;
|
|
if (node.operator === 35 && (operand.operator === 35 || operand.operator === 41)) {
|
|
write(" ");
|
|
}
|
|
else if (node.operator === 36 && (operand.operator === 36 || operand.operator === 42)) {
|
|
write(" ");
|
|
}
|
|
}
|
|
emit(node.operand);
|
|
if (externalExportChanged) {
|
|
write(")");
|
|
}
|
|
}
|
|
function emitPostfixUnaryExpression(node) {
|
|
var externalExportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand);
|
|
var internalExportChanged = isNameOfExportedDeclarationInNonES6Module(node.operand);
|
|
if (externalExportChanged) {
|
|
write("(" + exportFunctionForFile + "(\"");
|
|
emitNodeWithoutSourceMap(node.operand);
|
|
write("\", ");
|
|
write(ts.tokenToString(node.operator));
|
|
emit(node.operand);
|
|
if (node.operator === 41) {
|
|
write(") - 1)");
|
|
}
|
|
else {
|
|
write(") + 1)");
|
|
}
|
|
}
|
|
else if (internalExportChanged) {
|
|
emitAliasEqual(node.operand);
|
|
emit(node.operand);
|
|
if (node.operator === 41) {
|
|
write(" += 1");
|
|
}
|
|
else {
|
|
write(" -= 1");
|
|
}
|
|
}
|
|
else {
|
|
emit(node.operand);
|
|
write(ts.tokenToString(node.operator));
|
|
}
|
|
}
|
|
function shouldHoistDeclarationInSystemJsModule(node) {
|
|
return isSourceFileLevelDeclarationInSystemJsModule(node, false);
|
|
}
|
|
function isSourceFileLevelDeclarationInSystemJsModule(node, isExported) {
|
|
if (!node || !isCurrentFileSystemExternalModule()) {
|
|
return false;
|
|
}
|
|
var current = ts.getRootDeclaration(node).parent;
|
|
while (current) {
|
|
if (current.kind === 256) {
|
|
return !isExported || ((ts.getCombinedNodeFlags(node) & 1) !== 0);
|
|
}
|
|
else if (ts.isDeclaration(current)) {
|
|
return false;
|
|
}
|
|
else {
|
|
current = current.parent;
|
|
}
|
|
}
|
|
}
|
|
function emitExponentiationOperator(node) {
|
|
var leftHandSideExpression = node.left;
|
|
if (node.operatorToken.kind === 60) {
|
|
var synthesizedLHS = void 0;
|
|
var shouldEmitParentheses = false;
|
|
if (ts.isElementAccessExpression(leftHandSideExpression)) {
|
|
shouldEmitParentheses = true;
|
|
write("(");
|
|
synthesizedLHS = ts.createSynthesizedNode(173, false);
|
|
var identifier = emitTempVariableAssignment(leftHandSideExpression.expression, false, false);
|
|
synthesizedLHS.expression = identifier;
|
|
if (leftHandSideExpression.argumentExpression.kind !== 8 &&
|
|
leftHandSideExpression.argumentExpression.kind !== 9) {
|
|
var tempArgumentExpression = createAndRecordTempVariable(268435456);
|
|
synthesizedLHS.argumentExpression = tempArgumentExpression;
|
|
emitAssignment(tempArgumentExpression, leftHandSideExpression.argumentExpression, true, leftHandSideExpression.expression);
|
|
}
|
|
else {
|
|
synthesizedLHS.argumentExpression = leftHandSideExpression.argumentExpression;
|
|
}
|
|
write(", ");
|
|
}
|
|
else if (ts.isPropertyAccessExpression(leftHandSideExpression)) {
|
|
shouldEmitParentheses = true;
|
|
write("(");
|
|
synthesizedLHS = ts.createSynthesizedNode(172, false);
|
|
var identifier = emitTempVariableAssignment(leftHandSideExpression.expression, false, false);
|
|
synthesizedLHS.expression = identifier;
|
|
synthesizedLHS.name = leftHandSideExpression.name;
|
|
write(", ");
|
|
}
|
|
emit(synthesizedLHS || leftHandSideExpression);
|
|
write(" = ");
|
|
write("Math.pow(");
|
|
emit(synthesizedLHS || leftHandSideExpression);
|
|
write(", ");
|
|
emit(node.right);
|
|
write(")");
|
|
if (shouldEmitParentheses) {
|
|
write(")");
|
|
}
|
|
}
|
|
else {
|
|
write("Math.pow(");
|
|
emit(leftHandSideExpression);
|
|
write(", ");
|
|
emit(node.right);
|
|
write(")");
|
|
}
|
|
}
|
|
function emitAliasEqual(name) {
|
|
for (var _a = 0, _b = exportSpecifiers[name.text]; _a < _b.length; _a++) {
|
|
var specifier = _b[_a];
|
|
emitStart(specifier.name);
|
|
emitContainingModuleName(specifier);
|
|
if (languageVersion === 0 && name.text === "default") {
|
|
write('["default"]');
|
|
}
|
|
else {
|
|
write(".");
|
|
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
|
|
}
|
|
emitEnd(specifier.name);
|
|
write(" = ");
|
|
}
|
|
return true;
|
|
}
|
|
function emitBinaryExpression(node) {
|
|
if (languageVersion < 2 && node.operatorToken.kind === 56 &&
|
|
(node.left.kind === 171 || node.left.kind === 170)) {
|
|
emitDestructuring(node, node.parent.kind === 202);
|
|
}
|
|
else {
|
|
var isAssignment = ts.isAssignmentOperator(node.operatorToken.kind);
|
|
var externalExportChanged = isAssignment &&
|
|
isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.left);
|
|
if (externalExportChanged) {
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithoutSourceMap(node.left);
|
|
write("\", ");
|
|
}
|
|
var internalExportChanged = isAssignment &&
|
|
isNameOfExportedDeclarationInNonES6Module(node.left);
|
|
if (internalExportChanged) {
|
|
emitAliasEqual(node.left);
|
|
}
|
|
if (node.operatorToken.kind === 38 || node.operatorToken.kind === 60) {
|
|
emitExponentiationOperator(node);
|
|
}
|
|
else {
|
|
emit(node.left);
|
|
var indentedBeforeOperator = indentIfOnDifferentLines(node, node.left, node.operatorToken, node.operatorToken.kind !== 24 ? " " : undefined);
|
|
write(ts.tokenToString(node.operatorToken.kind));
|
|
var indentedAfterOperator = indentIfOnDifferentLines(node, node.operatorToken, node.right, " ");
|
|
emit(node.right);
|
|
decreaseIndentIf(indentedBeforeOperator, indentedAfterOperator);
|
|
}
|
|
if (externalExportChanged) {
|
|
write(")");
|
|
}
|
|
}
|
|
}
|
|
function synthesizedNodeStartsOnNewLine(node) {
|
|
return ts.nodeIsSynthesized(node) && node.startsOnNewLine;
|
|
}
|
|
function emitConditionalExpression(node) {
|
|
emit(node.condition);
|
|
var indentedBeforeQuestion = indentIfOnDifferentLines(node, node.condition, node.questionToken, " ");
|
|
write("?");
|
|
var indentedAfterQuestion = indentIfOnDifferentLines(node, node.questionToken, node.whenTrue, " ");
|
|
emit(node.whenTrue);
|
|
decreaseIndentIf(indentedBeforeQuestion, indentedAfterQuestion);
|
|
var indentedBeforeColon = indentIfOnDifferentLines(node, node.whenTrue, node.colonToken, " ");
|
|
write(":");
|
|
var indentedAfterColon = indentIfOnDifferentLines(node, node.colonToken, node.whenFalse, " ");
|
|
emit(node.whenFalse);
|
|
decreaseIndentIf(indentedBeforeColon, indentedAfterColon);
|
|
}
|
|
function decreaseIndentIf(value1, value2) {
|
|
if (value1) {
|
|
decreaseIndent();
|
|
}
|
|
if (value2) {
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
function isSingleLineEmptyBlock(node) {
|
|
if (node && node.kind === 199) {
|
|
var block = node;
|
|
return block.statements.length === 0 && nodeEndIsOnSameLineAsNodeStart(block, block);
|
|
}
|
|
}
|
|
function emitBlock(node) {
|
|
if (isSingleLineEmptyBlock(node)) {
|
|
emitToken(15, node.pos);
|
|
write(" ");
|
|
emitToken(16, node.statements.end);
|
|
return;
|
|
}
|
|
emitToken(15, node.pos);
|
|
increaseIndent();
|
|
if (node.kind === 226) {
|
|
ts.Debug.assert(node.parent.kind === 225);
|
|
emitCaptureThisForNodeIfNecessary(node.parent);
|
|
}
|
|
emitLines(node.statements);
|
|
if (node.kind === 226) {
|
|
emitTempDeclarations(true);
|
|
}
|
|
decreaseIndent();
|
|
writeLine();
|
|
emitToken(16, node.statements.end);
|
|
}
|
|
function emitEmbeddedStatement(node) {
|
|
if (node.kind === 199) {
|
|
write(" ");
|
|
emit(node);
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
writeLine();
|
|
emit(node);
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
function emitExpressionStatement(node) {
|
|
emitParenthesizedIf(node.expression, node.expression.kind === 180);
|
|
write(";");
|
|
}
|
|
function emitIfStatement(node) {
|
|
var endPos = emitToken(88, node.pos);
|
|
write(" ");
|
|
endPos = emitToken(17, endPos);
|
|
emit(node.expression);
|
|
emitToken(18, node.expression.end);
|
|
emitEmbeddedStatement(node.thenStatement);
|
|
if (node.elseStatement) {
|
|
writeLine();
|
|
emitToken(80, node.thenStatement.end);
|
|
if (node.elseStatement.kind === 203) {
|
|
write(" ");
|
|
emit(node.elseStatement);
|
|
}
|
|
else {
|
|
emitEmbeddedStatement(node.elseStatement);
|
|
}
|
|
}
|
|
}
|
|
function emitDoStatement(node) {
|
|
emitLoop(node, emitDoStatementWorker);
|
|
}
|
|
function emitDoStatementWorker(node, loop) {
|
|
write("do");
|
|
if (loop) {
|
|
emitConvertedLoopCall(loop, true);
|
|
}
|
|
else {
|
|
emitNormalLoopBody(node, true);
|
|
}
|
|
if (node.statement.kind === 199) {
|
|
write(" ");
|
|
}
|
|
else {
|
|
writeLine();
|
|
}
|
|
write("while (");
|
|
emit(node.expression);
|
|
write(");");
|
|
}
|
|
function emitWhileStatement(node) {
|
|
emitLoop(node, emitWhileStatementWorker);
|
|
}
|
|
function emitWhileStatementWorker(node, loop) {
|
|
write("while (");
|
|
emit(node.expression);
|
|
write(")");
|
|
if (loop) {
|
|
emitConvertedLoopCall(loop, true);
|
|
}
|
|
else {
|
|
emitNormalLoopBody(node, true);
|
|
}
|
|
}
|
|
function tryEmitStartOfVariableDeclarationList(decl) {
|
|
if (shouldHoistVariable(decl, true)) {
|
|
return false;
|
|
}
|
|
if (convertedLoopState && (ts.getCombinedNodeFlags(decl) & 3072) === 0) {
|
|
for (var _a = 0, _b = decl.declarations; _a < _b.length; _a++) {
|
|
var varDecl = _b[_a];
|
|
hoistVariableDeclarationFromLoop(convertedLoopState, varDecl);
|
|
}
|
|
return false;
|
|
}
|
|
emitStart(decl);
|
|
if (decl && languageVersion >= 2) {
|
|
if (ts.isLet(decl)) {
|
|
write("let ");
|
|
}
|
|
else if (ts.isConst(decl)) {
|
|
write("const ");
|
|
}
|
|
else {
|
|
write("var ");
|
|
}
|
|
}
|
|
else {
|
|
write("var ");
|
|
}
|
|
return true;
|
|
}
|
|
function emitVariableDeclarationListSkippingUninitializedEntries(list) {
|
|
var started = false;
|
|
for (var _a = 0, _b = list.declarations; _a < _b.length; _a++) {
|
|
var decl = _b[_a];
|
|
if (!decl.initializer) {
|
|
continue;
|
|
}
|
|
if (!started) {
|
|
started = true;
|
|
}
|
|
else {
|
|
write(", ");
|
|
}
|
|
emit(decl);
|
|
}
|
|
return started;
|
|
}
|
|
function shouldConvertLoopBody(node) {
|
|
return languageVersion < 2 &&
|
|
(resolver.getNodeCheckFlags(node) & 65536) !== 0;
|
|
}
|
|
function emitLoop(node, loopEmitter) {
|
|
var shouldConvert = shouldConvertLoopBody(node);
|
|
if (!shouldConvert) {
|
|
loopEmitter(node, undefined);
|
|
}
|
|
else {
|
|
var loop = convertLoopBody(node);
|
|
if (node.parent.kind === 214) {
|
|
emitLabelAndColon(node.parent);
|
|
}
|
|
loopEmitter(node, loop);
|
|
}
|
|
}
|
|
function convertLoopBody(node) {
|
|
var functionName = makeUniqueName("_loop");
|
|
var loopInitializer;
|
|
switch (node.kind) {
|
|
case 206:
|
|
case 207:
|
|
case 208:
|
|
var initializer = node.initializer;
|
|
if (initializer && initializer.kind === 219) {
|
|
loopInitializer = node.initializer;
|
|
}
|
|
break;
|
|
}
|
|
var loopParameters;
|
|
var loopOutParameters;
|
|
if (loopInitializer && (ts.getCombinedNodeFlags(loopInitializer) & 3072)) {
|
|
loopParameters = [];
|
|
for (var _a = 0, _b = loopInitializer.declarations; _a < _b.length; _a++) {
|
|
var varDeclaration = _b[_a];
|
|
processVariableDeclaration(varDeclaration.name);
|
|
}
|
|
}
|
|
var bodyIsBlock = node.statement.kind === 199;
|
|
var paramList = loopParameters ? loopParameters.join(", ") : "";
|
|
writeLine();
|
|
write("var " + functionName + " = function(" + paramList + ")");
|
|
var convertedOuterLoopState = convertedLoopState;
|
|
convertedLoopState = { loopOutParameters: loopOutParameters };
|
|
if (convertedOuterLoopState) {
|
|
if (convertedOuterLoopState.argumentsName) {
|
|
convertedLoopState.argumentsName = convertedOuterLoopState.argumentsName;
|
|
}
|
|
if (convertedOuterLoopState.thisName) {
|
|
convertedLoopState.thisName = convertedOuterLoopState.thisName;
|
|
}
|
|
if (convertedOuterLoopState.hoistedLocalVariables) {
|
|
convertedLoopState.hoistedLocalVariables = convertedOuterLoopState.hoistedLocalVariables;
|
|
}
|
|
}
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
if (bodyIsBlock) {
|
|
emitLines(node.statement.statements);
|
|
}
|
|
else {
|
|
emit(node.statement);
|
|
}
|
|
writeLine();
|
|
copyLoopOutParameters(convertedLoopState, 1, true);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("};");
|
|
writeLine();
|
|
if (loopOutParameters) {
|
|
write("var ");
|
|
for (var i = 0; i < loopOutParameters.length; i++) {
|
|
if (i !== 0) {
|
|
write(", ");
|
|
}
|
|
write(loopOutParameters[i].outParamName);
|
|
}
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
if (convertedLoopState.argumentsName) {
|
|
if (convertedOuterLoopState) {
|
|
convertedOuterLoopState.argumentsName = convertedLoopState.argumentsName;
|
|
}
|
|
else {
|
|
write("var " + convertedLoopState.argumentsName + " = arguments;");
|
|
writeLine();
|
|
}
|
|
}
|
|
if (convertedLoopState.thisName) {
|
|
if (convertedOuterLoopState) {
|
|
convertedOuterLoopState.thisName = convertedLoopState.thisName;
|
|
}
|
|
else {
|
|
write("var " + convertedLoopState.thisName + " = this;");
|
|
writeLine();
|
|
}
|
|
}
|
|
if (convertedLoopState.hoistedLocalVariables) {
|
|
if (convertedOuterLoopState) {
|
|
convertedOuterLoopState.hoistedLocalVariables = convertedLoopState.hoistedLocalVariables;
|
|
}
|
|
else {
|
|
write("var ");
|
|
var seen = void 0;
|
|
for (var _c = 0, _d = convertedLoopState.hoistedLocalVariables; _c < _d.length; _c++) {
|
|
var id = _d[_c];
|
|
if (!seen) {
|
|
seen = {};
|
|
}
|
|
else {
|
|
write(", ");
|
|
}
|
|
if (!ts.hasProperty(seen, id.text)) {
|
|
emit(id);
|
|
seen[id.text] = id.text;
|
|
}
|
|
}
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
}
|
|
var currentLoopState = convertedLoopState;
|
|
convertedLoopState = convertedOuterLoopState;
|
|
return { functionName: functionName, paramList: paramList, state: currentLoopState };
|
|
function processVariableDeclaration(name) {
|
|
if (name.kind === 69) {
|
|
var nameText = isNameOfNestedBlockScopedRedeclarationOrCapturedBinding(name)
|
|
? getGeneratedNameForNode(name)
|
|
: name.text;
|
|
loopParameters.push(nameText);
|
|
if (resolver.getNodeCheckFlags(name.parent) & 2097152) {
|
|
var reassignedVariable = { originalName: name, outParamName: makeUniqueName("out_" + nameText) };
|
|
(loopOutParameters || (loopOutParameters = [])).push(reassignedVariable);
|
|
}
|
|
}
|
|
else {
|
|
for (var _a = 0, _b = name.elements; _a < _b.length; _a++) {
|
|
var element = _b[_a];
|
|
processVariableDeclaration(element.name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitNormalLoopBody(node, emitAsEmbeddedStatement) {
|
|
var saveAllowedNonLabeledJumps;
|
|
if (convertedLoopState) {
|
|
saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
|
|
convertedLoopState.allowedNonLabeledJumps = 2 | 4;
|
|
}
|
|
if (emitAsEmbeddedStatement) {
|
|
emitEmbeddedStatement(node.statement);
|
|
}
|
|
else if (node.statement.kind === 199) {
|
|
emitLines(node.statement.statements);
|
|
}
|
|
else {
|
|
writeLine();
|
|
emit(node.statement);
|
|
}
|
|
if (convertedLoopState) {
|
|
convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps;
|
|
}
|
|
}
|
|
function copyLoopOutParameters(state, copyDirection, emitAsStatements) {
|
|
if (state.loopOutParameters) {
|
|
for (var _a = 0, _b = state.loopOutParameters; _a < _b.length; _a++) {
|
|
var outParam = _b[_a];
|
|
if (copyDirection === 0) {
|
|
emitIdentifier(outParam.originalName);
|
|
write(" = " + outParam.outParamName);
|
|
}
|
|
else {
|
|
write(outParam.outParamName + " = ");
|
|
emitIdentifier(outParam.originalName);
|
|
}
|
|
if (emitAsStatements) {
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
else {
|
|
write(", ");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitConvertedLoopCall(loop, emitAsBlock) {
|
|
if (emitAsBlock) {
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
}
|
|
var isSimpleLoop = !(loop.state.nonLocalJumps & ~4) &&
|
|
!loop.state.labeledNonLocalBreaks &&
|
|
!loop.state.labeledNonLocalContinues;
|
|
var loopResult = makeUniqueName("state");
|
|
if (!isSimpleLoop) {
|
|
write("var " + loopResult + " = ");
|
|
}
|
|
write(loop.functionName + "(" + loop.paramList + ");");
|
|
writeLine();
|
|
copyLoopOutParameters(loop.state, 0, true);
|
|
if (!isSimpleLoop) {
|
|
writeLine();
|
|
if (loop.state.nonLocalJumps & 8) {
|
|
write("if (typeof " + loopResult + " === \"object\") ");
|
|
if (convertedLoopState) {
|
|
write("return " + loopResult + ";");
|
|
convertedLoopState.nonLocalJumps |= 8;
|
|
}
|
|
else {
|
|
write("return " + loopResult + ".value;");
|
|
}
|
|
writeLine();
|
|
}
|
|
if (loop.state.nonLocalJumps & 2) {
|
|
write("if (" + loopResult + " === \"break\") break;");
|
|
writeLine();
|
|
}
|
|
emitDispatchTableForLabeledJumps(loopResult, loop.state, convertedLoopState);
|
|
}
|
|
if (emitAsBlock) {
|
|
writeLine();
|
|
decreaseIndent();
|
|
write("}");
|
|
}
|
|
function emitDispatchTableForLabeledJumps(loopResultVariable, currentLoop, outerLoop) {
|
|
if (!currentLoop.labeledNonLocalBreaks && !currentLoop.labeledNonLocalContinues) {
|
|
return;
|
|
}
|
|
write("switch(" + loopResultVariable + ") {");
|
|
increaseIndent();
|
|
emitDispatchEntriesForLabeledJumps(currentLoop.labeledNonLocalBreaks, true, loopResultVariable, outerLoop);
|
|
emitDispatchEntriesForLabeledJumps(currentLoop.labeledNonLocalContinues, false, loopResultVariable, outerLoop);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
}
|
|
function emitDispatchEntriesForLabeledJumps(table, isBreak, loopResultVariable, outerLoop) {
|
|
if (!table) {
|
|
return;
|
|
}
|
|
for (var labelText in table) {
|
|
var labelMarker = table[labelText];
|
|
writeLine();
|
|
write("case \"" + labelMarker + "\": ");
|
|
if (!outerLoop || (outerLoop.labels && outerLoop.labels[labelText])) {
|
|
if (isBreak) {
|
|
write("break ");
|
|
}
|
|
else {
|
|
write("continue ");
|
|
}
|
|
write(labelText + ";");
|
|
}
|
|
else {
|
|
setLabeledJump(outerLoop, isBreak, labelText, labelMarker);
|
|
write("return " + loopResultVariable + ";");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitForStatement(node) {
|
|
emitLoop(node, emitForStatementWorker);
|
|
}
|
|
function emitForStatementWorker(node, loop) {
|
|
var endPos = emitToken(86, node.pos);
|
|
write(" ");
|
|
endPos = emitToken(17, endPos);
|
|
if (node.initializer && node.initializer.kind === 219) {
|
|
var variableDeclarationList = node.initializer;
|
|
var startIsEmitted = tryEmitStartOfVariableDeclarationList(variableDeclarationList);
|
|
if (startIsEmitted) {
|
|
emitCommaList(variableDeclarationList.declarations);
|
|
}
|
|
else {
|
|
emitVariableDeclarationListSkippingUninitializedEntries(variableDeclarationList);
|
|
}
|
|
}
|
|
else if (node.initializer) {
|
|
emit(node.initializer);
|
|
}
|
|
write(";");
|
|
emitOptional(" ", node.condition);
|
|
write(";");
|
|
emitOptional(" ", node.incrementor);
|
|
write(")");
|
|
if (loop) {
|
|
emitConvertedLoopCall(loop, true);
|
|
}
|
|
else {
|
|
emitNormalLoopBody(node, true);
|
|
}
|
|
}
|
|
function emitForInOrForOfStatement(node) {
|
|
if (languageVersion < 2 && node.kind === 208) {
|
|
emitLoop(node, emitDownLevelForOfStatementWorker);
|
|
}
|
|
else {
|
|
emitLoop(node, emitForInOrForOfStatementWorker);
|
|
}
|
|
}
|
|
function emitForInOrForOfStatementWorker(node, loop) {
|
|
var endPos = emitToken(86, node.pos);
|
|
write(" ");
|
|
endPos = emitToken(17, endPos);
|
|
if (node.initializer.kind === 219) {
|
|
var variableDeclarationList = node.initializer;
|
|
if (variableDeclarationList.declarations.length >= 1) {
|
|
tryEmitStartOfVariableDeclarationList(variableDeclarationList);
|
|
emit(variableDeclarationList.declarations[0]);
|
|
}
|
|
}
|
|
else {
|
|
emit(node.initializer);
|
|
}
|
|
if (node.kind === 207) {
|
|
write(" in ");
|
|
}
|
|
else {
|
|
write(" of ");
|
|
}
|
|
emit(node.expression);
|
|
emitToken(18, node.expression.end);
|
|
if (loop) {
|
|
emitConvertedLoopCall(loop, true);
|
|
}
|
|
else {
|
|
emitNormalLoopBody(node, true);
|
|
}
|
|
}
|
|
function emitDownLevelForOfStatementWorker(node, loop) {
|
|
var endPos = emitToken(86, node.pos);
|
|
write(" ");
|
|
endPos = emitToken(17, endPos);
|
|
var counter = createTempVariable(268435456);
|
|
var rhsReference = ts.createSynthesizedNode(69);
|
|
rhsReference.text = node.expression.kind === 69 ?
|
|
makeUniqueName(node.expression.text) :
|
|
makeTempVariableName(0);
|
|
emitStart(node.expression);
|
|
write("var ");
|
|
emitNodeWithoutSourceMap(counter);
|
|
write(" = 0");
|
|
emitEnd(node.expression);
|
|
write(", ");
|
|
emitStart(node.expression);
|
|
emitNodeWithoutSourceMap(rhsReference);
|
|
write(" = ");
|
|
emitNodeWithoutSourceMap(node.expression);
|
|
emitEnd(node.expression);
|
|
write("; ");
|
|
emitStart(node.expression);
|
|
emitNodeWithoutSourceMap(counter);
|
|
write(" < ");
|
|
emitNodeWithCommentsAndWithoutSourcemap(rhsReference);
|
|
write(".length");
|
|
emitEnd(node.expression);
|
|
write("; ");
|
|
emitStart(node.expression);
|
|
emitNodeWithoutSourceMap(counter);
|
|
write("++");
|
|
emitEnd(node.expression);
|
|
emitToken(18, node.expression.end);
|
|
write(" {");
|
|
writeLine();
|
|
increaseIndent();
|
|
var rhsIterationValue = createElementAccessExpression(rhsReference, counter);
|
|
emitStart(node.initializer);
|
|
if (node.initializer.kind === 219) {
|
|
write("var ");
|
|
var variableDeclarationList = node.initializer;
|
|
if (variableDeclarationList.declarations.length > 0) {
|
|
var declaration = variableDeclarationList.declarations[0];
|
|
if (ts.isBindingPattern(declaration.name)) {
|
|
emitDestructuring(declaration, false, rhsIterationValue);
|
|
}
|
|
else {
|
|
emitNodeWithCommentsAndWithoutSourcemap(declaration);
|
|
write(" = ");
|
|
emitNodeWithoutSourceMap(rhsIterationValue);
|
|
}
|
|
}
|
|
else {
|
|
emitNodeWithoutSourceMap(createTempVariable(0));
|
|
write(" = ");
|
|
emitNodeWithoutSourceMap(rhsIterationValue);
|
|
}
|
|
}
|
|
else {
|
|
var assignmentExpression = createBinaryExpression(node.initializer, 56, rhsIterationValue, false);
|
|
if (node.initializer.kind === 170 || node.initializer.kind === 171) {
|
|
emitDestructuring(assignmentExpression, true, undefined);
|
|
}
|
|
else {
|
|
emitNodeWithCommentsAndWithoutSourcemap(assignmentExpression);
|
|
}
|
|
}
|
|
emitEnd(node.initializer);
|
|
write(";");
|
|
if (loop) {
|
|
writeLine();
|
|
emitConvertedLoopCall(loop, false);
|
|
}
|
|
else {
|
|
emitNormalLoopBody(node, false);
|
|
}
|
|
writeLine();
|
|
decreaseIndent();
|
|
write("}");
|
|
}
|
|
function emitBreakOrContinueStatement(node) {
|
|
if (convertedLoopState) {
|
|
var jump = node.kind === 210 ? 2 : 4;
|
|
var canUseBreakOrContinue = (node.label && convertedLoopState.labels && convertedLoopState.labels[node.label.text]) ||
|
|
(!node.label && (convertedLoopState.allowedNonLabeledJumps & jump));
|
|
if (!canUseBreakOrContinue) {
|
|
write("return ");
|
|
copyLoopOutParameters(convertedLoopState, 1, false);
|
|
if (!node.label) {
|
|
if (node.kind === 210) {
|
|
convertedLoopState.nonLocalJumps |= 2;
|
|
write("\"break\";");
|
|
}
|
|
else {
|
|
convertedLoopState.nonLocalJumps |= 4;
|
|
write("\"continue\";");
|
|
}
|
|
}
|
|
else {
|
|
var labelMarker = void 0;
|
|
if (node.kind === 210) {
|
|
labelMarker = "break-" + node.label.text;
|
|
setLabeledJump(convertedLoopState, true, node.label.text, labelMarker);
|
|
}
|
|
else {
|
|
labelMarker = "continue-" + node.label.text;
|
|
setLabeledJump(convertedLoopState, false, node.label.text, labelMarker);
|
|
}
|
|
write("\"" + labelMarker + "\";");
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
emitToken(node.kind === 210 ? 70 : 75, node.pos);
|
|
emitOptional(" ", node.label);
|
|
write(";");
|
|
}
|
|
function emitReturnStatement(node) {
|
|
if (convertedLoopState) {
|
|
convertedLoopState.nonLocalJumps |= 8;
|
|
write("return { value: ");
|
|
if (node.expression) {
|
|
emit(node.expression);
|
|
}
|
|
else {
|
|
write("void 0");
|
|
}
|
|
write(" };");
|
|
return;
|
|
}
|
|
emitToken(94, node.pos);
|
|
emitOptional(" ", node.expression);
|
|
write(";");
|
|
}
|
|
function emitWithStatement(node) {
|
|
write("with (");
|
|
emit(node.expression);
|
|
write(")");
|
|
emitEmbeddedStatement(node.statement);
|
|
}
|
|
function emitSwitchStatement(node) {
|
|
var endPos = emitToken(96, node.pos);
|
|
write(" ");
|
|
emitToken(17, endPos);
|
|
emit(node.expression);
|
|
endPos = emitToken(18, node.expression.end);
|
|
write(" ");
|
|
var saveAllowedNonLabeledJumps;
|
|
if (convertedLoopState) {
|
|
saveAllowedNonLabeledJumps = convertedLoopState.allowedNonLabeledJumps;
|
|
convertedLoopState.allowedNonLabeledJumps |= 2;
|
|
}
|
|
emitCaseBlock(node.caseBlock, endPos);
|
|
if (convertedLoopState) {
|
|
convertedLoopState.allowedNonLabeledJumps = saveAllowedNonLabeledJumps;
|
|
}
|
|
}
|
|
function emitCaseBlock(node, startPos) {
|
|
emitToken(15, startPos);
|
|
increaseIndent();
|
|
emitLines(node.clauses);
|
|
decreaseIndent();
|
|
writeLine();
|
|
emitToken(16, node.clauses.end);
|
|
}
|
|
function nodeStartPositionsAreOnSameLine(node1, node2) {
|
|
return ts.getLineOfLocalPositionFromLineMap(currentLineMap, ts.skipTrivia(currentText, node1.pos)) ===
|
|
ts.getLineOfLocalPositionFromLineMap(currentLineMap, ts.skipTrivia(currentText, node2.pos));
|
|
}
|
|
function nodeEndPositionsAreOnSameLine(node1, node2) {
|
|
return ts.getLineOfLocalPositionFromLineMap(currentLineMap, node1.end) ===
|
|
ts.getLineOfLocalPositionFromLineMap(currentLineMap, node2.end);
|
|
}
|
|
function nodeEndIsOnSameLineAsNodeStart(node1, node2) {
|
|
return ts.getLineOfLocalPositionFromLineMap(currentLineMap, node1.end) ===
|
|
ts.getLineOfLocalPositionFromLineMap(currentLineMap, ts.skipTrivia(currentText, node2.pos));
|
|
}
|
|
function emitCaseOrDefaultClause(node) {
|
|
if (node.kind === 249) {
|
|
write("case ");
|
|
emit(node.expression);
|
|
write(":");
|
|
}
|
|
else {
|
|
write("default:");
|
|
}
|
|
if (node.statements.length === 1 && nodeStartPositionsAreOnSameLine(node, node.statements[0])) {
|
|
write(" ");
|
|
emit(node.statements[0]);
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
emitLines(node.statements);
|
|
decreaseIndent();
|
|
}
|
|
}
|
|
function emitThrowStatement(node) {
|
|
write("throw ");
|
|
emit(node.expression);
|
|
write(";");
|
|
}
|
|
function emitTryStatement(node) {
|
|
write("try ");
|
|
emit(node.tryBlock);
|
|
emit(node.catchClause);
|
|
if (node.finallyBlock) {
|
|
writeLine();
|
|
write("finally ");
|
|
emit(node.finallyBlock);
|
|
}
|
|
}
|
|
function emitCatchClause(node) {
|
|
writeLine();
|
|
var endPos = emitToken(72, node.pos);
|
|
write(" ");
|
|
emitToken(17, endPos);
|
|
emit(node.variableDeclaration);
|
|
emitToken(18, node.variableDeclaration ? node.variableDeclaration.end : endPos);
|
|
write(" ");
|
|
emitBlock(node.block);
|
|
}
|
|
function emitDebuggerStatement(node) {
|
|
emitToken(76, node.pos);
|
|
write(";");
|
|
}
|
|
function emitLabelAndColon(node) {
|
|
emit(node.label);
|
|
write(": ");
|
|
}
|
|
function emitLabeledStatement(node) {
|
|
if (!ts.isIterationStatement(node.statement, false) || !shouldConvertLoopBody(node.statement)) {
|
|
emitLabelAndColon(node);
|
|
}
|
|
if (convertedLoopState) {
|
|
if (!convertedLoopState.labels) {
|
|
convertedLoopState.labels = {};
|
|
}
|
|
convertedLoopState.labels[node.label.text] = node.label.text;
|
|
}
|
|
emit(node.statement);
|
|
if (convertedLoopState) {
|
|
convertedLoopState.labels[node.label.text] = undefined;
|
|
}
|
|
}
|
|
function getContainingModule(node) {
|
|
do {
|
|
node = node.parent;
|
|
} while (node && node.kind !== 225);
|
|
return node;
|
|
}
|
|
function emitContainingModuleName(node) {
|
|
var container = getContainingModule(node);
|
|
write(container ? getGeneratedNameForNode(container) : "exports");
|
|
}
|
|
function emitModuleMemberName(node) {
|
|
emitStart(node.name);
|
|
if (ts.getCombinedNodeFlags(node) & 1) {
|
|
var container = getContainingModule(node);
|
|
if (container) {
|
|
write(getGeneratedNameForNode(container));
|
|
write(".");
|
|
}
|
|
else if (modulekind !== ts.ModuleKind.ES6 && modulekind !== ts.ModuleKind.System) {
|
|
write("exports.");
|
|
}
|
|
}
|
|
emitNodeWithCommentsAndWithoutSourcemap(node.name);
|
|
emitEnd(node.name);
|
|
}
|
|
function createVoidZero() {
|
|
var zero = ts.createSynthesizedNode(8);
|
|
zero.text = "0";
|
|
var result = ts.createSynthesizedNode(183);
|
|
result.expression = zero;
|
|
return result;
|
|
}
|
|
function emitEs6ExportDefaultCompat(node) {
|
|
if (node.parent.kind === 256) {
|
|
ts.Debug.assert(!!(node.flags & 512) || node.kind === 235);
|
|
if (modulekind === ts.ModuleKind.CommonJS || modulekind === ts.ModuleKind.AMD || modulekind === ts.ModuleKind.UMD) {
|
|
if (!isEs6Module) {
|
|
if (languageVersion !== 0) {
|
|
write('Object.defineProperty(exports, "__esModule", { value: true });');
|
|
writeLine();
|
|
}
|
|
else {
|
|
write("exports.__esModule = true;");
|
|
writeLine();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitExportMemberAssignment(node) {
|
|
if (node.flags & 1) {
|
|
writeLine();
|
|
emitStart(node);
|
|
if (modulekind === ts.ModuleKind.System && node.parent === currentSourceFile) {
|
|
write(exportFunctionForFile + "(\"");
|
|
if (node.flags & 512) {
|
|
write("default");
|
|
}
|
|
else {
|
|
emitNodeWithCommentsAndWithoutSourcemap(node.name);
|
|
}
|
|
write("\", ");
|
|
emitDeclarationName(node);
|
|
write(")");
|
|
}
|
|
else {
|
|
if (node.flags & 512) {
|
|
emitEs6ExportDefaultCompat(node);
|
|
if (languageVersion === 0) {
|
|
write('exports["default"]');
|
|
}
|
|
else {
|
|
write("exports.default");
|
|
}
|
|
}
|
|
else {
|
|
emitModuleMemberName(node);
|
|
}
|
|
write(" = ");
|
|
emitDeclarationName(node);
|
|
}
|
|
emitEnd(node);
|
|
write(";");
|
|
}
|
|
}
|
|
function emitExportMemberAssignments(name) {
|
|
if (modulekind === ts.ModuleKind.System) {
|
|
return;
|
|
}
|
|
if (!exportEquals && exportSpecifiers && ts.hasProperty(exportSpecifiers, name.text)) {
|
|
for (var _a = 0, _b = exportSpecifiers[name.text]; _a < _b.length; _a++) {
|
|
var specifier = _b[_a];
|
|
writeLine();
|
|
emitStart(specifier.name);
|
|
emitContainingModuleName(specifier);
|
|
write(".");
|
|
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
|
|
emitEnd(specifier.name);
|
|
write(" = ");
|
|
emitExpressionIdentifier(name);
|
|
write(";");
|
|
}
|
|
}
|
|
}
|
|
function emitExportSpecifierInSystemModule(specifier) {
|
|
ts.Debug.assert(modulekind === ts.ModuleKind.System);
|
|
if (!resolver.getReferencedValueDeclaration(specifier.propertyName || specifier.name) && !resolver.isValueAliasDeclaration(specifier)) {
|
|
return;
|
|
}
|
|
writeLine();
|
|
emitStart(specifier.name);
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
|
|
write("\", ");
|
|
emitExpressionIdentifier(specifier.propertyName || specifier.name);
|
|
write(")");
|
|
emitEnd(specifier.name);
|
|
write(";");
|
|
}
|
|
function emitAssignment(name, value, shouldEmitCommaBeforeAssignment, nodeForSourceMap) {
|
|
if (shouldEmitCommaBeforeAssignment) {
|
|
write(", ");
|
|
}
|
|
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(name);
|
|
if (exportChanged) {
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithCommentsAndWithoutSourcemap(name);
|
|
write("\", ");
|
|
}
|
|
var isVariableDeclarationOrBindingElement = name.parent && (name.parent.kind === 218 || name.parent.kind === 169);
|
|
emitStart(isFirstVariableDeclaration(nodeForSourceMap) ? nodeForSourceMap.parent : nodeForSourceMap);
|
|
withTemporaryNoSourceMap(function () {
|
|
if (isVariableDeclarationOrBindingElement) {
|
|
emitModuleMemberName(name.parent);
|
|
}
|
|
else {
|
|
emit(name);
|
|
}
|
|
write(" = ");
|
|
emit(value);
|
|
});
|
|
emitEnd(nodeForSourceMap, true);
|
|
if (exportChanged) {
|
|
write(")");
|
|
}
|
|
}
|
|
function emitTempVariableAssignment(expression, canDefineTempVariablesInPlace, shouldEmitCommaBeforeAssignment, sourceMapNode) {
|
|
var identifier = createTempVariable(0);
|
|
if (!canDefineTempVariablesInPlace) {
|
|
recordTempDeclaration(identifier);
|
|
}
|
|
emitAssignment(identifier, expression, shouldEmitCommaBeforeAssignment, sourceMapNode || expression.parent);
|
|
return identifier;
|
|
}
|
|
function isFirstVariableDeclaration(root) {
|
|
return root.kind === 218 &&
|
|
root.parent.kind === 219 &&
|
|
root.parent.declarations[0] === root;
|
|
}
|
|
function emitDestructuring(root, isAssignmentExpressionStatement, value) {
|
|
var emitCount = 0;
|
|
var canDefineTempVariablesInPlace = false;
|
|
if (root.kind === 218) {
|
|
var isExported = ts.getCombinedNodeFlags(root) & 1;
|
|
var isSourceLevelForSystemModuleKind = shouldHoistDeclarationInSystemJsModule(root);
|
|
canDefineTempVariablesInPlace = !isExported && !isSourceLevelForSystemModuleKind;
|
|
}
|
|
else if (root.kind === 142) {
|
|
canDefineTempVariablesInPlace = true;
|
|
}
|
|
if (root.kind === 187) {
|
|
emitAssignmentExpression(root);
|
|
}
|
|
else {
|
|
ts.Debug.assert(!isAssignmentExpressionStatement);
|
|
if (isFirstVariableDeclaration(root)) {
|
|
sourceMap.changeEmitSourcePos();
|
|
}
|
|
emitBindingElement(root, value);
|
|
}
|
|
function ensureIdentifier(expr, reuseIdentifierExpressions, sourceMapNode) {
|
|
if (expr.kind === 69 && reuseIdentifierExpressions) {
|
|
return expr;
|
|
}
|
|
var identifier = emitTempVariableAssignment(expr, canDefineTempVariablesInPlace, emitCount > 0, sourceMapNode);
|
|
emitCount++;
|
|
return identifier;
|
|
}
|
|
function createDefaultValueCheck(value, defaultValue, sourceMapNode) {
|
|
value = ensureIdentifier(value, true, sourceMapNode);
|
|
var equals = ts.createSynthesizedNode(187);
|
|
equals.left = value;
|
|
equals.operatorToken = ts.createSynthesizedNode(32);
|
|
equals.right = createVoidZero();
|
|
return createConditionalExpression(equals, defaultValue, value);
|
|
}
|
|
function createConditionalExpression(condition, whenTrue, whenFalse) {
|
|
var cond = ts.createSynthesizedNode(188);
|
|
cond.condition = condition;
|
|
cond.questionToken = ts.createSynthesizedNode(53);
|
|
cond.whenTrue = whenTrue;
|
|
cond.colonToken = ts.createSynthesizedNode(54);
|
|
cond.whenFalse = whenFalse;
|
|
return cond;
|
|
}
|
|
function createNumericLiteral(value) {
|
|
var node = ts.createSynthesizedNode(8);
|
|
node.text = "" + value;
|
|
return node;
|
|
}
|
|
function createPropertyAccessForDestructuringProperty(object, propName) {
|
|
var index;
|
|
var nameIsComputed = propName.kind === 140;
|
|
if (nameIsComputed) {
|
|
index = ensureIdentifier(propName.expression, false, propName);
|
|
}
|
|
else {
|
|
index = ts.createSynthesizedNode(propName.kind);
|
|
index.text = ts.unescapeIdentifier(propName.text);
|
|
}
|
|
return !nameIsComputed && index.kind === 69
|
|
? createPropertyAccessExpression(object, index)
|
|
: createElementAccessExpression(object, index);
|
|
}
|
|
function createSliceCall(value, sliceIndex) {
|
|
var call = ts.createSynthesizedNode(174);
|
|
var sliceIdentifier = ts.createSynthesizedNode(69);
|
|
sliceIdentifier.text = "slice";
|
|
call.expression = createPropertyAccessExpression(value, sliceIdentifier);
|
|
call.arguments = ts.createSynthesizedNodeArray();
|
|
call.arguments[0] = createNumericLiteral(sliceIndex);
|
|
return call;
|
|
}
|
|
function emitObjectLiteralAssignment(target, value, sourceMapNode) {
|
|
var properties = target.properties;
|
|
if (properties.length !== 1) {
|
|
value = ensureIdentifier(value, true, sourceMapNode);
|
|
}
|
|
for (var _a = 0, properties_5 = properties; _a < properties_5.length; _a++) {
|
|
var p = properties_5[_a];
|
|
if (p.kind === 253 || p.kind === 254) {
|
|
var propName = p.name;
|
|
var target_1 = p.kind === 254 ? p : p.initializer || propName;
|
|
emitDestructuringAssignment(target_1, createPropertyAccessForDestructuringProperty(value, propName), p);
|
|
}
|
|
}
|
|
}
|
|
function emitArrayLiteralAssignment(target, value, sourceMapNode) {
|
|
var elements = target.elements;
|
|
if (elements.length !== 1) {
|
|
value = ensureIdentifier(value, true, sourceMapNode);
|
|
}
|
|
for (var i = 0; i < elements.length; i++) {
|
|
var e = elements[i];
|
|
if (e.kind !== 193) {
|
|
if (e.kind !== 191) {
|
|
emitDestructuringAssignment(e, createElementAccessExpression(value, createNumericLiteral(i)), e);
|
|
}
|
|
else if (i === elements.length - 1) {
|
|
emitDestructuringAssignment(e.expression, createSliceCall(value, i), e);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitDestructuringAssignment(target, value, sourceMapNode) {
|
|
if (target.kind === 254) {
|
|
if (target.objectAssignmentInitializer) {
|
|
value = createDefaultValueCheck(value, target.objectAssignmentInitializer, sourceMapNode);
|
|
}
|
|
target = target.name;
|
|
}
|
|
else if (target.kind === 187 && target.operatorToken.kind === 56) {
|
|
value = createDefaultValueCheck(value, target.right, sourceMapNode);
|
|
target = target.left;
|
|
}
|
|
if (target.kind === 171) {
|
|
emitObjectLiteralAssignment(target, value, sourceMapNode);
|
|
}
|
|
else if (target.kind === 170) {
|
|
emitArrayLiteralAssignment(target, value, sourceMapNode);
|
|
}
|
|
else {
|
|
emitAssignment(target, value, emitCount > 0, sourceMapNode);
|
|
emitCount++;
|
|
}
|
|
}
|
|
function emitAssignmentExpression(root) {
|
|
var target = root.left;
|
|
var value = root.right;
|
|
if (ts.isEmptyObjectLiteralOrArrayLiteral(target)) {
|
|
emit(value);
|
|
}
|
|
else if (isAssignmentExpressionStatement) {
|
|
emitDestructuringAssignment(target, value, ts.nodeIsSynthesized(root) ? target : root);
|
|
}
|
|
else {
|
|
if (root.parent.kind !== 178) {
|
|
write("(");
|
|
}
|
|
value = ensureIdentifier(value, true, root);
|
|
emitDestructuringAssignment(target, value, root);
|
|
write(", ");
|
|
emit(value);
|
|
if (root.parent.kind !== 178) {
|
|
write(")");
|
|
}
|
|
}
|
|
}
|
|
function emitBindingElement(target, value) {
|
|
if (target.initializer) {
|
|
value = value ? createDefaultValueCheck(value, target.initializer, target) : target.initializer;
|
|
}
|
|
else if (!value) {
|
|
value = createVoidZero();
|
|
}
|
|
if (ts.isBindingPattern(target.name)) {
|
|
var pattern = target.name;
|
|
var elements = pattern.elements;
|
|
var numElements = elements.length;
|
|
if (numElements !== 1) {
|
|
value = ensureIdentifier(value, numElements !== 0, target);
|
|
}
|
|
for (var i = 0; i < numElements; i++) {
|
|
var element = elements[i];
|
|
if (pattern.kind === 167) {
|
|
var propName = element.propertyName || element.name;
|
|
emitBindingElement(element, createPropertyAccessForDestructuringProperty(value, propName));
|
|
}
|
|
else if (element.kind !== 193) {
|
|
if (!element.dotDotDotToken) {
|
|
emitBindingElement(element, createElementAccessExpression(value, createNumericLiteral(i)));
|
|
}
|
|
else if (i === numElements - 1) {
|
|
emitBindingElement(element, createSliceCall(value, i));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
emitAssignment(target.name, value, emitCount > 0, target);
|
|
emitCount++;
|
|
}
|
|
}
|
|
}
|
|
function emitVariableDeclaration(node) {
|
|
if (ts.isBindingPattern(node.name)) {
|
|
var isExported = ts.getCombinedNodeFlags(node) & 1;
|
|
if (languageVersion >= 2 && (!isExported || modulekind === ts.ModuleKind.ES6)) {
|
|
var isTopLevelDeclarationInSystemModule = modulekind === ts.ModuleKind.System &&
|
|
shouldHoistVariable(node, true);
|
|
if (isTopLevelDeclarationInSystemModule) {
|
|
write("(");
|
|
}
|
|
emit(node.name);
|
|
emitOptional(" = ", node.initializer);
|
|
if (isTopLevelDeclarationInSystemModule) {
|
|
write(")");
|
|
}
|
|
}
|
|
else {
|
|
emitDestructuring(node, false);
|
|
}
|
|
}
|
|
else {
|
|
var initializer = node.initializer;
|
|
if (!initializer &&
|
|
languageVersion < 2 &&
|
|
node.name.kind === 69) {
|
|
var container = ts.getEnclosingBlockScopeContainer(node);
|
|
var flags = resolver.getNodeCheckFlags(node);
|
|
var isCapturedInFunction = flags & 131072;
|
|
var isDeclaredInLoop = flags & 262144;
|
|
var emittedAsTopLevel = ts.isBlockScopedContainerTopLevel(container) ||
|
|
(isCapturedInFunction && isDeclaredInLoop && container.kind === 199 && ts.isIterationStatement(container.parent, false));
|
|
var emittedAsNestedLetDeclaration = ts.getCombinedNodeFlags(node) & 1024 &&
|
|
!emittedAsTopLevel;
|
|
var emitExplicitInitializer = emittedAsNestedLetDeclaration &&
|
|
container.kind !== 207 &&
|
|
container.kind !== 208 &&
|
|
(!resolver.isDeclarationWithCollidingName(node) ||
|
|
(isDeclaredInLoop && !isCapturedInFunction && !ts.isIterationStatement(container, false)));
|
|
if (emitExplicitInitializer) {
|
|
initializer = createVoidZero();
|
|
}
|
|
}
|
|
var exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.name);
|
|
if (exportChanged) {
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithCommentsAndWithoutSourcemap(node.name);
|
|
write("\", ");
|
|
}
|
|
emitModuleMemberName(node);
|
|
emitOptional(" = ", initializer);
|
|
if (exportChanged) {
|
|
write(")");
|
|
}
|
|
}
|
|
}
|
|
function emitExportVariableAssignments(node) {
|
|
if (node.kind === 193) {
|
|
return;
|
|
}
|
|
var name = node.name;
|
|
if (name.kind === 69) {
|
|
emitExportMemberAssignments(name);
|
|
}
|
|
else if (ts.isBindingPattern(name)) {
|
|
ts.forEach(name.elements, emitExportVariableAssignments);
|
|
}
|
|
}
|
|
function isES6ExportedDeclaration(node) {
|
|
return !!(node.flags & 1) &&
|
|
modulekind === ts.ModuleKind.ES6 &&
|
|
node.parent.kind === 256;
|
|
}
|
|
function emitVariableStatement(node) {
|
|
var startIsEmitted = false;
|
|
if (node.flags & 1) {
|
|
if (isES6ExportedDeclaration(node)) {
|
|
write("export ");
|
|
startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
|
|
}
|
|
}
|
|
else {
|
|
startIsEmitted = tryEmitStartOfVariableDeclarationList(node.declarationList);
|
|
}
|
|
if (startIsEmitted) {
|
|
emitCommaList(node.declarationList.declarations);
|
|
write(";");
|
|
}
|
|
else {
|
|
var atLeastOneItem = emitVariableDeclarationListSkippingUninitializedEntries(node.declarationList);
|
|
if (atLeastOneItem) {
|
|
write(";");
|
|
}
|
|
}
|
|
if (modulekind !== ts.ModuleKind.ES6 && node.parent === currentSourceFile) {
|
|
ts.forEach(node.declarationList.declarations, emitExportVariableAssignments);
|
|
}
|
|
}
|
|
function shouldEmitLeadingAndTrailingCommentsForVariableStatement(node) {
|
|
if (!(node.flags & 1)) {
|
|
return true;
|
|
}
|
|
if (isES6ExportedDeclaration(node)) {
|
|
return true;
|
|
}
|
|
for (var _a = 0, _b = node.declarationList.declarations; _a < _b.length; _a++) {
|
|
var declaration = _b[_a];
|
|
if (declaration.initializer) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function emitParameter(node) {
|
|
if (languageVersion < 2) {
|
|
if (ts.isBindingPattern(node.name)) {
|
|
var name_29 = createTempVariable(0);
|
|
if (!tempParameters) {
|
|
tempParameters = [];
|
|
}
|
|
tempParameters.push(name_29);
|
|
emit(name_29);
|
|
}
|
|
else {
|
|
emit(node.name);
|
|
}
|
|
}
|
|
else {
|
|
if (node.dotDotDotToken) {
|
|
write("...");
|
|
}
|
|
emit(node.name);
|
|
emitOptional(" = ", node.initializer);
|
|
}
|
|
}
|
|
function emitDefaultValueAssignments(node) {
|
|
if (languageVersion < 2) {
|
|
var tempIndex_1 = 0;
|
|
ts.forEach(node.parameters, function (parameter) {
|
|
if (parameter.dotDotDotToken) {
|
|
return;
|
|
}
|
|
var paramName = parameter.name, initializer = parameter.initializer;
|
|
if (ts.isBindingPattern(paramName)) {
|
|
var hasBindingElements = paramName.elements.length > 0;
|
|
if (hasBindingElements || initializer) {
|
|
writeLine();
|
|
write("var ");
|
|
if (hasBindingElements) {
|
|
emitDestructuring(parameter, false, tempParameters[tempIndex_1]);
|
|
}
|
|
else {
|
|
emit(tempParameters[tempIndex_1]);
|
|
write(" = ");
|
|
emit(initializer);
|
|
}
|
|
write(";");
|
|
}
|
|
tempIndex_1++;
|
|
}
|
|
else if (initializer) {
|
|
writeLine();
|
|
emitStart(parameter);
|
|
write("if (");
|
|
emitNodeWithoutSourceMap(paramName);
|
|
write(" === void 0)");
|
|
emitEnd(parameter);
|
|
write(" { ");
|
|
emitStart(parameter);
|
|
emitNodeWithCommentsAndWithoutSourcemap(paramName);
|
|
write(" = ");
|
|
emitNodeWithCommentsAndWithoutSourcemap(initializer);
|
|
emitEnd(parameter);
|
|
write("; }");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function emitRestParameter(node) {
|
|
if (languageVersion < 2 && ts.hasDeclaredRestParameter(node)) {
|
|
var restIndex = node.parameters.length - 1;
|
|
var restParam = node.parameters[restIndex];
|
|
if (ts.isBindingPattern(restParam.name)) {
|
|
return;
|
|
}
|
|
var tempName = createTempVariable(268435456).text;
|
|
writeLine();
|
|
emitLeadingComments(restParam);
|
|
emitStart(restParam);
|
|
write("var ");
|
|
emitNodeWithCommentsAndWithoutSourcemap(restParam.name);
|
|
write(" = [];");
|
|
emitEnd(restParam);
|
|
emitTrailingComments(restParam);
|
|
writeLine();
|
|
write("for (");
|
|
emitStart(restParam);
|
|
write("var " + tempName + " = " + restIndex + ";");
|
|
emitEnd(restParam);
|
|
write(" ");
|
|
emitStart(restParam);
|
|
write(tempName + " < arguments.length;");
|
|
emitEnd(restParam);
|
|
write(" ");
|
|
emitStart(restParam);
|
|
write(tempName + "++");
|
|
emitEnd(restParam);
|
|
write(") {");
|
|
increaseIndent();
|
|
writeLine();
|
|
emitStart(restParam);
|
|
emitNodeWithCommentsAndWithoutSourcemap(restParam.name);
|
|
write("[" + tempName + " - " + restIndex + "] = arguments[" + tempName + "];");
|
|
emitEnd(restParam);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
}
|
|
}
|
|
function emitAccessor(node) {
|
|
write(node.kind === 149 ? "get " : "set ");
|
|
emit(node.name);
|
|
emitSignatureAndBody(node);
|
|
}
|
|
function shouldEmitAsArrowFunction(node) {
|
|
return node.kind === 180 && languageVersion >= 2;
|
|
}
|
|
function emitDeclarationName(node) {
|
|
if (node.name) {
|
|
emitNodeWithCommentsAndWithoutSourcemap(node.name);
|
|
}
|
|
else {
|
|
write(getGeneratedNameForNode(node));
|
|
}
|
|
}
|
|
function shouldEmitFunctionName(node) {
|
|
if (node.kind === 179) {
|
|
return !!node.name;
|
|
}
|
|
if (node.kind === 220) {
|
|
return !!node.name || modulekind !== ts.ModuleKind.ES6;
|
|
}
|
|
}
|
|
function emitFunctionDeclaration(node) {
|
|
if (ts.nodeIsMissing(node.body)) {
|
|
return emitCommentsOnNotEmittedNode(node);
|
|
}
|
|
var kind = node.kind, parent = node.parent;
|
|
if (kind !== 147 &&
|
|
kind !== 146 &&
|
|
parent &&
|
|
parent.kind !== 253 &&
|
|
parent.kind !== 174 &&
|
|
parent.kind !== 170) {
|
|
emitLeadingComments(node);
|
|
}
|
|
emitStart(node);
|
|
if (!shouldEmitAsArrowFunction(node)) {
|
|
if (isES6ExportedDeclaration(node)) {
|
|
write("export ");
|
|
if (node.flags & 512) {
|
|
write("default ");
|
|
}
|
|
}
|
|
write("function");
|
|
if (languageVersion >= 2 && node.asteriskToken) {
|
|
write("*");
|
|
}
|
|
write(" ");
|
|
}
|
|
if (shouldEmitFunctionName(node)) {
|
|
emitDeclarationName(node);
|
|
}
|
|
emitSignatureAndBody(node);
|
|
if (modulekind !== ts.ModuleKind.ES6 && kind === 220 && parent === currentSourceFile && node.name) {
|
|
emitExportMemberAssignments(node.name);
|
|
}
|
|
emitEnd(node);
|
|
if (kind !== 147 &&
|
|
kind !== 146 &&
|
|
kind !== 180) {
|
|
emitTrailingComments(node);
|
|
}
|
|
}
|
|
function emitCaptureThisForNodeIfNecessary(node) {
|
|
if (resolver.getNodeCheckFlags(node) & 4) {
|
|
writeLine();
|
|
emitStart(node);
|
|
write("var _this = this;");
|
|
emitEnd(node);
|
|
}
|
|
}
|
|
function emitSignatureParameters(node) {
|
|
increaseIndent();
|
|
write("(");
|
|
if (node) {
|
|
var parameters = node.parameters;
|
|
var skipCount = node.parameters.length && node.parameters[0].name.text === "this" ? 1 : 0;
|
|
var omitCount = languageVersion < 2 && ts.hasDeclaredRestParameter(node) ? 1 : 0;
|
|
emitList(parameters, skipCount, parameters.length - omitCount - skipCount, false, false);
|
|
}
|
|
write(")");
|
|
decreaseIndent();
|
|
}
|
|
function emitSignatureParametersForArrow(node) {
|
|
if (node.parameters.length === 1 && node.pos === node.parameters[0].pos) {
|
|
emit(node.parameters[0]);
|
|
return;
|
|
}
|
|
emitSignatureParameters(node);
|
|
}
|
|
function emitAsyncFunctionBodyForES6(node) {
|
|
var promiseConstructor = ts.getEntityNameFromTypeNode(node.type);
|
|
var isArrowFunction = node.kind === 180;
|
|
var hasLexicalArguments = (resolver.getNodeCheckFlags(node) & 8192) !== 0;
|
|
if (!isArrowFunction) {
|
|
write(" {");
|
|
increaseIndent();
|
|
writeLine();
|
|
if (resolver.getNodeCheckFlags(node) & 4096) {
|
|
writeLines("\nconst _super = (function (geti, seti) {\n const cache = Object.create(null);\n return name => cache[name] || (cache[name] = { get value() { return geti(name); }, set value(v) { seti(name, v); } });\n})(name => super[name], (name, value) => super[name] = value);");
|
|
writeLine();
|
|
}
|
|
else if (resolver.getNodeCheckFlags(node) & 2048) {
|
|
write("const _super = name => super[name];");
|
|
writeLine();
|
|
}
|
|
write("return");
|
|
}
|
|
write(" __awaiter(this");
|
|
if (hasLexicalArguments) {
|
|
write(", arguments, ");
|
|
}
|
|
else {
|
|
write(", void 0, ");
|
|
}
|
|
if (languageVersion >= 2 || !promiseConstructor) {
|
|
write("void 0");
|
|
}
|
|
else {
|
|
emitEntityNameAsExpression(promiseConstructor, false);
|
|
}
|
|
write(", function* ()");
|
|
emitFunctionBody(node);
|
|
write(")");
|
|
if (!isArrowFunction) {
|
|
write(";");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
}
|
|
}
|
|
function emitFunctionBody(node) {
|
|
if (!node.body) {
|
|
write(" { }");
|
|
}
|
|
else {
|
|
if (node.body.kind === 199) {
|
|
emitBlockFunctionBody(node, node.body);
|
|
}
|
|
else {
|
|
emitExpressionFunctionBody(node, node.body);
|
|
}
|
|
}
|
|
}
|
|
function emitSignatureAndBody(node) {
|
|
var saveConvertedLoopState = convertedLoopState;
|
|
var saveTempFlags = tempFlags;
|
|
var saveTempVariables = tempVariables;
|
|
var saveTempParameters = tempParameters;
|
|
convertedLoopState = undefined;
|
|
tempFlags = 0;
|
|
tempVariables = undefined;
|
|
tempParameters = undefined;
|
|
if (shouldEmitAsArrowFunction(node)) {
|
|
emitSignatureParametersForArrow(node);
|
|
write(" =>");
|
|
}
|
|
else {
|
|
emitSignatureParameters(node);
|
|
}
|
|
var isAsync = ts.isAsyncFunctionLike(node);
|
|
if (isAsync) {
|
|
emitAsyncFunctionBodyForES6(node);
|
|
}
|
|
else {
|
|
emitFunctionBody(node);
|
|
}
|
|
if (!isES6ExportedDeclaration(node)) {
|
|
emitExportMemberAssignment(node);
|
|
}
|
|
ts.Debug.assert(convertedLoopState === undefined);
|
|
convertedLoopState = saveConvertedLoopState;
|
|
tempFlags = saveTempFlags;
|
|
tempVariables = saveTempVariables;
|
|
tempParameters = saveTempParameters;
|
|
}
|
|
function emitFunctionBodyPreamble(node) {
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitDefaultValueAssignments(node);
|
|
emitRestParameter(node);
|
|
}
|
|
function emitExpressionFunctionBody(node, body) {
|
|
if (languageVersion < 2 || node.flags & 256) {
|
|
emitDownLevelExpressionFunctionBody(node, body);
|
|
return;
|
|
}
|
|
write(" ");
|
|
var current = body;
|
|
while (current.kind === 177) {
|
|
current = current.expression;
|
|
}
|
|
emitParenthesizedIf(body, current.kind === 171);
|
|
}
|
|
function emitDownLevelExpressionFunctionBody(node, body) {
|
|
write(" {");
|
|
increaseIndent();
|
|
var outPos = writer.getTextPos();
|
|
emitDetachedCommentsAndUpdateCommentsInfo(node.body);
|
|
emitFunctionBodyPreamble(node);
|
|
var preambleEmitted = writer.getTextPos() !== outPos;
|
|
decreaseIndent();
|
|
if (!preambleEmitted && nodeStartPositionsAreOnSameLine(node, body)) {
|
|
write(" ");
|
|
emitStart(body);
|
|
write("return ");
|
|
emit(body);
|
|
emitEnd(body);
|
|
write(";");
|
|
emitTempDeclarations(false);
|
|
write(" ");
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
writeLine();
|
|
emitLeadingComments(node.body);
|
|
emitStart(body);
|
|
write("return ");
|
|
emit(body);
|
|
emitEnd(body);
|
|
write(";");
|
|
emitTrailingComments(node.body);
|
|
emitTempDeclarations(true);
|
|
decreaseIndent();
|
|
writeLine();
|
|
}
|
|
emitStart(node.body);
|
|
write("}");
|
|
emitEnd(node.body);
|
|
}
|
|
function emitBlockFunctionBody(node, body) {
|
|
write(" {");
|
|
var initialTextPos = writer.getTextPos();
|
|
increaseIndent();
|
|
emitDetachedCommentsAndUpdateCommentsInfo(body.statements);
|
|
var startIndex = emitDirectivePrologues(body.statements, true);
|
|
emitFunctionBodyPreamble(node);
|
|
decreaseIndent();
|
|
var preambleEmitted = writer.getTextPos() !== initialTextPos;
|
|
if (!preambleEmitted && nodeEndIsOnSameLineAsNodeStart(body, body)) {
|
|
for (var _a = 0, _b = body.statements; _a < _b.length; _a++) {
|
|
var statement = _b[_a];
|
|
write(" ");
|
|
emit(statement);
|
|
}
|
|
emitTempDeclarations(false);
|
|
write(" ");
|
|
emitLeadingCommentsOfPosition(body.statements.end);
|
|
}
|
|
else {
|
|
increaseIndent();
|
|
emitLinesStartingAt(body.statements, startIndex);
|
|
emitTempDeclarations(true);
|
|
writeLine();
|
|
emitLeadingCommentsOfPosition(body.statements.end);
|
|
decreaseIndent();
|
|
}
|
|
emitToken(16, body.statements.end);
|
|
}
|
|
function getSuperCallAtGivenIndex(ctor, index) {
|
|
if (!ctor.body) {
|
|
return undefined;
|
|
}
|
|
var statements = ctor.body.statements;
|
|
if (!statements || index >= statements.length) {
|
|
return undefined;
|
|
}
|
|
var statement = statements[index];
|
|
if (statement.kind === 202) {
|
|
return ts.isSuperCallExpression(statement.expression) ? statement : undefined;
|
|
}
|
|
}
|
|
function emitParameterPropertyAssignments(node) {
|
|
ts.forEach(node.parameters, function (param) {
|
|
if (param.flags & 92) {
|
|
writeLine();
|
|
emitStart(param);
|
|
emitStart(param.name);
|
|
write("this.");
|
|
emitNodeWithoutSourceMap(param.name);
|
|
emitEnd(param.name);
|
|
write(" = ");
|
|
emit(param.name);
|
|
write(";");
|
|
emitEnd(param);
|
|
}
|
|
});
|
|
}
|
|
function emitMemberAccessForPropertyName(memberName) {
|
|
if (memberName.kind === 9 || memberName.kind === 8) {
|
|
write("[");
|
|
emitNodeWithCommentsAndWithoutSourcemap(memberName);
|
|
write("]");
|
|
}
|
|
else if (memberName.kind === 140) {
|
|
emitComputedPropertyName(memberName);
|
|
}
|
|
else {
|
|
write(".");
|
|
emitNodeWithCommentsAndWithoutSourcemap(memberName);
|
|
}
|
|
}
|
|
function getInitializedProperties(node, isStatic) {
|
|
var properties = [];
|
|
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
|
|
var member = _b[_a];
|
|
if (member.kind === 145 && isStatic === ((member.flags & 32) !== 0) && member.initializer) {
|
|
properties.push(member);
|
|
}
|
|
}
|
|
return properties;
|
|
}
|
|
function emitPropertyDeclarations(node, properties) {
|
|
for (var _a = 0, properties_6 = properties; _a < properties_6.length; _a++) {
|
|
var property = properties_6[_a];
|
|
emitPropertyDeclaration(node, property);
|
|
}
|
|
}
|
|
function emitPropertyDeclaration(node, property, receiver, isExpression) {
|
|
writeLine();
|
|
emitLeadingComments(property);
|
|
emitStart(property);
|
|
emitStart(property.name);
|
|
if (receiver) {
|
|
write(receiver);
|
|
}
|
|
else {
|
|
if (property.flags & 32) {
|
|
emitDeclarationName(node);
|
|
}
|
|
else {
|
|
write("this");
|
|
}
|
|
}
|
|
emitMemberAccessForPropertyName(property.name);
|
|
emitEnd(property.name);
|
|
write(" = ");
|
|
emit(property.initializer);
|
|
if (!isExpression) {
|
|
write(";");
|
|
}
|
|
emitEnd(property);
|
|
emitTrailingComments(property);
|
|
}
|
|
function emitMemberFunctionsForES5AndLower(node) {
|
|
ts.forEach(node.members, function (member) {
|
|
if (member.kind === 198) {
|
|
writeLine();
|
|
write(";");
|
|
}
|
|
else if (member.kind === 147 || node.kind === 146) {
|
|
if (!member.body) {
|
|
return emitCommentsOnNotEmittedNode(member);
|
|
}
|
|
writeLine();
|
|
emitLeadingComments(member);
|
|
emitStart(member);
|
|
emitStart(member.name);
|
|
emitClassMemberPrefix(node, member);
|
|
emitMemberAccessForPropertyName(member.name);
|
|
emitEnd(member.name);
|
|
write(" = ");
|
|
emitFunctionDeclaration(member);
|
|
emitEnd(member);
|
|
write(";");
|
|
emitTrailingComments(member);
|
|
}
|
|
else if (member.kind === 149 || member.kind === 150) {
|
|
var accessors = ts.getAllAccessorDeclarations(node.members, member);
|
|
if (member === accessors.firstAccessor) {
|
|
writeLine();
|
|
emitStart(member);
|
|
write("Object.defineProperty(");
|
|
emitStart(member.name);
|
|
emitClassMemberPrefix(node, member);
|
|
write(", ");
|
|
emitExpressionForPropertyName(member.name);
|
|
emitEnd(member.name);
|
|
write(", {");
|
|
increaseIndent();
|
|
if (accessors.getAccessor) {
|
|
writeLine();
|
|
emitLeadingComments(accessors.getAccessor);
|
|
write("get: ");
|
|
emitStart(accessors.getAccessor);
|
|
write("function ");
|
|
emitSignatureAndBody(accessors.getAccessor);
|
|
emitEnd(accessors.getAccessor);
|
|
emitTrailingComments(accessors.getAccessor);
|
|
write(",");
|
|
}
|
|
if (accessors.setAccessor) {
|
|
writeLine();
|
|
emitLeadingComments(accessors.setAccessor);
|
|
write("set: ");
|
|
emitStart(accessors.setAccessor);
|
|
write("function ");
|
|
emitSignatureAndBody(accessors.setAccessor);
|
|
emitEnd(accessors.setAccessor);
|
|
emitTrailingComments(accessors.setAccessor);
|
|
write(",");
|
|
}
|
|
writeLine();
|
|
write("enumerable: true,");
|
|
writeLine();
|
|
write("configurable: true");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("});");
|
|
emitEnd(member);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function emitMemberFunctionsForES6AndHigher(node) {
|
|
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
|
|
var member = _b[_a];
|
|
if ((member.kind === 147 || node.kind === 146) && !member.body) {
|
|
emitCommentsOnNotEmittedNode(member);
|
|
}
|
|
else if (member.kind === 147 ||
|
|
member.kind === 149 ||
|
|
member.kind === 150) {
|
|
writeLine();
|
|
emitLeadingComments(member);
|
|
emitStart(member);
|
|
if (member.flags & 32) {
|
|
write("static ");
|
|
}
|
|
if (member.kind === 149) {
|
|
write("get ");
|
|
}
|
|
else if (member.kind === 150) {
|
|
write("set ");
|
|
}
|
|
if (member.asteriskToken) {
|
|
write("*");
|
|
}
|
|
emit(member.name);
|
|
emitSignatureAndBody(member);
|
|
emitEnd(member);
|
|
emitTrailingComments(member);
|
|
}
|
|
else if (member.kind === 198) {
|
|
writeLine();
|
|
write(";");
|
|
}
|
|
}
|
|
}
|
|
function emitConstructor(node, baseTypeElement) {
|
|
var saveConvertedLoopState = convertedLoopState;
|
|
var saveTempFlags = tempFlags;
|
|
var saveTempVariables = tempVariables;
|
|
var saveTempParameters = tempParameters;
|
|
convertedLoopState = undefined;
|
|
tempFlags = 0;
|
|
tempVariables = undefined;
|
|
tempParameters = undefined;
|
|
emitConstructorWorker(node, baseTypeElement);
|
|
ts.Debug.assert(convertedLoopState === undefined);
|
|
convertedLoopState = saveConvertedLoopState;
|
|
tempFlags = saveTempFlags;
|
|
tempVariables = saveTempVariables;
|
|
tempParameters = saveTempParameters;
|
|
}
|
|
function emitConstructorWorker(node, baseTypeElement) {
|
|
var hasInstancePropertyWithInitializer = false;
|
|
ts.forEach(node.members, function (member) {
|
|
if (member.kind === 148 && !member.body) {
|
|
emitCommentsOnNotEmittedNode(member);
|
|
}
|
|
if (member.kind === 145 && member.initializer && (member.flags & 32) === 0) {
|
|
hasInstancePropertyWithInitializer = true;
|
|
}
|
|
});
|
|
var ctor = ts.getFirstConstructorWithBody(node);
|
|
if (languageVersion >= 2 && !ctor && !hasInstancePropertyWithInitializer) {
|
|
return;
|
|
}
|
|
if (ctor) {
|
|
emitLeadingComments(ctor);
|
|
}
|
|
emitStart(ctor || node);
|
|
if (languageVersion < 2) {
|
|
write("function ");
|
|
emitDeclarationName(node);
|
|
emitSignatureParameters(ctor);
|
|
}
|
|
else {
|
|
write("constructor");
|
|
if (ctor) {
|
|
emitSignatureParameters(ctor);
|
|
}
|
|
else {
|
|
if (baseTypeElement) {
|
|
write("(...args)");
|
|
}
|
|
else {
|
|
write("()");
|
|
}
|
|
}
|
|
}
|
|
var startIndex = 0;
|
|
write(" {");
|
|
increaseIndent();
|
|
if (ctor) {
|
|
startIndex = emitDirectivePrologues(ctor.body.statements, true);
|
|
emitDetachedCommentsAndUpdateCommentsInfo(ctor.body.statements);
|
|
}
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
var superCall;
|
|
if (ctor) {
|
|
emitDefaultValueAssignments(ctor);
|
|
emitRestParameter(ctor);
|
|
if (baseTypeElement) {
|
|
superCall = getSuperCallAtGivenIndex(ctor, startIndex);
|
|
if (superCall) {
|
|
writeLine();
|
|
emit(superCall);
|
|
}
|
|
}
|
|
emitParameterPropertyAssignments(ctor);
|
|
}
|
|
else {
|
|
if (baseTypeElement) {
|
|
writeLine();
|
|
emitStart(baseTypeElement);
|
|
if (languageVersion < 2) {
|
|
write("_super.apply(this, arguments);");
|
|
}
|
|
else {
|
|
write("super(...args);");
|
|
}
|
|
emitEnd(baseTypeElement);
|
|
}
|
|
}
|
|
emitPropertyDeclarations(node, getInitializedProperties(node, false));
|
|
if (ctor) {
|
|
var statements = ctor.body.statements;
|
|
if (superCall) {
|
|
statements = statements.slice(1);
|
|
}
|
|
emitLinesStartingAt(statements, startIndex);
|
|
}
|
|
emitTempDeclarations(true);
|
|
writeLine();
|
|
if (ctor) {
|
|
emitLeadingCommentsOfPosition(ctor.body.statements.end);
|
|
}
|
|
decreaseIndent();
|
|
emitToken(16, ctor ? ctor.body.statements.end : node.members.end);
|
|
emitEnd(ctor || node);
|
|
if (ctor) {
|
|
emitTrailingComments(ctor);
|
|
}
|
|
}
|
|
function emitClassExpression(node) {
|
|
return emitClassLikeDeclaration(node);
|
|
}
|
|
function emitClassDeclaration(node) {
|
|
return emitClassLikeDeclaration(node);
|
|
}
|
|
function emitClassLikeDeclaration(node) {
|
|
if (languageVersion < 2) {
|
|
emitClassLikeDeclarationBelowES6(node);
|
|
}
|
|
else {
|
|
emitClassLikeDeclarationForES6AndHigher(node);
|
|
}
|
|
if (modulekind !== ts.ModuleKind.ES6 && node.parent === currentSourceFile && node.name) {
|
|
emitExportMemberAssignments(node.name);
|
|
}
|
|
}
|
|
function emitClassLikeDeclarationForES6AndHigher(node) {
|
|
var decoratedClassAlias;
|
|
var isHoistedDeclarationInSystemModule = shouldHoistDeclarationInSystemJsModule(node);
|
|
var isDecorated = ts.nodeIsDecorated(node);
|
|
var rewriteAsClassExpression = isDecorated || isHoistedDeclarationInSystemModule;
|
|
if (node.kind === 221) {
|
|
if (rewriteAsClassExpression) {
|
|
if (isDecorated && resolver.getNodeCheckFlags(node) & 524288) {
|
|
decoratedClassAlias = ts.unescapeIdentifier(makeUniqueName(node.name ? node.name.text : "default"));
|
|
decoratedClassAliases[ts.getNodeId(node)] = decoratedClassAlias;
|
|
}
|
|
if (isES6ExportedDeclaration(node) && !(node.flags & 512) && decoratedClassAlias === undefined) {
|
|
write("export ");
|
|
}
|
|
if (decoratedClassAlias !== undefined) {
|
|
write("let " + decoratedClassAlias);
|
|
}
|
|
else {
|
|
if (!isHoistedDeclarationInSystemModule) {
|
|
write("let ");
|
|
}
|
|
emitDeclarationName(node);
|
|
}
|
|
write(" = ");
|
|
}
|
|
else if (isES6ExportedDeclaration(node)) {
|
|
write("export ");
|
|
if (node.flags & 512) {
|
|
write("default ");
|
|
}
|
|
}
|
|
}
|
|
var staticProperties = getInitializedProperties(node, true);
|
|
var isClassExpressionWithStaticProperties = staticProperties.length > 0 && node.kind === 192;
|
|
var generatedName;
|
|
if (isClassExpressionWithStaticProperties) {
|
|
generatedName = getGeneratedNameForNode(node.name);
|
|
var synthesizedNode = ts.createSynthesizedNode(69);
|
|
synthesizedNode.text = generatedName;
|
|
recordTempDeclaration(synthesizedNode);
|
|
write("(");
|
|
increaseIndent();
|
|
emit(synthesizedNode);
|
|
write(" = ");
|
|
}
|
|
write("class");
|
|
if (node.name || (node.flags & 512 && (staticProperties.length > 0 || modulekind !== ts.ModuleKind.ES6) && !rewriteAsClassExpression)) {
|
|
write(" ");
|
|
emitDeclarationName(node);
|
|
}
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
|
|
if (baseTypeNode) {
|
|
write(" extends ");
|
|
emit(baseTypeNode.expression);
|
|
}
|
|
write(" {");
|
|
increaseIndent();
|
|
writeLine();
|
|
emitConstructor(node, baseTypeNode);
|
|
emitMemberFunctionsForES6AndHigher(node);
|
|
decreaseIndent();
|
|
writeLine();
|
|
emitToken(16, node.members.end);
|
|
if (rewriteAsClassExpression) {
|
|
if (decoratedClassAlias !== undefined) {
|
|
write(";");
|
|
writeLine();
|
|
if (isES6ExportedDeclaration(node) && !(node.flags & 512)) {
|
|
write("export ");
|
|
}
|
|
write("let ");
|
|
emitDeclarationName(node);
|
|
write(" = " + decoratedClassAlias);
|
|
}
|
|
decoratedClassAliases[ts.getNodeId(node)] = undefined;
|
|
write(";");
|
|
}
|
|
if (isClassExpressionWithStaticProperties) {
|
|
for (var _a = 0, staticProperties_1 = staticProperties; _a < staticProperties_1.length; _a++) {
|
|
var property = staticProperties_1[_a];
|
|
write(",");
|
|
writeLine();
|
|
emitPropertyDeclaration(node, property, generatedName, true);
|
|
}
|
|
write(",");
|
|
writeLine();
|
|
write(generatedName);
|
|
decreaseIndent();
|
|
write(")");
|
|
}
|
|
else {
|
|
writeLine();
|
|
emitPropertyDeclarations(node, staticProperties);
|
|
emitDecoratorsOfClass(node, decoratedClassAlias);
|
|
}
|
|
if (!(node.flags & 1)) {
|
|
return;
|
|
}
|
|
if (modulekind !== ts.ModuleKind.ES6) {
|
|
emitExportMemberAssignment(node);
|
|
}
|
|
else {
|
|
if (node.flags & 512) {
|
|
if (isDecorated) {
|
|
writeLine();
|
|
write("export default ");
|
|
emitDeclarationName(node);
|
|
write(";");
|
|
}
|
|
}
|
|
else if (node.parent.kind !== 256) {
|
|
writeLine();
|
|
emitStart(node);
|
|
emitModuleMemberName(node);
|
|
write(" = ");
|
|
emitDeclarationName(node);
|
|
emitEnd(node);
|
|
write(";");
|
|
}
|
|
}
|
|
}
|
|
function emitClassLikeDeclarationBelowES6(node) {
|
|
var isES6ExportedClass = isES6ExportedDeclaration(node);
|
|
if (node.kind === 221) {
|
|
if (isES6ExportedClass && !(node.flags & 512)) {
|
|
write("export ");
|
|
}
|
|
if (!shouldHoistDeclarationInSystemJsModule(node)) {
|
|
write("var ");
|
|
}
|
|
emitDeclarationName(node);
|
|
write(" = ");
|
|
}
|
|
write("(function (");
|
|
var baseTypeNode = ts.getClassExtendsHeritageClauseElement(node);
|
|
if (baseTypeNode) {
|
|
write("_super");
|
|
}
|
|
write(") {");
|
|
var saveTempFlags = tempFlags;
|
|
var saveTempVariables = tempVariables;
|
|
var saveTempParameters = tempParameters;
|
|
var saveComputedPropertyNamesToGeneratedNames = computedPropertyNamesToGeneratedNames;
|
|
var saveConvertedLoopState = convertedLoopState;
|
|
convertedLoopState = undefined;
|
|
tempFlags = 0;
|
|
tempVariables = undefined;
|
|
tempParameters = undefined;
|
|
computedPropertyNamesToGeneratedNames = undefined;
|
|
increaseIndent();
|
|
if (baseTypeNode) {
|
|
writeLine();
|
|
emitStart(baseTypeNode);
|
|
write("__extends(");
|
|
emitDeclarationName(node);
|
|
write(", _super);");
|
|
emitEnd(baseTypeNode);
|
|
}
|
|
writeLine();
|
|
emitConstructor(node, baseTypeNode);
|
|
emitMemberFunctionsForES5AndLower(node);
|
|
emitPropertyDeclarations(node, getInitializedProperties(node, true));
|
|
writeLine();
|
|
emitDecoratorsOfClass(node, undefined);
|
|
writeLine();
|
|
emitToken(16, node.members.end, function () {
|
|
write("return ");
|
|
emitDeclarationName(node);
|
|
});
|
|
write(";");
|
|
emitTempDeclarations(true);
|
|
ts.Debug.assert(convertedLoopState === undefined);
|
|
convertedLoopState = saveConvertedLoopState;
|
|
tempFlags = saveTempFlags;
|
|
tempVariables = saveTempVariables;
|
|
tempParameters = saveTempParameters;
|
|
computedPropertyNamesToGeneratedNames = saveComputedPropertyNamesToGeneratedNames;
|
|
decreaseIndent();
|
|
writeLine();
|
|
emitToken(16, node.members.end);
|
|
emitStart(node);
|
|
write("(");
|
|
if (baseTypeNode) {
|
|
emit(baseTypeNode.expression);
|
|
}
|
|
write("))");
|
|
if (node.kind === 221) {
|
|
write(";");
|
|
}
|
|
emitEnd(node);
|
|
if (node.kind === 221 && !isES6ExportedClass) {
|
|
emitExportMemberAssignment(node);
|
|
}
|
|
else if (isES6ExportedClass && (node.flags & 512)) {
|
|
writeLine();
|
|
write("export default ");
|
|
emitDeclarationName(node);
|
|
write(";");
|
|
}
|
|
}
|
|
function emitClassMemberPrefix(node, member) {
|
|
emitDeclarationName(node);
|
|
if (!(member.flags & 32)) {
|
|
write(".prototype");
|
|
}
|
|
}
|
|
function emitDecoratorsOfClass(node, decoratedClassAlias) {
|
|
emitDecoratorsOfMembers(node, 0);
|
|
emitDecoratorsOfMembers(node, 32);
|
|
emitDecoratorsOfConstructor(node, decoratedClassAlias);
|
|
}
|
|
function emitDecoratorsOfConstructor(node, decoratedClassAlias) {
|
|
var decorators = node.decorators;
|
|
var constructor = ts.getFirstConstructorWithBody(node);
|
|
var firstParameterDecorator = constructor && ts.forEach(constructor.parameters, function (parameter) { return parameter.decorators; });
|
|
if (!decorators && !firstParameterDecorator) {
|
|
return;
|
|
}
|
|
writeLine();
|
|
emitStart(node.decorators || firstParameterDecorator);
|
|
emitDeclarationName(node);
|
|
if (decoratedClassAlias !== undefined) {
|
|
write(" = " + decoratedClassAlias);
|
|
}
|
|
write(" = __decorate([");
|
|
increaseIndent();
|
|
writeLine();
|
|
var decoratorCount = decorators ? decorators.length : 0;
|
|
var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) { return emit(decorator.expression); });
|
|
if (firstParameterDecorator) {
|
|
argumentsWritten += emitDecoratorsOfParameters(constructor, argumentsWritten > 0);
|
|
}
|
|
emitSerializedTypeMetadata(node, argumentsWritten >= 0);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("], ");
|
|
emitDeclarationName(node);
|
|
write(")");
|
|
emitEnd(node.decorators || firstParameterDecorator);
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
function emitDecoratorsOfMembers(node, staticFlag) {
|
|
for (var _a = 0, _b = node.members; _a < _b.length; _a++) {
|
|
var member = _b[_a];
|
|
if ((member.flags & 32) !== staticFlag) {
|
|
continue;
|
|
}
|
|
if (!ts.nodeCanBeDecorated(member)) {
|
|
continue;
|
|
}
|
|
var decorators = void 0;
|
|
var functionLikeMember = void 0;
|
|
if (ts.isAccessor(member)) {
|
|
var accessors = ts.getAllAccessorDeclarations(node.members, member);
|
|
if (member !== accessors.firstAccessor) {
|
|
continue;
|
|
}
|
|
decorators = accessors.firstAccessor.decorators;
|
|
if (!decorators && accessors.secondAccessor) {
|
|
decorators = accessors.secondAccessor.decorators;
|
|
}
|
|
functionLikeMember = accessors.setAccessor;
|
|
}
|
|
else {
|
|
decorators = member.decorators;
|
|
if (member.kind === 147) {
|
|
functionLikeMember = member;
|
|
}
|
|
}
|
|
var firstParameterDecorator = functionLikeMember && ts.forEach(functionLikeMember.parameters, function (parameter) { return parameter.decorators; });
|
|
if (!decorators && !firstParameterDecorator) {
|
|
continue;
|
|
}
|
|
writeLine();
|
|
emitStart(decorators || firstParameterDecorator);
|
|
write("__decorate([");
|
|
increaseIndent();
|
|
writeLine();
|
|
var decoratorCount = decorators ? decorators.length : 0;
|
|
var argumentsWritten = emitList(decorators, 0, decoratorCount, true, false, false, true, function (decorator) { return emit(decorator.expression); });
|
|
if (firstParameterDecorator) {
|
|
argumentsWritten += emitDecoratorsOfParameters(functionLikeMember, argumentsWritten > 0);
|
|
}
|
|
emitSerializedTypeMetadata(member, argumentsWritten > 0);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("], ");
|
|
emitClassMemberPrefix(node, member);
|
|
write(", ");
|
|
emitExpressionForPropertyName(member.name);
|
|
if (languageVersion > 0) {
|
|
if (member.kind !== 145) {
|
|
write(", null");
|
|
}
|
|
else {
|
|
write(", void 0");
|
|
}
|
|
}
|
|
write(")");
|
|
emitEnd(decorators || firstParameterDecorator);
|
|
write(";");
|
|
writeLine();
|
|
}
|
|
}
|
|
function emitDecoratorsOfParameters(node, leadingComma) {
|
|
var argumentsWritten = 0;
|
|
if (node) {
|
|
var parameterIndex_1 = 0;
|
|
for (var _a = 0, _b = node.parameters; _a < _b.length; _a++) {
|
|
var parameter = _b[_a];
|
|
if (ts.nodeIsDecorated(parameter)) {
|
|
var decorators = parameter.decorators;
|
|
argumentsWritten += emitList(decorators, 0, decorators.length, true, false, leadingComma, true, function (decorator) {
|
|
write("__param(" + parameterIndex_1 + ", ");
|
|
emit(decorator.expression);
|
|
write(")");
|
|
});
|
|
leadingComma = true;
|
|
}
|
|
parameterIndex_1++;
|
|
}
|
|
}
|
|
return argumentsWritten;
|
|
}
|
|
function shouldEmitTypeMetadata(node) {
|
|
switch (node.kind) {
|
|
case 147:
|
|
case 149:
|
|
case 150:
|
|
case 145:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function shouldEmitReturnTypeMetadata(node) {
|
|
switch (node.kind) {
|
|
case 147:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function shouldEmitParamTypesMetadata(node) {
|
|
switch (node.kind) {
|
|
case 221:
|
|
case 147:
|
|
case 150:
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function emitSerializedTypeOfNode(node) {
|
|
switch (node.kind) {
|
|
case 221:
|
|
write("Function");
|
|
return;
|
|
case 145:
|
|
emitSerializedTypeNode(node.type);
|
|
return;
|
|
case 142:
|
|
emitSerializedTypeNode(node.type);
|
|
return;
|
|
case 149:
|
|
emitSerializedTypeNode(node.type);
|
|
return;
|
|
case 150:
|
|
emitSerializedTypeNode(ts.getSetAccessorTypeAnnotationNode(node));
|
|
return;
|
|
}
|
|
if (ts.isFunctionLike(node)) {
|
|
write("Function");
|
|
return;
|
|
}
|
|
write("void 0");
|
|
}
|
|
function emitSerializedTypeNode(node) {
|
|
if (node) {
|
|
switch (node.kind) {
|
|
case 103:
|
|
write("void 0");
|
|
return;
|
|
case 164:
|
|
emitSerializedTypeNode(node.type);
|
|
return;
|
|
case 156:
|
|
case 157:
|
|
write("Function");
|
|
return;
|
|
case 160:
|
|
case 161:
|
|
write("Array");
|
|
return;
|
|
case 154:
|
|
case 120:
|
|
write("Boolean");
|
|
return;
|
|
case 132:
|
|
case 166:
|
|
write("String");
|
|
return;
|
|
case 130:
|
|
write("Number");
|
|
return;
|
|
case 133:
|
|
write("Symbol");
|
|
return;
|
|
case 155:
|
|
emitSerializedTypeReferenceNode(node);
|
|
return;
|
|
case 158:
|
|
case 159:
|
|
case 162:
|
|
case 163:
|
|
case 117:
|
|
case 165:
|
|
break;
|
|
default:
|
|
ts.Debug.fail("Cannot serialize unexpected type node.");
|
|
break;
|
|
}
|
|
}
|
|
write("Object");
|
|
}
|
|
function emitSerializedTypeReferenceNode(node) {
|
|
var location = node.parent;
|
|
while (ts.isDeclaration(location) || ts.isTypeNode(location)) {
|
|
location = location.parent;
|
|
}
|
|
var typeName = ts.cloneEntityName(node.typeName, location);
|
|
var result = resolver.getTypeReferenceSerializationKind(typeName);
|
|
switch (result) {
|
|
case ts.TypeReferenceSerializationKind.Unknown:
|
|
var temp = createAndRecordTempVariable(0);
|
|
write("(typeof (");
|
|
emitNodeWithoutSourceMap(temp);
|
|
write(" = ");
|
|
emitEntityNameAsExpression(typeName, true);
|
|
write(") === 'function' && ");
|
|
emitNodeWithoutSourceMap(temp);
|
|
write(") || Object");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.TypeWithConstructSignatureAndValue:
|
|
emitEntityNameAsExpression(typeName, false);
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.VoidType:
|
|
write("void 0");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.BooleanType:
|
|
write("Boolean");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.NumberLikeType:
|
|
write("Number");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.StringLikeType:
|
|
write("String");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.ArrayLikeType:
|
|
write("Array");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.ESSymbolType:
|
|
if (languageVersion < 2) {
|
|
write("typeof Symbol === 'function' ? Symbol : Object");
|
|
}
|
|
else {
|
|
write("Symbol");
|
|
}
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.TypeWithCallSignature:
|
|
write("Function");
|
|
break;
|
|
case ts.TypeReferenceSerializationKind.ObjectType:
|
|
write("Object");
|
|
break;
|
|
}
|
|
}
|
|
function emitSerializedParameterTypesOfNode(node) {
|
|
if (node) {
|
|
var valueDeclaration = void 0;
|
|
if (node.kind === 221) {
|
|
valueDeclaration = ts.getFirstConstructorWithBody(node);
|
|
}
|
|
else if (ts.isFunctionLike(node) && ts.nodeIsPresent(node.body)) {
|
|
valueDeclaration = node;
|
|
}
|
|
if (valueDeclaration) {
|
|
var parameters = valueDeclaration.parameters;
|
|
var parameterCount = parameters.length;
|
|
if (parameterCount > 0) {
|
|
for (var i = 0; i < parameterCount; i++) {
|
|
if (i > 0) {
|
|
write(", ");
|
|
}
|
|
if (parameters[i].dotDotDotToken) {
|
|
var parameterType = parameters[i].type;
|
|
if (parameterType && parameterType.kind === 160) {
|
|
parameterType = parameterType.elementType;
|
|
}
|
|
else if (parameterType && parameterType.kind === 155 && parameterType.typeArguments && parameterType.typeArguments.length === 1) {
|
|
parameterType = parameterType.typeArguments[0];
|
|
}
|
|
else {
|
|
parameterType = undefined;
|
|
}
|
|
emitSerializedTypeNode(parameterType);
|
|
}
|
|
else {
|
|
emitSerializedTypeOfNode(parameters[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function emitSerializedReturnTypeOfNode(node) {
|
|
if (node && ts.isFunctionLike(node)) {
|
|
if (node.type) {
|
|
emitSerializedTypeNode(node.type);
|
|
return;
|
|
}
|
|
else if (ts.isAsyncFunctionLike(node)) {
|
|
write("Promise");
|
|
return;
|
|
}
|
|
}
|
|
write("void 0");
|
|
}
|
|
function emitSerializedTypeMetadata(node, writeComma) {
|
|
var argumentsWritten = 0;
|
|
if (compilerOptions.emitDecoratorMetadata) {
|
|
if (shouldEmitTypeMetadata(node)) {
|
|
if (writeComma) {
|
|
write(", ");
|
|
}
|
|
writeLine();
|
|
write("__metadata('design:type', ");
|
|
emitSerializedTypeOfNode(node);
|
|
write(")");
|
|
argumentsWritten++;
|
|
}
|
|
if (shouldEmitParamTypesMetadata(node)) {
|
|
if (writeComma || argumentsWritten) {
|
|
write(", ");
|
|
}
|
|
writeLine();
|
|
write("__metadata('design:paramtypes', [");
|
|
emitSerializedParameterTypesOfNode(node);
|
|
write("])");
|
|
argumentsWritten++;
|
|
}
|
|
if (shouldEmitReturnTypeMetadata(node)) {
|
|
if (writeComma || argumentsWritten) {
|
|
write(", ");
|
|
}
|
|
writeLine();
|
|
write("__metadata('design:returntype', ");
|
|
emitSerializedReturnTypeOfNode(node);
|
|
write(")");
|
|
argumentsWritten++;
|
|
}
|
|
}
|
|
return argumentsWritten;
|
|
}
|
|
function emitInterfaceDeclaration(node) {
|
|
emitCommentsOnNotEmittedNode(node);
|
|
}
|
|
function shouldEmitEnumDeclaration(node) {
|
|
var isConstEnum = ts.isConst(node);
|
|
return !isConstEnum || compilerOptions.preserveConstEnums || compilerOptions.isolatedModules;
|
|
}
|
|
function emitEnumDeclaration(node) {
|
|
if (!shouldEmitEnumDeclaration(node)) {
|
|
return;
|
|
}
|
|
if (!shouldHoistDeclarationInSystemJsModule(node)) {
|
|
var isES6ExportedEnum = isES6ExportedDeclaration(node);
|
|
if (!(node.flags & 1) || (isES6ExportedEnum && isFirstDeclarationOfKind(node, node.symbol && node.symbol.declarations, 224))) {
|
|
emitStart(node);
|
|
if (isES6ExportedEnum) {
|
|
write("export ");
|
|
}
|
|
write("var ");
|
|
emit(node.name);
|
|
emitEnd(node);
|
|
write(";");
|
|
}
|
|
}
|
|
writeLine();
|
|
emitStart(node);
|
|
write("(function (");
|
|
emitStart(node.name);
|
|
write(getGeneratedNameForNode(node));
|
|
emitEnd(node.name);
|
|
write(") {");
|
|
increaseIndent();
|
|
emitLines(node.members);
|
|
decreaseIndent();
|
|
writeLine();
|
|
emitToken(16, node.members.end);
|
|
write(")(");
|
|
emitModuleMemberName(node);
|
|
write(" || (");
|
|
emitModuleMemberName(node);
|
|
write(" = {}));");
|
|
emitEnd(node);
|
|
if (!isES6ExportedDeclaration(node) && node.flags & 1 && !shouldHoistDeclarationInSystemJsModule(node)) {
|
|
writeLine();
|
|
emitStart(node);
|
|
write("var ");
|
|
emit(node.name);
|
|
write(" = ");
|
|
emitModuleMemberName(node);
|
|
emitEnd(node);
|
|
write(";");
|
|
}
|
|
if (modulekind !== ts.ModuleKind.ES6 && node.parent === currentSourceFile) {
|
|
if (modulekind === ts.ModuleKind.System && (node.flags & 1)) {
|
|
writeLine();
|
|
write(exportFunctionForFile + "(\"");
|
|
emitDeclarationName(node);
|
|
write("\", ");
|
|
emitDeclarationName(node);
|
|
write(");");
|
|
}
|
|
emitExportMemberAssignments(node.name);
|
|
}
|
|
}
|
|
function emitEnumMember(node) {
|
|
var enumParent = node.parent;
|
|
emitStart(node);
|
|
write(getGeneratedNameForNode(enumParent));
|
|
write("[");
|
|
write(getGeneratedNameForNode(enumParent));
|
|
write("[");
|
|
emitExpressionForPropertyName(node.name);
|
|
write("] = ");
|
|
writeEnumMemberDeclarationValue(node);
|
|
write("] = ");
|
|
emitExpressionForPropertyName(node.name);
|
|
emitEnd(node);
|
|
write(";");
|
|
}
|
|
function writeEnumMemberDeclarationValue(member) {
|
|
var value = resolver.getConstantValue(member);
|
|
if (value !== undefined) {
|
|
write(value.toString());
|
|
return;
|
|
}
|
|
else if (member.initializer) {
|
|
emit(member.initializer);
|
|
}
|
|
else {
|
|
write("undefined");
|
|
}
|
|
}
|
|
function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration) {
|
|
if (moduleDeclaration.body && moduleDeclaration.body.kind === 225) {
|
|
var recursiveInnerModule = getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration.body);
|
|
return recursiveInnerModule || moduleDeclaration.body;
|
|
}
|
|
}
|
|
function shouldEmitModuleDeclaration(node) {
|
|
return ts.isInstantiatedModule(node, compilerOptions.preserveConstEnums || compilerOptions.isolatedModules);
|
|
}
|
|
function isModuleMergedWithES6Class(node) {
|
|
return languageVersion === 2 && !!(resolver.getNodeCheckFlags(node) & 32768);
|
|
}
|
|
function isFirstDeclarationOfKind(node, declarations, kind) {
|
|
return !ts.forEach(declarations, function (declaration) { return declaration.kind === kind && declaration.pos < node.pos; });
|
|
}
|
|
function emitModuleDeclaration(node) {
|
|
var shouldEmit = shouldEmitModuleDeclaration(node);
|
|
if (!shouldEmit) {
|
|
return emitCommentsOnNotEmittedNode(node);
|
|
}
|
|
var hoistedInDeclarationScope = shouldHoistDeclarationInSystemJsModule(node);
|
|
var emitVarForModule = !hoistedInDeclarationScope && !isModuleMergedWithES6Class(node);
|
|
if (emitVarForModule) {
|
|
var isES6ExportedNamespace = isES6ExportedDeclaration(node);
|
|
if (!isES6ExportedNamespace || isFirstDeclarationOfKind(node, node.symbol && node.symbol.declarations, 225)) {
|
|
emitStart(node);
|
|
if (isES6ExportedNamespace) {
|
|
write("export ");
|
|
}
|
|
write("var ");
|
|
emit(node.name);
|
|
write(";");
|
|
emitEnd(node);
|
|
writeLine();
|
|
}
|
|
}
|
|
emitStart(node);
|
|
write("(function (");
|
|
emitStart(node.name);
|
|
write(getGeneratedNameForNode(node));
|
|
emitEnd(node.name);
|
|
write(") ");
|
|
ts.Debug.assert(node.body !== undefined);
|
|
if (node.body.kind === 226) {
|
|
var saveConvertedLoopState = convertedLoopState;
|
|
var saveTempFlags = tempFlags;
|
|
var saveTempVariables = tempVariables;
|
|
convertedLoopState = undefined;
|
|
tempFlags = 0;
|
|
tempVariables = undefined;
|
|
emit(node.body);
|
|
ts.Debug.assert(convertedLoopState === undefined);
|
|
convertedLoopState = saveConvertedLoopState;
|
|
tempFlags = saveTempFlags;
|
|
tempVariables = saveTempVariables;
|
|
}
|
|
else {
|
|
write("{");
|
|
increaseIndent();
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
writeLine();
|
|
emit(node.body);
|
|
decreaseIndent();
|
|
writeLine();
|
|
var moduleBlock = getInnerMostModuleDeclarationFromDottedModule(node).body;
|
|
emitToken(16, moduleBlock.statements.end);
|
|
}
|
|
write(")(");
|
|
if ((node.flags & 1) && !isES6ExportedDeclaration(node)) {
|
|
emit(node.name);
|
|
write(" = ");
|
|
}
|
|
emitModuleMemberName(node);
|
|
write(" || (");
|
|
emitModuleMemberName(node);
|
|
write(" = {}));");
|
|
emitEnd(node);
|
|
if (!isES6ExportedDeclaration(node) && node.name.kind === 69 && node.parent === currentSourceFile) {
|
|
if (modulekind === ts.ModuleKind.System && (node.flags & 1)) {
|
|
writeLine();
|
|
write(exportFunctionForFile + "(\"");
|
|
emitDeclarationName(node);
|
|
write("\", ");
|
|
emitDeclarationName(node);
|
|
write(");");
|
|
}
|
|
emitExportMemberAssignments(node.name);
|
|
}
|
|
}
|
|
function tryRenameExternalModule(moduleName) {
|
|
if (renamedDependencies && ts.hasProperty(renamedDependencies, moduleName.text)) {
|
|
return "\"" + renamedDependencies[moduleName.text] + "\"";
|
|
}
|
|
return undefined;
|
|
}
|
|
function emitRequire(moduleName) {
|
|
if (moduleName.kind === 9) {
|
|
write("require(");
|
|
var text = tryRenameExternalModule(moduleName);
|
|
if (text) {
|
|
write(text);
|
|
}
|
|
else {
|
|
emitStart(moduleName);
|
|
emitLiteral(moduleName);
|
|
emitEnd(moduleName);
|
|
}
|
|
emitToken(18, moduleName.end);
|
|
}
|
|
else {
|
|
write("require()");
|
|
}
|
|
}
|
|
function getNamespaceDeclarationNode(node) {
|
|
if (node.kind === 229) {
|
|
return node;
|
|
}
|
|
var importClause = node.importClause;
|
|
if (importClause && importClause.namedBindings && importClause.namedBindings.kind === 232) {
|
|
return importClause.namedBindings;
|
|
}
|
|
}
|
|
function isDefaultImport(node) {
|
|
return node.kind === 230 && node.importClause && !!node.importClause.name;
|
|
}
|
|
function emitExportImportAssignments(node) {
|
|
if (ts.isAliasSymbolDeclaration(node) && resolver.isValueAliasDeclaration(node)) {
|
|
emitExportMemberAssignments(node.name);
|
|
}
|
|
ts.forEachChild(node, emitExportImportAssignments);
|
|
}
|
|
function emitImportDeclaration(node) {
|
|
if (modulekind !== ts.ModuleKind.ES6) {
|
|
return emitExternalImportDeclaration(node);
|
|
}
|
|
if (node.importClause) {
|
|
var shouldEmitDefaultBindings = resolver.isReferencedAliasDeclaration(node.importClause);
|
|
var shouldEmitNamedBindings = node.importClause.namedBindings && resolver.isReferencedAliasDeclaration(node.importClause.namedBindings, true);
|
|
if (shouldEmitDefaultBindings || shouldEmitNamedBindings) {
|
|
write("import ");
|
|
emitStart(node.importClause);
|
|
if (shouldEmitDefaultBindings) {
|
|
emit(node.importClause.name);
|
|
if (shouldEmitNamedBindings) {
|
|
write(", ");
|
|
}
|
|
}
|
|
if (shouldEmitNamedBindings) {
|
|
emitLeadingComments(node.importClause.namedBindings);
|
|
emitStart(node.importClause.namedBindings);
|
|
if (node.importClause.namedBindings.kind === 232) {
|
|
write("* as ");
|
|
emit(node.importClause.namedBindings.name);
|
|
}
|
|
else {
|
|
write("{ ");
|
|
emitExportOrImportSpecifierList(node.importClause.namedBindings.elements, resolver.isReferencedAliasDeclaration);
|
|
write(" }");
|
|
}
|
|
emitEnd(node.importClause.namedBindings);
|
|
emitTrailingComments(node.importClause.namedBindings);
|
|
}
|
|
emitEnd(node.importClause);
|
|
write(" from ");
|
|
emit(node.moduleSpecifier);
|
|
write(";");
|
|
}
|
|
}
|
|
else {
|
|
write("import ");
|
|
emit(node.moduleSpecifier);
|
|
write(";");
|
|
}
|
|
}
|
|
function emitExternalImportDeclaration(node) {
|
|
if (ts.contains(externalImports, node)) {
|
|
var isExportedImport = node.kind === 229 && (node.flags & 1) !== 0;
|
|
var namespaceDeclaration = getNamespaceDeclarationNode(node);
|
|
var varOrConst = (languageVersion <= 1) ? "var " : "const ";
|
|
if (modulekind !== ts.ModuleKind.AMD) {
|
|
emitLeadingComments(node);
|
|
emitStart(node);
|
|
if (namespaceDeclaration && !isDefaultImport(node)) {
|
|
if (!isExportedImport) {
|
|
write(varOrConst);
|
|
}
|
|
;
|
|
emitModuleMemberName(namespaceDeclaration);
|
|
write(" = ");
|
|
}
|
|
else {
|
|
var isNakedImport = 230 && !node.importClause;
|
|
if (!isNakedImport) {
|
|
write(varOrConst);
|
|
write(getGeneratedNameForNode(node));
|
|
write(" = ");
|
|
}
|
|
}
|
|
emitRequire(ts.getExternalModuleName(node));
|
|
if (namespaceDeclaration && isDefaultImport(node)) {
|
|
write(", ");
|
|
emitModuleMemberName(namespaceDeclaration);
|
|
write(" = ");
|
|
write(getGeneratedNameForNode(node));
|
|
}
|
|
write(";");
|
|
emitEnd(node);
|
|
emitExportImportAssignments(node);
|
|
emitTrailingComments(node);
|
|
}
|
|
else {
|
|
if (isExportedImport) {
|
|
emitModuleMemberName(namespaceDeclaration);
|
|
write(" = ");
|
|
emit(namespaceDeclaration.name);
|
|
write(";");
|
|
}
|
|
else if (namespaceDeclaration && isDefaultImport(node)) {
|
|
write(varOrConst);
|
|
emitModuleMemberName(namespaceDeclaration);
|
|
write(" = ");
|
|
write(getGeneratedNameForNode(node));
|
|
write(";");
|
|
}
|
|
emitExportImportAssignments(node);
|
|
}
|
|
}
|
|
}
|
|
function emitImportEqualsDeclaration(node) {
|
|
if (ts.isExternalModuleImportEqualsDeclaration(node)) {
|
|
emitExternalImportDeclaration(node);
|
|
return;
|
|
}
|
|
if (resolver.isReferencedAliasDeclaration(node) ||
|
|
(!isCurrentFileExternalModule && resolver.isTopLevelValueImportEqualsWithEntityName(node))) {
|
|
emitLeadingComments(node);
|
|
emitStart(node);
|
|
var variableDeclarationIsHoisted = shouldHoistVariable(node, true);
|
|
var isExported = isSourceFileLevelDeclarationInSystemJsModule(node, true);
|
|
if (!variableDeclarationIsHoisted) {
|
|
ts.Debug.assert(!isExported);
|
|
if (isES6ExportedDeclaration(node)) {
|
|
write("export ");
|
|
write("var ");
|
|
}
|
|
else if (!(node.flags & 1)) {
|
|
write("var ");
|
|
}
|
|
}
|
|
if (isExported) {
|
|
write(exportFunctionForFile + "(\"");
|
|
emitNodeWithoutSourceMap(node.name);
|
|
write("\", ");
|
|
}
|
|
emitModuleMemberName(node);
|
|
write(" = ");
|
|
emit(node.moduleReference);
|
|
if (isExported) {
|
|
write(")");
|
|
}
|
|
write(";");
|
|
emitEnd(node);
|
|
emitExportImportAssignments(node);
|
|
emitTrailingComments(node);
|
|
}
|
|
}
|
|
function emitExportDeclaration(node) {
|
|
ts.Debug.assert(modulekind !== ts.ModuleKind.System);
|
|
if (modulekind !== ts.ModuleKind.ES6) {
|
|
if (node.moduleSpecifier && (!node.exportClause || resolver.isValueAliasDeclaration(node))) {
|
|
emitStart(node);
|
|
var generatedName = getGeneratedNameForNode(node);
|
|
if (node.exportClause) {
|
|
if (modulekind !== ts.ModuleKind.AMD) {
|
|
write("var ");
|
|
write(generatedName);
|
|
write(" = ");
|
|
emitRequire(ts.getExternalModuleName(node));
|
|
write(";");
|
|
}
|
|
for (var _a = 0, _b = node.exportClause.elements; _a < _b.length; _a++) {
|
|
var specifier = _b[_a];
|
|
if (resolver.isValueAliasDeclaration(specifier)) {
|
|
writeLine();
|
|
emitStart(specifier);
|
|
emitContainingModuleName(specifier);
|
|
write(".");
|
|
emitNodeWithCommentsAndWithoutSourcemap(specifier.name);
|
|
write(" = ");
|
|
write(generatedName);
|
|
write(".");
|
|
emitNodeWithCommentsAndWithoutSourcemap(specifier.propertyName || specifier.name);
|
|
write(";");
|
|
emitEnd(specifier);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (hasExportStarsToExportValues && resolver.moduleExportsSomeValue(node.moduleSpecifier)) {
|
|
writeLine();
|
|
write("__export(");
|
|
if (modulekind !== ts.ModuleKind.AMD) {
|
|
emitRequire(ts.getExternalModuleName(node));
|
|
}
|
|
else {
|
|
write(generatedName);
|
|
}
|
|
write(");");
|
|
}
|
|
}
|
|
emitEnd(node);
|
|
}
|
|
}
|
|
else {
|
|
if (!node.exportClause || resolver.isValueAliasDeclaration(node)) {
|
|
write("export ");
|
|
if (node.exportClause) {
|
|
write("{ ");
|
|
emitExportOrImportSpecifierList(node.exportClause.elements, resolver.isValueAliasDeclaration);
|
|
write(" }");
|
|
}
|
|
else {
|
|
write("*");
|
|
}
|
|
if (node.moduleSpecifier) {
|
|
write(" from ");
|
|
emit(node.moduleSpecifier);
|
|
}
|
|
write(";");
|
|
}
|
|
}
|
|
}
|
|
function emitExportOrImportSpecifierList(specifiers, shouldEmit) {
|
|
ts.Debug.assert(modulekind === ts.ModuleKind.ES6);
|
|
var needsComma = false;
|
|
for (var _a = 0, specifiers_1 = specifiers; _a < specifiers_1.length; _a++) {
|
|
var specifier = specifiers_1[_a];
|
|
if (shouldEmit(specifier)) {
|
|
if (needsComma) {
|
|
write(", ");
|
|
}
|
|
if (specifier.propertyName) {
|
|
emit(specifier.propertyName);
|
|
write(" as ");
|
|
}
|
|
emit(specifier.name);
|
|
needsComma = true;
|
|
}
|
|
}
|
|
}
|
|
function emitExportAssignment(node) {
|
|
if (!node.isExportEquals && resolver.isValueAliasDeclaration(node)) {
|
|
if (modulekind === ts.ModuleKind.ES6) {
|
|
writeLine();
|
|
emitStart(node);
|
|
write("export default ");
|
|
var expression = node.expression;
|
|
emit(expression);
|
|
if (expression.kind !== 220 &&
|
|
expression.kind !== 221) {
|
|
write(";");
|
|
}
|
|
emitEnd(node);
|
|
}
|
|
else {
|
|
writeLine();
|
|
emitStart(node);
|
|
if (modulekind === ts.ModuleKind.System) {
|
|
write(exportFunctionForFile + "(\"default\",");
|
|
emit(node.expression);
|
|
write(")");
|
|
}
|
|
else {
|
|
emitEs6ExportDefaultCompat(node);
|
|
emitContainingModuleName(node);
|
|
if (languageVersion === 0) {
|
|
write('["default"] = ');
|
|
}
|
|
else {
|
|
write(".default = ");
|
|
}
|
|
emit(node.expression);
|
|
}
|
|
write(";");
|
|
emitEnd(node);
|
|
}
|
|
}
|
|
}
|
|
function collectExternalModuleInfo(sourceFile) {
|
|
externalImports = [];
|
|
exportSpecifiers = {};
|
|
exportEquals = undefined;
|
|
hasExportStarsToExportValues = false;
|
|
for (var _a = 0, _b = sourceFile.statements; _a < _b.length; _a++) {
|
|
var node = _b[_a];
|
|
switch (node.kind) {
|
|
case 230:
|
|
if (!node.importClause ||
|
|
resolver.isReferencedAliasDeclaration(node.importClause, true)) {
|
|
externalImports.push(node);
|
|
}
|
|
break;
|
|
case 229:
|
|
if (node.moduleReference.kind === 240 && resolver.isReferencedAliasDeclaration(node)) {
|
|
externalImports.push(node);
|
|
}
|
|
break;
|
|
case 236:
|
|
if (node.moduleSpecifier) {
|
|
if (!node.exportClause) {
|
|
if (resolver.moduleExportsSomeValue(node.moduleSpecifier)) {
|
|
externalImports.push(node);
|
|
hasExportStarsToExportValues = true;
|
|
}
|
|
}
|
|
else if (resolver.isValueAliasDeclaration(node)) {
|
|
externalImports.push(node);
|
|
}
|
|
}
|
|
else {
|
|
for (var _c = 0, _d = node.exportClause.elements; _c < _d.length; _c++) {
|
|
var specifier = _d[_c];
|
|
var name_30 = (specifier.propertyName || specifier.name).text;
|
|
(exportSpecifiers[name_30] || (exportSpecifiers[name_30] = [])).push(specifier);
|
|
}
|
|
}
|
|
break;
|
|
case 235:
|
|
if (node.isExportEquals && !exportEquals) {
|
|
exportEquals = node;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function emitExportStarHelper() {
|
|
if (hasExportStarsToExportValues) {
|
|
writeLine();
|
|
write("function __export(m) {");
|
|
increaseIndent();
|
|
writeLine();
|
|
write("for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
}
|
|
}
|
|
function getLocalNameForExternalImport(node) {
|
|
var namespaceDeclaration = getNamespaceDeclarationNode(node);
|
|
if (namespaceDeclaration && !isDefaultImport(node)) {
|
|
return ts.getTextOfNodeFromSourceText(currentText, namespaceDeclaration.name);
|
|
}
|
|
if (node.kind === 230 && node.importClause) {
|
|
return getGeneratedNameForNode(node);
|
|
}
|
|
if (node.kind === 236 && node.moduleSpecifier) {
|
|
return getGeneratedNameForNode(node);
|
|
}
|
|
}
|
|
function getExternalModuleNameText(importNode, emitRelativePathAsModuleName) {
|
|
if (emitRelativePathAsModuleName) {
|
|
var name_31 = getExternalModuleNameFromDeclaration(host, resolver, importNode);
|
|
if (name_31) {
|
|
return "\"" + name_31 + "\"";
|
|
}
|
|
}
|
|
var moduleName = ts.getExternalModuleName(importNode);
|
|
if (moduleName.kind === 9) {
|
|
return tryRenameExternalModule(moduleName) || getLiteralText(moduleName);
|
|
}
|
|
return undefined;
|
|
}
|
|
function emitVariableDeclarationsForImports() {
|
|
if (externalImports.length === 0) {
|
|
return;
|
|
}
|
|
writeLine();
|
|
var started = false;
|
|
for (var _a = 0, externalImports_1 = externalImports; _a < externalImports_1.length; _a++) {
|
|
var importNode = externalImports_1[_a];
|
|
var skipNode = importNode.kind === 236 ||
|
|
(importNode.kind === 230 && !importNode.importClause);
|
|
if (skipNode) {
|
|
continue;
|
|
}
|
|
if (!started) {
|
|
write("var ");
|
|
started = true;
|
|
}
|
|
else {
|
|
write(", ");
|
|
}
|
|
write(getLocalNameForExternalImport(importNode));
|
|
}
|
|
if (started) {
|
|
write(";");
|
|
}
|
|
}
|
|
function emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations) {
|
|
if (!hasExportStarsToExportValues) {
|
|
return undefined;
|
|
}
|
|
if (!exportedDeclarations && ts.isEmpty(exportSpecifiers)) {
|
|
var hasExportDeclarationWithExportClause = false;
|
|
for (var _a = 0, externalImports_2 = externalImports; _a < externalImports_2.length; _a++) {
|
|
var externalImport = externalImports_2[_a];
|
|
if (externalImport.kind === 236 && externalImport.exportClause) {
|
|
hasExportDeclarationWithExportClause = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!hasExportDeclarationWithExportClause) {
|
|
return emitExportStarFunction(undefined);
|
|
}
|
|
}
|
|
var exportedNamesStorageRef = makeUniqueName("exportedNames");
|
|
writeLine();
|
|
write("var " + exportedNamesStorageRef + " = {");
|
|
increaseIndent();
|
|
var started = false;
|
|
if (exportedDeclarations) {
|
|
for (var i = 0; i < exportedDeclarations.length; i++) {
|
|
writeExportedName(exportedDeclarations[i]);
|
|
}
|
|
}
|
|
if (exportSpecifiers) {
|
|
for (var n in exportSpecifiers) {
|
|
for (var _b = 0, _c = exportSpecifiers[n]; _b < _c.length; _b++) {
|
|
var specifier = _c[_b];
|
|
writeExportedName(specifier.name);
|
|
}
|
|
}
|
|
}
|
|
for (var _d = 0, externalImports_3 = externalImports; _d < externalImports_3.length; _d++) {
|
|
var externalImport = externalImports_3[_d];
|
|
if (externalImport.kind !== 236) {
|
|
continue;
|
|
}
|
|
var exportDecl = externalImport;
|
|
if (!exportDecl.exportClause) {
|
|
continue;
|
|
}
|
|
for (var _e = 0, _f = exportDecl.exportClause.elements; _e < _f.length; _e++) {
|
|
var element = _f[_e];
|
|
writeExportedName(element.name || element.propertyName);
|
|
}
|
|
}
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("};");
|
|
return emitExportStarFunction(exportedNamesStorageRef);
|
|
function emitExportStarFunction(localNames) {
|
|
var exportStarFunction = makeUniqueName("exportStar");
|
|
writeLine();
|
|
write("function " + exportStarFunction + "(m) {");
|
|
increaseIndent();
|
|
writeLine();
|
|
write("var exports = {};");
|
|
writeLine();
|
|
write("for(var n in m) {");
|
|
increaseIndent();
|
|
writeLine();
|
|
write("if (n !== \"default\"");
|
|
if (localNames) {
|
|
write("&& !" + localNames + ".hasOwnProperty(n)");
|
|
}
|
|
write(") exports[n] = m[n];");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
writeLine();
|
|
write(exportFunctionForFile + "(exports);");
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
return exportStarFunction;
|
|
}
|
|
function writeExportedName(node) {
|
|
if (node.kind !== 69 && node.flags & 512) {
|
|
return;
|
|
}
|
|
if (started) {
|
|
write(",");
|
|
}
|
|
else {
|
|
started = true;
|
|
}
|
|
writeLine();
|
|
write("'");
|
|
if (node.kind === 69) {
|
|
emitNodeWithCommentsAndWithoutSourcemap(node);
|
|
}
|
|
else {
|
|
emitDeclarationName(node);
|
|
}
|
|
write("': true");
|
|
}
|
|
}
|
|
function processTopLevelVariableAndFunctionDeclarations(node) {
|
|
var hoistedVars;
|
|
var hoistedFunctionDeclarations;
|
|
var exportedDeclarations;
|
|
visit(node);
|
|
if (hoistedVars) {
|
|
writeLine();
|
|
write("var ");
|
|
var seen = {};
|
|
for (var i = 0; i < hoistedVars.length; i++) {
|
|
var local = hoistedVars[i];
|
|
var name_32 = local.kind === 69
|
|
? local
|
|
: local.name;
|
|
if (name_32) {
|
|
var text = ts.unescapeIdentifier(name_32.text);
|
|
if (ts.hasProperty(seen, text)) {
|
|
continue;
|
|
}
|
|
else {
|
|
seen[text] = text;
|
|
}
|
|
}
|
|
if (i !== 0) {
|
|
write(", ");
|
|
}
|
|
if (local.kind === 221 || local.kind === 225 || local.kind === 224) {
|
|
emitDeclarationName(local);
|
|
}
|
|
else {
|
|
emit(local);
|
|
}
|
|
var flags = ts.getCombinedNodeFlags(local.kind === 69 ? local.parent : local);
|
|
if (flags & 1) {
|
|
if (!exportedDeclarations) {
|
|
exportedDeclarations = [];
|
|
}
|
|
exportedDeclarations.push(local);
|
|
}
|
|
}
|
|
write(";");
|
|
}
|
|
if (hoistedFunctionDeclarations) {
|
|
for (var _a = 0, hoistedFunctionDeclarations_1 = hoistedFunctionDeclarations; _a < hoistedFunctionDeclarations_1.length; _a++) {
|
|
var f = hoistedFunctionDeclarations_1[_a];
|
|
writeLine();
|
|
emit(f);
|
|
if (f.flags & 1) {
|
|
if (!exportedDeclarations) {
|
|
exportedDeclarations = [];
|
|
}
|
|
exportedDeclarations.push(f);
|
|
}
|
|
}
|
|
}
|
|
return exportedDeclarations;
|
|
function visit(node) {
|
|
if (node.flags & 2) {
|
|
return;
|
|
}
|
|
if (node.kind === 220) {
|
|
if (!hoistedFunctionDeclarations) {
|
|
hoistedFunctionDeclarations = [];
|
|
}
|
|
hoistedFunctionDeclarations.push(node);
|
|
return;
|
|
}
|
|
if (node.kind === 221) {
|
|
if (!hoistedVars) {
|
|
hoistedVars = [];
|
|
}
|
|
hoistedVars.push(node);
|
|
return;
|
|
}
|
|
if (node.kind === 224) {
|
|
if (shouldEmitEnumDeclaration(node)) {
|
|
if (!hoistedVars) {
|
|
hoistedVars = [];
|
|
}
|
|
hoistedVars.push(node);
|
|
}
|
|
return;
|
|
}
|
|
if (node.kind === 225) {
|
|
if (shouldEmitModuleDeclaration(node)) {
|
|
if (!hoistedVars) {
|
|
hoistedVars = [];
|
|
}
|
|
hoistedVars.push(node);
|
|
}
|
|
return;
|
|
}
|
|
if (node.kind === 218 || node.kind === 169) {
|
|
if (shouldHoistVariable(node, false)) {
|
|
var name_33 = node.name;
|
|
if (name_33.kind === 69) {
|
|
if (!hoistedVars) {
|
|
hoistedVars = [];
|
|
}
|
|
hoistedVars.push(name_33);
|
|
}
|
|
else {
|
|
ts.forEachChild(name_33, visit);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (ts.isInternalModuleImportEqualsDeclaration(node) && resolver.isValueAliasDeclaration(node)) {
|
|
if (!hoistedVars) {
|
|
hoistedVars = [];
|
|
}
|
|
hoistedVars.push(node.name);
|
|
return;
|
|
}
|
|
if (ts.isBindingPattern(node)) {
|
|
ts.forEach(node.elements, visit);
|
|
return;
|
|
}
|
|
if (!ts.isDeclaration(node)) {
|
|
ts.forEachChild(node, visit);
|
|
}
|
|
}
|
|
}
|
|
function shouldHoistVariable(node, checkIfSourceFileLevelDecl) {
|
|
if (checkIfSourceFileLevelDecl && !shouldHoistDeclarationInSystemJsModule(node)) {
|
|
return false;
|
|
}
|
|
return (ts.getCombinedNodeFlags(node) & 3072) === 0 ||
|
|
ts.getEnclosingBlockScopeContainer(node).kind === 256;
|
|
}
|
|
function isCurrentFileSystemExternalModule() {
|
|
return modulekind === ts.ModuleKind.System && isCurrentFileExternalModule;
|
|
}
|
|
function emitSystemModuleBody(node, dependencyGroups, startIndex) {
|
|
emitVariableDeclarationsForImports();
|
|
writeLine();
|
|
var exportedDeclarations = processTopLevelVariableAndFunctionDeclarations(node);
|
|
var exportStarFunction = emitLocalStorageForExportedNamesIfNecessary(exportedDeclarations);
|
|
writeLine();
|
|
write("return {");
|
|
increaseIndent();
|
|
writeLine();
|
|
emitSetters(exportStarFunction, dependencyGroups);
|
|
writeLine();
|
|
emitExecute(node, startIndex);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
emitTempDeclarations(true);
|
|
}
|
|
function emitSetters(exportStarFunction, dependencyGroups) {
|
|
write("setters:[");
|
|
for (var i = 0; i < dependencyGroups.length; i++) {
|
|
if (i !== 0) {
|
|
write(",");
|
|
}
|
|
writeLine();
|
|
increaseIndent();
|
|
var group = dependencyGroups[i];
|
|
var parameterName = makeUniqueName(ts.forEach(group, getLocalNameForExternalImport) || "");
|
|
write("function (" + parameterName + ") {");
|
|
increaseIndent();
|
|
for (var _a = 0, group_1 = group; _a < group_1.length; _a++) {
|
|
var entry = group_1[_a];
|
|
var importVariableName = getLocalNameForExternalImport(entry) || "";
|
|
switch (entry.kind) {
|
|
case 230:
|
|
if (!entry.importClause) {
|
|
break;
|
|
}
|
|
case 229:
|
|
ts.Debug.assert(importVariableName !== "");
|
|
writeLine();
|
|
write(importVariableName + " = " + parameterName + ";");
|
|
writeLine();
|
|
break;
|
|
case 236:
|
|
ts.Debug.assert(importVariableName !== "");
|
|
if (entry.exportClause) {
|
|
writeLine();
|
|
write(exportFunctionForFile + "({");
|
|
writeLine();
|
|
increaseIndent();
|
|
for (var i_1 = 0, len = entry.exportClause.elements.length; i_1 < len; i_1++) {
|
|
if (i_1 !== 0) {
|
|
write(",");
|
|
writeLine();
|
|
}
|
|
var e = entry.exportClause.elements[i_1];
|
|
write("\"");
|
|
emitNodeWithCommentsAndWithoutSourcemap(e.name);
|
|
write("\": " + parameterName + "[\"");
|
|
emitNodeWithCommentsAndWithoutSourcemap(e.propertyName || e.name);
|
|
write("\"]");
|
|
}
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("});");
|
|
}
|
|
else {
|
|
writeLine();
|
|
write(exportStarFunction + "(" + parameterName + ");");
|
|
}
|
|
writeLine();
|
|
break;
|
|
}
|
|
}
|
|
decreaseIndent();
|
|
write("}");
|
|
decreaseIndent();
|
|
}
|
|
write("],");
|
|
}
|
|
function emitExecute(node, startIndex) {
|
|
write("execute: function() {");
|
|
increaseIndent();
|
|
writeLine();
|
|
for (var i = startIndex; i < node.statements.length; i++) {
|
|
var statement = node.statements[i];
|
|
switch (statement.kind) {
|
|
case 220:
|
|
case 230:
|
|
continue;
|
|
case 236:
|
|
if (!statement.moduleSpecifier) {
|
|
for (var _a = 0, _b = statement.exportClause.elements; _a < _b.length; _a++) {
|
|
var element = _b[_a];
|
|
emitExportSpecifierInSystemModule(element);
|
|
}
|
|
}
|
|
continue;
|
|
case 229:
|
|
if (!ts.isInternalModuleImportEqualsDeclaration(statement)) {
|
|
continue;
|
|
}
|
|
default:
|
|
writeLine();
|
|
emit(statement);
|
|
}
|
|
}
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("}");
|
|
}
|
|
function writeModuleName(node, emitRelativePathAsModuleName) {
|
|
var moduleName = node.moduleName;
|
|
if (moduleName || (emitRelativePathAsModuleName && (moduleName = getResolvedExternalModuleName(host, node)))) {
|
|
write("\"" + moduleName + "\", ");
|
|
}
|
|
}
|
|
function emitSystemModule(node, emitRelativePathAsModuleName) {
|
|
collectExternalModuleInfo(node);
|
|
ts.Debug.assert(!exportFunctionForFile);
|
|
exportFunctionForFile = makeUniqueName("exports");
|
|
contextObjectForFile = makeUniqueName("context");
|
|
writeLine();
|
|
write("System.register(");
|
|
writeModuleName(node, emitRelativePathAsModuleName);
|
|
write("[");
|
|
var groupIndices = {};
|
|
var dependencyGroups = [];
|
|
for (var i = 0; i < externalImports.length; i++) {
|
|
var text = getExternalModuleNameText(externalImports[i], emitRelativePathAsModuleName);
|
|
if (text === undefined) {
|
|
continue;
|
|
}
|
|
var key = text.substr(1, text.length - 2);
|
|
if (ts.hasProperty(groupIndices, key)) {
|
|
var groupIndex = groupIndices[key];
|
|
dependencyGroups[groupIndex].push(externalImports[i]);
|
|
continue;
|
|
}
|
|
else {
|
|
groupIndices[key] = dependencyGroups.length;
|
|
dependencyGroups.push([externalImports[i]]);
|
|
}
|
|
if (i !== 0) {
|
|
write(", ");
|
|
}
|
|
write(text);
|
|
}
|
|
write("], function(" + exportFunctionForFile + ", " + contextObjectForFile + ") {");
|
|
writeLine();
|
|
increaseIndent();
|
|
var startIndex = emitDirectivePrologues(node.statements, true, !compilerOptions.noImplicitUseStrict);
|
|
writeLine();
|
|
write("var __moduleName = " + contextObjectForFile + " && " + contextObjectForFile + ".id;");
|
|
writeLine();
|
|
emitEmitHelpers(node);
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitSystemModuleBody(node, dependencyGroups, startIndex);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("});");
|
|
}
|
|
function getAMDDependencyNames(node, includeNonAmdDependencies, emitRelativePathAsModuleName) {
|
|
var aliasedModuleNames = [];
|
|
var unaliasedModuleNames = [];
|
|
var importAliasNames = [];
|
|
for (var _a = 0, _b = node.amdDependencies; _a < _b.length; _a++) {
|
|
var amdDependency = _b[_a];
|
|
if (amdDependency.name) {
|
|
aliasedModuleNames.push('"' + amdDependency.path + '"');
|
|
importAliasNames.push(amdDependency.name);
|
|
}
|
|
else {
|
|
unaliasedModuleNames.push('"' + amdDependency.path + '"');
|
|
}
|
|
}
|
|
for (var _c = 0, externalImports_4 = externalImports; _c < externalImports_4.length; _c++) {
|
|
var importNode = externalImports_4[_c];
|
|
var externalModuleName = getExternalModuleNameText(importNode, emitRelativePathAsModuleName);
|
|
var importAliasName = getLocalNameForExternalImport(importNode);
|
|
if (includeNonAmdDependencies && importAliasName) {
|
|
aliasedModuleNames.push(externalModuleName);
|
|
importAliasNames.push(importAliasName);
|
|
}
|
|
else {
|
|
unaliasedModuleNames.push(externalModuleName);
|
|
}
|
|
}
|
|
return { aliasedModuleNames: aliasedModuleNames, unaliasedModuleNames: unaliasedModuleNames, importAliasNames: importAliasNames };
|
|
}
|
|
function emitAMDDependencies(node, includeNonAmdDependencies, emitRelativePathAsModuleName) {
|
|
var dependencyNames = getAMDDependencyNames(node, includeNonAmdDependencies, emitRelativePathAsModuleName);
|
|
emitAMDDependencyList(dependencyNames);
|
|
write(", ");
|
|
emitAMDFactoryHeader(dependencyNames);
|
|
}
|
|
function emitAMDDependencyList(_a) {
|
|
var aliasedModuleNames = _a.aliasedModuleNames, unaliasedModuleNames = _a.unaliasedModuleNames;
|
|
write('["require", "exports"');
|
|
if (aliasedModuleNames.length) {
|
|
write(", ");
|
|
write(aliasedModuleNames.join(", "));
|
|
}
|
|
if (unaliasedModuleNames.length) {
|
|
write(", ");
|
|
write(unaliasedModuleNames.join(", "));
|
|
}
|
|
write("]");
|
|
}
|
|
function emitAMDFactoryHeader(_a) {
|
|
var importAliasNames = _a.importAliasNames;
|
|
write("function (require, exports");
|
|
if (importAliasNames.length) {
|
|
write(", ");
|
|
write(importAliasNames.join(", "));
|
|
}
|
|
write(") {");
|
|
}
|
|
function emitAMDModule(node, emitRelativePathAsModuleName) {
|
|
emitEmitHelpers(node);
|
|
collectExternalModuleInfo(node);
|
|
writeLine();
|
|
write("define(");
|
|
writeModuleName(node, emitRelativePathAsModuleName);
|
|
emitAMDDependencies(node, true, emitRelativePathAsModuleName);
|
|
increaseIndent();
|
|
var startIndex = emitDirectivePrologues(node.statements, true, !compilerOptions.noImplicitUseStrict);
|
|
emitExportStarHelper();
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitLinesStartingAt(node.statements, startIndex);
|
|
emitExportEquals(true);
|
|
emitTempDeclarations(true);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("});");
|
|
}
|
|
function emitCommonJSModule(node) {
|
|
var startIndex = emitDirectivePrologues(node.statements, false, !compilerOptions.noImplicitUseStrict);
|
|
emitEmitHelpers(node);
|
|
collectExternalModuleInfo(node);
|
|
emitExportStarHelper();
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitLinesStartingAt(node.statements, startIndex);
|
|
emitExportEquals(false);
|
|
emitTempDeclarations(true);
|
|
}
|
|
function emitUMDModule(node) {
|
|
emitEmitHelpers(node);
|
|
collectExternalModuleInfo(node);
|
|
var dependencyNames = getAMDDependencyNames(node, false);
|
|
writeLines("(function (factory) {\n if (typeof module === 'object' && typeof module.exports === 'object') {\n var v = factory(require, exports); if (v !== undefined) module.exports = v;\n }\n else if (typeof define === 'function' && define.amd) {\n define(");
|
|
emitAMDDependencyList(dependencyNames);
|
|
write(", factory);");
|
|
writeLines(" }\n})(");
|
|
emitAMDFactoryHeader(dependencyNames);
|
|
increaseIndent();
|
|
var startIndex = emitDirectivePrologues(node.statements, true, !compilerOptions.noImplicitUseStrict);
|
|
emitExportStarHelper();
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitLinesStartingAt(node.statements, startIndex);
|
|
emitExportEquals(true);
|
|
emitTempDeclarations(true);
|
|
decreaseIndent();
|
|
writeLine();
|
|
write("});");
|
|
}
|
|
function emitES6Module(node) {
|
|
externalImports = undefined;
|
|
exportSpecifiers = undefined;
|
|
exportEquals = undefined;
|
|
hasExportStarsToExportValues = false;
|
|
var startIndex = emitDirectivePrologues(node.statements, false);
|
|
emitEmitHelpers(node);
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitLinesStartingAt(node.statements, startIndex);
|
|
emitTempDeclarations(true);
|
|
}
|
|
function emitExportEquals(emitAsReturn) {
|
|
if (exportEquals && resolver.isValueAliasDeclaration(exportEquals)) {
|
|
writeLine();
|
|
emitStart(exportEquals);
|
|
write(emitAsReturn ? "return " : "module.exports = ");
|
|
emit(exportEquals.expression);
|
|
write(";");
|
|
emitEnd(exportEquals);
|
|
}
|
|
}
|
|
function emitJsxElement(node) {
|
|
switch (compilerOptions.jsx) {
|
|
case 2:
|
|
jsxEmitReact(node);
|
|
break;
|
|
case 1:
|
|
default:
|
|
jsxEmitPreserve(node);
|
|
break;
|
|
}
|
|
}
|
|
function trimReactWhitespaceAndApplyEntities(node) {
|
|
var result = undefined;
|
|
var text = ts.getTextOfNode(node, true);
|
|
var firstNonWhitespace = 0;
|
|
var lastNonWhitespace = -1;
|
|
for (var i = 0; i < text.length; i++) {
|
|
var c = text.charCodeAt(i);
|
|
if (ts.isLineBreak(c)) {
|
|
if (firstNonWhitespace !== -1 && (lastNonWhitespace - firstNonWhitespace + 1 > 0)) {
|
|
var part = text.substr(firstNonWhitespace, lastNonWhitespace - firstNonWhitespace + 1);
|
|
result = (result ? result + "\" + ' ' + \"" : "") + ts.escapeString(part);
|
|
}
|
|
firstNonWhitespace = -1;
|
|
}
|
|
else if (!ts.isWhiteSpaceSingleLine(c)) {
|
|
lastNonWhitespace = i;
|
|
if (firstNonWhitespace === -1) {
|
|
firstNonWhitespace = i;
|
|
}
|
|
}
|
|
}
|
|
if (firstNonWhitespace !== -1) {
|
|
var part = text.substr(firstNonWhitespace);
|
|
result = (result ? result + "\" + ' ' + \"" : "") + ts.escapeString(part);
|
|
}
|
|
if (result) {
|
|
result = result.replace(/&(\w+);/g, function (s, m) {
|
|
if (entities[m] !== undefined) {
|
|
var ch = String.fromCharCode(entities[m]);
|
|
return ch === '"' ? "\\\"" : ch;
|
|
}
|
|
else {
|
|
return s;
|
|
}
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
function isJsxChildEmittable(child) {
|
|
if (child.kind === 248) {
|
|
return !!child.expression;
|
|
}
|
|
else if (child.kind === 244) {
|
|
return !!getTextToEmit(child);
|
|
}
|
|
return true;
|
|
}
|
|
;
|
|
function getTextToEmit(node) {
|
|
switch (compilerOptions.jsx) {
|
|
case 2:
|
|
var text = trimReactWhitespaceAndApplyEntities(node);
|
|
if (text === undefined || text.length === 0) {
|
|
return undefined;
|
|
}
|
|
else {
|
|
return text;
|
|
}
|
|
case 1:
|
|
default:
|
|
return ts.getTextOfNode(node, true);
|
|
}
|
|
}
|
|
function emitJsxText(node) {
|
|
switch (compilerOptions.jsx) {
|
|
case 2:
|
|
write('"');
|
|
write(trimReactWhitespaceAndApplyEntities(node));
|
|
write('"');
|
|
break;
|
|
case 1:
|
|
default:
|
|
writer.writeLiteral(ts.getTextOfNode(node, true));
|
|
break;
|
|
}
|
|
}
|
|
function emitJsxExpression(node) {
|
|
if (node.expression) {
|
|
switch (compilerOptions.jsx) {
|
|
case 1:
|
|
default:
|
|
write("{");
|
|
emit(node.expression);
|
|
write("}");
|
|
break;
|
|
case 2:
|
|
emit(node.expression);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
function isUseStrictPrologue(node) {
|
|
return node.expression.text === "use strict";
|
|
}
|
|
function ensureUseStrictPrologue(startWithNewLine, writeUseStrict) {
|
|
if (writeUseStrict) {
|
|
if (startWithNewLine) {
|
|
writeLine();
|
|
}
|
|
write("\"use strict\";");
|
|
}
|
|
}
|
|
function emitDirectivePrologues(statements, startWithNewLine, ensureUseStrict) {
|
|
var foundUseStrict = false;
|
|
for (var i = 0; i < statements.length; i++) {
|
|
if (ts.isPrologueDirective(statements[i])) {
|
|
if (isUseStrictPrologue(statements[i])) {
|
|
foundUseStrict = true;
|
|
}
|
|
if (startWithNewLine || i > 0) {
|
|
writeLine();
|
|
}
|
|
emit(statements[i]);
|
|
}
|
|
else {
|
|
ensureUseStrictPrologue(startWithNewLine || i > 0, !foundUseStrict && ensureUseStrict);
|
|
return i;
|
|
}
|
|
}
|
|
ensureUseStrictPrologue(startWithNewLine, !foundUseStrict && ensureUseStrict);
|
|
return statements.length;
|
|
}
|
|
function writeLines(text) {
|
|
var lines = text.split(/\r\n|\r|\n/g);
|
|
for (var i = 0; i < lines.length; i++) {
|
|
var line = lines[i];
|
|
if (line.length) {
|
|
writeLine();
|
|
write(line);
|
|
}
|
|
}
|
|
}
|
|
function emitEmitHelpers(node) {
|
|
if (!compilerOptions.noEmitHelpers) {
|
|
if (languageVersion < 2 && !extendsEmitted && node.flags & 262144) {
|
|
writeLines(extendsHelper);
|
|
extendsEmitted = true;
|
|
}
|
|
if (compilerOptions.jsx !== 1 && !assignEmitted && (node.flags & 1073741824)) {
|
|
writeLines(assignHelper);
|
|
assignEmitted = true;
|
|
}
|
|
if (!decorateEmitted && node.flags & 524288) {
|
|
writeLines(decorateHelper);
|
|
if (compilerOptions.emitDecoratorMetadata) {
|
|
writeLines(metadataHelper);
|
|
}
|
|
decorateEmitted = true;
|
|
}
|
|
if (!paramEmitted && node.flags & 1048576) {
|
|
writeLines(paramHelper);
|
|
paramEmitted = true;
|
|
}
|
|
if (!awaiterEmitted && node.flags & 2097152) {
|
|
writeLines(awaiterHelper);
|
|
awaiterEmitted = true;
|
|
}
|
|
}
|
|
}
|
|
function emitSourceFileNode(node) {
|
|
writeLine();
|
|
emitShebang();
|
|
emitDetachedCommentsAndUpdateCommentsInfo(node);
|
|
if (ts.isExternalModule(node) || compilerOptions.isolatedModules) {
|
|
if (isOwnFileEmit || (!ts.isExternalModule(node) && compilerOptions.isolatedModules)) {
|
|
var emitModule = moduleEmitDelegates[modulekind] || moduleEmitDelegates[ts.ModuleKind.CommonJS];
|
|
emitModule(node);
|
|
}
|
|
else {
|
|
bundleEmitDelegates[modulekind](node, true);
|
|
}
|
|
}
|
|
else {
|
|
var startIndex = emitDirectivePrologues(node.statements, false);
|
|
externalImports = undefined;
|
|
exportSpecifiers = undefined;
|
|
exportEquals = undefined;
|
|
hasExportStarsToExportValues = false;
|
|
emitEmitHelpers(node);
|
|
emitCaptureThisForNodeIfNecessary(node);
|
|
emitLinesStartingAt(node.statements, startIndex);
|
|
emitTempDeclarations(true);
|
|
}
|
|
emitLeadingComments(node.endOfFileToken);
|
|
}
|
|
function emit(node) {
|
|
emitNodeConsideringCommentsOption(node, emitNodeWithSourceMap);
|
|
}
|
|
function emitNodeWithCommentsAndWithoutSourcemap(node) {
|
|
emitNodeConsideringCommentsOption(node, emitNodeWithoutSourceMap);
|
|
}
|
|
function emitNodeConsideringCommentsOption(node, emitNodeConsideringSourcemap) {
|
|
if (node) {
|
|
if (node.flags & 2) {
|
|
return emitCommentsOnNotEmittedNode(node);
|
|
}
|
|
if (isSpecializedCommentHandling(node)) {
|
|
return emitNodeWithoutSourceMap(node);
|
|
}
|
|
var emitComments_1 = shouldEmitLeadingAndTrailingComments(node);
|
|
if (emitComments_1) {
|
|
emitLeadingComments(node);
|
|
}
|
|
emitNodeConsideringSourcemap(node);
|
|
if (emitComments_1) {
|
|
emitTrailingComments(node);
|
|
}
|
|
}
|
|
}
|
|
function emitNodeWithSourceMap(node) {
|
|
if (node) {
|
|
emitStart(node);
|
|
emitNodeWithoutSourceMap(node);
|
|
emitEnd(node);
|
|
}
|
|
}
|
|
function emitNodeWithoutSourceMap(node) {
|
|
if (node) {
|
|
emitJavaScriptWorker(node);
|
|
}
|
|
}
|
|
function changeSourceMapEmit(writer) {
|
|
sourceMap = writer;
|
|
emitStart = writer.emitStart;
|
|
emitEnd = writer.emitEnd;
|
|
emitPos = writer.emitPos;
|
|
setSourceFile = writer.setSourceFile;
|
|
}
|
|
function withTemporaryNoSourceMap(callback) {
|
|
var prevSourceMap = sourceMap;
|
|
setSourceMapWriterEmit(ts.getNullSourceMapWriter());
|
|
callback();
|
|
setSourceMapWriterEmit(prevSourceMap);
|
|
}
|
|
function isSpecializedCommentHandling(node) {
|
|
switch (node.kind) {
|
|
case 222:
|
|
case 220:
|
|
case 230:
|
|
case 229:
|
|
case 223:
|
|
case 235:
|
|
return true;
|
|
}
|
|
}
|
|
function shouldEmitLeadingAndTrailingComments(node) {
|
|
switch (node.kind) {
|
|
case 200:
|
|
return shouldEmitLeadingAndTrailingCommentsForVariableStatement(node);
|
|
case 225:
|
|
return shouldEmitModuleDeclaration(node);
|
|
case 224:
|
|
return shouldEmitEnumDeclaration(node);
|
|
}
|
|
ts.Debug.assert(!isSpecializedCommentHandling(node));
|
|
if (node.kind !== 199 &&
|
|
node.parent &&
|
|
node.parent.kind === 180 &&
|
|
node.parent.body === node &&
|
|
languageVersion <= 1) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function emitJavaScriptWorker(node) {
|
|
switch (node.kind) {
|
|
case 69:
|
|
return emitIdentifier(node);
|
|
case 142:
|
|
return emitParameter(node);
|
|
case 147:
|
|
case 146:
|
|
return emitMethod(node);
|
|
case 149:
|
|
case 150:
|
|
return emitAccessor(node);
|
|
case 97:
|
|
return emitThis(node);
|
|
case 95:
|
|
return emitSuper(node);
|
|
case 93:
|
|
return write("null");
|
|
case 99:
|
|
return write("true");
|
|
case 84:
|
|
return write("false");
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
case 12:
|
|
case 13:
|
|
case 14:
|
|
return emitLiteral(node);
|
|
case 189:
|
|
return emitTemplateExpression(node);
|
|
case 197:
|
|
return emitTemplateSpan(node);
|
|
case 241:
|
|
case 242:
|
|
return emitJsxElement(node);
|
|
case 244:
|
|
return emitJsxText(node);
|
|
case 248:
|
|
return emitJsxExpression(node);
|
|
case 139:
|
|
return emitQualifiedName(node);
|
|
case 167:
|
|
return emitObjectBindingPattern(node);
|
|
case 168:
|
|
return emitArrayBindingPattern(node);
|
|
case 169:
|
|
return emitBindingElement(node);
|
|
case 170:
|
|
return emitArrayLiteral(node);
|
|
case 171:
|
|
return emitObjectLiteral(node);
|
|
case 253:
|
|
return emitPropertyAssignment(node);
|
|
case 254:
|
|
return emitShorthandPropertyAssignment(node);
|
|
case 140:
|
|
return emitComputedPropertyName(node);
|
|
case 172:
|
|
return emitPropertyAccess(node);
|
|
case 173:
|
|
return emitIndexedAccess(node);
|
|
case 174:
|
|
return emitCallExpression(node);
|
|
case 175:
|
|
return emitNewExpression(node);
|
|
case 176:
|
|
return emitTaggedTemplateExpression(node);
|
|
case 177:
|
|
case 195:
|
|
case 196:
|
|
return emit(node.expression);
|
|
case 178:
|
|
return emitParenExpression(node);
|
|
case 220:
|
|
case 179:
|
|
case 180:
|
|
return emitFunctionDeclaration(node);
|
|
case 181:
|
|
return emitDeleteExpression(node);
|
|
case 182:
|
|
return emitTypeOfExpression(node);
|
|
case 183:
|
|
return emitVoidExpression(node);
|
|
case 184:
|
|
return emitAwaitExpression(node);
|
|
case 185:
|
|
return emitPrefixUnaryExpression(node);
|
|
case 186:
|
|
return emitPostfixUnaryExpression(node);
|
|
case 187:
|
|
return emitBinaryExpression(node);
|
|
case 188:
|
|
return emitConditionalExpression(node);
|
|
case 191:
|
|
return emitSpreadElementExpression(node);
|
|
case 190:
|
|
return emitYieldExpression(node);
|
|
case 193:
|
|
return;
|
|
case 199:
|
|
case 226:
|
|
return emitBlock(node);
|
|
case 200:
|
|
return emitVariableStatement(node);
|
|
case 201:
|
|
return write(";");
|
|
case 202:
|
|
return emitExpressionStatement(node);
|
|
case 203:
|
|
return emitIfStatement(node);
|
|
case 204:
|
|
return emitDoStatement(node);
|
|
case 205:
|
|
return emitWhileStatement(node);
|
|
case 206:
|
|
return emitForStatement(node);
|
|
case 208:
|
|
case 207:
|
|
return emitForInOrForOfStatement(node);
|
|
case 209:
|
|
case 210:
|
|
return emitBreakOrContinueStatement(node);
|
|
case 211:
|
|
return emitReturnStatement(node);
|
|
case 212:
|
|
return emitWithStatement(node);
|
|
case 213:
|
|
return emitSwitchStatement(node);
|
|
case 249:
|
|
case 250:
|
|
return emitCaseOrDefaultClause(node);
|
|
case 214:
|
|
return emitLabeledStatement(node);
|
|
case 215:
|
|
return emitThrowStatement(node);
|
|
case 216:
|
|
return emitTryStatement(node);
|
|
case 252:
|
|
return emitCatchClause(node);
|
|
case 217:
|
|
return emitDebuggerStatement(node);
|
|
case 218:
|
|
return emitVariableDeclaration(node);
|
|
case 192:
|
|
return emitClassExpression(node);
|
|
case 221:
|
|
return emitClassDeclaration(node);
|
|
case 222:
|
|
return emitInterfaceDeclaration(node);
|
|
case 224:
|
|
return emitEnumDeclaration(node);
|
|
case 255:
|
|
return emitEnumMember(node);
|
|
case 225:
|
|
return emitModuleDeclaration(node);
|
|
case 230:
|
|
return emitImportDeclaration(node);
|
|
case 229:
|
|
return emitImportEqualsDeclaration(node);
|
|
case 236:
|
|
return emitExportDeclaration(node);
|
|
case 235:
|
|
return emitExportAssignment(node);
|
|
case 256:
|
|
return emitSourceFileNode(node);
|
|
}
|
|
}
|
|
function hasDetachedComments(pos) {
|
|
return detachedCommentsInfo !== undefined && ts.lastOrUndefined(detachedCommentsInfo).nodePos === pos;
|
|
}
|
|
function getLeadingCommentsWithoutDetachedComments() {
|
|
var leadingComments = ts.getLeadingCommentRanges(currentText, ts.lastOrUndefined(detachedCommentsInfo).detachedCommentEndPos);
|
|
if (detachedCommentsInfo.length - 1) {
|
|
detachedCommentsInfo.pop();
|
|
}
|
|
else {
|
|
detachedCommentsInfo = undefined;
|
|
}
|
|
return leadingComments;
|
|
}
|
|
function isTripleSlashComment(comment) {
|
|
if (currentText.charCodeAt(comment.pos + 1) === 47 &&
|
|
comment.pos + 2 < comment.end &&
|
|
currentText.charCodeAt(comment.pos + 2) === 47) {
|
|
var textSubStr = currentText.substring(comment.pos, comment.end);
|
|
return textSubStr.match(ts.fullTripleSlashReferencePathRegEx) ||
|
|
textSubStr.match(ts.fullTripleSlashAMDReferencePathRegEx) ?
|
|
true : false;
|
|
}
|
|
return false;
|
|
}
|
|
function getLeadingCommentsToEmit(node) {
|
|
if (node.parent) {
|
|
if (node.parent.kind === 256 || node.pos !== node.parent.pos) {
|
|
if (hasDetachedComments(node.pos)) {
|
|
return getLeadingCommentsWithoutDetachedComments();
|
|
}
|
|
else {
|
|
return ts.getLeadingCommentRangesOfNodeFromText(node, currentText);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function getTrailingCommentsToEmit(node) {
|
|
if (node.parent) {
|
|
if (node.parent.kind === 256 || node.end !== node.parent.end) {
|
|
return ts.getTrailingCommentRanges(currentText, node.end);
|
|
}
|
|
}
|
|
}
|
|
function emitCommentsOnNotEmittedNode(node) {
|
|
emitLeadingCommentsWorker(node, false);
|
|
}
|
|
function emitLeadingComments(node) {
|
|
return emitLeadingCommentsWorker(node, true);
|
|
}
|
|
function emitLeadingCommentsWorker(node, isEmittedNode) {
|
|
if (compilerOptions.removeComments) {
|
|
return;
|
|
}
|
|
var leadingComments;
|
|
if (isEmittedNode) {
|
|
leadingComments = getLeadingCommentsToEmit(node);
|
|
}
|
|
else {
|
|
if (node.pos === 0) {
|
|
leadingComments = ts.filter(getLeadingCommentsToEmit(node), isTripleSlashComment);
|
|
}
|
|
}
|
|
ts.emitNewLineBeforeLeadingComments(currentLineMap, writer, node, leadingComments);
|
|
ts.emitComments(currentText, currentLineMap, writer, leadingComments, true, newLine, writeComment);
|
|
}
|
|
function emitTrailingComments(node) {
|
|
if (compilerOptions.removeComments) {
|
|
return;
|
|
}
|
|
var trailingComments = getTrailingCommentsToEmit(node);
|
|
ts.emitComments(currentText, currentLineMap, writer, trailingComments, false, newLine, writeComment);
|
|
}
|
|
function emitTrailingCommentsOfPosition(pos) {
|
|
if (compilerOptions.removeComments) {
|
|
return;
|
|
}
|
|
var trailingComments = ts.getTrailingCommentRanges(currentText, pos);
|
|
ts.emitComments(currentText, currentLineMap, writer, trailingComments, true, newLine, writeComment);
|
|
}
|
|
function emitLeadingCommentsOfPositionWorker(pos) {
|
|
if (compilerOptions.removeComments) {
|
|
return;
|
|
}
|
|
var leadingComments;
|
|
if (hasDetachedComments(pos)) {
|
|
leadingComments = getLeadingCommentsWithoutDetachedComments();
|
|
}
|
|
else {
|
|
leadingComments = ts.getLeadingCommentRanges(currentText, pos);
|
|
}
|
|
ts.emitNewLineBeforeLeadingComments(currentLineMap, writer, { pos: pos, end: pos }, leadingComments);
|
|
ts.emitComments(currentText, currentLineMap, writer, leadingComments, true, newLine, writeComment);
|
|
}
|
|
function emitDetachedCommentsAndUpdateCommentsInfo(node) {
|
|
var currentDetachedCommentInfo = ts.emitDetachedComments(currentText, currentLineMap, writer, writeComment, node, newLine, compilerOptions.removeComments);
|
|
if (currentDetachedCommentInfo) {
|
|
if (detachedCommentsInfo) {
|
|
detachedCommentsInfo.push(currentDetachedCommentInfo);
|
|
}
|
|
else {
|
|
detachedCommentsInfo = [currentDetachedCommentInfo];
|
|
}
|
|
}
|
|
}
|
|
function writeComment(text, lineMap, writer, comment, newLine) {
|
|
emitPos(comment.pos);
|
|
ts.writeCommentRange(text, lineMap, writer, comment, newLine);
|
|
emitPos(comment.end);
|
|
}
|
|
function emitShebang() {
|
|
var shebang = ts.getShebang(currentText);
|
|
if (shebang) {
|
|
write(shebang);
|
|
writeLine();
|
|
}
|
|
}
|
|
var _a, _b;
|
|
}
|
|
function emitFile(_a, sourceFiles, isBundledEmit) {
|
|
var jsFilePath = _a.jsFilePath, sourceMapFilePath = _a.sourceMapFilePath, declarationFilePath = _a.declarationFilePath;
|
|
if (!host.isEmitBlocked(jsFilePath) && !compilerOptions.noEmit) {
|
|
emitJavaScript(jsFilePath, sourceMapFilePath, sourceFiles, isBundledEmit);
|
|
}
|
|
else {
|
|
emitSkipped = true;
|
|
}
|
|
if (declarationFilePath) {
|
|
emitSkipped = ts.writeDeclarationFile(declarationFilePath, sourceFiles, isBundledEmit, host, resolver, emitterDiagnostics) || emitSkipped;
|
|
}
|
|
if (!emitSkipped && emittedFilesList) {
|
|
emittedFilesList.push(jsFilePath);
|
|
if (sourceMapFilePath) {
|
|
emittedFilesList.push(sourceMapFilePath);
|
|
}
|
|
if (declarationFilePath) {
|
|
emittedFilesList.push(declarationFilePath);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ts.emitFiles = emitFiles;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.programTime = 0;
|
|
ts.emitTime = 0;
|
|
ts.ioReadTime = 0;
|
|
ts.ioWriteTime = 0;
|
|
ts.version = "2.1.0";
|
|
var emptyArray = [];
|
|
var defaultTypeRoots = ["node_modules/@types"];
|
|
function findConfigFile(searchPath, fileExists) {
|
|
while (true) {
|
|
var fileName = ts.combinePaths(searchPath, "tsconfig.json");
|
|
if (fileExists(fileName)) {
|
|
return fileName;
|
|
}
|
|
var parentPath = ts.getDirectoryPath(searchPath);
|
|
if (parentPath === searchPath) {
|
|
break;
|
|
}
|
|
searchPath = parentPath;
|
|
}
|
|
return undefined;
|
|
}
|
|
ts.findConfigFile = findConfigFile;
|
|
function resolveTripleslashReference(moduleName, containingFile) {
|
|
var basePath = ts.getDirectoryPath(containingFile);
|
|
var referencedFileName = ts.isRootedDiskPath(moduleName) ? moduleName : ts.combinePaths(basePath, moduleName);
|
|
return ts.normalizePath(referencedFileName);
|
|
}
|
|
ts.resolveTripleslashReference = resolveTripleslashReference;
|
|
function computeCommonSourceDirectoryOfFilenames(fileNames, currentDirectory, getCanonicalFileName) {
|
|
var commonPathComponents;
|
|
var failed = ts.forEach(fileNames, function (sourceFile) {
|
|
var sourcePathComponents = ts.getNormalizedPathComponents(sourceFile, currentDirectory);
|
|
sourcePathComponents.pop();
|
|
if (!commonPathComponents) {
|
|
commonPathComponents = sourcePathComponents;
|
|
return;
|
|
}
|
|
for (var i = 0, n = Math.min(commonPathComponents.length, sourcePathComponents.length); i < n; i++) {
|
|
if (getCanonicalFileName(commonPathComponents[i]) !== getCanonicalFileName(sourcePathComponents[i])) {
|
|
if (i === 0) {
|
|
return true;
|
|
}
|
|
commonPathComponents.length = i;
|
|
break;
|
|
}
|
|
}
|
|
if (sourcePathComponents.length < commonPathComponents.length) {
|
|
commonPathComponents.length = sourcePathComponents.length;
|
|
}
|
|
});
|
|
if (failed) {
|
|
return "";
|
|
}
|
|
if (!commonPathComponents) {
|
|
return currentDirectory;
|
|
}
|
|
return ts.getNormalizedPathFromPathComponents(commonPathComponents);
|
|
}
|
|
ts.computeCommonSourceDirectoryOfFilenames = computeCommonSourceDirectoryOfFilenames;
|
|
function trace(host, message) {
|
|
host.trace(ts.formatMessage.apply(undefined, arguments));
|
|
}
|
|
function isTraceEnabled(compilerOptions, host) {
|
|
return compilerOptions.traceResolution && host.trace !== undefined;
|
|
}
|
|
function hasZeroOrOneAsteriskCharacter(str) {
|
|
var seenAsterisk = false;
|
|
for (var i = 0; i < str.length; i++) {
|
|
if (str.charCodeAt(i) === 42) {
|
|
if (!seenAsterisk) {
|
|
seenAsterisk = true;
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
ts.hasZeroOrOneAsteriskCharacter = hasZeroOrOneAsteriskCharacter;
|
|
function createResolvedModule(resolvedFileName, isExternalLibraryImport, failedLookupLocations) {
|
|
return { resolvedModule: resolvedFileName ? { resolvedFileName: resolvedFileName, isExternalLibraryImport: isExternalLibraryImport } : undefined, failedLookupLocations: failedLookupLocations };
|
|
}
|
|
function moduleHasNonRelativeName(moduleName) {
|
|
return !(ts.isRootedDiskPath(moduleName) || ts.isExternalModuleNameRelative(moduleName));
|
|
}
|
|
function tryReadTypesSection(packageJsonPath, baseDirectory, state) {
|
|
var jsonContent;
|
|
try {
|
|
var jsonText = state.host.readFile(packageJsonPath);
|
|
jsonContent = jsonText ? JSON.parse(jsonText) : {};
|
|
}
|
|
catch (e) {
|
|
jsonContent = {};
|
|
}
|
|
var typesFile;
|
|
var fieldName;
|
|
if (jsonContent.typings) {
|
|
if (typeof jsonContent.typings === "string") {
|
|
fieldName = "typings";
|
|
typesFile = jsonContent.typings;
|
|
}
|
|
else {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Expected_type_of_0_field_in_package_json_to_be_string_got_1, "typings", typeof jsonContent.typings);
|
|
}
|
|
}
|
|
}
|
|
if (!typesFile && jsonContent.types) {
|
|
if (typeof jsonContent.types === "string") {
|
|
fieldName = "types";
|
|
typesFile = jsonContent.types;
|
|
}
|
|
else {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Expected_type_of_0_field_in_package_json_to_be_string_got_1, "types", typeof jsonContent.types);
|
|
}
|
|
}
|
|
}
|
|
if (typesFile) {
|
|
var typesFilePath = ts.normalizePath(ts.combinePaths(baseDirectory, typesFile));
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.package_json_has_0_field_1_that_references_2, fieldName, typesFile, typesFilePath);
|
|
}
|
|
return typesFilePath;
|
|
}
|
|
if (state.compilerOptions.allowJs && jsonContent.main && typeof jsonContent.main === "string") {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.No_types_specified_in_package_json_but_allowJs_is_set_so_returning_main_value_of_0, jsonContent.main);
|
|
}
|
|
var mainFilePath = ts.normalizePath(ts.combinePaths(baseDirectory, jsonContent.main));
|
|
return mainFilePath;
|
|
}
|
|
return undefined;
|
|
}
|
|
var typeReferenceExtensions = [".d.ts"];
|
|
function getEffectiveTypeRoots(options, host) {
|
|
if (options.typeRoots) {
|
|
return options.typeRoots;
|
|
}
|
|
var currentDirectory;
|
|
if (options.configFilePath) {
|
|
currentDirectory = ts.getDirectoryPath(options.configFilePath);
|
|
}
|
|
else if (host.getCurrentDirectory) {
|
|
currentDirectory = host.getCurrentDirectory();
|
|
}
|
|
if (!currentDirectory) {
|
|
return undefined;
|
|
}
|
|
return ts.map(defaultTypeRoots, function (d) { return ts.combinePaths(currentDirectory, d); });
|
|
}
|
|
function resolveTypeReferenceDirective(typeReferenceDirectiveName, containingFile, options, host) {
|
|
var traceEnabled = isTraceEnabled(options, host);
|
|
var moduleResolutionState = {
|
|
compilerOptions: options,
|
|
host: host,
|
|
skipTsx: true,
|
|
traceEnabled: traceEnabled
|
|
};
|
|
var typeRoots = getEffectiveTypeRoots(options, host);
|
|
if (traceEnabled) {
|
|
if (containingFile === undefined) {
|
|
if (typeRoots === undefined) {
|
|
trace(host, ts.Diagnostics.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_not_set, typeReferenceDirectiveName);
|
|
}
|
|
else {
|
|
trace(host, ts.Diagnostics.Resolving_type_reference_directive_0_containing_file_not_set_root_directory_1, typeReferenceDirectiveName, typeRoots);
|
|
}
|
|
}
|
|
else {
|
|
if (typeRoots === undefined) {
|
|
trace(host, ts.Diagnostics.Resolving_type_reference_directive_0_containing_file_1_root_directory_not_set, typeReferenceDirectiveName, containingFile);
|
|
}
|
|
else {
|
|
trace(host, ts.Diagnostics.Resolving_type_reference_directive_0_containing_file_1_root_directory_2, typeReferenceDirectiveName, containingFile, typeRoots);
|
|
}
|
|
}
|
|
}
|
|
var failedLookupLocations = [];
|
|
if (typeRoots && typeRoots.length) {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Resolving_with_primary_search_path_0, typeRoots.join(", "));
|
|
}
|
|
var primarySearchPaths = typeRoots;
|
|
for (var _i = 0, primarySearchPaths_1 = primarySearchPaths; _i < primarySearchPaths_1.length; _i++) {
|
|
var typeRoot = primarySearchPaths_1[_i];
|
|
var candidate = ts.combinePaths(typeRoot, typeReferenceDirectiveName);
|
|
var candidateDirectory = ts.getDirectoryPath(candidate);
|
|
var resolvedFile_1 = loadNodeModuleFromDirectory(typeReferenceExtensions, candidate, failedLookupLocations, !directoryProbablyExists(candidateDirectory, host), moduleResolutionState);
|
|
if (resolvedFile_1) {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2, typeReferenceDirectiveName, resolvedFile_1, true);
|
|
}
|
|
return {
|
|
resolvedTypeReferenceDirective: { primary: true, resolvedFileName: resolvedFile_1 },
|
|
failedLookupLocations: failedLookupLocations
|
|
};
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Root_directory_cannot_be_determined_skipping_primary_search_paths);
|
|
}
|
|
}
|
|
var resolvedFile;
|
|
var initialLocationForSecondaryLookup;
|
|
if (containingFile) {
|
|
initialLocationForSecondaryLookup = ts.getDirectoryPath(containingFile);
|
|
}
|
|
if (initialLocationForSecondaryLookup !== undefined) {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Looking_up_in_node_modules_folder_initial_location_0, initialLocationForSecondaryLookup);
|
|
}
|
|
resolvedFile = loadModuleFromNodeModules(typeReferenceDirectiveName, initialLocationForSecondaryLookup, failedLookupLocations, moduleResolutionState);
|
|
if (traceEnabled) {
|
|
if (resolvedFile) {
|
|
trace(host, ts.Diagnostics.Type_reference_directive_0_was_successfully_resolved_to_1_primary_Colon_2, typeReferenceDirectiveName, resolvedFile, false);
|
|
}
|
|
else {
|
|
trace(host, ts.Diagnostics.Type_reference_directive_0_was_not_resolved, typeReferenceDirectiveName);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Containing_file_is_not_specified_and_root_directory_cannot_be_determined_skipping_lookup_in_node_modules_folder);
|
|
}
|
|
}
|
|
return {
|
|
resolvedTypeReferenceDirective: resolvedFile
|
|
? { primary: false, resolvedFileName: resolvedFile }
|
|
: undefined,
|
|
failedLookupLocations: failedLookupLocations
|
|
};
|
|
}
|
|
ts.resolveTypeReferenceDirective = resolveTypeReferenceDirective;
|
|
function resolveModuleName(moduleName, containingFile, compilerOptions, host) {
|
|
var traceEnabled = isTraceEnabled(compilerOptions, host);
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Resolving_module_0_from_1, moduleName, containingFile);
|
|
}
|
|
var moduleResolution = compilerOptions.moduleResolution;
|
|
if (moduleResolution === undefined) {
|
|
moduleResolution = ts.getEmitModuleKind(compilerOptions) === ts.ModuleKind.CommonJS ? ts.ModuleResolutionKind.NodeJs : ts.ModuleResolutionKind.Classic;
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Module_resolution_kind_is_not_specified_using_0, ts.ModuleResolutionKind[moduleResolution]);
|
|
}
|
|
}
|
|
else {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Explicitly_specified_module_resolution_kind_Colon_0, ts.ModuleResolutionKind[moduleResolution]);
|
|
}
|
|
}
|
|
var result;
|
|
switch (moduleResolution) {
|
|
case ts.ModuleResolutionKind.NodeJs:
|
|
result = nodeModuleNameResolver(moduleName, containingFile, compilerOptions, host);
|
|
break;
|
|
case ts.ModuleResolutionKind.Classic:
|
|
result = classicNameResolver(moduleName, containingFile, compilerOptions, host);
|
|
break;
|
|
}
|
|
if (traceEnabled) {
|
|
if (result.resolvedModule) {
|
|
trace(host, ts.Diagnostics.Module_name_0_was_successfully_resolved_to_1, moduleName, result.resolvedModule.resolvedFileName);
|
|
}
|
|
else {
|
|
trace(host, ts.Diagnostics.Module_name_0_was_not_resolved, moduleName);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.resolveModuleName = resolveModuleName;
|
|
function tryLoadModuleUsingOptionalResolutionSettings(moduleName, containingDirectory, loader, failedLookupLocations, supportedExtensions, state) {
|
|
if (moduleHasNonRelativeName(moduleName)) {
|
|
return tryLoadModuleUsingBaseUrl(moduleName, loader, failedLookupLocations, supportedExtensions, state);
|
|
}
|
|
else {
|
|
return tryLoadModuleUsingRootDirs(moduleName, containingDirectory, loader, failedLookupLocations, supportedExtensions, state);
|
|
}
|
|
}
|
|
function tryLoadModuleUsingRootDirs(moduleName, containingDirectory, loader, failedLookupLocations, supportedExtensions, state) {
|
|
if (!state.compilerOptions.rootDirs) {
|
|
return undefined;
|
|
}
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.rootDirs_option_is_set_using_it_to_resolve_relative_module_name_0, moduleName);
|
|
}
|
|
var candidate = ts.normalizePath(ts.combinePaths(containingDirectory, moduleName));
|
|
var matchedRootDir;
|
|
var matchedNormalizedPrefix;
|
|
for (var _i = 0, _a = state.compilerOptions.rootDirs; _i < _a.length; _i++) {
|
|
var rootDir = _a[_i];
|
|
var normalizedRoot = ts.normalizePath(rootDir);
|
|
if (!ts.endsWith(normalizedRoot, ts.directorySeparator)) {
|
|
normalizedRoot += ts.directorySeparator;
|
|
}
|
|
var isLongestMatchingPrefix = ts.startsWith(candidate, normalizedRoot) &&
|
|
(matchedNormalizedPrefix === undefined || matchedNormalizedPrefix.length < normalizedRoot.length);
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Checking_if_0_is_the_longest_matching_prefix_for_1_2, normalizedRoot, candidate, isLongestMatchingPrefix);
|
|
}
|
|
if (isLongestMatchingPrefix) {
|
|
matchedNormalizedPrefix = normalizedRoot;
|
|
matchedRootDir = rootDir;
|
|
}
|
|
}
|
|
if (matchedNormalizedPrefix) {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Longest_matching_prefix_for_0_is_1, candidate, matchedNormalizedPrefix);
|
|
}
|
|
var suffix = candidate.substr(matchedNormalizedPrefix.length);
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Loading_0_from_the_root_dir_1_candidate_location_2, suffix, matchedNormalizedPrefix, candidate);
|
|
}
|
|
var resolvedFileName = loader(candidate, supportedExtensions, failedLookupLocations, !directoryProbablyExists(containingDirectory, state.host), state);
|
|
if (resolvedFileName) {
|
|
return resolvedFileName;
|
|
}
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Trying_other_entries_in_rootDirs);
|
|
}
|
|
for (var _b = 0, _c = state.compilerOptions.rootDirs; _b < _c.length; _b++) {
|
|
var rootDir = _c[_b];
|
|
if (rootDir === matchedRootDir) {
|
|
continue;
|
|
}
|
|
var candidate_1 = ts.combinePaths(ts.normalizePath(rootDir), suffix);
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Loading_0_from_the_root_dir_1_candidate_location_2, suffix, rootDir, candidate_1);
|
|
}
|
|
var baseDirectory = ts.getDirectoryPath(candidate_1);
|
|
var resolvedFileName_1 = loader(candidate_1, supportedExtensions, failedLookupLocations, !directoryProbablyExists(baseDirectory, state.host), state);
|
|
if (resolvedFileName_1) {
|
|
return resolvedFileName_1;
|
|
}
|
|
}
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Module_resolution_using_rootDirs_has_failed);
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
function tryLoadModuleUsingBaseUrl(moduleName, loader, failedLookupLocations, supportedExtensions, state) {
|
|
if (!state.compilerOptions.baseUrl) {
|
|
return undefined;
|
|
}
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.baseUrl_option_is_set_to_0_using_this_value_to_resolve_non_relative_module_name_1, state.compilerOptions.baseUrl, moduleName);
|
|
}
|
|
var matchedPattern = undefined;
|
|
if (state.compilerOptions.paths) {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.paths_option_is_specified_looking_for_a_pattern_to_match_module_name_0, moduleName);
|
|
}
|
|
matchedPattern = matchPatternOrExact(ts.getKeys(state.compilerOptions.paths), moduleName);
|
|
}
|
|
if (matchedPattern) {
|
|
var matchedStar = typeof matchedPattern === "string" ? undefined : matchedText(matchedPattern, moduleName);
|
|
var matchedPatternText = typeof matchedPattern === "string" ? matchedPattern : patternText(matchedPattern);
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Module_name_0_matched_pattern_1, moduleName, matchedPatternText);
|
|
}
|
|
for (var _i = 0, _a = state.compilerOptions.paths[matchedPatternText]; _i < _a.length; _i++) {
|
|
var subst = _a[_i];
|
|
var path = matchedStar ? subst.replace("*", matchedStar) : subst;
|
|
var candidate = ts.normalizePath(ts.combinePaths(state.compilerOptions.baseUrl, path));
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Trying_substitution_0_candidate_module_location_Colon_1, subst, path);
|
|
}
|
|
var resolvedFileName = loader(candidate, supportedExtensions, failedLookupLocations, !directoryProbablyExists(ts.getDirectoryPath(candidate), state.host), state);
|
|
if (resolvedFileName) {
|
|
return resolvedFileName;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
else {
|
|
var candidate = ts.normalizePath(ts.combinePaths(state.compilerOptions.baseUrl, moduleName));
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Resolving_module_name_0_relative_to_base_url_1_2, moduleName, state.compilerOptions.baseUrl, candidate);
|
|
}
|
|
return loader(candidate, supportedExtensions, failedLookupLocations, !directoryProbablyExists(ts.getDirectoryPath(candidate), state.host), state);
|
|
}
|
|
}
|
|
function matchPatternOrExact(patternStrings, candidate) {
|
|
var patterns = [];
|
|
for (var _i = 0, patternStrings_1 = patternStrings; _i < patternStrings_1.length; _i++) {
|
|
var patternString = patternStrings_1[_i];
|
|
var pattern = tryParsePattern(patternString);
|
|
if (pattern) {
|
|
patterns.push(pattern);
|
|
}
|
|
else if (patternString === candidate) {
|
|
return patternString;
|
|
}
|
|
}
|
|
return findBestPatternMatch(patterns, function (_) { return _; }, candidate);
|
|
}
|
|
function patternText(_a) {
|
|
var prefix = _a.prefix, suffix = _a.suffix;
|
|
return prefix + "*" + suffix;
|
|
}
|
|
function matchedText(pattern, candidate) {
|
|
ts.Debug.assert(isPatternMatch(pattern, candidate));
|
|
return candidate.substr(pattern.prefix.length, candidate.length - pattern.suffix.length);
|
|
}
|
|
function findBestPatternMatch(values, getPattern, candidate) {
|
|
var matchedValue = undefined;
|
|
var longestMatchPrefixLength = -1;
|
|
for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {
|
|
var v = values_1[_i];
|
|
var pattern = getPattern(v);
|
|
if (isPatternMatch(pattern, candidate) && pattern.prefix.length > longestMatchPrefixLength) {
|
|
longestMatchPrefixLength = pattern.prefix.length;
|
|
matchedValue = v;
|
|
}
|
|
}
|
|
return matchedValue;
|
|
}
|
|
ts.findBestPatternMatch = findBestPatternMatch;
|
|
function isPatternMatch(_a, candidate) {
|
|
var prefix = _a.prefix, suffix = _a.suffix;
|
|
return candidate.length >= prefix.length + suffix.length &&
|
|
ts.startsWith(candidate, prefix) &&
|
|
ts.endsWith(candidate, suffix);
|
|
}
|
|
function tryParsePattern(pattern) {
|
|
ts.Debug.assert(hasZeroOrOneAsteriskCharacter(pattern));
|
|
var indexOfStar = pattern.indexOf("*");
|
|
return indexOfStar === -1 ? undefined : {
|
|
prefix: pattern.substr(0, indexOfStar),
|
|
suffix: pattern.substr(indexOfStar + 1)
|
|
};
|
|
}
|
|
ts.tryParsePattern = tryParsePattern;
|
|
function nodeModuleNameResolver(moduleName, containingFile, compilerOptions, host) {
|
|
var containingDirectory = ts.getDirectoryPath(containingFile);
|
|
var supportedExtensions = ts.getSupportedExtensions(compilerOptions);
|
|
var traceEnabled = isTraceEnabled(compilerOptions, host);
|
|
var failedLookupLocations = [];
|
|
var state = { compilerOptions: compilerOptions, host: host, traceEnabled: traceEnabled, skipTsx: false };
|
|
var resolvedFileName = tryLoadModuleUsingOptionalResolutionSettings(moduleName, containingDirectory, nodeLoadModuleByRelativeName, failedLookupLocations, supportedExtensions, state);
|
|
var isExternalLibraryImport = false;
|
|
if (!resolvedFileName) {
|
|
if (moduleHasNonRelativeName(moduleName)) {
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Loading_module_0_from_node_modules_folder, moduleName);
|
|
}
|
|
resolvedFileName = loadModuleFromNodeModules(moduleName, containingDirectory, failedLookupLocations, state);
|
|
isExternalLibraryImport = resolvedFileName !== undefined;
|
|
}
|
|
else {
|
|
var candidate = ts.normalizePath(ts.combinePaths(containingDirectory, moduleName));
|
|
resolvedFileName = nodeLoadModuleByRelativeName(candidate, supportedExtensions, failedLookupLocations, false, state);
|
|
}
|
|
}
|
|
if (resolvedFileName && host.realpath) {
|
|
var originalFileName = resolvedFileName;
|
|
resolvedFileName = ts.normalizePath(host.realpath(resolvedFileName));
|
|
if (traceEnabled) {
|
|
trace(host, ts.Diagnostics.Resolving_real_path_for_0_result_1, originalFileName, resolvedFileName);
|
|
}
|
|
}
|
|
return createResolvedModule(resolvedFileName, isExternalLibraryImport, failedLookupLocations);
|
|
}
|
|
ts.nodeModuleNameResolver = nodeModuleNameResolver;
|
|
function nodeLoadModuleByRelativeName(candidate, supportedExtensions, failedLookupLocations, onlyRecordFailures, state) {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Loading_module_as_file_Slash_folder_candidate_module_location_0, candidate);
|
|
}
|
|
var resolvedFileName = loadModuleFromFile(candidate, supportedExtensions, failedLookupLocations, onlyRecordFailures, state);
|
|
return resolvedFileName || loadNodeModuleFromDirectory(supportedExtensions, candidate, failedLookupLocations, onlyRecordFailures, state);
|
|
}
|
|
function directoryProbablyExists(directoryName, host) {
|
|
return !host.directoryExists || host.directoryExists(directoryName);
|
|
}
|
|
ts.directoryProbablyExists = directoryProbablyExists;
|
|
function loadModuleFromFile(candidate, extensions, failedLookupLocation, onlyRecordFailures, state) {
|
|
var resolvedByAddingOrKeepingExtension = loadModuleFromFileWorker(candidate, extensions, failedLookupLocation, onlyRecordFailures, state);
|
|
if (resolvedByAddingOrKeepingExtension) {
|
|
return resolvedByAddingOrKeepingExtension;
|
|
}
|
|
if (ts.hasJavaScriptFileExtension(candidate)) {
|
|
var extensionless = ts.removeFileExtension(candidate);
|
|
if (state.traceEnabled) {
|
|
var extension = candidate.substring(extensionless.length);
|
|
trace(state.host, ts.Diagnostics.File_name_0_has_a_1_extension_stripping_it, candidate, extension);
|
|
}
|
|
return loadModuleFromFileWorker(extensionless, extensions, failedLookupLocation, onlyRecordFailures, state);
|
|
}
|
|
}
|
|
function loadModuleFromFileWorker(candidate, extensions, failedLookupLocation, onlyRecordFailures, state) {
|
|
if (!onlyRecordFailures) {
|
|
var directory = ts.getDirectoryPath(candidate);
|
|
if (directory) {
|
|
onlyRecordFailures = !directoryProbablyExists(directory, state.host);
|
|
}
|
|
}
|
|
return ts.forEach(extensions, tryLoad);
|
|
function tryLoad(ext) {
|
|
if (state.skipTsx && ts.isJsxOrTsxExtension(ext)) {
|
|
return undefined;
|
|
}
|
|
var fileName = ts.fileExtensionIs(candidate, ext) ? candidate : candidate + ext;
|
|
if (!onlyRecordFailures && state.host.fileExists(fileName)) {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.File_0_exist_use_it_as_a_name_resolution_result, fileName);
|
|
}
|
|
return fileName;
|
|
}
|
|
else {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.File_0_does_not_exist, fileName);
|
|
}
|
|
failedLookupLocation.push(fileName);
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
function loadNodeModuleFromDirectory(extensions, candidate, failedLookupLocation, onlyRecordFailures, state) {
|
|
var packageJsonPath = ts.combinePaths(candidate, "package.json");
|
|
var directoryExists = !onlyRecordFailures && directoryProbablyExists(candidate, state.host);
|
|
if (directoryExists && state.host.fileExists(packageJsonPath)) {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.Found_package_json_at_0, packageJsonPath);
|
|
}
|
|
var typesFile = tryReadTypesSection(packageJsonPath, candidate, state);
|
|
if (typesFile) {
|
|
var result = loadModuleFromFile(typesFile, extensions, failedLookupLocation, !directoryProbablyExists(ts.getDirectoryPath(typesFile), state.host), state);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
else {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.package_json_does_not_have_types_field);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (state.traceEnabled) {
|
|
trace(state.host, ts.Diagnostics.File_0_does_not_exist, packageJsonPath);
|
|
}
|
|
failedLookupLocation.push(packageJsonPath);
|
|
}
|
|
return loadModuleFromFile(ts.combinePaths(candidate, "index"), extensions, failedLookupLocation, !directoryExists, state);
|
|
}
|
|
function loadModuleFromNodeModulesFolder(moduleName, directory, failedLookupLocations, state) {
|
|
var nodeModulesFolder = ts.combinePaths(directory, "node_modules");
|
|
var nodeModulesFolderExists = directoryProbablyExists(nodeModulesFolder, state.host);
|
|
var candidate = ts.normalizePath(ts.combinePaths(nodeModulesFolder, moduleName));
|
|
var supportedExtensions = ts.getSupportedExtensions(state.compilerOptions);
|
|
var result = loadModuleFromFile(candidate, supportedExtensions, failedLookupLocations, !nodeModulesFolderExists, state);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
result = loadNodeModuleFromDirectory(supportedExtensions, candidate, failedLookupLocations, !nodeModulesFolderExists, state);
|
|
if (result) {
|
|
return result;
|
|
}
|
|
}
|
|
function loadModuleFromNodeModules(moduleName, directory, failedLookupLocations, state) {
|
|
directory = ts.normalizeSlashes(directory);
|
|
while (true) {
|
|
var baseName = ts.getBaseFileName(directory);
|
|
if (baseName !== "node_modules") {
|
|
var packageResult = loadModuleFromNodeModulesFolder(moduleName, directory, failedLookupLocations, state);
|
|
if (packageResult && ts.hasTypeScriptFileExtension(packageResult)) {
|
|
return packageResult;
|
|
}
|
|
else {
|
|
var typesResult = loadModuleFromNodeModulesFolder(ts.combinePaths("@types", moduleName), directory, failedLookupLocations, state);
|
|
if (typesResult || packageResult) {
|
|
return typesResult || packageResult;
|
|
}
|
|
}
|
|
}
|
|
var parentPath = ts.getDirectoryPath(directory);
|
|
if (parentPath === directory) {
|
|
break;
|
|
}
|
|
directory = parentPath;
|
|
}
|
|
return undefined;
|
|
}
|
|
function classicNameResolver(moduleName, containingFile, compilerOptions, host) {
|
|
var traceEnabled = isTraceEnabled(compilerOptions, host);
|
|
var state = { compilerOptions: compilerOptions, host: host, traceEnabled: traceEnabled, skipTsx: !compilerOptions.jsx };
|
|
var failedLookupLocations = [];
|
|
var supportedExtensions = ts.getSupportedExtensions(compilerOptions);
|
|
var containingDirectory = ts.getDirectoryPath(containingFile);
|
|
var resolvedFileName = tryLoadModuleUsingOptionalResolutionSettings(moduleName, containingDirectory, loadModuleFromFile, failedLookupLocations, supportedExtensions, state);
|
|
if (resolvedFileName) {
|
|
return createResolvedModule(resolvedFileName, false, failedLookupLocations);
|
|
}
|
|
var referencedSourceFile;
|
|
if (moduleHasNonRelativeName(moduleName)) {
|
|
while (true) {
|
|
var searchName = ts.normalizePath(ts.combinePaths(containingDirectory, moduleName));
|
|
referencedSourceFile = loadModuleFromFile(searchName, supportedExtensions, failedLookupLocations, false, state);
|
|
if (referencedSourceFile) {
|
|
break;
|
|
}
|
|
var parentPath = ts.getDirectoryPath(containingDirectory);
|
|
if (parentPath === containingDirectory) {
|
|
break;
|
|
}
|
|
containingDirectory = parentPath;
|
|
}
|
|
}
|
|
else {
|
|
var candidate = ts.normalizePath(ts.combinePaths(containingDirectory, moduleName));
|
|
referencedSourceFile = loadModuleFromFile(candidate, supportedExtensions, failedLookupLocations, false, state);
|
|
}
|
|
return referencedSourceFile
|
|
? { resolvedModule: { resolvedFileName: referencedSourceFile }, failedLookupLocations: failedLookupLocations }
|
|
: { resolvedModule: undefined, failedLookupLocations: failedLookupLocations };
|
|
}
|
|
ts.classicNameResolver = classicNameResolver;
|
|
ts.defaultInitCompilerOptions = {
|
|
module: ts.ModuleKind.CommonJS,
|
|
target: 1,
|
|
noImplicitAny: false,
|
|
sourceMap: false
|
|
};
|
|
function createCompilerHost(options, setParentNodes) {
|
|
var existingDirectories = {};
|
|
function getCanonicalFileName(fileName) {
|
|
return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
|
|
}
|
|
var unsupportedFileEncodingErrorCode = -2147024809;
|
|
function getSourceFile(fileName, languageVersion, onError) {
|
|
var text;
|
|
try {
|
|
var start = new Date().getTime();
|
|
text = ts.sys.readFile(fileName, options.charset);
|
|
ts.ioReadTime += new Date().getTime() - start;
|
|
}
|
|
catch (e) {
|
|
if (onError) {
|
|
onError(e.number === unsupportedFileEncodingErrorCode
|
|
? ts.createCompilerDiagnostic(ts.Diagnostics.Unsupported_file_encoding).messageText
|
|
: e.message);
|
|
}
|
|
text = "";
|
|
}
|
|
return text !== undefined ? ts.createSourceFile(fileName, text, languageVersion, setParentNodes) : undefined;
|
|
}
|
|
function directoryExists(directoryPath) {
|
|
if (ts.hasProperty(existingDirectories, directoryPath)) {
|
|
return true;
|
|
}
|
|
if (ts.sys.directoryExists(directoryPath)) {
|
|
existingDirectories[directoryPath] = true;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function ensureDirectoriesExist(directoryPath) {
|
|
if (directoryPath.length > ts.getRootLength(directoryPath) && !directoryExists(directoryPath)) {
|
|
var parentDirectory = ts.getDirectoryPath(directoryPath);
|
|
ensureDirectoriesExist(parentDirectory);
|
|
ts.sys.createDirectory(directoryPath);
|
|
}
|
|
}
|
|
var outputFingerprints;
|
|
function writeFileIfUpdated(fileName, data, writeByteOrderMark) {
|
|
if (!outputFingerprints) {
|
|
outputFingerprints = {};
|
|
}
|
|
var hash = ts.sys.createHash(data);
|
|
var mtimeBefore = ts.sys.getModifiedTime(fileName);
|
|
if (mtimeBefore && ts.hasProperty(outputFingerprints, fileName)) {
|
|
var fingerprint = outputFingerprints[fileName];
|
|
if (fingerprint.byteOrderMark === writeByteOrderMark &&
|
|
fingerprint.hash === hash &&
|
|
fingerprint.mtime.getTime() === mtimeBefore.getTime()) {
|
|
return;
|
|
}
|
|
}
|
|
ts.sys.writeFile(fileName, data, writeByteOrderMark);
|
|
var mtimeAfter = ts.sys.getModifiedTime(fileName);
|
|
outputFingerprints[fileName] = {
|
|
hash: hash,
|
|
byteOrderMark: writeByteOrderMark,
|
|
mtime: mtimeAfter
|
|
};
|
|
}
|
|
function writeFile(fileName, data, writeByteOrderMark, onError) {
|
|
try {
|
|
var start = new Date().getTime();
|
|
ensureDirectoriesExist(ts.getDirectoryPath(ts.normalizePath(fileName)));
|
|
if (ts.isWatchSet(options) && ts.sys.createHash && ts.sys.getModifiedTime) {
|
|
writeFileIfUpdated(fileName, data, writeByteOrderMark);
|
|
}
|
|
else {
|
|
ts.sys.writeFile(fileName, data, writeByteOrderMark);
|
|
}
|
|
ts.ioWriteTime += new Date().getTime() - start;
|
|
}
|
|
catch (e) {
|
|
if (onError) {
|
|
onError(e.message);
|
|
}
|
|
}
|
|
}
|
|
function getDefaultLibLocation() {
|
|
return ts.getDirectoryPath(ts.normalizePath(ts.sys.getExecutingFilePath()));
|
|
}
|
|
var newLine = ts.getNewLineCharacter(options);
|
|
var realpath = ts.sys.realpath && (function (path) { return ts.sys.realpath(path); });
|
|
return {
|
|
getSourceFile: getSourceFile,
|
|
getDefaultLibLocation: getDefaultLibLocation,
|
|
getDefaultLibFileName: function (options) { return ts.combinePaths(getDefaultLibLocation(), ts.getDefaultLibFileName(options)); },
|
|
writeFile: writeFile,
|
|
getCurrentDirectory: ts.memoize(function () { return ts.sys.getCurrentDirectory(); }),
|
|
useCaseSensitiveFileNames: function () { return ts.sys.useCaseSensitiveFileNames; },
|
|
getCanonicalFileName: getCanonicalFileName,
|
|
getNewLine: function () { return newLine; },
|
|
fileExists: function (fileName) { return ts.sys.fileExists(fileName); },
|
|
readFile: function (fileName) { return ts.sys.readFile(fileName); },
|
|
trace: function (s) { return ts.sys.write(s + newLine); },
|
|
directoryExists: function (directoryName) { return ts.sys.directoryExists(directoryName); },
|
|
getDirectories: function (path) { return ts.sys.getDirectories(path); },
|
|
realpath: realpath
|
|
};
|
|
}
|
|
ts.createCompilerHost = createCompilerHost;
|
|
function getPreEmitDiagnostics(program, sourceFile, cancellationToken) {
|
|
var diagnostics = program.getOptionsDiagnostics(cancellationToken).concat(program.getSyntacticDiagnostics(sourceFile, cancellationToken), program.getGlobalDiagnostics(cancellationToken), program.getSemanticDiagnostics(sourceFile, cancellationToken));
|
|
if (program.getCompilerOptions().declaration) {
|
|
diagnostics = diagnostics.concat(program.getDeclarationDiagnostics(sourceFile, cancellationToken));
|
|
}
|
|
return ts.sortAndDeduplicateDiagnostics(diagnostics);
|
|
}
|
|
ts.getPreEmitDiagnostics = getPreEmitDiagnostics;
|
|
function formatDiagnostics(diagnostics, host) {
|
|
var output = "";
|
|
for (var _i = 0, diagnostics_1 = diagnostics; _i < diagnostics_1.length; _i++) {
|
|
var diagnostic = diagnostics_1[_i];
|
|
if (diagnostic.file) {
|
|
var _a = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start), line = _a.line, character = _a.character;
|
|
var fileName = diagnostic.file.fileName;
|
|
var relativeFileName = ts.convertToRelativePath(fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); });
|
|
output += relativeFileName + "(" + (line + 1) + "," + (character + 1) + "): ";
|
|
}
|
|
var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();
|
|
output += category + " TS" + diagnostic.code + ": " + flattenDiagnosticMessageText(diagnostic.messageText, host.getNewLine()) + host.getNewLine();
|
|
}
|
|
return output;
|
|
}
|
|
ts.formatDiagnostics = formatDiagnostics;
|
|
function flattenDiagnosticMessageText(messageText, newLine) {
|
|
if (typeof messageText === "string") {
|
|
return messageText;
|
|
}
|
|
else {
|
|
var diagnosticChain = messageText;
|
|
var result = "";
|
|
var indent = 0;
|
|
while (diagnosticChain) {
|
|
if (indent) {
|
|
result += newLine;
|
|
for (var i = 0; i < indent; i++) {
|
|
result += " ";
|
|
}
|
|
}
|
|
result += diagnosticChain.messageText;
|
|
indent++;
|
|
diagnosticChain = diagnosticChain.next;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
ts.flattenDiagnosticMessageText = flattenDiagnosticMessageText;
|
|
function loadWithLocalCache(names, containingFile, loader) {
|
|
if (names.length === 0) {
|
|
return [];
|
|
}
|
|
var resolutions = [];
|
|
var cache = {};
|
|
for (var _i = 0, names_1 = names; _i < names_1.length; _i++) {
|
|
var name_34 = names_1[_i];
|
|
var result = void 0;
|
|
if (ts.hasProperty(cache, name_34)) {
|
|
result = cache[name_34];
|
|
}
|
|
else {
|
|
result = loader(name_34, containingFile);
|
|
cache[name_34] = result;
|
|
}
|
|
resolutions.push(result);
|
|
}
|
|
return resolutions;
|
|
}
|
|
function getInferredTypesRoot(options, rootFiles, host) {
|
|
return computeCommonSourceDirectoryOfFilenames(rootFiles, host.getCurrentDirectory(), function (f) { return host.getCanonicalFileName(f); });
|
|
}
|
|
function getAutomaticTypeDirectiveNames(options, rootFiles, host) {
|
|
if (options.types) {
|
|
return options.types;
|
|
}
|
|
var result = [];
|
|
if (host.directoryExists && host.getDirectories) {
|
|
var typeRoots = getEffectiveTypeRoots(options, host);
|
|
if (typeRoots) {
|
|
for (var _i = 0, typeRoots_1 = typeRoots; _i < typeRoots_1.length; _i++) {
|
|
var root = typeRoots_1[_i];
|
|
if (host.directoryExists(root)) {
|
|
result = result.concat(host.getDirectories(root));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
ts.getAutomaticTypeDirectiveNames = getAutomaticTypeDirectiveNames;
|
|
function createProgram(rootNames, options, host, oldProgram) {
|
|
var program;
|
|
var files = [];
|
|
var commonSourceDirectory;
|
|
var diagnosticsProducingTypeChecker;
|
|
var noDiagnosticsTypeChecker;
|
|
var classifiableNames;
|
|
var resolvedTypeReferenceDirectives = {};
|
|
var fileProcessingDiagnostics = ts.createDiagnosticCollection();
|
|
var maxNodeModulesJsDepth = typeof options.maxNodeModuleJsDepth === "number" ? options.maxNodeModuleJsDepth : 2;
|
|
var currentNodeModulesDepth = 0;
|
|
var modulesWithElidedImports = {};
|
|
var sourceFilesFoundSearchingNodeModules = {};
|
|
var start = new Date().getTime();
|
|
host = host || createCompilerHost(options);
|
|
var skipDefaultLib = options.noLib;
|
|
var programDiagnostics = ts.createDiagnosticCollection();
|
|
var currentDirectory = host.getCurrentDirectory();
|
|
var supportedExtensions = ts.getSupportedExtensions(options);
|
|
var hasEmitBlockingDiagnostics = ts.createFileMap(getCanonicalFileName);
|
|
var resolveModuleNamesWorker;
|
|
if (host.resolveModuleNames) {
|
|
resolveModuleNamesWorker = function (moduleNames, containingFile) { return host.resolveModuleNames(moduleNames, containingFile); };
|
|
}
|
|
else {
|
|
var loader_1 = function (moduleName, containingFile) { return resolveModuleName(moduleName, containingFile, options, host).resolvedModule; };
|
|
resolveModuleNamesWorker = function (moduleNames, containingFile) { return loadWithLocalCache(moduleNames, containingFile, loader_1); };
|
|
}
|
|
var resolveTypeReferenceDirectiveNamesWorker;
|
|
if (host.resolveTypeReferenceDirectives) {
|
|
resolveTypeReferenceDirectiveNamesWorker = function (typeDirectiveNames, containingFile) { return host.resolveTypeReferenceDirectives(typeDirectiveNames, containingFile); };
|
|
}
|
|
else {
|
|
var loader_2 = function (typesRef, containingFile) { return resolveTypeReferenceDirective(typesRef, containingFile, options, host).resolvedTypeReferenceDirective; };
|
|
resolveTypeReferenceDirectiveNamesWorker = function (typeReferenceDirectiveNames, containingFile) { return loadWithLocalCache(typeReferenceDirectiveNames, containingFile, loader_2); };
|
|
}
|
|
var filesByName = ts.createFileMap();
|
|
var filesByNameIgnoreCase = host.useCaseSensitiveFileNames() ? ts.createFileMap(function (fileName) { return fileName.toLowerCase(); }) : undefined;
|
|
if (!tryReuseStructureFromOldProgram()) {
|
|
ts.forEach(rootNames, function (name) { return processRootFile(name, false); });
|
|
var typeReferences = getAutomaticTypeDirectiveNames(options, rootNames, host);
|
|
if (typeReferences) {
|
|
var inferredRoot = getInferredTypesRoot(options, rootNames, host);
|
|
var containingFilename = ts.combinePaths(inferredRoot, "__inferred type names__.ts");
|
|
var resolutions = resolveTypeReferenceDirectiveNamesWorker(typeReferences, containingFilename);
|
|
for (var i = 0; i < typeReferences.length; i++) {
|
|
processTypeReferenceDirective(typeReferences[i], resolutions[i]);
|
|
}
|
|
}
|
|
if (!skipDefaultLib) {
|
|
if (!options.lib) {
|
|
processRootFile(host.getDefaultLibFileName(options), true);
|
|
}
|
|
else {
|
|
var libDirectory_1 = host.getDefaultLibLocation ? host.getDefaultLibLocation() : ts.getDirectoryPath(host.getDefaultLibFileName(options));
|
|
ts.forEach(options.lib, function (libFileName) {
|
|
processRootFile(ts.combinePaths(libDirectory_1, libFileName), true);
|
|
});
|
|
}
|
|
}
|
|
}
|
|
oldProgram = undefined;
|
|
program = {
|
|
getRootFileNames: function () { return rootNames; },
|
|
getSourceFile: getSourceFile,
|
|
getSourceFileByPath: getSourceFileByPath,
|
|
getSourceFiles: function () { return files; },
|
|
getCompilerOptions: function () { return options; },
|
|
getSyntacticDiagnostics: getSyntacticDiagnostics,
|
|
getOptionsDiagnostics: getOptionsDiagnostics,
|
|
getGlobalDiagnostics: getGlobalDiagnostics,
|
|
getSemanticDiagnostics: getSemanticDiagnostics,
|
|
getDeclarationDiagnostics: getDeclarationDiagnostics,
|
|
getTypeChecker: getTypeChecker,
|
|
getClassifiableNames: getClassifiableNames,
|
|
getDiagnosticsProducingTypeChecker: getDiagnosticsProducingTypeChecker,
|
|
getCommonSourceDirectory: getCommonSourceDirectory,
|
|
emit: emit,
|
|
getCurrentDirectory: function () { return currentDirectory; },
|
|
getNodeCount: function () { return getDiagnosticsProducingTypeChecker().getNodeCount(); },
|
|
getIdentifierCount: function () { return getDiagnosticsProducingTypeChecker().getIdentifierCount(); },
|
|
getSymbolCount: function () { return getDiagnosticsProducingTypeChecker().getSymbolCount(); },
|
|
getTypeCount: function () { return getDiagnosticsProducingTypeChecker().getTypeCount(); },
|
|
getFileProcessingDiagnostics: function () { return fileProcessingDiagnostics; },
|
|
getResolvedTypeReferenceDirectives: function () { return resolvedTypeReferenceDirectives; }
|
|
};
|
|
verifyCompilerOptions();
|
|
ts.programTime += new Date().getTime() - start;
|
|
return program;
|
|
function getCommonSourceDirectory() {
|
|
if (typeof commonSourceDirectory === "undefined") {
|
|
if (options.rootDir && checkSourceFilesBelongToPath(files, options.rootDir)) {
|
|
commonSourceDirectory = ts.getNormalizedAbsolutePath(options.rootDir, currentDirectory);
|
|
}
|
|
else {
|
|
commonSourceDirectory = computeCommonSourceDirectory(files);
|
|
}
|
|
if (commonSourceDirectory && commonSourceDirectory[commonSourceDirectory.length - 1] !== ts.directorySeparator) {
|
|
commonSourceDirectory += ts.directorySeparator;
|
|
}
|
|
}
|
|
return commonSourceDirectory;
|
|
}
|
|
function getClassifiableNames() {
|
|
if (!classifiableNames) {
|
|
getTypeChecker();
|
|
classifiableNames = {};
|
|
for (var _i = 0, files_2 = files; _i < files_2.length; _i++) {
|
|
var sourceFile = files_2[_i];
|
|
ts.copyMap(sourceFile.classifiableNames, classifiableNames);
|
|
}
|
|
}
|
|
return classifiableNames;
|
|
}
|
|
function tryReuseStructureFromOldProgram() {
|
|
if (!oldProgram) {
|
|
return false;
|
|
}
|
|
var oldOptions = oldProgram.getCompilerOptions();
|
|
if ((oldOptions.module !== options.module) ||
|
|
(oldOptions.moduleResolution !== options.moduleResolution) ||
|
|
(oldOptions.noResolve !== options.noResolve) ||
|
|
(oldOptions.target !== options.target) ||
|
|
(oldOptions.noLib !== options.noLib) ||
|
|
(oldOptions.jsx !== options.jsx) ||
|
|
(oldOptions.allowJs !== options.allowJs) ||
|
|
(oldOptions.rootDir !== options.rootDir) ||
|
|
(oldOptions.configFilePath !== options.configFilePath) ||
|
|
(oldOptions.baseUrl !== options.baseUrl) ||
|
|
(oldOptions.maxNodeModuleJsDepth !== options.maxNodeModuleJsDepth) ||
|
|
!ts.arrayIsEqualTo(oldOptions.typeRoots, oldOptions.typeRoots) ||
|
|
!ts.arrayIsEqualTo(oldOptions.rootDirs, options.rootDirs) ||
|
|
!ts.mapIsEqualTo(oldOptions.paths, options.paths)) {
|
|
return false;
|
|
}
|
|
ts.Debug.assert(!oldProgram.structureIsReused);
|
|
var oldRootNames = oldProgram.getRootFileNames();
|
|
if (!ts.arrayIsEqualTo(oldRootNames, rootNames)) {
|
|
return false;
|
|
}
|
|
if (!ts.arrayIsEqualTo(options.types, oldOptions.types)) {
|
|
return false;
|
|
}
|
|
var newSourceFiles = [];
|
|
var filePaths = [];
|
|
var modifiedSourceFiles = [];
|
|
for (var _i = 0, _a = oldProgram.getSourceFiles(); _i < _a.length; _i++) {
|
|
var oldSourceFile = _a[_i];
|
|
var newSourceFile = host.getSourceFileByPath
|
|
? host.getSourceFileByPath(oldSourceFile.fileName, oldSourceFile.path, options.target)
|
|
: host.getSourceFile(oldSourceFile.fileName, options.target);
|
|
if (!newSourceFile) {
|
|
return false;
|
|
}
|
|
newSourceFile.path = oldSourceFile.path;
|
|
filePaths.push(newSourceFile.path);
|
|
if (oldSourceFile !== newSourceFile) {
|
|
if (oldSourceFile.hasNoDefaultLib !== newSourceFile.hasNoDefaultLib) {
|
|
return false;
|
|
}
|
|
if (!ts.arrayIsEqualTo(oldSourceFile.referencedFiles, newSourceFile.referencedFiles, fileReferenceIsEqualTo)) {
|
|
return false;
|
|
}
|
|
collectExternalModuleReferences(newSourceFile);
|
|
if (!ts.arrayIsEqualTo(oldSourceFile.imports, newSourceFile.imports, moduleNameIsEqualTo)) {
|
|
return false;
|
|
}
|
|
if (!ts.arrayIsEqualTo(oldSourceFile.moduleAugmentations, newSourceFile.moduleAugmentations, moduleNameIsEqualTo)) {
|
|
return false;
|
|
}
|
|
if (!ts.arrayIsEqualTo(oldSourceFile.typeReferenceDirectives, newSourceFile.typeReferenceDirectives, fileReferenceIsEqualTo)) {
|
|
return false;
|
|
}
|
|
var newSourceFilePath = ts.getNormalizedAbsolutePath(newSourceFile.fileName, currentDirectory);
|
|
if (resolveModuleNamesWorker) {
|
|
var moduleNames = ts.map(ts.concatenate(newSourceFile.imports, newSourceFile.moduleAugmentations), getTextOfLiteral);
|
|
var resolutions = resolveModuleNamesWorker(moduleNames, newSourceFilePath);
|
|
var resolutionsChanged = ts.hasChangesInResolutions(moduleNames, resolutions, oldSourceFile.resolvedModules, ts.moduleResolutionIsEqualTo);
|
|
if (resolutionsChanged) {
|
|
return false;
|
|
}
|
|
}
|
|
if (resolveTypeReferenceDirectiveNamesWorker) {
|
|
var typesReferenceDirectives = ts.map(newSourceFile.typeReferenceDirectives, function (x) { return x.fileName; });
|
|
var resolutions = resolveTypeReferenceDirectiveNamesWorker(typesReferenceDirectives, newSourceFilePath);
|
|
var resolutionsChanged = ts.hasChangesInResolutions(typesReferenceDirectives, resolutions, oldSourceFile.resolvedTypeReferenceDirectiveNames, ts.typeDirectiveIsEqualTo);
|
|
if (resolutionsChanged) {
|
|
return false;
|
|
}
|
|
}
|
|
newSourceFile.resolvedModules = oldSourceFile.resolvedModules;
|
|
newSourceFile.resolvedTypeReferenceDirectiveNames = oldSourceFile.resolvedTypeReferenceDirectiveNames;
|
|
modifiedSourceFiles.push(newSourceFile);
|
|
}
|
|
else {
|
|
newSourceFile = oldSourceFile;
|
|
}
|
|
newSourceFiles.push(newSourceFile);
|
|
}
|
|
for (var i = 0, len = newSourceFiles.length; i < len; i++) {
|
|
filesByName.set(filePaths[i], newSourceFiles[i]);
|
|
}
|
|
files = newSourceFiles;
|
|
fileProcessingDiagnostics = oldProgram.getFileProcessingDiagnostics();
|
|
for (var _b = 0, modifiedSourceFiles_1 = modifiedSourceFiles; _b < modifiedSourceFiles_1.length; _b++) {
|
|
var modifiedFile = modifiedSourceFiles_1[_b];
|
|
fileProcessingDiagnostics.reattachFileDiagnostics(modifiedFile);
|
|
}
|
|
resolvedTypeReferenceDirectives = oldProgram.getResolvedTypeReferenceDirectives();
|
|
oldProgram.structureIsReused = true;
|
|
return true;
|
|
}
|
|
function getEmitHost(writeFileCallback) {
|
|
return {
|
|
getCanonicalFileName: getCanonicalFileName,
|
|
getCommonSourceDirectory: program.getCommonSourceDirectory,
|
|
getCompilerOptions: program.getCompilerOptions,
|
|
getCurrentDirectory: function () { return currentDirectory; },
|
|
getNewLine: function () { return host.getNewLine(); },
|
|
getSourceFile: program.getSourceFile,
|
|
getSourceFileByPath: program.getSourceFileByPath,
|
|
getSourceFiles: program.getSourceFiles,
|
|
isSourceFileFromExternalLibrary: function (file) { return !!ts.lookUp(sourceFilesFoundSearchingNodeModules, file.path); },
|
|
writeFile: writeFileCallback || (function (fileName, data, writeByteOrderMark, onError, sourceFiles) { return host.writeFile(fileName, data, writeByteOrderMark, onError, sourceFiles); }),
|
|
isEmitBlocked: isEmitBlocked
|
|
};
|
|
}
|
|
function getDiagnosticsProducingTypeChecker() {
|
|
return diagnosticsProducingTypeChecker || (diagnosticsProducingTypeChecker = ts.createTypeChecker(program, true));
|
|
}
|
|
function getTypeChecker() {
|
|
return noDiagnosticsTypeChecker || (noDiagnosticsTypeChecker = ts.createTypeChecker(program, false));
|
|
}
|
|
function emit(sourceFile, writeFileCallback, cancellationToken) {
|
|
return runWithCancellationToken(function () { return emitWorker(program, sourceFile, writeFileCallback, cancellationToken); });
|
|
}
|
|
function isEmitBlocked(emitFileName) {
|
|
return hasEmitBlockingDiagnostics.contains(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName));
|
|
}
|
|
function emitWorker(program, sourceFile, writeFileCallback, cancellationToken) {
|
|
var declarationDiagnostics = [];
|
|
if (options.noEmit) {
|
|
return { diagnostics: declarationDiagnostics, sourceMaps: undefined, emittedFiles: undefined, emitSkipped: true };
|
|
}
|
|
if (options.noEmitOnError) {
|
|
var diagnostics = program.getOptionsDiagnostics(cancellationToken).concat(program.getSyntacticDiagnostics(sourceFile, cancellationToken), program.getGlobalDiagnostics(cancellationToken), program.getSemanticDiagnostics(sourceFile, cancellationToken));
|
|
if (diagnostics.length === 0 && program.getCompilerOptions().declaration) {
|
|
declarationDiagnostics = program.getDeclarationDiagnostics(undefined, cancellationToken);
|
|
}
|
|
if (diagnostics.length > 0 || declarationDiagnostics.length > 0) {
|
|
return {
|
|
diagnostics: ts.concatenate(diagnostics, declarationDiagnostics),
|
|
sourceMaps: undefined,
|
|
emittedFiles: undefined,
|
|
emitSkipped: true
|
|
};
|
|
}
|
|
}
|
|
var emitResolver = getDiagnosticsProducingTypeChecker().getEmitResolver((options.outFile || options.out) ? undefined : sourceFile);
|
|
var start = new Date().getTime();
|
|
var emitResult = ts.emitFiles(emitResolver, getEmitHost(writeFileCallback), sourceFile);
|
|
ts.emitTime += new Date().getTime() - start;
|
|
return emitResult;
|
|
}
|
|
function getSourceFile(fileName) {
|
|
return getSourceFileByPath(ts.toPath(fileName, currentDirectory, getCanonicalFileName));
|
|
}
|
|
function getSourceFileByPath(path) {
|
|
return filesByName.get(path);
|
|
}
|
|
function getDiagnosticsHelper(sourceFile, getDiagnostics, cancellationToken) {
|
|
if (sourceFile) {
|
|
return getDiagnostics(sourceFile, cancellationToken);
|
|
}
|
|
var allDiagnostics = [];
|
|
ts.forEach(program.getSourceFiles(), function (sourceFile) {
|
|
if (cancellationToken) {
|
|
cancellationToken.throwIfCancellationRequested();
|
|
}
|
|
ts.addRange(allDiagnostics, getDiagnostics(sourceFile, cancellationToken));
|
|
});
|
|
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
|
|
}
|
|
function getSyntacticDiagnostics(sourceFile, cancellationToken) {
|
|
return getDiagnosticsHelper(sourceFile, getSyntacticDiagnosticsForFile, cancellationToken);
|
|
}
|
|
function getSemanticDiagnostics(sourceFile, cancellationToken) {
|
|
return getDiagnosticsHelper(sourceFile, getSemanticDiagnosticsForFile, cancellationToken);
|
|
}
|
|
function getDeclarationDiagnostics(sourceFile, cancellationToken) {
|
|
var options = program.getCompilerOptions();
|
|
if (!sourceFile || options.out || options.outFile) {
|
|
return getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
|
|
}
|
|
else {
|
|
return getDiagnosticsHelper(sourceFile, getDeclarationDiagnosticsForFile, cancellationToken);
|
|
}
|
|
}
|
|
function getSyntacticDiagnosticsForFile(sourceFile, cancellationToken) {
|
|
return sourceFile.parseDiagnostics;
|
|
}
|
|
function runWithCancellationToken(func) {
|
|
try {
|
|
return func();
|
|
}
|
|
catch (e) {
|
|
if (e instanceof ts.OperationCanceledException) {
|
|
noDiagnosticsTypeChecker = undefined;
|
|
diagnosticsProducingTypeChecker = undefined;
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
function getSemanticDiagnosticsForFile(sourceFile, cancellationToken) {
|
|
return runWithCancellationToken(function () {
|
|
var typeChecker = getDiagnosticsProducingTypeChecker();
|
|
ts.Debug.assert(!!sourceFile.bindDiagnostics);
|
|
var bindDiagnostics = sourceFile.bindDiagnostics;
|
|
var checkDiagnostics = ts.isSourceFileJavaScript(sourceFile) ?
|
|
getJavaScriptSemanticDiagnosticsForFile(sourceFile, cancellationToken) :
|
|
typeChecker.getDiagnostics(sourceFile, cancellationToken);
|
|
var fileProcessingDiagnosticsInFile = fileProcessingDiagnostics.getDiagnostics(sourceFile.fileName);
|
|
var programDiagnosticsInFile = programDiagnostics.getDiagnostics(sourceFile.fileName);
|
|
return bindDiagnostics.concat(checkDiagnostics).concat(fileProcessingDiagnosticsInFile).concat(programDiagnosticsInFile);
|
|
});
|
|
}
|
|
function getJavaScriptSemanticDiagnosticsForFile(sourceFile, cancellationToken) {
|
|
return runWithCancellationToken(function () {
|
|
var diagnostics = [];
|
|
walk(sourceFile);
|
|
return diagnostics;
|
|
function walk(node) {
|
|
if (!node) {
|
|
return false;
|
|
}
|
|
switch (node.kind) {
|
|
case 229:
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.import_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 235:
|
|
if (node.isExportEquals) {
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.export_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
break;
|
|
case 221:
|
|
var classDeclaration = node;
|
|
if (checkModifiers(classDeclaration.modifiers) ||
|
|
checkTypeParameters(classDeclaration.typeParameters)) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 251:
|
|
var heritageClause = node;
|
|
if (heritageClause.token === 106) {
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.implements_clauses_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
break;
|
|
case 222:
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.interface_declarations_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 225:
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.module_declarations_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 223:
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.type_aliases_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 147:
|
|
case 146:
|
|
case 148:
|
|
case 149:
|
|
case 150:
|
|
case 179:
|
|
case 220:
|
|
case 180:
|
|
case 220:
|
|
var functionDeclaration = node;
|
|
if (checkModifiers(functionDeclaration.modifiers) ||
|
|
checkTypeParameters(functionDeclaration.typeParameters) ||
|
|
checkTypeAnnotation(functionDeclaration.type)) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 200:
|
|
var variableStatement = node;
|
|
if (checkModifiers(variableStatement.modifiers)) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 218:
|
|
var variableDeclaration = node;
|
|
if (checkTypeAnnotation(variableDeclaration.type)) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 174:
|
|
case 175:
|
|
var expression = node;
|
|
if (expression.typeArguments && expression.typeArguments.length > 0) {
|
|
var start_2 = expression.typeArguments.pos;
|
|
diagnostics.push(ts.createFileDiagnostic(sourceFile, start_2, expression.typeArguments.end - start_2, ts.Diagnostics.type_arguments_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
break;
|
|
case 142:
|
|
var parameter = node;
|
|
if (parameter.modifiers) {
|
|
var start_3 = parameter.modifiers.pos;
|
|
diagnostics.push(ts.createFileDiagnostic(sourceFile, start_3, parameter.modifiers.end - start_3, ts.Diagnostics.parameter_modifiers_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
if (parameter.questionToken) {
|
|
diagnostics.push(ts.createDiagnosticForNode(parameter.questionToken, ts.Diagnostics._0_can_only_be_used_in_a_ts_file, "?"));
|
|
return true;
|
|
}
|
|
if (parameter.type) {
|
|
diagnostics.push(ts.createDiagnosticForNode(parameter.type, ts.Diagnostics.types_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
break;
|
|
case 145:
|
|
var propertyDeclaration = node;
|
|
if (propertyDeclaration.modifiers) {
|
|
for (var _i = 0, _a = propertyDeclaration.modifiers; _i < _a.length; _i++) {
|
|
var modifier = _a[_i];
|
|
if (modifier.kind !== 113) {
|
|
diagnostics.push(ts.createDiagnosticForNode(modifier, ts.Diagnostics._0_can_only_be_used_in_a_ts_file, ts.tokenToString(modifier.kind)));
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
if (checkTypeAnnotation(node.type)) {
|
|
return true;
|
|
}
|
|
break;
|
|
case 224:
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.enum_declarations_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 177:
|
|
var typeAssertionExpression = node;
|
|
diagnostics.push(ts.createDiagnosticForNode(typeAssertionExpression.type, ts.Diagnostics.type_assertion_expressions_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
case 143:
|
|
if (!options.experimentalDecorators) {
|
|
diagnostics.push(ts.createDiagnosticForNode(node, ts.Diagnostics.Experimental_support_for_decorators_is_a_feature_that_is_subject_to_change_in_a_future_release_Set_the_experimentalDecorators_option_to_remove_this_warning));
|
|
}
|
|
return true;
|
|
}
|
|
return ts.forEachChild(node, walk);
|
|
}
|
|
function checkTypeParameters(typeParameters) {
|
|
if (typeParameters) {
|
|
var start_4 = typeParameters.pos;
|
|
diagnostics.push(ts.createFileDiagnostic(sourceFile, start_4, typeParameters.end - start_4, ts.Diagnostics.type_parameter_declarations_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function checkTypeAnnotation(type) {
|
|
if (type) {
|
|
diagnostics.push(ts.createDiagnosticForNode(type, ts.Diagnostics.types_can_only_be_used_in_a_ts_file));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function checkModifiers(modifiers) {
|
|
if (modifiers) {
|
|
for (var _i = 0, modifiers_1 = modifiers; _i < modifiers_1.length; _i++) {
|
|
var modifier = modifiers_1[_i];
|
|
switch (modifier.kind) {
|
|
case 112:
|
|
case 110:
|
|
case 111:
|
|
case 128:
|
|
case 122:
|
|
diagnostics.push(ts.createDiagnosticForNode(modifier, ts.Diagnostics._0_can_only_be_used_in_a_ts_file, ts.tokenToString(modifier.kind)));
|
|
return true;
|
|
case 113:
|
|
case 82:
|
|
case 74:
|
|
case 77:
|
|
case 115:
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
});
|
|
}
|
|
function getDeclarationDiagnosticsWorker(sourceFile, cancellationToken) {
|
|
return runWithCancellationToken(function () {
|
|
var resolver = getDiagnosticsProducingTypeChecker().getEmitResolver(sourceFile, cancellationToken);
|
|
var writeFile = function () { };
|
|
return ts.getDeclarationDiagnostics(getEmitHost(writeFile), resolver, sourceFile);
|
|
});
|
|
}
|
|
function getDeclarationDiagnosticsForFile(sourceFile, cancellationToken) {
|
|
return ts.isDeclarationFile(sourceFile) ? [] : getDeclarationDiagnosticsWorker(sourceFile, cancellationToken);
|
|
}
|
|
function getOptionsDiagnostics() {
|
|
var allDiagnostics = [];
|
|
ts.addRange(allDiagnostics, fileProcessingDiagnostics.getGlobalDiagnostics());
|
|
ts.addRange(allDiagnostics, programDiagnostics.getGlobalDiagnostics());
|
|
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
|
|
}
|
|
function getGlobalDiagnostics() {
|
|
var allDiagnostics = [];
|
|
ts.addRange(allDiagnostics, getDiagnosticsProducingTypeChecker().getGlobalDiagnostics());
|
|
return ts.sortAndDeduplicateDiagnostics(allDiagnostics);
|
|
}
|
|
function hasExtension(fileName) {
|
|
return ts.getBaseFileName(fileName).indexOf(".") >= 0;
|
|
}
|
|
function processRootFile(fileName, isDefaultLib) {
|
|
processSourceFile(ts.normalizePath(fileName), isDefaultLib, true);
|
|
}
|
|
function fileReferenceIsEqualTo(a, b) {
|
|
return a.fileName === b.fileName;
|
|
}
|
|
function moduleNameIsEqualTo(a, b) {
|
|
return a.text === b.text;
|
|
}
|
|
function getTextOfLiteral(literal) {
|
|
return literal.text;
|
|
}
|
|
function collectExternalModuleReferences(file) {
|
|
if (file.imports) {
|
|
return;
|
|
}
|
|
var isJavaScriptFile = ts.isSourceFileJavaScript(file);
|
|
var isExternalModuleFile = ts.isExternalModule(file);
|
|
var imports;
|
|
var moduleAugmentations;
|
|
for (var _i = 0, _a = file.statements; _i < _a.length; _i++) {
|
|
var node = _a[_i];
|
|
collectModuleReferences(node, false);
|
|
if (isJavaScriptFile) {
|
|
collectRequireCalls(node);
|
|
}
|
|
}
|
|
file.imports = imports || emptyArray;
|
|
file.moduleAugmentations = moduleAugmentations || emptyArray;
|
|
return;
|
|
function collectModuleReferences(node, inAmbientModule) {
|
|
switch (node.kind) {
|
|
case 230:
|
|
case 229:
|
|
case 236:
|
|
var moduleNameExpr = ts.getExternalModuleName(node);
|
|
if (!moduleNameExpr || moduleNameExpr.kind !== 9) {
|
|
break;
|
|
}
|
|
if (!moduleNameExpr.text) {
|
|
break;
|
|
}
|
|
if (!inAmbientModule || !ts.isExternalModuleNameRelative(moduleNameExpr.text)) {
|
|
(imports || (imports = [])).push(moduleNameExpr);
|
|
}
|
|
break;
|
|
case 225:
|
|
if (ts.isAmbientModule(node) && (inAmbientModule || node.flags & 2 || ts.isDeclarationFile(file))) {
|
|
var moduleName = node.name;
|
|
if (isExternalModuleFile || (inAmbientModule && !ts.isExternalModuleNameRelative(moduleName.text))) {
|
|
(moduleAugmentations || (moduleAugmentations = [])).push(moduleName);
|
|
}
|
|
else if (!inAmbientModule) {
|
|
var body = node.body;
|
|
if (body) {
|
|
for (var _i = 0, _a = body.statements; _i < _a.length; _i++) {
|
|
var statement = _a[_i];
|
|
collectModuleReferences(statement, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function collectRequireCalls(node) {
|
|
if (ts.isRequireCall(node, true)) {
|
|
(imports || (imports = [])).push(node.arguments[0]);
|
|
}
|
|
else {
|
|
ts.forEachChild(node, collectRequireCalls);
|
|
}
|
|
}
|
|
}
|
|
function processSourceFile(fileName, isDefaultLib, isReference, refFile, refPos, refEnd) {
|
|
var diagnosticArgument;
|
|
var diagnostic;
|
|
if (hasExtension(fileName)) {
|
|
if (!options.allowNonTsExtensions && !ts.forEach(supportedExtensions, function (extension) { return ts.fileExtensionIs(host.getCanonicalFileName(fileName), extension); })) {
|
|
diagnostic = ts.Diagnostics.File_0_has_unsupported_extension_The_only_supported_extensions_are_1;
|
|
diagnosticArgument = [fileName, "'" + supportedExtensions.join("', '") + "'"];
|
|
}
|
|
else if (!findSourceFile(fileName, ts.toPath(fileName, currentDirectory, getCanonicalFileName), isDefaultLib, isReference, refFile, refPos, refEnd)) {
|
|
diagnostic = ts.Diagnostics.File_0_not_found;
|
|
diagnosticArgument = [fileName];
|
|
}
|
|
else if (refFile && host.getCanonicalFileName(fileName) === host.getCanonicalFileName(refFile.fileName)) {
|
|
diagnostic = ts.Diagnostics.A_file_cannot_have_a_reference_to_itself;
|
|
diagnosticArgument = [fileName];
|
|
}
|
|
}
|
|
else {
|
|
var nonTsFile = options.allowNonTsExtensions && findSourceFile(fileName, ts.toPath(fileName, currentDirectory, getCanonicalFileName), isDefaultLib, isReference, refFile, refPos, refEnd);
|
|
if (!nonTsFile) {
|
|
if (options.allowNonTsExtensions) {
|
|
diagnostic = ts.Diagnostics.File_0_not_found;
|
|
diagnosticArgument = [fileName];
|
|
}
|
|
else if (!ts.forEach(supportedExtensions, function (extension) { return findSourceFile(fileName + extension, ts.toPath(fileName + extension, currentDirectory, getCanonicalFileName), isDefaultLib, isReference, refFile, refPos, refEnd); })) {
|
|
diagnostic = ts.Diagnostics.File_0_not_found;
|
|
fileName += ".ts";
|
|
diagnosticArgument = [fileName];
|
|
}
|
|
}
|
|
}
|
|
if (diagnostic) {
|
|
if (refFile !== undefined && refEnd !== undefined && refPos !== undefined) {
|
|
fileProcessingDiagnostics.add(ts.createFileDiagnostic.apply(void 0, [refFile, refPos, refEnd - refPos, diagnostic].concat(diagnosticArgument)));
|
|
}
|
|
else {
|
|
fileProcessingDiagnostics.add(ts.createCompilerDiagnostic.apply(void 0, [diagnostic].concat(diagnosticArgument)));
|
|
}
|
|
}
|
|
}
|
|
function reportFileNamesDifferOnlyInCasingError(fileName, existingFileName, refFile, refPos, refEnd) {
|
|
if (refFile !== undefined && refPos !== undefined && refEnd !== undefined) {
|
|
fileProcessingDiagnostics.add(ts.createFileDiagnostic(refFile, refPos, refEnd - refPos, ts.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, fileName, existingFileName));
|
|
}
|
|
else {
|
|
fileProcessingDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.File_name_0_differs_from_already_included_file_name_1_only_in_casing, fileName, existingFileName));
|
|
}
|
|
}
|
|
function findSourceFile(fileName, path, isDefaultLib, isReference, refFile, refPos, refEnd) {
|
|
if (filesByName.contains(path)) {
|
|
var file_1 = filesByName.get(path);
|
|
if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) {
|
|
reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd);
|
|
}
|
|
if (file_1 && ts.lookUp(sourceFilesFoundSearchingNodeModules, file_1.path) && currentNodeModulesDepth == 0) {
|
|
sourceFilesFoundSearchingNodeModules[file_1.path] = false;
|
|
if (!options.noResolve) {
|
|
processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib);
|
|
processTypeReferenceDirectives(file_1);
|
|
}
|
|
modulesWithElidedImports[file_1.path] = false;
|
|
processImportedModules(file_1, ts.getDirectoryPath(fileName));
|
|
}
|
|
else if (file_1 && ts.lookUp(modulesWithElidedImports, file_1.path)) {
|
|
if (currentNodeModulesDepth < maxNodeModulesJsDepth) {
|
|
modulesWithElidedImports[file_1.path] = false;
|
|
processImportedModules(file_1, ts.getDirectoryPath(fileName));
|
|
}
|
|
}
|
|
return file_1;
|
|
}
|
|
var file = host.getSourceFile(fileName, options.target, function (hostErrorMessage) {
|
|
if (refFile !== undefined && refPos !== undefined && refEnd !== undefined) {
|
|
fileProcessingDiagnostics.add(ts.createFileDiagnostic(refFile, refPos, refEnd - refPos, ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
|
|
}
|
|
else {
|
|
fileProcessingDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
|
|
}
|
|
});
|
|
filesByName.set(path, file);
|
|
if (file) {
|
|
sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0);
|
|
file.path = path;
|
|
if (host.useCaseSensitiveFileNames()) {
|
|
var existingFile = filesByNameIgnoreCase.get(path);
|
|
if (existingFile) {
|
|
reportFileNamesDifferOnlyInCasingError(fileName, existingFile.fileName, refFile, refPos, refEnd);
|
|
}
|
|
else {
|
|
filesByNameIgnoreCase.set(path, file);
|
|
}
|
|
}
|
|
skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib;
|
|
var basePath = ts.getDirectoryPath(fileName);
|
|
if (!options.noResolve) {
|
|
processReferencedFiles(file, basePath, isDefaultLib);
|
|
processTypeReferenceDirectives(file);
|
|
}
|
|
processImportedModules(file, basePath);
|
|
if (isDefaultLib) {
|
|
files.unshift(file);
|
|
}
|
|
else {
|
|
files.push(file);
|
|
}
|
|
}
|
|
return file;
|
|
}
|
|
function processReferencedFiles(file, basePath, isDefaultLib) {
|
|
ts.forEach(file.referencedFiles, function (ref) {
|
|
var referencedFileName = resolveTripleslashReference(ref.fileName, file.fileName);
|
|
processSourceFile(referencedFileName, isDefaultLib, true, file, ref.pos, ref.end);
|
|
});
|
|
}
|
|
function processTypeReferenceDirectives(file) {
|
|
var typeDirectives = ts.map(file.typeReferenceDirectives, function (l) { return l.fileName; });
|
|
var resolutions = resolveTypeReferenceDirectiveNamesWorker(typeDirectives, file.fileName);
|
|
for (var i = 0; i < typeDirectives.length; i++) {
|
|
var ref = file.typeReferenceDirectives[i];
|
|
var resolvedTypeReferenceDirective = resolutions[i];
|
|
ts.setResolvedTypeReferenceDirective(file, ref.fileName, resolvedTypeReferenceDirective);
|
|
processTypeReferenceDirective(ref.fileName, resolvedTypeReferenceDirective, file, ref.pos, ref.end);
|
|
}
|
|
}
|
|
function processTypeReferenceDirective(typeReferenceDirective, resolvedTypeReferenceDirective, refFile, refPos, refEnd) {
|
|
var previousResolution = resolvedTypeReferenceDirectives[typeReferenceDirective];
|
|
if (previousResolution && previousResolution.primary) {
|
|
return;
|
|
}
|
|
var saveResolution = true;
|
|
if (resolvedTypeReferenceDirective) {
|
|
if (resolvedTypeReferenceDirective.primary) {
|
|
processSourceFile(resolvedTypeReferenceDirective.resolvedFileName, false, true, refFile, refPos, refEnd);
|
|
}
|
|
else {
|
|
if (previousResolution) {
|
|
var otherFileText = host.readFile(resolvedTypeReferenceDirective.resolvedFileName);
|
|
if (otherFileText !== getSourceFile(previousResolution.resolvedFileName).text) {
|
|
fileProcessingDiagnostics.add(createDiagnostic(refFile, refPos, refEnd, ts.Diagnostics.Conflicting_library_definitions_for_0_found_at_1_and_2_Copy_the_correct_file_to_the_typings_folder_to_resolve_this_conflict, typeReferenceDirective, resolvedTypeReferenceDirective.resolvedFileName, previousResolution.resolvedFileName));
|
|
}
|
|
saveResolution = false;
|
|
}
|
|
else {
|
|
processSourceFile(resolvedTypeReferenceDirective.resolvedFileName, false, true, refFile, refPos, refEnd);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
fileProcessingDiagnostics.add(createDiagnostic(refFile, refPos, refEnd, ts.Diagnostics.Cannot_find_type_definition_file_for_0, typeReferenceDirective));
|
|
}
|
|
if (saveResolution) {
|
|
resolvedTypeReferenceDirectives[typeReferenceDirective] = resolvedTypeReferenceDirective;
|
|
}
|
|
}
|
|
function createDiagnostic(refFile, refPos, refEnd, message) {
|
|
var args = [];
|
|
for (var _i = 4; _i < arguments.length; _i++) {
|
|
args[_i - 4] = arguments[_i];
|
|
}
|
|
if (refFile === undefined || refPos === undefined || refEnd === undefined) {
|
|
return ts.createCompilerDiagnostic.apply(void 0, [message].concat(args));
|
|
}
|
|
else {
|
|
return ts.createFileDiagnostic.apply(void 0, [refFile, refPos, refEnd - refPos, message].concat(args));
|
|
}
|
|
}
|
|
function getCanonicalFileName(fileName) {
|
|
return host.getCanonicalFileName(fileName);
|
|
}
|
|
function processImportedModules(file, basePath) {
|
|
collectExternalModuleReferences(file);
|
|
if (file.imports.length || file.moduleAugmentations.length) {
|
|
file.resolvedModules = {};
|
|
var moduleNames = ts.map(ts.concatenate(file.imports, file.moduleAugmentations), getTextOfLiteral);
|
|
var resolutions = resolveModuleNamesWorker(moduleNames, ts.getNormalizedAbsolutePath(file.fileName, currentDirectory));
|
|
for (var i = 0; i < moduleNames.length; i++) {
|
|
var resolution = resolutions[i];
|
|
ts.setResolvedModule(file, moduleNames[i], resolution);
|
|
var resolvedPath = resolution ? ts.toPath(resolution.resolvedFileName, currentDirectory, getCanonicalFileName) : undefined;
|
|
var isFromNodeModulesSearch = resolution && resolution.isExternalLibraryImport;
|
|
var isJsFileFromNodeModules = isFromNodeModulesSearch && ts.hasJavaScriptFileExtension(resolution.resolvedFileName);
|
|
if (isFromNodeModulesSearch) {
|
|
currentNodeModulesDepth++;
|
|
}
|
|
var elideImport = isJsFileFromNodeModules && currentNodeModulesDepth > maxNodeModulesJsDepth;
|
|
var shouldAddFile = resolution && !options.noResolve && i < file.imports.length && !elideImport;
|
|
if (elideImport) {
|
|
modulesWithElidedImports[file.path] = true;
|
|
}
|
|
else if (shouldAddFile) {
|
|
findSourceFile(resolution.resolvedFileName, resolvedPath, false, false, file, ts.skipTrivia(file.text, file.imports[i].pos), file.imports[i].end);
|
|
}
|
|
if (isFromNodeModulesSearch) {
|
|
currentNodeModulesDepth--;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
file.resolvedModules = undefined;
|
|
}
|
|
return;
|
|
}
|
|
function computeCommonSourceDirectory(sourceFiles) {
|
|
var fileNames = [];
|
|
for (var _i = 0, sourceFiles_2 = sourceFiles; _i < sourceFiles_2.length; _i++) {
|
|
var file = sourceFiles_2[_i];
|
|
if (!file.isDeclarationFile) {
|
|
fileNames.push(file.fileName);
|
|
}
|
|
}
|
|
return computeCommonSourceDirectoryOfFilenames(fileNames, currentDirectory, getCanonicalFileName);
|
|
}
|
|
function checkSourceFilesBelongToPath(sourceFiles, rootDirectory) {
|
|
var allFilesBelongToPath = true;
|
|
if (sourceFiles) {
|
|
var absoluteRootDirectoryPath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(rootDirectory, currentDirectory));
|
|
for (var _i = 0, sourceFiles_3 = sourceFiles; _i < sourceFiles_3.length; _i++) {
|
|
var sourceFile = sourceFiles_3[_i];
|
|
if (!ts.isDeclarationFile(sourceFile)) {
|
|
var absoluteSourceFilePath = host.getCanonicalFileName(ts.getNormalizedAbsolutePath(sourceFile.fileName, currentDirectory));
|
|
if (absoluteSourceFilePath.indexOf(absoluteRootDirectoryPath) !== 0) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_is_not_under_rootDir_1_rootDir_is_expected_to_contain_all_source_files, sourceFile.fileName, options.rootDir));
|
|
allFilesBelongToPath = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return allFilesBelongToPath;
|
|
}
|
|
function verifyCompilerOptions() {
|
|
if (options.isolatedModules) {
|
|
if (options.declaration) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "declaration", "isolatedModules"));
|
|
}
|
|
if (options.noEmitOnError) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "noEmitOnError", "isolatedModules"));
|
|
}
|
|
if (options.out) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "isolatedModules"));
|
|
}
|
|
if (options.outFile) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "outFile", "isolatedModules"));
|
|
}
|
|
}
|
|
if (options.inlineSourceMap) {
|
|
if (options.sourceMap) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "sourceMap", "inlineSourceMap"));
|
|
}
|
|
if (options.mapRoot) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "mapRoot", "inlineSourceMap"));
|
|
}
|
|
}
|
|
if (options.paths && options.baseUrl === undefined) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_paths_cannot_be_used_without_specifying_baseUrl_option));
|
|
}
|
|
if (options.paths) {
|
|
for (var key in options.paths) {
|
|
if (!ts.hasProperty(options.paths, key)) {
|
|
continue;
|
|
}
|
|
if (!hasZeroOrOneAsteriskCharacter(key)) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Pattern_0_can_have_at_most_one_Asterisk_character, key));
|
|
}
|
|
if (ts.isArray(options.paths[key])) {
|
|
for (var _i = 0, _a = options.paths[key]; _i < _a.length; _i++) {
|
|
var subst = _a[_i];
|
|
var typeOfSubst = typeof subst;
|
|
if (typeOfSubst === "string") {
|
|
if (!hasZeroOrOneAsteriskCharacter(subst)) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Substitution_0_in_pattern_1_in_can_have_at_most_one_Asterisk_character, subst, key));
|
|
}
|
|
}
|
|
else {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Substitution_0_for_pattern_1_has_incorrect_type_expected_string_got_2, subst, key, typeOfSubst));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Substitutions_for_pattern_0_should_be_an_array, key));
|
|
}
|
|
}
|
|
}
|
|
if (!options.sourceMap && !options.inlineSourceMap) {
|
|
if (options.inlineSources) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "inlineSources"));
|
|
}
|
|
if (options.sourceRoot) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided, "sourceRoot"));
|
|
}
|
|
}
|
|
if (options.out && options.outFile) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "out", "outFile"));
|
|
}
|
|
if (options.mapRoot && !options.sourceMap) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "mapRoot", "sourceMap"));
|
|
}
|
|
if (options.declarationDir) {
|
|
if (!options.declaration) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "declarationDir", "declaration"));
|
|
}
|
|
if (options.out || options.outFile) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "declarationDir", options.out ? "out" : "outFile"));
|
|
}
|
|
}
|
|
if (options.lib && options.noLib) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "lib", "noLib"));
|
|
}
|
|
var languageVersion = options.target || 0;
|
|
var outFile = options.outFile || options.out;
|
|
var firstExternalModuleSourceFile = ts.forEach(files, function (f) { return ts.isExternalModule(f) ? f : undefined; });
|
|
if (options.isolatedModules) {
|
|
if (options.module === ts.ModuleKind.None && languageVersion < 2) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_isolatedModules_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES2015_or_higher));
|
|
}
|
|
var firstNonExternalModuleSourceFile = ts.forEach(files, function (f) { return !ts.isExternalModule(f) && !ts.isDeclarationFile(f) ? f : undefined; });
|
|
if (firstNonExternalModuleSourceFile) {
|
|
var span = ts.getErrorSpanForNode(firstNonExternalModuleSourceFile, firstNonExternalModuleSourceFile);
|
|
programDiagnostics.add(ts.createFileDiagnostic(firstNonExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_namespaces_when_the_isolatedModules_flag_is_provided));
|
|
}
|
|
}
|
|
else if (firstExternalModuleSourceFile && languageVersion < 2 && options.module === ts.ModuleKind.None) {
|
|
var span = ts.getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
|
|
programDiagnostics.add(ts.createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_use_imports_exports_or_module_augmentations_when_module_is_none));
|
|
}
|
|
if (outFile) {
|
|
if (options.module && !(options.module === ts.ModuleKind.AMD || options.module === ts.ModuleKind.System)) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile"));
|
|
}
|
|
else if (options.module === undefined && firstExternalModuleSourceFile) {
|
|
var span = ts.getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
|
|
programDiagnostics.add(ts.createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, ts.Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_amd_or_system, options.out ? "out" : "outFile"));
|
|
}
|
|
}
|
|
if (options.outDir ||
|
|
options.sourceRoot ||
|
|
options.mapRoot) {
|
|
var dir = getCommonSourceDirectory();
|
|
if (options.outDir && dir === "" && ts.forEach(files, function (file) { return ts.getRootLength(file.fileName) > 1; })) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_find_the_common_subdirectory_path_for_the_input_files));
|
|
}
|
|
}
|
|
if (!options.noEmit && options.allowJs && options.declaration) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_with_option_1, "allowJs", "declaration"));
|
|
}
|
|
if (options.emitDecoratorMetadata &&
|
|
!options.experimentalDecorators) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "emitDecoratorMetadata", "experimentalDecorators"));
|
|
}
|
|
if (options.reactNamespace && !ts.isIdentifier(options.reactNamespace, languageVersion)) {
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Invalid_value_for_reactNamespace_0_is_not_a_valid_identifier, options.reactNamespace));
|
|
}
|
|
if (!options.noEmit && !options.suppressOutputPathCheck) {
|
|
var emitHost = getEmitHost();
|
|
var emitFilesSeen_1 = ts.createFileMap(!host.useCaseSensitiveFileNames() ? function (key) { return key.toLocaleLowerCase(); } : undefined);
|
|
ts.forEachExpectedEmitFile(emitHost, function (emitFileNames, sourceFiles, isBundledEmit) {
|
|
verifyEmitFilePath(emitFileNames.jsFilePath, emitFilesSeen_1);
|
|
verifyEmitFilePath(emitFileNames.declarationFilePath, emitFilesSeen_1);
|
|
});
|
|
}
|
|
function verifyEmitFilePath(emitFileName, emitFilesSeen) {
|
|
if (emitFileName) {
|
|
var emitFilePath = ts.toPath(emitFileName, currentDirectory, getCanonicalFileName);
|
|
if (filesByName.contains(emitFilePath)) {
|
|
createEmitBlockingDiagnostics(emitFileName, emitFilePath, ts.Diagnostics.Cannot_write_file_0_because_it_would_overwrite_input_file);
|
|
}
|
|
if (emitFilesSeen.contains(emitFilePath)) {
|
|
createEmitBlockingDiagnostics(emitFileName, emitFilePath, ts.Diagnostics.Cannot_write_file_0_because_it_would_be_overwritten_by_multiple_input_files);
|
|
}
|
|
else {
|
|
emitFilesSeen.set(emitFilePath, true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function createEmitBlockingDiagnostics(emitFileName, emitFilePath, message) {
|
|
hasEmitBlockingDiagnostics.set(ts.toPath(emitFileName, currentDirectory, getCanonicalFileName), true);
|
|
programDiagnostics.add(ts.createCompilerDiagnostic(message, emitFileName));
|
|
}
|
|
}
|
|
ts.createProgram = createProgram;
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
ts.optionDeclarations = [
|
|
{
|
|
name: "charset",
|
|
type: "string"
|
|
},
|
|
{
|
|
name: "declaration",
|
|
shortName: "d",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Generates_corresponding_d_ts_file
|
|
},
|
|
{
|
|
name: "declarationDir",
|
|
type: "string",
|
|
isFilePath: true,
|
|
paramType: ts.Diagnostics.DIRECTORY
|
|
},
|
|
{
|
|
name: "diagnostics",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "emitBOM",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "help",
|
|
shortName: "h",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Print_this_message
|
|
},
|
|
{
|
|
name: "help",
|
|
shortName: "?",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "init",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Initializes_a_TypeScript_project_and_creates_a_tsconfig_json_file
|
|
},
|
|
{
|
|
name: "inlineSourceMap",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "inlineSources",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "jsx",
|
|
type: {
|
|
"preserve": 1,
|
|
"react": 2
|
|
},
|
|
paramType: ts.Diagnostics.KIND,
|
|
description: ts.Diagnostics.Specify_JSX_code_generation_Colon_preserve_or_react
|
|
},
|
|
{
|
|
name: "reactNamespace",
|
|
type: "string",
|
|
description: ts.Diagnostics.Specify_the_object_invoked_for_createElement_and_spread_when_targeting_react_JSX_emit
|
|
},
|
|
{
|
|
name: "listFiles",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "locale",
|
|
type: "string"
|
|
},
|
|
{
|
|
name: "mapRoot",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Specify_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations,
|
|
paramType: ts.Diagnostics.LOCATION
|
|
},
|
|
{
|
|
name: "module",
|
|
shortName: "m",
|
|
type: {
|
|
"none": ts.ModuleKind.None,
|
|
"commonjs": ts.ModuleKind.CommonJS,
|
|
"amd": ts.ModuleKind.AMD,
|
|
"system": ts.ModuleKind.System,
|
|
"umd": ts.ModuleKind.UMD,
|
|
"es6": ts.ModuleKind.ES6,
|
|
"es2015": ts.ModuleKind.ES2015
|
|
},
|
|
description: ts.Diagnostics.Specify_module_code_generation_Colon_commonjs_amd_system_umd_or_es2015,
|
|
paramType: ts.Diagnostics.KIND
|
|
},
|
|
{
|
|
name: "newLine",
|
|
type: {
|
|
"crlf": 0,
|
|
"lf": 1
|
|
},
|
|
description: ts.Diagnostics.Specify_the_end_of_line_sequence_to_be_used_when_emitting_files_Colon_CRLF_dos_or_LF_unix,
|
|
paramType: ts.Diagnostics.NEWLINE
|
|
},
|
|
{
|
|
name: "noEmit",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_emit_outputs
|
|
},
|
|
{
|
|
name: "noEmitHelpers",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "noEmitOnError",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_emit_outputs_if_any_errors_were_reported
|
|
},
|
|
{
|
|
name: "noImplicitAny",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Raise_error_on_expressions_and_declarations_with_an_implied_any_type
|
|
},
|
|
{
|
|
name: "noImplicitThis",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Raise_error_on_this_expressions_with_an_implied_any_type
|
|
},
|
|
{
|
|
name: "noUnusedLocals",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Report_errors_on_unused_locals
|
|
},
|
|
{
|
|
name: "noUnusedParameters",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Report_errors_on_unused_parameters
|
|
},
|
|
{
|
|
name: "noLib",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "noResolve",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "skipDefaultLibCheck",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "skipLibCheck",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Skip_type_checking_of_declaration_files
|
|
},
|
|
{
|
|
name: "out",
|
|
type: "string",
|
|
isFilePath: false,
|
|
paramType: ts.Diagnostics.FILE
|
|
},
|
|
{
|
|
name: "outFile",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Concatenate_and_emit_output_to_single_file,
|
|
paramType: ts.Diagnostics.FILE
|
|
},
|
|
{
|
|
name: "outDir",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Redirect_output_structure_to_the_directory,
|
|
paramType: ts.Diagnostics.DIRECTORY
|
|
},
|
|
{
|
|
name: "preserveConstEnums",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_erase_const_enum_declarations_in_generated_code
|
|
},
|
|
{
|
|
name: "pretty",
|
|
description: ts.Diagnostics.Stylize_errors_and_messages_using_color_and_context_experimental,
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "project",
|
|
shortName: "p",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Compile_the_project_in_the_given_directory,
|
|
paramType: ts.Diagnostics.DIRECTORY
|
|
},
|
|
{
|
|
name: "removeComments",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_emit_comments_to_output
|
|
},
|
|
{
|
|
name: "rootDir",
|
|
type: "string",
|
|
isFilePath: true,
|
|
paramType: ts.Diagnostics.LOCATION,
|
|
description: ts.Diagnostics.Specify_the_root_directory_of_input_files_Use_to_control_the_output_directory_structure_with_outDir
|
|
},
|
|
{
|
|
name: "isolatedModules",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "sourceMap",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Generates_corresponding_map_file
|
|
},
|
|
{
|
|
name: "sourceRoot",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Specify_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations,
|
|
paramType: ts.Diagnostics.LOCATION
|
|
},
|
|
{
|
|
name: "suppressExcessPropertyErrors",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Suppress_excess_property_checks_for_object_literals,
|
|
experimental: true
|
|
},
|
|
{
|
|
name: "suppressImplicitAnyIndexErrors",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Suppress_noImplicitAny_errors_for_indexing_objects_lacking_index_signatures
|
|
},
|
|
{
|
|
name: "stripInternal",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_emit_declarations_for_code_that_has_an_internal_annotation,
|
|
experimental: true
|
|
},
|
|
{
|
|
name: "target",
|
|
shortName: "t",
|
|
type: {
|
|
"es3": 0,
|
|
"es5": 1,
|
|
"es6": 2,
|
|
"es2015": 2
|
|
},
|
|
description: ts.Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_or_ES2015,
|
|
paramType: ts.Diagnostics.VERSION
|
|
},
|
|
{
|
|
name: "version",
|
|
shortName: "v",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Print_the_compiler_s_version
|
|
},
|
|
{
|
|
name: "watch",
|
|
shortName: "w",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Watch_input_files
|
|
},
|
|
{
|
|
name: "experimentalDecorators",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Enables_experimental_support_for_ES7_decorators
|
|
},
|
|
{
|
|
name: "emitDecoratorMetadata",
|
|
type: "boolean",
|
|
experimental: true,
|
|
description: ts.Diagnostics.Enables_experimental_support_for_emitting_type_metadata_for_decorators
|
|
},
|
|
{
|
|
name: "moduleResolution",
|
|
type: {
|
|
"node": ts.ModuleResolutionKind.NodeJs,
|
|
"classic": ts.ModuleResolutionKind.Classic
|
|
},
|
|
description: ts.Diagnostics.Specify_module_resolution_strategy_Colon_node_Node_js_or_classic_TypeScript_pre_1_6
|
|
},
|
|
{
|
|
name: "allowUnusedLabels",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_report_errors_on_unused_labels
|
|
},
|
|
{
|
|
name: "noImplicitReturns",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Report_error_when_not_all_code_paths_in_function_return_a_value
|
|
},
|
|
{
|
|
name: "noFallthroughCasesInSwitch",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Report_errors_for_fallthrough_cases_in_switch_statement
|
|
},
|
|
{
|
|
name: "allowUnreachableCode",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_report_errors_on_unreachable_code
|
|
},
|
|
{
|
|
name: "forceConsistentCasingInFileNames",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Disallow_inconsistently_cased_references_to_the_same_file
|
|
},
|
|
{
|
|
name: "baseUrl",
|
|
type: "string",
|
|
isFilePath: true,
|
|
description: ts.Diagnostics.Base_directory_to_resolve_non_absolute_module_names
|
|
},
|
|
{
|
|
name: "paths",
|
|
type: "object",
|
|
isTSConfigOnly: true
|
|
},
|
|
{
|
|
name: "rootDirs",
|
|
type: "list",
|
|
isTSConfigOnly: true,
|
|
element: {
|
|
name: "rootDirs",
|
|
type: "string",
|
|
isFilePath: true
|
|
}
|
|
},
|
|
{
|
|
name: "typeRoots",
|
|
type: "list",
|
|
element: {
|
|
name: "typeRoots",
|
|
type: "string",
|
|
isFilePath: true
|
|
}
|
|
},
|
|
{
|
|
name: "types",
|
|
type: "list",
|
|
element: {
|
|
name: "types",
|
|
type: "string"
|
|
},
|
|
description: ts.Diagnostics.Type_declaration_files_to_be_included_in_compilation
|
|
},
|
|
{
|
|
name: "traceResolution",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Enable_tracing_of_the_name_resolution_process
|
|
},
|
|
{
|
|
name: "allowJs",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Allow_javascript_files_to_be_compiled
|
|
},
|
|
{
|
|
name: "allowSyntheticDefaultImports",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typechecking
|
|
},
|
|
{
|
|
name: "noImplicitUseStrict",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Do_not_emit_use_strict_directives_in_module_output
|
|
},
|
|
{
|
|
name: "maxNodeModuleJsDepth",
|
|
type: "number",
|
|
description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files
|
|
},
|
|
{
|
|
name: "listEmittedFiles",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "lib",
|
|
type: "list",
|
|
element: {
|
|
name: "lib",
|
|
type: {
|
|
"es5": "lib.es5.d.ts",
|
|
"es6": "lib.es2015.d.ts",
|
|
"es2015": "lib.es2015.d.ts",
|
|
"es7": "lib.es2016.d.ts",
|
|
"es2016": "lib.es2016.d.ts",
|
|
"es2017": "lib.es2017.d.ts",
|
|
"dom": "lib.dom.d.ts",
|
|
"webworker": "lib.webworker.d.ts",
|
|
"scripthost": "lib.scripthost.d.ts",
|
|
"es2015.core": "lib.es2015.core.d.ts",
|
|
"es2015.collection": "lib.es2015.collection.d.ts",
|
|
"es2015.generator": "lib.es2015.generator.d.ts",
|
|
"es2015.iterable": "lib.es2015.iterable.d.ts",
|
|
"es2015.promise": "lib.es2015.promise.d.ts",
|
|
"es2015.proxy": "lib.es2015.proxy.d.ts",
|
|
"es2015.reflect": "lib.es2015.reflect.d.ts",
|
|
"es2015.symbol": "lib.es2015.symbol.d.ts",
|
|
"es2015.symbol.wellknown": "lib.es2015.symbol.wellknown.d.ts",
|
|
"es2016.array.include": "lib.es2016.array.include.d.ts",
|
|
"es2017.object": "lib.es2017.object.d.ts",
|
|
"es2017.sharedmemory": "lib.es2017.sharedmemory.d.ts"
|
|
}
|
|
},
|
|
description: ts.Diagnostics.Specify_library_files_to_be_included_in_the_compilation_Colon
|
|
},
|
|
{
|
|
name: "disableSizeLimit",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "strictNullChecks",
|
|
type: "boolean",
|
|
description: ts.Diagnostics.Enable_strict_null_checks
|
|
}
|
|
];
|
|
ts.typingOptionDeclarations = [
|
|
{
|
|
name: "enableAutoDiscovery",
|
|
type: "boolean"
|
|
},
|
|
{
|
|
name: "include",
|
|
type: "list",
|
|
element: {
|
|
name: "include",
|
|
type: "string"
|
|
}
|
|
},
|
|
{
|
|
name: "exclude",
|
|
type: "list",
|
|
element: {
|
|
name: "exclude",
|
|
type: "string"
|
|
}
|
|
}
|
|
];
|
|
var optionNameMapCache;
|
|
function getOptionNameMap() {
|
|
if (optionNameMapCache) {
|
|
return optionNameMapCache;
|
|
}
|
|
var optionNameMap = {};
|
|
var shortOptionNames = {};
|
|
ts.forEach(ts.optionDeclarations, function (option) {
|
|
optionNameMap[option.name.toLowerCase()] = option;
|
|
if (option.shortName) {
|
|
shortOptionNames[option.shortName] = option.name;
|
|
}
|
|
});
|
|
optionNameMapCache = { optionNameMap: optionNameMap, shortOptionNames: shortOptionNames };
|
|
return optionNameMapCache;
|
|
}
|
|
ts.getOptionNameMap = getOptionNameMap;
|
|
function createCompilerDiagnosticForInvalidCustomType(opt) {
|
|
var namesOfType = [];
|
|
ts.forEachKey(opt.type, function (key) {
|
|
namesOfType.push(" '" + key + "'");
|
|
});
|
|
return ts.createCompilerDiagnostic(ts.Diagnostics.Argument_for_0_option_must_be_Colon_1, "--" + opt.name, namesOfType);
|
|
}
|
|
ts.createCompilerDiagnosticForInvalidCustomType = createCompilerDiagnosticForInvalidCustomType;
|
|
function parseCustomTypeOption(opt, value, errors) {
|
|
var key = trimString((value || "")).toLowerCase();
|
|
var map = opt.type;
|
|
if (ts.hasProperty(map, key)) {
|
|
return map[key];
|
|
}
|
|
else {
|
|
errors.push(createCompilerDiagnosticForInvalidCustomType(opt));
|
|
}
|
|
}
|
|
ts.parseCustomTypeOption = parseCustomTypeOption;
|
|
function parseListTypeOption(opt, value, errors) {
|
|
if (value === void 0) { value = ""; }
|
|
value = trimString(value);
|
|
if (ts.startsWith(value, "-")) {
|
|
return undefined;
|
|
}
|
|
if (value === "") {
|
|
return [];
|
|
}
|
|
var values = value.split(",");
|
|
switch (opt.element.type) {
|
|
case "number":
|
|
return ts.map(values, parseInt);
|
|
case "string":
|
|
return ts.map(values, function (v) { return v || ""; });
|
|
default:
|
|
return ts.filter(ts.map(values, function (v) { return parseCustomTypeOption(opt.element, v, errors); }), function (v) { return !!v; });
|
|
}
|
|
}
|
|
ts.parseListTypeOption = parseListTypeOption;
|
|
function parseCommandLine(commandLine, readFile) {
|
|
var options = {};
|
|
var fileNames = [];
|
|
var errors = [];
|
|
var _a = getOptionNameMap(), optionNameMap = _a.optionNameMap, shortOptionNames = _a.shortOptionNames;
|
|
parseStrings(commandLine);
|
|
return {
|
|
options: options,
|
|
fileNames: fileNames,
|
|
errors: errors
|
|
};
|
|
function parseStrings(args) {
|
|
var i = 0;
|
|
while (i < args.length) {
|
|
var s = args[i];
|
|
i++;
|
|
if (s.charCodeAt(0) === 64) {
|
|
parseResponseFile(s.slice(1));
|
|
}
|
|
else if (s.charCodeAt(0) === 45) {
|
|
s = s.slice(s.charCodeAt(1) === 45 ? 2 : 1).toLowerCase();
|
|
if (ts.hasProperty(shortOptionNames, s)) {
|
|
s = shortOptionNames[s];
|
|
}
|
|
if (ts.hasProperty(optionNameMap, s)) {
|
|
var opt = optionNameMap[s];
|
|
if (opt.isTSConfigOnly) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Option_0_can_only_be_specified_in_tsconfig_json_file, opt.name));
|
|
}
|
|
else {
|
|
if (!args[i] && opt.type !== "boolean") {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_expects_an_argument, opt.name));
|
|
}
|
|
switch (opt.type) {
|
|
case "number":
|
|
options[opt.name] = parseInt(args[i]);
|
|
i++;
|
|
break;
|
|
case "boolean":
|
|
options[opt.name] = true;
|
|
break;
|
|
case "string":
|
|
options[opt.name] = args[i] || "";
|
|
i++;
|
|
break;
|
|
case "list":
|
|
var result = parseListTypeOption(opt, args[i], errors);
|
|
options[opt.name] = result || [];
|
|
if (result) {
|
|
i++;
|
|
}
|
|
break;
|
|
default:
|
|
options[opt.name] = parseCustomTypeOption(opt, args[i], errors);
|
|
i++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_compiler_option_0, s));
|
|
}
|
|
}
|
|
else {
|
|
fileNames.push(s);
|
|
}
|
|
}
|
|
}
|
|
function parseResponseFile(fileName) {
|
|
var text = readFile ? readFile(fileName) : ts.sys.readFile(fileName);
|
|
if (!text) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_0_not_found, fileName));
|
|
return;
|
|
}
|
|
var args = [];
|
|
var pos = 0;
|
|
while (true) {
|
|
while (pos < text.length && text.charCodeAt(pos) <= 32)
|
|
pos++;
|
|
if (pos >= text.length)
|
|
break;
|
|
var start = pos;
|
|
if (text.charCodeAt(start) === 34) {
|
|
pos++;
|
|
while (pos < text.length && text.charCodeAt(pos) !== 34)
|
|
pos++;
|
|
if (pos < text.length) {
|
|
args.push(text.substring(start + 1, pos));
|
|
pos++;
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unterminated_quoted_string_in_response_file_0, fileName));
|
|
}
|
|
}
|
|
else {
|
|
while (text.charCodeAt(pos) > 32)
|
|
pos++;
|
|
args.push(text.substring(start, pos));
|
|
}
|
|
}
|
|
parseStrings(args);
|
|
}
|
|
}
|
|
ts.parseCommandLine = parseCommandLine;
|
|
function readConfigFile(fileName, readFile) {
|
|
var text = "";
|
|
try {
|
|
text = readFile(fileName);
|
|
}
|
|
catch (e) {
|
|
return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, e.message) };
|
|
}
|
|
return parseConfigFileTextToJson(fileName, text);
|
|
}
|
|
ts.readConfigFile = readConfigFile;
|
|
function parseConfigFileTextToJson(fileName, jsonText) {
|
|
try {
|
|
var jsonTextWithoutComments = removeComments(jsonText);
|
|
return { config: /\S/.test(jsonTextWithoutComments) ? JSON.parse(jsonTextWithoutComments) : {} };
|
|
}
|
|
catch (e) {
|
|
return { error: ts.createCompilerDiagnostic(ts.Diagnostics.Failed_to_parse_file_0_Colon_1, fileName, e.message) };
|
|
}
|
|
}
|
|
ts.parseConfigFileTextToJson = parseConfigFileTextToJson;
|
|
function removeComments(jsonText) {
|
|
var output = "";
|
|
var scanner = ts.createScanner(1, false, 0, jsonText);
|
|
var token;
|
|
while ((token = scanner.scan()) !== 1) {
|
|
switch (token) {
|
|
case 2:
|
|
case 3:
|
|
output += scanner.getTokenText().replace(/\S/g, " ");
|
|
break;
|
|
default:
|
|
output += scanner.getTokenText();
|
|
break;
|
|
}
|
|
}
|
|
return output;
|
|
}
|
|
var ignoreFileNamePattern = /(\.min\.js$)|([\\/]\.[\w.])/;
|
|
function parseJsonConfigFileContent(json, host, basePath, existingOptions, configFileName) {
|
|
if (existingOptions === void 0) { existingOptions = {}; }
|
|
var errors = [];
|
|
var compilerOptions = convertCompilerOptionsFromJsonWorker(json["compilerOptions"], basePath, errors, configFileName);
|
|
var options = ts.extend(existingOptions, compilerOptions);
|
|
var typingOptions = convertTypingOptionsFromJsonWorker(json["typingOptions"], basePath, errors, configFileName);
|
|
options.configFilePath = configFileName;
|
|
var _a = getFileNames(errors), fileNames = _a.fileNames, wildcardDirectories = _a.wildcardDirectories;
|
|
return {
|
|
options: options,
|
|
fileNames: fileNames,
|
|
typingOptions: typingOptions,
|
|
raw: json,
|
|
errors: errors,
|
|
wildcardDirectories: wildcardDirectories
|
|
};
|
|
function getFileNames(errors) {
|
|
var fileNames;
|
|
if (ts.hasProperty(json, "files")) {
|
|
if (ts.isArray(json["files"])) {
|
|
fileNames = json["files"];
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "files", "Array"));
|
|
}
|
|
}
|
|
var includeSpecs;
|
|
if (ts.hasProperty(json, "include")) {
|
|
if (ts.isArray(json["include"])) {
|
|
includeSpecs = json["include"];
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "include", "Array"));
|
|
}
|
|
}
|
|
var excludeSpecs;
|
|
if (ts.hasProperty(json, "exclude")) {
|
|
if (ts.isArray(json["exclude"])) {
|
|
excludeSpecs = json["exclude"];
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, "exclude", "Array"));
|
|
}
|
|
}
|
|
else if (ts.hasProperty(json, "excludes")) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unknown_option_excludes_Did_you_mean_exclude));
|
|
}
|
|
else {
|
|
excludeSpecs = ["node_modules", "bower_components", "jspm_packages"];
|
|
}
|
|
var outDir = json["compilerOptions"] && json["compilerOptions"]["outDir"];
|
|
if (outDir) {
|
|
excludeSpecs.push(outDir);
|
|
}
|
|
if (fileNames === undefined && includeSpecs === undefined) {
|
|
includeSpecs = ["**/*"];
|
|
}
|
|
return matchFileNames(fileNames, includeSpecs, excludeSpecs, basePath, options, host, errors);
|
|
}
|
|
}
|
|
ts.parseJsonConfigFileContent = parseJsonConfigFileContent;
|
|
function convertCompilerOptionsFromJson(jsonOptions, basePath, configFileName) {
|
|
var errors = [];
|
|
var options = convertCompilerOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName);
|
|
return { options: options, errors: errors };
|
|
}
|
|
ts.convertCompilerOptionsFromJson = convertCompilerOptionsFromJson;
|
|
function convertTypingOptionsFromJson(jsonOptions, basePath, configFileName) {
|
|
var errors = [];
|
|
var options = convertTypingOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName);
|
|
return { options: options, errors: errors };
|
|
}
|
|
ts.convertTypingOptionsFromJson = convertTypingOptionsFromJson;
|
|
function convertCompilerOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName) {
|
|
var options = ts.getBaseFileName(configFileName) === "jsconfig.json" ? { allowJs: true } : {};
|
|
convertOptionsFromJson(ts.optionDeclarations, jsonOptions, basePath, options, ts.Diagnostics.Unknown_compiler_option_0, errors);
|
|
return options;
|
|
}
|
|
function convertTypingOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName) {
|
|
var options = ts.getBaseFileName(configFileName) === "jsconfig.json"
|
|
? { enableAutoDiscovery: true, include: [], exclude: [] }
|
|
: { enableAutoDiscovery: false, include: [], exclude: [] };
|
|
convertOptionsFromJson(ts.typingOptionDeclarations, jsonOptions, basePath, options, ts.Diagnostics.Unknown_typing_option_0, errors);
|
|
return options;
|
|
}
|
|
function convertOptionsFromJson(optionDeclarations, jsonOptions, basePath, defaultOptions, diagnosticMessage, errors) {
|
|
if (!jsonOptions) {
|
|
return;
|
|
}
|
|
var optionNameMap = ts.arrayToMap(optionDeclarations, function (opt) { return opt.name; });
|
|
for (var id in jsonOptions) {
|
|
if (ts.hasProperty(optionNameMap, id)) {
|
|
var opt = optionNameMap[id];
|
|
defaultOptions[opt.name] = convertJsonOption(opt, jsonOptions[id], basePath, errors);
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(diagnosticMessage, id));
|
|
}
|
|
}
|
|
}
|
|
function convertJsonOption(opt, value, basePath, errors) {
|
|
var optType = opt.type;
|
|
var expectedType = typeof optType === "string" ? optType : "string";
|
|
if (optType === "list" && ts.isArray(value)) {
|
|
return convertJsonOptionOfListType(opt, value, basePath, errors);
|
|
}
|
|
else if (typeof value === expectedType) {
|
|
if (typeof optType !== "string") {
|
|
return convertJsonOptionOfCustomType(opt, value, errors);
|
|
}
|
|
else {
|
|
if (opt.isFilePath) {
|
|
value = ts.normalizePath(ts.combinePaths(basePath, value));
|
|
if (value === "") {
|
|
value = ".";
|
|
}
|
|
}
|
|
}
|
|
return value;
|
|
}
|
|
else {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Compiler_option_0_requires_a_value_of_type_1, opt.name, expectedType));
|
|
}
|
|
}
|
|
function convertJsonOptionOfCustomType(opt, value, errors) {
|
|
var key = value.toLowerCase();
|
|
if (ts.hasProperty(opt.type, key)) {
|
|
return opt.type[key];
|
|
}
|
|
else {
|
|
errors.push(createCompilerDiagnosticForInvalidCustomType(opt));
|
|
}
|
|
}
|
|
function convertJsonOptionOfListType(option, values, basePath, errors) {
|
|
return ts.filter(ts.map(values, function (v) { return convertJsonOption(option.element, v, basePath, errors); }), function (v) { return !!v; });
|
|
}
|
|
function trimString(s) {
|
|
return typeof s.trim === "function" ? s.trim() : s.replace(/^[\s]+|[\s]+$/g, "");
|
|
}
|
|
var invalidTrailingRecursionPattern = /(^|\/)\*\*\/?$/;
|
|
var invalidMultipleRecursionPatterns = /(^|\/)\*\*\/(.*\/)?\*\*($|\/)/;
|
|
var invalidDotDotAfterRecursiveWildcardPattern = /(^|\/)\*\*\/(.*\/)?\.\.($|\/)/;
|
|
var watchRecursivePattern = /\/[^/]*?[*?][^/]*\//;
|
|
var wildcardDirectoryPattern = /^[^*?]*(?=\/[^/]*[*?])/;
|
|
function matchFileNames(fileNames, include, exclude, basePath, options, host, errors) {
|
|
basePath = ts.normalizePath(basePath);
|
|
var keyMapper = host.useCaseSensitiveFileNames ? caseSensitiveKeyMapper : caseInsensitiveKeyMapper;
|
|
var literalFileMap = {};
|
|
var wildcardFileMap = {};
|
|
if (include) {
|
|
include = validateSpecs(include, errors, false);
|
|
}
|
|
if (exclude) {
|
|
exclude = validateSpecs(exclude, errors, true);
|
|
}
|
|
var wildcardDirectories = getWildcardDirectories(include, exclude, basePath, host.useCaseSensitiveFileNames);
|
|
var supportedExtensions = ts.getSupportedExtensions(options);
|
|
if (fileNames) {
|
|
for (var _i = 0, fileNames_1 = fileNames; _i < fileNames_1.length; _i++) {
|
|
var fileName = fileNames_1[_i];
|
|
var file = ts.combinePaths(basePath, fileName);
|
|
literalFileMap[keyMapper(file)] = file;
|
|
}
|
|
}
|
|
if (include && include.length > 0) {
|
|
for (var _a = 0, _b = host.readDirectory(basePath, supportedExtensions, exclude, include); _a < _b.length; _a++) {
|
|
var file = _b[_a];
|
|
if (hasFileWithHigherPriorityExtension(file, literalFileMap, wildcardFileMap, supportedExtensions, keyMapper)) {
|
|
continue;
|
|
}
|
|
if (ignoreFileNamePattern.test(file)) {
|
|
continue;
|
|
}
|
|
removeWildcardFilesWithLowerPriorityExtension(file, wildcardFileMap, supportedExtensions, keyMapper);
|
|
var key = keyMapper(file);
|
|
if (!ts.hasProperty(literalFileMap, key) && !ts.hasProperty(wildcardFileMap, key)) {
|
|
wildcardFileMap[key] = file;
|
|
}
|
|
}
|
|
}
|
|
var literalFiles = ts.reduceProperties(literalFileMap, addFileToOutput, []);
|
|
var wildcardFiles = ts.reduceProperties(wildcardFileMap, addFileToOutput, []);
|
|
wildcardFiles.sort(host.useCaseSensitiveFileNames ? ts.compareStrings : ts.compareStringsCaseInsensitive);
|
|
return {
|
|
fileNames: literalFiles.concat(wildcardFiles),
|
|
wildcardDirectories: wildcardDirectories
|
|
};
|
|
}
|
|
function validateSpecs(specs, errors, allowTrailingRecursion) {
|
|
var validSpecs = [];
|
|
for (var _i = 0, specs_2 = specs; _i < specs_2.length; _i++) {
|
|
var spec = specs_2[_i];
|
|
if (!allowTrailingRecursion && invalidTrailingRecursionPattern.test(spec)) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_end_in_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, spec));
|
|
}
|
|
else if (invalidMultipleRecursionPatterns.test(spec)) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_multiple_recursive_directory_wildcards_Asterisk_Asterisk_Colon_0, spec));
|
|
}
|
|
else if (invalidDotDotAfterRecursiveWildcardPattern.test(spec)) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.File_specification_cannot_contain_a_parent_directory_that_appears_after_a_recursive_directory_wildcard_Asterisk_Asterisk_Colon_0, spec));
|
|
}
|
|
else {
|
|
validSpecs.push(spec);
|
|
}
|
|
}
|
|
return validSpecs;
|
|
}
|
|
function getWildcardDirectories(include, exclude, path, useCaseSensitiveFileNames) {
|
|
var rawExcludeRegex = ts.getRegularExpressionForWildcard(exclude, path, "exclude");
|
|
var excludeRegex = rawExcludeRegex && new RegExp(rawExcludeRegex, useCaseSensitiveFileNames ? "" : "i");
|
|
var wildcardDirectories = {};
|
|
if (include !== undefined) {
|
|
var recursiveKeys = [];
|
|
for (var _i = 0, include_1 = include; _i < include_1.length; _i++) {
|
|
var file = include_1[_i];
|
|
var name_35 = ts.normalizePath(ts.combinePaths(path, file));
|
|
if (excludeRegex && excludeRegex.test(name_35)) {
|
|
continue;
|
|
}
|
|
var match = wildcardDirectoryPattern.exec(name_35);
|
|
if (match) {
|
|
var key = useCaseSensitiveFileNames ? match[0] : match[0].toLowerCase();
|
|
var flags = watchRecursivePattern.test(name_35) ? 1 : 0;
|
|
var existingFlags = ts.getProperty(wildcardDirectories, key);
|
|
if (existingFlags === undefined || existingFlags < flags) {
|
|
wildcardDirectories[key] = flags;
|
|
if (flags === 1) {
|
|
recursiveKeys.push(key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (var key in wildcardDirectories) {
|
|
if (ts.hasProperty(wildcardDirectories, key)) {
|
|
for (var _a = 0, recursiveKeys_1 = recursiveKeys; _a < recursiveKeys_1.length; _a++) {
|
|
var recursiveKey = recursiveKeys_1[_a];
|
|
if (key !== recursiveKey && ts.containsPath(recursiveKey, key, path, !useCaseSensitiveFileNames)) {
|
|
delete wildcardDirectories[key];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return wildcardDirectories;
|
|
}
|
|
function hasFileWithHigherPriorityExtension(file, literalFiles, wildcardFiles, extensions, keyMapper) {
|
|
var extensionPriority = ts.getExtensionPriority(file, extensions);
|
|
var adjustedExtensionPriority = ts.adjustExtensionPriority(extensionPriority);
|
|
for (var i = 0; i < adjustedExtensionPriority; i++) {
|
|
var higherPriorityExtension = extensions[i];
|
|
var higherPriorityPath = keyMapper(ts.changeExtension(file, higherPriorityExtension));
|
|
if (ts.hasProperty(literalFiles, higherPriorityPath) || ts.hasProperty(wildcardFiles, higherPriorityPath)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function removeWildcardFilesWithLowerPriorityExtension(file, wildcardFiles, extensions, keyMapper) {
|
|
var extensionPriority = ts.getExtensionPriority(file, extensions);
|
|
var nextExtensionPriority = ts.getNextLowestExtensionPriority(extensionPriority);
|
|
for (var i = nextExtensionPriority; i < extensions.length; i++) {
|
|
var lowerPriorityExtension = extensions[i];
|
|
var lowerPriorityPath = keyMapper(ts.changeExtension(file, lowerPriorityExtension));
|
|
delete wildcardFiles[lowerPriorityPath];
|
|
}
|
|
}
|
|
function addFileToOutput(output, file) {
|
|
output.push(file);
|
|
return output;
|
|
}
|
|
function caseSensitiveKeyMapper(key) {
|
|
return key;
|
|
}
|
|
function caseInsensitiveKeyMapper(key) {
|
|
return key.toLowerCase();
|
|
}
|
|
})(ts || (ts = {}));
|
|
var ts;
|
|
(function (ts) {
|
|
var defaultFormatDiagnosticsHost = {
|
|
getCurrentDirectory: function () { return ts.sys.getCurrentDirectory(); },
|
|
getNewLine: function () { return ts.sys.newLine; },
|
|
getCanonicalFileName: ts.createGetCanonicalFileName(ts.sys.useCaseSensitiveFileNames)
|
|
};
|
|
var reportDiagnosticWorker = reportDiagnosticSimply;
|
|
function reportDiagnostic(diagnostic, host) {
|
|
reportDiagnosticWorker(diagnostic, host || defaultFormatDiagnosticsHost);
|
|
}
|
|
function reportDiagnostics(diagnostics, host) {
|
|
for (var _i = 0, diagnostics_2 = diagnostics; _i < diagnostics_2.length; _i++) {
|
|
var diagnostic = diagnostics_2[_i];
|
|
reportDiagnostic(diagnostic, host);
|
|
}
|
|
}
|
|
function reportEmittedFiles(files, host) {
|
|
if (!files || files.length == 0) {
|
|
return;
|
|
}
|
|
var currentDir = ts.sys.getCurrentDirectory();
|
|
for (var _i = 0, files_3 = files; _i < files_3.length; _i++) {
|
|
var file = files_3[_i];
|
|
var filepath = ts.getNormalizedAbsolutePath(file, currentDir);
|
|
ts.sys.write("TSFILE: " + filepath + ts.sys.newLine);
|
|
}
|
|
}
|
|
function validateLocaleAndSetLanguage(locale, errors) {
|
|
var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase());
|
|
if (!matchResult) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, "en", "ja-jp"));
|
|
return false;
|
|
}
|
|
var language = matchResult[1];
|
|
var territory = matchResult[3];
|
|
if (!trySetLanguageAndTerritory(language, territory, errors)) {
|
|
trySetLanguageAndTerritory(language, undefined, errors);
|
|
}
|
|
return true;
|
|
}
|
|
function trySetLanguageAndTerritory(language, territory, errors) {
|
|
var compilerFilePath = ts.normalizePath(ts.sys.getExecutingFilePath());
|
|
var containingDirectoryPath = ts.getDirectoryPath(compilerFilePath);
|
|
var filePath = ts.combinePaths(containingDirectoryPath, language);
|
|
if (territory) {
|
|
filePath = filePath + "-" + territory;
|
|
}
|
|
filePath = ts.sys.resolvePath(ts.combinePaths(filePath, "diagnosticMessages.generated.json"));
|
|
if (!ts.sys.fileExists(filePath)) {
|
|
return false;
|
|
}
|
|
var fileContents = "";
|
|
try {
|
|
fileContents = ts.sys.readFile(filePath);
|
|
}
|
|
catch (e) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Unable_to_open_file_0, filePath));
|
|
return false;
|
|
}
|
|
try {
|
|
ts.localizedDiagnosticMessages = JSON.parse(fileContents);
|
|
}
|
|
catch (e) {
|
|
errors.push(ts.createCompilerDiagnostic(ts.Diagnostics.Corrupted_locale_file_0, filePath));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function countLines(program) {
|
|
var count = 0;
|
|
ts.forEach(program.getSourceFiles(), function (file) {
|
|
count += ts.getLineStarts(file).length;
|
|
});
|
|
return count;
|
|
}
|
|
function getDiagnosticText(message) {
|
|
var args = [];
|
|
for (var _i = 1; _i < arguments.length; _i++) {
|
|
args[_i - 1] = arguments[_i];
|
|
}
|
|
var diagnostic = ts.createCompilerDiagnostic.apply(undefined, arguments);
|
|
return diagnostic.messageText;
|
|
}
|
|
function reportDiagnosticSimply(diagnostic, host) {
|
|
ts.sys.write(ts.formatDiagnostics([diagnostic], host));
|
|
}
|
|
var redForegroundEscapeSequence = "\u001b[91m";
|
|
var yellowForegroundEscapeSequence = "\u001b[93m";
|
|
var blueForegroundEscapeSequence = "\u001b[93m";
|
|
var gutterStyleSequence = "\u001b[100;30m";
|
|
var gutterSeparator = " ";
|
|
var resetEscapeSequence = "\u001b[0m";
|
|
var ellipsis = "...";
|
|
var categoryFormatMap = (_a = {},
|
|
_a[ts.DiagnosticCategory.Warning] = yellowForegroundEscapeSequence,
|
|
_a[ts.DiagnosticCategory.Error] = redForegroundEscapeSequence,
|
|
_a[ts.DiagnosticCategory.Message] = blueForegroundEscapeSequence,
|
|
_a
|
|
);
|
|
function formatAndReset(text, formatStyle) {
|
|
return formatStyle + text + resetEscapeSequence;
|
|
}
|
|
function reportDiagnosticWithColorAndContext(diagnostic, host) {
|
|
var output = "";
|
|
if (diagnostic.file) {
|
|
var start = diagnostic.start, length_3 = diagnostic.length, file = diagnostic.file;
|
|
var _a = ts.getLineAndCharacterOfPosition(file, start), firstLine = _a.line, firstLineChar = _a.character;
|
|
var _b = ts.getLineAndCharacterOfPosition(file, start + length_3), lastLine = _b.line, lastLineChar = _b.character;
|
|
var lastLineInFile = ts.getLineAndCharacterOfPosition(file, file.text.length).line;
|
|
var relativeFileName = host ? ts.convertToRelativePath(file.fileName, host.getCurrentDirectory(), function (fileName) { return host.getCanonicalFileName(fileName); }) : file.fileName;
|
|
var hasMoreThanFiveLines = (lastLine - firstLine) >= 4;
|
|
var gutterWidth = (lastLine + 1 + "").length;
|
|
if (hasMoreThanFiveLines) {
|
|
gutterWidth = Math.max(ellipsis.length, gutterWidth);
|
|
}
|
|
output += ts.sys.newLine;
|
|
for (var i = firstLine; i <= lastLine; i++) {
|
|
if (hasMoreThanFiveLines && firstLine + 1 < i && i < lastLine - 1) {
|
|
output += formatAndReset(padLeft(ellipsis, gutterWidth), gutterStyleSequence) + gutterSeparator + ts.sys.newLine;
|
|
i = lastLine - 1;
|
|
}
|
|
var lineStart = ts.getPositionOfLineAndCharacter(file, i, 0);
|
|
var lineEnd = i < lastLineInFile ? ts.getPositionOfLineAndCharacter(file, i + 1, 0) : file.text.length;
|
|
var lineContent = file.text.slice(lineStart, lineEnd);
|
|
lineContent = lineContent.replace(/\s+$/g, "");
|
|
lineContent = lineContent.replace("\t", " ");
|
|
output += formatAndReset(padLeft(i + 1 + "", gutterWidth), gutterStyleSequence) + gutterSeparator;
|
|
output += lineContent + ts.sys.newLine;
|
|
output += formatAndReset(padLeft("", gutterWidth), gutterStyleSequence) + gutterSeparator;
|
|
output += redForegroundEscapeSequence;
|
|
if (i === firstLine) {
|
|
var lastCharForLine = i === lastLine ? lastLineChar : undefined;
|
|
output += lineContent.slice(0, firstLineChar).replace(/\S/g, " ");
|
|
output += lineContent.slice(firstLineChar, lastCharForLine).replace(/./g, "~");
|
|
}
|
|
else if (i === lastLine) {
|
|
output += lineContent.slice(0, lastLineChar).replace(/./g, "~");
|
|
}
|
|
else {
|
|
output += lineContent.replace(/./g, "~");
|
|
}
|
|
output += resetEscapeSequence;
|
|
output += ts.sys.newLine;
|
|
}
|
|
output += ts.sys.newLine;
|
|
output += relativeFileName + "(" + (firstLine + 1) + "," + (firstLineChar + 1) + "): ";
|
|
}
|
|
var categoryColor = categoryFormatMap[diagnostic.category];
|
|
var category = ts.DiagnosticCategory[diagnostic.category].toLowerCase();
|
|
output += formatAndReset(category, categoryColor) + " TS" + diagnostic.code + ": " + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine);
|
|
output += ts.sys.newLine + ts.sys.newLine;
|
|
ts.sys.write(output);
|
|
}
|
|
function reportWatchDiagnostic(diagnostic) {
|
|
var output = new Date().toLocaleTimeString() + " - ";
|
|
if (diagnostic.file) {
|
|
var loc = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
|
|
output += diagnostic.file.fileName + "(" + (loc.line + 1) + "," + (loc.character + 1) + "): ";
|
|
}
|
|
output += "" + ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine) + ts.sys.newLine;
|
|
ts.sys.write(output);
|
|
}
|
|
function padLeft(s, length) {
|
|
while (s.length < length) {
|
|
s = " " + s;
|
|
}
|
|
return s;
|
|
}
|
|
function padRight(s, length) {
|
|
while (s.length < length) {
|
|
s = s + " ";
|
|
}
|
|
return s;
|
|
}
|
|
function reportStatisticalValue(name, value) {
|
|
ts.sys.write(padRight(name + ":", 12) + padLeft(value.toString(), 10) + ts.sys.newLine);
|
|
}
|
|
function reportCountStatistic(name, count) {
|
|
reportStatisticalValue(name, "" + count);
|
|
}
|
|
function reportTimeStatistic(name, time) {
|
|
reportStatisticalValue(name, (time / 1000).toFixed(2) + "s");
|
|
}
|
|
function isJSONSupported() {
|
|
return typeof JSON === "object" && typeof JSON.parse === "function";
|
|
}
|
|
function executeCommandLine(args) {
|
|
var commandLine = ts.parseCommandLine(args);
|
|
var configFileName;
|
|
var cachedConfigFileText;
|
|
var configFileWatcher;
|
|
var directoryWatcher;
|
|
var cachedProgram;
|
|
var rootFileNames;
|
|
var compilerOptions;
|
|
var compilerHost;
|
|
var hostGetSourceFile;
|
|
var timerHandleForRecompilation;
|
|
var timerHandleForDirectoryChanges;
|
|
var cachedExistingFiles;
|
|
var hostFileExists;
|
|
if (commandLine.options.locale) {
|
|
if (!isJSONSupported()) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--locale"), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
validateLocaleAndSetLanguage(commandLine.options.locale, commandLine.errors);
|
|
}
|
|
if (commandLine.errors.length > 0) {
|
|
reportDiagnostics(commandLine.errors, compilerHost);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
if (commandLine.options.init) {
|
|
writeConfigFile(commandLine.options, commandLine.fileNames);
|
|
return ts.sys.exit(ts.ExitStatus.Success);
|
|
}
|
|
if (commandLine.options.version) {
|
|
printVersion();
|
|
return ts.sys.exit(ts.ExitStatus.Success);
|
|
}
|
|
if (commandLine.options.help) {
|
|
printVersion();
|
|
printHelp();
|
|
return ts.sys.exit(ts.ExitStatus.Success);
|
|
}
|
|
if (commandLine.options.project) {
|
|
if (!isJSONSupported()) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--project"), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
if (commandLine.fileNames.length !== 0) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Option_project_cannot_be_mixed_with_source_files_on_a_command_line), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
var fileOrDirectory = ts.normalizePath(commandLine.options.project);
|
|
if (!fileOrDirectory || ts.sys.directoryExists(fileOrDirectory)) {
|
|
configFileName = ts.combinePaths(fileOrDirectory, "tsconfig.json");
|
|
if (!ts.sys.fileExists(configFileName)) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_find_a_tsconfig_json_file_at_the_specified_directory_Colon_0, commandLine.options.project), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
}
|
|
else {
|
|
configFileName = fileOrDirectory;
|
|
if (!ts.sys.fileExists(configFileName)) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_specified_path_does_not_exist_Colon_0, commandLine.options.project), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
}
|
|
}
|
|
else if (commandLine.fileNames.length === 0 && isJSONSupported()) {
|
|
var searchPath = ts.normalizePath(ts.sys.getCurrentDirectory());
|
|
configFileName = ts.findConfigFile(searchPath, ts.sys.fileExists);
|
|
}
|
|
if (commandLine.fileNames.length === 0 && !configFileName) {
|
|
printVersion();
|
|
printHelp();
|
|
return ts.sys.exit(ts.ExitStatus.Success);
|
|
}
|
|
if (ts.isWatchSet(commandLine.options)) {
|
|
if (!ts.sys.watchFile) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), undefined);
|
|
return ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
if (configFileName) {
|
|
configFileWatcher = ts.sys.watchFile(configFileName, configFileChanged);
|
|
}
|
|
if (ts.sys.watchDirectory && configFileName) {
|
|
var directory = ts.getDirectoryPath(configFileName);
|
|
directoryWatcher = ts.sys.watchDirectory(directory == "" ? "." : directory, watchedDirectoryChanged, true);
|
|
}
|
|
}
|
|
performCompilation();
|
|
function parseConfigFile() {
|
|
if (!cachedConfigFileText) {
|
|
try {
|
|
cachedConfigFileText = ts.sys.readFile(configFileName);
|
|
}
|
|
catch (e) {
|
|
var error = ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, configFileName, e.message);
|
|
reportWatchDiagnostic(error);
|
|
ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
return;
|
|
}
|
|
}
|
|
if (!cachedConfigFileText) {
|
|
var error = ts.createCompilerDiagnostic(ts.Diagnostics.File_0_not_found, configFileName);
|
|
reportDiagnostics([error], undefined);
|
|
ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
return;
|
|
}
|
|
var result = ts.parseConfigFileTextToJson(configFileName, cachedConfigFileText);
|
|
var configObject = result.config;
|
|
if (!configObject) {
|
|
reportDiagnostics([result.error], undefined);
|
|
ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
return;
|
|
}
|
|
var cwd = ts.sys.getCurrentDirectory();
|
|
var configParseResult = ts.parseJsonConfigFileContent(configObject, ts.sys, ts.getNormalizedAbsolutePath(ts.getDirectoryPath(configFileName), cwd), commandLine.options, ts.getNormalizedAbsolutePath(configFileName, cwd));
|
|
if (configParseResult.errors.length > 0) {
|
|
reportDiagnostics(configParseResult.errors, undefined);
|
|
ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
return;
|
|
}
|
|
if (ts.isWatchSet(configParseResult.options)) {
|
|
if (!ts.sys.watchFile) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.The_current_host_does_not_support_the_0_option, "--watch"), undefined);
|
|
ts.sys.exit(ts.ExitStatus.DiagnosticsPresent_OutputsSkipped);
|
|
}
|
|
if (!directoryWatcher && ts.sys.watchDirectory && configFileName) {
|
|
var directory = ts.getDirectoryPath(configFileName);
|
|
directoryWatcher = ts.sys.watchDirectory(directory == "" ? "." : directory, watchedDirectoryChanged, true);
|
|
}
|
|
;
|
|
}
|
|
return configParseResult;
|
|
}
|
|
function performCompilation() {
|
|
if (!cachedProgram) {
|
|
if (configFileName) {
|
|
var configParseResult = parseConfigFile();
|
|
rootFileNames = configParseResult.fileNames;
|
|
compilerOptions = configParseResult.options;
|
|
}
|
|
else {
|
|
rootFileNames = commandLine.fileNames;
|
|
compilerOptions = commandLine.options;
|
|
}
|
|
compilerHost = ts.createCompilerHost(compilerOptions);
|
|
hostGetSourceFile = compilerHost.getSourceFile;
|
|
compilerHost.getSourceFile = getSourceFile;
|
|
hostFileExists = compilerHost.fileExists;
|
|
compilerHost.fileExists = cachedFileExists;
|
|
}
|
|
if (compilerOptions.pretty) {
|
|
reportDiagnosticWorker = reportDiagnosticWithColorAndContext;
|
|
}
|
|
cachedExistingFiles = {};
|
|
var compileResult = compile(rootFileNames, compilerOptions, compilerHost);
|
|
if (!ts.isWatchSet(compilerOptions)) {
|
|
return ts.sys.exit(compileResult.exitStatus);
|
|
}
|
|
setCachedProgram(compileResult.program);
|
|
reportWatchDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Compilation_complete_Watching_for_file_changes));
|
|
}
|
|
function cachedFileExists(fileName) {
|
|
if (ts.hasProperty(cachedExistingFiles, fileName)) {
|
|
return cachedExistingFiles[fileName];
|
|
}
|
|
return cachedExistingFiles[fileName] = hostFileExists(fileName);
|
|
}
|
|
function getSourceFile(fileName, languageVersion, onError) {
|
|
if (cachedProgram) {
|
|
var sourceFile_1 = cachedProgram.getSourceFile(fileName);
|
|
if (sourceFile_1 && sourceFile_1.fileWatcher) {
|
|
return sourceFile_1;
|
|
}
|
|
}
|
|
var sourceFile = hostGetSourceFile(fileName, languageVersion, onError);
|
|
if (sourceFile && ts.isWatchSet(compilerOptions) && ts.sys.watchFile) {
|
|
sourceFile.fileWatcher = ts.sys.watchFile(sourceFile.fileName, function (fileName, removed) { return sourceFileChanged(sourceFile, removed); });
|
|
}
|
|
return sourceFile;
|
|
}
|
|
function setCachedProgram(program) {
|
|
if (cachedProgram) {
|
|
var newSourceFiles_1 = program ? program.getSourceFiles() : undefined;
|
|
ts.forEach(cachedProgram.getSourceFiles(), function (sourceFile) {
|
|
if (!(newSourceFiles_1 && ts.contains(newSourceFiles_1, sourceFile))) {
|
|
if (sourceFile.fileWatcher) {
|
|
sourceFile.fileWatcher.close();
|
|
sourceFile.fileWatcher = undefined;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
cachedProgram = program;
|
|
}
|
|
function sourceFileChanged(sourceFile, removed) {
|
|
sourceFile.fileWatcher.close();
|
|
sourceFile.fileWatcher = undefined;
|
|
if (removed) {
|
|
var index = rootFileNames.indexOf(sourceFile.fileName);
|
|
if (index >= 0) {
|
|
rootFileNames.splice(index, 1);
|
|
}
|
|
}
|
|
startTimerForRecompilation();
|
|
}
|
|
function configFileChanged() {
|
|
setCachedProgram(undefined);
|
|
cachedConfigFileText = undefined;
|
|
startTimerForRecompilation();
|
|
}
|
|
function watchedDirectoryChanged(fileName) {
|
|
if (fileName && !ts.isSupportedSourceFileName(fileName, compilerOptions)) {
|
|
return;
|
|
}
|
|
startTimerForHandlingDirectoryChanges();
|
|
}
|
|
function startTimerForHandlingDirectoryChanges() {
|
|
if (timerHandleForDirectoryChanges) {
|
|
clearTimeout(timerHandleForDirectoryChanges);
|
|
}
|
|
timerHandleForDirectoryChanges = setTimeout(directoryChangeHandler, 250);
|
|
}
|
|
function directoryChangeHandler() {
|
|
var parsedCommandLine = parseConfigFile();
|
|
var newFileNames = ts.map(parsedCommandLine.fileNames, compilerHost.getCanonicalFileName);
|
|
var canonicalRootFileNames = ts.map(rootFileNames, compilerHost.getCanonicalFileName);
|
|
if (!ts.arrayIsEqualTo(newFileNames && newFileNames.sort(), canonicalRootFileNames && canonicalRootFileNames.sort())) {
|
|
setCachedProgram(undefined);
|
|
startTimerForRecompilation();
|
|
}
|
|
}
|
|
function startTimerForRecompilation() {
|
|
if (timerHandleForRecompilation) {
|
|
clearTimeout(timerHandleForRecompilation);
|
|
}
|
|
timerHandleForRecompilation = setTimeout(recompile, 250);
|
|
}
|
|
function recompile() {
|
|
timerHandleForRecompilation = undefined;
|
|
reportWatchDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.File_change_detected_Starting_incremental_compilation));
|
|
performCompilation();
|
|
}
|
|
}
|
|
ts.executeCommandLine = executeCommandLine;
|
|
function compile(fileNames, compilerOptions, compilerHost) {
|
|
ts.ioReadTime = 0;
|
|
ts.ioWriteTime = 0;
|
|
ts.programTime = 0;
|
|
ts.bindTime = 0;
|
|
ts.checkTime = 0;
|
|
ts.emitTime = 0;
|
|
var program = ts.createProgram(fileNames, compilerOptions, compilerHost);
|
|
var exitStatus = compileProgram();
|
|
if (compilerOptions.listFiles) {
|
|
ts.forEach(program.getSourceFiles(), function (file) {
|
|
ts.sys.write(file.fileName + ts.sys.newLine);
|
|
});
|
|
}
|
|
if (compilerOptions.diagnostics) {
|
|
var memoryUsed = ts.sys.getMemoryUsage ? ts.sys.getMemoryUsage() : -1;
|
|
reportCountStatistic("Files", program.getSourceFiles().length);
|
|
reportCountStatistic("Lines", countLines(program));
|
|
reportCountStatistic("Nodes", program.getNodeCount());
|
|
reportCountStatistic("Identifiers", program.getIdentifierCount());
|
|
reportCountStatistic("Symbols", program.getSymbolCount());
|
|
reportCountStatistic("Types", program.getTypeCount());
|
|
if (memoryUsed >= 0) {
|
|
reportStatisticalValue("Memory used", Math.round(memoryUsed / 1000) + "K");
|
|
}
|
|
reportTimeStatistic("I/O read", ts.ioReadTime);
|
|
reportTimeStatistic("I/O write", ts.ioWriteTime);
|
|
reportTimeStatistic("Parse time", ts.programTime);
|
|
reportTimeStatistic("Bind time", ts.bindTime);
|
|
reportTimeStatistic("Check time", ts.checkTime);
|
|
reportTimeStatistic("Emit time", ts.emitTime);
|
|
reportTimeStatistic("Total time", ts.programTime + ts.bindTime + ts.checkTime + ts.emitTime);
|
|
}
|
|
return { program: program, exitStatus: exitStatus };
|
|
function compileProgram() {
|
|
var diagnostics;
|
|
diagnostics = program.getSyntacticDiagnostics();
|
|
if (diagnostics.length === 0) {
|
|
diagnostics = program.getOptionsDiagnostics().concat(program.getGlobalDiagnostics());
|
|
if (diagnostics.length === 0) {
|
|
diagnostics = program.getSemanticDiagnostics();
|
|
}
|
|
}
|
|
var emitOutput = program.emit();
|
|
diagnostics = diagnostics.concat(emitOutput.diagnostics);
|
|
reportDiagnostics(ts.sortAndDeduplicateDiagnostics(diagnostics), compilerHost);
|
|
reportEmittedFiles(emitOutput.emittedFiles, compilerHost);
|
|
if (emitOutput.emitSkipped && diagnostics.length > 0) {
|
|
return ts.ExitStatus.DiagnosticsPresent_OutputsSkipped;
|
|
}
|
|
else if (diagnostics.length > 0) {
|
|
return ts.ExitStatus.DiagnosticsPresent_OutputsGenerated;
|
|
}
|
|
return ts.ExitStatus.Success;
|
|
}
|
|
}
|
|
function printVersion() {
|
|
ts.sys.write(getDiagnosticText(ts.Diagnostics.Version_0, ts.version) + ts.sys.newLine);
|
|
}
|
|
function printHelp() {
|
|
var output = "";
|
|
var syntaxLength = getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, "").length;
|
|
var examplesLength = getDiagnosticText(ts.Diagnostics.Examples_Colon_0, "").length;
|
|
var marginLength = Math.max(syntaxLength, examplesLength);
|
|
var syntax = makePadding(marginLength - syntaxLength);
|
|
syntax += "tsc [" + getDiagnosticText(ts.Diagnostics.options) + "] [" + getDiagnosticText(ts.Diagnostics.file) + " ...]";
|
|
output += getDiagnosticText(ts.Diagnostics.Syntax_Colon_0, syntax);
|
|
output += ts.sys.newLine + ts.sys.newLine;
|
|
var padding = makePadding(marginLength);
|
|
output += getDiagnosticText(ts.Diagnostics.Examples_Colon_0, makePadding(marginLength - examplesLength) + "tsc hello.ts") + ts.sys.newLine;
|
|
output += padding + "tsc --outFile file.js file.ts" + ts.sys.newLine;
|
|
output += padding + "tsc @args.txt" + ts.sys.newLine;
|
|
output += ts.sys.newLine;
|
|
output += getDiagnosticText(ts.Diagnostics.Options_Colon) + ts.sys.newLine;
|
|
var optsList = ts.filter(ts.optionDeclarations.slice(), function (v) { return !v.experimental; });
|
|
optsList.sort(function (a, b) { return ts.compareValues(a.name.toLowerCase(), b.name.toLowerCase()); });
|
|
marginLength = 0;
|
|
var usageColumn = [];
|
|
var descriptionColumn = [];
|
|
var optionsDescriptionMap = {};
|
|
var _loop_3 = function(i) {
|
|
var option = optsList[i];
|
|
if (!option.description) {
|
|
return "continue";
|
|
}
|
|
var usageText_1 = " ";
|
|
if (option.shortName) {
|
|
usageText_1 += "-" + option.shortName;
|
|
usageText_1 += getParamType(option);
|
|
usageText_1 += ", ";
|
|
}
|
|
usageText_1 += "--" + option.name;
|
|
usageText_1 += getParamType(option);
|
|
usageColumn.push(usageText_1);
|
|
var description = void 0;
|
|
if (option.name === "lib") {
|
|
description = getDiagnosticText(option.description);
|
|
var options_1 = [];
|
|
var element = option.element;
|
|
ts.forEachKey(element.type, function (key) {
|
|
options_1.push("'" + key + "'");
|
|
});
|
|
optionsDescriptionMap[description] = options_1;
|
|
}
|
|
else {
|
|
description = getDiagnosticText(option.description);
|
|
}
|
|
descriptionColumn.push(description);
|
|
marginLength = Math.max(usageText_1.length, marginLength);
|
|
};
|
|
for (var i = 0; i < optsList.length; i++) {
|
|
_loop_3(i);
|
|
}
|
|
var usageText = " @<" + getDiagnosticText(ts.Diagnostics.file) + ">";
|
|
usageColumn.push(usageText);
|
|
descriptionColumn.push(getDiagnosticText(ts.Diagnostics.Insert_command_line_options_and_files_from_a_file));
|
|
marginLength = Math.max(usageText.length, marginLength);
|
|
for (var i = 0; i < usageColumn.length; i++) {
|
|
var usage = usageColumn[i];
|
|
var description = descriptionColumn[i];
|
|
var kindsList = optionsDescriptionMap[description];
|
|
output += usage + makePadding(marginLength - usage.length + 2) + description + ts.sys.newLine;
|
|
if (kindsList) {
|
|
output += makePadding(marginLength + 4);
|
|
for (var _i = 0, kindsList_1 = kindsList; _i < kindsList_1.length; _i++) {
|
|
var kind = kindsList_1[_i];
|
|
output += kind + " ";
|
|
}
|
|
output += ts.sys.newLine;
|
|
}
|
|
}
|
|
ts.sys.write(output);
|
|
return;
|
|
function getParamType(option) {
|
|
if (option.paramType !== undefined) {
|
|
return " " + getDiagnosticText(option.paramType);
|
|
}
|
|
return "";
|
|
}
|
|
function makePadding(paddingLength) {
|
|
return Array(paddingLength + 1).join(" ");
|
|
}
|
|
}
|
|
function writeConfigFile(options, fileNames) {
|
|
var currentDirectory = ts.sys.getCurrentDirectory();
|
|
var file = ts.normalizePath(ts.combinePaths(currentDirectory, "tsconfig.json"));
|
|
if (ts.sys.fileExists(file)) {
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.A_tsconfig_json_file_is_already_defined_at_Colon_0, file), undefined);
|
|
}
|
|
else {
|
|
var compilerOptions = ts.extend(options, ts.defaultInitCompilerOptions);
|
|
var configurations = {
|
|
compilerOptions: serializeCompilerOptions(compilerOptions)
|
|
};
|
|
if (fileNames && fileNames.length) {
|
|
configurations.files = fileNames;
|
|
}
|
|
else {
|
|
configurations.exclude = ["node_modules"];
|
|
if (compilerOptions.outDir) {
|
|
configurations.exclude.push(compilerOptions.outDir);
|
|
}
|
|
}
|
|
ts.sys.writeFile(file, JSON.stringify(configurations, undefined, 4));
|
|
reportDiagnostic(ts.createCompilerDiagnostic(ts.Diagnostics.Successfully_created_a_tsconfig_json_file), undefined);
|
|
}
|
|
return;
|
|
function serializeCompilerOptions(options) {
|
|
var result = {};
|
|
var optionsNameMap = ts.getOptionNameMap().optionNameMap;
|
|
for (var name_36 in options) {
|
|
if (ts.hasProperty(options, name_36)) {
|
|
var value = options[name_36];
|
|
switch (name_36) {
|
|
case "init":
|
|
case "watch":
|
|
case "version":
|
|
case "help":
|
|
case "project":
|
|
break;
|
|
default:
|
|
var optionDefinition = optionsNameMap[name_36.toLowerCase()];
|
|
if (optionDefinition) {
|
|
if (typeof optionDefinition.type === "string") {
|
|
result[name_36] = value;
|
|
}
|
|
else {
|
|
var typeMap = optionDefinition.type;
|
|
for (var key in typeMap) {
|
|
if (ts.hasProperty(typeMap, key)) {
|
|
if (typeMap[key] === value)
|
|
result[name_36] = key;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
var _a;
|
|
})(ts || (ts = {}));
|
|
ts.executeCommandLine(ts.sys.args);
|