Fix issue #16803 do not error on getters/setters (#18031)

This commit is contained in:
Wesley Wigham 2017-08-24 15:53:09 -07:00 committed by GitHub
parent 2f1bd8cff9
commit 336df751ea
9 changed files with 133 additions and 5 deletions

View file

@ -497,6 +497,8 @@ namespace ts {
const builtinGlobals = createSymbolTable();
builtinGlobals.set(undefinedSymbol.escapedName, undefinedSymbol);
const isNotOverloadAndNotAccessor = and(isNotOverload, isNotAccessor);
initializeTypeChecker();
return checker;
@ -22257,7 +22259,7 @@ namespace ts {
if (flags & (SymbolFlags.Namespace | SymbolFlags.Interface | SymbolFlags.Enum)) {
return;
}
const exportedDeclarationsCount = countWhere(declarations, isNotOverload);
const exportedDeclarationsCount = countWhere(declarations, isNotOverloadAndNotAccessor);
if (flags & SymbolFlags.TypeAlias && exportedDeclarationsCount <= 2) {
// it is legal to merge type alias with other values
// so count should be either 1 (just type alias) or 2 (type alias + merged value)
@ -22273,11 +22275,16 @@ namespace ts {
});
links.exportsChecked = true;
}
}
function isNotOverload(declaration: Declaration): boolean {
return (declaration.kind !== SyntaxKind.FunctionDeclaration && declaration.kind !== SyntaxKind.MethodDeclaration) ||
!!(declaration as FunctionDeclaration).body;
}
function isNotAccessor(declaration: Declaration): boolean {
// Accessors check for their own matching duplicates, and in contexts where they are valid, there are already duplicate identifier checks
return !isAccessor(declaration);
}
function isNotOverload(declaration: Declaration): boolean {
return (declaration.kind !== SyntaxKind.FunctionDeclaration && declaration.kind !== SyntaxKind.MethodDeclaration) ||
!!(declaration as FunctionDeclaration).body;
}
function checkSourceElement(node: Node): void {

View file

@ -2626,4 +2626,8 @@ namespace ts {
export function isCheckJsEnabledForFile(sourceFile: SourceFile, compilerOptions: CompilerOptions) {
return sourceFile.checkJsDirective ? sourceFile.checkJsDirective.enabled : compilerOptions.checkJs;
}
export function and<T>(f: (arg: T) => boolean, g: (arg: T) => boolean) {
return (arg: T) => f(arg) && g(arg);
}
}

View file

@ -0,0 +1,19 @@
//// [exportEqualsClassNoRedeclarationError.ts]
class SomeClass {
static get someProp(): number {
return 0;
}
static set someProp(value: number) {}
}
export = SomeClass;
//// [exportEqualsClassNoRedeclarationError.js]
"use strict";
class SomeClass {
static get someProp() {
return 0;
}
static set someProp(value) { }
}
module.exports = SomeClass;

View file

@ -0,0 +1,17 @@
=== tests/cases/compiler/exportEqualsClassNoRedeclarationError.ts ===
class SomeClass {
>SomeClass : Symbol(SomeClass, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 0))
static get someProp(): number {
>someProp : Symbol(SomeClass.someProp, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 17), Decl(exportEqualsClassNoRedeclarationError.ts, 3, 5))
return 0;
}
static set someProp(value: number) {}
>someProp : Symbol(SomeClass.someProp, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 17), Decl(exportEqualsClassNoRedeclarationError.ts, 3, 5))
>value : Symbol(value, Decl(exportEqualsClassNoRedeclarationError.ts, 5, 24))
}
export = SomeClass;
>SomeClass : Symbol(SomeClass, Decl(exportEqualsClassNoRedeclarationError.ts, 0, 0))

View file

@ -0,0 +1,18 @@
=== tests/cases/compiler/exportEqualsClassNoRedeclarationError.ts ===
class SomeClass {
>SomeClass : SomeClass
static get someProp(): number {
>someProp : number
return 0;
>0 : 0
}
static set someProp(value: number) {}
>someProp : number
>value : number
}
export = SomeClass;
>SomeClass : SomeClass

View file

@ -0,0 +1,21 @@
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(2,16): error TS2300: Duplicate identifier 'someProp'.
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(6,16): error TS2300: Duplicate identifier 'someProp'.
tests/cases/compiler/exportEqualsClassRedeclarationError.ts(7,16): error TS2300: Duplicate identifier 'someProp'.
==== tests/cases/compiler/exportEqualsClassRedeclarationError.ts (3 errors) ====
class SomeClass {
static get someProp(): number {
~~~~~~~~
!!! error TS2300: Duplicate identifier 'someProp'.
return 0;
}
static set someProp(value: number) {}
~~~~~~~~
!!! error TS2300: Duplicate identifier 'someProp'.
static set someProp(value: number) {}
~~~~~~~~
!!! error TS2300: Duplicate identifier 'someProp'.
}
export = SomeClass;

View file

@ -0,0 +1,21 @@
//// [exportEqualsClassRedeclarationError.ts]
class SomeClass {
static get someProp(): number {
return 0;
}
static set someProp(value: number) {}
static set someProp(value: number) {}
}
export = SomeClass;
//// [exportEqualsClassRedeclarationError.js]
"use strict";
class SomeClass {
static get someProp() {
return 0;
}
static set someProp(value) { }
static set someProp(value) { }
}
module.exports = SomeClass;

View file

@ -0,0 +1,10 @@
// @target: es6
// @module: commonjs
class SomeClass {
static get someProp(): number {
return 0;
}
static set someProp(value: number) {}
}
export = SomeClass;

View file

@ -0,0 +1,11 @@
// @target: es6
// @module: commonjs
class SomeClass {
static get someProp(): number {
return 0;
}
static set someProp(value: number) {}
static set someProp(value: number) {}
}
export = SomeClass;