Fix base-in-interface check

This commit is contained in:
Nathan Shively-Sanders 2019-09-19 10:28:06 -07:00
parent 58e1746204
commit 832d51f629
5 changed files with 79 additions and 1 deletions

View file

@ -29518,8 +29518,9 @@ namespace ts {
const derivedPropertyFlags = derived.flags & SymbolFlags.PropertyOrAccessor;
if (basePropertyFlags && derivedPropertyFlags) {
// property/accessor is overridden with property/accessor
const baseParent = getParentOfSymbol(base);
if (baseDeclarationFlags & ModifierFlags.Abstract
|| getObjectFlags(getTargetType(baseType)) & ObjectFlags.Interface
|| baseParent && baseParent.flags & SymbolFlags.Interface
|| derived.valueDeclaration && isBinaryExpression(derived.valueDeclaration)) {
// when the base property is abstract or from an interface, base/derived flags don't need to match
// same when the derived property is from an assignment

View file

@ -0,0 +1,19 @@
//// [accessorsOverrideProperty5.ts]
interface I {
p: number
}
interface B extends I { }
class B { }
class C extends B {
get p() { return 1 }
set p(value) { }
}
//// [accessorsOverrideProperty5.js]
class B {
}
class C extends B {
get p() { return 1; }
set p(value) { }
}

View file

@ -0,0 +1,26 @@
=== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty5.ts ===
interface I {
>I : Symbol(I, Decl(accessorsOverrideProperty5.ts, 0, 0))
p: number
>p : Symbol(I.p, Decl(accessorsOverrideProperty5.ts, 0, 13))
}
interface B extends I { }
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
>I : Symbol(I, Decl(accessorsOverrideProperty5.ts, 0, 0))
class B { }
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
class C extends B {
>C : Symbol(C, Decl(accessorsOverrideProperty5.ts, 4, 11))
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
get p() { return 1 }
>p : Symbol(C.p, Decl(accessorsOverrideProperty5.ts, 5, 19), Decl(accessorsOverrideProperty5.ts, 6, 24))
set p(value) { }
>p : Symbol(C.p, Decl(accessorsOverrideProperty5.ts, 5, 19), Decl(accessorsOverrideProperty5.ts, 6, 24))
>value : Symbol(value, Decl(accessorsOverrideProperty5.ts, 7, 10))
}

View file

@ -0,0 +1,22 @@
=== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty5.ts ===
interface I {
p: number
>p : number
}
interface B extends I { }
class B { }
>B : B
class C extends B {
>C : C
>B : B
get p() { return 1 }
>p : number
>1 : 1
set p(value) { }
>p : number
>value : number
}

View file

@ -0,0 +1,10 @@
// @target: esnext
interface I {
p: number
}
interface B extends I { }
class B { }
class C extends B {
get p() { return 1 }
set p(value) { }
}