Skip to content

Commit 336df75

Browse files
authored
Fix issue microsoft#16803 do not error on getters/setters (microsoft#18031)
1 parent 2f1bd8c commit 336df75

9 files changed

+133
-5
lines changed

src/compiler/checker.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,8 @@ namespace ts {
497497
const builtinGlobals = createSymbolTable();
498498
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
499499

500+
const isNotOverloadAndNotAccessor = and(isNotOverload, isNotAccessor);
501+
500502
initializeTypeChecker();
501503

502504
return checker;
@@ -22257,7 +22259,7 @@ namespace ts {
2225722259
if (flags & (SymbolFlags.Namespace | SymbolFlags.Interface | SymbolFlags.Enum)) {
2225822260
return;
2225922261
}
22260-
const exportedDeclarationsCount = countWhere(declarations, isNotOverload);
22262+
const exportedDeclarationsCount = countWhere(declarations, isNotOverloadAndNotAccessor);
2226122263
if (flags & SymbolFlags.TypeAlias && exportedDeclarationsCount <= 2) {
2226222264
// it is legal to merge type alias with other values
2226322265
// so count should be either 1 (just type alias) or 2 (type alias + merged value)
@@ -22273,11 +22275,16 @@ namespace ts {
2227322275
});
2227422276
links.exportsChecked = true;
2227522277
}
22278+
}
2227622279

22277-
function isNotOverload(declaration: Declaration): boolean {
22278-
return (declaration.kind !== SyntaxKind.FunctionDeclaration && declaration.kind !== SyntaxKind.MethodDeclaration) ||
22279-
!!(declaration as FunctionDeclaration).body;
22280-
}
22280+
function isNotAccessor(declaration: Declaration): boolean {
22281+
// Accessors check for their own matching duplicates, and in contexts where they are valid, there are already duplicate identifier checks
22282+
return !isAccessor(declaration);
22283+
}
22284+
22285+
function isNotOverload(declaration: Declaration): boolean {
22286+
return (declaration.kind !== SyntaxKind.FunctionDeclaration && declaration.kind !== SyntaxKind.MethodDeclaration) ||
22287+
!!(declaration as FunctionDeclaration).body;
2228122288
}
2228222289

2228322290
function checkSourceElement(node: Node): void {

src/compiler/core.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2626,4 +2626,8 @@ namespace ts {
26262626
export function isCheckJsEnabledForFile(sourceFile: SourceFile, compilerOptions: CompilerOptions) {
26272627
return sourceFile.checkJsDirective ? sourceFile.checkJsDirective.enabled : compilerOptions.checkJs;
26282628
}
2629+
2630+
export function and<T>(f: (arg: T) => boolean, g: (arg: T) => boolean) {
2631+
return (arg: T) => f(arg) && g(arg);
2632+
}
26292633
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [exportEqualsClassNoRedeclarationError.ts]
2+
class SomeClass {
3+
static get someProp(): number {
4+
return 0;
5+
}
6+
7+
static set someProp(value: number) {}
8+
}
9+
export = SomeClass;
10+
11+
//// [exportEqualsClassNoRedeclarationError.js]
12+
"use strict";
13+
class SomeClass {
14+
static get someProp() {
15+
return 0;
16+
}
17+
static set someProp(value) { }
18+
}
19+
module.exports = SomeClass;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
=== tests/cases/compiler/exportEqualsClassNoRedeclarationError.ts ===
2+
class SomeClass {
3+
>SomeClass : Symbol(SomeClass, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 0))
4+
5+
static get someProp(): number {
6+
>someProp : Symbol(SomeClass.someProp, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 17), Decl(exportEqualsClassNoRedeclarationError.ts, 3, 5))
7+
8+
return 0;
9+
}
10+
11+
static set someProp(value: number) {}
12+
>someProp : Symbol(SomeClass.someProp, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 17), Decl(exportEqualsClassNoRedeclarationError.ts, 3, 5))
13+
>value : Symbol(value, Decl(exportEqualsClassNoRedeclarationError.ts, 5, 24))
14+
}
15+
export = SomeClass;
16+
>SomeClass : Symbol(SomeClass, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 0))
17+
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
=== tests/cases/compiler/exportEqualsClassNoRedeclarationError.ts ===
2+
class SomeClass {
3+
>SomeClass : SomeClass
4+
5+
static get someProp(): number {
6+
>someProp : number
7+
8+
return 0;
9+
>0 : 0
10+
}
11+
12+
static set someProp(value: number) {}
13+
>someProp : number
14+
>value : number
15+
}
16+
export = SomeClass;
17+
>SomeClass : SomeClass
18+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(2,16): error TS2300: Duplicate identifier 'someProp'.
2+
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(6,16): error TS2300: Duplicate identifier 'someProp'.
3+
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(7,16): error TS2300: Duplicate identifier 'someProp'.
4+
5+
6+
==== tests/cases/compiler/exportEqualsClassRedeclarationError.ts (3 errors) ====
7+
class SomeClass {
8+
static get someProp(): number {
9+
~~~~~~~~
10+
!!! error TS2300: Duplicate identifier 'someProp'.
11+
return 0;
12+
}
13+
14+
static set someProp(value: number) {}
15+
~~~~~~~~
16+
!!! error TS2300: Duplicate identifier 'someProp'.
17+
static set someProp(value: number) {}
18+
~~~~~~~~
19+
!!! error TS2300: Duplicate identifier 'someProp'.
20+
}
21+
export = SomeClass;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [exportEqualsClassRedeclarationError.ts]
2+
class SomeClass {
3+
static get someProp(): number {
4+
return 0;
5+
}
6+
7+
static set someProp(value: number) {}
8+
static set someProp(value: number) {}
9+
}
10+
export = SomeClass;
11+
12+
//// [exportEqualsClassRedeclarationError.js]
13+
"use strict";
14+
class SomeClass {
15+
static get someProp() {
16+
return 0;
17+
}
18+
static set someProp(value) { }
19+
static set someProp(value) { }
20+
}
21+
module.exports = SomeClass;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// @target: es6
2+
// @module: commonjs
3+
class SomeClass {
4+
static get someProp(): number {
5+
return 0;
6+
}
7+
8+
static set someProp(value: number) {}
9+
}
10+
export = SomeClass;
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// @target: es6
2+
// @module: commonjs
3+
class SomeClass {
4+
static get someProp(): number {
5+
return 0;
6+
}
7+
8+
static set someProp(value: number) {}
9+
static set someProp(value: number) {}
10+
}
11+
export = SomeClass;

0 commit comments

Comments
 (0)