From b7f93bbf197b82d6742fd8a4281468ff030d30c1 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 24 Mar 2021 16:57:54 -0700 Subject: [PATCH 01/19] Allow accessors to have different access modifiers and types Fixes #2845, #2521 --- src/compiler/checker.ts | 136 +-- src/compiler/diagnosticMessages.json | 10 +- src/compiler/parser.ts | 15 +- src/compiler/types.ts | 9 +- src/compiler/utilities.ts | 5 +- .../abstractPropertyNegative.errors.txt | 9 +- ...ismatchedAccessibilityModifiers.errors.txt | 58 -- .../reference/api/tsserverlibrary.d.ts | 8 +- tests/baselines/reference/api/typescript.d.ts | 8 +- .../reference/divergentAccessors1.errors.txt | 45 + .../reference/divergentAccessors1.js | 37 + .../reference/divergentAccessors1.symbols | 57 ++ .../reference/divergentAccessors1.types | 57 ++ .../reference/divergentAccessorsTypes1.js | 107 +++ .../divergentAccessorsTypes1.symbols | 185 ++++ .../reference/divergentAccessorsTypes1.types | 208 +++++ .../divergentAccessorsVisibility1.errors.txt | 314 +++++++ .../divergentAccessorsVisibility1.js | 298 +++++++ .../divergentAccessorsVisibility1.symbols | 631 ++++++++++++++ .../divergentAccessorsVisibility1.types | 818 ++++++++++++++++++ .../getAndSetNotIdenticalType.errors.txt | 9 +- .../getAndSetNotIdenticalType2.errors.txt | 14 +- .../getAndSetNotIdenticalType2.types | 4 +- .../getAndSetNotIdenticalType3.errors.txt | 14 +- .../getAndSetNotIdenticalType3.types | 4 +- .../gettersAndSettersAccessibility.errors.txt | 8 +- .../gettersAndSettersErrors.errors.txt | 8 +- ...ropertiesInheritedIntoClassType.errors.txt | 7 +- ...ancePropertiesInheritedIntoClassType.types | 4 +- .../instancePropertyInClassType.errors.txt | 7 +- .../instancePropertyInClassType.types | 4 +- .../jsdocAccessibilityTags.errors.txt | 8 +- .../reference/objectLiteralErrors.errors.txt | 16 +- ...privateNamesAndGenericClasses-2.errors.txt | 7 +- .../privateNamesAndGenericClasses-2.types | 4 +- tests/cases/compiler/divergentAccessors1.ts | 25 + .../compiler/divergentAccessorsTypes1.ts | 66 ++ .../compiler/divergentAccessorsVisibility1.ts | 160 ++++ .../fourslash/incrementalResolveAccessor.ts | 2 +- 39 files changed, 3195 insertions(+), 191 deletions(-) delete mode 100644 tests/baselines/reference/accessorWithMismatchedAccessibilityModifiers.errors.txt create mode 100644 tests/baselines/reference/divergentAccessors1.errors.txt create mode 100644 tests/baselines/reference/divergentAccessors1.js create mode 100644 tests/baselines/reference/divergentAccessors1.symbols create mode 100644 tests/baselines/reference/divergentAccessors1.types create mode 100644 tests/baselines/reference/divergentAccessorsTypes1.js create mode 100644 tests/baselines/reference/divergentAccessorsTypes1.symbols create mode 100644 tests/baselines/reference/divergentAccessorsTypes1.types create mode 100644 tests/baselines/reference/divergentAccessorsVisibility1.errors.txt create mode 100644 tests/baselines/reference/divergentAccessorsVisibility1.js create mode 100644 tests/baselines/reference/divergentAccessorsVisibility1.symbols create mode 100644 tests/baselines/reference/divergentAccessorsVisibility1.types create mode 100644 tests/cases/compiler/divergentAccessors1.ts create mode 100644 tests/cases/compiler/divergentAccessorsTypes1.ts create mode 100644 tests/cases/compiler/divergentAccessorsVisibility1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0a98fd289a390..552263798e2ae 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8844,7 +8844,7 @@ namespace ts { return links.type; } - function getTypeOfVariableOrParameterOrPropertyWorker(symbol: Symbol) { + function getTypeOfVariableOrParameterOrPropertyWorker(symbol: Symbol): Type { // Handle prototype property if (symbol.flags & SymbolFlags.Prototype) { return getTypeOfPrototypeProperty(symbol); @@ -8894,7 +8894,7 @@ namespace ts { } return reportCircularityError(symbol); } - let type: Type | undefined; + let type: Type; if (declaration.kind === SyntaxKind.ExportAssignment) { type = widenTypeForVariableLikeDeclaration(checkExpressionCached((declaration).expression), declaration); } @@ -8951,7 +8951,7 @@ namespace ts { type = getTypeOfEnumMember(symbol); } else if (isAccessor(declaration)) { - type = resolveTypeOfAccessors(symbol); + type = resolveTypeOfAccessors(symbol) || Debug.fail("Non-write accessor resolution must always produce a type"); } else { return Debug.fail("Unhandled declaration kind! " + Debug.formatSyntaxKind(declaration.kind) + " for " + Debug.formatSymbol(symbol)); @@ -8997,15 +8997,20 @@ namespace ts { function getTypeOfAccessors(symbol: Symbol): Type { const links = getSymbolLinks(symbol); - return links.type || (links.type = getTypeOfAccessorsWorker(symbol)); + return links.type || (links.type = getTypeOfAccessorsWorker(symbol) || Debug.fail("Read type of accessor must always produce a type")); + } + + function getTypeOfSetAccessor(symbol: Symbol): Type | undefined { + const links = getSymbolLinks(symbol); + return links.writeType || (links.writeType = getTypeOfAccessorsWorker(symbol, /*isWrite*/ true)); } - function getTypeOfAccessorsWorker(symbol: Symbol): Type { + function getTypeOfAccessorsWorker(symbol: Symbol, writing = false): Type | undefined { if (!pushTypeResolution(symbol, TypeSystemPropertyName.Type)) { return errorType; } - let type = resolveTypeOfAccessors(symbol); + let type = resolveTypeOfAccessors(symbol, writing); if (!popTypeResolution()) { type = anyType; @@ -9017,49 +9022,58 @@ namespace ts { return type; } - function resolveTypeOfAccessors(symbol: Symbol) { + function resolveTypeOfAccessors(symbol: Symbol, writing = false) { const getter = getDeclarationOfKind(symbol, SyntaxKind.GetAccessor); const setter = getDeclarationOfKind(symbol, SyntaxKind.SetAccessor); + // For write operations, prioritize type annotations on the setter + if (writing) { + const setterParameterType = getAnnotatedAccessorType(setter); + if (setterParameterType) { + return setterParameterType; + } + } + // Else defer to the getter type + if (getter && isInJSFile(getter)) { const jsDocType = getTypeForDeclarationFromJSDocComment(getter); if (jsDocType) { return jsDocType; } } - // First try to see if the user specified a return type on the get-accessor. + + // Try to see if the user specified a return type on the get-accessor. const getterReturnType = getAnnotatedAccessorType(getter); if (getterReturnType) { return getterReturnType; } - else { - // If the user didn't specify a return type, try to use the set-accessor's parameter type. - const setterParameterType = getAnnotatedAccessorType(setter); - if (setterParameterType) { - return setterParameterType; + + // If the user didn't specify a return type, try to use the set-accessor's parameter type. + const setterParameterType = getAnnotatedAccessorType(setter); + if (setterParameterType) { + return setterParameterType; + } + + // If there are no specified types, try to infer it from the body of the get accessor if it exists. + if (getter && getter.body) { + return getReturnTypeFromBody(getter); + } + + // Otherwise, fall back to 'any'. + if (setter) { + if (!isPrivateWithinAmbient(setter)) { + errorOrSuggestion(noImplicitAny, setter, Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol)); } - else { - // If there are no specified types, try to infer it from the body of the get accessor if it exists. - if (getter && getter.body) { - return getReturnTypeFromBody(getter); - } - // Otherwise, fall back to 'any'. - else { - if (setter) { - if (!isPrivateWithinAmbient(setter)) { - errorOrSuggestion(noImplicitAny, setter, Diagnostics.Property_0_implicitly_has_type_any_because_its_set_accessor_lacks_a_parameter_type_annotation, symbolToString(symbol)); - } - } - else { - Debug.assert(!!getter, "there must exist a getter as we are current checking either setter or getter in this function"); - if (!isPrivateWithinAmbient(getter)) { - errorOrSuggestion(noImplicitAny, getter, Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol)); - } - } - return anyType; - } + return anyType; + } + else if (getter) { + Debug.assert(!!getter, "there must exist a getter as we are current checking either setter or getter in this function"); + if (!isPrivateWithinAmbient(getter)) { + errorOrSuggestion(noImplicitAny, getter, Diagnostics.Property_0_implicitly_has_type_any_because_its_get_accessor_lacks_a_return_type_annotation, symbolToString(symbol)); } + return anyType; } + return undefined; } function getBaseTypeVariableOfClass(symbol: Symbol) { @@ -9186,6 +9200,16 @@ namespace ts { return links.type; } + function getWriteTypeOfSymbol(symbol: Symbol): Type { + if (symbol.flags & SymbolFlags.Accessor) { + const type = getTypeOfSetAccessor(symbol); + if (type) { + return type; + } + } + return getTypeOfSymbol(symbol); + } + function getTypeOfSymbol(symbol: Symbol): Type { const checkFlags = getCheckFlags(symbol); if (checkFlags & CheckFlags.DeferredType) { @@ -26550,8 +26574,8 @@ namespace ts { */ function checkPropertyAccessibility( node: PropertyAccessExpression | QualifiedName | PropertyAccessExpression | VariableDeclaration | ParameterDeclaration | ImportTypeNode | PropertyAssignment | ShorthandPropertyAssignment | BindingElement, - isSuper: boolean, type: Type, prop: Symbol): boolean { - const flags = getDeclarationModifierFlagsFromSymbol(prop); + isSuper: boolean, type: Type, prop: Symbol, isWrite = false): boolean { + const flags = getDeclarationModifierFlagsFromSymbol(prop, isWrite); const errorNode = node.kind === SyntaxKind.QualifiedName ? node.right : node.kind === SyntaxKind.ImportType ? node : node.kind === SyntaxKind.BindingElement && node.propertyName ? node.propertyName : node.name; @@ -26870,7 +26894,7 @@ namespace ts { markAliasReferenced(parentSymbol, node); } - let propType: Type; + let propType: Type | undefined; if (!prop) { const indexInfo = !isPrivateIdentifier(right) && (assignmentKind === AssignmentKind.None || !isGenericObjectType(leftType) || isThisTypeParameter(leftType)) ? getIndexInfoOfType(apparentType, IndexKind.String) : undefined; if (!(indexInfo && indexInfo.type)) { @@ -26907,13 +26931,18 @@ namespace ts { checkPropertyNotUsedBeforeDeclaration(prop, node, right); markPropertyAsReferenced(prop, node, isSelfTypeAccess(left, parentSymbol)); getNodeLinks(node).resolvedSymbol = prop; - checkPropertyAccessibility(node, left.kind === SyntaxKind.SuperKeyword, apparentType, prop); + const isWrite = isWriteAccess(node); + checkPropertyAccessibility(node, left.kind === SyntaxKind.SuperKeyword, apparentType, prop, isWrite); if (isAssignmentToReadonlyEntity(node as Expression, prop, assignmentKind)) { error(right, Diagnostics.Cannot_assign_to_0_because_it_is_a_read_only_property, idText(right)); return errorType; } - propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : getTypeOfSymbol(prop); + + if (propType === undefined) { + propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : isWrite ? getWriteTypeOfSymbol(prop) : getTypeOfSymbol(prop); + } } + return getFlowTypeOfAccessExpression(node, prop, propType, right, checkMode); } @@ -32926,18 +32955,19 @@ namespace ts { const otherKind = node.kind === SyntaxKind.GetAccessor ? SyntaxKind.SetAccessor : SyntaxKind.GetAccessor; const otherAccessor = getDeclarationOfKind(getSymbolOfNode(node), otherKind); if (otherAccessor) { - const nodeFlags = getEffectiveModifierFlags(node); - const otherFlags = getEffectiveModifierFlags(otherAccessor); - if ((nodeFlags & ModifierFlags.AccessibilityModifier) !== (otherFlags & ModifierFlags.AccessibilityModifier)) { - error(node.name, Diagnostics.Getter_and_setter_accessors_do_not_agree_in_visibility); - } - if ((nodeFlags & ModifierFlags.Abstract) !== (otherFlags & ModifierFlags.Abstract)) { + const getter = node.kind === SyntaxKind.GetAccessor ? node : otherAccessor; + const setter = node.kind === SyntaxKind.SetAccessor ? node : otherAccessor; + const getterFlags = getEffectiveModifierFlags(getter); + const setterFlags = getEffectiveModifierFlags(setter); + if ((getterFlags & ModifierFlags.Abstract) !== (setterFlags & ModifierFlags.Abstract)) { error(node.name, Diagnostics.Accessors_must_both_be_abstract_or_non_abstract); } + if (((getterFlags & ModifierFlags.Protected) && !(setterFlags & (ModifierFlags.Protected | ModifierFlags.Private))) || + ((getterFlags & ModifierFlags.Private) && !(setterFlags & ModifierFlags.Private))) { + error(node.name, Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter); + } - // TypeScript 1.0 spec (April 2014): 4.5 - // If both accessors include type annotations, the specified types must be identical. - checkAccessorDeclarationTypesIdentical(node, otherAccessor, getAnnotatedAccessorType, Diagnostics.get_and_set_accessor_must_have_the_same_type); + checkAccessorDeclarationTypesAssignable(getter, setter, getAnnotatedAccessorType, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); checkAccessorDeclarationTypesIdentical(node, otherAccessor, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type); } } @@ -32950,9 +32980,17 @@ namespace ts { } function checkAccessorDeclarationTypesIdentical(first: AccessorDeclaration, second: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { + return checkAccessorDeclarationTypesMatch(first, second, getAnnotatedType, isTypeIdenticalTo, message); + } + + function checkAccessorDeclarationTypesAssignable(getter: AccessorDeclaration, setter: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { + return checkAccessorDeclarationTypesMatch(getter, setter, getAnnotatedType, isTypeAssignableTo, message); + } + + function checkAccessorDeclarationTypesMatch(first: AccessorDeclaration, second: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, match: typeof areTypesComparable, message: DiagnosticMessage) { const firstType = getAnnotatedType(first); const secondType = getAnnotatedType(second); - if (firstType && secondType && !isTypeIdenticalTo(firstType, secondType)) { + if (firstType && secondType && !match(firstType, secondType)) { error(first, message); } } @@ -40865,7 +40903,7 @@ namespace ts { } function checkGrammarAccessor(accessor: AccessorDeclaration): boolean { - if (!(accessor.flags & NodeFlags.Ambient)) { + if (!(accessor.flags & NodeFlags.Ambient) && (accessor.parent.kind !== SyntaxKind.TypeLiteral) && (accessor.parent.kind !== SyntaxKind.InterfaceDeclaration)) { if (languageVersion < ScriptTarget.ES5) { return grammarErrorOnNode(accessor.name, Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher); } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index ae8fe1998fb4a..340e38f0062b7 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1706,11 +1706,7 @@ "category": "Error", "code": 2378 }, - "Getter and setter accessors do not agree in visibility.": { - "category": "Error", - "code": 2379 - }, - "'get' and 'set' accessor must have the same type.": { + "The return type of a 'get' accessor must be assignable to its 'set' accessor type": { "category": "Error", "code": 2380 }, @@ -3288,6 +3284,10 @@ "category": "Error", "code": 2802 }, + "A get accessor must be at least as accessible as the setter": { + "category": "Error", + "code": 2803 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index bf336c7e62c4d..ece2248d95055 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1340,6 +1340,8 @@ namespace ts { } function parseErrorAtPosition(start: number, length: number, message: DiagnosticMessage, arg0?: any): void { + debugger; + // Don't report another error if it would just be at the same position as the last error. const lastError = lastOrUndefined(parseDiagnostics); if (!lastError || start !== lastError.start) { @@ -3213,7 +3215,10 @@ namespace ts { function isTypeMemberStart(): boolean { // Return true if we have the start of a signature member - if (token() === SyntaxKind.OpenParenToken || token() === SyntaxKind.LessThanToken) { + if (token() === SyntaxKind.OpenParenToken || + token() === SyntaxKind.LessThanToken || + token() === SyntaxKind.GetKeyword || + token() === SyntaxKind.SetKeyword) { return true; } let idToken = false; @@ -3254,6 +3259,14 @@ namespace ts { const pos = getNodePos(); const hasJSDoc = hasPrecedingJSDocComment(); const modifiers = parseModifiers(); + if (parseContextualModifier(SyntaxKind.GetKeyword)) { + return parseAccessorDeclaration(pos, hasJSDoc, /*decorators*/ undefined, modifiers, SyntaxKind.GetAccessor); + } + + if (parseContextualModifier(SyntaxKind.SetKeyword)) { + return parseAccessorDeclaration(pos, hasJSDoc, /*decorators*/ undefined, modifiers, SyntaxKind.SetAccessor); + } + if (isIndexSignature()) { return parseIndexSignatureDeclaration(pos, hasJSDoc, /*decorators*/ undefined, modifiers); } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 795427421fcb6..5089bce9c4b7c 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1455,9 +1455,9 @@ namespace ts { // See the comment on MethodDeclaration for the intuition behind GetAccessorDeclaration being a // ClassElement and an ObjectLiteralElement. - export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.GetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; /* @internal */ typeParameters?: NodeArray; // Present for use with reporting a grammar error @@ -1465,9 +1465,9 @@ namespace ts { // See the comment on MethodDeclaration for the intuition behind SetAccessorDeclaration being a // ClassElement and an ObjectLiteralElement. - export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.SetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; /* @internal */ typeParameters?: NodeArray; // Present for use with reporting a grammar error @@ -4749,6 +4749,7 @@ namespace ts { immediateTarget?: Symbol; // Immediate target of an alias. May be another alias. Do not access directly, use `checker.getImmediateAliasedSymbol` instead. target?: Symbol; // Resolved (non-alias) target of an alias type?: Type; // Type of value symbol + writeType?: Type; // Type of value symbol in write contexts nameType?: Type; // Type associated with a late-bound symbol uniqueESSymbolType?: Type; // UniqueESSymbol type for a symbol declaredType?: Type; // Type of class, interface, enum, type alias, or type parameter diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index b19eca5926680..3a406a4f68d85 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5269,9 +5269,10 @@ namespace ts { return symbol.flags & SymbolFlags.Transient ? (symbol).checkFlags : 0; } - export function getDeclarationModifierFlagsFromSymbol(s: Symbol): ModifierFlags { + export function getDeclarationModifierFlagsFromSymbol(s: Symbol, isWrite = false): ModifierFlags { if (s.valueDeclaration) { - const flags = getCombinedModifierFlags(s.valueDeclaration); + const declaration = (isWrite && forEach(s.declarations, d => d.kind === SyntaxKind.SetAccessor && d)) || s.valueDeclaration; + const flags = getCombinedModifierFlags(declaration); return s.parent && s.parent.flags & SymbolFlags.Class ? flags : flags & ~ModifierFlags.AccessibilityModifier; } if (getCheckFlags(s) & CheckFlags.Synthetic) { diff --git a/tests/baselines/reference/abstractPropertyNegative.errors.txt b/tests/baselines/reference/abstractPropertyNegative.errors.txt index fd09b024213c4..d7b2fa592f839 100644 --- a/tests/baselines/reference/abstractPropertyNegative.errors.txt +++ b/tests/baselines/reference/abstractPropertyNegative.errors.txt @@ -1,5 +1,4 @@ -tests/cases/compiler/abstractPropertyNegative.ts(10,18): error TS2380: 'get' and 'set' accessor must have the same type. -tests/cases/compiler/abstractPropertyNegative.ts(11,18): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/compiler/abstractPropertyNegative.ts(10,18): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'm' from class 'B'. tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'mismatch' from class 'B'. tests/cases/compiler/abstractPropertyNegative.ts(13,7): error TS2515: Non-abstract class 'C' does not implement inherited abstract member 'prop' from class 'B'. @@ -19,7 +18,7 @@ tests/cases/compiler/abstractPropertyNegative.ts(40,9): error TS2676: Accessors tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors must both be abstract or non-abstract. -==== tests/cases/compiler/abstractPropertyNegative.ts (16 errors) ==== +==== tests/cases/compiler/abstractPropertyNegative.ts (15 errors) ==== interface A { prop: string; m(): string; @@ -31,10 +30,8 @@ tests/cases/compiler/abstractPropertyNegative.ts(41,18): error TS2676: Accessors abstract m(): string; abstract get mismatch(): string; ~~~~~~~~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type abstract set mismatch(val: number); // error, not same type - ~~~~~~~~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. } class C extends B { ~ diff --git a/tests/baselines/reference/accessorWithMismatchedAccessibilityModifiers.errors.txt b/tests/baselines/reference/accessorWithMismatchedAccessibilityModifiers.errors.txt deleted file mode 100644 index 9d1b7ca9a30b5..0000000000000 --- a/tests/baselines/reference/accessorWithMismatchedAccessibilityModifiers.errors.txt +++ /dev/null @@ -1,58 +0,0 @@ -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(2,9): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(5,17): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(10,19): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(13,17): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(18,19): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(20,9): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(26,26): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts(28,16): error TS2379: Getter and setter accessors do not agree in visibility. - - -==== tests/cases/conformance/classes/propertyMemberDeclarations/memberAccessorDeclarations/accessorWithMismatchedAccessibilityModifiers.ts (8 errors) ==== - class C { - get x() { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - return 1; - } - private set x(v) { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - } - } - - class D { - protected get x() { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - return 1; - } - private set x(v) { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - } - } - - class E { - protected set x(v) { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - } - get x() { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - return 1; - } - } - - class F { - protected static set x(v) { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - } - static get x() { - ~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. - return 1; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 75b3a9747c00a..6d5f03ca9203d 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -823,15 +823,15 @@ declare namespace ts { readonly kind: SyntaxKind.SemicolonClassElement; readonly parent: ClassLikeDeclaration; } - export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.GetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; } - export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.SetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index c0edb345ad537..fecc9a6fb634e 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -823,15 +823,15 @@ declare namespace ts { readonly kind: SyntaxKind.SemicolonClassElement; readonly parent: ClassLikeDeclaration; } - export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface GetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.GetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; } - export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, ObjectLiteralElement, JSDocContainer { + export interface SetAccessorDeclaration extends FunctionLikeDeclarationBase, ClassElement, TypeElement, ObjectLiteralElement, JSDocContainer { readonly kind: SyntaxKind.SetAccessor; - readonly parent: ClassLikeDeclaration | ObjectLiteralExpression; + readonly parent: ClassLikeDeclaration | ObjectLiteralExpression | TypeLiteralNode | InterfaceDeclaration; readonly name: PropertyName; readonly body?: FunctionBody; } diff --git a/tests/baselines/reference/divergentAccessors1.errors.txt b/tests/baselines/reference/divergentAccessors1.errors.txt new file mode 100644 index 0000000000000..9ca99b87fce71 --- /dev/null +++ b/tests/baselines/reference/divergentAccessors1.errors.txt @@ -0,0 +1,45 @@ +tests/cases/compiler/divergentAccessors1.ts(6,13): error TS1049: A 'set' accessor must have exactly one parameter. +tests/cases/compiler/divergentAccessors1.ts(9,5): error TS1184: Modifiers cannot appear here. +tests/cases/compiler/divergentAccessors1.ts(10,5): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/compiler/divergentAccessors1.ts(17,13): error TS1049: A 'set' accessor must have exactly one parameter. +tests/cases/compiler/divergentAccessors1.ts(20,5): error TS1184: Modifiers cannot appear here. +tests/cases/compiler/divergentAccessors1.ts(21,5): error TS2322: Type 'string' is not assignable to type 'number'. + + +==== tests/cases/compiler/divergentAccessors1.ts (6 errors) ==== + // Accessors in interfaces/types + + { + interface IHasGetSet { + get foo(): number; + set foo(): number | string; + ~~~ +!!! error TS1049: A 'set' accessor must have exactly one parameter. + } + + declare const ihgs: IHasGetSet; + ~~~~~~~ +!!! error TS1184: Modifiers cannot appear here. + ihgs.foo = "32"; + ~~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. + let r_ihgs_foo: number = ihgs.foo; + } + + { + type T_HasGetSet = { + get foo(): number; + set foo(): number | string; + ~~~ +!!! error TS1049: A 'set' accessor must have exactly one parameter. + } + + declare const t_hgs: T_HasGetSet; + ~~~~~~~ +!!! error TS1184: Modifiers cannot appear here. + t_hgs.foo = "32"; + ~~~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. + let r_t_hgs_foo: number = t_hgs.foo; + } + \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessors1.js b/tests/baselines/reference/divergentAccessors1.js new file mode 100644 index 0000000000000..e91db470ad6f3 --- /dev/null +++ b/tests/baselines/reference/divergentAccessors1.js @@ -0,0 +1,37 @@ +//// [divergentAccessors1.ts] +// Accessors in interfaces/types + +{ + interface IHasGetSet { + get foo(): number; + set foo(): number | string; + } + + declare const ihgs: IHasGetSet; + ihgs.foo = "32"; + let r_ihgs_foo: number = ihgs.foo; +} + +{ + type T_HasGetSet = { + get foo(): number; + set foo(): number | string; + } + + declare const t_hgs: T_HasGetSet; + t_hgs.foo = "32"; + let r_t_hgs_foo: number = t_hgs.foo; +} + + +//// [divergentAccessors1.js] +"use strict"; +// Accessors in interfaces/types +{ + ihgs.foo = "32"; + var r_ihgs_foo = ihgs.foo; +} +{ + t_hgs.foo = "32"; + var r_t_hgs_foo = t_hgs.foo; +} diff --git a/tests/baselines/reference/divergentAccessors1.symbols b/tests/baselines/reference/divergentAccessors1.symbols new file mode 100644 index 0000000000000..307b4dd981a2e --- /dev/null +++ b/tests/baselines/reference/divergentAccessors1.symbols @@ -0,0 +1,57 @@ +=== tests/cases/compiler/divergentAccessors1.ts === +// Accessors in interfaces/types + +{ + interface IHasGetSet { +>IHasGetSet : Symbol(IHasGetSet, Decl(divergentAccessors1.ts, 2, 1)) + + get foo(): number; +>foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) + + set foo(): number | string; +>foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) + } + + declare const ihgs: IHasGetSet; +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) +>IHasGetSet : Symbol(IHasGetSet, Decl(divergentAccessors1.ts, 2, 1)) + + ihgs.foo = "32"; +>ihgs.foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) +>foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) + + let r_ihgs_foo: number = ihgs.foo; +>r_ihgs_foo : Symbol(r_ihgs_foo, Decl(divergentAccessors1.ts, 10, 7)) +>ihgs.foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) +>foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) +} + +{ + type T_HasGetSet = { +>T_HasGetSet : Symbol(T_HasGetSet, Decl(divergentAccessors1.ts, 13, 1)) + + get foo(): number; +>foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) + + set foo(): number | string; +>foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) + } + + declare const t_hgs: T_HasGetSet; +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) +>T_HasGetSet : Symbol(T_HasGetSet, Decl(divergentAccessors1.ts, 13, 1)) + + t_hgs.foo = "32"; +>t_hgs.foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) +>foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) + + let r_t_hgs_foo: number = t_hgs.foo; +>r_t_hgs_foo : Symbol(r_t_hgs_foo, Decl(divergentAccessors1.ts, 21, 7)) +>t_hgs.foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) +>foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) +} + diff --git a/tests/baselines/reference/divergentAccessors1.types b/tests/baselines/reference/divergentAccessors1.types new file mode 100644 index 0000000000000..c123ad144aab3 --- /dev/null +++ b/tests/baselines/reference/divergentAccessors1.types @@ -0,0 +1,57 @@ +=== tests/cases/compiler/divergentAccessors1.ts === +// Accessors in interfaces/types + +{ + interface IHasGetSet { + get foo(): number; +>foo : number + + set foo(): number | string; +>foo : number + } + + declare const ihgs: IHasGetSet; +>ihgs : IHasGetSet + + ihgs.foo = "32"; +>ihgs.foo = "32" : "32" +>ihgs.foo : number +>ihgs : IHasGetSet +>foo : number +>"32" : "32" + + let r_ihgs_foo: number = ihgs.foo; +>r_ihgs_foo : number +>ihgs.foo : number +>ihgs : IHasGetSet +>foo : number +} + +{ + type T_HasGetSet = { +>T_HasGetSet : { foo: number; } + + get foo(): number; +>foo : number + + set foo(): number | string; +>foo : number + } + + declare const t_hgs: T_HasGetSet; +>t_hgs : { foo: number; } + + t_hgs.foo = "32"; +>t_hgs.foo = "32" : "32" +>t_hgs.foo : number +>t_hgs : { foo: number; } +>foo : number +>"32" : "32" + + let r_t_hgs_foo: number = t_hgs.foo; +>r_t_hgs_foo : number +>t_hgs.foo : number +>t_hgs : { foo: number; } +>foo : number +} + diff --git a/tests/baselines/reference/divergentAccessorsTypes1.js b/tests/baselines/reference/divergentAccessorsTypes1.js new file mode 100644 index 0000000000000..7f76803b1413a --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes1.js @@ -0,0 +1,107 @@ +//// [divergentAccessorsTypes1.ts] +class Test1 { + get foo(): string { return "" } + set foo(s: string | number) { + let a = s as string; + let b = s as number; + } + + get bar(): string | number { return "" } + set bar(s: string | number | boolean) { + } +} + +interface Test2 { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +} + +type Test3 = { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +}; + +{ + const t = new Test1(); + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test2; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test3; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +//// [divergentAccessorsTypes1.js] +"use strict"; +class Test1 { + get foo() { return ""; } + set foo(s) { + let a = s; + let b = s; + } + get bar() { return ""; } + set bar(s) { + } +} +{ + const t = new Test1(); + t.foo = 32; + let m = t.foo; + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n = t.bar; + t.bar = false; + let o = t.bar; +} +{ + const t = {}; + t.foo = 32; + let m = t.foo; + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n = t.bar; + t.bar = false; + let o = t.bar; +} +{ + const t = {}; + t.foo = 32; + let m = t.foo; + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n = t.bar; + t.bar = false; + let o = t.bar; +} diff --git a/tests/baselines/reference/divergentAccessorsTypes1.symbols b/tests/baselines/reference/divergentAccessorsTypes1.symbols new file mode 100644 index 0000000000000..3df60f476a285 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes1.symbols @@ -0,0 +1,185 @@ +=== tests/cases/compiler/divergentAccessorsTypes1.ts === +class Test1 { +>Test1 : Symbol(Test1, Decl(divergentAccessorsTypes1.ts, 0, 0)) + + get foo(): string { return "" } +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) + + set foo(s: string | number) { +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 2, 12)) + + let a = s as string; +>a : Symbol(a, Decl(divergentAccessorsTypes1.ts, 3, 11)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 2, 12)) + + let b = s as number; +>b : Symbol(b, Decl(divergentAccessorsTypes1.ts, 4, 11)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 2, 12)) + } + + get bar(): string | number { return "" } +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) + + set bar(s: string | number | boolean) { +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 8, 12)) + } +} + +interface Test2 { +>Test2 : Symbol(Test2, Decl(divergentAccessorsTypes1.ts, 10, 1)) + + get foo(): string; +>foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) + + set foo(s: string | number); +>foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 14, 12)) + + get bar(): string | number; +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) + + set bar(s: string | number | boolean); +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 17, 12)) +} + +type Test3 = { +>Test3 : Symbol(Test3, Decl(divergentAccessorsTypes1.ts, 18, 1)) + + get foo(): string; +>foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) + + set foo(s: string | number); +>foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 22, 12)) + + get bar(): string | number; +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) + + set bar(s: string | number | boolean); +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +>s : Symbol(s, Decl(divergentAccessorsTypes1.ts, 25, 12)) + +}; + +{ + const t = new Test1(); +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>Test1 : Symbol(Test1, Decl(divergentAccessorsTypes1.ts, 0, 0)) + + t.foo = 32; +>t.foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) + + let m: string = t.foo; +>m : Symbol(m, Decl(divergentAccessorsTypes1.ts, 31, 7)) +>t.foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes1.ts, 0, 13), Decl(divergentAccessorsTypes1.ts, 1, 35)) + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) + + let n: number = t.bar; +>n : Symbol(n, Decl(divergentAccessorsTypes1.ts, 35, 7)) +>t.bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) + + t.bar = false; +>t.bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) + + let o = t.bar; +>o : Symbol(o, Decl(divergentAccessorsTypes1.ts, 37, 7)) +>t.bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 29, 9)) +>bar : Symbol(Test1.bar, Decl(divergentAccessorsTypes1.ts, 5, 5), Decl(divergentAccessorsTypes1.ts, 7, 44)) +} + +{ + const t = {} as Test2; +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>Test2 : Symbol(Test2, Decl(divergentAccessorsTypes1.ts, 10, 1)) + + t.foo = 32; +>t.foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) + + let m: string = t.foo; +>m : Symbol(m, Decl(divergentAccessorsTypes1.ts, 43, 7)) +>t.foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>foo : Symbol(Test2.foo, Decl(divergentAccessorsTypes1.ts, 12, 17), Decl(divergentAccessorsTypes1.ts, 13, 22)) + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) + + let n: number = t.bar; +>n : Symbol(n, Decl(divergentAccessorsTypes1.ts, 47, 7)) +>t.bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) + + t.bar = false; +>t.bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) + + let o = t.bar; +>o : Symbol(o, Decl(divergentAccessorsTypes1.ts, 49, 7)) +>t.bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 41, 9)) +>bar : Symbol(Test2.bar, Decl(divergentAccessorsTypes1.ts, 14, 32), Decl(divergentAccessorsTypes1.ts, 16, 31)) +} + +{ + const t = {} as Test3; +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>Test3 : Symbol(Test3, Decl(divergentAccessorsTypes1.ts, 18, 1)) + + t.foo = 32; +>t.foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) + + let m: string = t.foo; +>m : Symbol(m, Decl(divergentAccessorsTypes1.ts, 55, 7)) +>t.foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>foo : Symbol(foo, Decl(divergentAccessorsTypes1.ts, 20, 14), Decl(divergentAccessorsTypes1.ts, 21, 22)) + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) + + let n: number = t.bar; +>n : Symbol(n, Decl(divergentAccessorsTypes1.ts, 59, 7)) +>t.bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) + + t.bar = false; +>t.bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) + + let o = t.bar; +>o : Symbol(o, Decl(divergentAccessorsTypes1.ts, 61, 7)) +>t.bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +>t : Symbol(t, Decl(divergentAccessorsTypes1.ts, 53, 9)) +>bar : Symbol(bar, Decl(divergentAccessorsTypes1.ts, 22, 32), Decl(divergentAccessorsTypes1.ts, 24, 31)) +} diff --git a/tests/baselines/reference/divergentAccessorsTypes1.types b/tests/baselines/reference/divergentAccessorsTypes1.types new file mode 100644 index 0000000000000..be4ebc6243c3a --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes1.types @@ -0,0 +1,208 @@ +=== tests/cases/compiler/divergentAccessorsTypes1.ts === +class Test1 { +>Test1 : Test1 + + get foo(): string { return "" } +>foo : string +>"" : "" + + set foo(s: string | number) { +>foo : string +>s : string | number + + let a = s as string; +>a : string +>s as string : string +>s : string | number + + let b = s as number; +>b : number +>s as number : number +>s : string | number + } + + get bar(): string | number { return "" } +>bar : string | number +>"" : "" + + set bar(s: string | number | boolean) { +>bar : string | number +>s : string | number | boolean + } +} + +interface Test2 { + get foo(): string; +>foo : string + + set foo(s: string | number); +>foo : string +>s : string | number + + get bar(): string | number; +>bar : string | number + + set bar(s: string | number | boolean); +>bar : string | number +>s : string | number | boolean +} + +type Test3 = { +>Test3 : Test3 + + get foo(): string; +>foo : string + + set foo(s: string | number); +>foo : string +>s : string | number + + get bar(): string | number; +>bar : string | number + + set bar(s: string | number | boolean); +>bar : string | number +>s : string | number | boolean + +}; + +{ + const t = new Test1(); +>t : Test1 +>new Test1() : Test1 +>Test1 : typeof Test1 + + t.foo = 32; +>t.foo = 32 : 32 +>t.foo : string | number +>t : Test1 +>foo : string | number +>32 : 32 + + let m: string = t.foo; +>m : string +>t.foo : string +>t : Test1 +>foo : string + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar = 42 : 42 +>t.bar : string | number | boolean +>t : Test1 +>bar : string | number | boolean +>42 : 42 + + let n: number = t.bar; +>n : number +>t.bar : number +>t : Test1 +>bar : number + + t.bar = false; +>t.bar = false : false +>t.bar : string | number | boolean +>t : Test1 +>bar : string | number | boolean +>false : false + + let o = t.bar; +>o : string | number +>t.bar : string | number +>t : Test1 +>bar : string | number +} + +{ + const t = {} as Test2; +>t : Test2 +>{} as Test2 : Test2 +>{} : {} + + t.foo = 32; +>t.foo = 32 : 32 +>t.foo : string | number +>t : Test2 +>foo : string | number +>32 : 32 + + let m: string = t.foo; +>m : string +>t.foo : string +>t : Test2 +>foo : string + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar = 42 : 42 +>t.bar : string | number | boolean +>t : Test2 +>bar : string | number | boolean +>42 : 42 + + let n: number = t.bar; +>n : number +>t.bar : number +>t : Test2 +>bar : number + + t.bar = false; +>t.bar = false : false +>t.bar : string | number | boolean +>t : Test2 +>bar : string | number | boolean +>false : false + + let o = t.bar; +>o : string | number +>t.bar : string | number +>t : Test2 +>bar : string | number +} + +{ + const t = {} as Test3; +>t : Test3 +>{} as Test3 : Test3 +>{} : {} + + t.foo = 32; +>t.foo = 32 : 32 +>t.foo : string | number +>t : Test3 +>foo : string | number +>32 : 32 + + let m: string = t.foo; +>m : string +>t.foo : string +>t : Test3 +>foo : string + + // See how CFA interacts with out-of-type writes + t.bar = 42; +>t.bar = 42 : 42 +>t.bar : string | number | boolean +>t : Test3 +>bar : string | number | boolean +>42 : 42 + + let n: number = t.bar; +>n : number +>t.bar : number +>t : Test3 +>bar : number + + t.bar = false; +>t.bar = false : false +>t.bar : string | number | boolean +>t : Test3 +>bar : string | number | boolean +>false : false + + let o = t.bar; +>o : string | number +>t.bar : string | number +>t : Test3 +>bar : string | number +} diff --git a/tests/baselines/reference/divergentAccessorsVisibility1.errors.txt b/tests/baselines/reference/divergentAccessorsVisibility1.errors.txt new file mode 100644 index 0000000000000..80307da568418 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsVisibility1.errors.txt @@ -0,0 +1,314 @@ +tests/cases/compiler/divergentAccessorsVisibility1.ts(11,19): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(12,9): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(20,17): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(21,9): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(23,17): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(24,19): error TS2803: A get accessor must be at least as accessible as the setter +tests/cases/compiler/divergentAccessorsVisibility1.ts(66,14): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(69,14): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(72,14): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(80,19): error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(81,19): error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(82,19): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(86,14): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(89,14): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(92,14): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(99,10): error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(100,10): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(102,10): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(103,10): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(105,10): error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(106,10): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(111,15): error TS2445: Property 'ProtectedPublic' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(112,15): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(113,15): error TS2445: Property 'ProtectedPrivate' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(114,15): error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(115,15): error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(116,15): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(119,10): error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(120,10): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(122,10): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(123,10): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(125,10): error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(126,10): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(129,11): error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(130,11): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(132,11): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(133,11): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(135,11): error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(136,11): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(141,16): error TS2445: Property 'ProtectedPublic' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(142,16): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(143,16): error TS2445: Property 'ProtectedPrivate' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(144,16): error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(145,16): error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(146,16): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(149,11): error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(150,11): error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(152,11): error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(153,11): error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. +tests/cases/compiler/divergentAccessorsVisibility1.ts(155,11): error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. +tests/cases/compiler/divergentAccessorsVisibility1.ts(156,11): error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + +==== tests/cases/compiler/divergentAccessorsVisibility1.ts (51 errors) ==== + class Base { + get PublicPublic() { return 0; } + set PublicPublic(v) { return; } + + get PublicProtected() { return 0; } + protected set PublicProtected(v) { return; } + + get PublicPrivate() { return 0; } + private set PublicPrivate(v) { return; } + + protected get ProtectedPublic() { return 0; } + ~~~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + set ProtectedPublic(v) { return; } + ~~~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + + protected get ProtectedProtected() { return 0; } + protected set ProtectedProtected(v) { return; } + + protected get ProtectedPrivate() { return 0; } + private set ProtectedPrivate(v) { return; } + + private get PrivatePublic() { return 0; } + ~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + set PrivatePublic(v) { return; } + ~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + + private get PrivateProtected() { return 0; } + ~~~~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + protected set PrivateProtected(v) { return; } + ~~~~~~~~~~~~~~~~ +!!! error TS2803: A get accessor must be at least as accessible as the setter + + private get PrivatePrivate() { return 0; } + private set PrivatePrivate(v) { return; } + + test() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } + } + + class Derived extends Base { + test2() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. + void this.PrivateProtected; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. + void this.PrivatePrivate; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + } + } + + declare const base: Base, deriv: Derived; + function fn() { + base.PublicPublic = 0; + base.PublicProtected = 0; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. + base.PublicPrivate = 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + base.ProtectedPublic = 0; + base.ProtectedProtected = 0; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + base.ProtectedPrivate = 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + base.PrivatePublic = 0; + base.PrivateProtected = 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. + base.PrivatePrivate = 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + void base.PublicPublic; + void base.PublicProtected; + void base.PublicPrivate; + void base.ProtectedPublic; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedPublic' is protected and only accessible within class 'Base' and its subclasses. + void base.ProtectedProtected; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + void base.ProtectedPrivate; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedPrivate' is protected and only accessible within class 'Base' and its subclasses. + void base.PrivatePublic; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. + void base.PrivateProtected; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. + void base.PrivatePrivate; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + base.PublicPublic += 0; + base.PublicProtected += 0; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. + base.PublicPrivate += 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + base.ProtectedPublic += 0; + base.ProtectedProtected += 0; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + base.ProtectedPrivate += 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + base.PrivatePublic += 0; + base.PrivateProtected += 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. + base.PrivatePrivate += 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + deriv.PublicPublic = 0; + deriv.PublicProtected = 0; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.PublicPrivate = 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + deriv.ProtectedPublic = 0; + deriv.ProtectedProtected = 0; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.ProtectedPrivate = 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + deriv.PrivatePublic = 0; + deriv.PrivateProtected = 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.PrivatePrivate = 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + void deriv.PublicPublic; + void deriv.PublicProtected; + void deriv.PublicPrivate; + void deriv.ProtectedPublic; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedPublic' is protected and only accessible within class 'Base' and its subclasses. + void deriv.ProtectedProtected; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + void deriv.ProtectedPrivate; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedPrivate' is protected and only accessible within class 'Base' and its subclasses. + void deriv.PrivatePublic; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePublic' is private and only accessible within class 'Base'. + void deriv.PrivateProtected; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivateProtected' is private and only accessible within class 'Base'. + void deriv.PrivatePrivate; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + + deriv.PublicPublic += 0; + deriv.PublicProtected += 0; + ~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PublicProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.PublicPrivate += 0; + ~~~~~~~~~~~~~ +!!! error TS2341: Property 'PublicPrivate' is private and only accessible within class 'Base'. + deriv.ProtectedPublic += 0; + deriv.ProtectedProtected += 0; + ~~~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'ProtectedProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.ProtectedPrivate += 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2341: Property 'ProtectedPrivate' is private and only accessible within class 'Base'. + deriv.PrivatePublic += 0; + deriv.PrivateProtected += 0; + ~~~~~~~~~~~~~~~~ +!!! error TS2445: Property 'PrivateProtected' is protected and only accessible within class 'Base' and its subclasses. + deriv.PrivatePrivate += 0; + ~~~~~~~~~~~~~~ +!!! error TS2341: Property 'PrivatePrivate' is private and only accessible within class 'Base'. + } + \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessorsVisibility1.js b/tests/baselines/reference/divergentAccessorsVisibility1.js new file mode 100644 index 0000000000000..4fab6316e7644 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsVisibility1.js @@ -0,0 +1,298 @@ +//// [divergentAccessorsVisibility1.ts] +class Base { + get PublicPublic() { return 0; } + set PublicPublic(v) { return; } + + get PublicProtected() { return 0; } + protected set PublicProtected(v) { return; } + + get PublicPrivate() { return 0; } + private set PublicPrivate(v) { return; } + + protected get ProtectedPublic() { return 0; } + set ProtectedPublic(v) { return; } + + protected get ProtectedProtected() { return 0; } + protected set ProtectedProtected(v) { return; } + + protected get ProtectedPrivate() { return 0; } + private set ProtectedPrivate(v) { return; } + + private get PrivatePublic() { return 0; } + set PrivatePublic(v) { return; } + + private get PrivateProtected() { return 0; } + protected set PrivateProtected(v) { return; } + + private get PrivatePrivate() { return 0; } + private set PrivatePrivate(v) { return; } + + test() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} + +class Derived extends Base { + test2() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} + +declare const base: Base, deriv: Derived; +function fn() { + base.PublicPublic = 0; + base.PublicProtected = 0; + base.PublicPrivate = 0; + base.ProtectedPublic = 0; + base.ProtectedProtected = 0; + base.ProtectedPrivate = 0; + base.PrivatePublic = 0; + base.PrivateProtected = 0; + base.PrivatePrivate = 0; + + void base.PublicPublic; + void base.PublicProtected; + void base.PublicPrivate; + void base.ProtectedPublic; + void base.ProtectedProtected; + void base.ProtectedPrivate; + void base.PrivatePublic; + void base.PrivateProtected; + void base.PrivatePrivate; + + base.PublicPublic += 0; + base.PublicProtected += 0; + base.PublicPrivate += 0; + base.ProtectedPublic += 0; + base.ProtectedProtected += 0; + base.ProtectedPrivate += 0; + base.PrivatePublic += 0; + base.PrivateProtected += 0; + base.PrivatePrivate += 0; + + deriv.PublicPublic = 0; + deriv.PublicProtected = 0; + deriv.PublicPrivate = 0; + deriv.ProtectedPublic = 0; + deriv.ProtectedProtected = 0; + deriv.ProtectedPrivate = 0; + deriv.PrivatePublic = 0; + deriv.PrivateProtected = 0; + deriv.PrivatePrivate = 0; + + void deriv.PublicPublic; + void deriv.PublicProtected; + void deriv.PublicPrivate; + void deriv.ProtectedPublic; + void deriv.ProtectedProtected; + void deriv.ProtectedPrivate; + void deriv.PrivatePublic; + void deriv.PrivateProtected; + void deriv.PrivatePrivate; + + deriv.PublicPublic += 0; + deriv.PublicProtected += 0; + deriv.PublicPrivate += 0; + deriv.ProtectedPublic += 0; + deriv.ProtectedProtected += 0; + deriv.ProtectedPrivate += 0; + deriv.PrivatePublic += 0; + deriv.PrivateProtected += 0; + deriv.PrivatePrivate += 0; +} + + +//// [divergentAccessorsVisibility1.js] +"use strict"; +class Base { + get PublicPublic() { return 0; } + set PublicPublic(v) { return; } + get PublicProtected() { return 0; } + set PublicProtected(v) { return; } + get PublicPrivate() { return 0; } + set PublicPrivate(v) { return; } + get ProtectedPublic() { return 0; } + set ProtectedPublic(v) { return; } + get ProtectedProtected() { return 0; } + set ProtectedProtected(v) { return; } + get ProtectedPrivate() { return 0; } + set ProtectedPrivate(v) { return; } + get PrivatePublic() { return 0; } + set PrivatePublic(v) { return; } + get PrivateProtected() { return 0; } + set PrivateProtected(v) { return; } + get PrivatePrivate() { return 0; } + set PrivatePrivate(v) { return; } + test() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} +class Derived extends Base { + test2() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} +function fn() { + base.PublicPublic = 0; + base.PublicProtected = 0; + base.PublicPrivate = 0; + base.ProtectedPublic = 0; + base.ProtectedProtected = 0; + base.ProtectedPrivate = 0; + base.PrivatePublic = 0; + base.PrivateProtected = 0; + base.PrivatePrivate = 0; + void base.PublicPublic; + void base.PublicProtected; + void base.PublicPrivate; + void base.ProtectedPublic; + void base.ProtectedProtected; + void base.ProtectedPrivate; + void base.PrivatePublic; + void base.PrivateProtected; + void base.PrivatePrivate; + base.PublicPublic += 0; + base.PublicProtected += 0; + base.PublicPrivate += 0; + base.ProtectedPublic += 0; + base.ProtectedProtected += 0; + base.ProtectedPrivate += 0; + base.PrivatePublic += 0; + base.PrivateProtected += 0; + base.PrivatePrivate += 0; + deriv.PublicPublic = 0; + deriv.PublicProtected = 0; + deriv.PublicPrivate = 0; + deriv.ProtectedPublic = 0; + deriv.ProtectedProtected = 0; + deriv.ProtectedPrivate = 0; + deriv.PrivatePublic = 0; + deriv.PrivateProtected = 0; + deriv.PrivatePrivate = 0; + void deriv.PublicPublic; + void deriv.PublicProtected; + void deriv.PublicPrivate; + void deriv.ProtectedPublic; + void deriv.ProtectedProtected; + void deriv.ProtectedPrivate; + void deriv.PrivatePublic; + void deriv.PrivateProtected; + void deriv.PrivatePrivate; + deriv.PublicPublic += 0; + deriv.PublicProtected += 0; + deriv.PublicPrivate += 0; + deriv.ProtectedPublic += 0; + deriv.ProtectedProtected += 0; + deriv.ProtectedPrivate += 0; + deriv.PrivatePublic += 0; + deriv.PrivateProtected += 0; + deriv.PrivatePrivate += 0; +} diff --git a/tests/baselines/reference/divergentAccessorsVisibility1.symbols b/tests/baselines/reference/divergentAccessorsVisibility1.symbols new file mode 100644 index 0000000000000..84dd4b1596d68 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsVisibility1.symbols @@ -0,0 +1,631 @@ +=== tests/cases/compiler/divergentAccessorsVisibility1.ts === +class Base { +>Base : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) + + get PublicPublic() { return 0; } +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + set PublicPublic(v) { return; } +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 2, 21)) + + get PublicProtected() { return 0; } +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + protected set PublicProtected(v) { return; } +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 5, 34)) + + get PublicPrivate() { return 0; } +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + private set PublicPrivate(v) { return; } +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 8, 30)) + + protected get ProtectedPublic() { return 0; } +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + set ProtectedPublic(v) { return; } +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 11, 24)) + + protected get ProtectedProtected() { return 0; } +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + protected set ProtectedProtected(v) { return; } +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 14, 37)) + + protected get ProtectedPrivate() { return 0; } +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + private set ProtectedPrivate(v) { return; } +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 17, 33)) + + private get PrivatePublic() { return 0; } +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + set PrivatePublic(v) { return; } +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 20, 22)) + + private get PrivateProtected() { return 0; } +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + protected set PrivateProtected(v) { return; } +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 23, 35)) + + private get PrivatePrivate() { return 0; } +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + private set PrivatePrivate(v) { return; } +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>v : Symbol(v, Decl(divergentAccessorsVisibility1.ts, 26, 31)) + + test() { +>test : Symbol(Base.test, Decl(divergentAccessorsVisibility1.ts, 26, 45)) + + this.PublicPublic = 0; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + this.PublicProtected = 0; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + this.PublicPrivate = 0; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + this.ProtectedPublic = 0; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + this.ProtectedProtected = 0; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + this.ProtectedPrivate = 0; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + this.PrivatePublic = 0; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + this.PrivateProtected = 0; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + this.PrivatePrivate = 0; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + void this.PublicPublic; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + void this.PublicProtected; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + void this.PublicPrivate; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + void this.ProtectedPublic; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + void this.ProtectedProtected; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + void this.ProtectedPrivate; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + void this.PrivatePublic; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + void this.PrivateProtected; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + void this.PrivatePrivate; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + this.PublicPublic += 0; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + this.PublicProtected += 0; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + this.PublicPrivate += 0; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + this.ProtectedPublic += 0; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + this.ProtectedProtected += 0; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + this.ProtectedPrivate += 0; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + this.PrivatePublic += 0; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + this.PrivateProtected += 0; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + this.PrivatePrivate += 0; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + } +} + +class Derived extends Base { +>Derived : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>Base : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) + + test2() { +>test2 : Symbol(Derived.test2, Decl(divergentAccessorsVisibility1.ts, 61, 28)) + + this.PublicPublic = 0; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + this.PublicProtected = 0; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + this.PublicPrivate = 0; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + this.ProtectedPublic = 0; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + this.ProtectedProtected = 0; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + this.ProtectedPrivate = 0; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + this.PrivatePublic = 0; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + this.PrivateProtected = 0; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + this.PrivatePrivate = 0; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + void this.PublicPublic; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + void this.PublicProtected; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + void this.PublicPrivate; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + void this.ProtectedPublic; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + void this.ProtectedProtected; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + void this.ProtectedPrivate; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + void this.PrivatePublic; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + void this.PrivateProtected; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + void this.PrivatePrivate; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + this.PublicPublic += 0; +>this.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + this.PublicProtected += 0; +>this.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + this.PublicPrivate += 0; +>this.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + this.ProtectedPublic += 0; +>this.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + this.ProtectedProtected += 0; +>this.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + this.ProtectedPrivate += 0; +>this.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + this.PrivatePublic += 0; +>this.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + this.PrivateProtected += 0; +>this.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + this.PrivatePrivate += 0; +>this.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>this : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + } +} + +declare const base: Base, deriv: Derived; +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>Base : Symbol(Base, Decl(divergentAccessorsVisibility1.ts, 0, 0)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>Derived : Symbol(Derived, Decl(divergentAccessorsVisibility1.ts, 59, 1)) + +function fn() { +>fn : Symbol(fn, Decl(divergentAccessorsVisibility1.ts, 95, 41)) + + base.PublicPublic = 0; +>base.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + base.PublicProtected = 0; +>base.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + base.PublicPrivate = 0; +>base.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + base.ProtectedPublic = 0; +>base.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + base.ProtectedProtected = 0; +>base.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + base.ProtectedPrivate = 0; +>base.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + base.PrivatePublic = 0; +>base.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + base.PrivateProtected = 0; +>base.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + base.PrivatePrivate = 0; +>base.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + void base.PublicPublic; +>base.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + void base.PublicProtected; +>base.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + void base.PublicPrivate; +>base.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + void base.ProtectedPublic; +>base.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + void base.ProtectedProtected; +>base.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + void base.ProtectedPrivate; +>base.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + void base.PrivatePublic; +>base.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + void base.PrivateProtected; +>base.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + void base.PrivatePrivate; +>base.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + base.PublicPublic += 0; +>base.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + base.PublicProtected += 0; +>base.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + base.PublicPrivate += 0; +>base.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + base.ProtectedPublic += 0; +>base.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + base.ProtectedProtected += 0; +>base.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + base.ProtectedPrivate += 0; +>base.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + base.PrivatePublic += 0; +>base.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + base.PrivateProtected += 0; +>base.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + base.PrivatePrivate += 0; +>base.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>base : Symbol(base, Decl(divergentAccessorsVisibility1.ts, 95, 13)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + deriv.PublicPublic = 0; +>deriv.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + deriv.PublicProtected = 0; +>deriv.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + deriv.PublicPrivate = 0; +>deriv.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + deriv.ProtectedPublic = 0; +>deriv.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + deriv.ProtectedProtected = 0; +>deriv.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + deriv.ProtectedPrivate = 0; +>deriv.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + deriv.PrivatePublic = 0; +>deriv.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + deriv.PrivateProtected = 0; +>deriv.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + deriv.PrivatePrivate = 0; +>deriv.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + void deriv.PublicPublic; +>deriv.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + void deriv.PublicProtected; +>deriv.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + void deriv.PublicPrivate; +>deriv.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + void deriv.ProtectedPublic; +>deriv.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + void deriv.ProtectedProtected; +>deriv.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + void deriv.ProtectedPrivate; +>deriv.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + void deriv.PrivatePublic; +>deriv.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + void deriv.PrivateProtected; +>deriv.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + void deriv.PrivatePrivate; +>deriv.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) + + deriv.PublicPublic += 0; +>deriv.PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPublic : Symbol(Base.PublicPublic, Decl(divergentAccessorsVisibility1.ts, 0, 12), Decl(divergentAccessorsVisibility1.ts, 1, 36)) + + deriv.PublicProtected += 0; +>deriv.PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicProtected : Symbol(Base.PublicProtected, Decl(divergentAccessorsVisibility1.ts, 2, 35), Decl(divergentAccessorsVisibility1.ts, 4, 39)) + + deriv.PublicPrivate += 0; +>deriv.PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PublicPrivate : Symbol(Base.PublicPrivate, Decl(divergentAccessorsVisibility1.ts, 5, 48), Decl(divergentAccessorsVisibility1.ts, 7, 37)) + + deriv.ProtectedPublic += 0; +>deriv.ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPublic : Symbol(Base.ProtectedPublic, Decl(divergentAccessorsVisibility1.ts, 8, 44), Decl(divergentAccessorsVisibility1.ts, 10, 49)) + + deriv.ProtectedProtected += 0; +>deriv.ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedProtected : Symbol(Base.ProtectedProtected, Decl(divergentAccessorsVisibility1.ts, 11, 38), Decl(divergentAccessorsVisibility1.ts, 13, 52)) + + deriv.ProtectedPrivate += 0; +>deriv.ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>ProtectedPrivate : Symbol(Base.ProtectedPrivate, Decl(divergentAccessorsVisibility1.ts, 14, 51), Decl(divergentAccessorsVisibility1.ts, 16, 50)) + + deriv.PrivatePublic += 0; +>deriv.PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePublic : Symbol(Base.PrivatePublic, Decl(divergentAccessorsVisibility1.ts, 17, 47), Decl(divergentAccessorsVisibility1.ts, 19, 45)) + + deriv.PrivateProtected += 0; +>deriv.PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivateProtected : Symbol(Base.PrivateProtected, Decl(divergentAccessorsVisibility1.ts, 20, 36), Decl(divergentAccessorsVisibility1.ts, 22, 48)) + + deriv.PrivatePrivate += 0; +>deriv.PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +>deriv : Symbol(deriv, Decl(divergentAccessorsVisibility1.ts, 95, 25)) +>PrivatePrivate : Symbol(Base.PrivatePrivate, Decl(divergentAccessorsVisibility1.ts, 23, 49), Decl(divergentAccessorsVisibility1.ts, 25, 46)) +} + diff --git a/tests/baselines/reference/divergentAccessorsVisibility1.types b/tests/baselines/reference/divergentAccessorsVisibility1.types new file mode 100644 index 0000000000000..3f3ad6c5bd959 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsVisibility1.types @@ -0,0 +1,818 @@ +=== tests/cases/compiler/divergentAccessorsVisibility1.ts === +class Base { +>Base : Base + + get PublicPublic() { return 0; } +>PublicPublic : number +>0 : 0 + + set PublicPublic(v) { return; } +>PublicPublic : number +>v : number + + get PublicProtected() { return 0; } +>PublicProtected : number +>0 : 0 + + protected set PublicProtected(v) { return; } +>PublicProtected : number +>v : number + + get PublicPrivate() { return 0; } +>PublicPrivate : number +>0 : 0 + + private set PublicPrivate(v) { return; } +>PublicPrivate : number +>v : number + + protected get ProtectedPublic() { return 0; } +>ProtectedPublic : number +>0 : 0 + + set ProtectedPublic(v) { return; } +>ProtectedPublic : number +>v : number + + protected get ProtectedProtected() { return 0; } +>ProtectedProtected : number +>0 : 0 + + protected set ProtectedProtected(v) { return; } +>ProtectedProtected : number +>v : number + + protected get ProtectedPrivate() { return 0; } +>ProtectedPrivate : number +>0 : 0 + + private set ProtectedPrivate(v) { return; } +>ProtectedPrivate : number +>v : number + + private get PrivatePublic() { return 0; } +>PrivatePublic : number +>0 : 0 + + set PrivatePublic(v) { return; } +>PrivatePublic : number +>v : number + + private get PrivateProtected() { return 0; } +>PrivateProtected : number +>0 : 0 + + protected set PrivateProtected(v) { return; } +>PrivateProtected : number +>v : number + + private get PrivatePrivate() { return 0; } +>PrivatePrivate : number +>0 : 0 + + private set PrivatePrivate(v) { return; } +>PrivatePrivate : number +>v : number + + test() { +>test : () => void + + this.PublicPublic = 0; +>this.PublicPublic = 0 : 0 +>this.PublicPublic : number +>this : this +>PublicPublic : number +>0 : 0 + + this.PublicProtected = 0; +>this.PublicProtected = 0 : 0 +>this.PublicProtected : number +>this : this +>PublicProtected : number +>0 : 0 + + this.PublicPrivate = 0; +>this.PublicPrivate = 0 : 0 +>this.PublicPrivate : number +>this : this +>PublicPrivate : number +>0 : 0 + + this.ProtectedPublic = 0; +>this.ProtectedPublic = 0 : 0 +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number +>0 : 0 + + this.ProtectedProtected = 0; +>this.ProtectedProtected = 0 : 0 +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number +>0 : 0 + + this.ProtectedPrivate = 0; +>this.ProtectedPrivate = 0 : 0 +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number +>0 : 0 + + this.PrivatePublic = 0; +>this.PrivatePublic = 0 : 0 +>this.PrivatePublic : number +>this : this +>PrivatePublic : number +>0 : 0 + + this.PrivateProtected = 0; +>this.PrivateProtected = 0 : 0 +>this.PrivateProtected : number +>this : this +>PrivateProtected : number +>0 : 0 + + this.PrivatePrivate = 0; +>this.PrivatePrivate = 0 : 0 +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number +>0 : 0 + + void this.PublicPublic; +>void this.PublicPublic : undefined +>this.PublicPublic : number +>this : this +>PublicPublic : number + + void this.PublicProtected; +>void this.PublicProtected : undefined +>this.PublicProtected : number +>this : this +>PublicProtected : number + + void this.PublicPrivate; +>void this.PublicPrivate : undefined +>this.PublicPrivate : number +>this : this +>PublicPrivate : number + + void this.ProtectedPublic; +>void this.ProtectedPublic : undefined +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number + + void this.ProtectedProtected; +>void this.ProtectedProtected : undefined +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number + + void this.ProtectedPrivate; +>void this.ProtectedPrivate : undefined +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number + + void this.PrivatePublic; +>void this.PrivatePublic : undefined +>this.PrivatePublic : number +>this : this +>PrivatePublic : number + + void this.PrivateProtected; +>void this.PrivateProtected : undefined +>this.PrivateProtected : number +>this : this +>PrivateProtected : number + + void this.PrivatePrivate; +>void this.PrivatePrivate : undefined +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number + + this.PublicPublic += 0; +>this.PublicPublic += 0 : number +>this.PublicPublic : number +>this : this +>PublicPublic : number +>0 : 0 + + this.PublicProtected += 0; +>this.PublicProtected += 0 : number +>this.PublicProtected : number +>this : this +>PublicProtected : number +>0 : 0 + + this.PublicPrivate += 0; +>this.PublicPrivate += 0 : number +>this.PublicPrivate : number +>this : this +>PublicPrivate : number +>0 : 0 + + this.ProtectedPublic += 0; +>this.ProtectedPublic += 0 : number +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number +>0 : 0 + + this.ProtectedProtected += 0; +>this.ProtectedProtected += 0 : number +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number +>0 : 0 + + this.ProtectedPrivate += 0; +>this.ProtectedPrivate += 0 : number +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number +>0 : 0 + + this.PrivatePublic += 0; +>this.PrivatePublic += 0 : number +>this.PrivatePublic : number +>this : this +>PrivatePublic : number +>0 : 0 + + this.PrivateProtected += 0; +>this.PrivateProtected += 0 : number +>this.PrivateProtected : number +>this : this +>PrivateProtected : number +>0 : 0 + + this.PrivatePrivate += 0; +>this.PrivatePrivate += 0 : number +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number +>0 : 0 + } +} + +class Derived extends Base { +>Derived : Derived +>Base : Base + + test2() { +>test2 : () => void + + this.PublicPublic = 0; +>this.PublicPublic = 0 : 0 +>this.PublicPublic : number +>this : this +>PublicPublic : number +>0 : 0 + + this.PublicProtected = 0; +>this.PublicProtected = 0 : 0 +>this.PublicProtected : number +>this : this +>PublicProtected : number +>0 : 0 + + this.PublicPrivate = 0; +>this.PublicPrivate = 0 : 0 +>this.PublicPrivate : number +>this : this +>PublicPrivate : number +>0 : 0 + + this.ProtectedPublic = 0; +>this.ProtectedPublic = 0 : 0 +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number +>0 : 0 + + this.ProtectedProtected = 0; +>this.ProtectedProtected = 0 : 0 +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number +>0 : 0 + + this.ProtectedPrivate = 0; +>this.ProtectedPrivate = 0 : 0 +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number +>0 : 0 + + this.PrivatePublic = 0; +>this.PrivatePublic = 0 : 0 +>this.PrivatePublic : number +>this : this +>PrivatePublic : number +>0 : 0 + + this.PrivateProtected = 0; +>this.PrivateProtected = 0 : 0 +>this.PrivateProtected : number +>this : this +>PrivateProtected : number +>0 : 0 + + this.PrivatePrivate = 0; +>this.PrivatePrivate = 0 : 0 +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number +>0 : 0 + + void this.PublicPublic; +>void this.PublicPublic : undefined +>this.PublicPublic : number +>this : this +>PublicPublic : number + + void this.PublicProtected; +>void this.PublicProtected : undefined +>this.PublicProtected : number +>this : this +>PublicProtected : number + + void this.PublicPrivate; +>void this.PublicPrivate : undefined +>this.PublicPrivate : number +>this : this +>PublicPrivate : number + + void this.ProtectedPublic; +>void this.ProtectedPublic : undefined +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number + + void this.ProtectedProtected; +>void this.ProtectedProtected : undefined +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number + + void this.ProtectedPrivate; +>void this.ProtectedPrivate : undefined +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number + + void this.PrivatePublic; +>void this.PrivatePublic : undefined +>this.PrivatePublic : number +>this : this +>PrivatePublic : number + + void this.PrivateProtected; +>void this.PrivateProtected : undefined +>this.PrivateProtected : number +>this : this +>PrivateProtected : number + + void this.PrivatePrivate; +>void this.PrivatePrivate : undefined +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number + + this.PublicPublic += 0; +>this.PublicPublic += 0 : number +>this.PublicPublic : number +>this : this +>PublicPublic : number +>0 : 0 + + this.PublicProtected += 0; +>this.PublicProtected += 0 : number +>this.PublicProtected : number +>this : this +>PublicProtected : number +>0 : 0 + + this.PublicPrivate += 0; +>this.PublicPrivate += 0 : number +>this.PublicPrivate : number +>this : this +>PublicPrivate : number +>0 : 0 + + this.ProtectedPublic += 0; +>this.ProtectedPublic += 0 : number +>this.ProtectedPublic : number +>this : this +>ProtectedPublic : number +>0 : 0 + + this.ProtectedProtected += 0; +>this.ProtectedProtected += 0 : number +>this.ProtectedProtected : number +>this : this +>ProtectedProtected : number +>0 : 0 + + this.ProtectedPrivate += 0; +>this.ProtectedPrivate += 0 : number +>this.ProtectedPrivate : number +>this : this +>ProtectedPrivate : number +>0 : 0 + + this.PrivatePublic += 0; +>this.PrivatePublic += 0 : number +>this.PrivatePublic : number +>this : this +>PrivatePublic : number +>0 : 0 + + this.PrivateProtected += 0; +>this.PrivateProtected += 0 : number +>this.PrivateProtected : number +>this : this +>PrivateProtected : number +>0 : 0 + + this.PrivatePrivate += 0; +>this.PrivatePrivate += 0 : number +>this.PrivatePrivate : number +>this : this +>PrivatePrivate : number +>0 : 0 + } +} + +declare const base: Base, deriv: Derived; +>base : Base +>deriv : Derived + +function fn() { +>fn : () => void + + base.PublicPublic = 0; +>base.PublicPublic = 0 : 0 +>base.PublicPublic : number +>base : Base +>PublicPublic : number +>0 : 0 + + base.PublicProtected = 0; +>base.PublicProtected = 0 : 0 +>base.PublicProtected : number +>base : Base +>PublicProtected : number +>0 : 0 + + base.PublicPrivate = 0; +>base.PublicPrivate = 0 : 0 +>base.PublicPrivate : number +>base : Base +>PublicPrivate : number +>0 : 0 + + base.ProtectedPublic = 0; +>base.ProtectedPublic = 0 : 0 +>base.ProtectedPublic : number +>base : Base +>ProtectedPublic : number +>0 : 0 + + base.ProtectedProtected = 0; +>base.ProtectedProtected = 0 : 0 +>base.ProtectedProtected : number +>base : Base +>ProtectedProtected : number +>0 : 0 + + base.ProtectedPrivate = 0; +>base.ProtectedPrivate = 0 : 0 +>base.ProtectedPrivate : number +>base : Base +>ProtectedPrivate : number +>0 : 0 + + base.PrivatePublic = 0; +>base.PrivatePublic = 0 : 0 +>base.PrivatePublic : number +>base : Base +>PrivatePublic : number +>0 : 0 + + base.PrivateProtected = 0; +>base.PrivateProtected = 0 : 0 +>base.PrivateProtected : number +>base : Base +>PrivateProtected : number +>0 : 0 + + base.PrivatePrivate = 0; +>base.PrivatePrivate = 0 : 0 +>base.PrivatePrivate : number +>base : Base +>PrivatePrivate : number +>0 : 0 + + void base.PublicPublic; +>void base.PublicPublic : undefined +>base.PublicPublic : number +>base : Base +>PublicPublic : number + + void base.PublicProtected; +>void base.PublicProtected : undefined +>base.PublicProtected : number +>base : Base +>PublicProtected : number + + void base.PublicPrivate; +>void base.PublicPrivate : undefined +>base.PublicPrivate : number +>base : Base +>PublicPrivate : number + + void base.ProtectedPublic; +>void base.ProtectedPublic : undefined +>base.ProtectedPublic : number +>base : Base +>ProtectedPublic : number + + void base.ProtectedProtected; +>void base.ProtectedProtected : undefined +>base.ProtectedProtected : number +>base : Base +>ProtectedProtected : number + + void base.ProtectedPrivate; +>void base.ProtectedPrivate : undefined +>base.ProtectedPrivate : number +>base : Base +>ProtectedPrivate : number + + void base.PrivatePublic; +>void base.PrivatePublic : undefined +>base.PrivatePublic : number +>base : Base +>PrivatePublic : number + + void base.PrivateProtected; +>void base.PrivateProtected : undefined +>base.PrivateProtected : number +>base : Base +>PrivateProtected : number + + void base.PrivatePrivate; +>void base.PrivatePrivate : undefined +>base.PrivatePrivate : number +>base : Base +>PrivatePrivate : number + + base.PublicPublic += 0; +>base.PublicPublic += 0 : number +>base.PublicPublic : number +>base : Base +>PublicPublic : number +>0 : 0 + + base.PublicProtected += 0; +>base.PublicProtected += 0 : number +>base.PublicProtected : number +>base : Base +>PublicProtected : number +>0 : 0 + + base.PublicPrivate += 0; +>base.PublicPrivate += 0 : number +>base.PublicPrivate : number +>base : Base +>PublicPrivate : number +>0 : 0 + + base.ProtectedPublic += 0; +>base.ProtectedPublic += 0 : number +>base.ProtectedPublic : number +>base : Base +>ProtectedPublic : number +>0 : 0 + + base.ProtectedProtected += 0; +>base.ProtectedProtected += 0 : number +>base.ProtectedProtected : number +>base : Base +>ProtectedProtected : number +>0 : 0 + + base.ProtectedPrivate += 0; +>base.ProtectedPrivate += 0 : number +>base.ProtectedPrivate : number +>base : Base +>ProtectedPrivate : number +>0 : 0 + + base.PrivatePublic += 0; +>base.PrivatePublic += 0 : number +>base.PrivatePublic : number +>base : Base +>PrivatePublic : number +>0 : 0 + + base.PrivateProtected += 0; +>base.PrivateProtected += 0 : number +>base.PrivateProtected : number +>base : Base +>PrivateProtected : number +>0 : 0 + + base.PrivatePrivate += 0; +>base.PrivatePrivate += 0 : number +>base.PrivatePrivate : number +>base : Base +>PrivatePrivate : number +>0 : 0 + + deriv.PublicPublic = 0; +>deriv.PublicPublic = 0 : 0 +>deriv.PublicPublic : number +>deriv : Derived +>PublicPublic : number +>0 : 0 + + deriv.PublicProtected = 0; +>deriv.PublicProtected = 0 : 0 +>deriv.PublicProtected : number +>deriv : Derived +>PublicProtected : number +>0 : 0 + + deriv.PublicPrivate = 0; +>deriv.PublicPrivate = 0 : 0 +>deriv.PublicPrivate : number +>deriv : Derived +>PublicPrivate : number +>0 : 0 + + deriv.ProtectedPublic = 0; +>deriv.ProtectedPublic = 0 : 0 +>deriv.ProtectedPublic : number +>deriv : Derived +>ProtectedPublic : number +>0 : 0 + + deriv.ProtectedProtected = 0; +>deriv.ProtectedProtected = 0 : 0 +>deriv.ProtectedProtected : number +>deriv : Derived +>ProtectedProtected : number +>0 : 0 + + deriv.ProtectedPrivate = 0; +>deriv.ProtectedPrivate = 0 : 0 +>deriv.ProtectedPrivate : number +>deriv : Derived +>ProtectedPrivate : number +>0 : 0 + + deriv.PrivatePublic = 0; +>deriv.PrivatePublic = 0 : 0 +>deriv.PrivatePublic : number +>deriv : Derived +>PrivatePublic : number +>0 : 0 + + deriv.PrivateProtected = 0; +>deriv.PrivateProtected = 0 : 0 +>deriv.PrivateProtected : number +>deriv : Derived +>PrivateProtected : number +>0 : 0 + + deriv.PrivatePrivate = 0; +>deriv.PrivatePrivate = 0 : 0 +>deriv.PrivatePrivate : number +>deriv : Derived +>PrivatePrivate : number +>0 : 0 + + void deriv.PublicPublic; +>void deriv.PublicPublic : undefined +>deriv.PublicPublic : number +>deriv : Derived +>PublicPublic : number + + void deriv.PublicProtected; +>void deriv.PublicProtected : undefined +>deriv.PublicProtected : number +>deriv : Derived +>PublicProtected : number + + void deriv.PublicPrivate; +>void deriv.PublicPrivate : undefined +>deriv.PublicPrivate : number +>deriv : Derived +>PublicPrivate : number + + void deriv.ProtectedPublic; +>void deriv.ProtectedPublic : undefined +>deriv.ProtectedPublic : number +>deriv : Derived +>ProtectedPublic : number + + void deriv.ProtectedProtected; +>void deriv.ProtectedProtected : undefined +>deriv.ProtectedProtected : number +>deriv : Derived +>ProtectedProtected : number + + void deriv.ProtectedPrivate; +>void deriv.ProtectedPrivate : undefined +>deriv.ProtectedPrivate : number +>deriv : Derived +>ProtectedPrivate : number + + void deriv.PrivatePublic; +>void deriv.PrivatePublic : undefined +>deriv.PrivatePublic : number +>deriv : Derived +>PrivatePublic : number + + void deriv.PrivateProtected; +>void deriv.PrivateProtected : undefined +>deriv.PrivateProtected : number +>deriv : Derived +>PrivateProtected : number + + void deriv.PrivatePrivate; +>void deriv.PrivatePrivate : undefined +>deriv.PrivatePrivate : number +>deriv : Derived +>PrivatePrivate : number + + deriv.PublicPublic += 0; +>deriv.PublicPublic += 0 : number +>deriv.PublicPublic : number +>deriv : Derived +>PublicPublic : number +>0 : 0 + + deriv.PublicProtected += 0; +>deriv.PublicProtected += 0 : number +>deriv.PublicProtected : number +>deriv : Derived +>PublicProtected : number +>0 : 0 + + deriv.PublicPrivate += 0; +>deriv.PublicPrivate += 0 : number +>deriv.PublicPrivate : number +>deriv : Derived +>PublicPrivate : number +>0 : 0 + + deriv.ProtectedPublic += 0; +>deriv.ProtectedPublic += 0 : number +>deriv.ProtectedPublic : number +>deriv : Derived +>ProtectedPublic : number +>0 : 0 + + deriv.ProtectedProtected += 0; +>deriv.ProtectedProtected += 0 : number +>deriv.ProtectedProtected : number +>deriv : Derived +>ProtectedProtected : number +>0 : 0 + + deriv.ProtectedPrivate += 0; +>deriv.ProtectedPrivate += 0 : number +>deriv.ProtectedPrivate : number +>deriv : Derived +>ProtectedPrivate : number +>0 : 0 + + deriv.PrivatePublic += 0; +>deriv.PrivatePublic += 0 : number +>deriv.PrivatePublic : number +>deriv : Derived +>PrivatePublic : number +>0 : 0 + + deriv.PrivateProtected += 0; +>deriv.PrivateProtected += 0 : number +>deriv.PrivateProtected : number +>deriv : Derived +>PrivateProtected : number +>0 : 0 + + deriv.PrivatePrivate += 0; +>deriv.PrivatePrivate += 0 : number +>deriv.PrivatePrivate : number +>deriv : Derived +>PrivatePrivate : number +>0 : 0 +} + diff --git a/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt index a16cbfe7b37a5..9d9b6421af36a 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType.errors.txt @@ -1,21 +1,18 @@ tests/cases/compiler/getAndSetNotIdenticalType.ts(2,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType.ts(2,9): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/compiler/getAndSetNotIdenticalType.ts(2,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/compiler/getAndSetNotIdenticalType.ts(5,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType.ts(5,9): error TS2380: 'get' and 'set' accessor must have the same type. -==== tests/cases/compiler/getAndSetNotIdenticalType.ts (4 errors) ==== +==== tests/cases/compiler/getAndSetNotIdenticalType.ts (3 errors) ==== class C { get x(): number { ~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type return 1; } set x(v: string) { } ~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. } \ No newline at end of file diff --git a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt index 2f9c494b9a943..e68552b0bd284 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt @@ -1,10 +1,11 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/compiler/getAndSetNotIdenticalType2.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType2.ts(8,9): error TS2380: 'get' and 'set' accessor must have the same type. tests/cases/compiler/getAndSetNotIdenticalType2.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'T'. 'T' could be instantiated with an arbitrary type which could be unrelated to 'string'. +tests/cases/compiler/getAndSetNotIdenticalType2.ts(15,1): error TS2322: Type 'A' is not assignable to type 'A'. + Type 'unknown' is not assignable to type 'string'. ==== tests/cases/compiler/getAndSetNotIdenticalType2.ts (5 errors) ==== @@ -16,14 +17,12 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(9,9): error TS2322: Type 'A) { ~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. this.data = v; ~~~~~~~~~ !!! error TS2322: Type 'A' is not assignable to type 'A'. @@ -34,4 +33,7 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. +!!! error TS2322: Type 'unknown' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/getAndSetNotIdenticalType2.types b/tests/baselines/reference/getAndSetNotIdenticalType2.types index b5d4705fd6bc4..d7d903cfe5f8d 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType2.types +++ b/tests/baselines/reference/getAndSetNotIdenticalType2.types @@ -43,8 +43,8 @@ var r = x.x; x.x = r; >x.x = r : A ->x.x : A +>x.x : A >x : C ->x : A +>x : A >r : A diff --git a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt index 3fb17d65a400b..821b7e2163311 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt @@ -1,9 +1,10 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/compiler/getAndSetNotIdenticalType3.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/getAndSetNotIdenticalType3.ts(8,9): error TS2380: 'get' and 'set' accessor must have the same type. tests/cases/compiler/getAndSetNotIdenticalType3.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'number'. +tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A' is not assignable to type 'A'. + Type 'number' is not assignable to type 'string'. ==== tests/cases/compiler/getAndSetNotIdenticalType3.ts (5 errors) ==== @@ -15,14 +16,12 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(9,9): error TS2322: Type 'A) { ~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. this.data = v; ~~~~~~~~~ !!! error TS2322: Type 'A' is not assignable to type 'A'. @@ -32,4 +31,7 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/getAndSetNotIdenticalType3.types b/tests/baselines/reference/getAndSetNotIdenticalType3.types index e5722f57393fb..45ecfa6a485d5 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType3.types +++ b/tests/baselines/reference/getAndSetNotIdenticalType3.types @@ -43,8 +43,8 @@ var r = x.x; x.x = r; >x.x = r : A ->x.x : A +>x.x : A >x : C ->x : A +>x : A >r : A diff --git a/tests/baselines/reference/gettersAndSettersAccessibility.errors.txt b/tests/baselines/reference/gettersAndSettersAccessibility.errors.txt index faccaab8fdfc2..33513b5126db6 100644 --- a/tests/baselines/reference/gettersAndSettersAccessibility.errors.txt +++ b/tests/baselines/reference/gettersAndSettersAccessibility.errors.txt @@ -1,7 +1,7 @@ tests/cases/compiler/gettersAndSettersAccessibility.ts(2,14): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/gettersAndSettersAccessibility.ts(2,14): error TS2379: Getter and setter accessors do not agree in visibility. +tests/cases/compiler/gettersAndSettersAccessibility.ts(2,14): error TS2803: A get accessor must be at least as accessible as the setter tests/cases/compiler/gettersAndSettersAccessibility.ts(3,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/gettersAndSettersAccessibility.ts(3,13): error TS2379: Getter and setter accessors do not agree in visibility. +tests/cases/compiler/gettersAndSettersAccessibility.ts(3,13): error TS2803: A get accessor must be at least as accessible as the setter ==== tests/cases/compiler/gettersAndSettersAccessibility.ts (4 errors) ==== @@ -10,11 +10,11 @@ tests/cases/compiler/gettersAndSettersAccessibility.ts(3,13): error TS2379: Gett ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. +!!! error TS2803: A get accessor must be at least as accessible as the setter public set Baz(n:number) {} // error - accessors do not agree in visibility ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. +!!! error TS2803: A get accessor must be at least as accessible as the setter } \ No newline at end of file diff --git a/tests/baselines/reference/gettersAndSettersErrors.errors.txt b/tests/baselines/reference/gettersAndSettersErrors.errors.txt index 013e195876e86..23cf7883bafc1 100644 --- a/tests/baselines/reference/gettersAndSettersErrors.errors.txt +++ b/tests/baselines/reference/gettersAndSettersErrors.errors.txt @@ -5,9 +5,9 @@ tests/cases/compiler/gettersAndSettersErrors.ts(5,12): error TS2717: Subsequent tests/cases/compiler/gettersAndSettersErrors.ts(6,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/gettersAndSettersErrors.ts(7,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/gettersAndSettersErrors.ts(11,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/gettersAndSettersErrors.ts(11,17): error TS2379: Getter and setter accessors do not agree in visibility. +tests/cases/compiler/gettersAndSettersErrors.ts(11,17): error TS2803: A get accessor must be at least as accessible as the setter tests/cases/compiler/gettersAndSettersErrors.ts(12,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/gettersAndSettersErrors.ts(12,16): error TS2379: Getter and setter accessors do not agree in visibility. +tests/cases/compiler/gettersAndSettersErrors.ts(12,16): error TS2803: A get accessor must be at least as accessible as the setter ==== tests/cases/compiler/gettersAndSettersErrors.ts (10 errors) ==== @@ -38,12 +38,12 @@ tests/cases/compiler/gettersAndSettersErrors.ts(12,16): error TS2379: Getter and ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. +!!! error TS2803: A get accessor must be at least as accessible as the setter public set Baz(n:number) {} // error - accessors do not agree in visibility ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. +!!! error TS2803: A get accessor must be at least as accessible as the setter } diff --git a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt index e7584c3d831a8..bbe4984571f31 100644 --- a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt +++ b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt @@ -4,11 +4,13 @@ tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIn Type 'Number' has no call signatures. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(26,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(29,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(40,5): error TS2322: Type 'string' is not assignable to type 'U'. + 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(41,16): error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? Type 'String' has no call signatures. -==== tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts (6 errors) ==== +==== tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts (7 errors) ==== module NonGeneric { class C { x: string; @@ -60,6 +62,9 @@ tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIn var r2 = r.x; var r3 = r.y; r.y = ''; + ~~~ +!!! error TS2322: Type 'string' is not assignable to type 'U'. +!!! error TS2322: 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. var r6 = d.y(); // error ~ !!! error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? diff --git a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types index c39aa38303459..047c2d8032968 100644 --- a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types +++ b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types @@ -135,9 +135,9 @@ module Generic { r.y = ''; >r.y = '' : "" ->r.y : string +>r.y : U >r : D ->y : string +>y : U >'' : "" var r6 = d.y(); // error diff --git a/tests/baselines/reference/instancePropertyInClassType.errors.txt b/tests/baselines/reference/instancePropertyInClassType.errors.txt index 224290a4c001b..0ec5f44c9be68 100644 --- a/tests/baselines/reference/instancePropertyInClassType.errors.txt +++ b/tests/baselines/reference/instancePropertyInClassType.errors.txt @@ -4,11 +4,13 @@ tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.t Type 'Number' has no call signatures. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(24,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(27,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(36,5): error TS2322: Type 'string' is not assignable to type 'U'. + 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(37,16): error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? Type 'String' has no call signatures. -==== tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts (6 errors) ==== +==== tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts (7 errors) ==== module NonGeneric { class C { x: string; @@ -56,6 +58,9 @@ tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.t var r2 = r.x; var r3 = r.y; r.y = ''; + ~~~ +!!! error TS2322: Type 'string' is not assignable to type 'U'. +!!! error TS2322: 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. var r6 = c.y(); // error ~ !!! error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? diff --git a/tests/baselines/reference/instancePropertyInClassType.types b/tests/baselines/reference/instancePropertyInClassType.types index 36c04c5aa1a18..96a22e233b724 100644 --- a/tests/baselines/reference/instancePropertyInClassType.types +++ b/tests/baselines/reference/instancePropertyInClassType.types @@ -125,9 +125,9 @@ module Generic { r.y = ''; >r.y = '' : "" ->r.y : string +>r.y : U >r : C ->y : string +>y : U >'' : "" var r6 = c.y(); // error diff --git a/tests/baselines/reference/jsdocAccessibilityTags.errors.txt b/tests/baselines/reference/jsdocAccessibilityTags.errors.txt index bcbad8b95eaf2..2edc3816d24b2 100644 --- a/tests/baselines/reference/jsdocAccessibilityTags.errors.txt +++ b/tests/baselines/reference/jsdocAccessibilityTags.errors.txt @@ -1,5 +1,3 @@ -tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(21,9): error TS2379: Getter and setter accessors do not agree in visibility. -tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(23,9): error TS2379: Getter and setter accessors do not agree in visibility. tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(50,14): error TS2341: Property 'priv' is private and only accessible within class 'A'. tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(55,14): error TS2341: Property 'priv2' is private and only accessible within class 'C'. tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(58,9): error TS2341: Property 'priv' is private and only accessible within class 'A'. @@ -12,7 +10,7 @@ tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(61,9): error TS2341: Prop tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(61,25): error TS2445: Property 'prot2' is protected and only accessible within class 'C' and its subclasses. -==== tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js (12 errors) ==== +==== tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js (10 errors) ==== class A { /** * Ap docs @@ -34,12 +32,8 @@ tests/cases/conformance/jsdoc/jsdocAccessibilityTag.js(61,25): error TS2445: Pro pub = 6; /** @public */ get ack() { return this.priv } - ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. /** @private */ set ack(value) { } - ~~~ -!!! error TS2379: Getter and setter accessors do not agree in visibility. } class C { constructor() { diff --git a/tests/baselines/reference/objectLiteralErrors.errors.txt b/tests/baselines/reference/objectLiteralErrors.errors.txt index fa97ae0ddf406..2a6114ed0957e 100644 --- a/tests/baselines/reference/objectLiteralErrors.errors.txt +++ b/tests/baselines/reference/objectLiteralErrors.errors.txt @@ -71,14 +71,12 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(38,26) tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,13): error TS2300: Duplicate identifier 'a'. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,46): error TS1119: An object literal cannot have property and accessor with the same name. tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(39,46): error TS2300: Duplicate identifier 'a'. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(42,16): error TS2380: 'get' and 'set' accessor must have the same type. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(42,47): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(42,16): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(43,22): error TS2322: Type 'number' is not assignable to type 'string'. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(44,16): error TS2380: 'get' and 'set' accessor must have the same type. -tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(44,55): error TS2380: 'get' and 'set' accessor must have the same type. +tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(44,16): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type -==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (78 errors) ==== +==== tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts (76 errors) ==== // Multiple properties with the same name var e1 = { a: 0, a: 0 }; ~ @@ -268,15 +266,11 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralErrors.ts(44,55) // Get and set accessor with mismatched type annotations var g1 = { get a(): number { return 4; }, set a(n: string) { } }; ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. - ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type var g2 = { get a() { return 4; }, set a(n: string) { } }; ~~~~~~~~~ !!! error TS2322: Type 'number' is not assignable to type 'string'. var g3 = { get a(): number { return undefined; }, set a(n: string) { } }; ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. - ~ -!!! error TS2380: 'get' and 'set' accessor must have the same type. +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt index c44ec084989b9..e7e77530b1c0c 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt @@ -1,4 +1,6 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(3,5): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(22,1): error TS2322: Type 'number' is not assignable to type 'T'. + 'T' could be instantiated with an arbitrary type which could be unrelated to 'number'. tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(24,3): error TS18013: Property '#foo' is not accessible outside class 'C' because it has a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(25,1): error TS2322: Type 'C' is not assignable to type 'C'. Type 'string' is not assignable to type 'number'. @@ -6,7 +8,7 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClass Type 'number' is not assignable to type 'string'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts (4 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts (5 errors) ==== class C { #foo: T; #bar(): T { @@ -31,6 +33,9 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClass let b = new C("hello"); a.baz = 5 // OK + ~~~~~ +!!! error TS2322: Type 'number' is not assignable to type 'T'. +!!! error TS2322: 'T' could be instantiated with an arbitrary type which could be unrelated to 'number'. const x: number = a.baz // OK a.#foo; // Error ~~~~ diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.types b/tests/baselines/reference/privateNamesAndGenericClasses-2.types index 42f5b237d06fa..d9ce992505e3a 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.types +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.types @@ -62,9 +62,9 @@ let b = new C("hello"); a.baz = 5 // OK >a.baz = 5 : 5 ->a.baz : number +>a.baz : T >a : C ->baz : number +>baz : T >5 : 5 const x: number = a.baz // OK diff --git a/tests/cases/compiler/divergentAccessors1.ts b/tests/cases/compiler/divergentAccessors1.ts new file mode 100644 index 0000000000000..1fe032ca3a678 --- /dev/null +++ b/tests/cases/compiler/divergentAccessors1.ts @@ -0,0 +1,25 @@ +// @strict: true + +// Accessors in interfaces/types + +{ + interface IHasGetSet { + get foo(): number; + set foo(): number | string; + } + + declare const ihgs: IHasGetSet; + ihgs.foo = "32"; + let r_ihgs_foo: number = ihgs.foo; +} + +{ + type T_HasGetSet = { + get foo(): number; + set foo(): number | string; + } + + declare const t_hgs: T_HasGetSet; + t_hgs.foo = "32"; + let r_t_hgs_foo: number = t_hgs.foo; +} diff --git a/tests/cases/compiler/divergentAccessorsTypes1.ts b/tests/cases/compiler/divergentAccessorsTypes1.ts new file mode 100644 index 0000000000000..fb3e5c63dd78c --- /dev/null +++ b/tests/cases/compiler/divergentAccessorsTypes1.ts @@ -0,0 +1,66 @@ +// @strict: true +// @target: esnext + +class Test1 { + get foo(): string { return "" } + set foo(s: string | number) { + let a = s as string; + let b = s as number; + } + + get bar(): string | number { return "" } + set bar(s: string | number | boolean) { + } +} + +interface Test2 { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +} + +type Test3 = { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +}; + +{ + const t = new Test1(); + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test2; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test3; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} \ No newline at end of file diff --git a/tests/cases/compiler/divergentAccessorsVisibility1.ts b/tests/cases/compiler/divergentAccessorsVisibility1.ts new file mode 100644 index 0000000000000..2ab11a295d984 --- /dev/null +++ b/tests/cases/compiler/divergentAccessorsVisibility1.ts @@ -0,0 +1,160 @@ +// @strict: true +// @target: esnext + +class Base { + get PublicPublic() { return 0; } + set PublicPublic(v) { return; } + + get PublicProtected() { return 0; } + protected set PublicProtected(v) { return; } + + get PublicPrivate() { return 0; } + private set PublicPrivate(v) { return; } + + protected get ProtectedPublic() { return 0; } + set ProtectedPublic(v) { return; } + + protected get ProtectedProtected() { return 0; } + protected set ProtectedProtected(v) { return; } + + protected get ProtectedPrivate() { return 0; } + private set ProtectedPrivate(v) { return; } + + private get PrivatePublic() { return 0; } + set PrivatePublic(v) { return; } + + private get PrivateProtected() { return 0; } + protected set PrivateProtected(v) { return; } + + private get PrivatePrivate() { return 0; } + private set PrivatePrivate(v) { return; } + + test() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} + +class Derived extends Base { + test2() { + this.PublicPublic = 0; + this.PublicProtected = 0; + this.PublicPrivate = 0; + this.ProtectedPublic = 0; + this.ProtectedProtected = 0; + this.ProtectedPrivate = 0; + this.PrivatePublic = 0; + this.PrivateProtected = 0; + this.PrivatePrivate = 0; + + void this.PublicPublic; + void this.PublicProtected; + void this.PublicPrivate; + void this.ProtectedPublic; + void this.ProtectedProtected; + void this.ProtectedPrivate; + void this.PrivatePublic; + void this.PrivateProtected; + void this.PrivatePrivate; + + this.PublicPublic += 0; + this.PublicProtected += 0; + this.PublicPrivate += 0; + this.ProtectedPublic += 0; + this.ProtectedProtected += 0; + this.ProtectedPrivate += 0; + this.PrivatePublic += 0; + this.PrivateProtected += 0; + this.PrivatePrivate += 0; + } +} + +declare const base: Base, deriv: Derived; +function fn() { + base.PublicPublic = 0; + base.PublicProtected = 0; + base.PublicPrivate = 0; + base.ProtectedPublic = 0; + base.ProtectedProtected = 0; + base.ProtectedPrivate = 0; + base.PrivatePublic = 0; + base.PrivateProtected = 0; + base.PrivatePrivate = 0; + + void base.PublicPublic; + void base.PublicProtected; + void base.PublicPrivate; + void base.ProtectedPublic; + void base.ProtectedProtected; + void base.ProtectedPrivate; + void base.PrivatePublic; + void base.PrivateProtected; + void base.PrivatePrivate; + + base.PublicPublic += 0; + base.PublicProtected += 0; + base.PublicPrivate += 0; + base.ProtectedPublic += 0; + base.ProtectedProtected += 0; + base.ProtectedPrivate += 0; + base.PrivatePublic += 0; + base.PrivateProtected += 0; + base.PrivatePrivate += 0; + + deriv.PublicPublic = 0; + deriv.PublicProtected = 0; + deriv.PublicPrivate = 0; + deriv.ProtectedPublic = 0; + deriv.ProtectedProtected = 0; + deriv.ProtectedPrivate = 0; + deriv.PrivatePublic = 0; + deriv.PrivateProtected = 0; + deriv.PrivatePrivate = 0; + + void deriv.PublicPublic; + void deriv.PublicProtected; + void deriv.PublicPrivate; + void deriv.ProtectedPublic; + void deriv.ProtectedProtected; + void deriv.ProtectedPrivate; + void deriv.PrivatePublic; + void deriv.PrivateProtected; + void deriv.PrivatePrivate; + + deriv.PublicPublic += 0; + deriv.PublicProtected += 0; + deriv.PublicPrivate += 0; + deriv.ProtectedPublic += 0; + deriv.ProtectedProtected += 0; + deriv.ProtectedPrivate += 0; + deriv.PrivatePublic += 0; + deriv.PrivateProtected += 0; + deriv.PrivatePrivate += 0; +} diff --git a/tests/cases/fourslash/incrementalResolveAccessor.ts b/tests/cases/fourslash/incrementalResolveAccessor.ts index 810c0db143803..456b7e3a69278 100644 --- a/tests/cases/fourslash/incrementalResolveAccessor.ts +++ b/tests/cases/fourslash/incrementalResolveAccessor.ts @@ -16,4 +16,4 @@ verify.quickInfoAt("1", "var b: string"); // TypeCheck -verify.numberOfErrorsInCurrentFile(3); \ No newline at end of file +verify.numberOfErrorsInCurrentFile(2); \ No newline at end of file From 04170ad863aceb893fd4010f7f5b2dd937ac8e92 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 13:06:56 -0700 Subject: [PATCH 02/19] Error if an accessor body appears in a type context --- src/compiler/checker.ts | 9 +++-- .../accessorBodyInTypeContext.errors.txt | 32 +++++++++++++++++ .../reference/accessorBodyInTypeContext.js | 20 +++++++++++ .../accessorBodyInTypeContext.symbols | 34 +++++++++++++++++++ .../reference/accessorBodyInTypeContext.types | 32 +++++++++++++++++ .../compiler/accessorBodyInTypeContext.ts | 16 +++++++++ 6 files changed, 141 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/accessorBodyInTypeContext.errors.txt create mode 100644 tests/baselines/reference/accessorBodyInTypeContext.js create mode 100644 tests/baselines/reference/accessorBodyInTypeContext.symbols create mode 100644 tests/baselines/reference/accessorBodyInTypeContext.types create mode 100644 tests/cases/compiler/accessorBodyInTypeContext.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 552263798e2ae..5aa500a287621 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -40911,8 +40911,13 @@ namespace ts { return grammarErrorAtPos(accessor, accessor.end - 1, ";".length, Diagnostics._0_expected, "{"); } } - if (accessor.body && hasSyntacticModifier(accessor, ModifierFlags.Abstract)) { - return grammarErrorOnNode(accessor, Diagnostics.An_abstract_accessor_cannot_have_an_implementation); + if (accessor.body) { + if (hasSyntacticModifier(accessor, ModifierFlags.Abstract)) { + return grammarErrorOnNode(accessor, Diagnostics.An_abstract_accessor_cannot_have_an_implementation); + } + if (accessor.parent.kind === SyntaxKind.TypeLiteral || accessor.parent.kind === SyntaxKind.InterfaceDeclaration) { + return grammarErrorOnNode(accessor.body, Diagnostics.An_implementation_cannot_be_declared_in_ambient_contexts) + } } if (accessor.typeParameters) { return grammarErrorOnNode(accessor.name, Diagnostics.An_accessor_cannot_have_type_parameters); diff --git a/tests/baselines/reference/accessorBodyInTypeContext.errors.txt b/tests/baselines/reference/accessorBodyInTypeContext.errors.txt new file mode 100644 index 0000000000000..fad18097a98d7 --- /dev/null +++ b/tests/baselines/reference/accessorBodyInTypeContext.errors.txt @@ -0,0 +1,32 @@ +tests/cases/compiler/accessorBodyInTypeContext.ts(2,15): error TS1183: An implementation cannot be declared in ambient contexts. +tests/cases/compiler/accessorBodyInTypeContext.ts(6,21): error TS1183: An implementation cannot be declared in ambient contexts. +tests/cases/compiler/accessorBodyInTypeContext.ts(10,15): error TS1183: An implementation cannot be declared in ambient contexts. +tests/cases/compiler/accessorBodyInTypeContext.ts(14,21): error TS1183: An implementation cannot be declared in ambient contexts. + + +==== tests/cases/compiler/accessorBodyInTypeContext.ts (4 errors) ==== + type A = { + get foo() { return 0 } + ~~~~~~~~~~~~ +!!! error TS1183: An implementation cannot be declared in ambient contexts. + }; + + type B = { + set foo(v: any) { } + ~~~ +!!! error TS1183: An implementation cannot be declared in ambient contexts. + }; + + interface X { + get foo() { return 0 } + ~~~~~~~~~~~~ +!!! error TS1183: An implementation cannot be declared in ambient contexts. + } + + interface Y { + set foo(v: any) { } + ~~~ +!!! error TS1183: An implementation cannot be declared in ambient contexts. + } + + \ No newline at end of file diff --git a/tests/baselines/reference/accessorBodyInTypeContext.js b/tests/baselines/reference/accessorBodyInTypeContext.js new file mode 100644 index 0000000000000..d99110e329cd0 --- /dev/null +++ b/tests/baselines/reference/accessorBodyInTypeContext.js @@ -0,0 +1,20 @@ +//// [accessorBodyInTypeContext.ts] +type A = { + get foo() { return 0 } +}; + +type B = { + set foo(v: any) { } +}; + +interface X { + get foo() { return 0 } +} + +interface Y { + set foo(v: any) { } +} + + + +//// [accessorBodyInTypeContext.js] diff --git a/tests/baselines/reference/accessorBodyInTypeContext.symbols b/tests/baselines/reference/accessorBodyInTypeContext.symbols new file mode 100644 index 0000000000000..4eb8bfd31289e --- /dev/null +++ b/tests/baselines/reference/accessorBodyInTypeContext.symbols @@ -0,0 +1,34 @@ +=== tests/cases/compiler/accessorBodyInTypeContext.ts === +type A = { +>A : Symbol(A, Decl(accessorBodyInTypeContext.ts, 0, 0)) + + get foo() { return 0 } +>foo : Symbol(foo, Decl(accessorBodyInTypeContext.ts, 0, 10)) + +}; + +type B = { +>B : Symbol(B, Decl(accessorBodyInTypeContext.ts, 2, 2)) + + set foo(v: any) { } +>foo : Symbol(foo, Decl(accessorBodyInTypeContext.ts, 4, 10)) +>v : Symbol(v, Decl(accessorBodyInTypeContext.ts, 5, 12)) + +}; + +interface X { +>X : Symbol(X, Decl(accessorBodyInTypeContext.ts, 6, 2)) + + get foo() { return 0 } +>foo : Symbol(X.foo, Decl(accessorBodyInTypeContext.ts, 8, 13)) +} + +interface Y { +>Y : Symbol(Y, Decl(accessorBodyInTypeContext.ts, 10, 1)) + + set foo(v: any) { } +>foo : Symbol(Y.foo, Decl(accessorBodyInTypeContext.ts, 12, 13)) +>v : Symbol(v, Decl(accessorBodyInTypeContext.ts, 13, 12)) +} + + diff --git a/tests/baselines/reference/accessorBodyInTypeContext.types b/tests/baselines/reference/accessorBodyInTypeContext.types new file mode 100644 index 0000000000000..ad04c25524d88 --- /dev/null +++ b/tests/baselines/reference/accessorBodyInTypeContext.types @@ -0,0 +1,32 @@ +=== tests/cases/compiler/accessorBodyInTypeContext.ts === +type A = { +>A : A + + get foo() { return 0 } +>foo : number +>0 : 0 + +}; + +type B = { +>B : B + + set foo(v: any) { } +>foo : any +>v : any + +}; + +interface X { + get foo() { return 0 } +>foo : number +>0 : 0 +} + +interface Y { + set foo(v: any) { } +>foo : any +>v : any +} + + diff --git a/tests/cases/compiler/accessorBodyInTypeContext.ts b/tests/cases/compiler/accessorBodyInTypeContext.ts new file mode 100644 index 0000000000000..bfbc183077af4 --- /dev/null +++ b/tests/cases/compiler/accessorBodyInTypeContext.ts @@ -0,0 +1,16 @@ +type A = { + get foo() { return 0 } +}; + +type B = { + set foo(v: any) { } +}; + +interface X { + get foo() { return 0 } +} + +interface Y { + set foo(v: any) { } +} + From 8086a03a1e59fc7c7a72cd95b81ac747a30340a1 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 13:19:05 -0700 Subject: [PATCH 03/19] Fix indent --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6ccd31b97d8b3..4c904e184c857 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26574,7 +26574,7 @@ namespace ts { node: PropertyAccessExpression | QualifiedName | PropertyAccessExpression | VariableDeclaration | ParameterDeclaration | ImportTypeNode | PropertyAssignment | ShorthandPropertyAssignment | BindingElement, isSuper: boolean, type: Type, prop: Symbol, reportError = true, isWrite = false): boolean { - const flags = getDeclarationModifierFlagsFromSymbol(prop, isWrite); + const flags = getDeclarationModifierFlagsFromSymbol(prop, isWrite); const errorNode = node.kind === SyntaxKind.QualifiedName ? node.right : node.kind === SyntaxKind.ImportType ? node : node.kind === SyntaxKind.BindingElement && node.propertyName ? node.propertyName : node.name; From 0e527c0915c1a5386268f0686321150b4df00a1b Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 13:21:39 -0700 Subject: [PATCH 04/19] Remove stray debugger statement --- src/compiler/parser.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 220f789ffd4c1..a3f3f975e486f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1340,8 +1340,6 @@ namespace ts { } function parseErrorAtPosition(start: number, length: number, message: DiagnosticMessage, arg0?: any): void { - debugger; - // Don't report another error if it would just be at the same position as the last error. const lastError = lastOrUndefined(parseDiagnostics); if (!lastError || start !== lastError.start) { From b4c8ff6017ded58807d3040e5760102f1e661849 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 13:25:27 -0700 Subject: [PATCH 05/19] Fix stray error in tst --- .../reference/divergentAccessors1.errors.txt | 12 +++--------- tests/baselines/reference/divergentAccessors1.js | 6 ++++-- .../reference/divergentAccessors1.symbols | 16 ++++++++-------- .../reference/divergentAccessors1.types | 8 ++++++-- tests/cases/compiler/divergentAccessors1.ts | 4 ++-- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/baselines/reference/divergentAccessors1.errors.txt b/tests/baselines/reference/divergentAccessors1.errors.txt index 9ca99b87fce71..de330cbccf74d 100644 --- a/tests/baselines/reference/divergentAccessors1.errors.txt +++ b/tests/baselines/reference/divergentAccessors1.errors.txt @@ -1,12 +1,10 @@ tests/cases/compiler/divergentAccessors1.ts(6,13): error TS1049: A 'set' accessor must have exactly one parameter. -tests/cases/compiler/divergentAccessors1.ts(9,5): error TS1184: Modifiers cannot appear here. tests/cases/compiler/divergentAccessors1.ts(10,5): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/compiler/divergentAccessors1.ts(17,13): error TS1049: A 'set' accessor must have exactly one parameter. -tests/cases/compiler/divergentAccessors1.ts(20,5): error TS1184: Modifiers cannot appear here. tests/cases/compiler/divergentAccessors1.ts(21,5): error TS2322: Type 'string' is not assignable to type 'number'. -==== tests/cases/compiler/divergentAccessors1.ts (6 errors) ==== +==== tests/cases/compiler/divergentAccessors1.ts (4 errors) ==== // Accessors in interfaces/types { @@ -17,9 +15,7 @@ tests/cases/compiler/divergentAccessors1.ts(21,5): error TS2322: Type 'string' i !!! error TS1049: A 'set' accessor must have exactly one parameter. } - declare const ihgs: IHasGetSet; - ~~~~~~~ -!!! error TS1184: Modifiers cannot appear here. + const ihgs: IHasGetSet = null as any; ihgs.foo = "32"; ~~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. @@ -34,9 +30,7 @@ tests/cases/compiler/divergentAccessors1.ts(21,5): error TS2322: Type 'string' i !!! error TS1049: A 'set' accessor must have exactly one parameter. } - declare const t_hgs: T_HasGetSet; - ~~~~~~~ -!!! error TS1184: Modifiers cannot appear here. + const t_hgs: T_HasGetSet = null as any; t_hgs.foo = "32"; ~~~~~~~~~ !!! error TS2322: Type 'string' is not assignable to type 'number'. diff --git a/tests/baselines/reference/divergentAccessors1.js b/tests/baselines/reference/divergentAccessors1.js index e91db470ad6f3..d49874fe70d9d 100644 --- a/tests/baselines/reference/divergentAccessors1.js +++ b/tests/baselines/reference/divergentAccessors1.js @@ -7,7 +7,7 @@ set foo(): number | string; } - declare const ihgs: IHasGetSet; + const ihgs: IHasGetSet = null as any; ihgs.foo = "32"; let r_ihgs_foo: number = ihgs.foo; } @@ -18,7 +18,7 @@ set foo(): number | string; } - declare const t_hgs: T_HasGetSet; + const t_hgs: T_HasGetSet = null as any; t_hgs.foo = "32"; let r_t_hgs_foo: number = t_hgs.foo; } @@ -28,10 +28,12 @@ "use strict"; // Accessors in interfaces/types { + var ihgs = null; ihgs.foo = "32"; var r_ihgs_foo = ihgs.foo; } { + var t_hgs = null; t_hgs.foo = "32"; var r_t_hgs_foo = t_hgs.foo; } diff --git a/tests/baselines/reference/divergentAccessors1.symbols b/tests/baselines/reference/divergentAccessors1.symbols index 307b4dd981a2e..6d142ae18feea 100644 --- a/tests/baselines/reference/divergentAccessors1.symbols +++ b/tests/baselines/reference/divergentAccessors1.symbols @@ -12,19 +12,19 @@ >foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) } - declare const ihgs: IHasGetSet; ->ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) + const ihgs: IHasGetSet = null as any; +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 9)) >IHasGetSet : Symbol(IHasGetSet, Decl(divergentAccessors1.ts, 2, 1)) ihgs.foo = "32"; >ihgs.foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) ->ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 9)) >foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) let r_ihgs_foo: number = ihgs.foo; >r_ihgs_foo : Symbol(r_ihgs_foo, Decl(divergentAccessors1.ts, 10, 7)) >ihgs.foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) ->ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 17)) +>ihgs : Symbol(ihgs, Decl(divergentAccessors1.ts, 8, 9)) >foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) } @@ -39,19 +39,19 @@ >foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) } - declare const t_hgs: T_HasGetSet; ->t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) + const t_hgs: T_HasGetSet = null as any; +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 9)) >T_HasGetSet : Symbol(T_HasGetSet, Decl(divergentAccessors1.ts, 13, 1)) t_hgs.foo = "32"; >t_hgs.foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) ->t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 9)) >foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) let r_t_hgs_foo: number = t_hgs.foo; >r_t_hgs_foo : Symbol(r_t_hgs_foo, Decl(divergentAccessors1.ts, 21, 7)) >t_hgs.foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) ->t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 17)) +>t_hgs : Symbol(t_hgs, Decl(divergentAccessors1.ts, 19, 9)) >foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) } diff --git a/tests/baselines/reference/divergentAccessors1.types b/tests/baselines/reference/divergentAccessors1.types index c123ad144aab3..59e965234bf9f 100644 --- a/tests/baselines/reference/divergentAccessors1.types +++ b/tests/baselines/reference/divergentAccessors1.types @@ -10,8 +10,10 @@ >foo : number } - declare const ihgs: IHasGetSet; + const ihgs: IHasGetSet = null as any; >ihgs : IHasGetSet +>null as any : any +>null : null ihgs.foo = "32"; >ihgs.foo = "32" : "32" @@ -38,8 +40,10 @@ >foo : number } - declare const t_hgs: T_HasGetSet; + const t_hgs: T_HasGetSet = null as any; >t_hgs : { foo: number; } +>null as any : any +>null : null t_hgs.foo = "32"; >t_hgs.foo = "32" : "32" diff --git a/tests/cases/compiler/divergentAccessors1.ts b/tests/cases/compiler/divergentAccessors1.ts index 1fe032ca3a678..7d66da7c924a0 100644 --- a/tests/cases/compiler/divergentAccessors1.ts +++ b/tests/cases/compiler/divergentAccessors1.ts @@ -8,7 +8,7 @@ set foo(): number | string; } - declare const ihgs: IHasGetSet; + const ihgs: IHasGetSet = null as any; ihgs.foo = "32"; let r_ihgs_foo: number = ihgs.foo; } @@ -19,7 +19,7 @@ set foo(): number | string; } - declare const t_hgs: T_HasGetSet; + const t_hgs: T_HasGetSet = null as any; t_hgs.foo = "32"; let r_t_hgs_foo: number = t_hgs.foo; } From 17fd8da16b37f236a99ca24ef3c0f23108a1c10a Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:02:13 -0700 Subject: [PATCH 06/19] Update src/compiler/utilities.ts Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> --- src/compiler/utilities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 876a87042c86c..c52fe1aafaaf8 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5277,7 +5277,7 @@ namespace ts { export function getDeclarationModifierFlagsFromSymbol(s: Symbol, isWrite = false): ModifierFlags { if (s.valueDeclaration) { - const declaration = (isWrite && forEach(s.declarations, d => d.kind === SyntaxKind.SetAccessor && d)) || s.valueDeclaration; + const declaration = (isWrite && find(s.declarations, d => d.kind === SyntaxKind.SetAccessor)) || s.valueDeclaration; const flags = getCombinedModifierFlags(declaration); return s.parent && s.parent.flags & SymbolFlags.Class ? flags : flags & ~ModifierFlags.AccessibilityModifier; } From c4544352bda29df6a8444b9a71dd81321bb3b050 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:08:00 -0700 Subject: [PATCH 07/19] Rename param --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4c904e184c857..29a8432208868 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9020,12 +9020,12 @@ namespace ts { return type; } - function resolveTypeOfAccessors(symbol: Symbol, writing = false) { + function resolveTypeOfAccessors(symbol: Symbol, isWrite = false) { const getter = getDeclarationOfKind(symbol, SyntaxKind.GetAccessor); const setter = getDeclarationOfKind(symbol, SyntaxKind.SetAccessor); // For write operations, prioritize type annotations on the setter - if (writing) { + if (isWrite) { const setterParameterType = getAnnotatedAccessorType(setter); if (setterParameterType) { return setterParameterType; From 01b32d957a45e0ac9678c15e37d65050e4b67efe Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:10:18 -0700 Subject: [PATCH 08/19] CR updates --- src/compiler/checker.ts | 4 +--- src/compiler/utilities.ts | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 29a8432208868..7fc2dd7ea5345 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26956,9 +26956,7 @@ namespace ts { return errorType; } - if (propType === undefined) { - propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : isWrite ? getWriteTypeOfSymbol(prop) : getTypeOfSymbol(prop); - } + propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : isWrite ? getWriteTypeOfSymbol(prop) : getTypeOfSymbol(prop); } return getFlowTypeOfAccessExpression(node, prop, propType, right, checkMode); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index c52fe1aafaaf8..4d378e57e3995 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -5277,7 +5277,7 @@ namespace ts { export function getDeclarationModifierFlagsFromSymbol(s: Symbol, isWrite = false): ModifierFlags { if (s.valueDeclaration) { - const declaration = (isWrite && find(s.declarations, d => d.kind === SyntaxKind.SetAccessor)) || s.valueDeclaration; + const declaration = (isWrite && s.declarations && find(s.declarations, d => d.kind === SyntaxKind.SetAccessor)) || s.valueDeclaration; const flags = getCombinedModifierFlags(declaration); return s.parent && s.parent.flags & SymbolFlags.Class ? flags : flags & ~ModifierFlags.AccessibilityModifier; } From e427e8e082b32b48493c0bbe34481c9af6727612 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:12:01 -0700 Subject: [PATCH 09/19] Provide isWrite args --- src/compiler/checker.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7fc2dd7ea5345..c86585db07630 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26572,7 +26572,7 @@ namespace ts { */ function checkPropertyAccessibility( node: PropertyAccessExpression | QualifiedName | PropertyAccessExpression | VariableDeclaration | ParameterDeclaration | ImportTypeNode | PropertyAssignment | ShorthandPropertyAssignment | BindingElement, - isSuper: boolean, type: Type, prop: Symbol, reportError = true, isWrite = false): boolean { + isSuper: boolean, isWrite: boolean, type: Type, prop: Symbol, reportError = true): boolean { const flags = getDeclarationModifierFlagsFromSymbol(prop, isWrite); const errorNode = node.kind === SyntaxKind.QualifiedName ? node.right : @@ -26950,7 +26950,7 @@ namespace ts { markPropertyAsReferenced(prop, node, isSelfTypeAccess(left, parentSymbol)); getNodeLinks(node).resolvedSymbol = prop; const isWrite = isWriteAccess(node); - checkPropertyAccessibility(node, left.kind === SyntaxKind.SuperKeyword, apparentType, prop, /*reportError*/ undefined, isWrite); + checkPropertyAccessibility(node, left.kind === SyntaxKind.SuperKeyword, isWrite, apparentType, prop); if (isAssignmentToReadonlyEntity(node as Expression, prop, assignmentKind)) { error(right, Diagnostics.Cannot_assign_to_0_because_it_is_a_read_only_property, idText(right)); return errorType; @@ -27348,7 +27348,7 @@ namespace ts { const declClass = getContainingClass(prop.valueDeclaration); return !isOptionalChain(node) && !!findAncestor(node, parent => parent === declClass); } - return checkPropertyAccessibility(node, isSuper, type, prop, /* reportError */ false); + return checkPropertyAccessibility(node, isSuper, false, type, prop, /* reportError */ false); } // In js files properties of unions are allowed in completion return isInJSFile(node) && (type.flags & TypeFlags.Union) !== 0 && (type).types.some(elementType => isValidPropertyAccessWithType(node, isSuper, propertyName, elementType)); @@ -30987,7 +30987,7 @@ namespace ts { const prop = getPropertyOfType(objectLiteralType, text); if (prop) { markPropertyAsReferenced(prop, property, rightIsThis); - checkPropertyAccessibility(property, /*isSuper*/ false, objectLiteralType, prop); + checkPropertyAccessibility(property, /*isSuper*/ false, /*isWrite*/ true, objectLiteralType, prop); } } const elementType = getIndexedAccessType(objectLiteralType, exprType, /*noUncheckedIndexedAccessCandidate*/ undefined, name, /*aliasSymbol*/ undefined, /*aliasTypeArguments*/ undefined, AccessFlags.ExpressionPosition); @@ -34964,7 +34964,7 @@ namespace ts { const property = getPropertyOfType(parentType, nameText); if (property) { markPropertyAsReferenced(property, /*nodeForCheckWriteOnly*/ undefined, /*isSelfTypeAccess*/ false); // A destructuring is never a write-only reference. - checkPropertyAccessibility(node, !!parent.initializer && parent.initializer.kind === SyntaxKind.SuperKeyword, parentType, property); + checkPropertyAccessibility(node, !!parent.initializer && parent.initializer.kind === SyntaxKind.SuperKeyword, /*isWrite*/ false, parentType, property); } } } From 738bc562125a69fc67714d73c0c6e7ceef2dcc03 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:15:14 -0700 Subject: [PATCH 10/19] Lint --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c86585db07630..3f558d630e3ce 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -27348,7 +27348,7 @@ namespace ts { const declClass = getContainingClass(prop.valueDeclaration); return !isOptionalChain(node) && !!findAncestor(node, parent => parent === declClass); } - return checkPropertyAccessibility(node, isSuper, false, type, prop, /* reportError */ false); + return checkPropertyAccessibility(node, isSuper, /*isWrite*/ false, type, prop, /* reportError */ false); } // In js files properties of unions are allowed in completion return isInJSFile(node) && (type.flags & TypeFlags.Union) !== 0 && (type).types.some(elementType => isValidPropertyAccessWithType(node, isSuper, propertyName, elementType)); From 2a825f534b051d711eb099c799d48b986b55b81a Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:24:25 -0700 Subject: [PATCH 11/19] Update tests/baselines/reference/divergentAccessorsTypes1.js Co-authored-by: Nathan Shively-Sanders <293473+sandersn@users.noreply.github.com> --- .../reference/divergentAccessorsTypes1.js | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/tests/baselines/reference/divergentAccessorsTypes1.js b/tests/baselines/reference/divergentAccessorsTypes1.js index 7f76803b1413a..0877a04fd9bd4 100644 --- a/tests/baselines/reference/divergentAccessorsTypes1.js +++ b/tests/baselines/reference/divergentAccessorsTypes1.js @@ -1,66 +1,66 @@ //// [divergentAccessorsTypes1.ts] -class Test1 { - get foo(): string { return "" } - set foo(s: string | number) { - let a = s as string; - let b = s as number; - } - - get bar(): string | number { return "" } - set bar(s: string | number | boolean) { - } -} - -interface Test2 { - get foo(): string; - set foo(s: string | number); - - get bar(): string | number; - set bar(s: string | number | boolean); -} - -type Test3 = { - get foo(): string; - set foo(s: string | number); - - get bar(): string | number; - set bar(s: string | number | boolean); -}; - -{ - const t = new Test1(); - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; -} - -{ - const t = {} as Test2; - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; -} - -{ - const t = {} as Test3; - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; +class Test1 { + get foo(): string { return "" } + set foo(s: string | number) { + let a = s as string; + let b = s as number; + } + + get bar(): string | number { return "" } + set bar(s: string | number | boolean) { + } +} + +interface Test2 { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +} + +type Test3 = { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +}; + +{ + const t = new Test1(); + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with in-type vs out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test2; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test3; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; } //// [divergentAccessorsTypes1.js] From 23ce1ba870d9646b063f01415cbf8b5ecb853434 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:19:34 -0700 Subject: [PATCH 12/19] Simplify getter vs setter binding --- src/compiler/checker.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3f558d630e3ce..19a704fef1399 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33001,11 +33001,10 @@ namespace ts { if (hasBindableName(node)) { // TypeScript 1.0 spec (April 2014): 8.4.3 // Accessors for the same member name must specify the same accessibility. - const otherKind = node.kind === SyntaxKind.GetAccessor ? SyntaxKind.SetAccessor : SyntaxKind.GetAccessor; - const otherAccessor = getDeclarationOfKind(getSymbolOfNode(node), otherKind); - if (otherAccessor) { - const getter = node.kind === SyntaxKind.GetAccessor ? node : otherAccessor; - const setter = node.kind === SyntaxKind.SetAccessor ? node : otherAccessor; + const symbol = getSymbolOfNode(node); + const getter = getDeclarationOfKind(symbol, SyntaxKind.GetAccessor); + const setter = getDeclarationOfKind(symbol, SyntaxKind.SetAccessor); + if (getter && setter) { const getterFlags = getEffectiveModifierFlags(getter); const setterFlags = getEffectiveModifierFlags(setter); if ((getterFlags & ModifierFlags.Abstract) !== (setterFlags & ModifierFlags.Abstract)) { From 670d73bb0f7f056306f3610298af8f7fa143c993 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:26:20 -0700 Subject: [PATCH 13/19] CR updates --- src/compiler/checker.ts | 2 +- .../reference/divergentAccessors1.errors.txt | 39 ------------------- .../reference/divergentAccessors1.js | 4 +- .../reference/divergentAccessors1.symbols | 6 ++- .../reference/divergentAccessors1.types | 14 ++++--- .../thisTypeInAccessorsNegative.errors.txt | 5 +-- tests/cases/compiler/divergentAccessors1.ts | 4 +- 7 files changed, 18 insertions(+), 56 deletions(-) delete mode 100644 tests/baselines/reference/divergentAccessors1.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 19a704fef1399..2fe988753ca7d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33016,7 +33016,7 @@ namespace ts { } checkAccessorDeclarationTypesAssignable(getter, setter, getAnnotatedAccessorType, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); - checkAccessorDeclarationTypesIdentical(node, otherAccessor, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type); + checkAccessorDeclarationTypesIdentical(getter, setter, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type); } } const returnType = getTypeOfAccessors(getSymbolOfNode(node)); diff --git a/tests/baselines/reference/divergentAccessors1.errors.txt b/tests/baselines/reference/divergentAccessors1.errors.txt deleted file mode 100644 index de330cbccf74d..0000000000000 --- a/tests/baselines/reference/divergentAccessors1.errors.txt +++ /dev/null @@ -1,39 +0,0 @@ -tests/cases/compiler/divergentAccessors1.ts(6,13): error TS1049: A 'set' accessor must have exactly one parameter. -tests/cases/compiler/divergentAccessors1.ts(10,5): error TS2322: Type 'string' is not assignable to type 'number'. -tests/cases/compiler/divergentAccessors1.ts(17,13): error TS1049: A 'set' accessor must have exactly one parameter. -tests/cases/compiler/divergentAccessors1.ts(21,5): error TS2322: Type 'string' is not assignable to type 'number'. - - -==== tests/cases/compiler/divergentAccessors1.ts (4 errors) ==== - // Accessors in interfaces/types - - { - interface IHasGetSet { - get foo(): number; - set foo(): number | string; - ~~~ -!!! error TS1049: A 'set' accessor must have exactly one parameter. - } - - const ihgs: IHasGetSet = null as any; - ihgs.foo = "32"; - ~~~~~~~~ -!!! error TS2322: Type 'string' is not assignable to type 'number'. - let r_ihgs_foo: number = ihgs.foo; - } - - { - type T_HasGetSet = { - get foo(): number; - set foo(): number | string; - ~~~ -!!! error TS1049: A 'set' accessor must have exactly one parameter. - } - - const t_hgs: T_HasGetSet = null as any; - t_hgs.foo = "32"; - ~~~~~~~~~ -!!! error TS2322: Type 'string' is not assignable to type 'number'. - let r_t_hgs_foo: number = t_hgs.foo; - } - \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessors1.js b/tests/baselines/reference/divergentAccessors1.js index d49874fe70d9d..684526d9744bb 100644 --- a/tests/baselines/reference/divergentAccessors1.js +++ b/tests/baselines/reference/divergentAccessors1.js @@ -4,7 +4,7 @@ { interface IHasGetSet { get foo(): number; - set foo(): number | string; + set foo(v: number | string); } const ihgs: IHasGetSet = null as any; @@ -15,7 +15,7 @@ { type T_HasGetSet = { get foo(): number; - set foo(): number | string; + set foo(v: number | string); } const t_hgs: T_HasGetSet = null as any; diff --git a/tests/baselines/reference/divergentAccessors1.symbols b/tests/baselines/reference/divergentAccessors1.symbols index 6d142ae18feea..d8253a6d1f285 100644 --- a/tests/baselines/reference/divergentAccessors1.symbols +++ b/tests/baselines/reference/divergentAccessors1.symbols @@ -8,8 +8,9 @@ get foo(): number; >foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) - set foo(): number | string; + set foo(v: number | string); >foo : Symbol(IHasGetSet.foo, Decl(divergentAccessors1.ts, 3, 26), Decl(divergentAccessors1.ts, 4, 26)) +>v : Symbol(v, Decl(divergentAccessors1.ts, 5, 16)) } const ihgs: IHasGetSet = null as any; @@ -35,8 +36,9 @@ get foo(): number; >foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) - set foo(): number | string; + set foo(v: number | string); >foo : Symbol(foo, Decl(divergentAccessors1.ts, 14, 24), Decl(divergentAccessors1.ts, 15, 26)) +>v : Symbol(v, Decl(divergentAccessors1.ts, 16, 16)) } const t_hgs: T_HasGetSet = null as any; diff --git a/tests/baselines/reference/divergentAccessors1.types b/tests/baselines/reference/divergentAccessors1.types index 59e965234bf9f..3a9f34558f2fe 100644 --- a/tests/baselines/reference/divergentAccessors1.types +++ b/tests/baselines/reference/divergentAccessors1.types @@ -6,8 +6,9 @@ get foo(): number; >foo : number - set foo(): number | string; + set foo(v: number | string); >foo : number +>v : string | number } const ihgs: IHasGetSet = null as any; @@ -17,9 +18,9 @@ ihgs.foo = "32"; >ihgs.foo = "32" : "32" ->ihgs.foo : number +>ihgs.foo : string | number >ihgs : IHasGetSet ->foo : number +>foo : string | number >"32" : "32" let r_ihgs_foo: number = ihgs.foo; @@ -36,8 +37,9 @@ get foo(): number; >foo : number - set foo(): number | string; + set foo(v: number | string); >foo : number +>v : string | number } const t_hgs: T_HasGetSet = null as any; @@ -47,9 +49,9 @@ t_hgs.foo = "32"; >t_hgs.foo = "32" : "32" ->t_hgs.foo : number +>t_hgs.foo : string | number >t_hgs : { foo: number; } ->foo : number +>foo : string | number >"32" : "32" let r_t_hgs_foo: number = t_hgs.foo; diff --git a/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt b/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt index d7e4ae0628c80..778d3c1e1c0fe 100644 --- a/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt +++ b/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt @@ -1,10 +1,9 @@ tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(10,9): error TS2682: 'get' and 'set' accessor must have the same 'this' type. tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(10,11): error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. -tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(11,9): error TS2682: 'get' and 'set' accessor must have the same 'this' type. tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(11,11): error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. -==== tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts (4 errors) ==== +==== tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts (3 errors) ==== interface Foo { n: number; x: number; @@ -20,8 +19,6 @@ tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(11,11): er ~~~~~~~~~ !!! error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. set x(this: Bar, n) { this.wrong = "method"; } - ~ -!!! error TS2682: 'get' and 'set' accessor must have the same 'this' type. ~~~~~~~~~ !!! error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. } diff --git a/tests/cases/compiler/divergentAccessors1.ts b/tests/cases/compiler/divergentAccessors1.ts index 7d66da7c924a0..e8d8106500902 100644 --- a/tests/cases/compiler/divergentAccessors1.ts +++ b/tests/cases/compiler/divergentAccessors1.ts @@ -5,7 +5,7 @@ { interface IHasGetSet { get foo(): number; - set foo(): number | string; + set foo(v: number | string); } const ihgs: IHasGetSet = null as any; @@ -16,7 +16,7 @@ { type T_HasGetSet = { get foo(): number; - set foo(): number | string; + set foo(v: number | string); } const t_hgs: T_HasGetSet = null as any; From 102332b3b98c469bedf1aba00b1f16eba6f92df9 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:33:37 -0700 Subject: [PATCH 14/19] Remove superfluous error --- src/compiler/checker.ts | 5 ----- .../reference/thisTypeInAccessorsNegative.errors.txt | 5 +---- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2fe988753ca7d..de55b04200ba4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33016,7 +33016,6 @@ namespace ts { } checkAccessorDeclarationTypesAssignable(getter, setter, getAnnotatedAccessorType, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); - checkAccessorDeclarationTypesIdentical(getter, setter, getThisTypeOfDeclaration, Diagnostics.get_and_set_accessor_must_have_the_same_this_type); } } const returnType = getTypeOfAccessors(getSymbolOfNode(node)); @@ -33028,10 +33027,6 @@ namespace ts { setNodeLinksForPrivateIdentifierScope(node); } - function checkAccessorDeclarationTypesIdentical(first: AccessorDeclaration, second: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { - return checkAccessorDeclarationTypesMatch(first, second, getAnnotatedType, isTypeIdenticalTo, message); - } - function checkAccessorDeclarationTypesAssignable(getter: AccessorDeclaration, setter: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { return checkAccessorDeclarationTypesMatch(getter, setter, getAnnotatedType, isTypeAssignableTo, message); } diff --git a/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt b/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt index 778d3c1e1c0fe..c01bd4c2725bd 100644 --- a/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt +++ b/tests/baselines/reference/thisTypeInAccessorsNegative.errors.txt @@ -1,9 +1,8 @@ -tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(10,9): error TS2682: 'get' and 'set' accessor must have the same 'this' type. tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(10,11): error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(11,11): error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. -==== tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts (3 errors) ==== +==== tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts (2 errors) ==== interface Foo { n: number; x: number; @@ -14,8 +13,6 @@ tests/cases/conformance/types/thisType/thisTypeInAccessorsNegative.ts(11,11): er const mismatch = { n: 13, get x(this: Foo) { return this.n; }, - ~ -!!! error TS2682: 'get' and 'set' accessor must have the same 'this' type. ~~~~~~~~~ !!! error TS2784: 'get' and 'set' accessors cannot declare 'this' parameters. set x(this: Bar, n) { this.wrong = "method"; } From e7b993e1eae62c74c6f14c080609cc0aa5178651 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:41:03 -0700 Subject: [PATCH 15/19] Remove unneeded undefined --- src/compiler/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index de55b04200ba4..2fb25d605da96 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26912,7 +26912,7 @@ namespace ts { markAliasReferenced(parentSymbol, node); } - let propType: Type | undefined; + let propType: Type; if (!prop) { const indexInfo = !isPrivateIdentifier(right) && (assignmentKind === AssignmentKind.None || !isGenericObjectType(leftType) || isThisTypeParameter(leftType)) ? getIndexInfoOfType(apparentType, IndexKind.String) : undefined; if (!(indexInfo && indexInfo.type)) { From b38df0da1e9ca3ae1061c6da290be1a8facc17aa Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:55:07 -0700 Subject: [PATCH 16/19] Rename for clarity --- src/compiler/checker.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2fb25d605da96..272a61aafb2a6 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9198,7 +9198,7 @@ namespace ts { return links.type; } - function getWriteTypeOfSymbol(symbol: Symbol): Type { + function getSetAccessorTypeOfSymbol(symbol: Symbol): Type { if (symbol.flags & SymbolFlags.Accessor) { const type = getTypeOfSetAccessor(symbol); if (type) { @@ -26956,7 +26956,7 @@ namespace ts { return errorType; } - propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : isWrite ? getWriteTypeOfSymbol(prop) : getTypeOfSymbol(prop); + propType = isThisPropertyAccessInConstructor(node, prop) ? autoType : isWrite ? getSetAccessorTypeOfSymbol(prop) : getTypeOfSymbol(prop); } return getFlowTypeOfAccessExpression(node, prop, propType, right, checkMode); From 69bccdb1d628e5a8c2592b15a9554ea982006bf0 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 15:55:30 -0700 Subject: [PATCH 17/19] (Incorrect) baseline for generics --- .../reference/divergentAccessorsTypes1.js | 124 +++++++++--------- .../divergentAccessorsTypes2.errors.txt | 20 +++ .../reference/divergentAccessorsTypes2.js | 24 ++++ .../divergentAccessorsTypes2.symbols | 36 +++++ .../reference/divergentAccessorsTypes2.types | 41 ++++++ .../compiler/divergentAccessorsTypes2.ts | 13 ++ 6 files changed, 196 insertions(+), 62 deletions(-) create mode 100644 tests/baselines/reference/divergentAccessorsTypes2.errors.txt create mode 100644 tests/baselines/reference/divergentAccessorsTypes2.js create mode 100644 tests/baselines/reference/divergentAccessorsTypes2.symbols create mode 100644 tests/baselines/reference/divergentAccessorsTypes2.types create mode 100644 tests/cases/compiler/divergentAccessorsTypes2.ts diff --git a/tests/baselines/reference/divergentAccessorsTypes1.js b/tests/baselines/reference/divergentAccessorsTypes1.js index 0877a04fd9bd4..7f76803b1413a 100644 --- a/tests/baselines/reference/divergentAccessorsTypes1.js +++ b/tests/baselines/reference/divergentAccessorsTypes1.js @@ -1,66 +1,66 @@ //// [divergentAccessorsTypes1.ts] -class Test1 { - get foo(): string { return "" } - set foo(s: string | number) { - let a = s as string; - let b = s as number; - } - - get bar(): string | number { return "" } - set bar(s: string | number | boolean) { - } -} - -interface Test2 { - get foo(): string; - set foo(s: string | number); - - get bar(): string | number; - set bar(s: string | number | boolean); -} - -type Test3 = { - get foo(): string; - set foo(s: string | number); - - get bar(): string | number; - set bar(s: string | number | boolean); -}; - -{ - const t = new Test1(); - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with in-type vs out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; -} - -{ - const t = {} as Test2; - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; -} - -{ - const t = {} as Test3; - t.foo = 32; - let m: string = t.foo; - - // See how CFA interacts with out-of-type writes - t.bar = 42; - let n: number = t.bar; - t.bar = false; - let o = t.bar; +class Test1 { + get foo(): string { return "" } + set foo(s: string | number) { + let a = s as string; + let b = s as number; + } + + get bar(): string | number { return "" } + set bar(s: string | number | boolean) { + } +} + +interface Test2 { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +} + +type Test3 = { + get foo(): string; + set foo(s: string | number); + + get bar(): string | number; + set bar(s: string | number | boolean); +}; + +{ + const t = new Test1(); + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test2; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; +} + +{ + const t = {} as Test3; + t.foo = 32; + let m: string = t.foo; + + // See how CFA interacts with out-of-type writes + t.bar = 42; + let n: number = t.bar; + t.bar = false; + let o = t.bar; } //// [divergentAccessorsTypes1.js] diff --git a/tests/baselines/reference/divergentAccessorsTypes2.errors.txt b/tests/baselines/reference/divergentAccessorsTypes2.errors.txt new file mode 100644 index 0000000000000..3e08bba192995 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes2.errors.txt @@ -0,0 +1,20 @@ +tests/cases/compiler/divergentAccessorsTypes2.ts(9,1): error TS2322: Type '"hello"' is not assignable to type 'T | undefined'. +tests/cases/compiler/divergentAccessorsTypes2.ts(10,1): error TS2322: Type '42' is not assignable to type 'T | undefined'. + + +==== tests/cases/compiler/divergentAccessorsTypes2.ts (2 errors) ==== + class Test1 { + get foo(): T { return null as any } + set foo(s: T | undefined ) { + } + } + + const s = new Test1(); + s.foo = undefined; + s.foo = "hello"; + ~~~~~ +!!! error TS2322: Type '"hello"' is not assignable to type 'T | undefined'. + s.foo = 42; + ~~~~~ +!!! error TS2322: Type '42' is not assignable to type 'T | undefined'. + \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessorsTypes2.js b/tests/baselines/reference/divergentAccessorsTypes2.js new file mode 100644 index 0000000000000..2536c05c62640 --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes2.js @@ -0,0 +1,24 @@ +//// [divergentAccessorsTypes2.ts] +class Test1 { + get foo(): T { return null as any } + set foo(s: T | undefined ) { + } +} + +const s = new Test1(); +s.foo = undefined; +s.foo = "hello"; +s.foo = 42; + + +//// [divergentAccessorsTypes2.js] +"use strict"; +class Test1 { + get foo() { return null; } + set foo(s) { + } +} +const s = new Test1(); +s.foo = undefined; +s.foo = "hello"; +s.foo = 42; diff --git a/tests/baselines/reference/divergentAccessorsTypes2.symbols b/tests/baselines/reference/divergentAccessorsTypes2.symbols new file mode 100644 index 0000000000000..980f1b75dcd5d --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes2.symbols @@ -0,0 +1,36 @@ +=== tests/cases/compiler/divergentAccessorsTypes2.ts === +class Test1 { +>Test1 : Symbol(Test1, Decl(divergentAccessorsTypes2.ts, 0, 0)) +>T : Symbol(T, Decl(divergentAccessorsTypes2.ts, 0, 12)) + + get foo(): T { return null as any } +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>T : Symbol(T, Decl(divergentAccessorsTypes2.ts, 0, 12)) + + set foo(s: T | undefined ) { +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>s : Symbol(s, Decl(divergentAccessorsTypes2.ts, 2, 12)) +>T : Symbol(T, Decl(divergentAccessorsTypes2.ts, 0, 12)) + } +} + +const s = new Test1(); +>s : Symbol(s, Decl(divergentAccessorsTypes2.ts, 6, 5)) +>Test1 : Symbol(Test1, Decl(divergentAccessorsTypes2.ts, 0, 0)) + +s.foo = undefined; +>s.foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>s : Symbol(s, Decl(divergentAccessorsTypes2.ts, 6, 5)) +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>undefined : Symbol(undefined) + +s.foo = "hello"; +>s.foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>s : Symbol(s, Decl(divergentAccessorsTypes2.ts, 6, 5)) +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) + +s.foo = 42; +>s.foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) +>s : Symbol(s, Decl(divergentAccessorsTypes2.ts, 6, 5)) +>foo : Symbol(Test1.foo, Decl(divergentAccessorsTypes2.ts, 0, 16), Decl(divergentAccessorsTypes2.ts, 1, 39)) + diff --git a/tests/baselines/reference/divergentAccessorsTypes2.types b/tests/baselines/reference/divergentAccessorsTypes2.types new file mode 100644 index 0000000000000..c2651a72d9deb --- /dev/null +++ b/tests/baselines/reference/divergentAccessorsTypes2.types @@ -0,0 +1,41 @@ +=== tests/cases/compiler/divergentAccessorsTypes2.ts === +class Test1 { +>Test1 : Test1 + + get foo(): T { return null as any } +>foo : T +>null as any : any +>null : null + + set foo(s: T | undefined ) { +>foo : T +>s : T | undefined + } +} + +const s = new Test1(); +>s : Test1 +>new Test1() : Test1 +>Test1 : typeof Test1 + +s.foo = undefined; +>s.foo = undefined : undefined +>s.foo : T | undefined +>s : Test1 +>foo : T | undefined +>undefined : undefined + +s.foo = "hello"; +>s.foo = "hello" : "hello" +>s.foo : T | undefined +>s : Test1 +>foo : T | undefined +>"hello" : "hello" + +s.foo = 42; +>s.foo = 42 : 42 +>s.foo : T | undefined +>s : Test1 +>foo : T | undefined +>42 : 42 + diff --git a/tests/cases/compiler/divergentAccessorsTypes2.ts b/tests/cases/compiler/divergentAccessorsTypes2.ts new file mode 100644 index 0000000000000..9e1b42739fe19 --- /dev/null +++ b/tests/cases/compiler/divergentAccessorsTypes2.ts @@ -0,0 +1,13 @@ +// @strict: true +// @target: esnext + +class Test1 { + get foo(): T { return null as any } + set foo(s: T | undefined ) { + } +} + +const s = new Test1(); +s.foo = undefined; +s.foo = "hello"; +s.foo = 42; From bafd6386cbbd95c929d9ddfc7774ec02486de650 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 16:23:20 -0700 Subject: [PATCH 18/19] Instantiate generic symbols --- src/compiler/checker.ts | 5 +++++ .../reference/divergentAccessorsTypes2.errors.txt | 9 +++------ .../reference/divergentAccessorsTypes2.types | 12 ++++++------ ...stancePropertiesInheritedIntoClassType.errors.txt | 7 +------ .../instancePropertiesInheritedIntoClassType.types | 4 ++-- .../reference/instancePropertyInClassType.errors.txt | 7 +------ .../reference/instancePropertyInClassType.types | 4 ++-- .../privateNamesAndGenericClasses-2.errors.txt | 7 +------ .../reference/privateNamesAndGenericClasses-2.types | 4 ++-- 9 files changed, 23 insertions(+), 36 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 272a61aafb2a6..34a152bc8076c 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9028,6 +9028,11 @@ namespace ts { if (isWrite) { const setterParameterType = getAnnotatedAccessorType(setter); if (setterParameterType) { + const flags = getCheckFlags(symbol); + if (flags & CheckFlags.Instantiated) { + const links = getSymbolLinks(symbol); + return instantiateType(setterParameterType, links.mapper); + } return setterParameterType; } } diff --git a/tests/baselines/reference/divergentAccessorsTypes2.errors.txt b/tests/baselines/reference/divergentAccessorsTypes2.errors.txt index 3e08bba192995..277630c5f11c0 100644 --- a/tests/baselines/reference/divergentAccessorsTypes2.errors.txt +++ b/tests/baselines/reference/divergentAccessorsTypes2.errors.txt @@ -1,8 +1,7 @@ -tests/cases/compiler/divergentAccessorsTypes2.ts(9,1): error TS2322: Type '"hello"' is not assignable to type 'T | undefined'. -tests/cases/compiler/divergentAccessorsTypes2.ts(10,1): error TS2322: Type '42' is not assignable to type 'T | undefined'. +tests/cases/compiler/divergentAccessorsTypes2.ts(10,1): error TS2322: Type '42' is not assignable to type 'string | undefined'. -==== tests/cases/compiler/divergentAccessorsTypes2.ts (2 errors) ==== +==== tests/cases/compiler/divergentAccessorsTypes2.ts (1 errors) ==== class Test1 { get foo(): T { return null as any } set foo(s: T | undefined ) { @@ -12,9 +11,7 @@ tests/cases/compiler/divergentAccessorsTypes2.ts(10,1): error TS2322: Type '42' const s = new Test1(); s.foo = undefined; s.foo = "hello"; - ~~~~~ -!!! error TS2322: Type '"hello"' is not assignable to type 'T | undefined'. s.foo = 42; ~~~~~ -!!! error TS2322: Type '42' is not assignable to type 'T | undefined'. +!!! error TS2322: Type '42' is not assignable to type 'string | undefined'. \ No newline at end of file diff --git a/tests/baselines/reference/divergentAccessorsTypes2.types b/tests/baselines/reference/divergentAccessorsTypes2.types index c2651a72d9deb..b05d04e135e1e 100644 --- a/tests/baselines/reference/divergentAccessorsTypes2.types +++ b/tests/baselines/reference/divergentAccessorsTypes2.types @@ -20,22 +20,22 @@ const s = new Test1(); s.foo = undefined; >s.foo = undefined : undefined ->s.foo : T | undefined +>s.foo : string | undefined >s : Test1 ->foo : T | undefined +>foo : string | undefined >undefined : undefined s.foo = "hello"; >s.foo = "hello" : "hello" ->s.foo : T | undefined +>s.foo : string | undefined >s : Test1 ->foo : T | undefined +>foo : string | undefined >"hello" : "hello" s.foo = 42; >s.foo = 42 : 42 ->s.foo : T | undefined +>s.foo : string | undefined >s : Test1 ->foo : T | undefined +>foo : string | undefined >42 : 42 diff --git a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt index bbe4984571f31..e7584c3d831a8 100644 --- a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt +++ b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.errors.txt @@ -4,13 +4,11 @@ tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIn Type 'Number' has no call signatures. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(26,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(29,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(40,5): error TS2322: Type 'string' is not assignable to type 'U'. - 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts(41,16): error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? Type 'String' has no call signatures. -==== tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts (7 errors) ==== +==== tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIntoClassType.ts (6 errors) ==== module NonGeneric { class C { x: string; @@ -62,9 +60,6 @@ tests/cases/conformance/classes/members/classTypes/instancePropertiesInheritedIn var r2 = r.x; var r3 = r.y; r.y = ''; - ~~~ -!!! error TS2322: Type 'string' is not assignable to type 'U'. -!!! error TS2322: 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. var r6 = d.y(); // error ~ !!! error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? diff --git a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types index 047c2d8032968..c39aa38303459 100644 --- a/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types +++ b/tests/baselines/reference/instancePropertiesInheritedIntoClassType.types @@ -135,9 +135,9 @@ module Generic { r.y = ''; >r.y = '' : "" ->r.y : U +>r.y : string >r : D ->y : U +>y : string >'' : "" var r6 = d.y(); // error diff --git a/tests/baselines/reference/instancePropertyInClassType.errors.txt b/tests/baselines/reference/instancePropertyInClassType.errors.txt index 0ec5f44c9be68..224290a4c001b 100644 --- a/tests/baselines/reference/instancePropertyInClassType.errors.txt +++ b/tests/baselines/reference/instancePropertyInClassType.errors.txt @@ -4,13 +4,11 @@ tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.t Type 'Number' has no call signatures. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(24,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(27,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(36,5): error TS2322: Type 'string' is not assignable to type 'U'. - 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts(37,16): error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? Type 'String' has no call signatures. -==== tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts (7 errors) ==== +==== tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.ts (6 errors) ==== module NonGeneric { class C { x: string; @@ -58,9 +56,6 @@ tests/cases/conformance/classes/members/classTypes/instancePropertyInClassType.t var r2 = r.x; var r3 = r.y; r.y = ''; - ~~~ -!!! error TS2322: Type 'string' is not assignable to type 'U'. -!!! error TS2322: 'U' could be instantiated with an arbitrary type which could be unrelated to 'string'. var r6 = c.y(); // error ~ !!! error TS6234: This expression is not callable because it is a 'get' accessor. Did you mean to use it without '()'? diff --git a/tests/baselines/reference/instancePropertyInClassType.types b/tests/baselines/reference/instancePropertyInClassType.types index 96a22e233b724..36c04c5aa1a18 100644 --- a/tests/baselines/reference/instancePropertyInClassType.types +++ b/tests/baselines/reference/instancePropertyInClassType.types @@ -125,9 +125,9 @@ module Generic { r.y = ''; >r.y = '' : "" ->r.y : U +>r.y : string >r : C ->y : U +>y : string >'' : "" var r6 = c.y(); // error diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt index 7d2d199f85caa..c06298c2693a3 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt @@ -1,5 +1,3 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(22,1): error TS2322: Type 'number' is not assignable to type 'T'. - 'T' could be instantiated with an arbitrary type which could be unrelated to 'number'. tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(24,3): error TS18013: Property '#foo' is not accessible outside class 'C' because it has a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts(25,1): error TS2322: Type 'C' is not assignable to type 'C'. Type 'string' is not assignable to type 'number'. @@ -7,7 +5,7 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClass Type 'number' is not assignable to type 'string'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts (4 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClasses-2.ts (3 errors) ==== class C { #foo: T; #bar(): T { @@ -30,9 +28,6 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndGenericClass let b = new C("hello"); a.baz = 5 // OK - ~~~~~ -!!! error TS2322: Type 'number' is not assignable to type 'T'. -!!! error TS2322: 'T' could be instantiated with an arbitrary type which could be unrelated to 'number'. const x: number = a.baz // OK a.#foo; // Error ~~~~ diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.types b/tests/baselines/reference/privateNamesAndGenericClasses-2.types index d9ce992505e3a..42f5b237d06fa 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.types +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.types @@ -62,9 +62,9 @@ let b = new C("hello"); a.baz = 5 // OK >a.baz = 5 : 5 ->a.baz : T +>a.baz : number >a : C ->baz : T +>baz : number >5 : 5 const x: number = a.baz // OK From 131d194e0cc64a0881178943389c7aed17695900 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Fri, 26 Mar 2021 16:45:42 -0700 Subject: [PATCH 19/19] Improve+simplify get/set assignability matching --- src/compiler/checker.ts | 18 +++++------------- .../getAndSetNotIdenticalType2.errors.txt | 7 ++++++- .../getAndSetNotIdenticalType3.errors.txt | 11 +++++++---- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 34a152bc8076c..d2ed59c11783b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -33020,7 +33020,11 @@ namespace ts { error(node.name, Diagnostics.A_get_accessor_must_be_at_least_as_accessible_as_the_setter); } - checkAccessorDeclarationTypesAssignable(getter, setter, getAnnotatedAccessorType, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); + const getterType = getAnnotatedAccessorType(getter); + const setterType = getAnnotatedAccessorType(setter); + if (getterType && setterType) { + checkTypeAssignableTo(getterType, setterType, getter, Diagnostics.The_return_type_of_a_get_accessor_must_be_assignable_to_its_set_accessor_type); + } } } const returnType = getTypeOfAccessors(getSymbolOfNode(node)); @@ -33032,18 +33036,6 @@ namespace ts { setNodeLinksForPrivateIdentifierScope(node); } - function checkAccessorDeclarationTypesAssignable(getter: AccessorDeclaration, setter: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { - return checkAccessorDeclarationTypesMatch(getter, setter, getAnnotatedType, isTypeAssignableTo, message); - } - - function checkAccessorDeclarationTypesMatch(first: AccessorDeclaration, second: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, match: typeof areTypesComparable, message: DiagnosticMessage) { - const firstType = getAnnotatedType(first); - const secondType = getAnnotatedType(second); - if (firstType && secondType && !match(firstType, secondType)) { - error(first, message); - } - } - function checkMissingDeclaration(node: Node) { checkDecorators(node); } diff --git a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt index e68552b0bd284..6c866b21c15d5 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType2.errors.txt @@ -1,5 +1,7 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type +tests/cases/compiler/getAndSetNotIdenticalType2.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type + Type 'T' is not assignable to type 'string'. tests/cases/compiler/getAndSetNotIdenticalType2.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/getAndSetNotIdenticalType2.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'T'. @@ -8,7 +10,7 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(15,1): error TS2322: Type 'A< Type 'unknown' is not assignable to type 'string'. -==== tests/cases/compiler/getAndSetNotIdenticalType2.ts (5 errors) ==== +==== tests/cases/compiler/getAndSetNotIdenticalType2.ts (6 errors) ==== class A { foo: T; } class C { @@ -18,6 +20,9 @@ tests/cases/compiler/getAndSetNotIdenticalType2.ts(15,1): error TS2322: Type 'A< !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~ !!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type + ~ +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type +!!! error TS2380: Type 'T' is not assignable to type 'string'. return this.data; } set x(v: A) { diff --git a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt index 821b7e2163311..8b4e6a0e04b1a 100644 --- a/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt +++ b/tests/baselines/reference/getAndSetNotIdenticalType3.errors.txt @@ -1,13 +1,14 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type +tests/cases/compiler/getAndSetNotIdenticalType3.ts(5,9): error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type + Type 'number' is not assignable to type 'string'. tests/cases/compiler/getAndSetNotIdenticalType3.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/compiler/getAndSetNotIdenticalType3.ts(9,9): error TS2322: Type 'A' is not assignable to type 'A'. Type 'string' is not assignable to type 'number'. tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A' is not assignable to type 'A'. - Type 'number' is not assignable to type 'string'. -==== tests/cases/compiler/getAndSetNotIdenticalType3.ts (5 errors) ==== +==== tests/cases/compiler/getAndSetNotIdenticalType3.ts (6 errors) ==== class A { foo: T; } class C { @@ -17,6 +18,9 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A< !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ~ !!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type + ~ +!!! error TS2380: The return type of a 'get' accessor must be assignable to its 'set' accessor type +!!! error TS2380: Type 'number' is not assignable to type 'string'. return this.data; } set x(v: A) { @@ -33,5 +37,4 @@ tests/cases/compiler/getAndSetNotIdenticalType3.ts(15,1): error TS2322: Type 'A< var r = x.x; x.x = r; ~~~ -!!! error TS2322: Type 'A' is not assignable to type 'A'. -!!! error TS2322: Type 'number' is not assignable to type 'string'. \ No newline at end of file +!!! error TS2322: Type 'A' is not assignable to type 'A'. \ No newline at end of file