Skip to content

Commit 109a3f0

Browse files
committed
Merge branch 'master' into control-flow-function-typeof
2 parents 20b6302 + b2afa7b commit 109a3f0

File tree

86 files changed

+4207
-431
lines changed

Some content is hidden

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

86 files changed

+4207
-431
lines changed

scripts/request-pr-review.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ main().catch(console.error);
4242

4343
async function main() {
4444
const gh = new Octokit({ auth: options.token });
45-
const response = await gh.pulls.createReviewRequest({
45+
const response = await gh.pulls.requestReviewers({
4646
owner: options.owner,
4747
repo: options.repo,
4848
pull_number,

src/compiler/checker.ts

Lines changed: 152 additions & 93 deletions
Large diffs are not rendered by default.

src/compiler/diagnosticMessages.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@
619619
"category": "Error",
620620
"code": 1195
621621
},
622-
"Catch clause variable cannot have a type annotation.": {
622+
"Catch clause variable type annotation must be 'any' or 'unknown' if specified.": {
623623
"category": "Error",
624624
"code": 1196
625625
},

src/compiler/transformers/declarations.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,18 +1180,36 @@ namespace ts {
11801180
fakespace.parent = enclosingDeclaration as SourceFile | NamespaceDeclaration;
11811181
fakespace.locals = createSymbolTable(props);
11821182
fakespace.symbol = props[0].parent!;
1183-
const declarations = mapDefined(props, p => {
1183+
const exportMappings: [Identifier, string][] = [];
1184+
const declarations: (VariableStatement | ExportDeclaration)[] = mapDefined(props, p => {
11841185
if (!isPropertyAccessExpression(p.valueDeclaration)) {
11851186
return undefined; // TODO GH#33569: Handle element access expressions that created late bound names (rather than silently omitting them)
11861187
}
11871188
getSymbolAccessibilityDiagnostic = createGetSymbolAccessibilityDiagnosticForNode(p.valueDeclaration);
11881189
const type = resolver.createTypeOfDeclaration(p.valueDeclaration, fakespace, declarationEmitNodeBuilderFlags, symbolTracker);
11891190
getSymbolAccessibilityDiagnostic = oldDiag;
1190-
const varDecl = createVariableDeclaration(unescapeLeadingUnderscores(p.escapedName), type, /*initializer*/ undefined);
1191-
return createVariableStatement(/*modifiers*/ undefined, createVariableDeclarationList([varDecl]));
1191+
const nameStr = unescapeLeadingUnderscores(p.escapedName);
1192+
const isNonContextualKeywordName = isStringANonContextualKeyword(nameStr);
1193+
const name = isNonContextualKeywordName ? getGeneratedNameForNode(p.valueDeclaration) : createIdentifier(nameStr);
1194+
if (isNonContextualKeywordName) {
1195+
exportMappings.push([name, nameStr]);
1196+
}
1197+
const varDecl = createVariableDeclaration(name, type, /*initializer*/ undefined);
1198+
return createVariableStatement(isNonContextualKeywordName ? undefined : [createToken(SyntaxKind.ExportKeyword)], createVariableDeclarationList([varDecl]));
11921199
});
1200+
if (!exportMappings.length) {
1201+
forEach(declarations, d => d.modifiers = undefined);
1202+
}
1203+
else {
1204+
declarations.push(createExportDeclaration(
1205+
/*decorators*/ undefined,
1206+
/*modifiers*/ undefined,
1207+
createNamedExports(map(exportMappings, ([gen, exp]) => {
1208+
return createExportSpecifier(gen, exp);
1209+
}))
1210+
));
1211+
}
11931212
const namespaceDecl = createModuleDeclaration(/*decorators*/ undefined, ensureModifiers(input), input.name!, createModuleBlock(declarations), NodeFlags.Namespace);
1194-
11951213
if (!hasEffectiveModifier(clean, ModifierFlags.Default)) {
11961214
return [clean, namespaceDecl];
11971215
}

src/compiler/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3061,7 +3061,7 @@ namespace ts {
30613061
if (!(name.kind === SyntaxKind.ComputedPropertyName || name.kind === SyntaxKind.ElementAccessExpression)) {
30623062
return false;
30633063
}
3064-
const expr = isElementAccessExpression(name) ? name.argumentExpression : name.expression;
3064+
const expr = isElementAccessExpression(name) ? skipParentheses(name.argumentExpression) : name.expression;
30653065
return !isStringOrNumericLiteralLike(expr) &&
30663066
!isSignedNumericLiteral(expr) &&
30673067
!isWellKnownSymbolSyntactically(expr);

src/compiler/utilitiesPublic.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,8 @@ namespace ts {
589589
(isFunctionExpression(declaration) || isClassExpression(declaration) ? getAssignedName(declaration) : undefined);
590590
}
591591

592-
function getAssignedName(node: Node): DeclarationName | undefined {
592+
/*@internal*/
593+
export function getAssignedName(node: Node): DeclarationName | undefined {
593594
if (!node.parent) {
594595
return undefined;
595596
}

src/harness/fourslashImpl.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3440,6 +3440,9 @@ namespace FourSlash {
34403440
let text = "";
34413441
text += `${prefix}╭ name: ${callHierarchyItem.name}\n`;
34423442
text += `${prefix}├ kind: ${callHierarchyItem.kind}\n`;
3443+
if (callHierarchyItem.containerName) {
3444+
text += `${prefix}├ containerName: ${callHierarchyItem.containerName}\n`;
3445+
}
34433446
text += `${prefix}├ file: ${callHierarchyItem.file}\n`;
34443447
text += `${prefix}├ span:\n`;
34453448
text += this.formatCallHierarchyItemSpan(file, callHierarchyItem.span, `${prefix}│ `);

src/server/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3069,6 +3069,7 @@ namespace ts.server.protocol {
30693069
file: string;
30703070
span: TextSpan;
30713071
selectionSpan: TextSpan;
3072+
containerName?: string;
30723073
}
30733074

30743075
export interface CallHierarchyIncomingCall {

src/services/callHierarchy.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,31 @@ namespace ts.CallHierarchy {
129129
return { text, pos: declName.getStart(), end: declName.getEnd() };
130130
}
131131

132+
function getCallHierarchItemContainerName(node: CallHierarchyDeclaration): string | undefined {
133+
if (isConstNamedExpression(node)) {
134+
if (isModuleBlock(node.parent.parent.parent.parent) && isIdentifier(node.parent.parent.parent.parent.parent.name)) {
135+
return node.parent.parent.parent.parent.parent.name.getText();
136+
}
137+
return;
138+
}
139+
140+
switch (node.kind) {
141+
case SyntaxKind.GetAccessor:
142+
case SyntaxKind.SetAccessor:
143+
case SyntaxKind.MethodDeclaration:
144+
if (node.parent.kind === SyntaxKind.ObjectLiteralExpression) {
145+
return getAssignedName(node.parent)?.getText();
146+
}
147+
return getNameOfDeclaration(node.parent)?.getText();
148+
case SyntaxKind.FunctionDeclaration:
149+
case SyntaxKind.ClassDeclaration:
150+
case SyntaxKind.ModuleDeclaration:
151+
if (isModuleBlock(node.parent) && isIdentifier(node.parent.parent.name)) {
152+
return node.parent.parent.name.getText();
153+
}
154+
}
155+
}
156+
132157
/** Finds the implementation of a function-like declaration, if one exists. */
133158
function findImplementation(typeChecker: TypeChecker, node: Extract<CallHierarchyDeclaration, FunctionLikeDeclaration>): Extract<CallHierarchyDeclaration, FunctionLikeDeclaration> | undefined;
134159
function findImplementation(typeChecker: TypeChecker, node: FunctionLikeDeclaration): FunctionLikeDeclaration | undefined;
@@ -245,10 +270,11 @@ namespace ts.CallHierarchy {
245270
export function createCallHierarchyItem(program: Program, node: CallHierarchyDeclaration): CallHierarchyItem {
246271
const sourceFile = node.getSourceFile();
247272
const name = getCallHierarchyItemName(program, node);
273+
const containerName = getCallHierarchItemContainerName(node);
248274
const kind = getNodeKind(node);
249275
const span = createTextSpanFromBounds(skipTrivia(sourceFile.text, node.getFullStart(), /*stopAfterLineBreak*/ false, /*stopAtComments*/ true), node.getEnd());
250276
const selectionSpan = createTextSpanFromBounds(name.pos, name.end);
251-
return { file: sourceFile.fileName, kind, name: name.text, span, selectionSpan };
277+
return { file: sourceFile.fileName, kind, name: name.text, containerName, span, selectionSpan };
252278
}
253279

254280
function isDefined<T>(x: T): x is NonNullable<T> {
@@ -484,4 +510,4 @@ namespace ts.CallHierarchy {
484510
}
485511
return group(collectCallSites(program, declaration), getCallSiteGroupKey, entries => convertCallSiteGroupToOutgoingCall(program, entries));
486512
}
487-
}
513+
}

src/services/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,7 @@ namespace ts {
615615
file: string;
616616
span: TextSpan;
617617
selectionSpan: TextSpan;
618+
containerName?: string;
618619
}
619620

620621
export interface CallHierarchyIncomingCall {

src/testRunner/parallel/worker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ namespace Harness.Parallel.Worker {
4141
return class extends (base as typeof Mocha.Runnable) {
4242
resetTimeout() {
4343
this.clearTimeout();
44-
if (this.enableTimeouts()) {
44+
if (this.timeout() > 0) {
4545
sendMessage({ type: "timeout", payload: { duration: this.timeout() || 1e9 } });
4646
this.timer = true;
4747
}

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5431,6 +5431,7 @@ declare namespace ts {
54315431
file: string;
54325432
span: TextSpan;
54335433
selectionSpan: TextSpan;
5434+
containerName?: string;
54345435
}
54355436
interface CallHierarchyIncomingCall {
54365437
from: CallHierarchyItem;
@@ -8590,6 +8591,7 @@ declare namespace ts.server.protocol {
85908591
file: string;
85918592
span: TextSpan;
85928593
selectionSpan: TextSpan;
8594+
containerName?: string;
85938595
}
85948596
interface CallHierarchyIncomingCall {
85958597
from: CallHierarchyItem;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5431,6 +5431,7 @@ declare namespace ts {
54315431
file: string;
54325432
span: TextSpan;
54335433
selectionSpan: TextSpan;
5434+
containerName?: string;
54345435
}
54355436
interface CallHierarchyIncomingCall {
54365437
from: CallHierarchyItem;

tests/baselines/reference/callHierarchyAccessor.callHierarchy.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
╭ name: bar
22
├ kind: getter
3+
├ containerName: C
34
├ file: /tests/cases/fourslash/callHierarchyAccessor.ts
45
├ span:
56
│ ╭ /tests/cases/fourslash/callHierarchyAccessor.ts:6:5-8:6
Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
╭ name: f
2+
├ kind: function
3+
├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
4+
├ span:
5+
│ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:1:1-1:16
6+
│ │ 1: function f() {}
7+
│ │ ^^^^^^^^^^^^^^^
8+
│ ╰
9+
├ selectionSpan:
10+
│ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:1:10-1:11
11+
│ │ 1: function f() {}
12+
│ │ ^
13+
│ ╰
14+
├ incoming:
15+
│ ╭ from:
16+
│ │ ╭ name: sameName
17+
│ │ ├ kind: method
18+
│ │ ├ containerName: A
19+
│ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
20+
│ │ ├ span:
21+
│ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:4:3-6:4
22+
│ │ │ │ 4: static sameName() {
23+
│ │ │ │ ^^^^^^^^^^^^^^^^^^^
24+
│ │ │ │ 5: f();
25+
│ │ │ │ ^^^^^^^^
26+
│ │ │ │ 6: }
27+
│ │ │ │ ^^^
28+
│ │ │ ╰
29+
│ │ ├ selectionSpan:
30+
│ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:4:10-4:18
31+
│ │ │ │ 4: static sameName() {
32+
│ │ │ │ ^^^^^^^^
33+
│ │ │ ╰
34+
│ │ ├ incoming:
35+
│ │ │ ╭ from:
36+
│ │ │ │ ╭ name: sameName
37+
│ │ │ │ ├ kind: method
38+
│ │ │ │ ├ containerName: B
39+
│ │ │ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
40+
│ │ │ │ ├ span:
41+
│ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:10:3-12:4
42+
│ │ │ │ │ │ 10: sameName() {
43+
│ │ │ │ │ │ ^^^^^^^^^^^^
44+
│ │ │ │ │ │ 11: A.sameName();
45+
│ │ │ │ │ │ ^^^^^^^^^^^^^^^^^
46+
│ │ │ │ │ │ 12: }
47+
│ │ │ │ │ │ ^^^
48+
│ │ │ │ │ ╰
49+
│ │ │ │ ├ selectionSpan:
50+
│ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:10:3-10:11
51+
│ │ │ │ │ │ 10: sameName() {
52+
│ │ │ │ │ │ ^^^^^^^^
53+
│ │ │ │ │ ╰
54+
│ │ │ │ ├ incoming:
55+
│ │ │ │ │ ╭ from:
56+
│ │ │ │ │ │ ╭ name: sameName
57+
│ │ │ │ │ │ ├ kind: getter
58+
│ │ │ │ │ │ ├ containerName: Obj
59+
│ │ │ │ │ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
60+
│ │ │ │ │ │ ├ span:
61+
│ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:16:3-18:4
62+
│ │ │ │ │ │ │ │ 16: get sameName() {
63+
│ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^
64+
│ │ │ │ │ │ │ │ 17: return new B().sameName;
65+
│ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66+
│ │ │ │ │ │ │ │ 18: }
67+
│ │ │ │ │ │ │ │ ^^^
68+
│ │ │ │ │ │ │ ╰
69+
│ │ │ │ │ │ ├ selectionSpan:
70+
│ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:16:7-16:15
71+
│ │ │ │ │ │ │ │ 16: get sameName() {
72+
│ │ │ │ │ │ │ │ ^^^^^^^^
73+
│ │ │ │ │ │ │ ╰
74+
│ │ │ │ │ │ ├ incoming:
75+
│ │ │ │ │ │ │ ╭ from:
76+
│ │ │ │ │ │ │ │ ╭ name: sameName
77+
│ │ │ │ │ │ │ │ ├ kind: function
78+
│ │ │ │ │ │ │ │ ├ containerName: Foo
79+
│ │ │ │ │ │ │ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
80+
│ │ │ │ │ │ │ │ ├ span:
81+
│ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:22:3-24:4
82+
│ │ │ │ │ │ │ │ │ │ 22: function sameName() {
83+
│ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^^^^^
84+
│ │ │ │ │ │ │ │ │ │ 23: return Obj.sameName;
85+
│ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^^^^^^^^
86+
│ │ │ │ │ │ │ │ │ │ 24: }
87+
│ │ │ │ │ │ │ │ │ │ ^^^
88+
│ │ │ │ │ │ │ │ │ ╰
89+
│ │ │ │ │ │ │ │ ├ selectionSpan:
90+
│ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:22:12-22:20
91+
│ │ │ │ │ │ │ │ │ │ 22: function sameName() {
92+
│ │ │ │ │ │ │ │ │ │ ^^^^^^^^
93+
│ │ │ │ │ │ │ │ │ ╰
94+
│ │ │ │ │ │ │ │ ├ incoming:
95+
│ │ │ │ │ │ │ │ │ ╭ from:
96+
│ │ │ │ │ │ │ │ │ │ ╭ name: C
97+
│ │ │ │ │ │ │ │ │ │ ├ kind: class
98+
│ │ │ │ │ │ │ │ │ │ ├ containerName: Foo
99+
│ │ │ │ │ │ │ │ │ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
100+
│ │ │ │ │ │ │ │ │ │ ├ span:
101+
│ │ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:26:3-30:4
102+
│ │ │ │ │ │ │ │ │ │ │ │ 26: export class C {
103+
│ │ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^
104+
│ │ │ │ │ │ │ │ │ │ │ │ 27: constructor() {
105+
│ │ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^^^
106+
│ │ │ │ │ │ │ │ │ │ │ │ 28: sameName();
107+
│ │ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^
108+
│ │ │ │ │ │ │ │ │ │ │ │ 29: }
109+
│ │ │ │ │ │ │ │ │ │ │ │ ^^^^^
110+
│ │ │ │ │ │ │ │ │ │ │ │ 30: }
111+
│ │ │ │ │ │ │ │ │ │ │ │ ^^^
112+
│ │ │ │ │ │ │ │ │ │ │ ╰
113+
│ │ │ │ │ │ │ │ │ │ ├ selectionSpan:
114+
│ │ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:26:16-26:17
115+
│ │ │ │ │ │ │ │ │ │ │ │ 26: export class C {
116+
│ │ │ │ │ │ │ │ │ │ │ │ ^
117+
│ │ │ │ │ │ │ │ │ │ │ ╰
118+
│ │ │ │ │ │ │ │ │ │ ├ incoming:
119+
│ │ │ │ │ │ │ │ │ │ │ ╭ from:
120+
│ │ │ │ │ │ │ │ │ │ │ │ ╭ name: sameName
121+
│ │ │ │ │ │ │ │ │ │ │ │ ├ kind: function
122+
│ │ │ │ │ │ │ │ │ │ │ │ ├ containerName: Bar
123+
│ │ │ │ │ │ │ │ │ │ │ │ ├ file: /tests/cases/fourslash/callHierarchyContainerName.ts
124+
│ │ │ │ │ │ │ │ │ │ │ │ ├ span:
125+
│ │ │ │ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:34:20-34:37
126+
│ │ │ │ │ │ │ │ │ │ │ │ │ │ 34: const sameName = () => new Foo.C();
127+
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^^^^^^^^^^
128+
│ │ │ │ │ │ │ │ │ │ │ │ │ ╰
129+
│ │ │ │ │ │ │ │ │ │ │ │ ├ selectionSpan:
130+
│ │ │ │ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:34:9-34:17
131+
│ │ │ │ │ │ │ │ │ │ │ │ │ │ 34: const sameName = () => new Foo.C();
132+
│ │ │ │ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^
133+
│ │ │ │ │ │ │ │ │ │ │ │ │ ╰
134+
│ │ │ │ │ │ │ │ │ │ │ │ ╰ incoming: none
135+
│ │ │ │ │ │ │ │ │ │ │ ├ fromSpans:
136+
│ │ │ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:34:34-34:35
137+
│ │ │ │ │ │ │ │ │ │ │ │ │ 34: const sameName = () => new Foo.C();
138+
│ │ │ │ │ │ │ │ │ │ │ │ │ ^
139+
│ │ │ │ │ │ │ │ │ │ ╰ ╰ ╰
140+
│ │ │ │ │ │ │ │ │ ├ fromSpans:
141+
│ │ │ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:28:7-28:15
142+
│ │ │ │ │ │ │ │ │ │ │ 28: sameName();
143+
│ │ │ │ │ │ │ │ │ │ │ ^^^^^^^^
144+
│ │ │ │ │ │ │ │ ╰ ╰ ╰
145+
│ │ │ │ │ │ │ ├ fromSpans:
146+
│ │ │ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:23:16-23:24
147+
│ │ │ │ │ │ │ │ │ 23: return Obj.sameName;
148+
│ │ │ │ │ │ │ │ │ ^^^^^^^^
149+
│ │ │ │ │ │ ╰ ╰ ╰
150+
│ │ │ │ │ ├ fromSpans:
151+
│ │ │ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:17:20-17:28
152+
│ │ │ │ │ │ │ 17: return new B().sameName;
153+
│ │ │ │ │ │ │ ^^^^^^^^
154+
│ │ │ │ ╰ ╰ ╰
155+
│ │ │ ├ fromSpans:
156+
│ │ │ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:11:7-11:15
157+
│ │ │ │ │ 11: A.sameName();
158+
│ │ │ │ │ ^^^^^^^^
159+
│ │ ╰ ╰ ╰
160+
│ ├ fromSpans:
161+
│ │ ╭ /tests/cases/fourslash/callHierarchyContainerName.ts:5:5-5:6
162+
│ │ │ 5: f();
163+
│ │ │ ^
164+
│ ╰ ╰
165+
╰ outgoing: none

0 commit comments

Comments
 (0)