Skip to content

Commit 9b4a83e

Browse files
committed
Merge branch 'master' into fix-implements-tag-emit
2 parents 2bb0dab + c00aeb5 commit 9b4a83e

File tree

98 files changed

+3155
-546
lines changed

Some content is hidden

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

98 files changed

+3155
-546
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@
9696
"source-map-support": "latest",
9797
"through2": "latest",
9898
"travis-fold": "latest",
99-
"typescript": "next",
99+
"typescript": "^3.9.3",
100100
"vinyl": "latest",
101101
"vinyl-sourcemaps-apply": "latest",
102102
"xml2js": "^0.4.19"

src/compiler/checker.ts

Lines changed: 208 additions & 72 deletions
Large diffs are not rendered by default.

src/compiler/commandLineParser.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ namespace ts {
5353
["es2020.promise", "lib.es2020.promise.d.ts"],
5454
["es2020.string", "lib.es2020.string.d.ts"],
5555
["es2020.symbol.wellknown", "lib.es2020.symbol.wellknown.d.ts"],
56+
["es2020.intl", "lib.es2020.intl.d.ts"],
5657
["esnext.array", "lib.es2019.array.d.ts"],
5758
["esnext.symbol", "lib.es2019.symbol.d.ts"],
5859
["esnext.asynciterable", "lib.es2018.asynciterable.d.ts"],

src/compiler/diagnosticMessages.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3521,6 +3521,22 @@
35213521
"category": "Error",
35223522
"code": 5083
35233523
},
3524+
"Tuple members must all have names or all not have names.": {
3525+
"category": "Error",
3526+
"code": 5084
3527+
},
3528+
"A tuple member cannot be both optional and rest.": {
3529+
"category": "Error",
3530+
"code": 5085
3531+
},
3532+
"A labeled tuple element is declared as optional with a question mark after the name and before the colon, rather than after the type.": {
3533+
"category": "Error",
3534+
"code": 5086
3535+
},
3536+
"A labeled tuple element is declared as rest with a `...` before the name, rather than before the type.": {
3537+
"category": "Error",
3538+
"code": 5087
3539+
},
35243540

35253541
"Generates a sourcemap for each corresponding '.d.ts' file.": {
35263542
"category": "Message",
@@ -4404,6 +4420,10 @@
44044420
"category": "Error",
44054421
"code": 6233
44064422
},
4423+
"This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'?": {
4424+
"category": "Error",
4425+
"code": 6234
4426+
},
44074427

44084428
"Projects to reference": {
44094429
"category": "Message",
@@ -5681,6 +5701,14 @@
56815701
"category": "Message",
56825702
"code": 95116
56835703
},
5704+
"Move labeled tuple element modifiers to labels": {
5705+
"category": "Message",
5706+
"code": 95117
5707+
},
5708+
"Convert overload list to single signature": {
5709+
"category": "Message",
5710+
"code": 95118
5711+
},
56845712

56855713
"No value exists in scope for the shorthand property '{0}'. Either declare one or provide an initializer.": {
56865714
"category": "Error",

src/compiler/emitter.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,8 @@ namespace ts {
13701370
case SyntaxKind.RestType:
13711371
case SyntaxKind.JSDocVariadicType:
13721372
return emitRestOrJSDocVariadicType(node as RestTypeNode | JSDocVariadicType);
1373+
case SyntaxKind.NamedTupleMember:
1374+
return emitNamedTupleMember(node as NamedTupleMember);
13731375

13741376
// Binding patterns
13751377
case SyntaxKind.ObjectBindingPattern:
@@ -2099,9 +2101,19 @@ namespace ts {
20992101
}
21002102

21012103
function emitTupleType(node: TupleTypeNode) {
2102-
writePunctuation("[");
2103-
emitList(node, node.elementTypes, ListFormat.TupleTypeElements);
2104-
writePunctuation("]");
2104+
emitTokenWithComment(SyntaxKind.OpenBracketToken, node.pos, writePunctuation, node);
2105+
const flags = getEmitFlags(node) & EmitFlags.SingleLine ? ListFormat.SingleLineTupleTypeElements : ListFormat.MultiLineTupleTypeElements;
2106+
emitList(node, node.elements, flags | ListFormat.NoSpaceIfEmpty);
2107+
emitTokenWithComment(SyntaxKind.CloseBracketToken, node.elements.end, writePunctuation, node);
2108+
}
2109+
2110+
function emitNamedTupleMember(node: NamedTupleMember) {
2111+
emit(node.dotDotDotToken);
2112+
emit(node.name);
2113+
emit(node.questionToken);
2114+
emitTokenWithComment(SyntaxKind.ColonToken, node.name.end, writePunctuation, node);
2115+
writeSpace();
2116+
emit(node.type);
21052117
}
21062118

21072119
function emitOptionalType(node: OptionalTypeNode) {
@@ -4487,10 +4499,11 @@ namespace ts {
44874499
function getLiteralTextOfNode(node: LiteralLikeNode, neverAsciiEscape: boolean | undefined, jsxAttributeEscape: boolean): string {
44884500
if (node.kind === SyntaxKind.StringLiteral && (<StringLiteral>node).textSourceNode) {
44894501
const textSourceNode = (<StringLiteral>node).textSourceNode!;
4490-
if (isIdentifier(textSourceNode)) {
4491-
return jsxAttributeEscape ? `"${escapeJsxAttributeString(getTextOfNode(textSourceNode))}"` :
4492-
neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(getTextOfNode(textSourceNode))}"` :
4493-
`"${escapeNonAsciiString(getTextOfNode(textSourceNode))}"`;
4502+
if (isIdentifier(textSourceNode) || isNumericLiteral(textSourceNode)) {
4503+
const text = isNumericLiteral(textSourceNode) ? textSourceNode.text : getTextOfNode(textSourceNode);
4504+
return jsxAttributeEscape ? `"${escapeJsxAttributeString(text)}"` :
4505+
neverAsciiEscape || (getEmitFlags(node) & EmitFlags.NoAsciiEscaping) ? `"${escapeString(text)}"` :
4506+
`"${escapeNonAsciiString(text)}"`;
44944507
}
44954508
else {
44964509
return getLiteralTextOfNode(textSourceNode, neverAsciiEscape, jsxAttributeEscape);
@@ -4968,7 +4981,7 @@ namespace ts {
49684981
}
49694982

49704983
function emitLeadingSynthesizedComment(comment: SynthesizedComment) {
4971-
if (comment.kind === SyntaxKind.SingleLineCommentTrivia) {
4984+
if (comment.hasLeadingNewline || comment.kind === SyntaxKind.SingleLineCommentTrivia) {
49724985
writer.writeLine();
49734986
}
49744987
writeSynthesizedComment(comment);

src/compiler/factoryPublic.ts

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -810,15 +810,15 @@ namespace ts {
810810
: node;
811811
}
812812

813-
export function createTupleTypeNode(elementTypes: readonly TypeNode[]) {
813+
export function createTupleTypeNode(elements: readonly (TypeNode | NamedTupleMember)[]) {
814814
const node = createSynthesizedNode(SyntaxKind.TupleType) as TupleTypeNode;
815-
node.elementTypes = createNodeArray(elementTypes);
815+
node.elements = createNodeArray(elements);
816816
return node;
817817
}
818818

819-
export function updateTupleTypeNode(node: TupleTypeNode, elementTypes: readonly TypeNode[]) {
820-
return node.elementTypes !== elementTypes
821-
? updateNode(createTupleTypeNode(elementTypes), node)
819+
export function updateTupleTypeNode(node: TupleTypeNode, elements: readonly (TypeNode | NamedTupleMember)[]) {
820+
return node.elements !== elements
821+
? updateNode(createTupleTypeNode(elements), node)
822822
: node;
823823
}
824824

@@ -934,6 +934,24 @@ namespace ts {
934934
: node;
935935
}
936936

937+
export function createNamedTupleMember(dotDotDotToken: Token<SyntaxKind.DotDotDotToken> | undefined, name: Identifier, questionToken: Token<SyntaxKind.QuestionToken> | undefined, type: TypeNode) {
938+
const node = <NamedTupleMember>createSynthesizedNode(SyntaxKind.NamedTupleMember);
939+
node.dotDotDotToken = dotDotDotToken;
940+
node.name = name;
941+
node.questionToken = questionToken;
942+
node.type = type;
943+
return node;
944+
}
945+
946+
export function updateNamedTupleMember(node: NamedTupleMember, dotDotDotToken: Token<SyntaxKind.DotDotDotToken> | undefined, name: Identifier, questionToken: Token<SyntaxKind.QuestionToken> | undefined, type: TypeNode) {
947+
return node.dotDotDotToken !== dotDotDotToken
948+
|| node.name !== name
949+
|| node.questionToken !== questionToken
950+
|| node.type !== type
951+
? updateNode(createNamedTupleMember(dotDotDotToken, name, questionToken, type), node)
952+
: node;
953+
}
954+
937955
export function createThisTypeNode() {
938956
return <ThisTypeNode>createSynthesizedNode(SyntaxKind.ThisType);
939957
}
@@ -2592,30 +2610,45 @@ namespace ts {
25922610
}
25932611

25942612
export function createJSDocAuthorTag(comment?: string) {
2595-
return createJSDocTag(SyntaxKind.JSDocAuthorTag, "author", comment);
2613+
return createJSDocTag<JSDocAuthorTag>(SyntaxKind.JSDocAuthorTag, "author", comment);
25962614
}
25972615

25982616
export function createJSDocPublicTag() {
2599-
return createJSDocTag(SyntaxKind.JSDocPublicTag, "public");
2617+
return createJSDocTag<JSDocPublicTag>(SyntaxKind.JSDocPublicTag, "public");
26002618
}
26012619

26022620
export function createJSDocPrivateTag() {
2603-
return createJSDocTag(SyntaxKind.JSDocPrivateTag, "private");
2621+
return createJSDocTag<JSDocPrivateTag>(SyntaxKind.JSDocPrivateTag, "private");
26042622
}
26052623

26062624
export function createJSDocProtectedTag() {
2607-
return createJSDocTag(SyntaxKind.JSDocProtectedTag, "protected");
2625+
return createJSDocTag<JSDocProtectedTag>(SyntaxKind.JSDocProtectedTag, "protected");
26082626
}
26092627

26102628
export function createJSDocReadonlyTag() {
2611-
return createJSDocTag(SyntaxKind.JSDocReadonlyTag, "readonly");
2629+
return createJSDocTag<JSDocReadonlyTag>(SyntaxKind.JSDocReadonlyTag, "readonly");
26122630
}
26132631

26142632
export function appendJSDocToContainer(node: JSDocContainer, jsdoc: JSDoc) {
26152633
node.jsDoc = append(node.jsDoc, jsdoc);
26162634
return node;
26172635
}
26182636

2637+
2638+
/* @internal */
2639+
export function createJSDocVariadicType(type: TypeNode): JSDocVariadicType {
2640+
const node = createSynthesizedNode(SyntaxKind.JSDocVariadicType) as JSDocVariadicType;
2641+
node.type = type;
2642+
return node;
2643+
}
2644+
2645+
/* @internal */
2646+
export function updateJSDocVariadicType(node: JSDocVariadicType, type: TypeNode): JSDocVariadicType {
2647+
return node.type !== type
2648+
? updateNode(createJSDocVariadicType(type), node)
2649+
: node;
2650+
}
2651+
26192652
// JSX
26202653

26212654
export function createJsxElement(openingElement: JsxOpeningElement, children: readonly JsxChild[], closingElement: JsxClosingElement) {

src/compiler/parser.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ namespace ts {
179179
case SyntaxKind.ArrayType:
180180
return visitNode(cbNode, (<ArrayTypeNode>node).elementType);
181181
case SyntaxKind.TupleType:
182-
return visitNodes(cbNode, cbNodes, (<TupleTypeNode>node).elementTypes);
182+
return visitNodes(cbNode, cbNodes, (<TupleTypeNode>node).elements);
183183
case SyntaxKind.UnionType:
184184
case SyntaxKind.IntersectionType:
185185
return visitNodes(cbNode, cbNodes, (<UnionOrIntersectionTypeNode>node).types);
@@ -207,6 +207,11 @@ namespace ts {
207207
visitNode(cbNode, (<MappedTypeNode>node).type);
208208
case SyntaxKind.LiteralType:
209209
return visitNode(cbNode, (<LiteralTypeNode>node).literal);
210+
case SyntaxKind.NamedTupleMember:
211+
return visitNode(cbNode, (<NamedTupleMember>node).dotDotDotToken) ||
212+
visitNode(cbNode, (<NamedTupleMember>node).name) ||
213+
visitNode(cbNode, (<NamedTupleMember>node).questionToken) ||
214+
visitNode(cbNode, (<NamedTupleMember>node).type);
210215
case SyntaxKind.ObjectBindingPattern:
211216
case SyntaxKind.ArrayBindingPattern:
212217
return visitNodes(cbNode, cbNodes, (<BindingPattern>node).elements);
@@ -3056,9 +3061,33 @@ namespace ts {
30563061
return type;
30573062
}
30583063

3064+
function isNextTokenColonOrQuestionColon() {
3065+
return nextToken() === SyntaxKind.ColonToken || (token() === SyntaxKind.QuestionToken && nextToken() === SyntaxKind.ColonToken);
3066+
}
3067+
3068+
function isTupleElementName() {
3069+
if (token() === SyntaxKind.DotDotDotToken) {
3070+
return tokenIsIdentifierOrKeyword(nextToken()) && isNextTokenColonOrQuestionColon();
3071+
}
3072+
return tokenIsIdentifierOrKeyword(token()) && isNextTokenColonOrQuestionColon();
3073+
}
3074+
3075+
function parseTupleElementNameOrTupleElementType() {
3076+
if (lookAhead(isTupleElementName)) {
3077+
const node = <NamedTupleMember>createNode(SyntaxKind.NamedTupleMember);
3078+
node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken);
3079+
node.name = parseIdentifierName();
3080+
node.questionToken = parseOptionalToken(SyntaxKind.QuestionToken);
3081+
parseExpected(SyntaxKind.ColonToken);
3082+
node.type = parseTupleElementType();
3083+
return addJSDocComment(finishNode(node));
3084+
}
3085+
return parseTupleElementType();
3086+
}
3087+
30593088
function parseTupleType(): TupleTypeNode {
30603089
const node = <TupleTypeNode>createNode(SyntaxKind.TupleType);
3061-
node.elementTypes = parseBracketedList(ParsingContext.TupleElementTypes, parseTupleElementType, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken);
3090+
node.elements = parseBracketedList(ParsingContext.TupleElementTypes, parseTupleElementNameOrTupleElementType, SyntaxKind.OpenBracketToken, SyntaxKind.CloseBracketToken);
30623091
return finishNode(node);
30633092
}
30643093

src/compiler/transformers/declarations.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,6 +1026,10 @@ namespace ts {
10261026
}
10271027
}
10281028

1029+
if (isTupleTypeNode(input) && (getLineAndCharacterOfPosition(currentSourceFile, input.pos).line === getLineAndCharacterOfPosition(currentSourceFile, input.end).line)) {
1030+
setEmitFlags(input, EmitFlags.SingleLine);
1031+
}
1032+
10291033
return cleanup(visitEachChild(input, visitDeclarationSubtree, context));
10301034

10311035
function cleanup<T extends Node>(returnValue: T | undefined): T | undefined {

src/compiler/types.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ namespace ts {
328328
IndexedAccessType,
329329
MappedType,
330330
LiteralType,
331+
NamedTupleMember,
331332
ImportType,
332333
// Binding patterns
333334
ObjectBindingPattern,
@@ -700,6 +701,7 @@ namespace ts {
700701
| ConstructorTypeNode
701702
| JSDocFunctionType
702703
| ExportDeclaration
704+
| NamedTupleMember
703705
| EndOfFileToken;
704706

705707
export type HasType =
@@ -1274,7 +1276,15 @@ namespace ts {
12741276

12751277
export interface TupleTypeNode extends TypeNode {
12761278
kind: SyntaxKind.TupleType;
1277-
elementTypes: NodeArray<TypeNode>;
1279+
elements: NodeArray<TypeNode | NamedTupleMember>;
1280+
}
1281+
1282+
export interface NamedTupleMember extends TypeNode, JSDocContainer, Declaration {
1283+
kind: SyntaxKind.NamedTupleMember;
1284+
dotDotDotToken?: Token<SyntaxKind.DotDotDotToken>;
1285+
name: Identifier;
1286+
questionToken?: Token<SyntaxKind.QuestionToken>;
1287+
type: TypeNode;
12781288
}
12791289

12801290
export interface OptionalTypeNode extends TypeNode {
@@ -1478,6 +1488,7 @@ namespace ts {
14781488
kind: SyntaxKind.SyntheticExpression;
14791489
isSpread: boolean;
14801490
type: Type;
1491+
tupleNameSource?: ParameterDeclaration | NamedTupleMember;
14811492
}
14821493

14831494
// see: https://tc39.github.io/ecma262/#prod-ExponentiationExpression
@@ -2590,6 +2601,7 @@ namespace ts {
25902601
text: string;
25912602
pos: -1;
25922603
end: -1;
2604+
hasLeadingNewline?: boolean;
25932605
}
25942606

25952607
// represents a top level: { type } expression in a JSDoc comment.
@@ -3495,7 +3507,7 @@ namespace ts {
34953507
*/
34963508
getResolvedSignature(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
34973509
/* @internal */ getResolvedSignatureForSignatureHelp(node: CallLikeExpression, candidatesOutArray?: Signature[], argumentCount?: number): Signature | undefined;
3498-
/* @internal */ getExpandedParameters(sig: Signature): readonly Symbol[];
3510+
/* @internal */ getExpandedParameters(sig: Signature): readonly (readonly Symbol[])[];
34993511
/* @internal */ hasEffectiveRestParameter(sig: Signature): boolean;
35003512
getSignatureFromDeclaration(declaration: SignatureDeclaration): Signature | undefined;
35013513
isImplementationOfOverload(node: SignatureDeclaration): boolean | undefined;
@@ -4148,6 +4160,7 @@ namespace ts {
41484160
cjsExportMerged?: Symbol; // Version of the symbol with all non export= exports merged with the export= target
41494161
typeOnlyDeclaration?: TypeOnlyCompatibleAliasDeclaration | false; // First resolved alias declaration that makes the symbol only usable in type constructs
41504162
isConstructorDeclaredProperty?: boolean; // Property declared through 'this.x = ...' assignment in constructor
4163+
tupleLabelDeclaration?: NamedTupleMember | ParameterDeclaration; // Declaration associated with the tuple's label
41514164
}
41524165

41534166
/* @internal */
@@ -4618,7 +4631,7 @@ namespace ts {
46184631
minLength: number;
46194632
hasRestElement: boolean;
46204633
readonly: boolean;
4621-
associatedNames?: __String[];
4634+
labeledElementDeclarations?: readonly (NamedTupleMember | ParameterDeclaration)[];
46224635
}
46234636

46244637
export interface TupleTypeReference extends TypeReference {
@@ -6560,7 +6573,8 @@ namespace ts {
65606573
SingleLineTypeLiteralMembers = SingleLine | SpaceBetweenBraces | SpaceBetweenSiblings,
65616574
MultiLineTypeLiteralMembers = MultiLine | Indented | OptionalIfEmpty,
65626575

6563-
TupleTypeElements = CommaDelimited | SpaceBetweenSiblings | SingleLine,
6576+
SingleLineTupleTypeElements = CommaDelimited | SpaceBetweenSiblings | SingleLine,
6577+
MultiLineTupleTypeElements = CommaDelimited | Indented | SpaceBetweenSiblings | MultiLine,
65646578
UnionTypeConstituents = BarDelimited | SpaceBetweenSiblings | SingleLine,
65656579
IntersectionTypeConstituents = AmpersandDelimited | SpaceBetweenSiblings | SingleLine,
65666580
ObjectBindingPatternElements = SingleLine | AllowTrailingComma | SpaceBetweenBraces | CommaDelimited | SpaceBetweenSiblings | NoSpaceIfEmpty,

src/compiler/utilities.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3093,6 +3093,12 @@ namespace ts {
30933093
else if (isStringOrNumericLiteralLike(nameExpression)) {
30943094
return escapeLeadingUnderscores(nameExpression.text);
30953095
}
3096+
else if (isSignedNumericLiteral(nameExpression)) {
3097+
if (nameExpression.operator === SyntaxKind.MinusToken) {
3098+
return tokenToString(nameExpression.operator) + nameExpression.operand.text as __String;
3099+
}
3100+
return nameExpression.operand.text as __String;
3101+
}
30963102
return undefined;
30973103
default:
30983104
return Debug.assertNever(name);

0 commit comments

Comments
 (0)