Skip to content

Commit 58ffb4e

Browse files
committed
Merge branch 'master' into object-spread
2 parents 32af046 + f307948 commit 58ffb4e

528 files changed

Lines changed: 6005 additions & 3189 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ matrix:
1515
branches:
1616
only:
1717
- master
18-
- release-2.0
18+
- release-2.1
1919

2020
install:
2121
- npm uninstall typescript

Jakefile.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,16 @@ var compilerSources = [
7070
"visitor.ts",
7171
"transformers/destructuring.ts",
7272
"transformers/ts.ts",
73-
"transformers/module/es2015.ts",
74-
"transformers/module/system.ts",
75-
"transformers/module/module.ts",
7673
"transformers/jsx.ts",
7774
"transformers/experimental.ts",
7875
"transformers/es2017.ts",
7976
"transformers/es2016.ts",
8077
"transformers/es2015.ts",
8178
"transformers/generators.ts",
8279
"transformers/es5.ts",
80+
"transformers/module/es2015.ts",
81+
"transformers/module/system.ts",
82+
"transformers/module/module.ts",
8383
"transformer.ts",
8484
"sourcemap.ts",
8585
"comments.ts",
@@ -107,16 +107,16 @@ var servicesSources = [
107107
"visitor.ts",
108108
"transformers/destructuring.ts",
109109
"transformers/ts.ts",
110-
"transformers/module/es2015.ts",
111-
"transformers/module/system.ts",
112-
"transformers/module/module.ts",
113110
"transformers/jsx.ts",
114111
"transformers/experimental.ts",
115112
"transformers/es2017.ts",
116113
"transformers/es2016.ts",
117114
"transformers/es2015.ts",
118115
"transformers/generators.ts",
119116
"transformers/es5.ts",
117+
"transformers/module/es2015.ts",
118+
"transformers/module/system.ts",
119+
"transformers/module/module.ts",
120120
"transformer.ts",
121121
"sourcemap.ts",
122122
"comments.ts",

src/compiler/binder.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ namespace ts {
5454
const body = (<ModuleDeclaration>node).body;
5555
return body ? getModuleInstanceState(body) : ModuleInstanceState.Instantiated;
5656
}
57+
// Only jsdoc typedef definition can exist in jsdoc namespace, and it should
58+
// be considered the same as type alias
59+
else if (node.kind === SyntaxKind.Identifier && (<Identifier>node).isInJSDocNamespace) {
60+
return ModuleInstanceState.NonInstantiated;
61+
}
5762
else {
5863
return ModuleInstanceState.Instantiated;
5964
}
@@ -429,7 +434,11 @@ namespace ts {
429434
// during global merging in the checker. Why? The only case when ambient module is permitted inside another module is module augmentation
430435
// and this case is specially handled. Module augmentations should only be merged with original module definition
431436
// and should never be merged directly with other augmentation, and the latter case would be possible if automatic merge is allowed.
432-
if (!isAmbientModule(node) && (hasExportModifier || container.flags & NodeFlags.ExportContext)) {
437+
const isJSDocTypedefInJSDocNamespace = node.kind === SyntaxKind.JSDocTypedefTag &&
438+
node.name &&
439+
node.name.kind === SyntaxKind.Identifier &&
440+
(<Identifier>node.name).isInJSDocNamespace;
441+
if ((!isAmbientModule(node) && (hasExportModifier || container.flags & NodeFlags.ExportContext)) || isJSDocTypedefInJSDocNamespace) {
433442
const exportKind =
434443
(symbolFlags & SymbolFlags.Value ? SymbolFlags.ExportValue : 0) |
435444
(symbolFlags & SymbolFlags.Type ? SymbolFlags.ExportType : 0) |
@@ -1831,6 +1840,17 @@ namespace ts {
18311840
switch (node.kind) {
18321841
/* Strict mode checks */
18331842
case SyntaxKind.Identifier:
1843+
// for typedef type names with namespaces, bind the new jsdoc type symbol here
1844+
// because it requires all containing namespaces to be in effect, namely the
1845+
// current "blockScopeContainer" needs to be set to its immediate namespace parent.
1846+
if ((<Identifier>node).isInJSDocNamespace) {
1847+
let parentNode = node.parent;
1848+
while (parentNode && parentNode.kind !== SyntaxKind.JSDocTypedefTag) {
1849+
parentNode = parentNode.parent;
1850+
}
1851+
bindBlockScopedDeclaration(<Declaration>parentNode, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
1852+
break;
1853+
}
18341854
case SyntaxKind.ThisKeyword:
18351855
if (currentFlow && (isExpression(node) || parent.kind === SyntaxKind.ShorthandPropertyAssignment)) {
18361856
node.flowNode = currentFlow;
@@ -1955,6 +1975,10 @@ namespace ts {
19551975
case SyntaxKind.InterfaceDeclaration:
19561976
return bindBlockScopedDeclaration(<Declaration>node, SymbolFlags.Interface, SymbolFlags.InterfaceExcludes);
19571977
case SyntaxKind.JSDocTypedefTag:
1978+
if (!(<JSDocTypedefTag>node).fullName || (<JSDocTypedefTag>node).fullName.kind === SyntaxKind.Identifier) {
1979+
return bindBlockScopedDeclaration(<Declaration>node, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
1980+
}
1981+
break;
19581982
case SyntaxKind.TypeAliasDeclaration:
19591983
return bindBlockScopedDeclaration(<Declaration>node, SymbolFlags.TypeAlias, SymbolFlags.TypeAliasExcludes);
19601984
case SyntaxKind.EnumDeclaration:
@@ -2514,7 +2538,7 @@ namespace ts {
25142538
&& (leftKind === SyntaxKind.ObjectLiteralExpression
25152539
|| leftKind === SyntaxKind.ArrayLiteralExpression)) {
25162540
// Destructuring assignments are ES6 syntax.
2517-
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.DestructuringAssignment;
2541+
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.AssertDestructuringAssignment;
25182542
}
25192543
else if (operatorTokenKind === SyntaxKind.AsteriskAsteriskToken
25202544
|| operatorTokenKind === SyntaxKind.AsteriskAsteriskEqualsToken) {
@@ -2595,9 +2619,9 @@ namespace ts {
25952619

25962620
// A class with a parameter property assignment, property initializer, or decorator is
25972621
// TypeScript syntax.
2598-
// An exported declaration may be TypeScript syntax.
2622+
// An exported declaration may be TypeScript syntax, but is handled by the visitor
2623+
// for a namespace declaration.
25992624
if ((subtreeFlags & TransformFlags.TypeScriptClassSyntaxMask)
2600-
|| (modifierFlags & ModifierFlags.Export)
26012625
|| node.typeParameters) {
26022626
transformFlags |= TransformFlags.AssertTypeScript;
26032627
}
@@ -2767,11 +2791,6 @@ namespace ts {
27672791
else {
27682792
transformFlags = subtreeFlags | TransformFlags.ContainsHoistedDeclarationOrCompletion;
27692793

2770-
// If a FunctionDeclaration is exported, then it is either ES6 or TypeScript syntax.
2771-
if (modifierFlags & ModifierFlags.Export) {
2772-
transformFlags |= TransformFlags.AssertTypeScript | TransformFlags.AssertES2015;
2773-
}
2774-
27752794
// TypeScript-specific modifiers, type parameters, and type annotations are TypeScript
27762795
// syntax.
27772796
if (modifierFlags & ModifierFlags.TypeScriptModifier
@@ -2913,11 +2932,6 @@ namespace ts {
29132932
else {
29142933
transformFlags = subtreeFlags;
29152934

2916-
// If a VariableStatement is exported, then it is either ES6 or TypeScript syntax.
2917-
if (modifierFlags & ModifierFlags.Export) {
2918-
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.AssertTypeScript;
2919-
}
2920-
29212935
if (declarationListTransformFlags & TransformFlags.ContainsBindingPattern) {
29222936
transformFlags |= TransformFlags.AssertES2015;
29232937
}
@@ -3034,12 +3048,6 @@ namespace ts {
30343048
transformFlags |= TransformFlags.AssertJsx;
30353049
break;
30363050

3037-
case SyntaxKind.ExportKeyword:
3038-
// This node is both ES6 and TypeScript syntax.
3039-
transformFlags |= TransformFlags.AssertES2015 | TransformFlags.AssertTypeScript;
3040-
break;
3041-
3042-
case SyntaxKind.DefaultKeyword:
30433051
case SyntaxKind.NoSubstitutionTemplateLiteral:
30443052
case SyntaxKind.TemplateHead:
30453053
case SyntaxKind.TemplateMiddle:
@@ -3048,6 +3056,7 @@ namespace ts {
30483056
case SyntaxKind.TaggedTemplateExpression:
30493057
case SyntaxKind.ShorthandPropertyAssignment:
30503058
case SyntaxKind.ForOfStatement:
3059+
case SyntaxKind.StaticKeyword:
30513060
// These nodes are ES6 syntax.
30523061
transformFlags |= TransformFlags.AssertES2015;
30533062
break;

src/compiler/checker.ts

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,7 +1375,8 @@ namespace ts {
13751375
}
13761376

13771377
const resolvedModule = getResolvedModule(getSourceFileOfNode(location), moduleReference);
1378-
const sourceFile = resolvedModule && host.getSourceFile(resolvedModule.resolvedFileName);
1378+
const resolutionDiagnostic = resolvedModule && getResolutionDiagnostic(compilerOptions, resolvedModule);
1379+
const sourceFile = resolvedModule && !resolutionDiagnostic && host.getSourceFile(resolvedModule.resolvedFileName);
13791380
if (sourceFile) {
13801381
if (sourceFile.symbol) {
13811382
// merged symbol is module declaration symbol combined with all augmentations
@@ -1397,13 +1398,18 @@ namespace ts {
13971398

13981399
if (moduleNotFoundError) {
13991400
// report errors only if it was requested
1400-
const tsExtension = tryExtractTypeScriptExtension(moduleName);
1401-
if (tsExtension) {
1402-
const diag = Diagnostics.An_import_path_cannot_end_with_a_0_extension_Consider_importing_1_instead;
1403-
error(errorNode, diag, tsExtension, removeExtension(moduleName, tsExtension));
1401+
if (resolutionDiagnostic) {
1402+
error(errorNode, resolutionDiagnostic, moduleName, resolvedModule.resolvedFileName);
14041403
}
14051404
else {
1406-
error(errorNode, moduleNotFoundError, moduleName);
1405+
const tsExtension = tryExtractTypeScriptExtension(moduleName);
1406+
if (tsExtension) {
1407+
const diag = Diagnostics.An_import_path_cannot_end_with_a_0_extension_Consider_importing_1_instead;
1408+
error(errorNode, diag, tsExtension, removeExtension(moduleName, tsExtension));
1409+
}
1410+
else {
1411+
error(errorNode, moduleNotFoundError, moduleName);
1412+
}
14071413
}
14081414
}
14091415
return undefined;
@@ -13180,16 +13186,41 @@ namespace ts {
1318013186
}
1318113187

1318213188
// In JavaScript files, calls to any identifier 'require' are treated as external module imports
13183-
if (isInJavaScriptFile(node) &&
13184-
isRequireCall(node, /*checkArgumentIsStringLiteral*/true) &&
13185-
// Make sure require is not a local function
13186-
!resolveName(node.expression, (<Identifier>node.expression).text, SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined)) {
13189+
if (isInJavaScriptFile(node) && isCommonJsRequire(node)) {
1318713190
return resolveExternalModuleTypeByLiteral(<StringLiteral>node.arguments[0]);
1318813191
}
1318913192

1319013193
return getReturnTypeOfSignature(signature);
1319113194
}
1319213195

13196+
function isCommonJsRequire(node: Node) {
13197+
if (!isRequireCall(node, /*checkArgumentIsStringLiteral*/true)) {
13198+
return false;
13199+
}
13200+
// Make sure require is not a local function
13201+
const resolvedRequire = resolveName(node.expression, (<Identifier>node.expression).text, SymbolFlags.Value, /*nameNotFoundMessage*/ undefined, /*nameArg*/ undefined);
13202+
if (!resolvedRequire) {
13203+
// project does not contain symbol named 'require' - assume commonjs require
13204+
return true;
13205+
}
13206+
// project includes symbol named 'require' - make sure that it it ambient and local non-alias
13207+
if (resolvedRequire.flags & SymbolFlags.Alias) {
13208+
return false;
13209+
}
13210+
13211+
const targetDeclarationKind = resolvedRequire.flags & SymbolFlags.Function
13212+
? SyntaxKind.FunctionDeclaration
13213+
: resolvedRequire.flags & SymbolFlags.Variable
13214+
? SyntaxKind.VariableDeclaration
13215+
: SyntaxKind.Unknown;
13216+
if (targetDeclarationKind !== SyntaxKind.Unknown) {
13217+
const decl = getDeclarationOfKind(resolvedRequire, targetDeclarationKind);
13218+
// function/variable declaration should be ambient
13219+
return isInAmbientContext(decl);
13220+
}
13221+
return false;
13222+
}
13223+
1319313224
function checkTaggedTemplateExpression(node: TaggedTemplateExpression): Type {
1319413225
return getReturnTypeOfSignature(getResolvedSignature(node));
1319513226
}
@@ -17575,7 +17606,7 @@ namespace ts {
1757517606
if (declaration && getModifierFlags(declaration) & ModifierFlags.Private) {
1757617607
const typeClassDeclaration = <ClassLikeDeclaration>getClassLikeDeclarationOfSymbol(type.symbol);
1757717608
if (!isNodeWithinClass(node, typeClassDeclaration)) {
17578-
error(node, Diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, (<Identifier>node.expression).text);
17609+
error(node, Diagnostics.Cannot_extend_a_class_0_Class_constructor_is_marked_as_private, getFullyQualifiedName(type.symbol));
1757917610
}
1758017611
}
1758117612
}
@@ -19852,6 +19883,10 @@ namespace ts {
1985219883
if (typeReferenceDirective) {
1985319884
(typeReferenceDirectives || (typeReferenceDirectives = [])).push(typeReferenceDirective);
1985419885
}
19886+
else {
19887+
// found at least one entry that does not originate from type reference directive
19888+
return undefined;
19889+
}
1985519890
}
1985619891
}
1985719892
return typeReferenceDirectives;

0 commit comments

Comments
 (0)