From e3a3fb8eb25160923ab87960d357cf67869d16b1 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Fri, 15 Jan 2021 17:28:52 +0200 Subject: [PATCH 01/68] Added support for private identifier methods. --- src/compiler/checker.ts | 78 ++++++++++++++---------- src/compiler/diagnosticMessages.json | 12 ++-- src/compiler/transformers/classFields.ts | 4 +- src/compiler/types.ts | 18 ++++++ src/compiler/utilitiesPublic.ts | 6 +- src/services/completions.ts | 4 +- src/services/findAllReferences.ts | 2 +- src/services/stringCompletions.ts | 2 +- 8 files changed, 77 insertions(+), 49 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c4b3d67ad6d96..33cade5a7ddc2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -9852,7 +9852,7 @@ namespace ts { } function isStaticPrivateIdentifierProperty(s: Symbol): boolean { - return !!s.valueDeclaration && isPrivateIdentifierPropertyDeclaration(s.valueDeclaration) && hasSyntacticModifier(s.valueDeclaration, ModifierFlags.Static); + return !!s.valueDeclaration && isPrivateIdentifierClassElementDeclaration(s.valueDeclaration) && hasSyntacticModifier(s.valueDeclaration, ModifierFlags.Static); } function resolveDeclaredMembers(type: InterfaceType): InterfaceTypeWithDeclaredMembers { @@ -15067,7 +15067,7 @@ namespace ts { /** We approximate own properties as non-methods plus methods that are inside the object literal */ function isSpreadableProperty(prop: Symbol): boolean { - return !some(prop.declarations, isPrivateIdentifierPropertyDeclaration) && + return !some(prop.declarations, isPrivateIdentifierClassElementDeclaration) && (!(prop.flags & (SymbolFlags.Method | SymbolFlags.GetAccessor | SymbolFlags.SetAccessor)) || !prop.declarations.some(decl => isClassLike(decl.parent))); } @@ -26063,7 +26063,7 @@ namespace ts { */ function checkPropertyAccessibility( node: PropertyAccessExpression | QualifiedName | PropertyAccessExpression | VariableDeclaration | ParameterDeclaration | ImportTypeNode | PropertyAssignment | ShorthandPropertyAssignment | BindingElement, - isSuper: boolean, type: Type, prop: Symbol): boolean { + isSuper: boolean, type: Type, prop: Symbol, reportError = true): boolean { const flags = getDeclarationModifierFlagsFromSymbol(prop); const errorNode = node.kind === SyntaxKind.QualifiedName ? node.right : node.kind === SyntaxKind.ImportType ? node : node.name; @@ -26077,7 +26077,9 @@ namespace ts { // a super property access is permitted and must specify a public static member function of the base class. if (languageVersion < ScriptTarget.ES2015) { if (symbolHasNonMethodDeclaration(prop)) { - error(errorNode, Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword); + if(reportError) { + error(errorNode, Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword); + } return false; } } @@ -26086,7 +26088,9 @@ namespace ts { // This error could mask a private property access error. But, a member // cannot simultaneously be private and abstract, so this will trigger an // additional error elsewhere. - error(errorNode, Diagnostics.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); + if(reportError) { + error(errorNode, Diagnostics.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); + } return false; } } @@ -26095,17 +26099,11 @@ namespace ts { if ((flags & ModifierFlags.Abstract) && isThisProperty(node) && symbolHasNonMethodDeclaration(prop)) { const declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop)!); if (declaringClassDeclaration && isNodeUsedDuringClassInitialization(node)) { - error(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), getTextOfIdentifierOrLiteral(declaringClassDeclaration.name!)); // TODO: GH#18217 - return false; - } - } - - if (isPropertyAccessExpression(node) && isPrivateIdentifier(node.name)) { - if (!getContainingClass(node)) { - error(errorNode, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); + if(reportError) { + error(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), getTextOfIdentifierOrLiteral(declaringClassDeclaration.name!)); // TODO: GH#18217 + } return false; } - return true; } // Public properties are otherwise accessible. @@ -26119,7 +26117,9 @@ namespace ts { if (flags & ModifierFlags.Private) { const declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop)!)!; if (!isNodeWithinClass(node, declaringClassDeclaration)) { - error(errorNode, Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); + if(reportError) { + error(errorNode, Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); + } return false; } return true; @@ -26144,7 +26144,9 @@ namespace ts { // static member access is disallow let thisParameter: ParameterDeclaration | undefined; if (flags & ModifierFlags.Static || !(thisParameter = getThisParameterFromNodeContext(node)) || !thisParameter.type) { - error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); + if(reportError) { + error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); + } return false; } @@ -26160,7 +26162,9 @@ namespace ts { type = (type as TypeParameter).isThisType ? getConstraintOfTypeParameter(type)! : getBaseConstraintOfType(type)!; // TODO: GH#18217 Use a different variable that's allowed to be undefined } if (!type || !hasBaseType(type, enclosingClass)) { - error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass)); + if(reportError) { + error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass)); + } return false; } return true; @@ -26349,6 +26353,9 @@ namespace ts { let prop: Symbol | undefined; if (isPrivateIdentifier(right)) { const lexicallyScopedSymbol = lookupSymbolForPrivateIdentifierDeclaration(right.escapedText, right); + if(assignmentKind && lexicallyScopedSymbol && isMethodDeclaration(lexicallyScopedSymbol.valueDeclaration)) { + grammarErrorOnNode(right, Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable, idText(right)); + } if (isAnyLike) { if (lexicallyScopedSymbol) { return apparentType; @@ -26635,7 +26642,14 @@ namespace ts { } function getSuggestedSymbolForNonexistentProperty(name: Identifier | PrivateIdentifier | string, containingType: Type): Symbol | undefined { - return getSpellingSuggestionForName(isString(name) ? name : idText(name), getPropertiesOfType(containingType), SymbolFlags.Value); + let props = getPropertiesOfType(containingType); + if(typeof name !== "string") { + const parent = name.parent; + if(isPropertyAccessExpression(parent)) { + props = filter(props, prop => isValidPropertyAccessForCompletions(parent, containingType, prop)); + } + } + return getSpellingSuggestionForName(isString(name) ? name : idText(name), props, SymbolFlags.Value); } function getSuggestedSymbolForNonexistentJSXAttribute(name: Identifier | PrivateIdentifier | string, containingType: Type): Symbol | undefined { @@ -26797,11 +26811,11 @@ namespace ts { } const prop = getPropertyOfType(type, propertyName); if (prop) { - if (isPropertyAccessExpression(node) && prop.valueDeclaration && isPrivateIdentifierPropertyDeclaration(prop.valueDeclaration)) { + if (prop.valueDeclaration && isPrivateIdentifierClassElementDeclaration(prop.valueDeclaration)) { const declClass = getContainingClass(prop.valueDeclaration); return !isOptionalChain(node) && !!findAncestor(node, parent => parent === declClass); } - return checkPropertyAccessibility(node, isSuper, type, prop); + return checkPropertyAccessibility(node, isSuper, 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)); @@ -32291,10 +32305,6 @@ namespace ts { // Grammar checking if (!checkGrammarMethod(node)) checkGrammarComputedPropertyName(node.name); - if (isPrivateIdentifier(node.name)) { - error(node, Diagnostics.A_method_cannot_be_named_with_a_private_identifier); - } - // Grammar checking for modifiers is done inside the function checkGrammarFunctionLikeDeclaration checkFunctionOrMethodDeclaration(node); @@ -32331,7 +32341,7 @@ namespace ts { } function isInstancePropertyWithInitializerOrPrivateIdentifierProperty(n: Node): boolean { - if (isPrivateIdentifierPropertyDeclaration(n)) { + if (isPrivateIdentifierClassElementDeclaration(n)) { return true; } return n.kind === SyntaxKind.PropertyDeclaration && @@ -32408,9 +32418,7 @@ namespace ts { if (node.name.kind === SyntaxKind.ComputedPropertyName) { checkComputedPropertyName(node.name); } - if (isPrivateIdentifier(node.name)) { - error(node.name, Diagnostics.An_accessor_cannot_be_named_with_a_private_identifier); - } + if (hasBindableName(node)) { // TypeScript 1.0 spec (April 2014): 8.4.3 // Accessors for the same member name must specify the same accessibility. @@ -32705,7 +32713,7 @@ namespace ts { } function isPrivateWithinAmbient(node: Node): boolean { - return (hasEffectiveModifier(node, ModifierFlags.Private) || isPrivateIdentifierPropertyDeclaration(node)) && !!(node.flags & NodeFlags.Ambient); + return (hasEffectiveModifier(node, ModifierFlags.Private) || isPrivateIdentifierClassElementDeclaration(node)) && !!(node.flags & NodeFlags.Ambient); } function getEffectiveDeclarationFlags(n: Declaration, flagsToCheck: ModifierFlags): ModifierFlags { @@ -39512,7 +39520,7 @@ namespace ts { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_must_precede_1_modifier, text, "abstract"); } } - else if (isPrivateIdentifierPropertyDeclaration(node)) { + else if (isPrivateIdentifierClassElementDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics.An_accessibility_modifier_cannot_be_used_with_a_private_identifier); } flags |= modifierToFlag(modifier.kind); @@ -39537,7 +39545,7 @@ namespace ts { else if (flags & ModifierFlags.Abstract) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); } - else if (isPrivateIdentifierPropertyDeclaration(node)) { + else if (isPrivateIdentifierClassElementDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "static"); } flags |= ModifierFlags.Static; @@ -39601,7 +39609,7 @@ namespace ts { else if ((node.parent.flags & NodeFlags.Ambient) && node.parent.kind === SyntaxKind.ModuleBlock) { return grammarErrorOnNode(modifier, Diagnostics.A_declare_modifier_cannot_be_used_in_an_already_ambient_context); } - else if (isPrivateIdentifierPropertyDeclaration(node)) { + else if (isPrivateIdentifierClassElementDeclaration(node)) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "declare"); } flags |= ModifierFlags.Ambient; @@ -40283,6 +40291,9 @@ namespace ts { if (languageVersion < ScriptTarget.ES5) { return grammarErrorOnNode(accessor.name, Diagnostics.Accessors_are_only_available_when_targeting_ECMAScript_5_and_higher); } + if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(accessor.name)) { + return grammarErrorOnNode(accessor.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); + } if (accessor.body === undefined && !hasSyntacticModifier(accessor, ModifierFlags.Abstract)) { return grammarErrorAtPos(accessor, accessor.end - 1, ";".length, Diagnostics._0_expected, "{"); } @@ -40416,6 +40427,9 @@ namespace ts { } if (isClassLike(node.parent)) { + if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(node.name)) { + return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher); + } // Technically, computed properties in ambient contexts is disallowed // for property declarations and accessors too, not just methods. // However, property declarations disallow computed names in general, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 035e0b5ceea2f..fbb76afc581eb 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3257,6 +3257,10 @@ "code": 2800 }, + "Cannot assign to private method '{0}'. Private methods are not writable.": { + "category": "Error", + "code": 2801 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 @@ -6303,14 +6307,6 @@ "category": "Error", "code": 18019 }, - "A method cannot be named with a private identifier.": { - "category": "Error", - "code": 18022 - }, - "An accessor cannot be named with a private identifier.": { - "category": "Error", - "code": 18023 - }, "An enum member cannot be named with a private identifier.": { "category": "Error", "code": 18024 diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 96ba926dd17db..da8c8f35c4aeb 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -570,7 +570,7 @@ namespace ts { if (shouldTransformPrivateFields) { // Declare private names. for (const member of node.members) { - if (isPrivateIdentifierPropertyDeclaration(member)) { + if (isPrivateIdentifierClassElementDeclaration(member)) { addPrivateIdentifierToEnvironment(member.name); } } @@ -594,7 +594,7 @@ namespace ts { // then we don't need to transform any class properties. return languageVersion < ScriptTarget.ESNext; } - return isInitializedProperty(member) || shouldTransformPrivateFields && isPrivateIdentifierPropertyDeclaration(member); + return isInitializedProperty(member) || shouldTransformPrivateFields && isPrivateIdentifierClassElementDeclaration(member); } function transformConstructor(node: ClassDeclaration | ClassExpression, isDerivedClass: boolean) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 4352e2f2171e3..7ddfff3820876 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1300,6 +1300,24 @@ namespace ts { export interface PrivateIdentifierPropertyDeclaration extends PropertyDeclaration { name: PrivateIdentifier; } + /*@internal*/ + export interface PrivateIdentifierMethodDeclaration extends MethodDeclaration { + name: PrivateIdentifier; + } + /*@internal*/ + export interface PrivateIdentifierGetAccessorDeclaration extends GetAccessorDeclaration { + name: PrivateIdentifier; + } + /*@internal*/ + export interface PrivateIdentifierSetAccessorDeclaration extends SetAccessorDeclaration { + name: PrivateIdentifier; + } + /*@internal*/ + export type PrivateClassElementDeclaration = + | PrivateIdentifierPropertyDeclaration + | PrivateIdentifierMethodDeclaration + | PrivateIdentifierGetAccessorDeclaration + | PrivateIdentifierSetAccessorDeclaration; /* @internal */ export type InitializedPropertyDeclaration = PropertyDeclaration & { readonly initializer: Expression }; diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index d45eb73478d5a..fc90aa5bca55e 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -488,7 +488,7 @@ namespace ts { return unescapeLeadingUnderscores(identifierOrPrivateName.escapedText); } export function symbolName(symbol: Symbol): string { - if (symbol.valueDeclaration && isPrivateIdentifierPropertyDeclaration(symbol.valueDeclaration)) { + if (symbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) { return idText(symbol.valueDeclaration.name); } return unescapeLeadingUnderscores(symbol.escapedName); @@ -1131,8 +1131,8 @@ namespace ts { // Private Identifiers /*@internal*/ - export function isPrivateIdentifierPropertyDeclaration(node: Node): node is PrivateIdentifierPropertyDeclaration { - return isPropertyDeclaration(node) && isPrivateIdentifier(node.name); + export function isPrivateIdentifierClassElementDeclaration(node: Node): node is PrivateClassElementDeclaration { + return (isPropertyDeclaration(node) || isMethodOrAccessor(node)) && isPrivateIdentifier(node.name); } /*@internal*/ diff --git a/src/services/completions.ts b/src/services/completions.ts index a59f637a96eca..13d9e2bd4dc46 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -2530,7 +2530,7 @@ namespace ts.Completions { !existingMemberNames.has(propertySymbol.escapedName) && !!propertySymbol.declarations && !(getDeclarationModifierFlagsFromSymbol(propertySymbol) & ModifierFlags.Private) && - !(propertySymbol.valueDeclaration && isPrivateIdentifierPropertyDeclaration(propertySymbol.valueDeclaration))); + !(propertySymbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(propertySymbol.valueDeclaration))); } /** @@ -2589,7 +2589,7 @@ namespace ts.Completions { } const validNameResult: CompletionEntryDisplayNameForSymbol = { name, needsConvertPropertyAccess: false }; - if (isIdentifierText(name, target, jsxIdentifierExpected ? LanguageVariant.JSX : LanguageVariant.Standard) || symbol.valueDeclaration && isPrivateIdentifierPropertyDeclaration(symbol.valueDeclaration)) { + if (isIdentifierText(name, target, jsxIdentifierExpected ? LanguageVariant.JSX : LanguageVariant.Standard) || symbol.valueDeclaration && isPrivateIdentifierClassElementDeclaration(symbol.valueDeclaration)) { return validNameResult; } switch (kind) { diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 12a97433615ca..f9bb50c286b06 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1242,7 +1242,7 @@ namespace ts.FindAllReferences { // If this is private property or method, the scope is the containing class if (flags & (SymbolFlags.Property | SymbolFlags.Method)) { - const privateDeclaration = find(declarations, d => hasEffectiveModifier(d, ModifierFlags.Private) || isPrivateIdentifierPropertyDeclaration(d)); + const privateDeclaration = find(declarations, d => hasEffectiveModifier(d, ModifierFlags.Private) || isPrivateIdentifierClassElementDeclaration(d)); if (privateDeclaration) { return getAncestor(privateDeclaration, SyntaxKind.ClassDeclaration); } diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index de823ad951d0e..654c537b853af 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -249,7 +249,7 @@ namespace ts.Completions.StringCompletions { function stringLiteralCompletionsFromProperties(type: Type | undefined): StringLiteralCompletionsFromProperties | undefined { return type && { kind: StringLiteralCompletionKind.Properties, - symbols: filter(type.getApparentProperties(), prop => !(prop.valueDeclaration && isPrivateIdentifierPropertyDeclaration(prop.valueDeclaration))), + symbols: filter(type.getApparentProperties(), prop => !(prop.valueDeclaration && isPrivateIdentifierClassElementDeclaration(prop.valueDeclaration))), hasIndexSignature: hasIndexSignature(type) }; } From 4ab27a2bc511066cf5cf20a62bc834bd29fa560a Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Fri, 15 Jan 2021 18:05:42 +0200 Subject: [PATCH 02/68] Added tests for private methods. --- .../privateNameConstructorReserved.errors.txt | 5 +- .../privateNameConstructorReserved.js | 2 + .../privateNameES5Ban(target=es3).errors.txt | 36 ++--- .../privateNameES5Ban(target=es3).js | 4 +- .../privateNameES5Ban(target=es5).errors.txt | 30 ++-- .../privateNameES5Ban(target=es5).js | 4 +- .../reference/privateNameMethod.errors.txt | 22 +++ .../baselines/reference/privateNameMethod.js | 35 +++++ .../reference/privateNameMethod.symbols | 28 ++++ .../reference/privateNameMethod.types | 34 +++++ .../privateNameMethodAccess.errors.txt | 35 +++++ .../reference/privateNameMethodAccess.js | 56 ++++++++ .../reference/privateNameMethodAccess.symbols | 54 +++++++ .../reference/privateNameMethodAccess.types | 66 +++++++++ .../privateNameMethodAssignment.errors.txt | 30 ++++ .../reference/privateNameMethodAssignment.js | 45 ++++++ .../privateNameMethodAssignment.symbols | 39 ++++++ .../privateNameMethodAssignment.types | 52 +++++++ .../privateNameMethodCallExpression.js | 81 +++++++++++ .../privateNameMethodCallExpression.symbols | 89 ++++++++++++ .../privateNameMethodCallExpression.types | 132 ++++++++++++++++++ ...rivateNameMethodsDerivedClasses.errors.txt | 18 +++ .../privateNameMethodsDerivedClasses.js | 34 +++++ .../privateNameMethodsDerivedClasses.symbols | 37 +++++ .../privateNameMethodsDerivedClasses.types | 41 ++++++ ...eNameNestedClassMethodShadowing.errors.txt | 23 +++ .../privateNameNestedClassMethodShadowing.js | 44 ++++++ ...vateNameNestedClassMethodShadowing.symbols | 41 ++++++ ...rivateNameNestedClassMethodShadowing.types | 42 ++++++ .../privateNamesAndDecorators.errors.txt | 5 +- .../reference/privateNamesAndDecorators.js | 4 +- ...privateNamesAndGenericClasses-2.errors.txt | 5 +- .../privateNamesAndGenericClasses-2.js | 6 +- .../privateNamesAndMethods.errors.txt | 51 ------- .../privateNamesAndStaticMethods.errors.txt | 36 ++--- .../members/privateNames/privateNameMethod.ts | 14 ++ .../privateNames/privateNameMethodAccess.ts | 24 ++++ .../privateNameMethodAssignment.ts | 13 ++ .../privateNameMethodCallExpression.ts | 25 ++++ .../privateNameMethodsDerivedClasses.ts | 13 ++ .../privateNameNestedClassMethodShadowing.ts | 16 +++ ...ixSpellingPrivatePropertyNameNotInScope.ts | 15 ++ .../completionListPrivateNamesMethods.ts | 31 ++++ .../findAllRefsPrivateNameMethods.ts | 24 ++++ .../fourslash/goToDefinitionPrivateName.ts | 9 +- .../navigationBarPrivateNameMethod.ts | 109 +++++++++++++++ tests/cases/fourslash/renamePrivateMethod.ts | 13 ++ 47 files changed, 1440 insertions(+), 132 deletions(-) create mode 100644 tests/baselines/reference/privateNameMethod.errors.txt create mode 100644 tests/baselines/reference/privateNameMethod.js create mode 100644 tests/baselines/reference/privateNameMethod.symbols create mode 100644 tests/baselines/reference/privateNameMethod.types create mode 100644 tests/baselines/reference/privateNameMethodAccess.errors.txt create mode 100644 tests/baselines/reference/privateNameMethodAccess.js create mode 100644 tests/baselines/reference/privateNameMethodAccess.symbols create mode 100644 tests/baselines/reference/privateNameMethodAccess.types create mode 100644 tests/baselines/reference/privateNameMethodAssignment.errors.txt create mode 100644 tests/baselines/reference/privateNameMethodAssignment.js create mode 100644 tests/baselines/reference/privateNameMethodAssignment.symbols create mode 100644 tests/baselines/reference/privateNameMethodAssignment.types create mode 100644 tests/baselines/reference/privateNameMethodCallExpression.js create mode 100644 tests/baselines/reference/privateNameMethodCallExpression.symbols create mode 100644 tests/baselines/reference/privateNameMethodCallExpression.types create mode 100644 tests/baselines/reference/privateNameMethodsDerivedClasses.errors.txt create mode 100644 tests/baselines/reference/privateNameMethodsDerivedClasses.js create mode 100644 tests/baselines/reference/privateNameMethodsDerivedClasses.symbols create mode 100644 tests/baselines/reference/privateNameMethodsDerivedClasses.types create mode 100644 tests/baselines/reference/privateNameNestedClassMethodShadowing.errors.txt create mode 100644 tests/baselines/reference/privateNameNestedClassMethodShadowing.js create mode 100644 tests/baselines/reference/privateNameNestedClassMethodShadowing.symbols create mode 100644 tests/baselines/reference/privateNameNestedClassMethodShadowing.types delete mode 100644 tests/baselines/reference/privateNamesAndMethods.errors.txt create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts create mode 100644 tests/cases/fourslash/codeFixSpellingPrivatePropertyNameNotInScope.ts create mode 100644 tests/cases/fourslash/completionListPrivateNamesMethods.ts create mode 100644 tests/cases/fourslash/findAllRefsPrivateNameMethods.ts create mode 100644 tests/cases/fourslash/navigationBarPrivateNameMethod.ts create mode 100644 tests/cases/fourslash/renamePrivateMethod.ts diff --git a/tests/baselines/reference/privateNameConstructorReserved.errors.txt b/tests/baselines/reference/privateNameConstructorReserved.errors.txt index 4cc4131338f00..6ac1e71bfc6a5 100644 --- a/tests/baselines/reference/privateNameConstructorReserved.errors.txt +++ b/tests/baselines/reference/privateNameConstructorReserved.errors.txt @@ -1,13 +1,10 @@ tests/cases/conformance/classes/members/privateNames/privateNameConstructorReserved.ts(2,5): error TS18012: '#constructor' is a reserved word. -tests/cases/conformance/classes/members/privateNames/privateNameConstructorReserved.ts(2,5): error TS18022: A method cannot be named with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNameConstructorReserved.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameConstructorReserved.ts (1 errors) ==== class A { #constructor() {} // Error: `#constructor` is a reserved word. ~~~~~~~~~~~~ !!! error TS18012: '#constructor' is a reserved word. - ~~~~~~~~~~~~ -!!! error TS18022: A method cannot be named with a private identifier. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameConstructorReserved.js b/tests/baselines/reference/privateNameConstructorReserved.js index 54cae241f51da..ea3c83b9eaae3 100644 --- a/tests/baselines/reference/privateNameConstructorReserved.js +++ b/tests/baselines/reference/privateNameConstructorReserved.js @@ -5,6 +5,8 @@ class A { //// [privateNameConstructorReserved.js] +var _constructor; class A { () { } // Error: `#constructor` is a reserved word. } +_constructor = new WeakMap(); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt b/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt index 48669311941cc..a5c48c8461826 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt @@ -1,18 +1,14 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(3,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,12): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS18023: An accessor cannot be named with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,16): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16): error TS18023: An accessor cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): error TS18019: 'static' modifier cannot be used with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts (12 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts (8 errors) ==== class A { constructor() {} #field = 123; @@ -20,33 +16,25 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16) !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. #method() {} ~~~~~~~ -!!! error TS18022: A method cannot be named with a private identifier. +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sField = "hello world"; ~~~~~~ !!! error TS18019: 'static' modifier cannot be used with a private identifier. static #sMethod() {} - ~~~~~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. get #acc() { return ""; } ~~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. set #acc(x: string) {} ~~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. static get #sAcc() { return 0; } - ~~~~~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. static set #sAcc(x: number) {} - ~~~~~ -!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index b17b950cbf530..431eaba29e7cf 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -32,8 +32,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _sField; - _field = new WeakMap(), _sField = new WeakMap(); + var _field, _method, _sField, _sMethod, _acc, _acc_1, _sAcc, _sAcc_1; + _field = new WeakMap(), _method = new WeakMap(), _sField = new WeakMap(), _sMethod = new WeakMap(), _acc = new WeakMap(), _acc_1 = new WeakMap(), _sAcc = new WeakMap(), _sAcc_1 = new WeakMap(); _sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt b/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt index 98da48317a6fa..6261ff415a483 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt @@ -1,11 +1,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(3,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,12): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,16): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16): error TS18023: An accessor cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): error TS18019: 'static' modifier cannot be used with a private identifier. ==== tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts (8 errors) ==== @@ -16,25 +16,25 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16) !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. #method() {} ~~~~~~~ -!!! error TS18022: A method cannot be named with a private identifier. +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sField = "hello world"; ~~~~~~ !!! error TS18019: 'static' modifier cannot be used with a private identifier. static #sMethod() {} - ~~~~~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. get #acc() { return ""; } ~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. set #acc(x: string) {} ~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static get #sAcc() { return 0; } - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. static set #sAcc(x: number) {} - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index b17b950cbf530..431eaba29e7cf 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -32,8 +32,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _sField; - _field = new WeakMap(), _sField = new WeakMap(); + var _field, _method, _sField, _sMethod, _acc, _acc_1, _sAcc, _sAcc_1; + _field = new WeakMap(), _method = new WeakMap(), _sField = new WeakMap(), _sMethod = new WeakMap(), _acc = new WeakMap(), _acc_1 = new WeakMap(), _sAcc = new WeakMap(), _sAcc_1 = new WeakMap(); _sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameMethod.errors.txt b/tests/baselines/reference/privateNameMethod.errors.txt new file mode 100644 index 0000000000000..92de4ef3f42cd --- /dev/null +++ b/tests/baselines/reference/privateNameMethod.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts(7,22): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. +tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts(8,14): error TS2554: Expected 1 arguments, but got 0. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts (2 errors) ==== + class A1 { + #method(param: string): string { + return ""; + } + constructor(name: string) { + this.#method("") + this.#method(1) // Error + ~ +!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + this.#method() // Error + ~~~~~~~~~ +!!! error TS2554: Expected 1 arguments, but got 0. +!!! related TS6210 tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts:2:13: An argument for 'param' was not provided. + + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js new file mode 100644 index 0000000000000..47fcf7964d955 --- /dev/null +++ b/tests/baselines/reference/privateNameMethod.js @@ -0,0 +1,35 @@ +//// [privateNameMethod.ts] +class A1 { + #method(param: string): string { + return ""; + } + constructor(name: string) { + this.#method("") + this.#method(1) // Error + this.#method() // Error + + } +} + + +//// [privateNameMethod.js] +"use strict"; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _method; +class A1 { + constructor(name) { + __classPrivateFieldGet(this, _method).call(this, ""); + __classPrivateFieldGet(this, _method).call(this, 1); // Error + __classPrivateFieldGet(this, _method).call(// Error + this); // Error + } + (param) { + return ""; + } +} +_method = new WeakMap(); diff --git a/tests/baselines/reference/privateNameMethod.symbols b/tests/baselines/reference/privateNameMethod.symbols new file mode 100644 index 0000000000000..724dd0cbddb1e --- /dev/null +++ b/tests/baselines/reference/privateNameMethod.symbols @@ -0,0 +1,28 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts === +class A1 { +>A1 : Symbol(A1, Decl(privateNameMethod.ts, 0, 0)) + + #method(param: string): string { +>#method : Symbol(A1.#method, Decl(privateNameMethod.ts, 0, 10)) +>param : Symbol(param, Decl(privateNameMethod.ts, 1, 12)) + + return ""; + } + constructor(name: string) { +>name : Symbol(name, Decl(privateNameMethod.ts, 4, 16)) + + this.#method("") +>this.#method : Symbol(A1.#method, Decl(privateNameMethod.ts, 0, 10)) +>this : Symbol(A1, Decl(privateNameMethod.ts, 0, 0)) + + this.#method(1) // Error +>this.#method : Symbol(A1.#method, Decl(privateNameMethod.ts, 0, 10)) +>this : Symbol(A1, Decl(privateNameMethod.ts, 0, 0)) + + this.#method() // Error +>this.#method : Symbol(A1.#method, Decl(privateNameMethod.ts, 0, 10)) +>this : Symbol(A1, Decl(privateNameMethod.ts, 0, 0)) + + } +} + diff --git a/tests/baselines/reference/privateNameMethod.types b/tests/baselines/reference/privateNameMethod.types new file mode 100644 index 0000000000000..f28e54126790f --- /dev/null +++ b/tests/baselines/reference/privateNameMethod.types @@ -0,0 +1,34 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts === +class A1 { +>A1 : A1 + + #method(param: string): string { +>#method : (param: string) => string +>param : string + + return ""; +>"" : "" + } + constructor(name: string) { +>name : string + + this.#method("") +>this.#method("") : string +>this.#method : (param: string) => string +>this : this +>"" : "" + + this.#method(1) // Error +>this.#method(1) : string +>this.#method : (param: string) => string +>this : this +>1 : 1 + + this.#method() // Error +>this.#method() : string +>this.#method : (param: string) => string +>this : this + + } +} + diff --git a/tests/baselines/reference/privateNameMethodAccess.errors.txt b/tests/baselines/reference/privateNameMethodAccess.errors.txt new file mode 100644 index 0000000000000..4ee30c160f5ca --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAccess.errors.txt @@ -0,0 +1,35 @@ +tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts(12,10): error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts(15,14): error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts(20,18): error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts (3 errors) ==== + class A2 { + #method() { return "" } + constructor() { + console.log(this.#method); + let a: A2 = this; + a.#method(); + function foo (){ + a.#method(); + } + } + } + new A2().#method(); // Error + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. + + function foo (){ + new A2().#method(); // Error + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. + } + + class B2 { + m() { + new A2().#method(); + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class 'A2' because it has a private identifier. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodAccess.js b/tests/baselines/reference/privateNameMethodAccess.js new file mode 100644 index 0000000000000..2a42bead50f92 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAccess.js @@ -0,0 +1,56 @@ +//// [privateNameMethodAccess.ts] +class A2 { + #method() { return "" } + constructor() { + console.log(this.#method); + let a: A2 = this; + a.#method(); + function foo (){ + a.#method(); + } + } +} +new A2().#method(); // Error + +function foo (){ + new A2().#method(); // Error +} + +class B2 { + m() { + new A2().#method(); + } +} + + +//// [privateNameMethodAccess.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _method, _a; +class A2 { + constructor() { + console.log(__classPrivateFieldGet(this, _method)); + let a = this; + __classPrivateFieldGet(a, _method).call(a); + function foo() { + __classPrivateFieldGet(a, _method).call(a); + } + } + () { return ""; } +} +_method = new WeakMap(); +(_a = new A2())..call(_a); // Error +function foo() { + var _a; + (_a = new A2())..call(_a); // Error +} +class B2 { + m() { + var _a; + (_a = new A2())..call(_a); + } +} diff --git a/tests/baselines/reference/privateNameMethodAccess.symbols b/tests/baselines/reference/privateNameMethodAccess.symbols new file mode 100644 index 0000000000000..7b1517bca05b8 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAccess.symbols @@ -0,0 +1,54 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts === +class A2 { +>A2 : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) + + #method() { return "" } +>#method : Symbol(A2.#method, Decl(privateNameMethodAccess.ts, 0, 10)) + + constructor() { + console.log(this.#method); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#method : Symbol(A2.#method, Decl(privateNameMethodAccess.ts, 0, 10)) +>this : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) + + let a: A2 = this; +>a : Symbol(a, Decl(privateNameMethodAccess.ts, 4, 11)) +>A2 : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) +>this : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) + + a.#method(); +>a.#method : Symbol(A2.#method, Decl(privateNameMethodAccess.ts, 0, 10)) +>a : Symbol(a, Decl(privateNameMethodAccess.ts, 4, 11)) + + function foo (){ +>foo : Symbol(foo, Decl(privateNameMethodAccess.ts, 5, 20)) + + a.#method(); +>a.#method : Symbol(A2.#method, Decl(privateNameMethodAccess.ts, 0, 10)) +>a : Symbol(a, Decl(privateNameMethodAccess.ts, 4, 11)) + } + } +} +new A2().#method(); // Error +>A2 : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) + +function foo (){ +>foo : Symbol(foo, Decl(privateNameMethodAccess.ts, 11, 19)) + + new A2().#method(); // Error +>A2 : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) +} + +class B2 { +>B2 : Symbol(B2, Decl(privateNameMethodAccess.ts, 15, 1)) + + m() { +>m : Symbol(B2.m, Decl(privateNameMethodAccess.ts, 17, 10)) + + new A2().#method(); +>A2 : Symbol(A2, Decl(privateNameMethodAccess.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameMethodAccess.types b/tests/baselines/reference/privateNameMethodAccess.types new file mode 100644 index 0000000000000..9b126fe672c9a --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAccess.types @@ -0,0 +1,66 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts === +class A2 { +>A2 : A2 + + #method() { return "" } +>#method : () => string +>"" : "" + + constructor() { + console.log(this.#method); +>console.log(this.#method) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#method : () => string +>this : this + + let a: A2 = this; +>a : A2 +>this : this + + a.#method(); +>a.#method() : string +>a.#method : () => string +>a : A2 + + function foo (){ +>foo : () => void + + a.#method(); +>a.#method() : string +>a.#method : () => string +>a : A2 + } + } +} +new A2().#method(); // Error +>new A2().#method() : any +>new A2().#method : any +>new A2() : A2 +>A2 : typeof A2 + +function foo (){ +>foo : () => void + + new A2().#method(); // Error +>new A2().#method() : any +>new A2().#method : any +>new A2() : A2 +>A2 : typeof A2 +} + +class B2 { +>B2 : B2 + + m() { +>m : () => void + + new A2().#method(); +>new A2().#method() : any +>new A2().#method : any +>new A2() : A2 +>A2 : typeof A2 + } +} + diff --git a/tests/baselines/reference/privateNameMethodAssignment.errors.txt b/tests/baselines/reference/privateNameMethodAssignment.errors.txt new file mode 100644 index 0000000000000..d25297e3672ee --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAssignment.errors.txt @@ -0,0 +1,30 @@ +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(4,14): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(5,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(6,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(7,20): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(9,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts (5 errors) ==== + class A3 { + #method() { }; + constructor(a: A3, b: any) { + this.#method = () => {} // Error, not writable + ~~~~~~~ +!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + a.#method = () => { }; // Error, not writable + ~~~~~~~ +!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + b.#method = () => { } //Error, not writable + ~~~~~~~ +!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + ({ x: this.#method } = { x: () => {}}); //Error, not writable + ~~~~~~~ +!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + let x = this.#method; + b.#method++ //Error, not writable + ~~~~~~~ +!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js new file mode 100644 index 0000000000000..407206bee54c0 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -0,0 +1,45 @@ +//// [privateNameMethodAssignment.ts] +class A3 { + #method() { }; + constructor(a: A3, b: any) { + this.#method = () => {} // Error, not writable + a.#method = () => { }; // Error, not writable + b.#method = () => { } //Error, not writable + ({ x: this.#method } = { x: () => {}}); //Error, not writable + let x = this.#method; + b.#method++ //Error, not writable + } +} + + +//// [privateNameMethodAssignment.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _method; +class A3 { + constructor(a, b) { + var _a, _b; + __classPrivateFieldSet(this, _method, () => { }); // Error, not writable + __classPrivateFieldSet(// Error, not writable + a, _method, () => { }); // Error, not writable + __classPrivateFieldSet(// Error, not writable + b, _method, () => { }); //Error, not writable + (_a = this, { x: ({ set value(_b) { __classPrivateFieldSet(_a, _method, _b); } }).value } = { x: () => { } }); //Error, not writable + let x = __classPrivateFieldGet(this, _method); + __classPrivateFieldSet(_b = b, _method, +__classPrivateFieldGet(_b, _method) + 1); //Error, not writable + } + () { } + ; +} +_method = new WeakMap(); diff --git a/tests/baselines/reference/privateNameMethodAssignment.symbols b/tests/baselines/reference/privateNameMethodAssignment.symbols new file mode 100644 index 0000000000000..01a6b8c40877f --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAssignment.symbols @@ -0,0 +1,39 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts === +class A3 { +>A3 : Symbol(A3, Decl(privateNameMethodAssignment.ts, 0, 0)) + + #method() { }; +>#method : Symbol(A3.#method, Decl(privateNameMethodAssignment.ts, 0, 10)) + + constructor(a: A3, b: any) { +>a : Symbol(a, Decl(privateNameMethodAssignment.ts, 2, 16)) +>A3 : Symbol(A3, Decl(privateNameMethodAssignment.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameMethodAssignment.ts, 2, 22)) + + this.#method = () => {} // Error, not writable +>this.#method : Symbol(A3.#method, Decl(privateNameMethodAssignment.ts, 0, 10)) +>this : Symbol(A3, Decl(privateNameMethodAssignment.ts, 0, 0)) + + a.#method = () => { }; // Error, not writable +>a.#method : Symbol(A3.#method, Decl(privateNameMethodAssignment.ts, 0, 10)) +>a : Symbol(a, Decl(privateNameMethodAssignment.ts, 2, 16)) + + b.#method = () => { } //Error, not writable +>b : Symbol(b, Decl(privateNameMethodAssignment.ts, 2, 22)) + + ({ x: this.#method } = { x: () => {}}); //Error, not writable +>x : Symbol(x, Decl(privateNameMethodAssignment.ts, 6, 10)) +>this.#method : Symbol(A3.#method, Decl(privateNameMethodAssignment.ts, 0, 10)) +>this : Symbol(A3, Decl(privateNameMethodAssignment.ts, 0, 0)) +>x : Symbol(x, Decl(privateNameMethodAssignment.ts, 6, 32)) + + let x = this.#method; +>x : Symbol(x, Decl(privateNameMethodAssignment.ts, 7, 11)) +>this.#method : Symbol(A3.#method, Decl(privateNameMethodAssignment.ts, 0, 10)) +>this : Symbol(A3, Decl(privateNameMethodAssignment.ts, 0, 0)) + + b.#method++ //Error, not writable +>b : Symbol(b, Decl(privateNameMethodAssignment.ts, 2, 22)) + } +} + diff --git a/tests/baselines/reference/privateNameMethodAssignment.types b/tests/baselines/reference/privateNameMethodAssignment.types new file mode 100644 index 0000000000000..963ba0c718650 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAssignment.types @@ -0,0 +1,52 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts === +class A3 { +>A3 : A3 + + #method() { }; +>#method : () => void + + constructor(a: A3, b: any) { +>a : A3 +>b : any + + this.#method = () => {} // Error, not writable +>this.#method = () => {} : () => void +>this.#method : () => void +>this : this +>() => {} : () => void + + a.#method = () => { }; // Error, not writable +>a.#method = () => { } : () => void +>a.#method : () => void +>a : A3 +>() => { } : () => void + + b.#method = () => { } //Error, not writable +>b.#method = () => { } : () => void +>b.#method : any +>b : any +>() => { } : () => void + + ({ x: this.#method } = { x: () => {}}); //Error, not writable +>({ x: this.#method } = { x: () => {}}) : { x: () => void; } +>{ x: this.#method } = { x: () => {}} : { x: () => void; } +>{ x: this.#method } : { x: () => void; } +>x : () => void +>this.#method : () => void +>this : this +>{ x: () => {}} : { x: () => void; } +>x : () => void +>() => {} : () => void + + let x = this.#method; +>x : () => void +>this.#method : () => void +>this : this + + b.#method++ //Error, not writable +>b.#method++ : number +>b.#method : any +>b : any + } +} + diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js new file mode 100644 index 0000000000000..f9ee44f4b73c7 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -0,0 +1,81 @@ +//// [privateNameMethodCallExpression.ts] +class AA { + #method() { this.x = 10; }; + #method2(a, ...b) {}; + x = 1; + test() { + this.#method(); + const func = this.#method; + func(); + new this.#method(); + + const arr = [ 1, 2 ]; + this.#method2(0, ...arr, 3); + + const b = new this.#method2(0, ...arr, 3); //Error + const str = this.#method2`head${1}middle${2}tail`; + this.getInstance().#method2`test${1}and${2}`; + + this.getInstance().#method2(0, ...arr, 3); + const b2 = new (this.getInstance().#method2)(0, ...arr, 3); //Error + const str2 = this.getInstance().#method2`head${1}middle${2}tail`; + } + getInstance() { return new AA(); } +} + + +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(12,5): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(12,8): error TS1005: '=>' expected. +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(14,15): error TS1005: '=>' expected. +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(16,12): error TS1005: ';' expected. +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(31,19): error TS1005: ';' expected. +tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(32,1): error TS1128: Declaration or statement expected. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js (6 errors) ==== + var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); + }; + var _method, _method2; + class AA { + constructor() { + this.x = 1; + } + () { this.x = 10; } + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. + ~ +!!! error TS1005: '=>' expected. + ; + (a, ...b) { } + ~ +!!! error TS1005: '=>' expected. + ; + test() { + ~ +!!! error TS1005: ';' expected. + var _a, _b, _c; + __classPrivateFieldGet(this, _method).call(this); + const func = __classPrivateFieldGet(this, _method); + func(); + new (__classPrivateFieldGet(this, _method))(); + const arr = [1, 2]; + __classPrivateFieldGet(this, _method2).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _method2))(0, ...arr, 3); //Error + const str = __classPrivateFieldGet(this, _method2).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_a = this.getInstance()), _method2).bind(_a) `test${1}and${2}`; + __classPrivateFieldGet((_b = this.getInstance()), _method2).call(_b, 0, ...arr, 3); + const b2 = new (__classPrivateFieldGet(this.getInstance(), _method2))(0, ...arr, 3); //Error + const str2 = __classPrivateFieldGet((_c = this.getInstance()), _method2).bind(_c) `head${1}middle${2}tail`; + } + getInstance() { return new AA(); } + ~ +!!! error TS1005: ';' expected. + } + ~ +!!! error TS1128: Declaration or statement expected. + _method = new WeakMap(), _method2 = new WeakMap(); + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodCallExpression.symbols b/tests/baselines/reference/privateNameMethodCallExpression.symbols new file mode 100644 index 0000000000000..668953b9b546e --- /dev/null +++ b/tests/baselines/reference/privateNameMethodCallExpression.symbols @@ -0,0 +1,89 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts === +class AA { +>AA : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) + + #method() { this.x = 10; }; +>#method : Symbol(AA.#method, Decl(privateNameMethodCallExpression.ts, 0, 10)) +>this.x : Symbol(AA.x, Decl(privateNameMethodCallExpression.ts, 2, 25)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>x : Symbol(AA.x, Decl(privateNameMethodCallExpression.ts, 2, 25)) + + #method2(a, ...b) {}; +>#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>a : Symbol(a, Decl(privateNameMethodCallExpression.ts, 2, 13)) +>b : Symbol(b, Decl(privateNameMethodCallExpression.ts, 2, 15)) + + x = 1; +>x : Symbol(AA.x, Decl(privateNameMethodCallExpression.ts, 2, 25)) + + test() { +>test : Symbol(AA.test, Decl(privateNameMethodCallExpression.ts, 3, 10)) + + this.#method(); +>this.#method : Symbol(AA.#method, Decl(privateNameMethodCallExpression.ts, 0, 10)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) + + const func = this.#method; +>func : Symbol(func, Decl(privateNameMethodCallExpression.ts, 6, 13)) +>this.#method : Symbol(AA.#method, Decl(privateNameMethodCallExpression.ts, 0, 10)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) + + func(); +>func : Symbol(func, Decl(privateNameMethodCallExpression.ts, 6, 13)) + + new this.#method(); +>this.#method : Symbol(AA.#method, Decl(privateNameMethodCallExpression.ts, 0, 10)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) + + const arr = [ 1, 2 ]; +>arr : Symbol(arr, Decl(privateNameMethodCallExpression.ts, 10, 13)) + + this.#method2(0, ...arr, 3); +>this.#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameMethodCallExpression.ts, 10, 13)) + + const b = new this.#method2(0, ...arr, 3); //Error +>b : Symbol(b, Decl(privateNameMethodCallExpression.ts, 13, 13)) +>this.#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameMethodCallExpression.ts, 10, 13)) + + const str = this.#method2`head${1}middle${2}tail`; +>str : Symbol(str, Decl(privateNameMethodCallExpression.ts, 14, 13)) +>this.#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) + + this.getInstance().#method2`test${1}and${2}`; +>this.getInstance().#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this.getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) + + this.getInstance().#method2(0, ...arr, 3); +>this.getInstance().#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this.getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>arr : Symbol(arr, Decl(privateNameMethodCallExpression.ts, 10, 13)) + + const b2 = new (this.getInstance().#method2)(0, ...arr, 3); //Error +>b2 : Symbol(b2, Decl(privateNameMethodCallExpression.ts, 18, 13)) +>this.getInstance().#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this.getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>arr : Symbol(arr, Decl(privateNameMethodCallExpression.ts, 10, 13)) + + const str2 = this.getInstance().#method2`head${1}middle${2}tail`; +>str2 : Symbol(str2, Decl(privateNameMethodCallExpression.ts, 19, 13)) +>this.getInstance().#method2 : Symbol(AA.#method2, Decl(privateNameMethodCallExpression.ts, 1, 31)) +>this.getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>this : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +>getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) + } + getInstance() { return new AA(); } +>getInstance : Symbol(AA.getInstance, Decl(privateNameMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameMethodCallExpression.ts, 0, 0)) +} + diff --git a/tests/baselines/reference/privateNameMethodCallExpression.types b/tests/baselines/reference/privateNameMethodCallExpression.types new file mode 100644 index 0000000000000..4f769429259e2 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodCallExpression.types @@ -0,0 +1,132 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts === +class AA { +>AA : AA + + #method() { this.x = 10; }; +>#method : () => void +>this.x = 10 : 10 +>this.x : number +>this : this +>x : number +>10 : 10 + + #method2(a, ...b) {}; +>#method2 : (a: any, ...b: any[]) => void +>a : any +>b : any[] + + x = 1; +>x : number +>1 : 1 + + test() { +>test : () => void + + this.#method(); +>this.#method() : void +>this.#method : () => void +>this : this + + const func = this.#method; +>func : () => void +>this.#method : () => void +>this : this + + func(); +>func() : void +>func : () => void + + new this.#method(); +>new this.#method() : any +>this.#method : () => void +>this : this + + const arr = [ 1, 2 ]; +>arr : number[] +>[ 1, 2 ] : number[] +>1 : 1 +>2 : 2 + + this.#method2(0, ...arr, 3); +>this.#method2(0, ...arr, 3) : void +>this.#method2 : (a: any, ...b: any[]) => void +>this : this +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b = new this.#method2(0, ...arr, 3); //Error +>b : any +>new this.#method2(0, ...arr, 3) : any +>this.#method2 : (a: any, ...b: any[]) => void +>this : this +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str = this.#method2`head${1}middle${2}tail`; +>str : void +>this.#method2`head${1}middle${2}tail` : void +>this.#method2 : (a: any, ...b: any[]) => void +>this : this +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + + this.getInstance().#method2`test${1}and${2}`; +>this.getInstance().#method2`test${1}and${2}` : void +>this.getInstance().#method2 : (a: any, ...b: any[]) => void +>this.getInstance() : AA +>this.getInstance : () => AA +>this : this +>getInstance : () => AA +>`test${1}and${2}` : "test1and2" +>1 : 1 +>2 : 2 + + this.getInstance().#method2(0, ...arr, 3); +>this.getInstance().#method2(0, ...arr, 3) : void +>this.getInstance().#method2 : (a: any, ...b: any[]) => void +>this.getInstance() : AA +>this.getInstance : () => AA +>this : this +>getInstance : () => AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b2 = new (this.getInstance().#method2)(0, ...arr, 3); //Error +>b2 : any +>new (this.getInstance().#method2)(0, ...arr, 3) : any +>(this.getInstance().#method2) : (a: any, ...b: any[]) => void +>this.getInstance().#method2 : (a: any, ...b: any[]) => void +>this.getInstance() : AA +>this.getInstance : () => AA +>this : this +>getInstance : () => AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str2 = this.getInstance().#method2`head${1}middle${2}tail`; +>str2 : void +>this.getInstance().#method2`head${1}middle${2}tail` : void +>this.getInstance().#method2 : (a: any, ...b: any[]) => void +>this.getInstance() : AA +>this.getInstance : () => AA +>this : this +>getInstance : () => AA +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + } + getInstance() { return new AA(); } +>getInstance : () => AA +>new AA() : AA +>AA : typeof AA +} + diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.errors.txt b/tests/baselines/reference/privateNameMethodsDerivedClasses.errors.txt new file mode 100644 index 0000000000000..62989cb6613a6 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.errors.txt @@ -0,0 +1,18 @@ +tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts(9,23): error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts (1 errors) ==== + class Base { + #prop(): number{ return 123; } + static method(x: Derived) { + console.log(x.#prop()); + } + } + class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop()); + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.js b/tests/baselines/reference/privateNameMethodsDerivedClasses.js new file mode 100644 index 0000000000000..44fe2875de037 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.js @@ -0,0 +1,34 @@ +//// [privateNameMethodsDerivedClasses.ts] +class Base { + #prop(): number{ return 123; } + static method(x: Derived) { + console.log(x.#prop()); + } +} +class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop()); + } +} + + +//// [privateNameMethodsDerivedClasses.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _prop; +class Base { + () { return 123; } + static method(x) { + console.log(__classPrivateFieldGet(x, _prop).call(x)); + } +} +_prop = new WeakMap(); +class Derived extends Base { + static method(x) { + console.log(x..call(x)); + } +} diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.symbols b/tests/baselines/reference/privateNameMethodsDerivedClasses.symbols new file mode 100644 index 0000000000000..472eef820a4ca --- /dev/null +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.symbols @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameMethodsDerivedClasses.ts, 0, 0)) + + #prop(): number{ return 123; } +>#prop : Symbol(Base.#prop, Decl(privateNameMethodsDerivedClasses.ts, 0, 12)) + + static method(x: Derived) { +>method : Symbol(Base.method, Decl(privateNameMethodsDerivedClasses.ts, 1, 35)) +>x : Symbol(x, Decl(privateNameMethodsDerivedClasses.ts, 2, 18)) +>Derived : Symbol(Derived, Decl(privateNameMethodsDerivedClasses.ts, 5, 1)) + + console.log(x.#prop()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x.#prop : Symbol(Base.#prop, Decl(privateNameMethodsDerivedClasses.ts, 0, 12)) +>x : Symbol(x, Decl(privateNameMethodsDerivedClasses.ts, 2, 18)) + } +} +class Derived extends Base { +>Derived : Symbol(Derived, Decl(privateNameMethodsDerivedClasses.ts, 5, 1)) +>Base : Symbol(Base, Decl(privateNameMethodsDerivedClasses.ts, 0, 0)) + + static method(x: Derived) { +>method : Symbol(Derived.method, Decl(privateNameMethodsDerivedClasses.ts, 6, 28)) +>x : Symbol(x, Decl(privateNameMethodsDerivedClasses.ts, 7, 18)) +>Derived : Symbol(Derived, Decl(privateNameMethodsDerivedClasses.ts, 5, 1)) + + console.log(x.#prop()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameMethodsDerivedClasses.ts, 7, 18)) + } +} + diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.types b/tests/baselines/reference/privateNameMethodsDerivedClasses.types new file mode 100644 index 0000000000000..9215984b7b023 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts === +class Base { +>Base : Base + + #prop(): number{ return 123; } +>#prop : () => number +>123 : 123 + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + console.log(x.#prop()); +>console.log(x.#prop()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop() : number +>x.#prop : () => number +>x : Derived + } +} +class Derived extends Base { +>Derived : Derived +>Base : Base + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + console.log(x.#prop()); +>console.log(x.#prop()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop() : any +>x.#prop : any +>x : Derived + } +} + diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.errors.txt b/tests/baselines/reference/privateNameNestedClassMethodShadowing.errors.txt new file mode 100644 index 0000000000000..8f3f19a9fc5be --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.errors.txt @@ -0,0 +1,23 @@ +tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts(7,31): error TS18014: The property '#x' cannot be accessed on type 'Base' within this class because it is shadowed by another private identifier with the same spelling. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts (1 errors) ==== + class Base { + #x() { }; + constructor() { + class Derived { + #x() { }; + testBase(x: Base) { + console.log(x.#x); + ~~ +!!! error TS18014: The property '#x' cannot be accessed on type 'Base' within this class because it is shadowed by another private identifier with the same spelling. +!!! related TS18017 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts:5:13: The shadowing declaration of '#x' is defined here +!!! related TS18018 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts:2:5: The declaration of '#x' that you probably intended to use is defined here + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js new file mode 100644 index 0000000000000..3ad246554754b --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js @@ -0,0 +1,44 @@ +//// [privateNameNestedClassMethodShadowing.ts] +class Base { + #x() { }; + constructor() { + class Derived { + #x() { }; + testBase(x: Base) { + console.log(x.#x); + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } +} + + +//// [privateNameNestedClassMethodShadowing.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _x; +class Base { + constructor() { + var _x_1; + class Derived { + () { } + ; + testBase(x) { + console.log(__classPrivateFieldGet(x, _x_1)); + } + testDerived(x) { + console.log(__classPrivateFieldGet(x, _x_1)); + } + } + _x_1 = new WeakMap(); + } + () { } + ; +} +_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.symbols b/tests/baselines/reference/privateNameNestedClassMethodShadowing.symbols new file mode 100644 index 0000000000000..4a8b23726f9e1 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.symbols @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameNestedClassMethodShadowing.ts, 0, 0)) + + #x() { }; +>#x : Symbol(Base.#x, Decl(privateNameNestedClassMethodShadowing.ts, 0, 12)) + + constructor() { + class Derived { +>Derived : Symbol(Derived, Decl(privateNameNestedClassMethodShadowing.ts, 2, 19)) + + #x() { }; +>#x : Symbol(Derived.#x, Decl(privateNameNestedClassMethodShadowing.ts, 3, 23)) + + testBase(x: Base) { +>testBase : Symbol(Derived.testBase, Decl(privateNameNestedClassMethodShadowing.ts, 4, 21)) +>x : Symbol(x, Decl(privateNameNestedClassMethodShadowing.ts, 5, 21)) +>Base : Symbol(Base, Decl(privateNameNestedClassMethodShadowing.ts, 0, 0)) + + console.log(x.#x); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameNestedClassMethodShadowing.ts, 5, 21)) + } + testDerived(x: Derived) { +>testDerived : Symbol(Derived.testDerived, Decl(privateNameNestedClassMethodShadowing.ts, 7, 13)) +>x : Symbol(x, Decl(privateNameNestedClassMethodShadowing.ts, 8, 24)) +>Derived : Symbol(Derived, Decl(privateNameNestedClassMethodShadowing.ts, 2, 19)) + + console.log(x.#x); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x.#x : Symbol(Derived.#x, Decl(privateNameNestedClassMethodShadowing.ts, 3, 23)) +>x : Symbol(x, Decl(privateNameNestedClassMethodShadowing.ts, 8, 24)) + } + } + } +} + diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.types b/tests/baselines/reference/privateNameNestedClassMethodShadowing.types new file mode 100644 index 0000000000000..66f4023d0de36 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.types @@ -0,0 +1,42 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts === +class Base { +>Base : Base + + #x() { }; +>#x : () => void + + constructor() { + class Derived { +>Derived : Derived + + #x() { }; +>#x : () => void + + testBase(x: Base) { +>testBase : (x: Base) => void +>x : Base + + console.log(x.#x); +>console.log(x.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#x : any +>x : Base + } + testDerived(x: Derived) { +>testDerived : (x: Derived) => void +>x : Derived + + console.log(x.#x); +>console.log(x.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#x : () => void +>x : Derived + } + } + } +} + diff --git a/tests/baselines/reference/privateNamesAndDecorators.errors.txt b/tests/baselines/reference/privateNamesAndDecorators.errors.txt index aea3772ca2e9d..a17770c1cb2a7 100644 --- a/tests/baselines/reference/privateNamesAndDecorators.errors.txt +++ b/tests/baselines/reference/privateNamesAndDecorators.errors.txt @@ -1,9 +1,8 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts(4,5): error TS1206: Decorators are not valid here. tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts(6,5): error TS1206: Decorators are not valid here. -tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts(7,5): error TS18022: A method cannot be named with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.ts (2 errors) ==== declare function dec(target: T): T; class A { @@ -15,7 +14,5 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndDecorators.t ~ !!! error TS1206: Decorators are not valid here. #bar(): void { } - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesAndDecorators.js b/tests/baselines/reference/privateNamesAndDecorators.js index 63183cf3df9ba..65011d85f169d 100644 --- a/tests/baselines/reference/privateNamesAndDecorators.js +++ b/tests/baselines/reference/privateNamesAndDecorators.js @@ -10,7 +10,7 @@ class A { //// [privateNamesAndDecorators.js] -var _foo; +var _foo, _bar; var A = /** @class */ (function () { function A() { _foo.set(this, 1); @@ -18,4 +18,4 @@ var A = /** @class */ (function () { A.prototype. = function () { }; return A; }()); -_foo = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt index c44ec084989b9..c06298c2693a3 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.errors.txt @@ -1,4 +1,3 @@ -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(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,12 +5,10 @@ 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 { - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. return this.#foo; } constructor(t: T) { diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index 0d62474bc636c..84710604b9dcc 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -42,12 +42,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo; +var _foo, _bar; class C { constructor(t) { _foo.set(this, void 0); __classPrivateFieldSet(this, _foo, t); - t = this..call(this); + t = __classPrivateFieldGet(this, _bar).call(this); } () { return __classPrivateFieldGet(this, _foo); @@ -59,7 +59,7 @@ class C { return __classPrivateFieldGet(this, _foo); } } -_foo = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakMap(); let a = new C(3); let b = new C("hello"); a.baz = 5; // OK diff --git a/tests/baselines/reference/privateNamesAndMethods.errors.txt b/tests/baselines/reference/privateNamesAndMethods.errors.txt deleted file mode 100644 index a213c9911be49..0000000000000 --- a/tests/baselines/reference/privateNamesAndMethods.errors.txt +++ /dev/null @@ -1,51 +0,0 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(2,5): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(3,11): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(4,12): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(8,9): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(11,9): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts(24,5): error TS18022: A method cannot be named with a private identifier. - - -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndMethods.ts (6 errors) ==== - class A { - #foo(a: number) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. - async #bar(a: number) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. - async *#baz(a: number) { - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. - return 3; - } - #_quux: number; - get #quux (): number { - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. - return this.#_quux; - } - set #quux (val: number) { - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. - this.#_quux = val; - } - constructor () { - this.#foo(30); - this.#bar(30); - this.#baz(30); - this.#quux = this.#quux + 1; - this.#quux++; - } - } - - class B extends A { - #foo(a: string) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. - constructor () { - super(); - this.#foo("str"); - } - } - \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt b/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt index 795afd395fe6e..2191f73a0d6be 100644 --- a/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt +++ b/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt @@ -1,36 +1,36 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(2,12): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(3,18): error TS18022: A method cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(4,19): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(2,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(4,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(7,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(8,16): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(11,16): error TS18023: An accessor cannot be named with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(24,12): error TS18022: A method cannot be named with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(8,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(11,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(24,5): error TS18019: 'static' modifier cannot be used with a private identifier. ==== tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts (7 errors) ==== class A { static #foo(a: number) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. static async #bar(a: number) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. static async *#baz(a: number) { - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. return 3; } static #_quux: number; ~~~~~~ !!! error TS18019: 'static' modifier cannot be used with a private identifier. static get #quux (): number { - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. return this.#_quux; } static set #quux (val: number) { - ~~~~~ -!!! error TS18023: An accessor cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. this.#_quux = val; } constructor () { @@ -44,8 +44,8 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethod class B extends A { static #foo(a: string) {} - ~~~~ -!!! error TS18022: A method cannot be named with a private identifier. + ~~~~~~ +!!! error TS18019: 'static' modifier cannot be used with a private identifier. constructor () { super(); B.#foo("str"); diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts new file mode 100644 index 0000000000000..0104fc9fc4236 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethod.ts @@ -0,0 +1,14 @@ +// @strict: true +// @target: es6 + +class A1 { + #method(param: string): string { + return ""; + } + constructor(name: string) { + this.#method("") + this.#method(1) // Error + this.#method() // Error + + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts new file mode 100644 index 0000000000000..c2f5104c3101f --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAccess.ts @@ -0,0 +1,24 @@ +// @target: es2015 + +class A2 { + #method() { return "" } + constructor() { + console.log(this.#method); + let a: A2 = this; + a.#method(); + function foo (){ + a.#method(); + } + } +} +new A2().#method(); // Error + +function foo (){ + new A2().#method(); // Error +} + +class B2 { + m() { + new A2().#method(); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts new file mode 100644 index 0000000000000..e0ae392458945 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +class A3 { + #method() { }; + constructor(a: A3, b: any) { + this.#method = () => {} // Error, not writable + a.#method = () => { }; // Error, not writable + b.#method = () => { } //Error, not writable + ({ x: this.#method } = { x: () => {}}); //Error, not writable + let x = this.#method; + b.#method++ //Error, not writable + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts new file mode 100644 index 0000000000000..d76deec97de3e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.ts @@ -0,0 +1,25 @@ +// @target: es2015 + +class AA { + #method() { this.x = 10; }; + #method2(a, ...b) {}; + x = 1; + test() { + this.#method(); + const func = this.#method; + func(); + new this.#method(); + + const arr = [ 1, 2 ]; + this.#method2(0, ...arr, 3); + + const b = new this.#method2(0, ...arr, 3); //Error + const str = this.#method2`head${1}middle${2}tail`; + this.getInstance().#method2`test${1}and${2}`; + + this.getInstance().#method2(0, ...arr, 3); + const b2 = new (this.getInstance().#method2)(0, ...arr, 3); //Error + const str2 = this.getInstance().#method2`head${1}middle${2}tail`; + } + getInstance() { return new AA(); } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts new file mode 100644 index 0000000000000..807826e5dceec --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodsDerivedClasses.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +class Base { + #prop(): number{ return 123; } + static method(x: Derived) { + console.log(x.#prop()); + } +} +class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop()); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts b/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts new file mode 100644 index 0000000000000..c05301955e438 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassMethodShadowing.ts @@ -0,0 +1,16 @@ +// @target: es2015 + +class Base { + #x() { }; + constructor() { + class Derived { + #x() { }; + testBase(x: Base) { + console.log(x.#x); + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } +} diff --git a/tests/cases/fourslash/codeFixSpellingPrivatePropertyNameNotInScope.ts b/tests/cases/fourslash/codeFixSpellingPrivatePropertyNameNotInScope.ts new file mode 100644 index 0000000000000..6e219fa4d9733 --- /dev/null +++ b/tests/cases/fourslash/codeFixSpellingPrivatePropertyNameNotInScope.ts @@ -0,0 +1,15 @@ +/// + +////class A { +//// #foo: number; +//// constructor() { +//// } +////} +////let a = new A(); +////[|a.foo = 1;|] + +verify.codeFixAvailable([ + { description: "Declare property 'foo'" }, + { description: "Add index signature for property 'foo'" }, + { description: "Remove unused declaration for: '#foo'" } +]); diff --git a/tests/cases/fourslash/completionListPrivateNamesMethods.ts b/tests/cases/fourslash/completionListPrivateNamesMethods.ts new file mode 100644 index 0000000000000..d8005a2e7de4d --- /dev/null +++ b/tests/cases/fourslash/completionListPrivateNamesMethods.ts @@ -0,0 +1,31 @@ +/// + +//// class Foo { +//// #x() {}; +//// y() {}; +//// } +//// class Bar extends Foo { +//// #z() {}; +//// t() {}; +//// constructor() { +//// this./*1*/ +//// class Baz { +//// #z() {}; +//// #u() {}; +//// v() {}; +//// constructor() { +//// this./*2*/ +//// new Bar()./*3*/ +//// } +//// } +//// } +//// } +//// +//// new Foo()./*4*/ + + + +verify.completions({ marker: "1", exact: ["#z", "t", "y"] }); +verify.completions({ marker: "2", exact: ["#z", "#u", "v"] }); +verify.completions({ marker: "3", exact: ["#z", "t", "y"] }); +verify.completions({ marker: "4", exact: ["y"] }); diff --git a/tests/cases/fourslash/findAllRefsPrivateNameMethods.ts b/tests/cases/fourslash/findAllRefsPrivateNameMethods.ts new file mode 100644 index 0000000000000..d90a7e3940f98 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsPrivateNameMethods.ts @@ -0,0 +1,24 @@ +/// + +////class C { +//// [|[|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 0 |}#foo|](){ }|] +//// constructor() { +//// this.[|#foo|](); +//// } +////} +////class D extends C { +//// constructor() { +//// super() +//// this.#foo = 20; +//// } +////} +////class E { +//// [|[|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 3 |}#foo|](){ }|] +//// constructor() { +//// this.[|#foo|](); +//// } +////} + +const [rC0Def, rC0, rC1, rE0Def, rE0, rE1] = test.ranges(); +verify.singleReferenceGroup("(method) C.#foo(): void", [rC0, rC1]); +verify.singleReferenceGroup("(method) E.#foo(): void", [rE0, rE1]); diff --git a/tests/cases/fourslash/goToDefinitionPrivateName.ts b/tests/cases/fourslash/goToDefinitionPrivateName.ts index 4524fca577c8d..c03b4fe179c2e 100644 --- a/tests/cases/fourslash/goToDefinitionPrivateName.ts +++ b/tests/cases/fourslash/goToDefinitionPrivateName.ts @@ -1,12 +1,15 @@ /// //// class A { -//// [|/*pnDecl*/#foo|] = 3; +//// [|/*pnMethodDecl*/#method|]() { } +//// [|/*pnFieldDecl*/#foo|] = 3; //// constructor() { -//// this.[|/*pnUse*/#foo|] +//// this.[|/*pnFieldUse*/#foo|] +//// this.[|/*pnMethodUse*/#method|] //// } //// } verify.goToDefinition({ - pnUse: "pnDecl", + pnFieldUse: "pnFieldDecl", + pnMethodUse: "pnMethodDecl" }); diff --git a/tests/cases/fourslash/navigationBarPrivateNameMethod.ts b/tests/cases/fourslash/navigationBarPrivateNameMethod.ts new file mode 100644 index 0000000000000..b97d8e282aa7d --- /dev/null +++ b/tests/cases/fourslash/navigationBarPrivateNameMethod.ts @@ -0,0 +1,109 @@ +/// + +//// class A { +//// #foo() { +//// class B { +//// #bar() { +//// function baz () { +//// } +//// } +//// } +//// } +//// } + +verify.navigationTree({ + "text": "", + "kind": "script", + "childItems": [ + { + "text": "A", + "kind": "class", + "childItems": [ + { + "text": "#foo", + "kind": "method", + "childItems": [ + { + "text": "B", + "kind": "class", + "childItems": [ + { + "text": "#bar", + "kind": "method", + "childItems": [ + { + "text": "baz", + "kind": "function" + } + ] + } + ] + } + ] + } + ] + }, + ] +}); + +verify.navigationBar([ + { + "text": "", + "kind": "script", + "childItems": [ + { + "text": "A", + "kind": "class" + } + ] + }, + { + "text": "A", + "kind": "class", + "childItems": [ + { + "text": "#foo", + "kind": "method" + } + ], + "indent": 1 + }, + { + "text": "#foo", + "kind": "method", + "childItems": [ + { + "text": "B", + "kind": "class" + } + ], + "indent": 2 + }, + { + "text": "B", + "kind": "class", + "childItems": [ + { + "text": "#bar", + "kind": "method" + } + ], + "indent": 3 + }, + { + "text": "#bar", + "kind": "method", + "childItems": [ + { + "text": "baz", + "kind": "function" + } + ], + "indent": 4 + }, + { + "text": "baz", + "kind": "function", + "indent": 5 + } +]); diff --git a/tests/cases/fourslash/renamePrivateMethod.ts b/tests/cases/fourslash/renamePrivateMethod.ts new file mode 100644 index 0000000000000..d0b7ba0aa9d51 --- /dev/null +++ b/tests/cases/fourslash/renamePrivateMethod.ts @@ -0,0 +1,13 @@ +/// + +////class Foo { +//// [|[|{| "contextRangeIndex": 0 |}#foo|]() { }|] +//// callFoo() { +//// return this.[|#foo|](); +//// } +////} + +const ranges = test.rangesByText().get("#foo"); +verify.renameLocations(ranges, { + ranges +}); From 6977b9fa819a23b7a079e1dbb137b30556798621 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Mon, 18 Jan 2021 17:41:23 +0200 Subject: [PATCH 03/68] Added check to only not allow private name method signatures in anything except classes. Changes objects literal checking to not bail on first private name found in object literal. --- src/compiler/checker.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 33cade5a7ddc2..0627820809b8b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32313,6 +32313,11 @@ namespace ts { if (hasSyntacticModifier(node, ModifierFlags.Abstract) && node.kind === SyntaxKind.MethodDeclaration && node.body) { error(node, Diagnostics.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract, declarationNameToString(node.name)); } + + // Private named methods are only allowed in class declarations + if (isPrivateIdentifier(node.name) && !isClassDeclaration(node.parent)) { + error(node, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); + } } function checkConstructorDeclaration(node: ConstructorDeclaration) { @@ -40100,7 +40105,7 @@ namespace ts { } if (name.kind === SyntaxKind.PrivateIdentifier) { - return grammarErrorOnNode(name, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); + grammarErrorOnNode(name, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); } // Modifiers are never allowed on properties except for 'async' on a method declaration From bc8c07e497254f70dd861adb06c6572c674b6eac Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Tue, 19 Jan 2021 13:17:09 +0200 Subject: [PATCH 04/68] Added private accessors tests --- .../reference/privateNameAccessors.errors.txt | 20 ++++ .../reference/privateNameAccessors.js | 44 ++++++++ .../reference/privateNameAccessors.symbols | 41 +++++++ .../reference/privateNameAccessors.types | 49 +++++++++ .../privateNameAccessorsAccess.errors.txt | 37 +++++++ .../reference/privateNameAccessorsAccess.js | 57 ++++++++++ .../privateNameAccessorsAccess.symbols | 58 ++++++++++ .../privateNameAccessorsAccess.types | 65 +++++++++++ .../privateNameAccessorsCallExpression.js | 49 +++++++++ ...privateNameAccessorsCallExpression.symbols | 63 +++++++++++ .../privateNameAccessorsCallExpression.types | 95 ++++++++++++++++ ...ateNameAccessorssDerivedClasses.errors.txt | 18 ++++ .../privateNameAccessorssDerivedClasses.js | 34 ++++++ ...rivateNameAccessorssDerivedClasses.symbols | 37 +++++++ .../privateNameAccessorssDerivedClasses.types | 39 +++++++ ...privateNameAndPropertySignature.errors.txt | 28 +++-- .../privateNameAndPropertySignature.js | 6 +- .../privateNameAndPropertySignature.symbols | 32 ++++-- .../privateNameAndPropertySignature.types | 16 ++- .../privateNameBadDeclaration.errors.txt | 32 +++++- .../reference/privateNameBadDeclaration.js | 16 ++- .../privateNameBadDeclaration.symbols | 26 +++-- .../reference/privateNameBadDeclaration.types | 26 +++-- .../privateNameDuplicateField.errors.txt | 64 ++++++++++- .../reference/privateNameDuplicateField.js | 63 ++++++++++- .../privateNameDuplicateField.symbols | 56 ++++++++++ .../reference/privateNameDuplicateField.types | 66 ++++++++++++ .../privateNameInObjectLiteral-3.errors.txt | 15 +++ .../reference/privateNameInObjectLiteral-3.js | 14 +++ .../privateNameInObjectLiteral-3.symbols | 11 ++ .../privateNameInObjectLiteral-3.types | 13 +++ .../privateNameJsBadDeclaration.errors.txt | 32 +++++- .../privateNameJsBadDeclaration.symbols | 30 ++++-- .../privateNameJsBadDeclaration.types | 26 +++-- ...meNestedClassAccessorsShadowing.errors.txt | 23 ++++ ...rivateNameNestedClassAccessorsShadowing.js | 44 ++++++++ ...eNameNestedClassAccessorsShadowing.symbols | 41 +++++++ ...ateNameNestedClassAccessorsShadowing.types | 44 ++++++++ .../reference/privateNameUnused.errors.txt | 28 ++++- .../reference/privateNameUnused.symbols | 45 ++++++++ .../reference/privateNameUnused.types | 50 +++++++++ .../reference/privateNamesAndkeyof.js | 51 ++++++--- .../reference/privateNamesAndkeyof.symbols | 22 ++-- .../reference/privateNamesAndkeyof.types | 17 ++- .../reference/privateNamesAssertion.js | 23 ++++ .../reference/privateNamesAssertion.symbols | 29 +++++ .../reference/privateNamesAssertion.types | 33 ++++++ .../privateNamesInGenericClasses.errors.txt | 28 ++++- .../reference/privateNamesInGenericClasses.js | 36 ++++++- .../privateNamesInGenericClasses.symbols | 102 +++++++++++++++--- .../privateNamesInGenericClasses.types | 63 +++++++++++ ...ivateNamesIncompatibleModifiers.errors.txt | 79 +++++++++++++- .../privateNamesIncompatibleModifiers.js | 68 +++++++++++- .../privateNamesIncompatibleModifiers.symbols | 70 +++++++++++- .../privateNamesIncompatibleModifiers.types | 78 ++++++++++++++ .../privateNamesUseBeforeDef.errors.txt | 14 ++- .../reference/privateNamesUseBeforeDef.js | 34 +++++- .../privateNamesUseBeforeDef.symbols | 38 +++++-- .../reference/privateNamesUseBeforeDef.types | 27 +++++ .../privateNames/privateNameAccessors.ts | 16 +++ .../privateNameAccessorsAccess.ts | 26 +++++ .../privateNameAccessorsCallExpression.ts | 20 ++++ .../privateNameAccessorssDerivedClasses.ts | 13 +++ .../privateNameAndPropertySignature.ts | 6 +- .../privateNames/privateNameBadDeclaration.ts | 8 +- .../privateNames/privateNameDuplicateField.ts | 29 +++++ .../privateNameInObjectLiteral-3.ts | 5 + .../privateNameJsBadDeclaration.ts | 8 +- ...rivateNameNestedClassAccessorsShadowing.ts | 16 +++ .../members/privateNames/privateNameUnused.ts | 19 ++++ .../privateNames/privateNamesAndkeyof.ts | 7 +- .../privateNames/privateNamesAssertion.ts | 12 +++ .../privateNamesInGenericClasses.ts | 14 +++ .../privateNamesIncompatibleModifiers.ts | 22 ++++ .../privateNames/privateNamesUseBeforeDef.ts | 10 ++ .../completionListPrivateNamesAccessors.ts | 37 +++++++ .../findAllRefsPrivateNameAccessors.ts | 27 +++++ .../fourslash/goToDefinitionPrivateName.ts | 6 +- .../cases/fourslash/renamePrivateAccessor.ts | 14 +++ 79 files changed, 2545 insertions(+), 135 deletions(-) create mode 100644 tests/baselines/reference/privateNameAccessors.errors.txt create mode 100644 tests/baselines/reference/privateNameAccessors.js create mode 100644 tests/baselines/reference/privateNameAccessors.symbols create mode 100644 tests/baselines/reference/privateNameAccessors.types create mode 100644 tests/baselines/reference/privateNameAccessorsAccess.errors.txt create mode 100644 tests/baselines/reference/privateNameAccessorsAccess.js create mode 100644 tests/baselines/reference/privateNameAccessorsAccess.symbols create mode 100644 tests/baselines/reference/privateNameAccessorsAccess.types create mode 100644 tests/baselines/reference/privateNameAccessorsCallExpression.js create mode 100644 tests/baselines/reference/privateNameAccessorsCallExpression.symbols create mode 100644 tests/baselines/reference/privateNameAccessorsCallExpression.types create mode 100644 tests/baselines/reference/privateNameAccessorssDerivedClasses.errors.txt create mode 100644 tests/baselines/reference/privateNameAccessorssDerivedClasses.js create mode 100644 tests/baselines/reference/privateNameAccessorssDerivedClasses.symbols create mode 100644 tests/baselines/reference/privateNameAccessorssDerivedClasses.types create mode 100644 tests/baselines/reference/privateNameInObjectLiteral-3.errors.txt create mode 100644 tests/baselines/reference/privateNameInObjectLiteral-3.js create mode 100644 tests/baselines/reference/privateNameInObjectLiteral-3.symbols create mode 100644 tests/baselines/reference/privateNameInObjectLiteral-3.types create mode 100644 tests/baselines/reference/privateNameNestedClassAccessorsShadowing.errors.txt create mode 100644 tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js create mode 100644 tests/baselines/reference/privateNameNestedClassAccessorsShadowing.symbols create mode 100644 tests/baselines/reference/privateNameNestedClassAccessorsShadowing.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts create mode 100644 tests/cases/fourslash/completionListPrivateNamesAccessors.ts create mode 100644 tests/cases/fourslash/findAllRefsPrivateNameAccessors.ts create mode 100644 tests/cases/fourslash/renamePrivateAccessor.ts diff --git a/tests/baselines/reference/privateNameAccessors.errors.txt b/tests/baselines/reference/privateNameAccessors.errors.txt new file mode 100644 index 0000000000000..de5ae2636a6a0 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessors.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts(9,14): error TS2540: Cannot assign to '#roProp' because it is a read-only property. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts (1 errors) ==== + class A1 { + get #prop() { return ""; } + set #prop(param: string) { } + + get #roProp() { return ""; } + + constructor(name: string) { + this.#prop = ""; + this.#roProp = ""; // Error + ~~~~~~~ +!!! error TS2540: Cannot assign to '#roProp' because it is a read-only property. + console.log(this.#prop); + console.log(this.#roProp); + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js new file mode 100644 index 0000000000000..19376cb013e37 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessors.js @@ -0,0 +1,44 @@ +//// [privateNameAccessors.ts] +class A1 { + get #prop() { return ""; } + set #prop(param: string) { } + + get #roProp() { return ""; } + + constructor(name: string) { + this.#prop = ""; + this.#roProp = ""; // Error + console.log(this.#prop); + console.log(this.#roProp); + } +} + + +//// [privateNameAccessors.js] +"use strict"; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _prop, _prop_1, _roProp; +class A1 { + constructor(name) { + __classPrivateFieldSet(this, _prop_1, ""); + __classPrivateFieldSet(this, _roProp, ""); // Error + console.log(__classPrivateFieldGet(this, _prop_1)); + console.log(__classPrivateFieldGet(this, _roProp)); + } + get () { return ""; } + set (param) { } + get () { return ""; } +} +_prop = new WeakMap(), _prop_1 = new WeakMap(), _roProp = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAccessors.symbols b/tests/baselines/reference/privateNameAccessors.symbols new file mode 100644 index 0000000000000..3386042d76a63 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessors.symbols @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts === +class A1 { +>A1 : Symbol(A1, Decl(privateNameAccessors.ts, 0, 0)) + + get #prop() { return ""; } +>#prop : Symbol(A1.#prop, Decl(privateNameAccessors.ts, 0, 10), Decl(privateNameAccessors.ts, 1, 30)) + + set #prop(param: string) { } +>#prop : Symbol(A1.#prop, Decl(privateNameAccessors.ts, 0, 10), Decl(privateNameAccessors.ts, 1, 30)) +>param : Symbol(param, Decl(privateNameAccessors.ts, 2, 14)) + + get #roProp() { return ""; } +>#roProp : Symbol(A1.#roProp, Decl(privateNameAccessors.ts, 2, 32)) + + constructor(name: string) { +>name : Symbol(name, Decl(privateNameAccessors.ts, 6, 16)) + + this.#prop = ""; +>this.#prop : Symbol(A1.#prop, Decl(privateNameAccessors.ts, 0, 10), Decl(privateNameAccessors.ts, 1, 30)) +>this : Symbol(A1, Decl(privateNameAccessors.ts, 0, 0)) + + this.#roProp = ""; // Error +>this.#roProp : Symbol(A1.#roProp, Decl(privateNameAccessors.ts, 2, 32)) +>this : Symbol(A1, Decl(privateNameAccessors.ts, 0, 0)) + + console.log(this.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#prop : Symbol(A1.#prop, Decl(privateNameAccessors.ts, 0, 10), Decl(privateNameAccessors.ts, 1, 30)) +>this : Symbol(A1, Decl(privateNameAccessors.ts, 0, 0)) + + console.log(this.#roProp); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#roProp : Symbol(A1.#roProp, Decl(privateNameAccessors.ts, 2, 32)) +>this : Symbol(A1, Decl(privateNameAccessors.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameAccessors.types b/tests/baselines/reference/privateNameAccessors.types new file mode 100644 index 0000000000000..8449fba9f7039 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessors.types @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts === +class A1 { +>A1 : A1 + + get #prop() { return ""; } +>#prop : string +>"" : "" + + set #prop(param: string) { } +>#prop : string +>param : string + + get #roProp() { return ""; } +>#roProp : string +>"" : "" + + constructor(name: string) { +>name : string + + this.#prop = ""; +>this.#prop = "" : "" +>this.#prop : string +>this : this +>"" : "" + + this.#roProp = ""; // Error +>this.#roProp = "" : "" +>this.#roProp : any +>this : this +>"" : "" + + console.log(this.#prop); +>console.log(this.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#prop : string +>this : this + + console.log(this.#roProp); +>console.log(this.#roProp) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#roProp : string +>this : this + } +} + diff --git a/tests/baselines/reference/privateNameAccessorsAccess.errors.txt b/tests/baselines/reference/privateNameAccessorsAccess.errors.txt new file mode 100644 index 0000000000000..f7c36306fde04 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsAccess.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts(14,10): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts(17,14): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts(22,18): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts (3 errors) ==== + class A2 { + get #prop() { return ""; } + set #prop(param: string) { } + + constructor() { + console.log(this.#prop); + let a: A2 = this; + a.#prop; + function foo (){ + a.#prop; + } + } + } + new A2().#prop; // Error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + + function foo (){ + new A2().#prop; // Error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + } + + class B2 { + m() { + new A2().#prop; + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js new file mode 100644 index 0000000000000..1e650648b504b --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -0,0 +1,57 @@ +//// [privateNameAccessorsAccess.ts] +class A2 { + get #prop() { return ""; } + set #prop(param: string) { } + + constructor() { + console.log(this.#prop); + let a: A2 = this; + a.#prop; + function foo (){ + a.#prop; + } + } +} +new A2().#prop; // Error + +function foo (){ + new A2().#prop; // Error +} + +class B2 { + m() { + new A2().#prop; + } +} + + +//// [privateNameAccessorsAccess.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _prop, _prop_1; +class A2 { + constructor() { + console.log(__classPrivateFieldGet(this, _prop_1)); + let a = this; + __classPrivateFieldGet(a, _prop_1); + function foo() { + __classPrivateFieldGet(a, _prop_1); + } + } + get () { return ""; } + set (param) { } +} +_prop = new WeakMap(), _prop_1 = new WeakMap(); +new A2().; // Error +function foo() { + new A2().; // Error +} +class B2 { + m() { + new A2().; + } +} diff --git a/tests/baselines/reference/privateNameAccessorsAccess.symbols b/tests/baselines/reference/privateNameAccessorsAccess.symbols new file mode 100644 index 0000000000000..9697bb2d45859 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsAccess.symbols @@ -0,0 +1,58 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts === +class A2 { +>A2 : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) + + get #prop() { return ""; } +>#prop : Symbol(A2.#prop, Decl(privateNameAccessorsAccess.ts, 0, 10), Decl(privateNameAccessorsAccess.ts, 1, 30)) + + set #prop(param: string) { } +>#prop : Symbol(A2.#prop, Decl(privateNameAccessorsAccess.ts, 0, 10), Decl(privateNameAccessorsAccess.ts, 1, 30)) +>param : Symbol(param, Decl(privateNameAccessorsAccess.ts, 2, 14)) + + constructor() { + console.log(this.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#prop : Symbol(A2.#prop, Decl(privateNameAccessorsAccess.ts, 0, 10), Decl(privateNameAccessorsAccess.ts, 1, 30)) +>this : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) + + let a: A2 = this; +>a : Symbol(a, Decl(privateNameAccessorsAccess.ts, 6, 11)) +>A2 : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) +>this : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) + + a.#prop; +>a.#prop : Symbol(A2.#prop, Decl(privateNameAccessorsAccess.ts, 0, 10), Decl(privateNameAccessorsAccess.ts, 1, 30)) +>a : Symbol(a, Decl(privateNameAccessorsAccess.ts, 6, 11)) + + function foo (){ +>foo : Symbol(foo, Decl(privateNameAccessorsAccess.ts, 7, 16)) + + a.#prop; +>a.#prop : Symbol(A2.#prop, Decl(privateNameAccessorsAccess.ts, 0, 10), Decl(privateNameAccessorsAccess.ts, 1, 30)) +>a : Symbol(a, Decl(privateNameAccessorsAccess.ts, 6, 11)) + } + } +} +new A2().#prop; // Error +>A2 : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) + +function foo (){ +>foo : Symbol(foo, Decl(privateNameAccessorsAccess.ts, 13, 15)) + + new A2().#prop; // Error +>A2 : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) +} + +class B2 { +>B2 : Symbol(B2, Decl(privateNameAccessorsAccess.ts, 17, 1)) + + m() { +>m : Symbol(B2.m, Decl(privateNameAccessorsAccess.ts, 19, 10)) + + new A2().#prop; +>A2 : Symbol(A2, Decl(privateNameAccessorsAccess.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameAccessorsAccess.types b/tests/baselines/reference/privateNameAccessorsAccess.types new file mode 100644 index 0000000000000..9381e31558f34 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsAccess.types @@ -0,0 +1,65 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts === +class A2 { +>A2 : A2 + + get #prop() { return ""; } +>#prop : string +>"" : "" + + set #prop(param: string) { } +>#prop : string +>param : string + + constructor() { + console.log(this.#prop); +>console.log(this.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#prop : string +>this : this + + let a: A2 = this; +>a : A2 +>this : this + + a.#prop; +>a.#prop : string +>a : A2 + + function foo (){ +>foo : () => void + + a.#prop; +>a.#prop : string +>a : A2 + } + } +} +new A2().#prop; // Error +>new A2().#prop : any +>new A2() : A2 +>A2 : typeof A2 + +function foo (){ +>foo : () => void + + new A2().#prop; // Error +>new A2().#prop : any +>new A2() : A2 +>A2 : typeof A2 +} + +class B2 { +>B2 : B2 + + m() { +>m : () => void + + new A2().#prop; +>new A2().#prop : any +>new A2() : A2 +>A2 : typeof A2 + } +} + diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js new file mode 100644 index 0000000000000..cc113bc5d513c --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -0,0 +1,49 @@ +//// [privateNameAccessorsCallExpression.ts] +class A { + get #fieldFunc() { return function() { this.x = 10; } } + get #fieldFunc2() { return function(a, ...b) {}; } + x = 1; + test() { + this.#fieldFunc(); + const func = this.#fieldFunc; + func(); + new this.#fieldFunc(); + + const arr = [ 1, 2 ]; + this.#fieldFunc2(0, ...arr, 3); + const b = new this.#fieldFunc2(0, ...arr, 3); + const str = this.#fieldFunc2`head${1}middle${2}tail`; + this.getInstance().#fieldFunc2`test${1}and${2}`; + } + getInstance() { return new A(); } +} + +//// [privateNameAccessorsCallExpression.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _fieldFunc, _fieldFunc2; +class A { + constructor() { + this.x = 1; + } + get () { return function () { this.x = 10; }; } + get () { return function (a, ...b) { }; } + test() { + var _a; + __classPrivateFieldGet(this, _fieldFunc).call(this); + const func = __classPrivateFieldGet(this, _fieldFunc); + func(); + new (__classPrivateFieldGet(this, _fieldFunc))(); + const arr = [1, 2]; + __classPrivateFieldGet(this, _fieldFunc2).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _fieldFunc2))(0, ...arr, 3); + const str = __classPrivateFieldGet(this, _fieldFunc2).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_a = this.getInstance()), _fieldFunc2).bind(_a) `test${1}and${2}`; + } + getInstance() { return new A(); } +} +_fieldFunc = new WeakMap(), _fieldFunc2 = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.symbols b/tests/baselines/reference/privateNameAccessorsCallExpression.symbols new file mode 100644 index 0000000000000..93d15d2c33e56 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.symbols @@ -0,0 +1,63 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts === +class A { +>A : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) + + get #fieldFunc() { return function() { this.x = 10; } } +>#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameAccessorsCallExpression.ts, 0, 9)) + + get #fieldFunc2() { return function(a, ...b) {}; } +>#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameAccessorsCallExpression.ts, 1, 60)) +>a : Symbol(a, Decl(privateNameAccessorsCallExpression.ts, 2, 41)) +>b : Symbol(b, Decl(privateNameAccessorsCallExpression.ts, 2, 43)) + + x = 1; +>x : Symbol(A.x, Decl(privateNameAccessorsCallExpression.ts, 2, 55)) + + test() { +>test : Symbol(A.test, Decl(privateNameAccessorsCallExpression.ts, 3, 10)) + + this.#fieldFunc(); +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) + + const func = this.#fieldFunc; +>func : Symbol(func, Decl(privateNameAccessorsCallExpression.ts, 6, 13)) +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) + + func(); +>func : Symbol(func, Decl(privateNameAccessorsCallExpression.ts, 6, 13)) + + new this.#fieldFunc(); +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) + + const arr = [ 1, 2 ]; +>arr : Symbol(arr, Decl(privateNameAccessorsCallExpression.ts, 10, 13)) + + this.#fieldFunc2(0, ...arr, 3); +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameAccessorsCallExpression.ts, 1, 60)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameAccessorsCallExpression.ts, 10, 13)) + + const b = new this.#fieldFunc2(0, ...arr, 3); +>b : Symbol(b, Decl(privateNameAccessorsCallExpression.ts, 12, 13)) +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameAccessorsCallExpression.ts, 1, 60)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameAccessorsCallExpression.ts, 10, 13)) + + const str = this.#fieldFunc2`head${1}middle${2}tail`; +>str : Symbol(str, Decl(privateNameAccessorsCallExpression.ts, 13, 13)) +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameAccessorsCallExpression.ts, 1, 60)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) + + this.getInstance().#fieldFunc2`test${1}and${2}`; +>this.getInstance().#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameAccessorsCallExpression.ts, 1, 60)) +>this.getInstance : Symbol(A.getInstance, Decl(privateNameAccessorsCallExpression.ts, 15, 5)) +>this : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) +>getInstance : Symbol(A.getInstance, Decl(privateNameAccessorsCallExpression.ts, 15, 5)) + } + getInstance() { return new A(); } +>getInstance : Symbol(A.getInstance, Decl(privateNameAccessorsCallExpression.ts, 15, 5)) +>A : Symbol(A, Decl(privateNameAccessorsCallExpression.ts, 0, 0)) +} diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.types b/tests/baselines/reference/privateNameAccessorsCallExpression.types new file mode 100644 index 0000000000000..69810b957993c --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.types @@ -0,0 +1,95 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts === +class A { +>A : A + + get #fieldFunc() { return function() { this.x = 10; } } +>#fieldFunc : () => void +>function() { this.x = 10; } : () => void +>this.x = 10 : 10 +>this.x : any +>this : any +>x : any +>10 : 10 + + get #fieldFunc2() { return function(a, ...b) {}; } +>#fieldFunc2 : (a: any, ...b: any[]) => void +>function(a, ...b) {} : (a: any, ...b: any[]) => void +>a : any +>b : any[] + + x = 1; +>x : number +>1 : 1 + + test() { +>test : () => void + + this.#fieldFunc(); +>this.#fieldFunc() : void +>this.#fieldFunc : () => void +>this : this + + const func = this.#fieldFunc; +>func : () => void +>this.#fieldFunc : () => void +>this : this + + func(); +>func() : void +>func : () => void + + new this.#fieldFunc(); +>new this.#fieldFunc() : any +>this.#fieldFunc : () => void +>this : this + + const arr = [ 1, 2 ]; +>arr : number[] +>[ 1, 2 ] : number[] +>1 : 1 +>2 : 2 + + this.#fieldFunc2(0, ...arr, 3); +>this.#fieldFunc2(0, ...arr, 3) : void +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : this +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b = new this.#fieldFunc2(0, ...arr, 3); +>b : any +>new this.#fieldFunc2(0, ...arr, 3) : any +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : this +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str = this.#fieldFunc2`head${1}middle${2}tail`; +>str : void +>this.#fieldFunc2`head${1}middle${2}tail` : void +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : this +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + + this.getInstance().#fieldFunc2`test${1}and${2}`; +>this.getInstance().#fieldFunc2`test${1}and${2}` : void +>this.getInstance().#fieldFunc2 : (a: any, ...b: any[]) => void +>this.getInstance() : A +>this.getInstance : () => A +>this : this +>getInstance : () => A +>`test${1}and${2}` : "test1and2" +>1 : 1 +>2 : 2 + } + getInstance() { return new A(); } +>getInstance : () => A +>new A() : A +>A : typeof A +} diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.errors.txt b/tests/baselines/reference/privateNameAccessorssDerivedClasses.errors.txt new file mode 100644 index 0000000000000..754827bdcb354 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.errors.txt @@ -0,0 +1,18 @@ +tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts(9,23): error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts (1 errors) ==== + class Base { + get #prop(): number { return 123; } + static method(x: Derived) { + console.log(x.#prop); + } + } + class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop); + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js new file mode 100644 index 0000000000000..f88ea3e4d7b6d --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -0,0 +1,34 @@ +//// [privateNameAccessorssDerivedClasses.ts] +class Base { + get #prop(): number { return 123; } + static method(x: Derived) { + console.log(x.#prop); + } +} +class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop); + } +} + + +//// [privateNameAccessorssDerivedClasses.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _prop; +class Base { + get () { return 123; } + static method(x) { + console.log(__classPrivateFieldGet(x, _prop)); + } +} +_prop = new WeakMap(); +class Derived extends Base { + static method(x) { + console.log(x.); + } +} diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.symbols b/tests/baselines/reference/privateNameAccessorssDerivedClasses.symbols new file mode 100644 index 0000000000000..771e5bfba3dc6 --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.symbols @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameAccessorssDerivedClasses.ts, 0, 0)) + + get #prop(): number { return 123; } +>#prop : Symbol(Base.#prop, Decl(privateNameAccessorssDerivedClasses.ts, 0, 12)) + + static method(x: Derived) { +>method : Symbol(Base.method, Decl(privateNameAccessorssDerivedClasses.ts, 1, 40)) +>x : Symbol(x, Decl(privateNameAccessorssDerivedClasses.ts, 2, 18)) +>Derived : Symbol(Derived, Decl(privateNameAccessorssDerivedClasses.ts, 5, 1)) + + console.log(x.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x.#prop : Symbol(Base.#prop, Decl(privateNameAccessorssDerivedClasses.ts, 0, 12)) +>x : Symbol(x, Decl(privateNameAccessorssDerivedClasses.ts, 2, 18)) + } +} +class Derived extends Base { +>Derived : Symbol(Derived, Decl(privateNameAccessorssDerivedClasses.ts, 5, 1)) +>Base : Symbol(Base, Decl(privateNameAccessorssDerivedClasses.ts, 0, 0)) + + static method(x: Derived) { +>method : Symbol(Derived.method, Decl(privateNameAccessorssDerivedClasses.ts, 6, 28)) +>x : Symbol(x, Decl(privateNameAccessorssDerivedClasses.ts, 7, 18)) +>Derived : Symbol(Derived, Decl(privateNameAccessorssDerivedClasses.ts, 5, 1)) + + console.log(x.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameAccessorssDerivedClasses.ts, 7, 18)) + } +} + diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.types b/tests/baselines/reference/privateNameAccessorssDerivedClasses.types new file mode 100644 index 0000000000000..e25cfbd47532e --- /dev/null +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.types @@ -0,0 +1,39 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts === +class Base { +>Base : Base + + get #prop(): number { return 123; } +>#prop : number +>123 : 123 + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + console.log(x.#prop); +>console.log(x.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop : number +>x : Derived + } +} +class Derived extends Base { +>Derived : Derived +>Base : Base + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + console.log(x.#prop); +>console.log(x.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop : any +>x : Derived + } +} + diff --git a/tests/baselines/reference/privateNameAndPropertySignature.errors.txt b/tests/baselines/reference/privateNameAndPropertySignature.errors.txt index ef7a8276fdc2a..37653c75ae594 100644 --- a/tests/baselines/reference/privateNameAndPropertySignature.errors.txt +++ b/tests/baselines/reference/privateNameAndPropertySignature.errors.txt @@ -1,20 +1,30 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(2,5): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(6,5): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(10,5): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(12,9): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(16,28): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(3,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(7,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(8,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(12,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(14,9): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(15,9): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(17,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts(20,28): error TS18016: Private identifiers are not allowed outside class bodies. -==== tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts (5 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts (9 errors) ==== type A = { - #foo: string + #foo: string; ~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #bar(): string; + ~~~~~~~~~~~~~~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } interface B { #foo: string; ~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #bar(): string; + ~~~~~~~~~~~~~~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } @@ -25,8 +35,14 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySigna bar: { #baz: string; ~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #taz(): string; + ~~~~~~~~~~~~~~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } + #baz(): string; + ~~~~~~~~~~~~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. }; declare const y: [{ qux: { #quux: 3 } }]; diff --git a/tests/baselines/reference/privateNameAndPropertySignature.js b/tests/baselines/reference/privateNameAndPropertySignature.js index 602e1159171a5..ad9f8270863d6 100644 --- a/tests/baselines/reference/privateNameAndPropertySignature.js +++ b/tests/baselines/reference/privateNameAndPropertySignature.js @@ -1,17 +1,21 @@ //// [privateNameAndPropertySignature.ts] type A = { - #foo: string + #foo: string; + #bar(): string; } interface B { #foo: string; + #bar(): string; } declare const x: { #foo: number; bar: { #baz: string; + #taz(): string; } + #baz(): string; }; declare const y: [{ qux: { #quux: 3 } }]; diff --git a/tests/baselines/reference/privateNameAndPropertySignature.symbols b/tests/baselines/reference/privateNameAndPropertySignature.symbols index da68133a97edf..1e270e73a839b 100644 --- a/tests/baselines/reference/privateNameAndPropertySignature.symbols +++ b/tests/baselines/reference/privateNameAndPropertySignature.symbols @@ -2,33 +2,45 @@ type A = { >A : Symbol(A, Decl(privateNameAndPropertySignature.ts, 0, 0)) - #foo: string + #foo: string; >#foo : Symbol(#foo, Decl(privateNameAndPropertySignature.ts, 0, 10)) + + #bar(): string; +>#bar : Symbol(#bar, Decl(privateNameAndPropertySignature.ts, 1, 17)) } interface B { ->B : Symbol(B, Decl(privateNameAndPropertySignature.ts, 2, 1)) +>B : Symbol(B, Decl(privateNameAndPropertySignature.ts, 3, 1)) #foo: string; ->#foo : Symbol(B.#foo, Decl(privateNameAndPropertySignature.ts, 4, 13)) +>#foo : Symbol(B.#foo, Decl(privateNameAndPropertySignature.ts, 5, 13)) + + #bar(): string; +>#bar : Symbol(B.#bar, Decl(privateNameAndPropertySignature.ts, 6, 17)) } declare const x: { ->x : Symbol(x, Decl(privateNameAndPropertySignature.ts, 8, 13)) +>x : Symbol(x, Decl(privateNameAndPropertySignature.ts, 10, 13)) #foo: number; ->#foo : Symbol(#foo, Decl(privateNameAndPropertySignature.ts, 8, 18)) +>#foo : Symbol(#foo, Decl(privateNameAndPropertySignature.ts, 10, 18)) bar: { ->bar : Symbol(bar, Decl(privateNameAndPropertySignature.ts, 9, 17)) +>bar : Symbol(bar, Decl(privateNameAndPropertySignature.ts, 11, 17)) #baz: string; ->#baz : Symbol(#baz, Decl(privateNameAndPropertySignature.ts, 10, 10)) +>#baz : Symbol(#baz, Decl(privateNameAndPropertySignature.ts, 12, 10)) + + #taz(): string; +>#taz : Symbol(#taz, Decl(privateNameAndPropertySignature.ts, 13, 21)) } + #baz(): string; +>#baz : Symbol(#baz, Decl(privateNameAndPropertySignature.ts, 15, 5)) + }; declare const y: [{ qux: { #quux: 3 } }]; ->y : Symbol(y, Decl(privateNameAndPropertySignature.ts, 15, 13)) ->qux : Symbol(qux, Decl(privateNameAndPropertySignature.ts, 15, 19)) ->#quux : Symbol(#quux, Decl(privateNameAndPropertySignature.ts, 15, 26)) +>y : Symbol(y, Decl(privateNameAndPropertySignature.ts, 19, 13)) +>qux : Symbol(qux, Decl(privateNameAndPropertySignature.ts, 19, 19)) +>#quux : Symbol(#quux, Decl(privateNameAndPropertySignature.ts, 19, 26)) diff --git a/tests/baselines/reference/privateNameAndPropertySignature.types b/tests/baselines/reference/privateNameAndPropertySignature.types index efe0dfbffd673..3ff962d53e007 100644 --- a/tests/baselines/reference/privateNameAndPropertySignature.types +++ b/tests/baselines/reference/privateNameAndPropertySignature.types @@ -2,17 +2,23 @@ type A = { >A : A - #foo: string + #foo: string; >#foo : string + + #bar(): string; +>#bar : () => string } interface B { #foo: string; >#foo : string + + #bar(): string; +>#bar : () => string } declare const x: { ->x : { bar: { #baz: string;}; } +>x : { bar: { #baz: string; #taz(): string;}; } #foo: number; >#foo : number @@ -22,7 +28,13 @@ declare const x: { #baz: string; >#baz : string + + #taz(): string; +>#taz : () => string } + #baz(): string; +>#baz : () => string + }; declare const y: [{ qux: { #quux: 3 } }]; diff --git a/tests/baselines/reference/privateNameBadDeclaration.errors.txt b/tests/baselines/reference/privateNameBadDeclaration.errors.txt index 71cf3f2089a2a..b05d61c4bf7b9 100644 --- a/tests/baselines/reference/privateNameBadDeclaration.errors.txt +++ b/tests/baselines/reference/privateNameBadDeclaration.errors.txt @@ -1,19 +1,41 @@ tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(3,3): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(7,3): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(11,10): error TS2339: Property '#z' does not exist on type 'C'. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(4,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(5,7): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(5,7): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(9,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(10,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(11,7): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(11,7): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts(15,10): error TS2339: Property '#z' does not exist on type 'C'. -==== tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts (9 errors) ==== function A() { } A.prototype = { - #x: 1 // Error + #x: 1, // Error ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #m() {}, // Error + ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + get #p() { return "" } // Error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + ~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } class B { } B.prototype = { - #y: 2 // Error + #y: 2, // Error ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #m() {}, // Error + ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + get #p() { return "" } // Error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + ~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } class C { diff --git a/tests/baselines/reference/privateNameBadDeclaration.js b/tests/baselines/reference/privateNameBadDeclaration.js index 068720a03a8cf..cf110de187dbe 100644 --- a/tests/baselines/reference/privateNameBadDeclaration.js +++ b/tests/baselines/reference/privateNameBadDeclaration.js @@ -1,11 +1,15 @@ //// [privateNameBadDeclaration.ts] function A() { } A.prototype = { - #x: 1 // Error + #x: 1, // Error + #m() {}, // Error + get #p() { return "" } // Error } class B { } B.prototype = { - #y: 2 // Error + #y: 2, // Error + #m() {}, // Error + get #p() { return "" } // Error } class C { constructor() { @@ -16,7 +20,9 @@ class C { //// [privateNameBadDeclaration.js] function A() { } A.prototype = { - : 1 // Error + : 1, + : function () { }, + get () { return ""; } // Error }; var B = /** @class */ (function () { function B() { @@ -24,7 +30,9 @@ var B = /** @class */ (function () { return B; }()); B.prototype = { - : 2 // Error + : 2, + : function () { }, + get () { return ""; } // Error }; var C = /** @class */ (function () { function C() { diff --git a/tests/baselines/reference/privateNameBadDeclaration.symbols b/tests/baselines/reference/privateNameBadDeclaration.symbols index d689169f7115f..ed3ca5e455c10 100644 --- a/tests/baselines/reference/privateNameBadDeclaration.symbols +++ b/tests/baselines/reference/privateNameBadDeclaration.symbols @@ -7,25 +7,37 @@ A.prototype = { >A : Symbol(A, Decl(privateNameBadDeclaration.ts, 0, 0)) >prototype : Symbol(Function.prototype, Decl(lib.es5.d.ts, --, --)) - #x: 1 // Error + #x: 1, // Error >#x : Symbol(#x, Decl(privateNameBadDeclaration.ts, 1, 15)) + + #m() {}, // Error +>#m : Symbol(#m, Decl(privateNameBadDeclaration.ts, 2, 8)) + + get #p() { return "" } // Error +>#p : Symbol(#p, Decl(privateNameBadDeclaration.ts, 3, 10)) } class B { } ->B : Symbol(B, Decl(privateNameBadDeclaration.ts, 3, 1)) +>B : Symbol(B, Decl(privateNameBadDeclaration.ts, 5, 1)) B.prototype = { >B.prototype : Symbol(B.prototype) ->B : Symbol(B, Decl(privateNameBadDeclaration.ts, 3, 1)) +>B : Symbol(B, Decl(privateNameBadDeclaration.ts, 5, 1)) >prototype : Symbol(B.prototype) - #y: 2 // Error ->#y : Symbol(#y, Decl(privateNameBadDeclaration.ts, 5, 15)) + #y: 2, // Error +>#y : Symbol(#y, Decl(privateNameBadDeclaration.ts, 7, 15)) + + #m() {}, // Error +>#m : Symbol(#m, Decl(privateNameBadDeclaration.ts, 8, 8)) + + get #p() { return "" } // Error +>#p : Symbol(#p, Decl(privateNameBadDeclaration.ts, 9, 10)) } class C { ->C : Symbol(C, Decl(privateNameBadDeclaration.ts, 7, 1)) +>C : Symbol(C, Decl(privateNameBadDeclaration.ts, 11, 1)) constructor() { this.#z = 3; ->this : Symbol(C, Decl(privateNameBadDeclaration.ts, 7, 1)) +>this : Symbol(C, Decl(privateNameBadDeclaration.ts, 11, 1)) } } diff --git a/tests/baselines/reference/privateNameBadDeclaration.types b/tests/baselines/reference/privateNameBadDeclaration.types index a84048bde966c..8dc5b5f65cba4 100644 --- a/tests/baselines/reference/privateNameBadDeclaration.types +++ b/tests/baselines/reference/privateNameBadDeclaration.types @@ -3,29 +3,43 @@ function A() { } >A : () => void A.prototype = { ->A.prototype = { #x: 1 // Error} : {} +>A.prototype = { #x: 1, // Error #m() {}, // Error get #p() { return "" } // Error} : {} >A.prototype : any >A : () => void >prototype : any ->{ #x: 1 // Error} : {} +>{ #x: 1, // Error #m() {}, // Error get #p() { return "" } // Error} : {} - #x: 1 // Error + #x: 1, // Error >#x : number >1 : 1 + + #m() {}, // Error +>#m : () => void + + get #p() { return "" } // Error +>#p : string +>"" : "" } class B { } >B : B B.prototype = { ->B.prototype = { #y: 2 // Error} : {} +>B.prototype = { #y: 2, // Error #m() {}, // Error get #p() { return "" } // Error} : {} >B.prototype : B >B : typeof B >prototype : B ->{ #y: 2 // Error} : {} +>{ #y: 2, // Error #m() {}, // Error get #p() { return "" } // Error} : {} - #y: 2 // Error + #y: 2, // Error >#y : number >2 : 2 + + #m() {}, // Error +>#m : () => void + + get #p() { return "" } // Error +>#p : string +>"" : "" } class C { >C : C diff --git a/tests/baselines/reference/privateNameDuplicateField.errors.txt b/tests/baselines/reference/privateNameDuplicateField.errors.txt index b818eec73b47a..519a2b85f2657 100644 --- a/tests/baselines/reference/privateNameDuplicateField.errors.txt +++ b/tests/baselines/reference/privateNameDuplicateField.errors.txt @@ -1,11 +1,73 @@ tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(3,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(7,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(8,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(13,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(14,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(18,5): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(19,5): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(24,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(25,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(30,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(31,5): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(32,9): error TS2300: Duplicate identifier '#foo'. -==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (1 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (12 errors) ==== class A { #foo = "foo"; #foo = "foo"; ~~~~ !!! error TS2300: Duplicate identifier '#foo'. } + + class A2 { + #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + #foo() {} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + + class A3 { + #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + class A4 { + #foo() { return ""} + ~~~~ +!!! error TS2393: Duplicate function implementation. + #foo() { return ""} + ~~~~ +!!! error TS2393: Duplicate function implementation. + } + + + class A5 { + #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + + class A6 { + #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 30b96d7c48b74..bfc66c2cfc743 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -3,11 +3,40 @@ class A { #foo = "foo"; #foo = "foo"; } + +class A2 { + #foo = "foo"; + #foo() {} +} + + +class A3 { + #foo = "foo"; + get #foo() { return ""} +} + +class A4 { + #foo() { return ""} + #foo() { return ""} +} + + +class A5 { + #foo() { return ""} + get #foo() { return ""} +} + + +class A6 { + #foo = "foo"; + #foo() { return ""} + get #foo() { return ""} +} //// [privateNameDuplicateField.js] "use strict"; -var _foo, _foo_1; +var _foo, _foo_1, _foo_2, _foo_3, _foo_4, _foo_5, _foo_6, _foo_7, _foo_8, _foo_9, _foo_10, _foo_11, _foo_12; class A { constructor() { _foo_1.set(this, "foo"); @@ -15,3 +44,35 @@ class A { } } _foo = new WeakMap(), _foo_1 = new WeakMap(); +class A2 { + constructor() { + _foo_3.set(this, "foo"); + } + () { } +} +_foo_2 = new WeakMap(), _foo_3 = new WeakMap(); +class A3 { + constructor() { + _foo_5.set(this, "foo"); + } + get () { return ""; } +} +_foo_4 = new WeakMap(), _foo_5 = new WeakMap(); +class A4 { + () { return ""; } + () { return ""; } +} +_foo_6 = new WeakMap(), _foo_7 = new WeakMap(); +class A5 { + () { return ""; } + get () { return ""; } +} +_foo_8 = new WeakMap(), _foo_9 = new WeakMap(); +class A6 { + constructor() { + _foo_12.set(this, "foo"); + } + () { return ""; } + get () { return ""; } +} +_foo_10 = new WeakMap(), _foo_11 = new WeakMap(), _foo_12 = new WeakMap(); diff --git a/tests/baselines/reference/privateNameDuplicateField.symbols b/tests/baselines/reference/privateNameDuplicateField.symbols index af627ed139dfe..85c8eb0ecb05d 100644 --- a/tests/baselines/reference/privateNameDuplicateField.symbols +++ b/tests/baselines/reference/privateNameDuplicateField.symbols @@ -9,3 +9,59 @@ class A { >#foo : Symbol(A.#foo, Decl(privateNameDuplicateField.ts, 0, 9), Decl(privateNameDuplicateField.ts, 1, 17)) } +class A2 { +>A2 : Symbol(A2, Decl(privateNameDuplicateField.ts, 3, 1)) + + #foo = "foo"; +>#foo : Symbol(A2.#foo, Decl(privateNameDuplicateField.ts, 5, 10)) + + #foo() {} +>#foo : Symbol(A2.#foo, Decl(privateNameDuplicateField.ts, 6, 17)) +} + + +class A3 { +>A3 : Symbol(A3, Decl(privateNameDuplicateField.ts, 8, 1)) + + #foo = "foo"; +>#foo : Symbol(A3.#foo, Decl(privateNameDuplicateField.ts, 11, 10)) + + get #foo() { return ""} +>#foo : Symbol(A3.#foo, Decl(privateNameDuplicateField.ts, 12, 17)) +} + +class A4 { +>A4 : Symbol(A4, Decl(privateNameDuplicateField.ts, 14, 1)) + + #foo() { return ""} +>#foo : Symbol(A4.#foo, Decl(privateNameDuplicateField.ts, 16, 10), Decl(privateNameDuplicateField.ts, 17, 23)) + + #foo() { return ""} +>#foo : Symbol(A4.#foo, Decl(privateNameDuplicateField.ts, 16, 10), Decl(privateNameDuplicateField.ts, 17, 23)) +} + + +class A5 { +>A5 : Symbol(A5, Decl(privateNameDuplicateField.ts, 19, 1)) + + #foo() { return ""} +>#foo : Symbol(A5.#foo, Decl(privateNameDuplicateField.ts, 22, 10)) + + get #foo() { return ""} +>#foo : Symbol(A5.#foo, Decl(privateNameDuplicateField.ts, 23, 23)) +} + + +class A6 { +>A6 : Symbol(A6, Decl(privateNameDuplicateField.ts, 25, 1)) + + #foo = "foo"; +>#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 28, 10)) + + #foo() { return ""} +>#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 29, 17)) + + get #foo() { return ""} +>#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 30, 23)) +} + diff --git a/tests/baselines/reference/privateNameDuplicateField.types b/tests/baselines/reference/privateNameDuplicateField.types index 0f67eac2456aa..962b1282c5c5a 100644 --- a/tests/baselines/reference/privateNameDuplicateField.types +++ b/tests/baselines/reference/privateNameDuplicateField.types @@ -11,3 +11,69 @@ class A { >"foo" : "foo" } +class A2 { +>A2 : A2 + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + #foo() {} +>#foo : () => void +} + + +class A3 { +>A3 : A3 + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + get #foo() { return ""} +>#foo : string +>"" : "" +} + +class A4 { +>A4 : A4 + + #foo() { return ""} +>#foo : () => string +>"" : "" + + #foo() { return ""} +>#foo : () => string +>"" : "" +} + + +class A5 { +>A5 : A5 + + #foo() { return ""} +>#foo : () => string +>"" : "" + + get #foo() { return ""} +>#foo : string +>"" : "" +} + + +class A6 { +>A6 : A6 + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + #foo() { return ""} +>#foo : () => string +>"" : "" + + get #foo() { return ""} +>#foo : string +>"" : "" +} + diff --git a/tests/baselines/reference/privateNameInObjectLiteral-3.errors.txt b/tests/baselines/reference/privateNameInObjectLiteral-3.errors.txt new file mode 100644 index 0000000000000..b93a8c149e491 --- /dev/null +++ b/tests/baselines/reference/privateNameInObjectLiteral-3.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts(2,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts(2,9): error TS18016: Private identifiers are not allowed outside class bodies. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts (2 errors) ==== + const obj = { + get #foo() { + ~~~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + ~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + return "" + } + }; + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameInObjectLiteral-3.js b/tests/baselines/reference/privateNameInObjectLiteral-3.js new file mode 100644 index 0000000000000..e1394585ecca1 --- /dev/null +++ b/tests/baselines/reference/privateNameInObjectLiteral-3.js @@ -0,0 +1,14 @@ +//// [privateNameInObjectLiteral-3.ts] +const obj = { + get #foo() { + return "" + } +}; + + +//// [privateNameInObjectLiteral-3.js] +var obj = { + get () { + return ""; + } +}; diff --git a/tests/baselines/reference/privateNameInObjectLiteral-3.symbols b/tests/baselines/reference/privateNameInObjectLiteral-3.symbols new file mode 100644 index 0000000000000..190a94360eaf2 --- /dev/null +++ b/tests/baselines/reference/privateNameInObjectLiteral-3.symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts === +const obj = { +>obj : Symbol(obj, Decl(privateNameInObjectLiteral-3.ts, 0, 5)) + + get #foo() { +>#foo : Symbol(#foo, Decl(privateNameInObjectLiteral-3.ts, 0, 13)) + + return "" + } +}; + diff --git a/tests/baselines/reference/privateNameInObjectLiteral-3.types b/tests/baselines/reference/privateNameInObjectLiteral-3.types new file mode 100644 index 0000000000000..20ec74dc18a36 --- /dev/null +++ b/tests/baselines/reference/privateNameInObjectLiteral-3.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts === +const obj = { +>obj : {} +>{ get #foo() { return "" }} : {} + + get #foo() { +>#foo : string + + return "" +>"" : "" + } +}; + diff --git a/tests/baselines/reference/privateNameJsBadDeclaration.errors.txt b/tests/baselines/reference/privateNameJsBadDeclaration.errors.txt index 206e257745708..858d9e96713fc 100644 --- a/tests/baselines/reference/privateNameJsBadDeclaration.errors.txt +++ b/tests/baselines/reference/privateNameJsBadDeclaration.errors.txt @@ -1,19 +1,41 @@ tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(3,3): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(7,3): error TS18016: Private identifiers are not allowed outside class bodies. -tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(11,10): error TS2339: Property '#z' does not exist on type 'C'. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(4,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(5,7): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(5,7): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(9,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(10,3): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(11,7): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(11,7): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js(15,10): error TS2339: Property '#z' does not exist on type 'C'. -==== tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameJsPrototype.js (9 errors) ==== function A() { } A.prototype = { - #x: 1 // Error + #x: 1, // Error ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #m() {}, // Error + ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + get #p() { return "" } // Error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + ~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } class B { } B.prototype = { - #y: 2 // Error + #y: 2, // Error ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + #m() {}, // Error + ~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + get #p() { return "" } // Error + ~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + ~~ !!! error TS18016: Private identifiers are not allowed outside class bodies. } class C { diff --git a/tests/baselines/reference/privateNameJsBadDeclaration.symbols b/tests/baselines/reference/privateNameJsBadDeclaration.symbols index 33a45250dcec5..53c99fe4238ee 100644 --- a/tests/baselines/reference/privateNameJsBadDeclaration.symbols +++ b/tests/baselines/reference/privateNameJsBadDeclaration.symbols @@ -7,25 +7,37 @@ A.prototype = { >A : Symbol(A, Decl(privateNameJsPrototype.js, 0, 0), Decl(privateNameJsPrototype.js, 0, 16)) >prototype : Symbol(A.prototype, Decl(privateNameJsPrototype.js, 0, 16)) - #x: 1 // Error + #x: 1, // Error >#x : Symbol(#x, Decl(privateNameJsPrototype.js, 1, 15)) + + #m() {}, // Error +>#m : Symbol(#m, Decl(privateNameJsPrototype.js, 2, 8)) + + get #p() { return "" } // Error +>#p : Symbol(#p, Decl(privateNameJsPrototype.js, 3, 10)) } class B { } ->B : Symbol(B, Decl(privateNameJsPrototype.js, 3, 1), Decl(privateNameJsPrototype.js, 4, 11)) +>B : Symbol(B, Decl(privateNameJsPrototype.js, 5, 1), Decl(privateNameJsPrototype.js, 6, 11)) B.prototype = { ->B.prototype : Symbol(B.prototype, Decl(privateNameJsPrototype.js, 4, 11)) ->B : Symbol(B, Decl(privateNameJsPrototype.js, 3, 1), Decl(privateNameJsPrototype.js, 4, 11)) ->prototype : Symbol(B.prototype, Decl(privateNameJsPrototype.js, 4, 11)) +>B.prototype : Symbol(B.prototype, Decl(privateNameJsPrototype.js, 6, 11)) +>B : Symbol(B, Decl(privateNameJsPrototype.js, 5, 1), Decl(privateNameJsPrototype.js, 6, 11)) +>prototype : Symbol(B.prototype, Decl(privateNameJsPrototype.js, 6, 11)) + + #y: 2, // Error +>#y : Symbol(#y, Decl(privateNameJsPrototype.js, 7, 15)) + + #m() {}, // Error +>#m : Symbol(#m, Decl(privateNameJsPrototype.js, 8, 8)) - #y: 2 // Error ->#y : Symbol(#y, Decl(privateNameJsPrototype.js, 5, 15)) + get #p() { return "" } // Error +>#p : Symbol(#p, Decl(privateNameJsPrototype.js, 9, 10)) } class C { ->C : Symbol(C, Decl(privateNameJsPrototype.js, 7, 1)) +>C : Symbol(C, Decl(privateNameJsPrototype.js, 11, 1)) constructor() { this.#z = 3; ->this : Symbol(C, Decl(privateNameJsPrototype.js, 7, 1)) +>this : Symbol(C, Decl(privateNameJsPrototype.js, 11, 1)) } } diff --git a/tests/baselines/reference/privateNameJsBadDeclaration.types b/tests/baselines/reference/privateNameJsBadDeclaration.types index 0ccbbeef0a9ba..9799d7e6ad3f0 100644 --- a/tests/baselines/reference/privateNameJsBadDeclaration.types +++ b/tests/baselines/reference/privateNameJsBadDeclaration.types @@ -3,29 +3,43 @@ function A() { } >A : typeof A A.prototype = { ->A.prototype = { #x: 1 // Error} : {} +>A.prototype = { #x: 1, // Error #m() {}, // Error get #p() { return "" } // Error} : {} >A.prototype : {} >A : typeof A >prototype : {} ->{ #x: 1 // Error} : {} +>{ #x: 1, // Error #m() {}, // Error get #p() { return "" } // Error} : {} - #x: 1 // Error + #x: 1, // Error >#x : number >1 : 1 + + #m() {}, // Error +>#m : () => void + + get #p() { return "" } // Error +>#p : string +>"" : "" } class B { } >B : B B.prototype = { ->B.prototype = { #y: 2 // Error} : {} +>B.prototype = { #y: 2, // Error #m() {}, // Error get #p() { return "" } // Error} : {} >B.prototype : B >B : typeof B >prototype : B ->{ #y: 2 // Error} : {} +>{ #y: 2, // Error #m() {}, // Error get #p() { return "" } // Error} : {} - #y: 2 // Error + #y: 2, // Error >#y : number >2 : 2 + + #m() {}, // Error +>#m : () => void + + get #p() { return "" } // Error +>#p : string +>"" : "" } class C { >C : C diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.errors.txt b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.errors.txt new file mode 100644 index 0000000000000..7fb1cf6151750 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.errors.txt @@ -0,0 +1,23 @@ +tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts(7,31): error TS18014: The property '#x' cannot be accessed on type 'Base' within this class because it is shadowed by another private identifier with the same spelling. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts (1 errors) ==== + class Base { + get #x() { return 1; }; + constructor() { + class Derived { + get #x() { return 1; }; + testBase(x: Base) { + console.log(x.#x); + ~~ +!!! error TS18014: The property '#x' cannot be accessed on type 'Base' within this class because it is shadowed by another private identifier with the same spelling. +!!! related TS18017 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts:5:17: The shadowing declaration of '#x' is defined here +!!! related TS18018 tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts:2:9: The declaration of '#x' that you probably intended to use is defined here + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js new file mode 100644 index 0000000000000..d7a1c97b33b26 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -0,0 +1,44 @@ +//// [privateNameNestedClassAccessorsShadowing.ts] +class Base { + get #x() { return 1; }; + constructor() { + class Derived { + get #x() { return 1; }; + testBase(x: Base) { + console.log(x.#x); + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } +} + + +//// [privateNameNestedClassAccessorsShadowing.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _x; +class Base { + constructor() { + var _x_1; + class Derived { + get () { return 1; } + ; + testBase(x) { + console.log(__classPrivateFieldGet(x, _x_1)); + } + testDerived(x) { + console.log(__classPrivateFieldGet(x, _x_1)); + } + } + _x_1 = new WeakMap(); + } + get () { return 1; } + ; +} +_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.symbols b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.symbols new file mode 100644 index 0000000000000..383c956598441 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.symbols @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameNestedClassAccessorsShadowing.ts, 0, 0)) + + get #x() { return 1; }; +>#x : Symbol(Base.#x, Decl(privateNameNestedClassAccessorsShadowing.ts, 0, 12)) + + constructor() { + class Derived { +>Derived : Symbol(Derived, Decl(privateNameNestedClassAccessorsShadowing.ts, 2, 19)) + + get #x() { return 1; }; +>#x : Symbol(Derived.#x, Decl(privateNameNestedClassAccessorsShadowing.ts, 3, 23)) + + testBase(x: Base) { +>testBase : Symbol(Derived.testBase, Decl(privateNameNestedClassAccessorsShadowing.ts, 4, 35)) +>x : Symbol(x, Decl(privateNameNestedClassAccessorsShadowing.ts, 5, 21)) +>Base : Symbol(Base, Decl(privateNameNestedClassAccessorsShadowing.ts, 0, 0)) + + console.log(x.#x); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameNestedClassAccessorsShadowing.ts, 5, 21)) + } + testDerived(x: Derived) { +>testDerived : Symbol(Derived.testDerived, Decl(privateNameNestedClassAccessorsShadowing.ts, 7, 13)) +>x : Symbol(x, Decl(privateNameNestedClassAccessorsShadowing.ts, 8, 24)) +>Derived : Symbol(Derived, Decl(privateNameNestedClassAccessorsShadowing.ts, 2, 19)) + + console.log(x.#x); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x.#x : Symbol(Derived.#x, Decl(privateNameNestedClassAccessorsShadowing.ts, 3, 23)) +>x : Symbol(x, Decl(privateNameNestedClassAccessorsShadowing.ts, 8, 24)) + } + } + } +} + diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.types b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.types new file mode 100644 index 0000000000000..fb2ad9d941439 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.types @@ -0,0 +1,44 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts === +class Base { +>Base : Base + + get #x() { return 1; }; +>#x : number +>1 : 1 + + constructor() { + class Derived { +>Derived : Derived + + get #x() { return 1; }; +>#x : number +>1 : 1 + + testBase(x: Base) { +>testBase : (x: Base) => void +>x : Base + + console.log(x.#x); +>console.log(x.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#x : any +>x : Base + } + testDerived(x: Derived) { +>testDerived : (x: Derived) => void +>x : Derived + + console.log(x.#x); +>console.log(x.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#x : number +>x : Derived + } + } + } +} + diff --git a/tests/baselines/reference/privateNameUnused.errors.txt b/tests/baselines/reference/privateNameUnused.errors.txt index cb4bd1853f0d9..02ecbc9e60047 100644 --- a/tests/baselines/reference/privateNameUnused.errors.txt +++ b/tests/baselines/reference/privateNameUnused.errors.txt @@ -1,7 +1,9 @@ tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts(3,5): error TS6133: '#unused' is declared but its value is never read. +tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts(11,5): error TS6133: '#unused' is declared but its value is never read. +tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts(21,9): error TS6133: '#unused' is declared but its value is never read. -==== tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts (1 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts (3 errors) ==== export class A { #used = "used"; #unused = "unused"; @@ -11,4 +13,26 @@ tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts(3,5): console.log(this.#used); } } - \ No newline at end of file + + export class A2 { + #used() { }; + #unused() { }; + ~~~~~~~ +!!! error TS6133: '#unused' is declared but its value is never read. + constructor () { + console.log(this.#used()); + } + } + + export class A3 { + get #used() { return 0 }; + set #used(value: number) { }; + + get #unused() { return 0 }; + ~~~~~~~ +!!! error TS6133: '#unused' is declared but its value is never read. + set #unused(value: number) { }; + constructor () { + console.log(this.#used); + } + } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameUnused.symbols b/tests/baselines/reference/privateNameUnused.symbols index 4b85303d6f2ed..d8b834bd92f69 100644 --- a/tests/baselines/reference/privateNameUnused.symbols +++ b/tests/baselines/reference/privateNameUnused.symbols @@ -18,3 +18,48 @@ export class A { } } +export class A2 { +>A2 : Symbol(A2, Decl(privateNameUnused.ts, 6, 1)) + + #used() { }; +>#used : Symbol(A2.#used, Decl(privateNameUnused.ts, 8, 17)) + + #unused() { }; +>#unused : Symbol(A2.#unused, Decl(privateNameUnused.ts, 9, 17)) + + constructor () { + console.log(this.#used()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#used : Symbol(A2.#used, Decl(privateNameUnused.ts, 8, 17)) +>this : Symbol(A2, Decl(privateNameUnused.ts, 6, 1)) + } +} + +export class A3 { +>A3 : Symbol(A3, Decl(privateNameUnused.ts, 14, 1)) + + get #used() { return 0 }; +>#used : Symbol(A3.#used, Decl(privateNameUnused.ts, 16, 17), Decl(privateNameUnused.ts, 17, 29)) + + set #used(value: number) { }; +>#used : Symbol(A3.#used, Decl(privateNameUnused.ts, 16, 17), Decl(privateNameUnused.ts, 17, 29)) +>value : Symbol(value, Decl(privateNameUnused.ts, 18, 14)) + + get #unused() { return 0 }; +>#unused : Symbol(A3.#unused, Decl(privateNameUnused.ts, 18, 34), Decl(privateNameUnused.ts, 20, 31)) + + set #unused(value: number) { }; +>#unused : Symbol(A3.#unused, Decl(privateNameUnused.ts, 18, 34), Decl(privateNameUnused.ts, 20, 31)) +>value : Symbol(value, Decl(privateNameUnused.ts, 21, 16)) + + constructor () { + console.log(this.#used); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this.#used : Symbol(A3.#used, Decl(privateNameUnused.ts, 16, 17), Decl(privateNameUnused.ts, 17, 29)) +>this : Symbol(A3, Decl(privateNameUnused.ts, 14, 1)) + } +} diff --git a/tests/baselines/reference/privateNameUnused.types b/tests/baselines/reference/privateNameUnused.types index dc56a8f2a9e47..66ab9cf92e9be 100644 --- a/tests/baselines/reference/privateNameUnused.types +++ b/tests/baselines/reference/privateNameUnused.types @@ -21,3 +21,53 @@ export class A { } } +export class A2 { +>A2 : A2 + + #used() { }; +>#used : () => void + + #unused() { }; +>#unused : () => void + + constructor () { + console.log(this.#used()); +>console.log(this.#used()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#used() : void +>this.#used : () => void +>this : this + } +} + +export class A3 { +>A3 : A3 + + get #used() { return 0 }; +>#used : number +>0 : 0 + + set #used(value: number) { }; +>#used : number +>value : number + + get #unused() { return 0 }; +>#unused : number +>0 : 0 + + set #unused(value: number) { }; +>#unused : number +>value : number + + constructor () { + console.log(this.#used); +>console.log(this.#used) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#used : number +>this : this + } +} diff --git a/tests/baselines/reference/privateNamesAndkeyof.js b/tests/baselines/reference/privateNamesAndkeyof.js index 46750f78874dd..5a393e864d1fd 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.js +++ b/tests/baselines/reference/privateNamesAndkeyof.js @@ -1,21 +1,48 @@ //// [privateNamesAndkeyof.ts] class A { - #foo = 3; + #fooField = 3; + #fooMethod() { }; + get #fooProp() { return 1; }; + set #fooProp(value: number) { }; bar = 3; baz = 3; } -type T = keyof A // should not include '#foo' +type T = keyof A // should not include '#foo*' -//// [privateNamesAndkeyof.js] -"use strict"; -var _foo; -class A { - constructor() { - _foo.set(this, 3); - this.bar = 3; - this.baz = 3; +tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(9,5): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. +tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(9,8): error TS1005: '=>' expected. +tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(11,12): error TS1005: ';' expected. +tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(13,17): error TS1005: ';' expected. +tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(15,1): error TS1128: Declaration or statement expected. + + +==== tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js (5 errors) ==== + "use strict"; + var _fooField, _fooMethod, _fooProp, _fooProp_1; + class A { + constructor() { + _fooField.set(this, 3); + this.bar = 3; + this.baz = 3; + } + () { } + ~ +!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. + ~ +!!! error TS1005: '=>' expected. + ; + get () { return 1; } + ~ +!!! error TS1005: ';' expected. + ; + set (value) { } + ~ +!!! error TS1005: ';' expected. + ; } -} -_foo = new WeakMap(); + ~ +!!! error TS1128: Declaration or statement expected. + _fooField = new WeakMap(), _fooMethod = new WeakMap(), _fooProp = new WeakMap(), _fooProp_1 = new WeakMap(); + \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesAndkeyof.symbols b/tests/baselines/reference/privateNamesAndkeyof.symbols index dbad7e0aa748f..663c891517171 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.symbols +++ b/tests/baselines/reference/privateNamesAndkeyof.symbols @@ -2,17 +2,27 @@ class A { >A : Symbol(A, Decl(privateNamesAndkeyof.ts, 0, 0)) - #foo = 3; ->#foo : Symbol(A.#foo, Decl(privateNamesAndkeyof.ts, 0, 9)) + #fooField = 3; +>#fooField : Symbol(A.#fooField, Decl(privateNamesAndkeyof.ts, 0, 9)) + + #fooMethod() { }; +>#fooMethod : Symbol(A.#fooMethod, Decl(privateNamesAndkeyof.ts, 1, 18)) + + get #fooProp() { return 1; }; +>#fooProp : Symbol(A.#fooProp, Decl(privateNamesAndkeyof.ts, 2, 21), Decl(privateNamesAndkeyof.ts, 3, 33)) + + set #fooProp(value: number) { }; +>#fooProp : Symbol(A.#fooProp, Decl(privateNamesAndkeyof.ts, 2, 21), Decl(privateNamesAndkeyof.ts, 3, 33)) +>value : Symbol(value, Decl(privateNamesAndkeyof.ts, 4, 17)) bar = 3; ->bar : Symbol(A.bar, Decl(privateNamesAndkeyof.ts, 1, 13)) +>bar : Symbol(A.bar, Decl(privateNamesAndkeyof.ts, 4, 36)) baz = 3; ->baz : Symbol(A.baz, Decl(privateNamesAndkeyof.ts, 2, 12)) +>baz : Symbol(A.baz, Decl(privateNamesAndkeyof.ts, 5, 12)) } -type T = keyof A // should not include '#foo' ->T : Symbol(T, Decl(privateNamesAndkeyof.ts, 4, 1)) +type T = keyof A // should not include '#foo*' +>T : Symbol(T, Decl(privateNamesAndkeyof.ts, 7, 1)) >A : Symbol(A, Decl(privateNamesAndkeyof.ts, 0, 0)) diff --git a/tests/baselines/reference/privateNamesAndkeyof.types b/tests/baselines/reference/privateNamesAndkeyof.types index 3c063097dd464..706aaf68836f7 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.types +++ b/tests/baselines/reference/privateNamesAndkeyof.types @@ -2,10 +2,21 @@ class A { >A : A - #foo = 3; ->#foo : number + #fooField = 3; +>#fooField : number >3 : 3 + #fooMethod() { }; +>#fooMethod : () => void + + get #fooProp() { return 1; }; +>#fooProp : number +>1 : 1 + + set #fooProp(value: number) { }; +>#fooProp : number +>value : number + bar = 3; >bar : number >3 : 3 @@ -15,6 +26,6 @@ class A { >3 : 3 } -type T = keyof A // should not include '#foo' +type T = keyof A // should not include '#foo*' >T : keyof A diff --git a/tests/baselines/reference/privateNamesAssertion.js b/tests/baselines/reference/privateNamesAssertion.js index 66af365350b48..b6be4d5d4adf2 100644 --- a/tests/baselines/reference/privateNamesAssertion.js +++ b/tests/baselines/reference/privateNamesAssertion.js @@ -10,6 +10,18 @@ class Foo { v; } } + +class Foo2 { + #p1(v: any): asserts v is string { + if (typeof v !== "string") { + throw new Error(); + } + } + m1(v: unknown) { + this.#p1(v); + v; + } +} //// [privateNamesAssertion.js] @@ -28,3 +40,14 @@ class Foo { v; } } +class Foo2 { + #p1(v) { + if (typeof v !== "string") { + throw new Error(); + } + } + m1(v) { + this.#p1(v); + v; + } +} diff --git a/tests/baselines/reference/privateNamesAssertion.symbols b/tests/baselines/reference/privateNamesAssertion.symbols index 40d903912e734..2e0c423f2dd4d 100644 --- a/tests/baselines/reference/privateNamesAssertion.symbols +++ b/tests/baselines/reference/privateNamesAssertion.symbols @@ -29,3 +29,32 @@ class Foo { } } +class Foo2 { +>Foo2 : Symbol(Foo2, Decl(privateNamesAssertion.ts, 10, 1)) + + #p1(v: any): asserts v is string { +>#p1 : Symbol(Foo2.#p1, Decl(privateNamesAssertion.ts, 12, 12)) +>v : Symbol(v, Decl(privateNamesAssertion.ts, 13, 8)) +>v : Symbol(v, Decl(privateNamesAssertion.ts, 13, 8)) + + if (typeof v !== "string") { +>v : Symbol(v, Decl(privateNamesAssertion.ts, 13, 8)) + + throw new Error(); +>Error : Symbol(Error, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --)) + } + } + m1(v: unknown) { +>m1 : Symbol(Foo2.m1, Decl(privateNamesAssertion.ts, 17, 5)) +>v : Symbol(v, Decl(privateNamesAssertion.ts, 18, 7)) + + this.#p1(v); +>this.#p1 : Symbol(Foo2.#p1, Decl(privateNamesAssertion.ts, 12, 12)) +>this : Symbol(Foo2, Decl(privateNamesAssertion.ts, 10, 1)) +>v : Symbol(v, Decl(privateNamesAssertion.ts, 18, 7)) + + v; +>v : Symbol(v, Decl(privateNamesAssertion.ts, 18, 7)) + } +} + diff --git a/tests/baselines/reference/privateNamesAssertion.types b/tests/baselines/reference/privateNamesAssertion.types index ff0dd98d40219..44a052728e9eb 100644 --- a/tests/baselines/reference/privateNamesAssertion.types +++ b/tests/baselines/reference/privateNamesAssertion.types @@ -34,3 +34,36 @@ class Foo { } } +class Foo2 { +>Foo2 : Foo2 + + #p1(v: any): asserts v is string { +>#p1 : (v: any) => asserts v is string +>v : any + + if (typeof v !== "string") { +>typeof v !== "string" : boolean +>typeof v : "string" | "number" | "bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" +>v : any +>"string" : "string" + + throw new Error(); +>new Error() : Error +>Error : ErrorConstructor + } + } + m1(v: unknown) { +>m1 : (v: unknown) => void +>v : unknown + + this.#p1(v); +>this.#p1(v) : void +>this.#p1 : (v: any) => asserts v is string +>this : this +>v : unknown + + v; +>v : string + } +} + diff --git a/tests/baselines/reference/privateNamesInGenericClasses.errors.txt b/tests/baselines/reference/privateNamesInGenericClasses.errors.txt index d617432535020..ece16935004da 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.errors.txt +++ b/tests/baselines/reference/privateNamesInGenericClasses.errors.txt @@ -1,16 +1,30 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(10,3): error TS18013: Property '#foo' is not accessible outside class 'C' because it has a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(11,1): error TS2322: Type 'C' is not assignable to type 'C'. +tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(22,3): error TS18013: Property '#foo' is not accessible outside class 'C' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(23,3): error TS18013: Property '#method' is not accessible outside class 'C' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(24,3): error TS18013: Property '#prop' is not accessible outside class 'C' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(25,1): error TS2322: Type 'C' is not assignable to type 'C'. Type 'string' is not assignable to type 'number'. -tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(12,1): error TS2322: Type 'C' is not assignable to type 'C'. +tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts(26,1): error TS2322: Type 'C' is not assignable to type 'C'. Type 'number' is not assignable to type 'string'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts (5 errors) ==== class C { #foo: T; + #method(): T { return this.#foo; } + get #prop(): T { return this.#foo; } + set #prop(value : T) { this.#foo = value; } + bar(x: C) { return x.#foo; } // OK + bar2(x: C) { return x.#method(); } // OK + bar3(x: C) { return x.#prop; } // OK + baz(x: C) { return x.#foo; } // OK + baz2(x: C) { return x.#method; } // OK + baz3(x: C) { return x.#prop; } // OK + quux(x: C) { return x.#foo; } // OK + quux2(x: C) { return x.#method; }// OK + quux3(x: C) { return x.#prop; } // OK } declare let a: C; @@ -18,6 +32,12 @@ tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasse a.#foo; // Error ~~~~ !!! error TS18013: Property '#foo' is not accessible outside class 'C' because it has a private identifier. + a.#method; // Error + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class 'C' because it has a private identifier. + a.#prop; // Error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'C' because it has a private identifier. a = b; // Error ~ !!! error TS2322: Type 'C' is not assignable to type 'C'. diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index 27227fc0218e7..fdabcf6787143 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -1,14 +1,28 @@ //// [privateNamesInGenericClasses.ts] class C { #foo: T; + #method(): T { return this.#foo; } + get #prop(): T { return this.#foo; } + set #prop(value : T) { this.#foo = value; } + bar(x: C) { return x.#foo; } // OK + bar2(x: C) { return x.#method(); } // OK + bar3(x: C) { return x.#prop; } // OK + baz(x: C) { return x.#foo; } // OK + baz2(x: C) { return x.#method; } // OK + baz3(x: C) { return x.#prop; } // OK + quux(x: C) { return x.#foo; } // OK + quux2(x: C) { return x.#method; }// OK + quux3(x: C) { return x.#prop; } // OK } declare let a: C; declare let b: C; a.#foo; // Error +a.#method; // Error +a.#prop; // Error a = b; // Error b = a; // Error @@ -21,16 +35,34 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to set private field on non-instance"); + } + privateMap.set(receiver, value); + return value; +}; +var _foo, _method, _prop, _prop_1; class C { constructor() { _foo.set(this, void 0); } + () { return __classPrivateFieldGet(this, _foo); } + get () { return __classPrivateFieldGet(this, _foo); } + set (value) { __classPrivateFieldSet(this, _foo, value); } bar(x) { return __classPrivateFieldGet(x, _foo); } // OK + bar2(x) { return __classPrivateFieldGet(x, _method).call(x); } // OK + bar3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK baz(x) { return __classPrivateFieldGet(x, _foo); } // OK + baz2(x) { return __classPrivateFieldGet(x, _method); } // OK + baz3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK quux(x) { return __classPrivateFieldGet(x, _foo); } // OK + quux2(x) { return __classPrivateFieldGet(x, _method); } // OK + quux3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK } -_foo = new WeakMap(); +_foo = new WeakMap(), _method = new WeakMap(), _prop = new WeakMap(), _prop_1 = new WeakMap(); +a.; // Error +a.; // Error a.; // Error a = b; // Error b = a; // Error diff --git a/tests/baselines/reference/privateNamesInGenericClasses.symbols b/tests/baselines/reference/privateNamesInGenericClasses.symbols index c697c06390869..9dac6c7484fa7 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.symbols +++ b/tests/baselines/reference/privateNamesInGenericClasses.symbols @@ -7,45 +7,115 @@ class C { >#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) >T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) + #method(): T { return this.#foo; } +>#method : Symbol(C.#method, Decl(privateNamesInGenericClasses.ts, 1, 12)) +>T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) +>this.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) +>this : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) + + get #prop(): T { return this.#foo; } +>#prop : Symbol(C.#prop, Decl(privateNamesInGenericClasses.ts, 2, 38), Decl(privateNamesInGenericClasses.ts, 3, 40)) +>T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) +>this.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) +>this : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) + + set #prop(value : T) { this.#foo = value; } +>#prop : Symbol(C.#prop, Decl(privateNamesInGenericClasses.ts, 2, 38), Decl(privateNamesInGenericClasses.ts, 3, 40)) +>value : Symbol(value, Decl(privateNamesInGenericClasses.ts, 4, 14)) +>T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) +>this.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) +>this : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>value : Symbol(value, Decl(privateNamesInGenericClasses.ts, 4, 14)) + bar(x: C) { return x.#foo; } // OK ->bar : Symbol(C.bar, Decl(privateNamesInGenericClasses.ts, 1, 12)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 2, 8)) +>bar : Symbol(C.bar, Decl(privateNamesInGenericClasses.ts, 4, 47)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 6, 8)) >C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) >T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) >x.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 2, 8)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 6, 8)) + + bar2(x: C) { return x.#method(); } // OK +>bar2 : Symbol(C.bar2, Decl(privateNamesInGenericClasses.ts, 6, 35)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 7, 9)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) +>x.#method : Symbol(C.#method, Decl(privateNamesInGenericClasses.ts, 1, 12)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 7, 9)) + + bar3(x: C) { return x.#prop; } // OK +>bar3 : Symbol(C.bar3, Decl(privateNamesInGenericClasses.ts, 7, 41)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 8, 9)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>T : Symbol(T, Decl(privateNamesInGenericClasses.ts, 0, 8)) +>x.#prop : Symbol(C.#prop, Decl(privateNamesInGenericClasses.ts, 2, 38), Decl(privateNamesInGenericClasses.ts, 3, 40)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 8, 9)) baz(x: C) { return x.#foo; } // OK ->baz : Symbol(C.baz, Decl(privateNamesInGenericClasses.ts, 2, 35)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 3, 8)) +>baz : Symbol(C.baz, Decl(privateNamesInGenericClasses.ts, 8, 37)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 10, 8)) >C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) >x.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 3, 8)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 10, 8)) + + baz2(x: C) { return x.#method; } // OK +>baz2 : Symbol(C.baz2, Decl(privateNamesInGenericClasses.ts, 10, 40)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 11, 9)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>x.#method : Symbol(C.#method, Decl(privateNamesInGenericClasses.ts, 1, 12)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 11, 9)) + + baz3(x: C) { return x.#prop; } // OK +>baz3 : Symbol(C.baz3, Decl(privateNamesInGenericClasses.ts, 11, 44)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 12, 9)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>x.#prop : Symbol(C.#prop, Decl(privateNamesInGenericClasses.ts, 2, 38), Decl(privateNamesInGenericClasses.ts, 3, 40)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 12, 9)) quux(x: C) { return x.#foo; } // OK ->quux : Symbol(C.quux, Decl(privateNamesInGenericClasses.ts, 3, 40)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 4, 9)) +>quux : Symbol(C.quux, Decl(privateNamesInGenericClasses.ts, 12, 42)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 14, 9)) >C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) >x.#foo : Symbol(C.#foo, Decl(privateNamesInGenericClasses.ts, 0, 12)) ->x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 4, 9)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 14, 9)) + + quux2(x: C) { return x.#method; }// OK +>quux2 : Symbol(C.quux2, Decl(privateNamesInGenericClasses.ts, 14, 41)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 15, 10)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>x.#method : Symbol(C.#method, Decl(privateNamesInGenericClasses.ts, 1, 12)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 15, 10)) + + quux3(x: C) { return x.#prop; } // OK +>quux3 : Symbol(C.quux3, Decl(privateNamesInGenericClasses.ts, 15, 45)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 16, 10)) +>C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) +>x.#prop : Symbol(C.#prop, Decl(privateNamesInGenericClasses.ts, 2, 38), Decl(privateNamesInGenericClasses.ts, 3, 40)) +>x : Symbol(x, Decl(privateNamesInGenericClasses.ts, 16, 10)) } declare let a: C; ->a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 7, 11)) +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) >C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) declare let b: C; ->b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 8, 11)) +>b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 20, 11)) >C : Symbol(C, Decl(privateNamesInGenericClasses.ts, 0, 0)) a.#foo; // Error ->a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 7, 11)) +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) + +a.#method; // Error +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) + +a.#prop; // Error +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) a = b; // Error ->a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 7, 11)) ->b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 8, 11)) +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) +>b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 20, 11)) b = a; // Error ->b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 8, 11)) ->a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 7, 11)) +>b : Symbol(b, Decl(privateNamesInGenericClasses.ts, 20, 11)) +>a : Symbol(a, Decl(privateNamesInGenericClasses.ts, 19, 11)) diff --git a/tests/baselines/reference/privateNamesInGenericClasses.types b/tests/baselines/reference/privateNamesInGenericClasses.types index e0a29a45492c1..c8f2b95121fd6 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.types +++ b/tests/baselines/reference/privateNamesInGenericClasses.types @@ -5,22 +5,77 @@ class C { #foo: T; >#foo : T + #method(): T { return this.#foo; } +>#method : () => T +>this.#foo : T +>this : this + + get #prop(): T { return this.#foo; } +>#prop : T +>this.#foo : T +>this : this + + set #prop(value : T) { this.#foo = value; } +>#prop : T +>value : T +>this.#foo = value : T +>this.#foo : T +>this : this +>value : T + bar(x: C) { return x.#foo; } // OK >bar : (x: C) => T >x : C >x.#foo : T +>x : C + + bar2(x: C) { return x.#method(); } // OK +>bar2 : (x: C) => T +>x : C +>x.#method() : T +>x.#method : () => T +>x : C + + bar3(x: C) { return x.#prop; } // OK +>bar3 : (x: C) => T +>x : C +>x.#prop : T >x : C baz(x: C) { return x.#foo; } // OK >baz : (x: C) => number >x : C >x.#foo : number +>x : C + + baz2(x: C) { return x.#method; } // OK +>baz2 : (x: C) => () => number +>x : C +>x.#method : () => number +>x : C + + baz3(x: C) { return x.#prop; } // OK +>baz3 : (x: C) => number +>x : C +>x.#prop : number >x : C quux(x: C) { return x.#foo; } // OK >quux : (x: C) => string >x : C >x.#foo : string +>x : C + + quux2(x: C) { return x.#method; }// OK +>quux2 : (x: C) => () => string +>x : C +>x.#method : () => string +>x : C + + quux3(x: C) { return x.#prop; } // OK +>quux3 : (x: C) => string +>x : C +>x.#prop : string >x : C } @@ -34,6 +89,14 @@ a.#foo; // Error >a.#foo : any >a : C +a.#method; // Error +>a.#method : any +>a : C + +a.#prop; // Error +>a.#prop : any +>a : C + a = b; // Error >a = b : C >a : C diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.errors.txt b/tests/baselines/reference/privateNamesIncompatibleModifiers.errors.txt index 9aa840a2f49e5..f1f44a3d4f143 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.errors.txt +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.errors.txt @@ -1,11 +1,30 @@ +error TS2318: Cannot find global type 'AsyncIterableIterator'. tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(2,5): error TS18010: An accessibility modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(3,5): error TS18010: An accessibility modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(4,5): error TS18010: An accessibility modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(6,5): error TS18019: 'declare' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(10,5): error TS18019: 'abstract' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(8,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(9,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(10,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(11,5): error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(12,5): error TS1031: 'declare' modifier cannot appear on class elements of this kind. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(17,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(18,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(19,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(20,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(21,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(22,5): error TS18010: An accessibility modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(23,5): error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(24,5): error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(25,5): error TS1031: 'declare' modifier cannot appear on class elements of this kind. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(26,5): error TS1031: 'declare' modifier cannot appear on class elements of this kind. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(27,5): error TS1042: 'async' modifier cannot be used here. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(28,5): error TS1042: 'async' modifier cannot be used here. +tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts(32,5): error TS18019: 'abstract' modifier cannot be used with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (5 errors) ==== +!!! error TS2318: Cannot find global type 'AsyncIterableIterator'. +==== tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts (22 errors) ==== class A { public #foo = 3; // Error ~~~~~~ @@ -20,6 +39,62 @@ tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleMod declare #what: number; // Error ~~~~~~~ !!! error TS18019: 'declare' modifier cannot be used with a private identifier. + + public #fooMethod() { return 3; } // Error + ~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + private #barMethod() { return 3; } // Error + ~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + protected #bazMethod() { return 3; } // Error + ~~~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + readonly #quxMethod() { return 3; } // Error + ~~~~~~~~ +!!! error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. + declare #whatMethod() // Error + ~~~~~~~ +!!! error TS1031: 'declare' modifier cannot appear on class elements of this kind. + async #asyncMethod() { return 1; } //OK + *#genMethod() { return 1; } //OK + async *#asyncGenMethod() { return 1; } //OK + + public get #fooProp() { return 3; } // Error + ~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + public set #fooProp(value: number) { } // Error + ~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + private get #barProp() { return 3; } // Error + ~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + private set #barProp(value: number) { } // Error + ~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + protected get #bazProp() { return 3; } // Error + ~~~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + protected set #bazProp(value: number) { } // Error + ~~~~~~~~~ +!!! error TS18010: An accessibility modifier cannot be used with a private identifier. + readonly get #quxProp() { return 3; } // Error + ~~~~~~~~ +!!! error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. + readonly set #quxProp(value: number) { } // Error + ~~~~~~~~ +!!! error TS1024: 'readonly' modifier can only appear on a property declaration or index signature. + declare get #whatProp() // Error + ~~~~~~~ +!!! error TS1031: 'declare' modifier cannot appear on class elements of this kind. + declare set #whatProp(value: number) // Error + ~~~~~~~ +!!! error TS1031: 'declare' modifier cannot appear on class elements of this kind. + async get #asyncProp() { return 1; } // Error + ~~~~~ +!!! error TS1042: 'async' modifier cannot be used here. + async set #asyncProp(value: number) { } // Error + ~~~~~ +!!! error TS1042: 'async' modifier cannot be used here. } abstract class B { diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index f6e731d371d88..c7618c5c580ef 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -5,6 +5,28 @@ class A { protected #baz = 3; // Error readonly #qux = 3; // OK declare #what: number; // Error + + public #fooMethod() { return 3; } // Error + private #barMethod() { return 3; } // Error + protected #bazMethod() { return 3; } // Error + readonly #quxMethod() { return 3; } // Error + declare #whatMethod() // Error + async #asyncMethod() { return 1; } //OK + *#genMethod() { return 1; } //OK + async *#asyncGenMethod() { return 1; } //OK + + public get #fooProp() { return 3; } // Error + public set #fooProp(value: number) { } // Error + private get #barProp() { return 3; } // Error + private set #barProp(value: number) { } // Error + protected get #bazProp() { return 3; } // Error + protected set #bazProp(value: number) { } // Error + readonly get #quxProp() { return 3; } // Error + readonly set #quxProp(value: number) { } // Error + declare get #whatProp() // Error + declare set #whatProp(value: number) // Error + async get #asyncProp() { return 1; } // Error + async set #asyncProp(value: number) { } // Error } abstract class B { @@ -14,7 +36,28 @@ abstract class B { //// [privateNamesIncompatibleModifiers.js] "use strict"; -var _foo, _bar, _baz, _qux; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } +var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +}; +var _foo, _bar, _baz, _qux, _fooMethod, _barMethod, _bazMethod, _quxMethod, _asyncMethod, _genMethod, _asyncGenMethod, _fooProp, _fooProp_1, _barProp, _barProp_1, _bazProp, _bazProp_1, _quxProp, _quxProp_1, _whatProp, _whatProp_1, _asyncProp, _asyncProp_1; class A { constructor() { _foo.set(this, 3); // Error @@ -22,7 +65,28 @@ class A { _baz.set(this, 3); // Error _qux.set(this, 3); // OK } + () { return 3; } // Error + () { return 3; } // Error + () { return 3; } // Error + () { return 3; } // Error + () { + return __awaiter(this, void 0, void 0, function* () { return 1; }); + } //OK + *() { return 1; } //OK + () { return __asyncGenerator(this, arguments, function* _a() { return yield __await(1); }); } //OK + get () { return 3; } // Error + set (value) { } // Error + get () { return 3; } // Error + set (value) { } // Error + get () { return 3; } // Error + set (value) { } // Error + get () { return 3; } // Error + set (value) { } // Error + get () { } // Error + set (value) { } // Error + get () { return 1; } // Error + set (value) { } // Error } -_foo = new WeakMap(), _bar = new WeakMap(), _baz = new WeakMap(), _qux = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakMap(), _baz = new WeakMap(), _qux = new WeakMap(), _fooMethod = new WeakMap(), _barMethod = new WeakMap(), _bazMethod = new WeakMap(), _quxMethod = new WeakMap(), _asyncMethod = new WeakMap(), _genMethod = new WeakMap(), _asyncGenMethod = new WeakMap(), _fooProp = new WeakMap(), _fooProp_1 = new WeakMap(), _barProp = new WeakMap(), _barProp_1 = new WeakMap(), _bazProp = new WeakMap(), _bazProp_1 = new WeakMap(), _quxProp = new WeakMap(), _quxProp_1 = new WeakMap(), _whatProp = new WeakMap(), _whatProp_1 = new WeakMap(), _asyncProp = new WeakMap(), _asyncProp_1 = new WeakMap(); class B { } diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.symbols b/tests/baselines/reference/privateNamesIncompatibleModifiers.symbols index 65d665cb1d107..ffc3c0244c59b 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.symbols +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.symbols @@ -16,12 +16,78 @@ class A { declare #what: number; // Error >#what : Symbol(A.#what, Decl(privateNamesIncompatibleModifiers.ts, 4, 22)) + + public #fooMethod() { return 3; } // Error +>#fooMethod : Symbol(A.#fooMethod, Decl(privateNamesIncompatibleModifiers.ts, 5, 26)) + + private #barMethod() { return 3; } // Error +>#barMethod : Symbol(A.#barMethod, Decl(privateNamesIncompatibleModifiers.ts, 7, 38)) + + protected #bazMethod() { return 3; } // Error +>#bazMethod : Symbol(A.#bazMethod, Decl(privateNamesIncompatibleModifiers.ts, 8, 39)) + + readonly #quxMethod() { return 3; } // Error +>#quxMethod : Symbol(A.#quxMethod, Decl(privateNamesIncompatibleModifiers.ts, 9, 41)) + + declare #whatMethod() // Error +>#whatMethod : Symbol(A.#whatMethod, Decl(privateNamesIncompatibleModifiers.ts, 10, 40)) + + async #asyncMethod() { return 1; } //OK +>#asyncMethod : Symbol(A.#asyncMethod, Decl(privateNamesIncompatibleModifiers.ts, 11, 25)) + + *#genMethod() { return 1; } //OK +>#genMethod : Symbol(A.#genMethod, Decl(privateNamesIncompatibleModifiers.ts, 12, 38)) + + async *#asyncGenMethod() { return 1; } //OK +>#asyncGenMethod : Symbol(A.#asyncGenMethod, Decl(privateNamesIncompatibleModifiers.ts, 13, 31)) + + public get #fooProp() { return 3; } // Error +>#fooProp : Symbol(A.#fooProp, Decl(privateNamesIncompatibleModifiers.ts, 14, 42), Decl(privateNamesIncompatibleModifiers.ts, 16, 40)) + + public set #fooProp(value: number) { } // Error +>#fooProp : Symbol(A.#fooProp, Decl(privateNamesIncompatibleModifiers.ts, 14, 42), Decl(privateNamesIncompatibleModifiers.ts, 16, 40)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 17, 24)) + + private get #barProp() { return 3; } // Error +>#barProp : Symbol(A.#barProp, Decl(privateNamesIncompatibleModifiers.ts, 17, 43), Decl(privateNamesIncompatibleModifiers.ts, 18, 41)) + + private set #barProp(value: number) { } // Error +>#barProp : Symbol(A.#barProp, Decl(privateNamesIncompatibleModifiers.ts, 17, 43), Decl(privateNamesIncompatibleModifiers.ts, 18, 41)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 19, 25)) + + protected get #bazProp() { return 3; } // Error +>#bazProp : Symbol(A.#bazProp, Decl(privateNamesIncompatibleModifiers.ts, 19, 44), Decl(privateNamesIncompatibleModifiers.ts, 20, 43)) + + protected set #bazProp(value: number) { } // Error +>#bazProp : Symbol(A.#bazProp, Decl(privateNamesIncompatibleModifiers.ts, 19, 44), Decl(privateNamesIncompatibleModifiers.ts, 20, 43)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 21, 27)) + + readonly get #quxProp() { return 3; } // Error +>#quxProp : Symbol(A.#quxProp, Decl(privateNamesIncompatibleModifiers.ts, 21, 46), Decl(privateNamesIncompatibleModifiers.ts, 22, 42)) + + readonly set #quxProp(value: number) { } // Error +>#quxProp : Symbol(A.#quxProp, Decl(privateNamesIncompatibleModifiers.ts, 21, 46), Decl(privateNamesIncompatibleModifiers.ts, 22, 42)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 23, 26)) + + declare get #whatProp() // Error +>#whatProp : Symbol(A.#whatProp, Decl(privateNamesIncompatibleModifiers.ts, 23, 45), Decl(privateNamesIncompatibleModifiers.ts, 24, 27)) + + declare set #whatProp(value: number) // Error +>#whatProp : Symbol(A.#whatProp, Decl(privateNamesIncompatibleModifiers.ts, 23, 45), Decl(privateNamesIncompatibleModifiers.ts, 24, 27)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 25, 26)) + + async get #asyncProp() { return 1; } // Error +>#asyncProp : Symbol(A.#asyncProp, Decl(privateNamesIncompatibleModifiers.ts, 25, 40), Decl(privateNamesIncompatibleModifiers.ts, 26, 40)) + + async set #asyncProp(value: number) { } // Error +>#asyncProp : Symbol(A.#asyncProp, Decl(privateNamesIncompatibleModifiers.ts, 25, 40), Decl(privateNamesIncompatibleModifiers.ts, 26, 40)) +>value : Symbol(value, Decl(privateNamesIncompatibleModifiers.ts, 27, 25)) } abstract class B { ->B : Symbol(B, Decl(privateNamesIncompatibleModifiers.ts, 6, 1)) +>B : Symbol(B, Decl(privateNamesIncompatibleModifiers.ts, 28, 1)) abstract #quux = 3; // Error ->#quux : Symbol(B.#quux, Decl(privateNamesIncompatibleModifiers.ts, 8, 18)) +>#quux : Symbol(B.#quux, Decl(privateNamesIncompatibleModifiers.ts, 30, 18)) } diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.types b/tests/baselines/reference/privateNamesIncompatibleModifiers.types index ac2f60f67ff18..2b4f2ac2a456a 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.types +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.types @@ -20,6 +20,84 @@ class A { declare #what: number; // Error >#what : number + + public #fooMethod() { return 3; } // Error +>#fooMethod : () => number +>3 : 3 + + private #barMethod() { return 3; } // Error +>#barMethod : () => number +>3 : 3 + + protected #bazMethod() { return 3; } // Error +>#bazMethod : () => number +>3 : 3 + + readonly #quxMethod() { return 3; } // Error +>#quxMethod : () => number +>3 : 3 + + declare #whatMethod() // Error +>#whatMethod : () => any + + async #asyncMethod() { return 1; } //OK +>#asyncMethod : () => Promise +>1 : 1 + + *#genMethod() { return 1; } //OK +>#genMethod : () => Generator +>1 : 1 + + async *#asyncGenMethod() { return 1; } //OK +>#asyncGenMethod : () => {} +>1 : 1 + + public get #fooProp() { return 3; } // Error +>#fooProp : number +>3 : 3 + + public set #fooProp(value: number) { } // Error +>#fooProp : number +>value : number + + private get #barProp() { return 3; } // Error +>#barProp : number +>3 : 3 + + private set #barProp(value: number) { } // Error +>#barProp : number +>value : number + + protected get #bazProp() { return 3; } // Error +>#bazProp : number +>3 : 3 + + protected set #bazProp(value: number) { } // Error +>#bazProp : number +>value : number + + readonly get #quxProp() { return 3; } // Error +>#quxProp : number +>3 : 3 + + readonly set #quxProp(value: number) { } // Error +>#quxProp : number +>value : number + + declare get #whatProp() // Error +>#whatProp : number + + declare set #whatProp(value: number) // Error +>#whatProp : number +>value : number + + async get #asyncProp() { return 1; } // Error +>#asyncProp : number +>1 : 1 + + async set #asyncProp(value: number) { } // Error +>#asyncProp : number +>value : number } abstract class B { diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.errors.txt b/tests/baselines/reference/privateNamesUseBeforeDef.errors.txt index 7105d8d9481e8..fdf69c642e2c8 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.errors.txt +++ b/tests/baselines/reference/privateNamesUseBeforeDef.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts(2,17): error TS2729: Property '#bar' is used before its initialization. -tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts(7,17): error TS2729: Property '#bar' is used before its initialization. +tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts(17,17): error TS2729: Property '#bar' is used before its initialization. ==== tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts (2 errors) ==== @@ -11,11 +11,21 @@ tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts #bar = 3; } + class A2 { + #foo = this.#bar(); // No Error + #bar() { return 3 }; + } + + class A3 { + #foo = this.#bar; // No Error + get #bar() { return 3 }; + } + class B { #foo = this.#bar; // Error ~~~~ !!! error TS2729: Property '#bar' is used before its initialization. -!!! related TS2728 tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts:8:5: '#bar' is declared here. +!!! related TS2728 tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts:18:5: '#bar' is declared here. #bar = this.#foo; } \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index 06b5316189dce..3edacd1f870d5 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -4,6 +4,16 @@ class A { #bar = 3; } +class A2 { + #foo = this.#bar(); // No Error + #bar() { return 3 }; +} + +class A3 { + #foo = this.#bar; // No Error + get #bar() { return 3 }; +} + class B { #foo = this.#bar; // Error #bar = this.#foo; @@ -17,7 +27,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _foo_1, _bar_1; +var _foo, _bar, _foo_1, _bar_1, _foo_2, _bar_2, _foo_3, _bar_3; class A { constructor() { _foo.set(this, __classPrivateFieldGet(this, _bar)); // Error @@ -25,10 +35,26 @@ class A { } } _foo = new WeakMap(), _bar = new WeakMap(); -class B { +class A2 { constructor() { - _foo_1.set(this, __classPrivateFieldGet(this, _bar_1)); // Error - _bar_1.set(this, __classPrivateFieldGet(this, _foo_1)); + _foo_1.set(this, __classPrivateFieldGet(this, _bar_1).call(this)); // No Error } + () { return 3; } + ; } _foo_1 = new WeakMap(), _bar_1 = new WeakMap(); +class A3 { + constructor() { + _foo_2.set(this, __classPrivateFieldGet(this, _bar_2)); // No Error + } + get () { return 3; } + ; +} +_foo_2 = new WeakMap(), _bar_2 = new WeakMap(); +class B { + constructor() { + _foo_3.set(this, __classPrivateFieldGet(this, _bar_3)); // Error + _bar_3.set(this, __classPrivateFieldGet(this, _foo_3)); + } +} +_foo_3 = new WeakMap(), _bar_3 = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.symbols b/tests/baselines/reference/privateNamesUseBeforeDef.symbols index 21df1931d9760..025f8625c39c9 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.symbols +++ b/tests/baselines/reference/privateNamesUseBeforeDef.symbols @@ -11,17 +11,41 @@ class A { >#bar : Symbol(A.#bar, Decl(privateNamesUseBeforeDef.ts, 1, 21)) } +class A2 { +>A2 : Symbol(A2, Decl(privateNamesUseBeforeDef.ts, 3, 1)) + + #foo = this.#bar(); // No Error +>#foo : Symbol(A2.#foo, Decl(privateNamesUseBeforeDef.ts, 5, 10)) +>this.#bar : Symbol(A2.#bar, Decl(privateNamesUseBeforeDef.ts, 6, 23)) +>this : Symbol(A2, Decl(privateNamesUseBeforeDef.ts, 3, 1)) + + #bar() { return 3 }; +>#bar : Symbol(A2.#bar, Decl(privateNamesUseBeforeDef.ts, 6, 23)) +} + +class A3 { +>A3 : Symbol(A3, Decl(privateNamesUseBeforeDef.ts, 8, 1)) + + #foo = this.#bar; // No Error +>#foo : Symbol(A3.#foo, Decl(privateNamesUseBeforeDef.ts, 10, 10)) +>this.#bar : Symbol(A3.#bar, Decl(privateNamesUseBeforeDef.ts, 11, 21)) +>this : Symbol(A3, Decl(privateNamesUseBeforeDef.ts, 8, 1)) + + get #bar() { return 3 }; +>#bar : Symbol(A3.#bar, Decl(privateNamesUseBeforeDef.ts, 11, 21)) +} + class B { ->B : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 3, 1)) +>B : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 13, 1)) #foo = this.#bar; // Error ->#foo : Symbol(B.#foo, Decl(privateNamesUseBeforeDef.ts, 5, 9)) ->this.#bar : Symbol(B.#bar, Decl(privateNamesUseBeforeDef.ts, 6, 21)) ->this : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 3, 1)) +>#foo : Symbol(B.#foo, Decl(privateNamesUseBeforeDef.ts, 15, 9)) +>this.#bar : Symbol(B.#bar, Decl(privateNamesUseBeforeDef.ts, 16, 21)) +>this : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 13, 1)) #bar = this.#foo; ->#bar : Symbol(B.#bar, Decl(privateNamesUseBeforeDef.ts, 6, 21)) ->this.#foo : Symbol(B.#foo, Decl(privateNamesUseBeforeDef.ts, 5, 9)) ->this : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 3, 1)) +>#bar : Symbol(B.#bar, Decl(privateNamesUseBeforeDef.ts, 16, 21)) +>this.#foo : Symbol(B.#foo, Decl(privateNamesUseBeforeDef.ts, 15, 9)) +>this : Symbol(B, Decl(privateNamesUseBeforeDef.ts, 13, 1)) } diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.types b/tests/baselines/reference/privateNamesUseBeforeDef.types index 4f43c5b48234c..d729927e47b8d 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.types +++ b/tests/baselines/reference/privateNamesUseBeforeDef.types @@ -12,6 +12,33 @@ class A { >3 : 3 } +class A2 { +>A2 : A2 + + #foo = this.#bar(); // No Error +>#foo : number +>this.#bar() : number +>this.#bar : () => number +>this : this + + #bar() { return 3 }; +>#bar : () => number +>3 : 3 +} + +class A3 { +>A3 : A3 + + #foo = this.#bar; // No Error +>#foo : number +>this.#bar : number +>this : this + + get #bar() { return 3 }; +>#bar : number +>3 : 3 +} + class B { >B : B diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts new file mode 100644 index 0000000000000..451d017fdca99 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAccessors.ts @@ -0,0 +1,16 @@ +// @strict: true +// @target: es6 + +class A1 { + get #prop() { return ""; } + set #prop(param: string) { } + + get #roProp() { return ""; } + + constructor(name: string) { + this.#prop = ""; + this.#roProp = ""; // Error + console.log(this.#prop); + console.log(this.#roProp); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts new file mode 100644 index 0000000000000..7480a87ce545e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsAccess.ts @@ -0,0 +1,26 @@ +// @target: es2015 + +class A2 { + get #prop() { return ""; } + set #prop(param: string) { } + + constructor() { + console.log(this.#prop); + let a: A2 = this; + a.#prop; + function foo (){ + a.#prop; + } + } +} +new A2().#prop; // Error + +function foo (){ + new A2().#prop; // Error +} + +class B2 { + m() { + new A2().#prop; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts new file mode 100644 index 0000000000000..ce7dae715b6fa --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.ts @@ -0,0 +1,20 @@ +// @target: es2015 + +class A { + get #fieldFunc() { return function() { this.x = 10; } } + get #fieldFunc2() { return function(a, ...b) {}; } + x = 1; + test() { + this.#fieldFunc(); + const func = this.#fieldFunc; + func(); + new this.#fieldFunc(); + + const arr = [ 1, 2 ]; + this.#fieldFunc2(0, ...arr, 3); + const b = new this.#fieldFunc2(0, ...arr, 3); + const str = this.#fieldFunc2`head${1}middle${2}tail`; + this.getInstance().#fieldFunc2`test${1}and${2}`; + } + getInstance() { return new A(); } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts new file mode 100644 index 0000000000000..80140cf63d1dd --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAccessorssDerivedClasses.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +class Base { + get #prop(): number { return 123; } + static method(x: Derived) { + console.log(x.#prop); + } +} +class Derived extends Base { + static method(x: Derived) { + console.log(x.#prop); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts index fc6c20828556c..7df8691185114 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAndPropertySignature.ts @@ -1,16 +1,20 @@ type A = { - #foo: string + #foo: string; + #bar(): string; } interface B { #foo: string; + #bar(): string; } declare const x: { #foo: number; bar: { #baz: string; + #taz(): string; } + #baz(): string; }; declare const y: [{ qux: { #quux: 3 } }]; diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts b/tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts index 2a8c589b11da9..b1b2c493e304b 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameBadDeclaration.ts @@ -1,10 +1,14 @@ function A() { } A.prototype = { - #x: 1 // Error + #x: 1, // Error + #m() {}, // Error + get #p() { return "" } // Error } class B { } B.prototype = { - #y: 2 // Error + #y: 2, // Error + #m() {}, // Error + get #p() { return "" } // Error } class C { constructor() { diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts index 45ed8f020d757..e2b911b0afd40 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts @@ -5,3 +5,32 @@ class A { #foo = "foo"; #foo = "foo"; } + +class A2 { + #foo = "foo"; + #foo() {} +} + + +class A3 { + #foo = "foo"; + get #foo() { return ""} +} + +class A4 { + #foo() { return ""} + #foo() { return ""} +} + + +class A5 { + #foo() { return ""} + get #foo() { return ""} +} + + +class A6 { + #foo = "foo"; + #foo() { return ""} + get #foo() { return ""} +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts b/tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts new file mode 100644 index 0000000000000..8323d7d18ff0a --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameInObjectLiteral-3.ts @@ -0,0 +1,5 @@ +const obj = { + get #foo() { + return "" + } +}; diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameJsBadDeclaration.ts b/tests/cases/conformance/classes/members/privateNames/privateNameJsBadDeclaration.ts index 90e6197c6b3cc..b26cd5a2bbd73 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameJsBadDeclaration.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameJsBadDeclaration.ts @@ -5,11 +5,15 @@ function A() { } A.prototype = { - #x: 1 // Error + #x: 1, // Error + #m() {}, // Error + get #p() { return "" } // Error } class B { } B.prototype = { - #y: 2 // Error + #y: 2, // Error + #m() {}, // Error + get #p() { return "" } // Error } class C { constructor() { diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts b/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts new file mode 100644 index 0000000000000..b5d235f5a11e8 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameNestedClassAccessorsShadowing.ts @@ -0,0 +1,16 @@ +// @target: es2015 + +class Base { + get #x() { return 1; }; + constructor() { + class Derived { + get #x() { return 1; }; + testBase(x: Base) { + console.log(x.#x); + } + testDerived(x: Derived) { + console.log(x.#x); + } + } + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts b/tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts index f7bb388043ac7..76365a4da449f 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameUnused.ts @@ -9,3 +9,22 @@ export class A { console.log(this.#used); } } + +export class A2 { + #used() { }; + #unused() { }; + constructor () { + console.log(this.#used()); + } +} + +export class A3 { + get #used() { return 0 }; + set #used(value: number) { }; + + get #unused() { return 0 }; + set #unused(value: number) { }; + constructor () { + console.log(this.#used); + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.ts index 1ea2826e0470e..4f04a5ca588e9 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.ts @@ -2,9 +2,12 @@ // @target: es6 class A { - #foo = 3; + #fooField = 3; + #fooMethod() { }; + get #fooProp() { return 1; }; + set #fooProp(value: number) { }; bar = 3; baz = 3; } -type T = keyof A // should not include '#foo' +type T = keyof A // should not include '#foo*' diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesAssertion.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesAssertion.ts index 69d552b6f0b65..acce5ff55a7f9 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNamesAssertion.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesAssertion.ts @@ -12,3 +12,15 @@ class Foo { v; } } + +class Foo2 { + #p1(v: any): asserts v is string { + if (typeof v !== "string") { + throw new Error(); + } + } + m1(v: unknown) { + this.#p1(v); + v; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts index 225a6d071980d..134b38c3b60a1 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesInGenericClasses.ts @@ -4,13 +4,27 @@ class C { #foo: T; + #method(): T { return this.#foo; } + get #prop(): T { return this.#foo; } + set #prop(value : T) { this.#foo = value; } + bar(x: C) { return x.#foo; } // OK + bar2(x: C) { return x.#method(); } // OK + bar3(x: C) { return x.#prop; } // OK + baz(x: C) { return x.#foo; } // OK + baz2(x: C) { return x.#method; } // OK + baz3(x: C) { return x.#prop; } // OK + quux(x: C) { return x.#foo; } // OK + quux2(x: C) { return x.#method; }// OK + quux3(x: C) { return x.#prop; } // OK } declare let a: C; declare let b: C; a.#foo; // Error +a.#method; // Error +a.#prop; // Error a = b; // Error b = a; // Error diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts index ef4341ab56752..2db87b88945e5 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesIncompatibleModifiers.ts @@ -7,6 +7,28 @@ class A { protected #baz = 3; // Error readonly #qux = 3; // OK declare #what: number; // Error + + public #fooMethod() { return 3; } // Error + private #barMethod() { return 3; } // Error + protected #bazMethod() { return 3; } // Error + readonly #quxMethod() { return 3; } // Error + declare #whatMethod() // Error + async #asyncMethod() { return 1; } //OK + *#genMethod() { return 1; } //OK + async *#asyncGenMethod() { return 1; } //OK + + public get #fooProp() { return 3; } // Error + public set #fooProp(value: number) { } // Error + private get #barProp() { return 3; } // Error + private set #barProp(value: number) { } // Error + protected get #bazProp() { return 3; } // Error + protected set #bazProp(value: number) { } // Error + readonly get #quxProp() { return 3; } // Error + readonly set #quxProp(value: number) { } // Error + declare get #whatProp() // Error + declare set #whatProp(value: number) // Error + async get #asyncProp() { return 1; } // Error + async set #asyncProp(value: number) { } // Error } abstract class B { diff --git a/tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts b/tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts index cc0c3bf8980f9..c47e709c284f1 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNamesUseBeforeDef.ts @@ -5,6 +5,16 @@ class A { #bar = 3; } +class A2 { + #foo = this.#bar(); // No Error + #bar() { return 3 }; +} + +class A3 { + #foo = this.#bar; // No Error + get #bar() { return 3 }; +} + class B { #foo = this.#bar; // Error #bar = this.#foo; diff --git a/tests/cases/fourslash/completionListPrivateNamesAccessors.ts b/tests/cases/fourslash/completionListPrivateNamesAccessors.ts new file mode 100644 index 0000000000000..1fc143eb836c6 --- /dev/null +++ b/tests/cases/fourslash/completionListPrivateNamesAccessors.ts @@ -0,0 +1,37 @@ +/// + +//// class Foo { +//// get #x() { return 1 }; +//// set #x(value: number) { }; +//// y() {}; +//// } +//// class Bar extends Foo { +//// get #z() { return 1 }; +//// set #z(value: number) { }; +//// t() {}; +//// l; +//// constructor() { +//// this./*1*/ +//// class Baz { +//// get #z() { return 1 }; +//// set #z(value: number) { }; +//// get #u() { return 1 }; +//// set #u(value: number) { }; +//// v() {}; +//// k; +//// constructor() { +//// this./*2*/ +//// new Bar()./*3*/ +//// } +//// } +//// } +//// } +//// +//// new Foo()./*4*/ + + + +verify.completions({ marker: "1", exact: ["#z", "t", "l", "y"] }); +verify.completions({ marker: "2", exact: ["#z", "#u", "v", "k"] }); +verify.completions({ marker: "3", exact: ["#z", "t", "l", "y"] }); +verify.completions({ marker: "4", exact: ["y"] }); diff --git a/tests/cases/fourslash/findAllRefsPrivateNameAccessors.ts b/tests/cases/fourslash/findAllRefsPrivateNameAccessors.ts new file mode 100644 index 0000000000000..5fc76f402407c --- /dev/null +++ b/tests/cases/fourslash/findAllRefsPrivateNameAccessors.ts @@ -0,0 +1,27 @@ +/// + +////class C { +//// [|get [|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 0 |}#foo|](){ return 1; }|] +//// [|set [|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 2 |}#foo|](value: number){ }|] +//// constructor() { +//// this.[|#foo|](); +//// } +////} +////class D extends C { +//// constructor() { +//// super() +//// this.#foo = 20; +//// } +////} +////class E { +//// [|get [|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 5 |}#foo|](){ return 1; }|] +//// [|set [|{|"isDefinition": true, "isWriteAccess":true, "contextRangeIndex": 7 |}#foo|](value: number){ }|] +//// constructor() { +//// this.[|#foo|](); +//// } +////} + +const [rC0DefGet, rC0Get, rC0DefSet, rC0Set, rC1, + rE0GetDef, rE0Get, rE0SetDef, rE0Set, rE1] = test.ranges(); +verify.singleReferenceGroup("(property) C.#foo: number", [rC0Get, rC0Set, rC1]); +verify.singleReferenceGroup("(property) E.#foo: number", [rE0Get, rE0Set, rE1]); diff --git a/tests/cases/fourslash/goToDefinitionPrivateName.ts b/tests/cases/fourslash/goToDefinitionPrivateName.ts index c03b4fe179c2e..6a551819569c5 100644 --- a/tests/cases/fourslash/goToDefinitionPrivateName.ts +++ b/tests/cases/fourslash/goToDefinitionPrivateName.ts @@ -3,13 +3,17 @@ //// class A { //// [|/*pnMethodDecl*/#method|]() { } //// [|/*pnFieldDecl*/#foo|] = 3; +//// get [|/*pnPropGetDecl*/#prop|]() { return ""; } +//// set [|/*pnPropSetDecl*/#prop|](value: string) { } //// constructor() { //// this.[|/*pnFieldUse*/#foo|] //// this.[|/*pnMethodUse*/#method|] +//// this.[|/*pnPropUse*/#prop|] //// } //// } verify.goToDefinition({ pnFieldUse: "pnFieldDecl", - pnMethodUse: "pnMethodDecl" + pnMethodUse: "pnMethodDecl", + pnPropUse: ["pnPropGetDecl", "pnPropSetDecl"] }); diff --git a/tests/cases/fourslash/renamePrivateAccessor.ts b/tests/cases/fourslash/renamePrivateAccessor.ts new file mode 100644 index 0000000000000..46a5cd39828d7 --- /dev/null +++ b/tests/cases/fourslash/renamePrivateAccessor.ts @@ -0,0 +1,14 @@ +/// + +////class Foo { +//// [|get [|{| "contextRangeIndex": 0 |}#foo|]() { return 1 }|] +//// [|set [|{| "contextRangeIndex": 2 |}#foo|](value: number) { }|] +//// retFoo() { +//// return this.[|#foo|]; +//// } +////} + +const ranges = test.rangesByText().get("#foo"); +verify.renameLocations(ranges, { + ranges +}); From 2760ed830b9e6d649eb380e6c59cd04d3f1c9a09 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 25 Jan 2021 15:49:58 +0000 Subject: [PATCH 05/68] Transform private methods Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 42 ++++- src/compiler/transformers/classFields.ts | 209 ++++++++++++++++++++--- src/compiler/transformers/utilities.ts | 21 +++ 3 files changed, 244 insertions(+), 28 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 4333272616da6..2cace67076460 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -34,6 +34,8 @@ namespace ts { // Class Fields Helpers createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier): Expression; createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; + createClassPrivateMethodGetHelper(receiver: Expression, accessCheck: Identifier, fn: Identifier): Expression; + createClassPrivateReadonlyHelper(): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -72,6 +74,8 @@ namespace ts { // Class Fields Helpers createClassPrivateFieldGetHelper, createClassPrivateFieldSetHelper, + createClassPrivateMethodGetHelper, + createClassPrivateReadonlyHelper, }; /** @@ -377,6 +381,17 @@ namespace ts { context.requestEmitHelper(classPrivateFieldSetHelper); return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, privateField, value]); } + + function createClassPrivateMethodGetHelper(receiver: Expression, accessCheck: Identifier, fn: Identifier) { + context.requestEmitHelper(classPrivateMethodGetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, accessCheck, fn]); + } + + function createClassPrivateReadonlyHelper() { + context.requestEmitHelper(classPrivateReadonlyHelper); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, []); + } + } /* @internal */ @@ -844,6 +859,29 @@ namespace ts { };` }; + export const classPrivateMethodGetHelper: UnscopedEmitHelper = { + name: "typescript:classPrivateMethodGet", + importName: "__classPrivateMethodGet", + scoped: false, + text: ` + var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; + };` + }; + + export const classPrivateReadonlyHelper: UnscopedEmitHelper = { + name: "typescript:classPrivateReadonly", + importName: "__classPrivateReadonly", + scoped: false, + text: ` + var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { + throw new TypeError("private element is not writable"); + };` + }; + let allUnscopedEmitHelpers: ReadonlyESMap | undefined; export function getAllUnscopedEmitHelpers() { @@ -869,6 +907,8 @@ namespace ts { exportStarHelper, classPrivateFieldGetHelper, classPrivateFieldSetHelper, + classPrivateMethodGetHelper, + classPrivateReadonlyHelper, createBindingHelper, setModuleDefaultHelper ], helper => helper.name)); @@ -897,4 +937,4 @@ namespace ts { && (getEmitFlags(firstSegment.expression) & EmitFlags.HelperName) && firstSegment.expression.escapedText === helperName; } -} \ No newline at end of file +} diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index da8c8f35c4aeb..42d47bfcd008d 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -9,16 +9,25 @@ namespace ts { } const enum PrivateIdentifierPlacement { - InstanceField + InstanceField, + InstanceMethod, } - type PrivateIdentifierInfo = PrivateIdentifierInstanceField; + type PrivateIdentifierInfo = + | PrivateIdentifierInstanceField + | PrivateIdentifierInstanceMethod; interface PrivateIdentifierInstanceField { placement: PrivateIdentifierPlacement.InstanceField; weakMapName: Identifier; } + interface PrivateIdentifierInstanceMethod { + placement: PrivateIdentifierPlacement.InstanceMethod; + weakSetName: Identifier; + functionName: Identifier; + } + /** * A mapping of private names to information needed for transformation. */ @@ -147,10 +156,12 @@ namespace ts { case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - case SyntaxKind.MethodDeclaration: // Visit the name of the member (if it's a computed property name). return visitEachChild(node, classElementVisitor, context); + case SyntaxKind.MethodDeclaration: + return visitMethodDeclaration(node as MethodDeclaration); + case SyntaxKind.PropertyDeclaration: return visitPropertyDeclaration(node as PropertyDeclaration); @@ -192,6 +203,46 @@ namespace ts { return node; } + function visitMethodDeclaration(node: MethodDeclaration) { + Debug.assert(!some(node.decorators)); + const transformedMethod = visitEachChild(node, classElementVisitor, context); + + if (!shouldTransformPrivateFields || !isPrivateIdentifier(node.name) || !transformedMethod.body) { + return transformedMethod; + } + + const functionName = getHoistedFunctionName(node); + getPendingExpressions().push( + factory.createAssignment( + functionName, + factory.createFunctionExpression( + transformedMethod.modifiers, + transformedMethod.asteriskToken, + functionName, + transformedMethod.typeParameters, + transformedMethod.parameters, + transformedMethod.type, + transformedMethod.body + ) + ) + ); + + // remove method declaration from class + return undefined; + } + + function getHoistedFunctionName(node: MethodDeclaration) { + Debug.assert(isPrivateIdentifier(node.name)); + const privateIdentifierInfo = accessPrivateIdentifier(node.name); + Debug.assert(privateIdentifierInfo, "Undeclared private name for property declaration."); + + if (privateIdentifierInfo.placement === PrivateIdentifierPlacement.InstanceMethod) { + return privateIdentifierInfo.functionName; + } + + Debug.fail("Unexpected private identifier placement"); + } + function visitPropertyDeclaration(node: PropertyDeclaration) { Debug.assert(!some(node.decorators)); if (!shouldTransformPrivateFields && isPrivateIdentifier(node.name)) { @@ -218,12 +269,20 @@ namespace ts { function createPrivateIdentifierAccess(info: PrivateIdentifierInfo, receiver: Expression): Expression { receiver = visitNode(receiver, visitor, isExpression); + const synthesizedReceiver = nodeIsSynthesized(receiver) ? receiver : factory.cloneNode(receiver); + switch (info.placement) { case PrivateIdentifierPlacement.InstanceField: return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - nodeIsSynthesized(receiver) ? receiver : factory.cloneNode(receiver), + synthesizedReceiver, info.weakMapName ); + case PrivateIdentifierPlacement.InstanceMethod: + return context.getEmitHelperFactory().createClassPrivateMethodGetHelper( + synthesizedReceiver, + info.weakSetName, + info.functionName + ); default: return Debug.fail("Unexpected private identifier placement"); } } @@ -406,9 +465,10 @@ namespace ts { function createPrivateIdentifierAssignment(info: PrivateIdentifierInfo, receiver: Expression, right: Expression, operator: AssignmentOperator) { switch (info.placement) { - case PrivateIdentifierPlacement.InstanceField: { + case PrivateIdentifierPlacement.InstanceField: return createPrivateIdentifierInstanceFieldAssignment(info, receiver, right, operator); - } + case PrivateIdentifierPlacement.InstanceMethod: + return createPrivateIdentifierInstanceMethodAssignment(); default: return Debug.fail("Unexpected private identifier placement"); } } @@ -433,6 +493,10 @@ namespace ts { } } + function createPrivateIdentifierInstanceMethodAssignment() { + return context.getEmitHelperFactory().createClassPrivateReadonlyHelper(); + } + /** * Set up the environment for a class. */ @@ -571,7 +635,7 @@ namespace ts { // Declare private names. for (const member of node.members) { if (isPrivateIdentifierClassElementDeclaration(member)) { - addPrivateIdentifierToEnvironment(member.name); + addPrivateIdentifierToEnvironment(member); } } } @@ -585,8 +649,8 @@ namespace ts { return setTextRange(factory.createNodeArray(members), /*location*/ node.members); } - function isPropertyDeclarationThatRequiresConstructorStatement(member: ClassElement): member is PropertyDeclaration { - if (!isPropertyDeclaration(member) || hasStaticModifier(member) || hasSyntacticModifier(getOriginalNode(member), ModifierFlags.Abstract)) { + function isClassElementThatRequiresConstructorStatement(member: ClassElement) { + if (hasStaticModifier(member) || hasSyntacticModifier(getOriginalNode(member), ModifierFlags.Abstract)) { return false; } if (context.getCompilerOptions().useDefineForClassFields) { @@ -599,8 +663,8 @@ namespace ts { function transformConstructor(node: ClassDeclaration | ClassExpression, isDerivedClass: boolean) { const constructor = visitNode(getFirstConstructorWithBody(node), visitor, isConstructorDeclaration); - const properties = node.members.filter(isPropertyDeclarationThatRequiresConstructorStatement); - if (!some(properties)) { + const elements = node.members.filter(isClassElementThatRequiresConstructorStatement); + if (!some(elements)) { return constructor; } const parameters = visitParameterList(constructor ? constructor.parameters : undefined, visitor, context); @@ -631,9 +695,11 @@ namespace ts { properties = filter(properties, property => !!property.initializer || isPrivateIdentifier(property.name)); } + const privateMethods = filter(getMethods(node, /*isStatic*/ false), method => isPrivateIdentifier(method.name)); + const needsConstructorBody = some(properties) || some(privateMethods); // Only generate synthetic constructor when there are property initializers to move. - if (!constructor && !some(properties)) { + if (!constructor && !needsConstructorBody) { return visitFunctionBody(/*node*/ undefined, visitor, context); } @@ -683,7 +749,10 @@ namespace ts { indexOfFirstStatement = afterParameterProperties; } } - addPropertyStatements(statements, properties, factory.createThis()); + const receiver = factory.createThis(); + // private methods can be called in property initializers, they should execute first. + addMethodStatements(statements, privateMethods, receiver); + addPropertyStatements(statements, properties, receiver); // Add existing statements, skipping the initial super call. if (constructor) { @@ -771,6 +840,7 @@ namespace ts { privateIdentifierInfo.weakMapName ); } + default: return Debug.fail("Unexpected private identifier placement"); } } else { @@ -781,10 +851,6 @@ namespace ts { return undefined; } - if (isPrivateIdentifier(propertyName) && !property.initializer) { - return undefined; - } - const propertyOriginalNode = getOriginalNode(property); if (hasSyntacticModifier(propertyOriginalNode, ModifierFlags.Abstract)) { return undefined; @@ -819,6 +885,51 @@ namespace ts { } } + /** + * Generates access-control initializer for private methods. + * + * @param methods An array of method declarations to transform. + * @param receiver The receiver on which each method should be assigned. + */ + function addMethodStatements(statements: Statement[], methods: readonly (MethodDeclaration)[], receiver: LeftHandSideExpression) { + for (const method of methods) { + const expression = transformMethod(method, receiver); + if (!expression) { + continue; + } + const statement = factory.createExpressionStatement(expression); + statements.push(statement); + } + } + + /** + * Transforms a method declaration to access-control initializer. + * + * @param method The method declaration. + * @param receiver The receiver on which the method should be assigned. + */ + function transformMethod(method: MethodDeclaration, receiver: LeftHandSideExpression) { + if (!shouldTransformPrivateFields || !isPrivateIdentifier(method.name)) { + return; + } + + const privateIdentifierInfo = accessPrivateIdentifier(method.name); + if (privateIdentifierInfo) { + switch (privateIdentifierInfo.placement){ + case PrivateIdentifierPlacement.InstanceMethod: { + return createPrivateInstanceMethodInitializer( + receiver, + privateIdentifierInfo.weakSetName + ); + } + default: return Debug.fail("Unexpected private identifier placement"); + } + } + else { + Debug.fail("Undeclared private name for method declaration."); + } + } + /** * Hooks node substitutions. * @@ -907,21 +1018,57 @@ namespace ts { return pendingExpressions || (pendingExpressions = []); } - function addPrivateIdentifierToEnvironment(name: PrivateIdentifier) { - const text = getTextOfPropertyName(name) as string; - const weakMapName = factory.createUniqueName("_" + text.substring(1), GeneratedIdentifierFlags.Optimistic | GeneratedIdentifierFlags.ReservedInNestedScopes); - hoistVariableDeclaration(weakMapName); - getPrivateIdentifierEnvironment().set(name.escapedText, { placement: PrivateIdentifierPlacement.InstanceField, weakMapName }); - getPendingExpressions().push( - factory.createAssignment( - weakMapName, + function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { + const text = getTextOfPropertyName(node.name) as string; + const accessControlObject = createHoistedVariableForPrivateName(text); + let info: PrivateIdentifierInfo; + const assignmentExpressions: Expression[] = []; + + if (isPropertyDeclaration(node)) { + info = { + placement: PrivateIdentifierPlacement.InstanceField, + weakMapName: accessControlObject + }; + + assignmentExpressions.push(factory.createAssignment( + accessControlObject, factory.createNewExpression( factory.createIdentifier("WeakMap"), /*typeArguments*/ undefined, [] ) - ) - ); + )); + } + else if (isMethodDeclaration(node)) { + const functionName = createHoistedVariableForPrivateName(text); + + info = { + placement: PrivateIdentifierPlacement.InstanceMethod, + weakSetName: accessControlObject, + functionName + }; + + assignmentExpressions.push(factory.createAssignment( + accessControlObject, + factory.createNewExpression( + factory.createIdentifier("WeakSet"), + /*typeArguments*/ undefined, + [] + ) + )); + } + else { + return; + } + + getPrivateIdentifierEnvironment().set(node.name.escapedText, info); + getPendingExpressions().push(...assignmentExpressions); + } + + function createHoistedVariableForPrivateName(privateName: string): Identifier { + const name = factory.createUniqueName("_" + privateName.substring(1), GeneratedIdentifierFlags.Optimistic); + hoistVariableDeclaration(name); + return name; } function accessPrivateIdentifier(name: PrivateIdentifier) { @@ -1073,4 +1220,12 @@ namespace ts { [receiver, initializer || factory.createVoidZero()] ); } + + function createPrivateInstanceMethodInitializer(receiver: LeftHandSideExpression, weakSetName: Identifier) { + return factory.createCallExpression( + factory.createPropertyAccessExpression(weakSetName, "add"), + /*typeArguments*/ undefined, + [receiver] + ); + } } diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index a52cf7c68cdf7..a97b7a084e9f8 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -343,6 +343,16 @@ namespace ts { return filter(node.members, m => isInitializedOrStaticProperty(m, requireInitializer, isStatic)) as PropertyDeclaration[]; } + /** + * Gets all the static or all the instance method declarations of a class. + * + * @param node The class node. + * @param isStatic A value indicating whether to get properties from the static or instance side of the class. + */ + export function getMethods(node: ClassExpression | ClassDeclaration, isStatic: boolean): readonly MethodDeclaration[] { + return filter(node.members, m => isStaticMethodDeclaration(m, isStatic)) as MethodDeclaration[]; + } + /** * Is a class element either a static or an instance property declaration with an initializer? * @@ -365,4 +375,15 @@ namespace ts { return member.kind === SyntaxKind.PropertyDeclaration && (member).initializer !== undefined; } + + /** + * Gets a value indicating whether a class element is either a static or an instance method declaration. + * + * @param member The class element node. + * @param isStatic A value indicating whether the member should be a static or instance member. + */ + export function isStaticMethodDeclaration(member: ClassElement, isStatic: boolean): member is MethodDeclaration { + return isMethodDeclaration(member) && hasStaticModifier(member) === isStatic; + } + } From 04af85d4730b3939ce63e400a5feaf4d9f47ddaa Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 25 Jan 2021 15:50:12 +0000 Subject: [PATCH 06/68] Rename shouldTransformPrivateFields Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 34 ++++++++++++------------ 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 42d47bfcd008d..8bb9889479b8f 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -51,7 +51,7 @@ namespace ts { const compilerOptions = context.getCompilerOptions(); const languageVersion = getEmitScriptTarget(compilerOptions); - const shouldTransformPrivateFields = languageVersion < ScriptTarget.ESNext; + const shouldTransformPrivateElements = languageVersion < ScriptTarget.ESNext; const previousOnSubstituteNode = context.onSubstituteNode; context.onSubstituteNode = onSubstituteNode; @@ -136,7 +136,7 @@ namespace ts { * Replace it with an empty identifier to indicate a problem with the code. */ function visitPrivateIdentifier(node: PrivateIdentifier) { - if (!shouldTransformPrivateFields) { + if (!shouldTransformPrivateElements) { return node; } return setOriginalNode(factory.createIdentifier(""), node); @@ -207,7 +207,7 @@ namespace ts { Debug.assert(!some(node.decorators)); const transformedMethod = visitEachChild(node, classElementVisitor, context); - if (!shouldTransformPrivateFields || !isPrivateIdentifier(node.name) || !transformedMethod.body) { + if (!shouldTransformPrivateElements || !isPrivateIdentifier(node.name) || !transformedMethod.body) { return transformedMethod; } @@ -245,7 +245,7 @@ namespace ts { function visitPropertyDeclaration(node: PropertyDeclaration) { Debug.assert(!some(node.decorators)); - if (!shouldTransformPrivateFields && isPrivateIdentifier(node.name)) { + if (!shouldTransformPrivateElements && isPrivateIdentifier(node.name)) { // Initializer is elided as the field is initialized in transformConstructor. return factory.updatePropertyDeclaration( node, @@ -288,7 +288,7 @@ namespace ts { } function visitPropertyAccessExpression(node: PropertyAccessExpression) { - if (shouldTransformPrivateFields && isPrivateIdentifier(node.name)) { + if (shouldTransformPrivateElements && isPrivateIdentifier(node.name)) { const privateIdentifierInfo = accessPrivateIdentifier(node.name); if (privateIdentifierInfo) { return setOriginalNode( @@ -301,7 +301,7 @@ namespace ts { } function visitPrefixUnaryExpression(node: PrefixUnaryExpression) { - if (shouldTransformPrivateFields && isPrivateIdentifierPropertyAccessExpression(node.operand)) { + if (shouldTransformPrivateElements && isPrivateIdentifierPropertyAccessExpression(node.operand)) { const operator = node.operator === SyntaxKind.PlusPlusToken ? SyntaxKind.PlusToken : node.operator === SyntaxKind.MinusMinusToken ? SyntaxKind.MinusToken : undefined; @@ -327,7 +327,7 @@ namespace ts { } function visitPostfixUnaryExpression(node: PostfixUnaryExpression, valueIsDiscarded: boolean) { - if (shouldTransformPrivateFields && isPrivateIdentifierPropertyAccessExpression(node.operand)) { + if (shouldTransformPrivateElements && isPrivateIdentifierPropertyAccessExpression(node.operand)) { const operator = node.operator === SyntaxKind.PlusPlusToken ? SyntaxKind.PlusToken : node.operator === SyntaxKind.MinusMinusToken ? SyntaxKind.MinusToken : undefined; @@ -393,7 +393,7 @@ namespace ts { } function visitCallExpression(node: CallExpression) { - if (shouldTransformPrivateFields && isPrivateIdentifierPropertyAccessExpression(node.expression)) { + if (shouldTransformPrivateElements && isPrivateIdentifierPropertyAccessExpression(node.expression)) { // Transform call expressions of private names to properly bind the `this` parameter. const { thisArg, target } = factory.createCallBinding(node.expression, hoistVariableDeclaration, languageVersion); if (isCallChain(node)) { @@ -416,7 +416,7 @@ namespace ts { } function visitTaggedTemplateExpression(node: TaggedTemplateExpression) { - if (shouldTransformPrivateFields && isPrivateIdentifierPropertyAccessExpression(node.tag)) { + if (shouldTransformPrivateElements && isPrivateIdentifierPropertyAccessExpression(node.tag)) { // Bind the `this` correctly for tagged template literals when the tag is a private identifier property access. const { thisArg, target } = factory.createCallBinding(node.tag, hoistVariableDeclaration, languageVersion); return factory.updateTaggedTemplateExpression( @@ -434,7 +434,7 @@ namespace ts { } function visitBinaryExpression(node: BinaryExpression) { - if (shouldTransformPrivateFields) { + if (shouldTransformPrivateElements) { if (isDestructuringAssignment(node)) { const savedPendingExpressions = pendingExpressions; pendingExpressions = undefined!; @@ -503,7 +503,7 @@ namespace ts { function visitClassLike(node: ClassLikeDeclaration) { const savedPendingExpressions = pendingExpressions; pendingExpressions = undefined; - if (shouldTransformPrivateFields) { + if (shouldTransformPrivateElements) { startPrivateIdentifierEnvironment(); } @@ -511,7 +511,7 @@ namespace ts { visitClassDeclaration(node) : visitClassExpression(node); - if (shouldTransformPrivateFields) { + if (shouldTransformPrivateElements) { endPrivateIdentifierEnvironment(); } pendingExpressions = savedPendingExpressions; @@ -519,7 +519,7 @@ namespace ts { } function doesClassElementNeedTransform(node: ClassElement) { - return isPropertyDeclaration(node) || (shouldTransformPrivateFields && node.name && isPrivateIdentifier(node.name)); + return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } function visitClassDeclaration(node: ClassDeclaration) { @@ -631,7 +631,7 @@ namespace ts { } function transformClassMembers(node: ClassDeclaration | ClassExpression, isDerivedClass: boolean) { - if (shouldTransformPrivateFields) { + if (shouldTransformPrivateElements) { // Declare private names. for (const member of node.members) { if (isPrivateIdentifierClassElementDeclaration(member)) { @@ -658,7 +658,7 @@ namespace ts { // then we don't need to transform any class properties. return languageVersion < ScriptTarget.ESNext; } - return isInitializedProperty(member) || shouldTransformPrivateFields && isPrivateIdentifierClassElementDeclaration(member); + return isInitializedProperty(member) || shouldTransformPrivateElements && isPrivateIdentifierClassElementDeclaration(member); } function transformConstructor(node: ClassDeclaration | ClassExpression, isDerivedClass: boolean) { @@ -829,7 +829,7 @@ namespace ts { ? factory.updateComputedPropertyName(property.name, factory.getGeneratedNameForNode(property.name)) : property.name; - if (shouldTransformPrivateFields && isPrivateIdentifier(propertyName)) { + if (shouldTransformPrivateElements && isPrivateIdentifier(propertyName)) { const privateIdentifierInfo = accessPrivateIdentifier(propertyName); if (privateIdentifierInfo) { switch (privateIdentifierInfo.placement) { @@ -909,7 +909,7 @@ namespace ts { * @param receiver The receiver on which the method should be assigned. */ function transformMethod(method: MethodDeclaration, receiver: LeftHandSideExpression) { - if (!shouldTransformPrivateFields || !isPrivateIdentifier(method.name)) { + if (!shouldTransformPrivateElements || !isPrivateIdentifier(method.name)) { return; } From f048d721a0f2e3aca56fe150cc798a35f8dbcaaa Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 25 Jan 2021 15:50:22 +0000 Subject: [PATCH 07/68] Accept baseline Signed-off-by: Kubilay Kahveci --- .../reference/privateNameAccessors.js | 22 +---- .../reference/privateNameAccessorsAccess.js | 13 +-- .../privateNameAccessorsCallExpression.js | 73 ++++++++++------ .../privateNameAccessorssDerivedClasses.js | 9 +- .../privateNameConstructorReserved.js | 8 +- .../privateNameES5Ban(target=es3).js | 7 +- .../privateNameES5Ban(target=es5).js | 7 +- .../baselines/reference/privateNameMethod.js | 24 ++--- .../reference/privateNameMethodAccess.js | 20 ++--- .../reference/privateNameMethodAssignment.js | 36 ++++---- .../privateNameMethodCallExpression.js | 87 +++++++------------ .../privateNameMethodsDerivedClasses.js | 18 ++-- ...rivateNameNestedClassAccessorsShadowing.js | 12 +-- .../privateNameNestedClassMethodShadowing.js | 26 +++--- .../reference/privateNamesAndDecorators.js | 6 +- .../privateNamesAndGenericClasses-2.js | 18 ++-- .../reference/privateNamesAndkeyof.js | 50 ++++------- .../reference/privateNamesInGenericClasses.js | 24 +++-- .../privateNamesIncompatibleModifiers.js | 22 ++--- .../reference/privateNamesUseBeforeDef.js | 24 +++-- 20 files changed, 232 insertions(+), 274 deletions(-) diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index 19376cb013e37..6e25fb62c47de 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -16,29 +16,15 @@ class A1 { //// [privateNameAccessors.js] "use strict"; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; var _prop, _prop_1, _roProp; class A1 { constructor(name) { - __classPrivateFieldSet(this, _prop_1, ""); - __classPrivateFieldSet(this, _roProp, ""); // Error - console.log(__classPrivateFieldGet(this, _prop_1)); - console.log(__classPrivateFieldGet(this, _roProp)); + this. = ""; + this. = ""; // Error + console.log(this.); + console.log(this.); } get () { return ""; } set (param) { } get () { return ""; } } -_prop = new WeakMap(), _prop_1 = new WeakMap(), _roProp = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js index 1e650648b504b..2550a386096fa 100644 --- a/tests/baselines/reference/privateNameAccessorsAccess.js +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -26,26 +26,19 @@ class B2 { //// [privateNameAccessorsAccess.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; var _prop, _prop_1; class A2 { constructor() { - console.log(__classPrivateFieldGet(this, _prop_1)); + console.log(this.); let a = this; - __classPrivateFieldGet(a, _prop_1); + a.; function foo() { - __classPrivateFieldGet(a, _prop_1); + a.; } } get () { return ""; } set (param) { } } -_prop = new WeakMap(), _prop_1 = new WeakMap(); new A2().; // Error function foo() { new A2().; // Error diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js index cc113bc5d513c..297c6b72eea07 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -18,32 +18,49 @@ class A { getInstance() { return new A(); } } -//// [privateNameAccessorsCallExpression.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var _fieldFunc, _fieldFunc2; -class A { - constructor() { - this.x = 1; - } - get () { return function () { this.x = 10; }; } - get () { return function (a, ...b) { }; } - test() { - var _a; - __classPrivateFieldGet(this, _fieldFunc).call(this); - const func = __classPrivateFieldGet(this, _fieldFunc); - func(); - new (__classPrivateFieldGet(this, _fieldFunc))(); - const arr = [1, 2]; - __classPrivateFieldGet(this, _fieldFunc2).call(this, 0, ...arr, 3); - const b = new (__classPrivateFieldGet(this, _fieldFunc2))(0, ...arr, 3); - const str = __classPrivateFieldGet(this, _fieldFunc2).bind(this) `head${1}middle${2}tail`; - __classPrivateFieldGet((_a = this.getInstance()), _fieldFunc2).bind(_a) `test${1}and${2}`; +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(10,14): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(11,27): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(13,18): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(15,14): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(16,28): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(17,26): error TS1003: Identifier expected. +tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(18,35): error TS1003: Identifier expected. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js (7 errors) ==== + var _fieldFunc, _fieldFunc2; + class A { + constructor() { + this.x = 1; + } + get () { return function () { this.x = 10; }; } + get () { return function (a, ...b) { }; } + test() { + var _a; + this..call(this); + ~ +!!! error TS1003: Identifier expected. + const func = this.; + ~ +!!! error TS1003: Identifier expected. + func(); + new this.(); + ~ +!!! error TS1003: Identifier expected. + const arr = [1, 2]; + this..call(this, 0, ...arr, 3); + ~ +!!! error TS1003: Identifier expected. + const b = new this.(0, ...arr, 3); + ~ +!!! error TS1003: Identifier expected. + const str = this..bind(this) `head${1}middle${2}tail`; + ~ +!!! error TS1003: Identifier expected. + (_a = this.getInstance())..bind(_a) `test${1}and${2}`; + ~ +!!! error TS1003: Identifier expected. + } + getInstance() { return new A(); } } - getInstance() { return new A(); } -} -_fieldFunc = new WeakMap(), _fieldFunc2 = new WeakMap(); + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js index f88ea3e4d7b6d..bce3c2b53f3a9 100644 --- a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -13,20 +13,13 @@ class Derived extends Base { //// [privateNameAccessorssDerivedClasses.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; var _prop; class Base { get () { return 123; } static method(x) { - console.log(__classPrivateFieldGet(x, _prop)); + console.log(x.); } } -_prop = new WeakMap(); class Derived extends Base { static method(x) { console.log(x.); diff --git a/tests/baselines/reference/privateNameConstructorReserved.js b/tests/baselines/reference/privateNameConstructorReserved.js index ea3c83b9eaae3..03520a377abe2 100644 --- a/tests/baselines/reference/privateNameConstructorReserved.js +++ b/tests/baselines/reference/privateNameConstructorReserved.js @@ -5,8 +5,10 @@ class A { //// [privateNameConstructorReserved.js] -var _constructor; +var _constructor, _constructor_1; class A { - () { } // Error: `#constructor` is a reserved word. + constructor() { + _constructor.add(this); + } } -_constructor = new WeakMap(); +_constructor = new WeakSet(), _constructor_1 = function _constructor_1() { }; diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index 431eaba29e7cf..7db5b048b8314 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -16,10 +16,9 @@ class A { //// [privateNameES5Ban.js] var A = /** @class */ (function () { function A() { + _method.add(this); _field.set(this, 123); } - A.prototype. = function () { }; - A. = function () { }; Object.defineProperty(A.prototype, "", { get: function () { return ""; }, set: function (x) { }, @@ -32,8 +31,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _method, _sField, _sMethod, _acc, _acc_1, _sAcc, _sAcc_1; - _field = new WeakMap(), _method = new WeakMap(), _sField = new WeakMap(), _sMethod = new WeakMap(), _acc = new WeakMap(), _acc_1 = new WeakMap(), _sAcc = new WeakMap(), _sAcc_1 = new WeakMap(); + var _field, _method, _method_1, _sField, _sMethod, _sMethod_1, _acc, _acc_1, _sAcc, _sAcc_1; + _field = new WeakMap(), _method = new WeakSet(), _sField = new WeakMap(), _sMethod = new WeakSet(), _method_1 = function _method_1() { }, _sMethod_1 = function _sMethod_1() { }; _sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index 431eaba29e7cf..7db5b048b8314 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -16,10 +16,9 @@ class A { //// [privateNameES5Ban.js] var A = /** @class */ (function () { function A() { + _method.add(this); _field.set(this, 123); } - A.prototype. = function () { }; - A. = function () { }; Object.defineProperty(A.prototype, "", { get: function () { return ""; }, set: function (x) { }, @@ -32,8 +31,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _method, _sField, _sMethod, _acc, _acc_1, _sAcc, _sAcc_1; - _field = new WeakMap(), _method = new WeakMap(), _sField = new WeakMap(), _sMethod = new WeakMap(), _acc = new WeakMap(), _acc_1 = new WeakMap(), _sAcc = new WeakMap(), _sAcc_1 = new WeakMap(); + var _field, _method, _method_1, _sField, _sMethod, _sMethod_1, _acc, _acc_1, _sAcc, _sAcc_1; + _field = new WeakMap(), _method = new WeakSet(), _sField = new WeakMap(), _sMethod = new WeakSet(), _method_1 = function _method_1() { }, _sMethod_1 = function _sMethod_1() { }; _sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js index 47fcf7964d955..cd56a5854583e 100644 --- a/tests/baselines/reference/privateNameMethod.js +++ b/tests/baselines/reference/privateNameMethod.js @@ -14,22 +14,22 @@ class A1 { //// [privateNameMethod.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); } - return privateMap.get(receiver); + return fn; }; -var _method; +var _method, _method_1; class A1 { constructor(name) { - __classPrivateFieldGet(this, _method).call(this, ""); - __classPrivateFieldGet(this, _method).call(this, 1); // Error - __classPrivateFieldGet(this, _method).call(// Error + _method.add(this); + __classPrivateMethodGet(this, _method, _method_1).call(this, ""); + __classPrivateMethodGet(this, _method, _method_1).call(this, 1); // Error + __classPrivateMethodGet(this, _method, _method_1).call(// Error this); // Error } - (param) { - return ""; - } } -_method = new WeakMap(); +_method = new WeakSet(), _method_1 = function _method_1(param) { + return ""; +}; diff --git a/tests/baselines/reference/privateNameMethodAccess.js b/tests/baselines/reference/privateNameMethodAccess.js index 2a42bead50f92..c458a0b48f24c 100644 --- a/tests/baselines/reference/privateNameMethodAccess.js +++ b/tests/baselines/reference/privateNameMethodAccess.js @@ -24,25 +24,25 @@ class B2 { //// [privateNameMethodAccess.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); } - return privateMap.get(receiver); + return fn; }; -var _method, _a; +var _method, _method_1, _a; class A2 { constructor() { - console.log(__classPrivateFieldGet(this, _method)); + _method.add(this); + console.log(__classPrivateMethodGet(this, _method, _method_1)); let a = this; - __classPrivateFieldGet(a, _method).call(a); + __classPrivateMethodGet(a, _method, _method_1).call(a); function foo() { - __classPrivateFieldGet(a, _method).call(a); + __classPrivateMethodGet(a, _method, _method_1).call(a); } } - () { return ""; } } -_method = new WeakMap(); +_method = new WeakSet(), _method_1 = function _method_1() { return ""; }; (_a = new A2())..call(_a); // Error function foo() { var _a; diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js index 407206bee54c0..0b410dba47ff1 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.js +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -13,33 +13,27 @@ class A3 { //// [privateNameMethodAssignment.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { + throw new TypeError("private element is not writable"); }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); } - return privateMap.get(receiver); + return fn; }; -var _method; +var _method, _method_1; class A3 { constructor(a, b) { var _a, _b; - __classPrivateFieldSet(this, _method, () => { }); // Error, not writable - __classPrivateFieldSet(// Error, not writable - a, _method, () => { }); // Error, not writable - __classPrivateFieldSet(// Error, not writable - b, _method, () => { }); //Error, not writable - (_a = this, { x: ({ set value(_b) { __classPrivateFieldSet(_a, _method, _b); } }).value } = { x: () => { } }); //Error, not writable - let x = __classPrivateFieldGet(this, _method); - __classPrivateFieldSet(_b = b, _method, +__classPrivateFieldGet(_b, _method) + 1); //Error, not writable + _method.add(this); + __classPrivateReadonly(); // Error, not writable + __classPrivateReadonly(); // Error, not writable + __classPrivateReadonly(); //Error, not writable + (_a = this, { x: ({ set value(_b) { __classPrivateReadonly(); } }).value } = { x: () => { } }); //Error, not writable + let x = __classPrivateMethodGet(this, _method, _method_1); + __classPrivateReadonly(); //Error, not writable } - () { } ; } -_method = new WeakMap(); +_method = new WeakSet(), _method_1 = function _method_1() { }; diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js index f9ee44f4b73c7..f3621470dfd2e 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.js +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -24,58 +24,37 @@ class AA { } -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(12,5): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(12,8): error TS1005: '=>' expected. -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(14,15): error TS1005: '=>' expected. -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(16,12): error TS1005: ';' expected. -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(31,19): error TS1005: ';' expected. -tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js(32,1): error TS1128: Declaration or statement expected. - - -==== tests/cases/conformance/classes/members/privateNames/privateNameMethodCallExpression.js (6 errors) ==== - var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); - }; - var _method, _method2; - class AA { - constructor() { - this.x = 1; - } - () { this.x = 10; } - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. - ~ -!!! error TS1005: '=>' expected. - ; - (a, ...b) { } - ~ -!!! error TS1005: '=>' expected. - ; - test() { - ~ -!!! error TS1005: ';' expected. - var _a, _b, _c; - __classPrivateFieldGet(this, _method).call(this); - const func = __classPrivateFieldGet(this, _method); - func(); - new (__classPrivateFieldGet(this, _method))(); - const arr = [1, 2]; - __classPrivateFieldGet(this, _method2).call(this, 0, ...arr, 3); - const b = new (__classPrivateFieldGet(this, _method2))(0, ...arr, 3); //Error - const str = __classPrivateFieldGet(this, _method2).bind(this) `head${1}middle${2}tail`; - __classPrivateFieldGet((_a = this.getInstance()), _method2).bind(_a) `test${1}and${2}`; - __classPrivateFieldGet((_b = this.getInstance()), _method2).call(_b, 0, ...arr, 3); - const b2 = new (__classPrivateFieldGet(this.getInstance(), _method2))(0, ...arr, 3); //Error - const str2 = __classPrivateFieldGet((_c = this.getInstance()), _method2).bind(_c) `head${1}middle${2}tail`; - } - getInstance() { return new AA(); } - ~ -!!! error TS1005: ';' expected. +//// [privateNameMethodCallExpression.js] +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _method, _method_1, _method2, _method2_1; +class AA { + constructor() { + _method.add(this); + _method2.add(this); + this.x = 1; + } + ; + ; + test() { + var _a, _b, _c; + __classPrivateMethodGet(this, _method, _method_1).call(this); + const func = __classPrivateMethodGet(this, _method, _method_1); + func(); + new (__classPrivateMethodGet(this, _method, _method_1))(); + const arr = [1, 2]; + __classPrivateMethodGet(this, _method2, _method2_1).call(this, 0, ...arr, 3); + const b = new (__classPrivateMethodGet(this, _method2, _method2_1))(0, ...arr, 3); //Error + const str = __classPrivateMethodGet(this, _method2, _method2_1).bind(this) `head${1}middle${2}tail`; + __classPrivateMethodGet((_a = this.getInstance()), _method2, _method2_1).bind(_a) `test${1}and${2}`; + __classPrivateMethodGet((_b = this.getInstance()), _method2, _method2_1).call(_b, 0, ...arr, 3); + const b2 = new (__classPrivateMethodGet(this.getInstance(), _method2, _method2_1))(0, ...arr, 3); //Error + const str2 = __classPrivateMethodGet((_c = this.getInstance()), _method2, _method2_1).bind(_c) `head${1}middle${2}tail`; } - ~ -!!! error TS1128: Declaration or statement expected. - _method = new WeakMap(), _method2 = new WeakMap(); - \ No newline at end of file + getInstance() { return new AA(); } +} +_method = new WeakSet(), _method2 = new WeakSet(), _method_1 = function _method_1() { this.x = 10; }, _method2_1 = function _method2_1(a, ...b) { }; diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.js b/tests/baselines/reference/privateNameMethodsDerivedClasses.js index 44fe2875de037..f9ef2fd785799 100644 --- a/tests/baselines/reference/privateNameMethodsDerivedClasses.js +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.js @@ -13,20 +13,22 @@ class Derived extends Base { //// [privateNameMethodsDerivedClasses.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); } - return privateMap.get(receiver); + return fn; }; -var _prop; +var _prop, _prop_1; class Base { - () { return 123; } + constructor() { + _prop.add(this); + } static method(x) { - console.log(__classPrivateFieldGet(x, _prop).call(x)); + console.log(__classPrivateMethodGet(x, _prop, _prop_1).call(x)); } } -_prop = new WeakMap(); +_prop = new WeakSet(), _prop_1 = function _prop_1() { return 123; }; class Derived extends Base { static method(x) { console.log(x..call(x)); diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js index d7a1c97b33b26..8fcf71948a055 100644 --- a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -16,12 +16,6 @@ class Base { //// [privateNameNestedClassAccessorsShadowing.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; var _x; class Base { constructor() { @@ -30,15 +24,13 @@ class Base { get () { return 1; } ; testBase(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(x.); } testDerived(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(x.); } } - _x_1 = new WeakMap(); } get () { return 1; } ; } -_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js index 3ad246554754b..0c27933904bcb 100644 --- a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js @@ -16,29 +16,31 @@ class Base { //// [privateNameNestedClassMethodShadowing.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); } - return privateMap.get(receiver); + return fn; }; -var _x; +var _x, _x_1; class Base { constructor() { - var _x_1; + var _x_2, _x_3; + _x.add(this); class Derived { - () { } + constructor() { + _x_2.add(this); + } ; testBase(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(__classPrivateMethodGet(x, _x_2, _x_3)); } testDerived(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(__classPrivateMethodGet(x, _x_2, _x_3)); } } - _x_1 = new WeakMap(); + _x_2 = new WeakSet(), _x_3 = function _x_3() { }; } - () { } ; } -_x = new WeakMap(); +_x = new WeakSet(), _x_1 = function _x_1() { }; diff --git a/tests/baselines/reference/privateNamesAndDecorators.js b/tests/baselines/reference/privateNamesAndDecorators.js index 65011d85f169d..980a929454ef9 100644 --- a/tests/baselines/reference/privateNamesAndDecorators.js +++ b/tests/baselines/reference/privateNamesAndDecorators.js @@ -10,12 +10,12 @@ class A { //// [privateNamesAndDecorators.js] -var _foo, _bar; +var _foo, _bar, _bar_1; var A = /** @class */ (function () { function A() { + _bar.add(this); _foo.set(this, 1); } - A.prototype. = function () { }; return A; }()); -_foo = new WeakMap(), _bar = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakSet(), _bar_1 = function _bar_1() { }; diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index 84710604b9dcc..c2ddf072fdcf1 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -36,21 +36,25 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return privateMap.get(receiver); }; -var _foo, _bar; +var _foo, _bar, _bar_1; class C { constructor(t) { + _bar.add(this); _foo.set(this, void 0); __classPrivateFieldSet(this, _foo, t); - t = __classPrivateFieldGet(this, _bar).call(this); - } - () { - return __classPrivateFieldGet(this, _foo); + t = __classPrivateMethodGet(this, _bar, _bar_1).call(this); } set baz(t) { __classPrivateFieldSet(this, _foo, t); @@ -59,7 +63,9 @@ class C { return __classPrivateFieldGet(this, _foo); } } -_foo = new WeakMap(), _bar = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakSet(), _bar_1 = function _bar_1() { + return __classPrivateFieldGet(this, _foo); +}; let a = new C(3); let b = new C("hello"); a.baz = 5; // OK diff --git a/tests/baselines/reference/privateNamesAndkeyof.js b/tests/baselines/reference/privateNamesAndkeyof.js index 5a393e864d1fd..46d4bcf36cb41 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.js +++ b/tests/baselines/reference/privateNamesAndkeyof.js @@ -11,38 +11,20 @@ class A { type T = keyof A // should not include '#foo*' -tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(9,5): error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. -tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(9,8): error TS1005: '=>' expected. -tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(11,12): error TS1005: ';' expected. -tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(13,17): error TS1005: ';' expected. -tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js(15,1): error TS1128: Declaration or statement expected. - - -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndkeyof.js (5 errors) ==== - "use strict"; - var _fooField, _fooMethod, _fooProp, _fooProp_1; - class A { - constructor() { - _fooField.set(this, 3); - this.bar = 3; - this.baz = 3; - } - () { } - ~ -!!! error TS1068: Unexpected token. A constructor, method, accessor, or property was expected. - ~ -!!! error TS1005: '=>' expected. - ; - get () { return 1; } - ~ -!!! error TS1005: ';' expected. - ; - set (value) { } - ~ -!!! error TS1005: ';' expected. - ; +//// [privateNamesAndkeyof.js] +"use strict"; +var _fooField, _fooMethod, _fooMethod_1, _fooProp, _fooProp_1; +class A { + constructor() { + _fooMethod.add(this); + _fooField.set(this, 3); + this.bar = 3; + this.baz = 3; } - ~ -!!! error TS1128: Declaration or statement expected. - _fooField = new WeakMap(), _fooMethod = new WeakMap(), _fooProp = new WeakMap(), _fooProp_1 = new WeakMap(); - \ No newline at end of file + ; + get () { return 1; } + ; + set (value) { } + ; +} +_fooField = new WeakMap(), _fooMethod = new WeakSet(), _fooMethod_1 = function _fooMethod_1() { }; diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index fdabcf6787143..cdf92030f3742 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -42,25 +42,31 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _foo, _method, _prop, _prop_1; +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _foo, _method, _method_1, _prop, _prop_1; class C { constructor() { + _method.add(this); _foo.set(this, void 0); } - () { return __classPrivateFieldGet(this, _foo); } get () { return __classPrivateFieldGet(this, _foo); } set (value) { __classPrivateFieldSet(this, _foo, value); } bar(x) { return __classPrivateFieldGet(x, _foo); } // OK - bar2(x) { return __classPrivateFieldGet(x, _method).call(x); } // OK - bar3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK + bar2(x) { return __classPrivateMethodGet(x, _method, _method_1).call(x); } // OK + bar3(x) { return x.; } // OK baz(x) { return __classPrivateFieldGet(x, _foo); } // OK - baz2(x) { return __classPrivateFieldGet(x, _method); } // OK - baz3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK + baz2(x) { return __classPrivateMethodGet(x, _method, _method_1); } // OK + baz3(x) { return x.; } // OK quux(x) { return __classPrivateFieldGet(x, _foo); } // OK - quux2(x) { return __classPrivateFieldGet(x, _method); } // OK - quux3(x) { return __classPrivateFieldGet(x, _prop_1); } // OK + quux2(x) { return __classPrivateMethodGet(x, _method, _method_1); } // OK + quux3(x) { return x.; } // OK } -_foo = new WeakMap(), _method = new WeakMap(), _prop = new WeakMap(), _prop_1 = new WeakMap(); +_foo = new WeakMap(), _method = new WeakSet(), _method_1 = function _method_1() { return __classPrivateFieldGet(this, _foo); }; a.; // Error a.; // Error a.; // Error diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index c7618c5c580ef..6068d8ea69098 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -57,23 +57,21 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; -var _foo, _bar, _baz, _qux, _fooMethod, _barMethod, _bazMethod, _quxMethod, _asyncMethod, _genMethod, _asyncGenMethod, _fooProp, _fooProp_1, _barProp, _barProp_1, _bazProp, _bazProp_1, _quxProp, _quxProp_1, _whatProp, _whatProp_1, _asyncProp, _asyncProp_1; +var _foo, _bar, _baz, _qux, _fooMethod, _fooMethod_1, _barMethod, _barMethod_1, _bazMethod, _bazMethod_1, _quxMethod, _quxMethod_1, _asyncMethod, _asyncMethod_1, _genMethod, _genMethod_1, _asyncGenMethod, _asyncGenMethod_1, _fooProp, _fooProp_1, _barProp, _barProp_1, _bazProp, _bazProp_1, _quxProp, _quxProp_1, _whatProp, _whatProp_1, _asyncProp, _asyncProp_1; class A { constructor() { + _fooMethod.add(this); + _barMethod.add(this); + _bazMethod.add(this); + _quxMethod.add(this); + _asyncMethod.add(this); + _genMethod.add(this); + _asyncGenMethod.add(this); _foo.set(this, 3); // Error _bar.set(this, 3); // Error _baz.set(this, 3); // Error _qux.set(this, 3); // OK } - () { return 3; } // Error - () { return 3; } // Error - () { return 3; } // Error - () { return 3; } // Error - () { - return __awaiter(this, void 0, void 0, function* () { return 1; }); - } //OK - *() { return 1; } //OK - () { return __asyncGenerator(this, arguments, function* _a() { return yield __await(1); }); } //OK get () { return 3; } // Error set (value) { } // Error get () { return 3; } // Error @@ -87,6 +85,8 @@ class A { get () { return 1; } // Error set (value) { } // Error } -_foo = new WeakMap(), _bar = new WeakMap(), _baz = new WeakMap(), _qux = new WeakMap(), _fooMethod = new WeakMap(), _barMethod = new WeakMap(), _bazMethod = new WeakMap(), _quxMethod = new WeakMap(), _asyncMethod = new WeakMap(), _genMethod = new WeakMap(), _asyncGenMethod = new WeakMap(), _fooProp = new WeakMap(), _fooProp_1 = new WeakMap(), _barProp = new WeakMap(), _barProp_1 = new WeakMap(), _bazProp = new WeakMap(), _bazProp_1 = new WeakMap(), _quxProp = new WeakMap(), _quxProp_1 = new WeakMap(), _whatProp = new WeakMap(), _whatProp_1 = new WeakMap(), _asyncProp = new WeakMap(), _asyncProp_1 = new WeakMap(); +_foo = new WeakMap(), _bar = new WeakMap(), _baz = new WeakMap(), _qux = new WeakMap(), _fooMethod = new WeakSet(), _barMethod = new WeakSet(), _bazMethod = new WeakSet(), _quxMethod = new WeakSet(), _asyncMethod = new WeakSet(), _genMethod = new WeakSet(), _asyncGenMethod = new WeakSet(), _fooMethod_1 = function _fooMethod_1() { return 3; }, _barMethod_1 = function _barMethod_1() { return 3; }, _bazMethod_1 = function _bazMethod_1() { return 3; }, _quxMethod_1 = function _quxMethod_1() { return 3; }, _asyncMethod_1 = function _asyncMethod_1() { + return __awaiter(this, void 0, void 0, function* () { return 1; }); +}, _genMethod_1 = function* _genMethod_1() { return 1; }, _asyncGenMethod_1 = function _asyncGenMethod_1() { return __asyncGenerator(this, arguments, function* _asyncGenMethod_1_1() { return yield __await(1); }); }; class B { } diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index 3edacd1f870d5..9c9aa7fab81de 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -27,7 +27,13 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _foo_1, _bar_1, _foo_2, _bar_2, _foo_3, _bar_3; +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { + if (!accessCheck.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _foo, _bar, _foo_1, _bar_1, _bar_2, _foo_2, _bar_3, _foo_3, _bar_4; class A { constructor() { _foo.set(this, __classPrivateFieldGet(this, _bar)); // Error @@ -37,24 +43,24 @@ class A { _foo = new WeakMap(), _bar = new WeakMap(); class A2 { constructor() { - _foo_1.set(this, __classPrivateFieldGet(this, _bar_1).call(this)); // No Error + _bar_1.add(this); + _foo_1.set(this, __classPrivateMethodGet(this, _bar_1, _bar_2).call(this)); // No Error } - () { return 3; } ; } -_foo_1 = new WeakMap(), _bar_1 = new WeakMap(); +_foo_1 = new WeakMap(), _bar_1 = new WeakSet(), _bar_2 = function _bar_2() { return 3; }; class A3 { constructor() { - _foo_2.set(this, __classPrivateFieldGet(this, _bar_2)); // No Error + _foo_2.set(this, this.); // No Error } get () { return 3; } ; } -_foo_2 = new WeakMap(), _bar_2 = new WeakMap(); +_foo_2 = new WeakMap(); class B { constructor() { - _foo_3.set(this, __classPrivateFieldGet(this, _bar_3)); // Error - _bar_3.set(this, __classPrivateFieldGet(this, _foo_3)); + _foo_3.set(this, __classPrivateFieldGet(this, _bar_4)); // Error + _bar_4.set(this, __classPrivateFieldGet(this, _foo_3)); } } -_foo_3 = new WeakMap(), _bar_3 = new WeakMap(); +_foo_3 = new WeakMap(), _bar_4 = new WeakMap(); From f8cfb8175b86527d70c17ac78aaf578f6b5131ef Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 11:35:43 +0000 Subject: [PATCH 08/68] Use a single WeakSet for brand-check Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 10 +-- src/compiler/transformers/classFields.ts | 105 ++++++++++++++++------- 2 files changed, 79 insertions(+), 36 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 2cace67076460..3fa1d500aa826 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -34,7 +34,7 @@ namespace ts { // Class Fields Helpers createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier): Expression; createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; - createClassPrivateMethodGetHelper(receiver: Expression, accessCheck: Identifier, fn: Identifier): Expression; + createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; createClassPrivateReadonlyHelper(): Expression; } @@ -382,9 +382,9 @@ namespace ts { return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, privateField, value]); } - function createClassPrivateMethodGetHelper(receiver: Expression, accessCheck: Identifier, fn: Identifier) { + function createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) { context.requestEmitHelper(classPrivateMethodGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, accessCheck, fn]); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); } function createClassPrivateReadonlyHelper() { @@ -864,8 +864,8 @@ namespace ts { importName: "__classPrivateMethodGet", scoped: false, text: ` - var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { + var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 8bb9889479b8f..18e18ab60c45a 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -24,14 +24,24 @@ namespace ts { interface PrivateIdentifierInstanceMethod { placement: PrivateIdentifierPlacement.InstanceMethod; - weakSetName: Identifier; functionName: Identifier; } - /** - * A mapping of private names to information needed for transformation. - */ - type PrivateIdentifierEnvironment = UnderscoreEscapedMap; + interface PrivateIdentifierEnvironment { + /** + * Used for prefixing generated variable names. + */ + className: string; + hasPrivateMethods: boolean; + /** + * Used for brand check on private methods. + */ + weakSetName: Identifier; + /** + * A mapping of private names to information needed for transformation. + */ + identifiers: UnderscoreEscapedMap + } /** * Transforms ECMAScript Class Syntax. @@ -280,7 +290,7 @@ namespace ts { case PrivateIdentifierPlacement.InstanceMethod: return context.getEmitHelperFactory().createClassPrivateMethodGetHelper( synthesizedReceiver, - info.weakSetName, + getPrivateIdentifierEnvironment().weakSetName, info.functionName ); default: return Debug.fail("Unexpected private identifier placement"); @@ -505,6 +515,11 @@ namespace ts { pendingExpressions = undefined; if (shouldTransformPrivateElements) { startPrivateIdentifierEnvironment(); + + const name = getNameOfDeclaration(node); + if (name && isIdentifier(name)) { + getPrivateIdentifierEnvironment().className = name.escapedText as string; + } } const result = isClassDeclaration(node) ? @@ -638,6 +653,8 @@ namespace ts { addPrivateIdentifierToEnvironment(member); } } + + createBrandCheckWeakSetForPrivateMethods(); } const members: ClassElement[] = []; @@ -649,6 +666,27 @@ namespace ts { return setTextRange(factory.createNodeArray(members), /*location*/ node.members); } + function createBrandCheckWeakSetForPrivateMethods() { + const env = getPrivateIdentifierEnvironment(); + if (!env.hasPrivateMethods) { + return; + } + + const weakSetName = createHoistedVariableForClass("instances"); + env.weakSetName = weakSetName; + + getPendingExpressions().push( + factory.createAssignment( + env.weakSetName, + factory.createNewExpression( + factory.createIdentifier("WeakSet"), + /*typeArguments*/ undefined, + [] + ) + ) + ); + } + function isClassElementThatRequiresConstructorStatement(member: ClassElement) { if (hasStaticModifier(member) || hasSyntacticModifier(getOriginalNode(member), ModifierFlags.Abstract)) { return false; @@ -886,7 +924,7 @@ namespace ts { } /** - * Generates access-control initializer for private methods. + * Generates brand-check initializer for private methods. * * @param methods An array of method declarations to transform. * @param receiver The receiver on which each method should be assigned. @@ -903,7 +941,7 @@ namespace ts { } /** - * Transforms a method declaration to access-control initializer. + * Transforms a method declaration to brand-check initializer. * * @param method The method declaration. * @param receiver The receiver on which the method should be assigned. @@ -919,7 +957,7 @@ namespace ts { case PrivateIdentifierPlacement.InstanceMethod: { return createPrivateInstanceMethodInitializer( receiver, - privateIdentifierInfo.weakSetName + getPrivateIdentifierEnvironment().weakSetName ); } default: return Debug.fail("Unexpected private identifier placement"); @@ -1011,7 +1049,16 @@ namespace ts { } function getPrivateIdentifierEnvironment() { - return currentPrivateIdentifierEnvironment || (currentPrivateIdentifierEnvironment = new Map()); + if (!currentPrivateIdentifierEnvironment) { + currentPrivateIdentifierEnvironment = { + className: "", + hasPrivateMethods: false, + weakSetName: factory.createUniqueName("_instances", GeneratedIdentifierFlags.Optimistic), + identifiers: new Map() + }; + } + + return currentPrivateIdentifierEnvironment; } function getPendingExpressions() { @@ -1020,18 +1067,18 @@ namespace ts { function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { const text = getTextOfPropertyName(node.name) as string; - const accessControlObject = createHoistedVariableForPrivateName(text); + const uniqueVariableName = createHoistedVariableForPrivateName(text); let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; if (isPropertyDeclaration(node)) { info = { placement: PrivateIdentifierPlacement.InstanceField, - weakMapName: accessControlObject + weakMapName: uniqueVariableName }; assignmentExpressions.push(factory.createAssignment( - accessControlObject, + uniqueVariableName, factory.createNewExpression( factory.createIdentifier("WeakMap"), /*typeArguments*/ undefined, @@ -1040,40 +1087,36 @@ namespace ts { )); } else if (isMethodDeclaration(node)) { - const functionName = createHoistedVariableForPrivateName(text); - info = { placement: PrivateIdentifierPlacement.InstanceMethod, - weakSetName: accessControlObject, - functionName + functionName: uniqueVariableName }; - assignmentExpressions.push(factory.createAssignment( - accessControlObject, - factory.createNewExpression( - factory.createIdentifier("WeakSet"), - /*typeArguments*/ undefined, - [] - ) - )); + getPrivateIdentifierEnvironment().hasPrivateMethods = true; } else { return; } - getPrivateIdentifierEnvironment().set(node.name.escapedText, info); + getPrivateIdentifierEnvironment().identifiers.set(node.name.escapedText, info); getPendingExpressions().push(...assignmentExpressions); } + function createHoistedVariableForClass(name: string): Identifier { + const { className } = getPrivateIdentifierEnvironment(); + const prefix = className ? `_${className}` : ""; + const identifier = factory.createUniqueName(`${prefix}_${name}`, GeneratedIdentifierFlags.Optimistic); + hoistVariableDeclaration(identifier); + return identifier; + } + function createHoistedVariableForPrivateName(privateName: string): Identifier { - const name = factory.createUniqueName("_" + privateName.substring(1), GeneratedIdentifierFlags.Optimistic); - hoistVariableDeclaration(name); - return name; + return createHoistedVariableForClass(privateName.substring(1)); } function accessPrivateIdentifier(name: PrivateIdentifier) { if (currentPrivateIdentifierEnvironment) { - const info = currentPrivateIdentifierEnvironment.get(name.escapedText); + const info = currentPrivateIdentifierEnvironment.identifiers.get(name.escapedText); if (info) { return info; } @@ -1083,7 +1126,7 @@ namespace ts { if (!env) { continue; } - const info = env.get(name.escapedText); + const info = env.identifiers.get(name.escapedText); if (info) { return info; } From 4aa4c3b29a47eb6f54be57baa0b813f2d549db70 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 11:57:26 +0000 Subject: [PATCH 09/68] Accept baseline Signed-off-by: Kubilay Kahveci --- tests/baselines/reference/importHelpersES6.js | 8 +-- .../privateFieldAssignabilityFromUnknown.js | 6 +- .../reference/privateNameAccessors.js | 2 +- .../reference/privateNameAccessorsAccess.js | 2 +- .../privateNameAccessorsCallExpression.js | 2 +- .../privateNameAccessorssDerivedClasses.js | 2 +- .../baselines/reference/privateNameAndAny.js | 8 +-- .../reference/privateNameAndIndexSignature.js | 6 +- .../privateNameAndObjectRestSpread.js | 10 ++-- ...NameAndStaticInitializer(target=es2015).js | 8 +-- .../reference/privateNameBadAssignment.js | 8 +-- .../reference/privateNameBadSuper.js | 6 +- .../reference/privateNameCircularReference.js | 8 +-- ...ameComputedPropertyName1(target=es2015).js | 30 +++++----- ...ameComputedPropertyName2(target=es2015).js | 6 +- ...ameComputedPropertyName3(target=es2015).js | 18 +++--- .../privateNameConstructorReserved.js | 6 +- .../privateNameConstructorSignature.js | 8 +-- .../reference/privateNameDeclaration.js | 8 +-- .../privateNameDeclarationMerging.js | 10 ++-- .../privateNameES5Ban(target=es3).js | 10 ++-- .../privateNameES5Ban(target=es5).js | 10 ++-- tests/baselines/reference/privateNameField.js | 8 +-- .../reference/privateNameFieldAccess.js | 8 +-- .../reference/privateNameFieldAssignment.js | 58 +++++++++---------- .../privateNameFieldCallExpression.js | 24 ++++---- .../privateNameFieldClassExpression.js | 8 +-- .../privateNameFieldDerivedClasses.js | 8 +-- ...FieldDestructuredBinding(target=es2015).js | 22 +++---- .../reference/privateNameFieldInitializer.js | 8 +-- .../privateNameFieldUnaryMutation.js | 46 +++++++-------- .../privateNameInLhsReceiverExpression.js | 10 ++-- tests/baselines/reference/privateNameJsx.js | 6 +- .../baselines/reference/privateNameMethod.js | 16 ++--- .../reference/privateNameMethodAccess.js | 16 ++--- .../privateNameMethodAssignment.errors.txt | 20 +++---- .../reference/privateNameMethodAssignment.js | 12 ++-- .../privateNameMethodCallExpression.js | 32 +++++----- .../privateNameMethodsDerivedClasses.js | 12 ++-- ...rivateNameNestedClassAccessorsShadowing.js | 4 +- .../privateNameNestedClassFieldShadowing.js | 16 ++--- .../privateNameNestedClassMethodShadowing.js | 20 +++---- .../privateNameNestedClassNameConflict.js | 12 ++-- ...teNameNotAccessibleOutsideDefiningClass.js | 6 +- .../reference/privateNameWeakMapCollision.js | 6 +- .../reference/privateNamesAndDecorators.js | 8 +-- .../reference/privateNamesAndFields.js | 14 ++--- .../privateNamesAndGenericClasses-2.js | 22 +++---- .../reference/privateNamesAndIndexedAccess.js | 6 +- .../reference/privateNamesAndStaticFields.js | 14 ++--- .../reference/privateNamesAndkeyof.js | 8 +-- .../privateNamesConstructorChain-1.js | 18 +++--- .../privateNamesConstructorChain-2.js | 18 +++--- .../reference/privateNamesInGenericClasses.js | 28 ++++----- .../privateNamesInNestedClasses-1.js | 20 +++---- .../privateNamesInNestedClasses-2.js | 14 ++--- .../privateNamesIncompatibleModifiers.js | 28 ++++----- .../privateNamesInterfaceExtendingClass.js | 8 +-- .../reference/privateNamesNoDelete.js | 8 +-- .../reference/privateNamesUnique-1.js | 10 ++-- .../reference/privateNamesUnique-2.js | 14 ++--- .../reference/privateNamesUnique-3.js | 14 ++--- .../reference/privateNamesUnique-4.js | 6 +- .../reference/privateNamesUnique-5.js | 10 ++-- .../reference/privateNamesUseBeforeDef.js | 28 ++++----- .../reference/strictPropertyInitialization.js | 54 ++++++++--------- 66 files changed, 455 insertions(+), 455 deletions(-) diff --git a/tests/baselines/reference/importHelpersES6.js b/tests/baselines/reference/importHelpersES6.js index 293ee8e28875b..a93ecc8c0281b 100644 --- a/tests/baselines/reference/importHelpersES6.js +++ b/tests/baselines/reference/importHelpersES6.js @@ -20,17 +20,17 @@ export declare function __classPrivateFieldGet(): any; export declare function __classPrivateFieldSet(): any; //// [a.js] -var _x; +var _A_x; import { __awaiter, __classPrivateFieldGet, __classPrivateFieldSet, __decorate } from "tslib"; let A = class A { constructor() { - _x.set(this, 1); + _A_x.set(this, 1); } f() { - return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _x, yield __classPrivateFieldGet(this, _x)); }); + return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _A_x, yield __classPrivateFieldGet(this, _A_x)); }); } }; -_x = new WeakMap(); +_A_x = new WeakMap(); A = __decorate([ dec ], A); diff --git a/tests/baselines/reference/privateFieldAssignabilityFromUnknown.js b/tests/baselines/reference/privateFieldAssignabilityFromUnknown.js index b63ff22f93255..206b1d827b20a 100644 --- a/tests/baselines/reference/privateFieldAssignabilityFromUnknown.js +++ b/tests/baselines/reference/privateFieldAssignabilityFromUnknown.js @@ -8,15 +8,15 @@ const task: Class = {} as unknown; //// [privateFieldAssignabilityFromUnknown.js] "use strict"; -var _field; +var _Class_field; exports.__esModule = true; exports.Class = void 0; var Class = /** @class */ (function () { function Class() { - _field.set(this, void 0); + _Class_field.set(this, void 0); } return Class; }()); exports.Class = Class; -_field = new WeakMap(); +_Class_field = new WeakMap(); var task = {}; diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index 6e25fb62c47de..7113a0d3a8102 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -16,7 +16,7 @@ class A1 { //// [privateNameAccessors.js] "use strict"; -var _prop, _prop_1, _roProp; +var _A1_prop, _A1_prop_1, _A1_roProp; class A1 { constructor(name) { this. = ""; diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js index 2550a386096fa..471938900c62b 100644 --- a/tests/baselines/reference/privateNameAccessorsAccess.js +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -26,7 +26,7 @@ class B2 { //// [privateNameAccessorsAccess.js] -var _prop, _prop_1; +var _A2_prop, _A2_prop_1; class A2 { constructor() { console.log(this.); diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js index 297c6b72eea07..f901647fbb02e 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -28,7 +28,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExp ==== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js (7 errors) ==== - var _fieldFunc, _fieldFunc2; + var _A_fieldFunc, _A_fieldFunc2; class A { constructor() { this.x = 1; diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js index bce3c2b53f3a9..4da1a9941cd93 100644 --- a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -13,7 +13,7 @@ class Derived extends Base { //// [privateNameAccessorssDerivedClasses.js] -var _prop; +var _Base_prop; class Base { get () { return 123; } static method(x) { diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index 83399f4aa4c8c..5a681c6dc0156 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -16,15 +16,15 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo; +var _A_foo; class A { constructor() { - _foo.set(this, true); + _A_foo.set(this, true); } method(thing) { - __classPrivateFieldGet(thing, _foo); // OK + __classPrivateFieldGet(thing, _A_foo); // OK thing.; // Error } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); ; diff --git a/tests/baselines/reference/privateNameAndIndexSignature.js b/tests/baselines/reference/privateNameAndIndexSignature.js index 693c3900e954f..4724aaea0f5c5 100644 --- a/tests/baselines/reference/privateNameAndIndexSignature.js +++ b/tests/baselines/reference/privateNameAndIndexSignature.js @@ -13,13 +13,13 @@ class A { //// [privateNameAndIndexSignature.js] "use strict"; -var _foo; +var _A_foo; class A { constructor(message) { - _foo.set(this, 3); + _A_foo.set(this, 3); this["#bar"] = this["#bar"]; // Error (private identifiers should not prevent circularity checking for computeds) this. = 3; // Error (index signatures do not implicitly declare private names) this["#foo"] = 3; // Okay (type has index signature and "#foo" does not collide with private identifier #foo) } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index 98a109257ae1e..cc8c64619e1c5 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -29,16 +29,16 @@ var __rest = (this && this.__rest) || function (s, e) { } return t; }; -var _prop; +var _C_prop; class C { constructor() { - _prop.set(this, 1); + _C_prop.set(this, 1); } method(other) { const obj = Object.assign({}, other); - __classPrivateFieldGet(obj, _prop); + __classPrivateFieldGet(obj, _C_prop); const rest = __rest(other, []); - __classPrivateFieldGet(rest, _prop); + __classPrivateFieldGet(rest, _C_prop); } } -_prop = new WeakMap(); +_C_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAndStaticInitializer(target=es2015).js b/tests/baselines/reference/privateNameAndStaticInitializer(target=es2015).js index caeb43d15a3e9..b430336781640 100644 --- a/tests/baselines/reference/privateNameAndStaticInitializer(target=es2015).js +++ b/tests/baselines/reference/privateNameAndStaticInitializer(target=es2015).js @@ -8,12 +8,12 @@ class A { //// [privateNameAndStaticInitializer.js] -var _foo, _prop; +var _A_foo, _A_prop; class A { constructor() { - _foo.set(this, 1); - _prop.set(this, 2); + _A_foo.set(this, 1); + _A_prop.set(this, 2); } } -_foo = new WeakMap(), _prop = new WeakMap(); +_A_foo = new WeakMap(), _A_prop = new WeakMap(); A.inst = new A(); diff --git a/tests/baselines/reference/privateNameBadAssignment.js b/tests/baselines/reference/privateNameBadAssignment.js index a3f937396b0f6..7d13cbd05de64 100644 --- a/tests/baselines/reference/privateNameBadAssignment.js +++ b/tests/baselines/reference/privateNameBadAssignment.js @@ -23,7 +23,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _bar; +var _C_bar; exports. = 1; // Error (outside class body) function A() { } A.prototype. = 2; // Error (outside class body) @@ -32,9 +32,9 @@ class B { B. = 3; // Error (outside class body) class C { constructor() { - _bar.set(this, 6); - __classPrivateFieldSet(exports, _bar, 6); // Error + _C_bar.set(this, 6); + __classPrivateFieldSet(exports, _C_bar, 6); // Error this. = 3; // Error (undeclared) } } -_bar = new WeakMap(); +_C_bar = new WeakMap(); diff --git a/tests/baselines/reference/privateNameBadSuper.js b/tests/baselines/reference/privateNameBadSuper.js index 07d8c2324f5cf..ac4a4a80695f1 100644 --- a/tests/baselines/reference/privateNameBadSuper.js +++ b/tests/baselines/reference/privateNameBadSuper.js @@ -9,7 +9,7 @@ class A extends B { } //// [privateNameBadSuper.js] -var _x; +var _A_x; class B { } ; @@ -17,7 +17,7 @@ class A extends B { constructor() { void 0; // Error: 'super' call must come first super(); - _x.set(this, void 0); + _A_x.set(this, void 0); } } -_x = new WeakMap(); +_A_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameCircularReference.js b/tests/baselines/reference/privateNameCircularReference.js index 7d3ef6d1d022d..c74ba4d84e9b2 100644 --- a/tests/baselines/reference/privateNameCircularReference.js +++ b/tests/baselines/reference/privateNameCircularReference.js @@ -14,12 +14,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar; +var _A_foo, _A_bar; class A { constructor() { - _foo.set(this, __classPrivateFieldGet(this, _bar)); - _bar.set(this, __classPrivateFieldGet(this, _foo)); + _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); + _A_bar.set(this, __classPrivateFieldGet(this, _A_foo)); this["#baz"] = this["#baz"]; // Error (should *not* be private name error) } } -_foo = new WeakMap(), _bar = new WeakMap(); +_A_foo = new WeakMap(), _A_bar = new WeakMap(); diff --git a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js index 966a81e23a1b0..3392289b5bc4c 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js @@ -51,28 +51,28 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _a, _b, _c, _d, _e; +var _A_a, _A_b, _A_c, _A_d, _A_e; class A { constructor() { - _a.set(this, 'a'); - _b.set(this, void 0); - _c.set(this, 'c'); - _d.set(this, void 0); - _e.set(this, ''); - __classPrivateFieldSet(this, _b, 'b'); - __classPrivateFieldSet(this, _d, 'd'); + _A_a.set(this, 'a'); + _A_b.set(this, void 0); + _A_c.set(this, 'c'); + _A_d.set(this, void 0); + _A_e.set(this, ''); + __classPrivateFieldSet(this, _A_b, 'b'); + __classPrivateFieldSet(this, _A_d, 'd'); } test() { const data = { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e' }; - const { [__classPrivateFieldGet(this, _a)]: a, [__classPrivateFieldGet(this, _b)]: b, [__classPrivateFieldGet(this, _c)]: c, [__classPrivateFieldGet(this, _d)]: d, [__classPrivateFieldSet(this, _e, 'e')]: e, } = data; + const { [__classPrivateFieldGet(this, _A_a)]: a, [__classPrivateFieldGet(this, _A_b)]: b, [__classPrivateFieldGet(this, _A_c)]: c, [__classPrivateFieldGet(this, _A_d)]: d, [__classPrivateFieldSet(this, _A_e, 'e')]: e, } = data; console.log(a, b, c, d, e); - const a1 = data[__classPrivateFieldGet(this, _a)]; - const b1 = data[__classPrivateFieldGet(this, _b)]; - const c1 = data[__classPrivateFieldGet(this, _c)]; - const d1 = data[__classPrivateFieldGet(this, _d)]; - const e1 = data[__classPrivateFieldGet(this, _e)]; + const a1 = data[__classPrivateFieldGet(this, _A_a)]; + const b1 = data[__classPrivateFieldGet(this, _A_b)]; + const c1 = data[__classPrivateFieldGet(this, _A_c)]; + const d1 = data[__classPrivateFieldGet(this, _A_d)]; + const e1 = data[__classPrivateFieldGet(this, _A_e)]; console.log(a1, b1, c1, d1); } } -_a = new WeakMap(), _b = new WeakMap(), _c = new WeakMap(), _d = new WeakMap(), _e = new WeakMap(); +_A_a = new WeakMap(), _A_b = new WeakMap(), _A_c = new WeakMap(), _A_d = new WeakMap(), _A_e = new WeakMap(); new A().test(); diff --git a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js index fcb4dc6d17f3d..23a34074d441d 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js @@ -16,12 +16,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _x; +var _A_x; let getX; class A { constructor() { - _x.set(this, 100); + _A_x.set(this, 100); } - [(_x = new WeakMap(), (getX = (a) => __classPrivateFieldGet(a, _x), "_"))]() { } + [(_A_x = new WeakMap(), (getX = (a) => __classPrivateFieldGet(a, _A_x), "_"))]() { } } console.log(getX(new A)); diff --git a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js index bb6bc692a330f..f404487ac3501 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js @@ -38,25 +38,25 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _name; +var _Foo_name; class Foo { constructor(name) { - _name.set(this, void 0); - __classPrivateFieldSet(this, _name, name); + _Foo_name.set(this, void 0); + __classPrivateFieldSet(this, _Foo_name, name); } getValue(x) { - var _y; + var _Bar_y; const obj = this; class Bar { constructor() { - _y.set(this, 100); + _Bar_y.set(this, 100); } - [(_y = new WeakMap(), __classPrivateFieldGet(obj, _name))]() { - return x + __classPrivateFieldGet(this, _y); + [(_Bar_y = new WeakMap(), __classPrivateFieldGet(obj, _Foo_name))]() { + return x + __classPrivateFieldGet(this, _Bar_y); } } - return new Bar()[__classPrivateFieldGet(obj, _name)](); + return new Bar()[__classPrivateFieldGet(obj, _Foo_name)](); } } -_name = new WeakMap(); +_Foo_name = new WeakMap(); console.log(new Foo("NAME").getValue(100)); diff --git a/tests/baselines/reference/privateNameConstructorReserved.js b/tests/baselines/reference/privateNameConstructorReserved.js index 03520a377abe2..b3e48fdb5bf69 100644 --- a/tests/baselines/reference/privateNameConstructorReserved.js +++ b/tests/baselines/reference/privateNameConstructorReserved.js @@ -5,10 +5,10 @@ class A { //// [privateNameConstructorReserved.js] -var _constructor, _constructor_1; +var _A_constructor, _A_instances; class A { constructor() { - _constructor.add(this); + _A_instances.add(this); } } -_constructor = new WeakSet(), _constructor_1 = function _constructor_1() { }; +_A_instances = new WeakSet(), _A_constructor = function _A_constructor() { }; diff --git a/tests/baselines/reference/privateNameConstructorSignature.js b/tests/baselines/reference/privateNameConstructorSignature.js index d468fc32d31a5..adc58b3d9b8e0 100644 --- a/tests/baselines/reference/privateNameConstructorSignature.js +++ b/tests/baselines/reference/privateNameConstructorSignature.js @@ -25,16 +25,16 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _x; +var _C_x; class C { constructor() { - _x.set(this, void 0); + _C_x.set(this, void 0); } static test() { - __classPrivateFieldSet(new C(), _x, 10); + __classPrivateFieldSet(new C(), _C_x, 10); const y = new C(); const z = new y(); z.x = 123; } } -_x = new WeakMap(); +_C_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameDeclaration.js b/tests/baselines/reference/privateNameDeclaration.js index f8d5f0a017ec3..288f9c8a95f0a 100644 --- a/tests/baselines/reference/privateNameDeclaration.js +++ b/tests/baselines/reference/privateNameDeclaration.js @@ -11,17 +11,17 @@ class A { //// [privateNameDeclaration.js] -var _foo, _bar; +var _A_foo, _A_bar; class A { constructor() { - _foo.set(this, void 0); - _bar.set(this, 6); + _A_foo.set(this, void 0); + _A_bar.set(this, 6); this.qux = 6; } quux() { } } -_foo = new WeakMap(), _bar = new WeakMap(); +_A_foo = new WeakMap(), _A_bar = new WeakMap(); //// [privateNameDeclaration.d.ts] diff --git a/tests/baselines/reference/privateNameDeclarationMerging.js b/tests/baselines/reference/privateNameDeclarationMerging.js index 1d278bfed2954..0927854a50f29 100644 --- a/tests/baselines/reference/privateNameDeclarationMerging.js +++ b/tests/baselines/reference/privateNameDeclarationMerging.js @@ -22,19 +22,19 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _x; +var _C_x; class D { } ; class C { constructor() { - _x.set(this, void 0); + _C_x.set(this, void 0); } foo() { const c = new C(); - __classPrivateFieldGet(c, _x); // OK + __classPrivateFieldGet(c, _C_x); // OK const d = new C(); - __classPrivateFieldGet(d, _x); // Error + __classPrivateFieldGet(d, _C_x); // Error } } -_x = new WeakMap(); +_C_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index 7db5b048b8314..da50a83aed130 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -16,8 +16,8 @@ class A { //// [privateNameES5Ban.js] var A = /** @class */ (function () { function A() { - _method.add(this); - _field.set(this, 123); + _A_instances.add(this); + _A_field.set(this, 123); } Object.defineProperty(A.prototype, "", { get: function () { return ""; }, @@ -31,8 +31,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _method, _method_1, _sField, _sMethod, _sMethod_1, _acc, _acc_1, _sAcc, _sAcc_1; - _field = new WeakMap(), _method = new WeakSet(), _sField = new WeakMap(), _sMethod = new WeakSet(), _method_1 = function _method_1() { }, _sMethod_1 = function _sMethod_1() { }; - _sField.set(A, "hello world"); + var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc, _A_acc_1, _A_sAcc, _A_sAcc_1, _A_instances; + _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }; + _A_sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index 7db5b048b8314..da50a83aed130 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -16,8 +16,8 @@ class A { //// [privateNameES5Ban.js] var A = /** @class */ (function () { function A() { - _method.add(this); - _field.set(this, 123); + _A_instances.add(this); + _A_field.set(this, 123); } Object.defineProperty(A.prototype, "", { get: function () { return ""; }, @@ -31,8 +31,8 @@ var A = /** @class */ (function () { enumerable: false, configurable: true }); - var _field, _method, _method_1, _sField, _sMethod, _sMethod_1, _acc, _acc_1, _sAcc, _sAcc_1; - _field = new WeakMap(), _method = new WeakSet(), _sField = new WeakMap(), _sMethod = new WeakSet(), _method_1 = function _method_1() { }, _sMethod_1 = function _sMethod_1() { }; - _sField.set(A, "hello world"); + var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc, _A_acc_1, _A_sAcc, _A_sAcc_1, _A_instances; + _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }; + _A_sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameField.js b/tests/baselines/reference/privateNameField.js index 8803d856771ae..96a11b48cdb7b 100644 --- a/tests/baselines/reference/privateNameField.js +++ b/tests/baselines/reference/privateNameField.js @@ -16,11 +16,11 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _name; +var _A_name; class A { constructor(name) { - _name.set(this, void 0); - __classPrivateFieldSet(this, _name, name); + _A_name.set(this, void 0); + __classPrivateFieldSet(this, _A_name, name); } } -_name = new WeakMap(); +_A_name = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldAccess.js b/tests/baselines/reference/privateNameFieldAccess.js index 35f418690881c..1c8d1920c6de1 100644 --- a/tests/baselines/reference/privateNameFieldAccess.js +++ b/tests/baselines/reference/privateNameFieldAccess.js @@ -14,11 +14,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _myField; +var _A_myField; class A { constructor() { - _myField.set(this, "hello world"); - console.log(__classPrivateFieldGet(this, _myField)); + _A_myField.set(this, "hello world"); + console.log(__classPrivateFieldGet(this, _A_myField)); } } -_myField = new WeakMap(); +_A_myField = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldAssignment.js b/tests/baselines/reference/privateNameFieldAssignment.js index 3442958b508ec..717d782cd3e48 100644 --- a/tests/baselines/reference/privateNameFieldAssignment.js +++ b/tests/baselines/reference/privateNameFieldAssignment.js @@ -49,40 +49,40 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _field; +var _A_field; class A { constructor() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; - _field.set(this, 0); - __classPrivateFieldSet(this, _field, 1); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) + 2); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) - 3); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) / 4); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) * 5); - __classPrivateFieldSet(this, _field, Math.pow(__classPrivateFieldGet(this, _field), 6)); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) % 7); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) << 8); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) >> 9); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) >>> 10); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) & 11); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) | 12); - __classPrivateFieldSet(this, _field, __classPrivateFieldGet(this, _field) ^ 13); - __classPrivateFieldSet(A.getInstance(), _field, 1); - __classPrivateFieldSet(_a = A.getInstance(), _field, __classPrivateFieldGet(_a, _field) + 2); - __classPrivateFieldSet(_b = A.getInstance(), _field, __classPrivateFieldGet(_b, _field) - 3); - __classPrivateFieldSet(_c = A.getInstance(), _field, __classPrivateFieldGet(_c, _field) / 4); - __classPrivateFieldSet(_d = A.getInstance(), _field, __classPrivateFieldGet(_d, _field) * 5); - __classPrivateFieldSet(_e = A.getInstance(), _field, Math.pow(__classPrivateFieldGet(_e, _field), 6)); - __classPrivateFieldSet(_f = A.getInstance(), _field, __classPrivateFieldGet(_f, _field) % 7); - __classPrivateFieldSet(_g = A.getInstance(), _field, __classPrivateFieldGet(_g, _field) << 8); - __classPrivateFieldSet(_h = A.getInstance(), _field, __classPrivateFieldGet(_h, _field) >> 9); - __classPrivateFieldSet(_j = A.getInstance(), _field, __classPrivateFieldGet(_j, _field) >>> 10); - __classPrivateFieldSet(_k = A.getInstance(), _field, __classPrivateFieldGet(_k, _field) & 11); - __classPrivateFieldSet(_l = A.getInstance(), _field, __classPrivateFieldGet(_l, _field) | 12); - __classPrivateFieldSet(_m = A.getInstance(), _field, __classPrivateFieldGet(_m, _field) ^ 13); + _A_field.set(this, 0); + __classPrivateFieldSet(this, _A_field, 1); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) + 2); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) - 3); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) / 4); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) * 5); + __classPrivateFieldSet(this, _A_field, Math.pow(__classPrivateFieldGet(this, _A_field), 6)); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) % 7); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) << 8); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) >> 9); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) >>> 10); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) & 11); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) | 12); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) ^ 13); + __classPrivateFieldSet(A.getInstance(), _A_field, 1); + __classPrivateFieldSet(_a = A.getInstance(), _A_field, __classPrivateFieldGet(_a, _A_field) + 2); + __classPrivateFieldSet(_b = A.getInstance(), _A_field, __classPrivateFieldGet(_b, _A_field) - 3); + __classPrivateFieldSet(_c = A.getInstance(), _A_field, __classPrivateFieldGet(_c, _A_field) / 4); + __classPrivateFieldSet(_d = A.getInstance(), _A_field, __classPrivateFieldGet(_d, _A_field) * 5); + __classPrivateFieldSet(_e = A.getInstance(), _A_field, Math.pow(__classPrivateFieldGet(_e, _A_field), 6)); + __classPrivateFieldSet(_f = A.getInstance(), _A_field, __classPrivateFieldGet(_f, _A_field) % 7); + __classPrivateFieldSet(_g = A.getInstance(), _A_field, __classPrivateFieldGet(_g, _A_field) << 8); + __classPrivateFieldSet(_h = A.getInstance(), _A_field, __classPrivateFieldGet(_h, _A_field) >> 9); + __classPrivateFieldSet(_j = A.getInstance(), _A_field, __classPrivateFieldGet(_j, _A_field) >>> 10); + __classPrivateFieldSet(_k = A.getInstance(), _A_field, __classPrivateFieldGet(_k, _A_field) & 11); + __classPrivateFieldSet(_l = A.getInstance(), _A_field, __classPrivateFieldGet(_l, _A_field) | 12); + __classPrivateFieldSet(_m = A.getInstance(), _A_field, __classPrivateFieldGet(_m, _A_field) ^ 13); } static getInstance() { return new A(); } } -_field = new WeakMap(); +_A_field = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldCallExpression.js b/tests/baselines/reference/privateNameFieldCallExpression.js index e4b9a413672fc..47026bcc59e59 100644 --- a/tests/baselines/reference/privateNameFieldCallExpression.js +++ b/tests/baselines/reference/privateNameFieldCallExpression.js @@ -27,27 +27,27 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _fieldFunc, _fieldFunc2; +var _A_fieldFunc, _A_fieldFunc2; class A { constructor() { - _fieldFunc.set(this, function () { this.x = 10; }); - _fieldFunc2.set(this, function (a, ...b) { }); + _A_fieldFunc.set(this, function () { this.x = 10; }); + _A_fieldFunc2.set(this, function (a, ...b) { }); this.x = 1; } test() { var _a; var _b; - __classPrivateFieldGet(this, _fieldFunc).call(this); - (_a = __classPrivateFieldGet(this, _fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(this); - const func = __classPrivateFieldGet(this, _fieldFunc); + __classPrivateFieldGet(this, _A_fieldFunc).call(this); + (_a = __classPrivateFieldGet(this, _A_fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(this); + const func = __classPrivateFieldGet(this, _A_fieldFunc); func(); - new (__classPrivateFieldGet(this, _fieldFunc))(); + new (__classPrivateFieldGet(this, _A_fieldFunc))(); const arr = [1, 2]; - __classPrivateFieldGet(this, _fieldFunc2).call(this, 0, ...arr, 3); - const b = new (__classPrivateFieldGet(this, _fieldFunc2))(0, ...arr, 3); - const str = __classPrivateFieldGet(this, _fieldFunc2).bind(this) `head${1}middle${2}tail`; - __classPrivateFieldGet((_b = this.getInstance()), _fieldFunc2).bind(_b) `test${1}and${2}`; + __classPrivateFieldGet(this, _A_fieldFunc2).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _A_fieldFunc2))(0, ...arr, 3); + const str = __classPrivateFieldGet(this, _A_fieldFunc2).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_b = this.getInstance()), _A_fieldFunc2).bind(_b) `test${1}and${2}`; } getInstance() { return new A(); } } -_fieldFunc = new WeakMap(), _fieldFunc2 = new WeakMap(); +_A_fieldFunc = new WeakMap(), _A_fieldFunc2 = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldClassExpression.js b/tests/baselines/reference/privateNameFieldClassExpression.js index 2d1641da71244..b62835d6fe036 100644 --- a/tests/baselines/reference/privateNameFieldClassExpression.js +++ b/tests/baselines/reference/privateNameFieldClassExpression.js @@ -15,21 +15,21 @@ class B { //// [privateNameFieldClassExpression.js] -var _foo, _foo2; +var _B_foo, _B_foo2; class B { constructor() { var _a, _b; - _foo.set(this, (_a = class { + _B_foo.set(this, (_a = class { constructor() { console.log("hello"); } }, _a.test = 123, _a)); - _foo2.set(this, (_b = class Foo { + _B_foo2.set(this, (_b = class Foo { }, _b.otherClass = 123, _b)); } } -_foo = new WeakMap(), _foo2 = new WeakMap(); +_B_foo = new WeakMap(), _B_foo2 = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldDerivedClasses.js b/tests/baselines/reference/privateNameFieldDerivedClasses.js index f38db5914e9ba..8241accdcb85d 100644 --- a/tests/baselines/reference/privateNameFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameFieldDerivedClasses.js @@ -20,16 +20,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _prop; +var _Base_prop; class Base { constructor() { - _prop.set(this, 123); + _Base_prop.set(this, 123); } static method(x) { - console.log(__classPrivateFieldGet(x, _prop)); + console.log(__classPrivateFieldGet(x, _Base_prop)); } } -_prop = new WeakMap(); +_Base_prop = new WeakMap(); class Derived extends Base { static method(x) { console.log(x.); diff --git a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js index b45ccaedfe481..618ab2c02897b 100644 --- a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js @@ -32,20 +32,20 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _field; +var _A_field; class A { constructor() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l; - _field.set(this, 1); + _A_field.set(this, 1); this.otherObject = new A(); let y; - (_b = this, { x: ({ set value(_m) { __classPrivateFieldSet(_b, _field, _m); } }).value, y } = this.testObject()); - (_c = this, [({ set value(_m) { __classPrivateFieldSet(_c, _field, _m); } }).value, y] = this.testArray()); - (_d = this, _e = this, { a: ({ set value(_m) { __classPrivateFieldSet(_d, _field, _m); } }).value, b: [({ set value(_m) { __classPrivateFieldSet(_e, _field, _m); } }).value] } = { a: 1, b: [2] }); - _f = this, _g = this, [({ set value(_m) { __classPrivateFieldSet(_f, _field, _m); } }).value, [({ set value(_m) { __classPrivateFieldSet(_g, _field, _m); } }).value]] = [1, [2]]; - (_h = this, _j = this, { a: ({ set value(_m) { __classPrivateFieldSet(_h, _field, _m); } }).value = 1, b: [({ set value(_m) { __classPrivateFieldSet(_j, _field, _m); } }).value = 1] } = { b: [] }); - _k = this, [({ set value(_m) { __classPrivateFieldSet(_k, _field, _m); } }).value = 2] = []; - _l = this.otherObject, [({ set value(_m) { __classPrivateFieldSet(_l, _field, _m); } }).value = 2] = []; + (_b = this, { x: ({ set value(_m) { __classPrivateFieldSet(_b, _A_field, _m); } }).value, y } = this.testObject()); + (_c = this, [({ set value(_m) { __classPrivateFieldSet(_c, _A_field, _m); } }).value, y] = this.testArray()); + (_d = this, _e = this, { a: ({ set value(_m) { __classPrivateFieldSet(_d, _A_field, _m); } }).value, b: [({ set value(_m) { __classPrivateFieldSet(_e, _A_field, _m); } }).value] } = { a: 1, b: [2] }); + _f = this, _g = this, [({ set value(_m) { __classPrivateFieldSet(_f, _A_field, _m); } }).value, [({ set value(_m) { __classPrivateFieldSet(_g, _A_field, _m); } }).value]] = [1, [2]]; + (_h = this, _j = this, { a: ({ set value(_m) { __classPrivateFieldSet(_h, _A_field, _m); } }).value = 1, b: [({ set value(_m) { __classPrivateFieldSet(_j, _A_field, _m); } }).value = 1] } = { b: [] }); + _k = this, [({ set value(_m) { __classPrivateFieldSet(_k, _A_field, _m); } }).value = 2] = []; + _l = this.otherObject, [({ set value(_m) { __classPrivateFieldSet(_l, _A_field, _m); } }).value = 2] = []; } testObject() { return { x: 10, y: 6 }; @@ -54,7 +54,7 @@ class A { return [10, 11]; } static test(_a) { - [({ set value(_b) { __classPrivateFieldSet(_a, _field, _b); } }).value] = [2]; + [({ set value(_b) { __classPrivateFieldSet(_a, _A_field, _b); } }).value] = [2]; } } -_field = new WeakMap(); +_A_field = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldInitializer.js b/tests/baselines/reference/privateNameFieldInitializer.js index 36aaae4851217..0fd9fd1b4235d 100644 --- a/tests/baselines/reference/privateNameFieldInitializer.js +++ b/tests/baselines/reference/privateNameFieldInitializer.js @@ -6,11 +6,11 @@ class A { //// [privateNameFieldInitializer.js] -var _field, _uninitialized; +var _A_field, _A_uninitialized; class A { constructor() { - _field.set(this, 10); - _uninitialized.set(this, void 0); + _A_field.set(this, 10); + _A_uninitialized.set(this, void 0); } } -_field = new WeakMap(), _uninitialized = new WeakMap(); +_A_field = new WeakMap(), _A_uninitialized = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldUnaryMutation.js b/tests/baselines/reference/privateNameFieldUnaryMutation.js index 91d4faecb4584..43e87ce7e6ac0 100644 --- a/tests/baselines/reference/privateNameFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameFieldUnaryMutation.js @@ -43,35 +43,35 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _test; +var _C_test; class C { constructor() { var _a, _b; - _test.set(this, 24); - __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) + 1); - __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) - 1); - __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) + 1); - __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) - 1); - const a = (__classPrivateFieldSet(this, _test, (_a = +__classPrivateFieldGet(this, _test)) + 1), _a); - const b = (__classPrivateFieldSet(this, _test, (_b = +__classPrivateFieldGet(this, _test)) - 1), _b); - const c = __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) + 1); - const d = __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) - 1); - for (__classPrivateFieldSet(this, _test, 0); __classPrivateFieldGet(this, _test) < 10; __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) + 1)) { } - for (__classPrivateFieldSet(this, _test, 0); __classPrivateFieldGet(this, _test) < 10; __classPrivateFieldSet(this, _test, +__classPrivateFieldGet(this, _test) + 1)) { } + _C_test.set(this, 24); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); + const a = (__classPrivateFieldSet(this, _C_test, (_a = +__classPrivateFieldGet(this, _C_test)) + 1), _a); + const b = (__classPrivateFieldSet(this, _C_test, (_b = +__classPrivateFieldGet(this, _C_test)) - 1), _b); + const c = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); + const d = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); + for (__classPrivateFieldSet(this, _C_test, 0); __classPrivateFieldGet(this, _C_test) < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1)) { } + for (__classPrivateFieldSet(this, _C_test, 0); __classPrivateFieldGet(this, _C_test) < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1)) { } } test() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; - __classPrivateFieldSet(_a = this.getInstance(), _test, +__classPrivateFieldGet(_a, _test) + 1); - __classPrivateFieldSet(_b = this.getInstance(), _test, +__classPrivateFieldGet(_b, _test) - 1); - __classPrivateFieldSet(_c = this.getInstance(), _test, +__classPrivateFieldGet(_c, _test) + 1); - __classPrivateFieldSet(_d = this.getInstance(), _test, +__classPrivateFieldGet(_d, _test) - 1); - const a = (__classPrivateFieldSet(_e = this.getInstance(), _test, (_f = +__classPrivateFieldGet(_e, _test)) + 1), _f); - const b = (__classPrivateFieldSet(_g = this.getInstance(), _test, (_h = +__classPrivateFieldGet(_g, _test)) - 1), _h); - const c = __classPrivateFieldSet(_j = this.getInstance(), _test, +__classPrivateFieldGet(_j, _test) + 1); - const d = __classPrivateFieldSet(_k = this.getInstance(), _test, +__classPrivateFieldGet(_k, _test) - 1); - for (__classPrivateFieldSet(this.getInstance(), _test, 0); __classPrivateFieldGet(this.getInstance(), _test) < 10; __classPrivateFieldSet(_l = this.getInstance(), _test, +__classPrivateFieldGet(_l, _test) + 1)) { } - for (__classPrivateFieldSet(this.getInstance(), _test, 0); __classPrivateFieldGet(this.getInstance(), _test) < 10; __classPrivateFieldSet(_m = this.getInstance(), _test, +__classPrivateFieldGet(_m, _test) + 1)) { } + __classPrivateFieldSet(_a = this.getInstance(), _C_test, +__classPrivateFieldGet(_a, _C_test) + 1); + __classPrivateFieldSet(_b = this.getInstance(), _C_test, +__classPrivateFieldGet(_b, _C_test) - 1); + __classPrivateFieldSet(_c = this.getInstance(), _C_test, +__classPrivateFieldGet(_c, _C_test) + 1); + __classPrivateFieldSet(_d = this.getInstance(), _C_test, +__classPrivateFieldGet(_d, _C_test) - 1); + const a = (__classPrivateFieldSet(_e = this.getInstance(), _C_test, (_f = +__classPrivateFieldGet(_e, _C_test)) + 1), _f); + const b = (__classPrivateFieldSet(_g = this.getInstance(), _C_test, (_h = +__classPrivateFieldGet(_g, _C_test)) - 1), _h); + const c = __classPrivateFieldSet(_j = this.getInstance(), _C_test, +__classPrivateFieldGet(_j, _C_test) + 1); + const d = __classPrivateFieldSet(_k = this.getInstance(), _C_test, +__classPrivateFieldGet(_k, _C_test) - 1); + for (__classPrivateFieldSet(this.getInstance(), _C_test, 0); __classPrivateFieldGet(this.getInstance(), _C_test) < 10; __classPrivateFieldSet(_l = this.getInstance(), _C_test, +__classPrivateFieldGet(_l, _C_test) + 1)) { } + for (__classPrivateFieldSet(this.getInstance(), _C_test, 0); __classPrivateFieldGet(this.getInstance(), _C_test) < 10; __classPrivateFieldSet(_m = this.getInstance(), _C_test, +__classPrivateFieldGet(_m, _C_test) + 1)) { } } getInstance() { return new C(); } } -_test = new WeakMap(); +_C_test = new WeakMap(); diff --git a/tests/baselines/reference/privateNameInLhsReceiverExpression.js b/tests/baselines/reference/privateNameInLhsReceiverExpression.js index 1f1fa882554c3..9a12ec666de0c 100644 --- a/tests/baselines/reference/privateNameInLhsReceiverExpression.js +++ b/tests/baselines/reference/privateNameInLhsReceiverExpression.js @@ -23,10 +23,10 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _y; +var _Test_y; class Test { constructor() { - _y.set(this, 123); + _Test_y.set(this, 123); } static something(obj) { var _x, _a, _x_1, _b, _c; @@ -37,7 +37,7 @@ class Test { } }, _x = new WeakMap(), - _a)).s], _y, 1); + _a)).s], _Test_y, 1); __classPrivateFieldSet(_c = obj[(new (_b = class { constructor() { _x_1.set(this, 1); @@ -45,7 +45,7 @@ class Test { } }, _x_1 = new WeakMap(), - _b)).s], _y, __classPrivateFieldGet(_c, _y) + 1); + _b)).s], _Test_y, __classPrivateFieldGet(_c, _Test_y) + 1); } } -_y = new WeakMap(); +_Test_y = new WeakMap(); diff --git a/tests/baselines/reference/privateNameJsx.js b/tests/baselines/reference/privateNameJsx.js index 9b4098f1e196b..6cdf5be703879 100644 --- a/tests/baselines/reference/privateNameJsx.js +++ b/tests/baselines/reference/privateNameJsx.js @@ -9,14 +9,14 @@ class Test { //// [privateNameJsx.jsx] -var _prop; +var _Test_prop; var Test = /** @class */ (function () { function Test() { - _prop.set(this, function () { return
; }); + _Test_prop.set(this, function () { return
; }); } Test.prototype.render = function () { return ; }; return Test; }()); -_prop = new WeakMap(); +_Test_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js index cd56a5854583e..1fda4cb711940 100644 --- a/tests/baselines/reference/privateNameMethod.js +++ b/tests/baselines/reference/privateNameMethod.js @@ -14,22 +14,22 @@ class A1 { //// [privateNameMethod.js] "use strict"; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _method, _method_1; +var _A1_method, _A1_instances; class A1 { constructor(name) { - _method.add(this); - __classPrivateMethodGet(this, _method, _method_1).call(this, ""); - __classPrivateMethodGet(this, _method, _method_1).call(this, 1); // Error - __classPrivateMethodGet(this, _method, _method_1).call(// Error + _A1_instances.add(this); + __classPrivateMethodGet(this, _A1_instances, _A1_method).call(this, ""); + __classPrivateMethodGet(this, _A1_instances, _A1_method).call(this, 1); // Error + __classPrivateMethodGet(this, _A1_instances, _A1_method).call(// Error this); // Error } } -_method = new WeakSet(), _method_1 = function _method_1(param) { +_A1_instances = new WeakSet(), _A1_method = function _A1_method(param) { return ""; }; diff --git a/tests/baselines/reference/privateNameMethodAccess.js b/tests/baselines/reference/privateNameMethodAccess.js index c458a0b48f24c..ce3d039c67fd0 100644 --- a/tests/baselines/reference/privateNameMethodAccess.js +++ b/tests/baselines/reference/privateNameMethodAccess.js @@ -24,25 +24,25 @@ class B2 { //// [privateNameMethodAccess.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _method, _method_1, _a; +var _A2_method, _A2_instances, _a; class A2 { constructor() { - _method.add(this); - console.log(__classPrivateMethodGet(this, _method, _method_1)); + _A2_instances.add(this); + console.log(__classPrivateMethodGet(this, _A2_instances, _A2_method)); let a = this; - __classPrivateMethodGet(a, _method, _method_1).call(a); + __classPrivateMethodGet(a, _A2_instances, _A2_method).call(a); function foo() { - __classPrivateMethodGet(a, _method, _method_1).call(a); + __classPrivateMethodGet(a, _A2_instances, _A2_method).call(a); } } } -_method = new WeakSet(), _method_1 = function _method_1() { return ""; }; +_A2_instances = new WeakSet(), _A2_method = function _A2_method() { return ""; }; (_a = new A2())..call(_a); // Error function foo() { var _a; diff --git a/tests/baselines/reference/privateNameMethodAssignment.errors.txt b/tests/baselines/reference/privateNameMethodAssignment.errors.txt index d25297e3672ee..46d714ba467ec 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.errors.txt +++ b/tests/baselines/reference/privateNameMethodAssignment.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(4,14): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(5,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(6,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(7,20): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(9,11): error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(4,14): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(5,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(6,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(7,20): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(9,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. ==== tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts (5 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment constructor(a: A3, b: any) { this.#method = () => {} // Error, not writable ~~~~~~~ -!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. a.#method = () => { }; // Error, not writable ~~~~~~~ -!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. b.#method = () => { } //Error, not writable ~~~~~~~ -!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. ({ x: this.#method } = { x: () => {}}); //Error, not writable ~~~~~~~ -!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. let x = this.#method; b.#method++ //Error, not writable ~~~~~~~ -!!! error TS2798: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. } } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js index 0b410dba47ff1..85f31b9956db4 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.js +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -16,24 +16,24 @@ class A3 { var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { throw new TypeError("private element is not writable"); }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _method, _method_1; +var _A3_method, _A3_instances; class A3 { constructor(a, b) { var _a, _b; - _method.add(this); + _A3_instances.add(this); __classPrivateReadonly(); // Error, not writable __classPrivateReadonly(); // Error, not writable __classPrivateReadonly(); //Error, not writable (_a = this, { x: ({ set value(_b) { __classPrivateReadonly(); } }).value } = { x: () => { } }); //Error, not writable - let x = __classPrivateMethodGet(this, _method, _method_1); + let x = __classPrivateMethodGet(this, _A3_instances, _A3_method); __classPrivateReadonly(); //Error, not writable } ; } -_method = new WeakSet(), _method_1 = function _method_1() { }; +_A3_instances = new WeakSet(), _A3_method = function _A3_method() { }; diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js index f3621470dfd2e..59612f5a435a6 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.js +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -25,36 +25,36 @@ class AA { //// [privateNameMethodCallExpression.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _method, _method_1, _method2, _method2_1; +var _AA_method, _AA_method2, _AA_instances; class AA { constructor() { - _method.add(this); - _method2.add(this); + _AA_instances.add(this); + _AA_instances.add(this); this.x = 1; } ; ; test() { var _a, _b, _c; - __classPrivateMethodGet(this, _method, _method_1).call(this); - const func = __classPrivateMethodGet(this, _method, _method_1); + __classPrivateMethodGet(this, _AA_instances, _AA_method).call(this); + const func = __classPrivateMethodGet(this, _AA_instances, _AA_method); func(); - new (__classPrivateMethodGet(this, _method, _method_1))(); + new (__classPrivateMethodGet(this, _AA_instances, _AA_method))(); const arr = [1, 2]; - __classPrivateMethodGet(this, _method2, _method2_1).call(this, 0, ...arr, 3); - const b = new (__classPrivateMethodGet(this, _method2, _method2_1))(0, ...arr, 3); //Error - const str = __classPrivateMethodGet(this, _method2, _method2_1).bind(this) `head${1}middle${2}tail`; - __classPrivateMethodGet((_a = this.getInstance()), _method2, _method2_1).bind(_a) `test${1}and${2}`; - __classPrivateMethodGet((_b = this.getInstance()), _method2, _method2_1).call(_b, 0, ...arr, 3); - const b2 = new (__classPrivateMethodGet(this.getInstance(), _method2, _method2_1))(0, ...arr, 3); //Error - const str2 = __classPrivateMethodGet((_c = this.getInstance()), _method2, _method2_1).bind(_c) `head${1}middle${2}tail`; + __classPrivateMethodGet(this, _AA_instances, _AA_method2).call(this, 0, ...arr, 3); + const b = new (__classPrivateMethodGet(this, _AA_instances, _AA_method2))(0, ...arr, 3); //Error + const str = __classPrivateMethodGet(this, _AA_instances, _AA_method2).bind(this) `head${1}middle${2}tail`; + __classPrivateMethodGet((_a = this.getInstance()), _AA_instances, _AA_method2).bind(_a) `test${1}and${2}`; + __classPrivateMethodGet((_b = this.getInstance()), _AA_instances, _AA_method2).call(_b, 0, ...arr, 3); + const b2 = new (__classPrivateMethodGet(this.getInstance(), _AA_instances, _AA_method2))(0, ...arr, 3); //Error + const str2 = __classPrivateMethodGet((_c = this.getInstance()), _AA_instances, _AA_method2).bind(_c) `head${1}middle${2}tail`; } getInstance() { return new AA(); } } -_method = new WeakSet(), _method2 = new WeakSet(), _method_1 = function _method_1() { this.x = 10; }, _method2_1 = function _method2_1(a, ...b) { }; +_AA_instances = new WeakSet(), _AA_method = function _AA_method() { this.x = 10; }, _AA_method2 = function _AA_method2(a, ...b) { }; diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.js b/tests/baselines/reference/privateNameMethodsDerivedClasses.js index f9ef2fd785799..cff6820a5cae7 100644 --- a/tests/baselines/reference/privateNameMethodsDerivedClasses.js +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.js @@ -13,22 +13,22 @@ class Derived extends Base { //// [privateNameMethodsDerivedClasses.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _prop, _prop_1; +var _Base_prop, _Base_instances; class Base { constructor() { - _prop.add(this); + _Base_instances.add(this); } static method(x) { - console.log(__classPrivateMethodGet(x, _prop, _prop_1).call(x)); + console.log(__classPrivateMethodGet(x, _Base_instances, _Base_prop).call(x)); } } -_prop = new WeakSet(), _prop_1 = function _prop_1() { return 123; }; +_Base_instances = new WeakSet(), _Base_prop = function _Base_prop() { return 123; }; class Derived extends Base { static method(x) { console.log(x..call(x)); diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js index 8fcf71948a055..4d4829a85603d 100644 --- a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -16,10 +16,10 @@ class Base { //// [privateNameNestedClassAccessorsShadowing.js] -var _x; +var _Base_x; class Base { constructor() { - var _x_1; + var _Derived_x; class Derived { get () { return 1; } ; diff --git a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js index ae661e3230b6a..f55944d9e53aa 100644 --- a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js @@ -22,23 +22,23 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _x; +var _Base_x; class Base { constructor() { - var _x_1; - _x.set(this, void 0); + var _Derived_x; + _Base_x.set(this, void 0); class Derived { constructor() { - _x_1.set(this, void 0); + _Derived_x.set(this, void 0); } testBase(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(__classPrivateFieldGet(x, _Derived_x)); } testDerived(x) { - console.log(__classPrivateFieldGet(x, _x_1)); + console.log(__classPrivateFieldGet(x, _Derived_x)); } } - _x_1 = new WeakMap(); + _Derived_x = new WeakMap(); } } -_x = new WeakMap(); +_Base_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js index 0c27933904bcb..b8141f77f69f9 100644 --- a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js @@ -16,31 +16,31 @@ class Base { //// [privateNameNestedClassMethodShadowing.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _x, _x_1; +var _Base_x, _Base_instances; class Base { constructor() { - var _x_2, _x_3; - _x.add(this); + var _Derived_x, _Derived_instances; + _Base_instances.add(this); class Derived { constructor() { - _x_2.add(this); + _Derived_instances.add(this); } ; testBase(x) { - console.log(__classPrivateMethodGet(x, _x_2, _x_3)); + console.log(__classPrivateMethodGet(x, _Derived_instances, _Derived_x)); } testDerived(x) { - console.log(__classPrivateMethodGet(x, _x_2, _x_3)); + console.log(__classPrivateMethodGet(x, _Derived_instances, _Derived_x)); } } - _x_2 = new WeakSet(), _x_3 = function _x_3() { }; + _Derived_instances = new WeakSet(), _Derived_x = function _Derived_x() { }; } ; } -_x = new WeakSet(), _x_1 = function _x_1() { }; +_Base_instances = new WeakSet(), _Base_x = function _Base_x() { }; diff --git a/tests/baselines/reference/privateNameNestedClassNameConflict.js b/tests/baselines/reference/privateNameNestedClassNameConflict.js index 23bbeeaae8838..5716c3ccb5327 100644 --- a/tests/baselines/reference/privateNameNestedClassNameConflict.js +++ b/tests/baselines/reference/privateNameNestedClassNameConflict.js @@ -10,17 +10,17 @@ class A { //// [privateNameNestedClassNameConflict.js] -var _foo; +var _A_foo; class A { constructor() { - var _foo_1; - _foo.set(this, void 0); + var _A_foo_1; + _A_foo.set(this, void 0); class A { constructor() { - _foo_1.set(this, void 0); + _A_foo_1.set(this, void 0); } } - _foo_1 = new WeakMap(); + _A_foo_1 = new WeakMap(); } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNotAccessibleOutsideDefiningClass.js b/tests/baselines/reference/privateNameNotAccessibleOutsideDefiningClass.js index 3bb84305a4ac8..d2464aada4cdb 100644 --- a/tests/baselines/reference/privateNameNotAccessibleOutsideDefiningClass.js +++ b/tests/baselines/reference/privateNameNotAccessibleOutsideDefiningClass.js @@ -8,11 +8,11 @@ new A().#foo = 4; // Error //// [privateNameNotAccessibleOutsideDefiningClass.js] "use strict"; -var _foo; +var _A_foo; class A { constructor() { - _foo.set(this, 3); + _A_foo.set(this, 3); } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); new A(). = 4; // Error diff --git a/tests/baselines/reference/privateNameWeakMapCollision.js b/tests/baselines/reference/privateNameWeakMapCollision.js index 8b810f62240ae..b8f24089dd974 100644 --- a/tests/baselines/reference/privateNameWeakMapCollision.js +++ b/tests/baselines/reference/privateNameWeakMapCollision.js @@ -9,12 +9,12 @@ function test() { //// [privateNameWeakMapCollision.js] function test() { - var _x; + var _C_x; let WeakMap; class C { constructor() { - _x.set(this, void 0); + _C_x.set(this, void 0); } } - _x = new WeakMap(); + _C_x = new WeakMap(); } diff --git a/tests/baselines/reference/privateNamesAndDecorators.js b/tests/baselines/reference/privateNamesAndDecorators.js index 980a929454ef9..9fd8181f6f006 100644 --- a/tests/baselines/reference/privateNamesAndDecorators.js +++ b/tests/baselines/reference/privateNamesAndDecorators.js @@ -10,12 +10,12 @@ class A { //// [privateNamesAndDecorators.js] -var _foo, _bar, _bar_1; +var _A_foo, _A_bar, _A_instances; var A = /** @class */ (function () { function A() { - _bar.add(this); - _foo.set(this, 1); + _A_instances.add(this); + _A_foo.set(this, 1); } return A; }()); -_foo = new WeakMap(), _bar = new WeakSet(), _bar_1 = function _bar_1() { }; +_A_foo = new WeakMap(), _A_instances = new WeakSet(), _A_bar = function _A_bar() { }; diff --git a/tests/baselines/reference/privateNamesAndFields.js b/tests/baselines/reference/privateNamesAndFields.js index 5af74f92ab9a0..c2eb9e45e71ca 100644 --- a/tests/baselines/reference/privateNamesAndFields.js +++ b/tests/baselines/reference/privateNamesAndFields.js @@ -24,19 +24,19 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _foo, _foo_1; +var _A_foo, _B_foo; class A { constructor() { - _foo.set(this, void 0); - __classPrivateFieldSet(this, _foo, 3); + _A_foo.set(this, void 0); + __classPrivateFieldSet(this, _A_foo, 3); } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); class B extends A { constructor() { super(); - _foo_1.set(this, void 0); - __classPrivateFieldSet(this, _foo_1, "some string"); + _B_foo.set(this, void 0); + __classPrivateFieldSet(this, _B_foo, "some string"); } } -_foo_1 = new WeakMap(); +_B_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index c2ddf072fdcf1..f9901a710c269 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -36,8 +36,8 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; @@ -48,23 +48,23 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _bar_1; +var _C_foo, _C_bar, _C_instances; class C { constructor(t) { - _bar.add(this); - _foo.set(this, void 0); - __classPrivateFieldSet(this, _foo, t); - t = __classPrivateMethodGet(this, _bar, _bar_1).call(this); + _C_instances.add(this); + _C_foo.set(this, void 0); + __classPrivateFieldSet(this, _C_foo, t); + t = __classPrivateMethodGet(this, _C_instances, _C_bar).call(this); } set baz(t) { - __classPrivateFieldSet(this, _foo, t); + __classPrivateFieldSet(this, _C_foo, t); } get baz() { - return __classPrivateFieldGet(this, _foo); + return __classPrivateFieldGet(this, _C_foo); } } -_foo = new WeakMap(), _bar = new WeakSet(), _bar_1 = function _bar_1() { - return __classPrivateFieldGet(this, _foo); +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_bar = function _C_bar() { + return __classPrivateFieldGet(this, _C_foo); }; let a = new C(3); let b = new C("hello"); diff --git a/tests/baselines/reference/privateNamesAndIndexedAccess.js b/tests/baselines/reference/privateNamesAndIndexedAccess.js index 19487e81479cb..1b36a27bf0c11 100644 --- a/tests/baselines/reference/privateNamesAndIndexedAccess.js +++ b/tests/baselines/reference/privateNamesAndIndexedAccess.js @@ -14,11 +14,11 @@ class C { //// [privateNamesAndIndexedAccess.js] "use strict"; -var _bar; +var _C_bar; class C { constructor() { this.foo = 3; - _bar.set(this, 3); + _C_bar.set(this, 3); const ok = 3; // not supported yet, could support in future: const badForNow, #bar; @@ -27,4 +27,4 @@ class C { const badAlways = 3; // Error } } -_bar = new WeakMap(); +_C_bar = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index 5b3458d049a7f..b6adb45a818dd 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -37,22 +37,22 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _foo_1; +var _A_foo, _A_bar, _B_foo; class A { constructor() { - __classPrivateFieldSet(A, _foo, 3); - __classPrivateFieldGet(B, _foo); // Error - __classPrivateFieldGet(B, _bar); // Error + __classPrivateFieldSet(A, _A_foo, 3); + __classPrivateFieldGet(B, _A_foo); // Error + __classPrivateFieldGet(B, _A_bar); // Error } } -_foo = new WeakMap(), _bar = new WeakMap(); +_A_foo = new WeakMap(), _A_bar = new WeakMap(); class B extends A { constructor() { super(); - __classPrivateFieldSet(B, _foo_1, "some string"); + __classPrivateFieldSet(B, _B_foo, "some string"); } } -_foo_1 = new WeakMap(); +_B_foo = new WeakMap(); // We currently filter out static private identifier fields in `getUnmatchedProperties`. // We will need a more robust solution when we support static fields const willErrorSomeDay = class { diff --git a/tests/baselines/reference/privateNamesAndkeyof.js b/tests/baselines/reference/privateNamesAndkeyof.js index 46d4bcf36cb41..c726cbfccd4c4 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.js +++ b/tests/baselines/reference/privateNamesAndkeyof.js @@ -13,11 +13,11 @@ type T = keyof A // should not include '#foo*' //// [privateNamesAndkeyof.js] "use strict"; -var _fooField, _fooMethod, _fooMethod_1, _fooProp, _fooProp_1; +var _A_fooField, _A_fooMethod, _A_fooProp, _A_fooProp_1, _A_instances; class A { constructor() { - _fooMethod.add(this); - _fooField.set(this, 3); + _A_instances.add(this); + _A_fooField.set(this, 3); this.bar = 3; this.baz = 3; } @@ -27,4 +27,4 @@ class A { set (value) { } ; } -_fooField = new WeakMap(), _fooMethod = new WeakSet(), _fooMethod_1 = function _fooMethod_1() { }; +_A_fooField = new WeakMap(), _A_instances = new WeakSet(), _A_fooMethod = function _A_fooMethod() { }; diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index dfba142f9aa53..a3676eb8e4c9c 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -21,23 +21,23 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _foo_1, _bar_1; +var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { - _foo.set(this, 3); + _Parent_foo.set(this, 3); } accessChildProps() { - __classPrivateFieldGet(new Child(), _foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _bar); // Error: not found + __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) + __classPrivateFieldGet(Child, _Parent_bar); // Error: not found } } -_foo = new WeakMap(), _bar = new WeakMap(); -_bar.set(Parent, 5); +_Parent_foo = new WeakMap(), _Parent_bar = new WeakMap(); +_Parent_bar.set(Parent, 5); class Child extends Parent { constructor() { super(...arguments); - _foo_1.set(this, "foo"); // OK (Child's #foo does not conflict, as `Parent`'s `#foo` is not accessible) - _bar_1.set(this, "bar"); // OK + _Child_foo.set(this, "foo"); // OK (Child's #foo does not conflict, as `Parent`'s `#foo` is not accessible) + _Child_bar.set(this, "bar"); // OK } } -_foo_1 = new WeakMap(), _bar_1 = new WeakMap(); +_Child_foo = new WeakMap(), _Child_bar = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index 0d0069a47a9ad..7b4f40b8de8ef 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -23,24 +23,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar, _foo_1, _bar_1; +var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { - _foo.set(this, 3); + _Parent_foo.set(this, 3); } accessChildProps() { - __classPrivateFieldGet(new Child(), _foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _bar); // Error: not found + __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) + __classPrivateFieldGet(Child, _Parent_bar); // Error: not found } } -_foo = new WeakMap(), _bar = new WeakMap(); -_bar.set(Parent, 5); +_Parent_foo = new WeakMap(), _Parent_bar = new WeakMap(); +_Parent_bar.set(Parent, 5); class Child extends Parent { constructor() { super(...arguments); - _foo_1.set(this, "foo"); // OK (Child's #foo does not conflict, as `Parent`'s `#foo` is not accessible) - _bar_1.set(this, "bar"); // OK + _Child_foo.set(this, "foo"); // OK (Child's #foo does not conflict, as `Parent`'s `#foo` is not accessible) + _Child_bar.set(this, "bar"); // OK } } -_foo_1 = new WeakMap(), _bar_1 = new WeakMap(); +_Child_foo = new WeakMap(), _Child_bar = new WeakMap(); new Parent().accessChildProps(); diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index cdf92030f3742..ee64cee48f85e 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -42,31 +42,31 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _foo, _method, _method_1, _prop, _prop_1; +var _C_foo, _C_method, _C_prop, _C_prop_1, _C_instances; class C { constructor() { - _method.add(this); - _foo.set(this, void 0); + _C_instances.add(this); + _C_foo.set(this, void 0); } - get () { return __classPrivateFieldGet(this, _foo); } - set (value) { __classPrivateFieldSet(this, _foo, value); } - bar(x) { return __classPrivateFieldGet(x, _foo); } // OK - bar2(x) { return __classPrivateMethodGet(x, _method, _method_1).call(x); } // OK + get () { return __classPrivateFieldGet(this, _C_foo); } + set (value) { __classPrivateFieldSet(this, _C_foo, value); } + bar(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + bar2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method).call(x); } // OK bar3(x) { return x.; } // OK - baz(x) { return __classPrivateFieldGet(x, _foo); } // OK - baz2(x) { return __classPrivateMethodGet(x, _method, _method_1); } // OK + baz(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + baz2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK baz3(x) { return x.; } // OK - quux(x) { return __classPrivateFieldGet(x, _foo); } // OK - quux2(x) { return __classPrivateMethodGet(x, _method, _method_1); } // OK + quux(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + quux2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK quux3(x) { return x.; } // OK } -_foo = new WeakMap(), _method = new WeakSet(), _method_1 = function _method_1() { return __classPrivateFieldGet(this, _foo); }; +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo); }; a.; // Error a.; // Error a.; // Error diff --git a/tests/baselines/reference/privateNamesInNestedClasses-1.js b/tests/baselines/reference/privateNamesInNestedClasses-1.js index 12804200745da..22730b36fcf49 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-1.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-1.js @@ -34,29 +34,29 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _bar; +var _A_foo, _A_bar; class A { constructor() { - _foo.set(this, "A's #foo"); - _bar.set(this, "A's #bar"); + _A_foo.set(this, "A's #foo"); + _A_bar.set(this, "A's #bar"); } method() { - var _foo_1; + var _B_foo; class B { constructor() { - _foo_1.set(this, "B's #foo"); + _B_foo.set(this, "B's #foo"); } bar(a) { - __classPrivateFieldGet(a, _foo_1); // OK, no compile-time error, don't know what `a` is + __classPrivateFieldGet(a, _B_foo); // OK, no compile-time error, don't know what `a` is } baz(a) { - __classPrivateFieldGet(a, _foo_1); // compile-time error, shadowed + __classPrivateFieldGet(a, _B_foo); // compile-time error, shadowed } quux(b) { - __classPrivateFieldGet(b, _foo_1); // OK + __classPrivateFieldGet(b, _B_foo); // OK } } - _foo_1 = new WeakMap(); + _B_foo = new WeakMap(); const a = new A(); new B().bar(a); new B().baz(a); @@ -64,5 +64,5 @@ class A { new B().quux(b); } } -_foo = new WeakMap(), _bar = new WeakMap(); +_A_foo = new WeakMap(), _A_bar = new WeakMap(); new A().method(); diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.js b/tests/baselines/reference/privateNamesInNestedClasses-2.js index 896beb6308339..a01a20f452981 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.js @@ -24,22 +24,22 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _x; +var _A_x; class A { constructor() { - var _x_1; + var _B_x; class B { constructor() { - _x_1.set(this, 5); + _B_x.set(this, 5); class C { constructor() { - __classPrivateFieldGet(A, _x_1); // error + __classPrivateFieldGet(A, _B_x); // error } } } } - _x_1 = new WeakMap(); + _B_x = new WeakMap(); } } -_x = new WeakMap(); -_x.set(A, 5); +_A_x = new WeakMap(); +_A_x.set(A, 5); diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index 6068d8ea69098..c537d2bdb85bd 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -57,20 +57,20 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; -var _foo, _bar, _baz, _qux, _fooMethod, _fooMethod_1, _barMethod, _barMethod_1, _bazMethod, _bazMethod_1, _quxMethod, _quxMethod_1, _asyncMethod, _asyncMethod_1, _genMethod, _genMethod_1, _asyncGenMethod, _asyncGenMethod_1, _fooProp, _fooProp_1, _barProp, _barProp_1, _bazProp, _bazProp_1, _quxProp, _quxProp_1, _whatProp, _whatProp_1, _asyncProp, _asyncProp_1; +var _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp, _A_fooProp_1, _A_barProp, _A_barProp_1, _A_bazProp, _A_bazProp_1, _A_quxProp, _A_quxProp_1, _A_whatProp, _A_whatProp_1, _A_asyncProp, _A_asyncProp_1, _A_instances; class A { constructor() { - _fooMethod.add(this); - _barMethod.add(this); - _bazMethod.add(this); - _quxMethod.add(this); - _asyncMethod.add(this); - _genMethod.add(this); - _asyncGenMethod.add(this); - _foo.set(this, 3); // Error - _bar.set(this, 3); // Error - _baz.set(this, 3); // Error - _qux.set(this, 3); // OK + _A_instances.add(this); + _A_instances.add(this); + _A_instances.add(this); + _A_instances.add(this); + _A_instances.add(this); + _A_instances.add(this); + _A_instances.add(this); + _A_foo.set(this, 3); // Error + _A_bar.set(this, 3); // Error + _A_baz.set(this, 3); // Error + _A_qux.set(this, 3); // OK } get () { return 3; } // Error set (value) { } // Error @@ -85,8 +85,8 @@ class A { get () { return 1; } // Error set (value) { } // Error } -_foo = new WeakMap(), _bar = new WeakMap(), _baz = new WeakMap(), _qux = new WeakMap(), _fooMethod = new WeakSet(), _barMethod = new WeakSet(), _bazMethod = new WeakSet(), _quxMethod = new WeakSet(), _asyncMethod = new WeakSet(), _genMethod = new WeakSet(), _asyncGenMethod = new WeakSet(), _fooMethod_1 = function _fooMethod_1() { return 3; }, _barMethod_1 = function _barMethod_1() { return 3; }, _bazMethod_1 = function _bazMethod_1() { return 3; }, _quxMethod_1 = function _quxMethod_1() { return 3; }, _asyncMethod_1 = function _asyncMethod_1() { +_A_foo = new WeakMap(), _A_bar = new WeakMap(), _A_baz = new WeakMap(), _A_qux = new WeakMap(), _A_instances = new WeakSet(), _A_fooMethod = function _A_fooMethod() { return 3; }, _A_barMethod = function _A_barMethod() { return 3; }, _A_bazMethod = function _A_bazMethod() { return 3; }, _A_quxMethod = function _A_quxMethod() { return 3; }, _A_asyncMethod = function _A_asyncMethod() { return __awaiter(this, void 0, void 0, function* () { return 1; }); -}, _genMethod_1 = function* _genMethod_1() { return 1; }, _asyncGenMethod_1 = function _asyncGenMethod_1() { return __asyncGenerator(this, arguments, function* _asyncGenMethod_1_1() { return yield __await(1); }); }; +}, _A_genMethod = function* _A_genMethod() { return 1; }, _A_asyncGenMethod = function _A_asyncGenMethod() { return __asyncGenerator(this, arguments, function* _A_asyncGenMethod_1() { return yield __await(1); }); }; class B { } diff --git a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js index f6bbc9fa54dc8..3958fa5ab2b26 100644 --- a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js +++ b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js @@ -21,16 +21,16 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function ( privateMap.set(receiver, value); return value; }; -var _prop; +var _C_prop; class C { constructor() { - _prop.set(this, void 0); + _C_prop.set(this, void 0); } func(x) { - __classPrivateFieldSet(x, _prop, 123); + __classPrivateFieldSet(x, _C_prop, 123); } } -_prop = new WeakMap(); +_C_prop = new WeakMap(); function func(x) { x. = 123; } diff --git a/tests/baselines/reference/privateNamesNoDelete.js b/tests/baselines/reference/privateNamesNoDelete.js index 22aecf24cca31..1614af7f8850b 100644 --- a/tests/baselines/reference/privateNamesNoDelete.js +++ b/tests/baselines/reference/privateNamesNoDelete.js @@ -15,11 +15,11 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _v; +var _A_v; class A { constructor() { - _v.set(this, 1); - delete __classPrivateFieldGet(this, _v); // Error: The operand of a delete operator cannot be a private name. + _A_v.set(this, 1); + delete __classPrivateFieldGet(this, _A_v); // Error: The operand of a delete operator cannot be a private name. } } -_v = new WeakMap(); +_A_v = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesUnique-1.js b/tests/baselines/reference/privateNamesUnique-1.js index 1fb8b7255c9bf..cab1354d7b004 100644 --- a/tests/baselines/reference/privateNamesUnique-1.js +++ b/tests/baselines/reference/privateNamesUnique-1.js @@ -12,17 +12,17 @@ const b: A = new B(); // Error: Property #foo is missing //// [privateNamesUnique-1.js] "use strict"; -var _foo, _foo_1; +var _A_foo, _B_foo; class A { constructor() { - _foo.set(this, void 0); + _A_foo.set(this, void 0); } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); class B { constructor() { - _foo_1.set(this, void 0); + _B_foo.set(this, void 0); } } -_foo_1 = new WeakMap(); +_B_foo = new WeakMap(); const b = new B(); // Error: Property #foo is missing diff --git a/tests/baselines/reference/privateNamesUnique-2.js b/tests/baselines/reference/privateNamesUnique-2.js index 4f772551b544a..b973c3fa3e5cf 100644 --- a/tests/baselines/reference/privateNamesUnique-2.js +++ b/tests/baselines/reference/privateNamesUnique-2.js @@ -23,13 +23,13 @@ a.copy(b); // error //// [b.js] -var _x; +var _Foo_x; export class Foo { constructor() { - _x.set(this, void 0); + _Foo_x.set(this, void 0); } } -_x = new WeakMap(); +_Foo_x = new WeakMap(); //// [a.js] var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { if (!privateMap.has(receiver)) { @@ -37,16 +37,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _x; +var _Foo_x; export class Foo { constructor() { - _x.set(this, void 0); + _Foo_x.set(this, void 0); } copy(other) { - __classPrivateFieldGet(other, _x); // error + __classPrivateFieldGet(other, _Foo_x); // error } } -_x = new WeakMap(); +_Foo_x = new WeakMap(); //// [main.js] import { Foo as A } from "./a"; import { Foo as B } from "./b"; diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index 9575d6d89c57d..3368aff5ed039 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -21,21 +21,21 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _foo, _foo_1, _foo_2; +var _A_foo, _A_foo_1, _B_foo; class A { constructor() { - _foo_1.set(this, 1); + _A_foo_1.set(this, 1); // because static and instance private names // share the same lexical scope // https://tc39.es/proposal-class-fields/#prod-ClassBody } } -_foo = new WeakMap(), _foo_1 = new WeakMap(); -_foo_1.set(A, true); // error (duplicate) +_A_foo = new WeakMap(), _A_foo_1 = new WeakMap(); +_A_foo_1.set(A, true); // error (duplicate) class B { test(x) { - __classPrivateFieldGet(x, _foo_2); // error (#foo is a static property on B, not an instance property) + __classPrivateFieldGet(x, _B_foo); // error (#foo is a static property on B, not an instance property) } } -_foo_2 = new WeakMap(); -_foo_2.set(B, true); +_B_foo = new WeakMap(); +_B_foo.set(B, true); diff --git a/tests/baselines/reference/privateNamesUnique-4.js b/tests/baselines/reference/privateNamesUnique-4.js index 38db50f3475bf..15ca00f318b01 100644 --- a/tests/baselines/reference/privateNamesUnique-4.js +++ b/tests/baselines/reference/privateNamesUnique-4.js @@ -8,13 +8,13 @@ const c: C = a; //// [privateNamesUnique-4.js] -var _something; +var _C_something; class A1 { } class C { constructor() { - _something.set(this, void 0); + _C_something.set(this, void 0); } } -_something = new WeakMap(); +_C_something = new WeakMap(); const c = a; diff --git a/tests/baselines/reference/privateNamesUnique-5.js b/tests/baselines/reference/privateNamesUnique-5.js index 75d378c1f1d03..fa8eb5639a966 100644 --- a/tests/baselines/reference/privateNamesUnique-5.js +++ b/tests/baselines/reference/privateNamesUnique-5.js @@ -16,17 +16,17 @@ const b: A2 = new B(); //// [privateNamesUnique-5.js] "use strict"; // same as privateNamesUnique-1, but with an interface -var _foo, _foo_1; +var _A_foo, _B_foo; class A { constructor() { - _foo.set(this, void 0); + _A_foo.set(this, void 0); } } -_foo = new WeakMap(); +_A_foo = new WeakMap(); class B { constructor() { - _foo_1.set(this, void 0); + _B_foo.set(this, void 0); } } -_foo_1 = new WeakMap(); +_B_foo = new WeakMap(); const b = new B(); diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index 9c9aa7fab81de..b55b9b2077db3 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -27,40 +27,40 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, accessCheck, fn) { - if (!accessCheck.has(receiver)) { +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { throw new TypeError("attempted to get private method on non-instance"); } return fn; }; -var _foo, _bar, _foo_1, _bar_1, _bar_2, _foo_2, _bar_3, _foo_3, _bar_4; +var _A_foo, _A_bar, _A2_foo, _A2_bar, _A2_instances, _A3_foo, _A3_bar, _B_foo, _B_bar; class A { constructor() { - _foo.set(this, __classPrivateFieldGet(this, _bar)); // Error - _bar.set(this, 3); + _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); // Error + _A_bar.set(this, 3); } } -_foo = new WeakMap(), _bar = new WeakMap(); +_A_foo = new WeakMap(), _A_bar = new WeakMap(); class A2 { constructor() { - _bar_1.add(this); - _foo_1.set(this, __classPrivateMethodGet(this, _bar_1, _bar_2).call(this)); // No Error + _A2_instances.add(this); + _A2_foo.set(this, __classPrivateMethodGet(this, _A2_instances, _A2_bar).call(this)); // No Error } ; } -_foo_1 = new WeakMap(), _bar_1 = new WeakSet(), _bar_2 = function _bar_2() { return 3; }; +_A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_bar = function _A2_bar() { return 3; }; class A3 { constructor() { - _foo_2.set(this, this.); // No Error + _A3_foo.set(this, this.); // No Error } get () { return 3; } ; } -_foo_2 = new WeakMap(); +_A3_foo = new WeakMap(); class B { constructor() { - _foo_3.set(this, __classPrivateFieldGet(this, _bar_4)); // Error - _bar_4.set(this, __classPrivateFieldGet(this, _foo_3)); + _B_foo.set(this, __classPrivateFieldGet(this, _B_bar)); // Error + _B_bar.set(this, __classPrivateFieldGet(this, _B_foo)); } } -_foo_3 = new WeakMap(), _bar_4 = new WeakMap(); +_B_foo = new WeakMap(), _B_bar = new WeakMap(); diff --git a/tests/baselines/reference/strictPropertyInitialization.js b/tests/baselines/reference/strictPropertyInitialization.js index 86d29d3ad90f2..23505b7087f47 100644 --- a/tests/baselines/reference/strictPropertyInitialization.js +++ b/tests/baselines/reference/strictPropertyInitialization.js @@ -150,16 +150,16 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _f, _g, _h, _i, _d, _e, _f_1, _b, _b_1, _b_2, _d_1, _b_3; +var _C1_f, _C1_g, _C1_h, _C1_i, _C4_d, _C4_e, _C4_f, _C5_b, _C6_b, _C7_b, _C10_d, _C11_b; class C1 { constructor() { - _f.set(this, void 0); //Error - _g.set(this, void 0); - _h.set(this, void 0); //Error - _i.set(this, void 0); + _C1_f.set(this, void 0); //Error + _C1_g.set(this, void 0); + _C1_h.set(this, void 0); //Error + _C1_i.set(this, void 0); } } -_f = new WeakMap(), _g = new WeakMap(), _h = new WeakMap(), _i = new WeakMap(); +_C1_f = new WeakMap(), _C1_g = new WeakMap(), _C1_h = new WeakMap(), _C1_i = new WeakMap(); // No strict initialization checks for static members class C3 { } @@ -169,46 +169,46 @@ class C4 { this.a = 0; this.b = 0; this.c = "abc"; - _d.set(this, 0); - _e.set(this, 0); - _f_1.set(this, "abc"); + _C4_d.set(this, 0); + _C4_e.set(this, 0); + _C4_f.set(this, "abc"); } } -_d = new WeakMap(), _e = new WeakMap(), _f_1 = new WeakMap(); +_C4_d = new WeakMap(), _C4_e = new WeakMap(), _C4_f = new WeakMap(); // Assignment in constructor satisfies strict initialization check class C5 { constructor() { - _b.set(this, void 0); + _C5_b.set(this, void 0); this.a = 0; - __classPrivateFieldSet(this, _b, 0); + __classPrivateFieldSet(this, _C5_b, 0); } } -_b = new WeakMap(); +_C5_b = new WeakMap(); // All code paths must contain assignment class C6 { constructor(cond) { - _b_1.set(this, void 0); + _C6_b.set(this, void 0); if (cond) { return; } this.a = 0; - __classPrivateFieldSet(this, _b_1, 0); + __classPrivateFieldSet(this, _C6_b, 0); } } -_b_1 = new WeakMap(); +_C6_b = new WeakMap(); class C7 { constructor(cond) { - _b_2.set(this, void 0); + _C7_b.set(this, void 0); if (cond) { this.a = 1; - __classPrivateFieldSet(this, _b_2, 1); + __classPrivateFieldSet(this, _C7_b, 1); return; } this.a = 0; - __classPrivateFieldSet(this, _b_2, 1); + __classPrivateFieldSet(this, _C7_b, 1); } } -_b_2 = new WeakMap(); +_C7_b = new WeakMap(); // Properties with string literal names aren't checked class C8 { } @@ -219,24 +219,24 @@ class C9 { // within their constructor class C10 { constructor() { - _d_1.set(this, void 0); + _C10_d.set(this, void 0); let x = this.a; // Error this.a = this.b; // Error - this.b = __classPrivateFieldGet(this, _d_1); //Error + this.b = __classPrivateFieldGet(this, _C10_d); //Error this.b = x; - __classPrivateFieldSet(this, _d_1, x); + __classPrivateFieldSet(this, _C10_d, x); let y = this.c; } } -_d_1 = new WeakMap(); +_C10_d = new WeakMap(); class C11 { constructor() { - _b_3.set(this, void 0); + _C11_b.set(this, void 0); this.a = someValue(); - __classPrivateFieldSet(this, _b_3, someValue()); + __classPrivateFieldSet(this, _C11_b, someValue()); } } -_b_3 = new WeakMap(); +_C11_b = new WeakMap(); //// [strictPropertyInitialization.d.ts] From 0ac12711a50ec5422d8db0edf49346f14636f9af Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 14:52:26 +0000 Subject: [PATCH 10/68] Add a test for using private methods in static field initializers Signed-off-by: Kubilay Kahveci --- .../privateNameMethodInStaticFieldInit.js | 25 +++++++++++++++++++ ...privateNameMethodInStaticFieldInit.symbols | 21 ++++++++++++++++ .../privateNameMethodInStaticFieldInit.types | 25 +++++++++++++++++++ .../privateNameMethodInStaticFieldInit.ts | 8 ++++++ 4 files changed, 79 insertions(+) create mode 100644 tests/baselines/reference/privateNameMethodInStaticFieldInit.js create mode 100644 tests/baselines/reference/privateNameMethodInStaticFieldInit.symbols create mode 100644 tests/baselines/reference/privateNameMethodInStaticFieldInit.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts diff --git a/tests/baselines/reference/privateNameMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js new file mode 100644 index 0000000000000..4ea2c49e6ba85 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js @@ -0,0 +1,25 @@ +//// [privateNameMethodInStaticFieldInit.ts] +class C { + static s = new C().#method(); + #method() { return 42; } +} + +console.log(C.s); + + +//// [privateNameMethodInStaticFieldInit.js] +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _C_method, _C_instances, _a; +class C { + constructor() { + _C_instances.add(this); + } +} +_C_instances = new WeakSet(), _C_method = function _C_method() { return 42; }; +C.s = __classPrivateMethodGet((_a = new C()), _C_instances, _C_method).call(_a); +console.log(C.s); diff --git a/tests/baselines/reference/privateNameMethodInStaticFieldInit.symbols b/tests/baselines/reference/privateNameMethodInStaticFieldInit.symbols new file mode 100644 index 0000000000000..ad742e35da81c --- /dev/null +++ b/tests/baselines/reference/privateNameMethodInStaticFieldInit.symbols @@ -0,0 +1,21 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts === +class C { +>C : Symbol(C, Decl(privateNameMethodInStaticFieldInit.ts, 0, 0)) + + static s = new C().#method(); +>s : Symbol(C.s, Decl(privateNameMethodInStaticFieldInit.ts, 0, 9)) +>new C().#method : Symbol(C.#method, Decl(privateNameMethodInStaticFieldInit.ts, 1, 33)) +>C : Symbol(C, Decl(privateNameMethodInStaticFieldInit.ts, 0, 0)) + + #method() { return 42; } +>#method : Symbol(C.#method, Decl(privateNameMethodInStaticFieldInit.ts, 1, 33)) +} + +console.log(C.s); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.s : Symbol(C.s, Decl(privateNameMethodInStaticFieldInit.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameMethodInStaticFieldInit.ts, 0, 0)) +>s : Symbol(C.s, Decl(privateNameMethodInStaticFieldInit.ts, 0, 9)) + diff --git a/tests/baselines/reference/privateNameMethodInStaticFieldInit.types b/tests/baselines/reference/privateNameMethodInStaticFieldInit.types new file mode 100644 index 0000000000000..7319a1f3082a0 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodInStaticFieldInit.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts === +class C { +>C : C + + static s = new C().#method(); +>s : number +>new C().#method() : number +>new C().#method : () => number +>new C() : C +>C : typeof C + + #method() { return 42; } +>#method : () => number +>42 : 42 +} + +console.log(C.s); +>console.log(C.s) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.s : number +>C : typeof C +>s : number + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts new file mode 100644 index 0000000000000..440ddb0cf1a71 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodInStaticFieldInit.ts @@ -0,0 +1,8 @@ +// @target: es2015 + +class C { + static s = new C().#method(); + #method() { return 42; } +} + +console.log(C.s); From 7da5bd99e0f4d138b10c47b495c44eddc333ca43 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 15:51:07 +0000 Subject: [PATCH 11/68] Add breaking checker test Private methods inside class expressions should not error. Signed-off-by: Kubilay Kahveci --- ...rivateNameMethodClassExpression.errors.txt | 24 +++++++++ .../privateNameMethodClassExpression.js | 44 +++++++++++++++ .../privateNameMethodClassExpression.symbols | 43 +++++++++++++++ .../privateNameMethodClassExpression.types | 54 +++++++++++++++++++ .../privateNameMethodClassExpression.ts | 13 +++++ 5 files changed, 178 insertions(+) create mode 100644 tests/baselines/reference/privateNameMethodClassExpression.errors.txt create mode 100644 tests/baselines/reference/privateNameMethodClassExpression.js create mode 100644 tests/baselines/reference/privateNameMethodClassExpression.symbols create mode 100644 tests/baselines/reference/privateNameMethodClassExpression.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts diff --git a/tests/baselines/reference/privateNameMethodClassExpression.errors.txt b/tests/baselines/reference/privateNameMethodClassExpression.errors.txt new file mode 100644 index 0000000000000..c03f18b10696b --- /dev/null +++ b/tests/baselines/reference/privateNameMethodClassExpression.errors.txt @@ -0,0 +1,24 @@ +tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(3,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(9,17): error TS18013: Property '#method' is not accessible outside class '(anonymous)' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(10,17): error TS18013: Property '#field' is not accessible outside class '(anonymous)' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts (3 errors) ==== + const C = class { + #field = this.#method(); + #method() { return 42; } + ~~~~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + static getInstance() { return new C(); } + getField() { return this.#field }; + } + + console.log(C.getInstance().getField()); + C.getInstance().#method; // Error + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class '(anonymous)' because it has a private identifier. + C.getInstance().#field; // Error + ~~~~~~ +!!! error TS18013: Property '#field' is not accessible outside class '(anonymous)' because it has a private identifier. + + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodClassExpression.js b/tests/baselines/reference/privateNameMethodClassExpression.js new file mode 100644 index 0000000000000..e4a327c16d219 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodClassExpression.js @@ -0,0 +1,44 @@ +//// [privateNameMethodClassExpression.ts] +const C = class { + #field = this.#method(); + #method() { return 42; } + static getInstance() { return new C(); } + getField() { return this.#field }; +} + +console.log(C.getInstance().getField()); +C.getInstance().#method; // Error +C.getInstance().#field; // Error + + + +//// [privateNameMethodClassExpression.js] +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var _C_field, _C_method, _C_instances, _a; +const C = (_a = class { + constructor() { + _C_instances.add(this); + _C_field.set(this, __classPrivateMethodGet(this, _C_instances, _C_method).call(this)); + } + static getInstance() { return new C(); } + getField() { return __classPrivateFieldGet(this, _C_field); } + ; + }, + _C_field = new WeakMap(), + _C_instances = new WeakSet(), + _C_method = function _C_method() { return 42; }, + _a); +console.log(C.getInstance().getField()); +C.getInstance().; // Error +C.getInstance().; // Error diff --git a/tests/baselines/reference/privateNameMethodClassExpression.symbols b/tests/baselines/reference/privateNameMethodClassExpression.symbols new file mode 100644 index 0000000000000..b24d490bdebbb --- /dev/null +++ b/tests/baselines/reference/privateNameMethodClassExpression.symbols @@ -0,0 +1,43 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts === +const C = class { +>C : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 5)) + + #field = this.#method(); +>#field : Symbol(C.#field, Decl(privateNameMethodClassExpression.ts, 0, 17)) +>this.#method : Symbol(C.#method, Decl(privateNameMethodClassExpression.ts, 1, 28)) +>this : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 9)) + + #method() { return 42; } +>#method : Symbol(C.#method, Decl(privateNameMethodClassExpression.ts, 1, 28)) + + static getInstance() { return new C(); } +>getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 5)) + + getField() { return this.#field }; +>getField : Symbol(C.getField, Decl(privateNameMethodClassExpression.ts, 3, 44)) +>this.#field : Symbol(C.#field, Decl(privateNameMethodClassExpression.ts, 0, 17)) +>this : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 9)) +} + +console.log(C.getInstance().getField()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.getInstance().getField : Symbol(C.getField, Decl(privateNameMethodClassExpression.ts, 3, 44)) +>C.getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 5)) +>getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) +>getField : Symbol(C.getField, Decl(privateNameMethodClassExpression.ts, 3, 44)) + +C.getInstance().#method; // Error +>C.getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 5)) +>getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) + +C.getInstance().#field; // Error +>C.getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameMethodClassExpression.ts, 0, 5)) +>getInstance : Symbol(C.getInstance, Decl(privateNameMethodClassExpression.ts, 2, 28)) + + diff --git a/tests/baselines/reference/privateNameMethodClassExpression.types b/tests/baselines/reference/privateNameMethodClassExpression.types new file mode 100644 index 0000000000000..4800eefe52279 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodClassExpression.types @@ -0,0 +1,54 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts === +const C = class { +>C : typeof C +>class { #field = this.#method(); #method() { return 42; } static getInstance() { return new C(); } getField() { return this.#field };} : typeof C + + #field = this.#method(); +>#field : number +>this.#method() : number +>this.#method : () => number +>this : this + + #method() { return 42; } +>#method : () => number +>42 : 42 + + static getInstance() { return new C(); } +>getInstance : () => C +>new C() : C +>C : typeof C + + getField() { return this.#field }; +>getField : () => number +>this.#field : number +>this : this +} + +console.log(C.getInstance().getField()); +>console.log(C.getInstance().getField()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.getInstance().getField() : number +>C.getInstance().getField : () => number +>C.getInstance() : C +>C.getInstance : () => C +>C : typeof C +>getInstance : () => C +>getField : () => number + +C.getInstance().#method; // Error +>C.getInstance().#method : any +>C.getInstance() : C +>C.getInstance : () => C +>C : typeof C +>getInstance : () => C + +C.getInstance().#field; // Error +>C.getInstance().#field : any +>C.getInstance() : C +>C.getInstance : () => C +>C : typeof C +>getInstance : () => C + + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts new file mode 100644 index 0000000000000..503761c73414c --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +const C = class { + #field = this.#method(); + #method() { return 42; } + static getInstance() { return new C(); } + getField() { return this.#field }; +} + +console.log(C.getInstance().getField()); +C.getInstance().#method; // Error +C.getInstance().#field; // Error + From e133f602fbbb8286351d1843d885b143cf335da3 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 15:59:37 +0000 Subject: [PATCH 12/68] Add to instances once per-instance Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 41 ++++-------------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 18e18ab60c45a..76e836ba58e14 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -926,46 +926,19 @@ namespace ts { /** * Generates brand-check initializer for private methods. * - * @param methods An array of method declarations to transform. + * @param methods An array of method declarations. * @param receiver The receiver on which each method should be assigned. */ function addMethodStatements(statements: Statement[], methods: readonly (MethodDeclaration)[], receiver: LeftHandSideExpression) { - for (const method of methods) { - const expression = transformMethod(method, receiver); - if (!expression) { - continue; - } - const statement = factory.createExpressionStatement(expression); - statements.push(statement); - } - } - - /** - * Transforms a method declaration to brand-check initializer. - * - * @param method The method declaration. - * @param receiver The receiver on which the method should be assigned. - */ - function transformMethod(method: MethodDeclaration, receiver: LeftHandSideExpression) { - if (!shouldTransformPrivateElements || !isPrivateIdentifier(method.name)) { + if (!shouldTransformPrivateElements || !some(methods)) { return; } - const privateIdentifierInfo = accessPrivateIdentifier(method.name); - if (privateIdentifierInfo) { - switch (privateIdentifierInfo.placement){ - case PrivateIdentifierPlacement.InstanceMethod: { - return createPrivateInstanceMethodInitializer( - receiver, - getPrivateIdentifierEnvironment().weakSetName - ); - } - default: return Debug.fail("Unexpected private identifier placement"); - } - } - else { - Debug.fail("Undeclared private name for method declaration."); - } + statements.push( + factory.createExpressionStatement( + createPrivateInstanceMethodInitializer(receiver, getPrivateIdentifierEnvironment().weakSetName) + ) + ); } /** From aa5dd8a5600a69086cf99b78fcae4691b6e17fe5 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 15:59:43 +0000 Subject: [PATCH 13/68] Accept baseline Signed-off-by: Kubilay Kahveci --- .../baselines/reference/privateNameMethodCallExpression.js | 1 - .../reference/privateNamesIncompatibleModifiers.js | 6 ------ 2 files changed, 7 deletions(-) diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js index 59612f5a435a6..b97b529024177 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.js +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -34,7 +34,6 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function var _AA_method, _AA_method2, _AA_instances; class AA { constructor() { - _AA_instances.add(this); _AA_instances.add(this); this.x = 1; } diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index c537d2bdb85bd..3fb686c0f5313 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -60,12 +60,6 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar var _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp, _A_fooProp_1, _A_barProp, _A_barProp_1, _A_bazProp, _A_bazProp_1, _A_quxProp, _A_quxProp_1, _A_whatProp, _A_whatProp_1, _A_asyncProp, _A_asyncProp_1, _A_instances; class A { constructor() { - _A_instances.add(this); - _A_instances.add(this); - _A_instances.add(this); - _A_instances.add(this); - _A_instances.add(this); - _A_instances.add(this); _A_instances.add(this); _A_foo.set(this, 3); // Error _A_bar.set(this, 3); // Error From a3889a778213b352cf7456d2cc5a21d59f4193fb Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 17:20:27 +0000 Subject: [PATCH 14/68] fix: evaluate receiver and rhs expressions before throwing on readonly assignment Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 6 +-- src/compiler/transformers/classFields.ts | 51 ++++++++++++------------ 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 3fa1d500aa826..c2070debc7e7e 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -35,7 +35,7 @@ namespace ts { createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier): Expression; createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; - createClassPrivateReadonlyHelper(): Expression; + createClassPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -387,9 +387,9 @@ namespace ts { return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); } - function createClassPrivateReadonlyHelper() { + function createClassPrivateReadonlyHelper(receiver: Expression, value: Expression) { context.requestEmitHelper(classPrivateReadonlyHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, []); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); } } diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 76e836ba58e14..9613acaac794b 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -280,16 +280,19 @@ namespace ts { function createPrivateIdentifierAccess(info: PrivateIdentifierInfo, receiver: Expression): Expression { receiver = visitNode(receiver, visitor, isExpression); const synthesizedReceiver = nodeIsSynthesized(receiver) ? receiver : factory.cloneNode(receiver); + return createPrivateIdentifierAccessHelper(info, synthesizedReceiver); + } + function createPrivateIdentifierAccessHelper(info: PrivateIdentifierInfo, receiver: Expression): Expression { switch (info.placement) { case PrivateIdentifierPlacement.InstanceField: return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - synthesizedReceiver, + receiver, info.weakMapName ); case PrivateIdentifierPlacement.InstanceMethod: return context.getEmitHelperFactory().createClassPrivateMethodGetHelper( - synthesizedReceiver, + receiver, getPrivateIdentifierEnvironment().weakSetName, info.functionName ); @@ -474,37 +477,33 @@ namespace ts { } function createPrivateIdentifierAssignment(info: PrivateIdentifierInfo, receiver: Expression, right: Expression, operator: AssignmentOperator) { - switch (info.placement) { - case PrivateIdentifierPlacement.InstanceField: - return createPrivateIdentifierInstanceFieldAssignment(info, receiver, right, operator); - case PrivateIdentifierPlacement.InstanceMethod: - return createPrivateIdentifierInstanceMethodAssignment(); - default: return Debug.fail("Unexpected private identifier placement"); - } - } - - function createPrivateIdentifierInstanceFieldAssignment(info: PrivateIdentifierInstanceField, receiver: Expression, right: Expression, operator: AssignmentOperator) { receiver = visitNode(receiver, visitor, isExpression); right = visitNode(right, visitor, isExpression); + if (isCompoundAssignment(operator)) { const { readExpression, initializeExpression } = createCopiableReceiverExpr(receiver); - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - initializeExpression || readExpression, - info.weakMapName, - factory.createBinaryExpression( - context.getEmitHelperFactory().createClassPrivateFieldGetHelper(readExpression, info.weakMapName), - getNonAssignmentOperatorForCompoundAssignment(operator), - right - ) + receiver = initializeExpression || readExpression; + right = factory.createBinaryExpression( + createPrivateIdentifierAccessHelper(info, readExpression), + getNonAssignmentOperatorForCompoundAssignment(operator), + right ); } - else { - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper(receiver, info.weakMapName, right); - } - } - function createPrivateIdentifierInstanceMethodAssignment() { - return context.getEmitHelperFactory().createClassPrivateReadonlyHelper(); + switch (info.placement) { + case PrivateIdentifierPlacement.InstanceField: + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( + receiver, + info.weakMapName, + right + ); + case PrivateIdentifierPlacement.InstanceMethod: + return context.getEmitHelperFactory().createClassPrivateReadonlyHelper( + receiver, + right + ); + default: return Debug.fail("Unexpected private identifier placement"); + } } /** From 8952caa32f42af226608b195ddb6a8421920eff2 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Tue, 26 Jan 2021 17:20:48 +0000 Subject: [PATCH 15/68] Add a test for evaluating rhs before readonly assignment Signed-off-by: Kubilay Kahveci --- .../reference/privateNameMethodAssignment.js | 12 ++++--- .../reference/privateNameReadonly.errors.txt | 21 ++++++++++++ .../reference/privateNameReadonly.js | 28 +++++++++++++++ .../reference/privateNameReadonly.symbols | 27 +++++++++++++++ .../reference/privateNameReadonly.types | 34 +++++++++++++++++++ .../privateNames/privateNameReadonly.ts | 10 ++++++ 6 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/privateNameReadonly.errors.txt create mode 100644 tests/baselines/reference/privateNameReadonly.js create mode 100644 tests/baselines/reference/privateNameReadonly.symbols create mode 100644 tests/baselines/reference/privateNameReadonly.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js index 85f31b9956db4..2b1618e9938c7 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.js +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -27,12 +27,14 @@ class A3 { constructor(a, b) { var _a, _b; _A3_instances.add(this); - __classPrivateReadonly(); // Error, not writable - __classPrivateReadonly(); // Error, not writable - __classPrivateReadonly(); //Error, not writable - (_a = this, { x: ({ set value(_b) { __classPrivateReadonly(); } }).value } = { x: () => { } }); //Error, not writable + __classPrivateReadonly(this, () => { }); // Error, not writable + __classPrivateReadonly(// Error, not writable + a, () => { }); // Error, not writable + __classPrivateReadonly(// Error, not writable + b, () => { }); //Error, not writable + (_a = this, { x: ({ set value(_b) { __classPrivateReadonly(_a, _b); } }).value } = { x: () => { } }); //Error, not writable let x = __classPrivateMethodGet(this, _A3_instances, _A3_method); - __classPrivateReadonly(); //Error, not writable + __classPrivateReadonly(_b = b, +__classPrivateMethodGet(_b, _A3_instances, _A3_method) + 1); //Error, not writable } ; } diff --git a/tests/baselines/reference/privateNameReadonly.errors.txt b/tests/baselines/reference/privateNameReadonly.errors.txt new file mode 100644 index 0000000000000..df4adc632a809 --- /dev/null +++ b/tests/baselines/reference/privateNameReadonly.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(2,5): error TS18016: Private identifiers are not allowed outside class bodies. +tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,9): error TS2322: Type 'void' is not assignable to type '() => void'. +tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2798: Cannot assign to private method '#bar'. Private methods are not writable. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts (3 errors) ==== + const C = class { + #bar() {} + ~~~~ +!!! error TS18016: Private identifiers are not allowed outside class bodies. + foo() { + this.#bar = console.log("should log this then throw"); + ~~~~~~~~~ +!!! error TS2322: Type 'void' is not assignable to type '() => void'. + ~~~~ +!!! error TS2798: Cannot assign to private method '#bar'. Private methods are not writable. + } + } + + console.log(new C().foo()); + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameReadonly.js b/tests/baselines/reference/privateNameReadonly.js new file mode 100644 index 0000000000000..53d39ac5c7164 --- /dev/null +++ b/tests/baselines/reference/privateNameReadonly.js @@ -0,0 +1,28 @@ +//// [privateNameReadonly.ts] +const C = class { + #bar() {} + foo() { + this.#bar = console.log("should log this then throw"); + } +} + +console.log(new C().foo()); + + +//// [privateNameReadonly.js] +var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { + throw new TypeError("private element is not writable"); +}; +var _C_bar, _C_instances, _a; +const C = (_a = class { + constructor() { + _C_instances.add(this); + } + foo() { + __classPrivateReadonly(this, console.log("should log this then throw")); + } + }, + _C_instances = new WeakSet(), + _C_bar = function _C_bar() { }, + _a); +console.log(new C().foo()); diff --git a/tests/baselines/reference/privateNameReadonly.symbols b/tests/baselines/reference/privateNameReadonly.symbols new file mode 100644 index 0000000000000..1f4e58cdfd038 --- /dev/null +++ b/tests/baselines/reference/privateNameReadonly.symbols @@ -0,0 +1,27 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts === +const C = class { +>C : Symbol(C, Decl(privateNameReadonly.ts, 0, 5)) + + #bar() {} +>#bar : Symbol(C.#bar, Decl(privateNameReadonly.ts, 0, 17)) + + foo() { +>foo : Symbol(C.foo, Decl(privateNameReadonly.ts, 1, 13)) + + this.#bar = console.log("should log this then throw"); +>this.#bar : Symbol(C.#bar, Decl(privateNameReadonly.ts, 0, 17)) +>this : Symbol(C, Decl(privateNameReadonly.ts, 0, 9)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + } +} + +console.log(new C().foo()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>new C().foo : Symbol(C.foo, Decl(privateNameReadonly.ts, 1, 13)) +>C : Symbol(C, Decl(privateNameReadonly.ts, 0, 5)) +>foo : Symbol(C.foo, Decl(privateNameReadonly.ts, 1, 13)) + diff --git a/tests/baselines/reference/privateNameReadonly.types b/tests/baselines/reference/privateNameReadonly.types new file mode 100644 index 0000000000000..e4e460df3a51c --- /dev/null +++ b/tests/baselines/reference/privateNameReadonly.types @@ -0,0 +1,34 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts === +const C = class { +>C : typeof C +>class { #bar() {} foo() { this.#bar = console.log("should log this then throw"); }} : typeof C + + #bar() {} +>#bar : () => void + + foo() { +>foo : () => void + + this.#bar = console.log("should log this then throw"); +>this.#bar = console.log("should log this then throw") : void +>this.#bar : () => void +>this : this +>console.log("should log this then throw") : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>"should log this then throw" : "should log this then throw" + } +} + +console.log(new C().foo()); +>console.log(new C().foo()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>new C().foo() : void +>new C().foo : () => void +>new C() : C +>C : typeof C +>foo : () => void + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts b/tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts new file mode 100644 index 0000000000000..b9e373f19e57d --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts @@ -0,0 +1,10 @@ +// @target: es2015 + +const C = class { + #bar() {} + foo() { + this.#bar = console.log("should log this then throw"); + } +} + +console.log(new C().foo()); From dee87bb6a0e8ea0181de4f44f0dc08ab2f309029 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 27 Jan 2021 11:07:47 +0000 Subject: [PATCH 16/68] Transpile private accessors Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 41 ++++++++++++ src/compiler/transformers/classFields.ts | 80 ++++++++++++++++++++---- src/compiler/transformers/utilities.ts | 21 ++++++- 3 files changed, 130 insertions(+), 12 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index c2070debc7e7e..df86a7344740d 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -36,6 +36,8 @@ namespace ts { createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; createClassPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; + createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; + createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -76,6 +78,8 @@ namespace ts { createClassPrivateFieldSetHelper, createClassPrivateMethodGetHelper, createClassPrivateReadonlyHelper, + createClassPrivateAccessorGetHelper, + createClassPrivateAccessorSetHelper, }; /** @@ -392,6 +396,15 @@ namespace ts { return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); } + function createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) { + context.requestEmitHelper(classPrivateAccessorGetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); + } + + function createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression) { + context.requestEmitHelper(classPrivateAccessorSetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, instances, fn, value]); + } } /* @internal */ @@ -882,6 +895,32 @@ namespace ts { };` }; + export const classPrivateAccessorGetHelper: UnscopedEmitHelper = { + name: "typescript:classPrivateAccessorGet", + importName: "__classPrivateAccessorGet", + scoped: false, + text: ` + var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); + };` + }; + + export const classPrivateAccessorSetHelper: UnscopedEmitHelper = { + name: "typescript:classPrivateAccessorSet", + importName: "__classPrivateAccessorSet", + scoped: false, + text: ` + var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to set private accessor on non-instance"); + } + return fn.call(receiver, value); + };` + }; + let allUnscopedEmitHelpers: ReadonlyESMap | undefined; export function getAllUnscopedEmitHelpers() { @@ -909,6 +948,8 @@ namespace ts { classPrivateFieldSetHelper, classPrivateMethodGetHelper, classPrivateReadonlyHelper, + classPrivateAccessorGetHelper, + classPrivateAccessorSetHelper, createBindingHelper, setModuleDefaultHelper ], helper => helper.name)); diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 9613acaac794b..848064c76df17 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -11,11 +11,13 @@ namespace ts { const enum PrivateIdentifierPlacement { InstanceField, InstanceMethod, + InstanceAccessor } type PrivateIdentifierInfo = | PrivateIdentifierInstanceField - | PrivateIdentifierInstanceMethod; + | PrivateIdentifierInstanceMethod + | PrivateIdentifierInstanceAccessor; interface PrivateIdentifierInstanceField { placement: PrivateIdentifierPlacement.InstanceField; @@ -27,6 +29,12 @@ namespace ts { functionName: Identifier; } + interface PrivateIdentifierInstanceAccessor { + placement: PrivateIdentifierPlacement.InstanceAccessor; + getterName?: Identifier; + setterName?: Identifier; + } + interface PrivateIdentifierEnvironment { /** * Used for prefixing generated variable names. @@ -166,8 +174,7 @@ namespace ts { case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - // Visit the name of the member (if it's a computed property name). - return visitEachChild(node, classElementVisitor, context); + return visitMethodDeclaration(node as AccessorDeclaration); case SyntaxKind.MethodDeclaration: return visitMethodDeclaration(node as MethodDeclaration); @@ -213,7 +220,7 @@ namespace ts { return node; } - function visitMethodDeclaration(node: MethodDeclaration) { + function visitMethodDeclaration(node: MethodDeclaration | AccessorDeclaration) { Debug.assert(!some(node.decorators)); const transformedMethod = visitEachChild(node, classElementVisitor, context); @@ -241,7 +248,7 @@ namespace ts { return undefined; } - function getHoistedFunctionName(node: MethodDeclaration) { + function getHoistedFunctionName(node: MethodDeclaration | AccessorDeclaration) { Debug.assert(isPrivateIdentifier(node.name)); const privateIdentifierInfo = accessPrivateIdentifier(node.name); Debug.assert(privateIdentifierInfo, "Undeclared private name for property declaration."); @@ -250,6 +257,17 @@ namespace ts { return privateIdentifierInfo.functionName; } + if (privateIdentifierInfo.placement === PrivateIdentifierPlacement.InstanceAccessor) { + if (isGetAccessor(node)) { + Debug.assert(privateIdentifierInfo.getterName); + return privateIdentifierInfo.getterName; + } + if (isSetAccessor(node)) { + Debug.assert(privateIdentifierInfo.setterName); + return privateIdentifierInfo.setterName; + } + } + Debug.fail("Unexpected private identifier placement"); } @@ -296,6 +314,13 @@ namespace ts { getPrivateIdentifierEnvironment().weakSetName, info.functionName ); + case PrivateIdentifierPlacement.InstanceAccessor: { + return context.getEmitHelperFactory().createClassPrivateAccessorGetHelper( + receiver, + getPrivateIdentifierEnvironment().weakSetName, + info.getterName! // TODO: TypeError is missing + ); + } default: return Debug.fail("Unexpected private identifier placement"); } } @@ -502,6 +527,13 @@ namespace ts { receiver, right ); + case PrivateIdentifierPlacement.InstanceAccessor: + return context.getEmitHelperFactory().createClassPrivateAccessorSetHelper( + receiver, + getPrivateIdentifierEnvironment().weakSetName, + info.setterName!, // TODO: TypeError if missing + right + ); default: return Debug.fail("Unexpected private identifier placement"); } } @@ -732,7 +764,10 @@ namespace ts { properties = filter(properties, property => !!property.initializer || isPrivateIdentifier(property.name)); } - const privateMethods = filter(getMethods(node, /*isStatic*/ false), method => isPrivateIdentifier(method.name)); + const privateMethods = filter( + [...getMethods(node, /*isStatic*/ false), ...getAccessors(node, /*isStatic*/ false)], + method => isPrivateIdentifier(method.name) + ); const needsConstructorBody = some(properties) || some(privateMethods); // Only generate synthetic constructor when there are property initializers to move. @@ -928,7 +963,7 @@ namespace ts { * @param methods An array of method declarations. * @param receiver The receiver on which each method should be assigned. */ - function addMethodStatements(statements: Statement[], methods: readonly (MethodDeclaration)[], receiver: LeftHandSideExpression) { + function addMethodStatements(statements: Statement[], methods: readonly (MethodDeclaration | AccessorDeclaration)[], receiver: LeftHandSideExpression) { if (!shouldTransformPrivateElements || !some(methods)) { return; } @@ -1039,18 +1074,18 @@ namespace ts { function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { const text = getTextOfPropertyName(node.name) as string; - const uniqueVariableName = createHoistedVariableForPrivateName(text); let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; if (isPropertyDeclaration(node)) { + const weakMapName = createHoistedVariableForPrivateName(text); info = { placement: PrivateIdentifierPlacement.InstanceField, - weakMapName: uniqueVariableName + weakMapName, }; assignmentExpressions.push(factory.createAssignment( - uniqueVariableName, + weakMapName, factory.createNewExpression( factory.createIdentifier("WeakMap"), /*typeArguments*/ undefined, @@ -1061,11 +1096,27 @@ namespace ts { else if (isMethodDeclaration(node)) { info = { placement: PrivateIdentifierPlacement.InstanceMethod, - functionName: uniqueVariableName + functionName: createHoistedVariableForPrivateName(text) }; getPrivateIdentifierEnvironment().hasPrivateMethods = true; } + else if (isAccessor(node)) { + const previousInfo = findPreviousAccessorInfo(node); + info = { + ...previousInfo, + placement: PrivateIdentifierPlacement.InstanceAccessor, + }; + + if (isGetAccessor(node)) { + info.getterName = createHoistedVariableForPrivateName(text + "_get"); + } + else { + info.setterName = createHoistedVariableForPrivateName(text + "_set");; + } + + getPrivateIdentifierEnvironment().hasPrivateMethods = true; + } else { return; } @@ -1074,6 +1125,13 @@ namespace ts { getPendingExpressions().push(...assignmentExpressions); } + function findPreviousAccessorInfo(node: PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration): PrivateIdentifierInstanceAccessor | undefined { + const info = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); + if (info && info.placement === PrivateIdentifierPlacement.InstanceAccessor) { + return info; + } + } + function createHoistedVariableForClass(name: string): Identifier { const { className } = getPrivateIdentifierEnvironment(); const prefix = className ? `_${className}` : ""; diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index a97b7a084e9f8..30dc004a59850 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -347,12 +347,22 @@ namespace ts { * Gets all the static or all the instance method declarations of a class. * * @param node The class node. - * @param isStatic A value indicating whether to get properties from the static or instance side of the class. + * @param isStatic A value indicating whether to get methods from the static or instance side of the class. */ export function getMethods(node: ClassExpression | ClassDeclaration, isStatic: boolean): readonly MethodDeclaration[] { return filter(node.members, m => isStaticMethodDeclaration(m, isStatic)) as MethodDeclaration[]; } + /** + * Gets all the static or all the instance accessor declarations of a class. + * + * @param node The class node. + * @param isStatic A value indicating whether to get accessors from the static or instance side of the class. + */ + export function getAccessors(node: ClassExpression | ClassDeclaration, isStatic: boolean): readonly AccessorDeclaration[] { + return filter(node.members, m => isStaticAccessorDeclaration(m, isStatic)) as AccessorDeclaration[]; + } + /** * Is a class element either a static or an instance property declaration with an initializer? * @@ -386,4 +396,13 @@ namespace ts { return isMethodDeclaration(member) && hasStaticModifier(member) === isStatic; } + /** + * Gets a value indicating whether a class element is either a static or an instance accessor declaration. + * + * @param member The class element node. + * @param isStatic A value indicating whether the member should be a static or instance member. + */ + export function isStaticAccessorDeclaration(member: ClassElement, isStatic: boolean): member is AccessorDeclaration { + return isGetOrSetAccessorDeclaration(member) && hasStaticModifier(member) === isStatic; + } } From aec7e9bd4b1a4f4bcbdca5e250e9a3fb9f334513 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 27 Jan 2021 11:17:42 +0000 Subject: [PATCH 17/68] Accept baseline Signed-off-by: Kubilay Kahveci --- .../reference/privateNameAccessorsAccess.js | 18 +++-- .../privateNameAccessorsCallExpression.js | 72 +++++++------------ .../privateNameAccessorssDerivedClasses.js | 15 +++- .../privateNameES5Ban(target=es3).js | 16 +---- .../privateNameES5Ban(target=es5).js | 16 +---- ...rivateNameNestedClassAccessorsShadowing.js | 22 ++++-- .../reference/privateNamesAndkeyof.js | 6 +- .../reference/privateNamesInGenericClasses.js | 18 +++-- .../privateNamesIncompatibleModifiers.js | 20 ++---- .../reference/privateNamesUseBeforeDef.js | 14 ++-- 10 files changed, 100 insertions(+), 117 deletions(-) diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js index 471938900c62b..06f2cde867b75 100644 --- a/tests/baselines/reference/privateNameAccessorsAccess.js +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -26,19 +26,25 @@ class B2 { //// [privateNameAccessorsAccess.js] -var _A2_prop, _A2_prop_1; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _A2_prop_get, _A2_prop_set, _A2_instances; class A2 { constructor() { - console.log(this.); + _A2_instances.add(this); + console.log(__classPrivateAccessorGet(this, _A2_instances, _A2_prop_get)); let a = this; - a.; + __classPrivateAccessorGet(a, _A2_instances, _A2_prop_get); function foo() { - a.; + __classPrivateAccessorGet(a, _A2_instances, _A2_prop_get); } } - get () { return ""; } - set (param) { } } +_A2_instances = new WeakSet(), _A2_prop_get = function _A2_prop_get() { return ""; }, _A2_prop_set = function _A2_prop_set(param) { }; new A2().; // Error function foo() { new A2().; // Error diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js index f901647fbb02e..f3cf7687d6438 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -18,49 +18,31 @@ class A { getInstance() { return new A(); } } -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(10,14): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(11,27): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(13,18): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(15,14): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(16,28): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(17,26): error TS1003: Identifier expected. -tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js(18,35): error TS1003: Identifier expected. - - -==== tests/cases/conformance/classes/members/privateNames/privateNameAccessorsCallExpression.js (7 errors) ==== - var _A_fieldFunc, _A_fieldFunc2; - class A { - constructor() { - this.x = 1; - } - get () { return function () { this.x = 10; }; } - get () { return function (a, ...b) { }; } - test() { - var _a; - this..call(this); - ~ -!!! error TS1003: Identifier expected. - const func = this.; - ~ -!!! error TS1003: Identifier expected. - func(); - new this.(); - ~ -!!! error TS1003: Identifier expected. - const arr = [1, 2]; - this..call(this, 0, ...arr, 3); - ~ -!!! error TS1003: Identifier expected. - const b = new this.(0, ...arr, 3); - ~ -!!! error TS1003: Identifier expected. - const str = this..bind(this) `head${1}middle${2}tail`; - ~ -!!! error TS1003: Identifier expected. - (_a = this.getInstance())..bind(_a) `test${1}and${2}`; - ~ -!!! error TS1003: Identifier expected. - } - getInstance() { return new A(); } +//// [privateNameAccessorsCallExpression.js] +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _A_fieldFunc_get, _A_fieldFunc2_get, _A_instances; +class A { + constructor() { + _A_instances.add(this); + this.x = 1; } - \ No newline at end of file + test() { + var _a; + __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get).call(this); + const func = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get); + func(); + new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get))(); + const arr = [1, 2]; + __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).call(this, 0, ...arr, 3); + const b = new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get))(0, ...arr, 3); + const str = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; + __classPrivateAccessorGet((_a = this.getInstance()), _A_instances, _A_fieldFunc2_get).bind(_a) `test${1}and${2}`; + } + getInstance() { return new A(); } +} +_A_instances = new WeakSet(), _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { this.x = 10; }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js index 4da1a9941cd93..42e518dd1e827 100644 --- a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -13,13 +13,22 @@ class Derived extends Base { //// [privateNameAccessorssDerivedClasses.js] -var _Base_prop; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _Base_prop_get, _Base_instances; class Base { - get () { return 123; } + constructor() { + _Base_instances.add(this); + } static method(x) { - console.log(x.); + console.log(__classPrivateAccessorGet(x, _Base_instances, _Base_prop_get)); } } +_Base_instances = new WeakSet(), _Base_prop_get = function _Base_prop_get() { return 123; }; class Derived extends Base { static method(x) { console.log(x.); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index da50a83aed130..24a301e676033 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -19,20 +19,8 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - Object.defineProperty(A.prototype, "", { - get: function () { return ""; }, - set: function (x) { }, - enumerable: false, - configurable: true - }); - Object.defineProperty(A, "", { - get: function () { return 0; }, - set: function (x) { }, - enumerable: false, - configurable: true - }); - var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc, _A_acc_1, _A_sAcc, _A_sAcc_1, _A_instances; - _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }; + var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set, _A_instances; + _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index da50a83aed130..24a301e676033 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -19,20 +19,8 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - Object.defineProperty(A.prototype, "", { - get: function () { return ""; }, - set: function (x) { }, - enumerable: false, - configurable: true - }); - Object.defineProperty(A, "", { - get: function () { return 0; }, - set: function (x) { }, - enumerable: false, - configurable: true - }); - var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc, _A_acc_1, _A_sAcc, _A_sAcc_1, _A_instances; - _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }; + var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set, _A_instances; + _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField.set(A, "hello world"); return A; }()); diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js index 4d4829a85603d..b650ce90b7d2d 100644 --- a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -16,21 +16,31 @@ class Base { //// [privateNameNestedClassAccessorsShadowing.js] -var _Base_x; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _Base_x_get, _Base_instances; class Base { constructor() { - var _Derived_x; + var _Derived_x_get, _Derived_instances; + _Base_instances.add(this); class Derived { - get () { return 1; } + constructor() { + _Derived_instances.add(this); + } ; testBase(x) { - console.log(x.); + console.log(__classPrivateAccessorGet(x, _Derived_instances, _Derived_x_get)); } testDerived(x) { - console.log(x.); + console.log(__classPrivateAccessorGet(x, _Derived_instances, _Derived_x_get)); } } + _Derived_instances = new WeakSet(), _Derived_x_get = function _Derived_x_get() { return 1; }; } - get () { return 1; } ; } +_Base_instances = new WeakSet(), _Base_x_get = function _Base_x_get() { return 1; }; diff --git a/tests/baselines/reference/privateNamesAndkeyof.js b/tests/baselines/reference/privateNamesAndkeyof.js index c726cbfccd4c4..20d4e1122013c 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.js +++ b/tests/baselines/reference/privateNamesAndkeyof.js @@ -13,7 +13,7 @@ type T = keyof A // should not include '#foo*' //// [privateNamesAndkeyof.js] "use strict"; -var _A_fooField, _A_fooMethod, _A_fooProp, _A_fooProp_1, _A_instances; +var _A_fooField, _A_fooMethod, _A_fooProp_get, _A_fooProp_set, _A_instances; class A { constructor() { _A_instances.add(this); @@ -22,9 +22,7 @@ class A { this.baz = 3; } ; - get () { return 1; } ; - set (value) { } ; } -_A_fooField = new WeakMap(), _A_instances = new WeakSet(), _A_fooMethod = function _A_fooMethod() { }; +_A_fooField = new WeakMap(), _A_instances = new WeakSet(), _A_fooMethod = function _A_fooMethod() { }, _A_fooProp_get = function _A_fooProp_get() { return 1; }, _A_fooProp_set = function _A_fooProp_set(value) { }; diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index ee64cee48f85e..e1ea4b49d09b0 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -48,25 +48,29 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _C_foo, _C_method, _C_prop, _C_prop_1, _C_instances; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _C_foo, _C_method, _C_prop_get, _C_prop_set, _C_instances; class C { constructor() { _C_instances.add(this); _C_foo.set(this, void 0); } - get () { return __classPrivateFieldGet(this, _C_foo); } - set (value) { __classPrivateFieldSet(this, _C_foo, value); } bar(x) { return __classPrivateFieldGet(x, _C_foo); } // OK bar2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method).call(x); } // OK - bar3(x) { return x.; } // OK + bar3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK baz(x) { return __classPrivateFieldGet(x, _C_foo); } // OK baz2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK - baz3(x) { return x.; } // OK + baz3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK quux(x) { return __classPrivateFieldGet(x, _C_foo); } // OK quux2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK - quux3(x) { return x.; } // OK + quux3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK } -_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo); }; +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_get = function _C_prop_get() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_set = function _C_prop_set(value) { __classPrivateFieldSet(this, _C_foo, value); }; a.; // Error a.; // Error a.; // Error diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index 3fb686c0f5313..32a249ac3c5ed 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -57,7 +57,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; -var _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp, _A_fooProp_1, _A_barProp, _A_barProp_1, _A_bazProp, _A_bazProp_1, _A_quxProp, _A_quxProp_1, _A_whatProp, _A_whatProp_1, _A_asyncProp, _A_asyncProp_1, _A_instances; +var _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp_get, _A_fooProp_set, _A_barProp_get, _A_barProp_set, _A_bazProp_get, _A_bazProp_set, _A_quxProp_get, _A_quxProp_set, _A_whatProp_get, _A_whatProp_set, _A_asyncProp_get, _A_asyncProp_set, _A_instances; class A { constructor() { _A_instances.add(this); @@ -66,21 +66,13 @@ class A { _A_baz.set(this, 3); // Error _A_qux.set(this, 3); // OK } - get () { return 3; } // Error - set (value) { } // Error - get () { return 3; } // Error - set (value) { } // Error - get () { return 3; } // Error - set (value) { } // Error - get () { return 3; } // Error - set (value) { } // Error - get () { } // Error - set (value) { } // Error - get () { return 1; } // Error - set (value) { } // Error } _A_foo = new WeakMap(), _A_bar = new WeakMap(), _A_baz = new WeakMap(), _A_qux = new WeakMap(), _A_instances = new WeakSet(), _A_fooMethod = function _A_fooMethod() { return 3; }, _A_barMethod = function _A_barMethod() { return 3; }, _A_bazMethod = function _A_bazMethod() { return 3; }, _A_quxMethod = function _A_quxMethod() { return 3; }, _A_asyncMethod = function _A_asyncMethod() { return __awaiter(this, void 0, void 0, function* () { return 1; }); -}, _A_genMethod = function* _A_genMethod() { return 1; }, _A_asyncGenMethod = function _A_asyncGenMethod() { return __asyncGenerator(this, arguments, function* _A_asyncGenMethod_1() { return yield __await(1); }); }; +}, _A_genMethod = function* _A_genMethod() { return 1; }, _A_asyncGenMethod = function _A_asyncGenMethod() { return __asyncGenerator(this, arguments, function* _A_asyncGenMethod_1() { return yield __await(1); }); }, _A_fooProp_get = function _A_fooProp_get() { return 3; }, _A_fooProp_set = function _A_fooProp_set(value) { }, _A_barProp_get = function _A_barProp_get() { return 3; }, _A_barProp_set = function _A_barProp_set(value) { }, _A_bazProp_get = function _A_bazProp_get() { return 3; }, _A_bazProp_set = function _A_bazProp_set(value) { }, _A_quxProp_get = function _A_quxProp_get() { return 3; }, _A_quxProp_set = function _A_quxProp_set(value) { }, _A_whatProp_get = function _A_whatProp_get() { }, _A_whatProp_set = function _A_whatProp_set(value) { }, _A_asyncProp_get = function _A_asyncProp_get() { + return __awaiter(this, void 0, void 0, function* () { return 1; }); +}, _A_asyncProp_set = function _A_asyncProp_set(value) { + return __awaiter(this, void 0, void 0, function* () { }); +}; class B { } diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index b55b9b2077db3..271cde160438e 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -33,7 +33,13 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _A_foo, _A_bar, _A2_foo, _A2_bar, _A2_instances, _A3_foo, _A3_bar, _B_foo, _B_bar; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _A_foo, _A_bar, _A2_foo, _A2_bar, _A2_instances, _A3_foo, _A3_bar_get, _A3_instances, _B_foo, _B_bar; class A { constructor() { _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); // Error @@ -51,12 +57,12 @@ class A2 { _A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_bar = function _A2_bar() { return 3; }; class A3 { constructor() { - _A3_foo.set(this, this.); // No Error + _A3_instances.add(this); + _A3_foo.set(this, __classPrivateAccessorGet(this, _A3_instances, _A3_bar_get)); // No Error } - get () { return 3; } ; } -_A3_foo = new WeakMap(); +_A3_foo = new WeakMap(), _A3_instances = new WeakSet(), _A3_bar_get = function _A3_bar_get() { return 3; }; class B { constructor() { _B_foo.set(this, __classPrivateFieldGet(this, _B_bar)); // Error From f3bbf0f6f7e4e0121df3d03ee8b10c6ad83d7408 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 28 Jan 2021 11:31:50 +0000 Subject: [PATCH 18/68] fix: handle readonly/writeonly accessors Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 17 +++ src/compiler/transformers/classFields.ts | 142 +++++++++++++++-------- 2 files changed, 112 insertions(+), 47 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index df86a7344740d..33d5d57278806 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -36,6 +36,7 @@ namespace ts { createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; createClassPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; + createClassPrivateWriteonlyHelper(receiver: Expression): Expression; createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression; } @@ -78,6 +79,7 @@ namespace ts { createClassPrivateFieldSetHelper, createClassPrivateMethodGetHelper, createClassPrivateReadonlyHelper, + createClassPrivateWriteonlyHelper, createClassPrivateAccessorGetHelper, createClassPrivateAccessorSetHelper, }; @@ -396,6 +398,11 @@ namespace ts { return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); } + function createClassPrivateWriteonlyHelper(receiver: Expression) { + context.requestEmitHelper(classPrivateWriteonlyHelper); + return factory.createCallExpression(getUnscopedHelperName("__classPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]); + } + function createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) { context.requestEmitHelper(classPrivateAccessorGetHelper); return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); @@ -895,6 +902,16 @@ namespace ts { };` }; + export const classPrivateWriteonlyHelper: UnscopedEmitHelper = { + name: "typescript:classPrivateWriteonly", + importName: "__classPrivateWriteonly", + scoped: false, + text: ` + var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { + throw new TypeError("private element was defined without a getter"); + };` + }; + export const classPrivateAccessorGetHelper: UnscopedEmitHelper = { name: "typescript:classPrivateAccessorGet", importName: "__classPrivateAccessorGet", diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 848064c76df17..3dacb2de108f0 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -11,13 +11,17 @@ namespace ts { const enum PrivateIdentifierPlacement { InstanceField, InstanceMethod, - InstanceAccessor + InstanceGetterOnly, + InstanceSetterOnly, + InstanceGetterAndSetter } type PrivateIdentifierInfo = | PrivateIdentifierInstanceField | PrivateIdentifierInstanceMethod - | PrivateIdentifierInstanceAccessor; + | PrivateIdentifierInstanceGetterOnly + | PrivateIdentifierInstanceSetterOnly + | PrivateIdentifierInstanceGetterAndSetter; interface PrivateIdentifierInstanceField { placement: PrivateIdentifierPlacement.InstanceField; @@ -29,10 +33,20 @@ namespace ts { functionName: Identifier; } - interface PrivateIdentifierInstanceAccessor { - placement: PrivateIdentifierPlacement.InstanceAccessor; - getterName?: Identifier; - setterName?: Identifier; + interface PrivateIdentifierInstanceGetterOnly { + placement: PrivateIdentifierPlacement.InstanceGetterOnly; + getterName: Identifier; + } + + interface PrivateIdentifierInstanceSetterOnly { + placement: PrivateIdentifierPlacement.InstanceSetterOnly; + setterName: Identifier; + } + + interface PrivateIdentifierInstanceGetterAndSetter { + placement: PrivateIdentifierPlacement.InstanceGetterAndSetter; + getterName: Identifier; + setterName: Identifier; } interface PrivateIdentifierEnvironment { @@ -229,20 +243,22 @@ namespace ts { } const functionName = getHoistedFunctionName(node); - getPendingExpressions().push( - factory.createAssignment( - functionName, - factory.createFunctionExpression( - transformedMethod.modifiers, - transformedMethod.asteriskToken, + if (functionName) { + getPendingExpressions().push( + factory.createAssignment( functionName, - transformedMethod.typeParameters, - transformedMethod.parameters, - transformedMethod.type, - transformedMethod.body + factory.createFunctionExpression( + transformedMethod.modifiers, + transformedMethod.asteriskToken, + functionName, + transformedMethod.typeParameters, + transformedMethod.parameters, + transformedMethod.type, + transformedMethod.body + ) ) - ) - ); + ); + } // remove method declaration from class return undefined; @@ -250,25 +266,23 @@ namespace ts { function getHoistedFunctionName(node: MethodDeclaration | AccessorDeclaration) { Debug.assert(isPrivateIdentifier(node.name)); - const privateIdentifierInfo = accessPrivateIdentifier(node.name); - Debug.assert(privateIdentifierInfo, "Undeclared private name for property declaration."); + const info = accessPrivateIdentifier(node.name); + Debug.assert(info, "Undeclared private name for property declaration."); - if (privateIdentifierInfo.placement === PrivateIdentifierPlacement.InstanceMethod) { - return privateIdentifierInfo.functionName; + if (info.placement === PrivateIdentifierPlacement.InstanceMethod) { + return info.functionName; } - if (privateIdentifierInfo.placement === PrivateIdentifierPlacement.InstanceAccessor) { - if (isGetAccessor(node)) { - Debug.assert(privateIdentifierInfo.getterName); - return privateIdentifierInfo.getterName; - } - if (isSetAccessor(node)) { - Debug.assert(privateIdentifierInfo.setterName); - return privateIdentifierInfo.setterName; - } + if (isGetAccessor(node) && + (info.placement === PrivateIdentifierPlacement.InstanceGetterOnly || + info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter)) { + return info.getterName; + } + if (isSetAccessor(node) && + (info.placement === PrivateIdentifierPlacement.InstanceSetterOnly || + info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter)) { + return info.setterName; } - - Debug.fail("Unexpected private identifier placement"); } function visitPropertyDeclaration(node: PropertyDeclaration) { @@ -314,13 +328,17 @@ namespace ts { getPrivateIdentifierEnvironment().weakSetName, info.functionName ); - case PrivateIdentifierPlacement.InstanceAccessor: { + case PrivateIdentifierPlacement.InstanceGetterOnly: + case PrivateIdentifierPlacement.InstanceGetterAndSetter: return context.getEmitHelperFactory().createClassPrivateAccessorGetHelper( receiver, getPrivateIdentifierEnvironment().weakSetName, - info.getterName! // TODO: TypeError is missing + info.getterName + ); + case PrivateIdentifierPlacement.InstanceSetterOnly: + return context.getEmitHelperFactory().createClassPrivateWriteonlyHelper( + receiver ); - } default: return Debug.fail("Unexpected private identifier placement"); } } @@ -523,15 +541,17 @@ namespace ts { right ); case PrivateIdentifierPlacement.InstanceMethod: + case PrivateIdentifierPlacement.InstanceGetterOnly: return context.getEmitHelperFactory().createClassPrivateReadonlyHelper( receiver, right ); - case PrivateIdentifierPlacement.InstanceAccessor: + case PrivateIdentifierPlacement.InstanceSetterOnly: + case PrivateIdentifierPlacement.InstanceGetterAndSetter: return context.getEmitHelperFactory().createClassPrivateAccessorSetHelper( receiver, getPrivateIdentifierEnvironment().weakSetName, - info.setterName!, // TODO: TypeError if missing + info.setterName, right ); default: return Debug.fail("Unexpected private identifier placement"); @@ -912,7 +932,6 @@ namespace ts { privateIdentifierInfo.weakMapName ); } - default: return Debug.fail("Unexpected private identifier placement"); } } else { @@ -1103,16 +1122,42 @@ namespace ts { } else if (isAccessor(node)) { const previousInfo = findPreviousAccessorInfo(node); - info = { - ...previousInfo, - placement: PrivateIdentifierPlacement.InstanceAccessor, - }; if (isGetAccessor(node)) { - info.getterName = createHoistedVariableForPrivateName(text + "_get"); + const getterName = createHoistedVariableForPrivateName(text + "_get"); + + if (previousInfo) { + Debug.assert(previousInfo.placement === PrivateIdentifierPlacement.InstanceSetterOnly); + info = { + placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, + getterName, + setterName: previousInfo.setterName + }; + } + else { + info = { + placement: PrivateIdentifierPlacement.InstanceGetterOnly, + getterName + }; + } } else { - info.setterName = createHoistedVariableForPrivateName(text + "_set");; + const setterName = createHoistedVariableForPrivateName(text + "_set"); + + if (previousInfo) { + Debug.assert(previousInfo.placement === PrivateIdentifierPlacement.InstanceGetterOnly); + info = { + placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, + setterName, + getterName: previousInfo.getterName + }; + } + else { + info = { + placement: PrivateIdentifierPlacement.InstanceSetterOnly, + setterName + }; + } } getPrivateIdentifierEnvironment().hasPrivateMethods = true; @@ -1125,9 +1170,12 @@ namespace ts { getPendingExpressions().push(...assignmentExpressions); } - function findPreviousAccessorInfo(node: PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration): PrivateIdentifierInstanceAccessor | undefined { + function findPreviousAccessorInfo( + node: PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration + ): PrivateIdentifierInstanceGetterOnly | PrivateIdentifierInstanceSetterOnly | undefined { const info = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); - if (info && info.placement === PrivateIdentifierPlacement.InstanceAccessor) { + if (info?.placement === PrivateIdentifierPlacement.InstanceGetterOnly || + info?.placement === PrivateIdentifierPlacement.InstanceSetterOnly) { return info; } } From a1b59cd4fb4649ee00581cc3a8f28d2fe9625055 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 28 Jan 2021 12:22:30 +0000 Subject: [PATCH 19/68] accept baseline Signed-off-by: Kubilay Kahveci --- .../reference/privateNameAccessors.js | 30 ++++++++++---- .../reference/privateNameDuplicateField.js | 41 ++++++++++--------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index 7113a0d3a8102..d08be3efc3678 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -16,15 +16,29 @@ class A1 { //// [privateNameAccessors.js] "use strict"; -var _A1_prop, _A1_prop_1, _A1_roProp; +var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to set private accessor on non-instance"); + } + return fn.call(receiver, value); +}; +var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { + throw new TypeError("private element is not writable"); +}; +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var _A1_prop_get, _A1_prop_set, _A1_roProp_get, _A1_instances; class A1 { constructor(name) { - this. = ""; - this. = ""; // Error - console.log(this.); - console.log(this.); + _A1_instances.add(this); + __classPrivateAccessorSet(this, _A1_instances, _A1_prop_set, ""); + __classPrivateReadonly(this, ""); // Error + console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_prop_get)); + console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_roProp_get)); } - get () { return ""; } - set (param) { } - get () { return ""; } } +_A1_instances = new WeakSet(), _A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index bfc66c2cfc743..38760b303ebba 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -36,43 +36,44 @@ class A6 { //// [privateNameDuplicateField.js] "use strict"; -var _foo, _foo_1, _foo_2, _foo_3, _foo_4, _foo_5, _foo_6, _foo_7, _foo_8, _foo_9, _foo_10, _foo_11, _foo_12; +var _A_foo, _A_foo_1, _A2_foo, _A2_foo_1, _A2_instances, _A3_foo, _A3_foo_get, _A3_instances, _A4_foo, _A4_foo_1, _A4_instances, _A5_foo, _A5_foo_get, _A5_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A6_instances; class A { constructor() { - _foo_1.set(this, "foo"); - _foo_1.set(this, "foo"); + _A_foo_1.set(this, "foo"); + _A_foo_1.set(this, "foo"); } } -_foo = new WeakMap(), _foo_1 = new WeakMap(); +_A_foo = new WeakMap(), _A_foo_1 = new WeakMap(); class A2 { constructor() { - _foo_3.set(this, "foo"); + _A2_instances.add(this); + this.#foo = "foo"; } - () { } } -_foo_2 = new WeakMap(), _foo_3 = new WeakMap(); +_A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_foo_1 = function _A2_foo_1() { }; class A3 { constructor() { - _foo_5.set(this, "foo"); + _A3_instances.add(this); + this.#foo = "foo"; } - get () { return ""; } } -_foo_4 = new WeakMap(), _foo_5 = new WeakMap(); +_A3_foo = new WeakMap(), _A3_instances = new WeakSet(), _A3_foo_get = function _A3_foo_get() { return ""; }; class A4 { - () { return ""; } - () { return ""; } + constructor() { + _A4_instances.add(this); + } } -_foo_6 = new WeakMap(), _foo_7 = new WeakMap(); +_A4_instances = new WeakSet(), _A4_foo_1 = function _A4_foo_1() { return ""; }, _A4_foo_1 = function _A4_foo_1() { return ""; }; class A5 { - () { return ""; } - get () { return ""; } + constructor() { + _A5_instances.add(this); + } } -_foo_8 = new WeakMap(), _foo_9 = new WeakMap(); +_A5_instances = new WeakSet(), _A5_foo_get = function _A5_foo_get() { return ""; }; class A6 { constructor() { - _foo_12.set(this, "foo"); + _A6_instances.add(this); + this.#foo = "foo"; } - () { return ""; } - get () { return ""; } } -_foo_10 = new WeakMap(), _foo_11 = new WeakMap(), _foo_12 = new WeakMap(); +_A6_foo = new WeakMap(), _A6_instances = new WeakSet(), _A6_foo_get = function _A6_foo_get() { return ""; }; From 6b74498c02cd4296f51c02cb448114438dc14b37 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 28 Jan 2021 13:49:21 +0000 Subject: [PATCH 20/68] add a test for private setter without a getter Signed-off-by: Kubilay Kahveci --- .../reference/privateNameSetterNoGetter.js | 34 +++++++++++++++++++ .../privateNameSetterNoGetter.symbols | 25 ++++++++++++++ .../reference/privateNameSetterNoGetter.types | 31 +++++++++++++++++ .../privateNames/privateNameSetterNoGetter.ts | 10 ++++++ 4 files changed, 100 insertions(+) create mode 100644 tests/baselines/reference/privateNameSetterNoGetter.js create mode 100644 tests/baselines/reference/privateNameSetterNoGetter.symbols create mode 100644 tests/baselines/reference/privateNameSetterNoGetter.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts diff --git a/tests/baselines/reference/privateNameSetterNoGetter.js b/tests/baselines/reference/privateNameSetterNoGetter.js new file mode 100644 index 0000000000000..0a94778f30ffc --- /dev/null +++ b/tests/baselines/reference/privateNameSetterNoGetter.js @@ -0,0 +1,34 @@ +//// [privateNameSetterNoGetter.ts] +const C = class { + set #x(x) {} + m() { + this.#x += 2; // Error + } +} + +console.log(new C().m()); + + +//// [privateNameSetterNoGetter.js] +var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { + throw new TypeError("private element was defined without a getter"); +}; +var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to set private accessor on non-instance"); + } + return fn.call(receiver, value); +}; +var _C_x_set, _C_instances, _a; +const C = (_a = class { + constructor() { + _C_instances.add(this); + } + m() { + __classPrivateAccessorSet(this, _C_instances, _C_x_set, __classPrivateWriteonly(this) + 2); // Error + } + }, + _C_instances = new WeakSet(), + _C_x_set = function _C_x_set(x) { }, + _a); +console.log(new C().m()); diff --git a/tests/baselines/reference/privateNameSetterNoGetter.symbols b/tests/baselines/reference/privateNameSetterNoGetter.symbols new file mode 100644 index 0000000000000..95f0f4f73e99f --- /dev/null +++ b/tests/baselines/reference/privateNameSetterNoGetter.symbols @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts === +const C = class { +>C : Symbol(C, Decl(privateNameSetterNoGetter.ts, 0, 5)) + + set #x(x) {} +>#x : Symbol(C.#x, Decl(privateNameSetterNoGetter.ts, 0, 17)) +>x : Symbol(x, Decl(privateNameSetterNoGetter.ts, 1, 11)) + + m() { +>m : Symbol(C.m, Decl(privateNameSetterNoGetter.ts, 1, 16)) + + this.#x += 2; // Error +>this.#x : Symbol(C.#x, Decl(privateNameSetterNoGetter.ts, 0, 17)) +>this : Symbol(C, Decl(privateNameSetterNoGetter.ts, 0, 9)) + } +} + +console.log(new C().m()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>new C().m : Symbol(C.m, Decl(privateNameSetterNoGetter.ts, 1, 16)) +>C : Symbol(C, Decl(privateNameSetterNoGetter.ts, 0, 5)) +>m : Symbol(C.m, Decl(privateNameSetterNoGetter.ts, 1, 16)) + diff --git a/tests/baselines/reference/privateNameSetterNoGetter.types b/tests/baselines/reference/privateNameSetterNoGetter.types new file mode 100644 index 0000000000000..542069f49ad5e --- /dev/null +++ b/tests/baselines/reference/privateNameSetterNoGetter.types @@ -0,0 +1,31 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts === +const C = class { +>C : typeof C +>class { set #x(x) {} m() { this.#x += 2; // Error }} : typeof C + + set #x(x) {} +>#x : any +>x : any + + m() { +>m : () => void + + this.#x += 2; // Error +>this.#x += 2 : any +>this.#x : any +>this : this +>2 : 2 + } +} + +console.log(new C().m()); +>console.log(new C().m()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>new C().m() : void +>new C().m : () => void +>new C() : C +>C : typeof C +>m : () => void + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts b/tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts new file mode 100644 index 0000000000000..ae0aeda5efd5e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameSetterNoGetter.ts @@ -0,0 +1,10 @@ +// @target: es2015 + +const C = class { + set #x(x) {} + m() { + this.#x += 2; // Error + } +} + +console.log(new C().m()); From d51f6cd70168b703cc93256a173d205cf5a9edc5 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 28 Jan 2021 17:27:05 +0000 Subject: [PATCH 21/68] fix: getAllUnscopedEmitHelpers Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 33d5d57278806..80576e9aabb11 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -965,6 +965,7 @@ namespace ts { classPrivateFieldSetHelper, classPrivateMethodGetHelper, classPrivateReadonlyHelper, + classPrivateWriteonlyHelper, classPrivateAccessorGetHelper, classPrivateAccessorSetHelper, createBindingHelper, From c1757708a563456e329e8fda7bfecee68f6b75a9 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Fri, 29 Jan 2021 13:56:52 +0000 Subject: [PATCH 22/68] fix: better handling of duplicate names Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 2 ++ tests/baselines/reference/privateNameDuplicateField.js | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 3dacb2de108f0..284a72aa2357e 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -932,6 +932,8 @@ namespace ts { privateIdentifierInfo.weakMapName ); } + default: + return undefined; } } else { diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 38760b303ebba..c4fef233f801b 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -47,14 +47,12 @@ _A_foo = new WeakMap(), _A_foo_1 = new WeakMap(); class A2 { constructor() { _A2_instances.add(this); - this.#foo = "foo"; } } _A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_foo_1 = function _A2_foo_1() { }; class A3 { constructor() { _A3_instances.add(this); - this.#foo = "foo"; } } _A3_foo = new WeakMap(), _A3_instances = new WeakSet(), _A3_foo_get = function _A3_foo_get() { return ""; }; @@ -73,7 +71,6 @@ _A5_instances = new WeakSet(), _A5_foo_get = function _A5_foo_get() { return ""; class A6 { constructor() { _A6_instances.add(this); - this.#foo = "foo"; } } _A6_foo = new WeakMap(), _A6_instances = new WeakSet(), _A6_foo_get = function _A6_foo_get() { return ""; }; From 4301af504c646161d32c7d1571e46fa4b43a049c Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Mon, 1 Feb 2021 12:36:58 +0200 Subject: [PATCH 23/68] Fixed wrong error message for private methods in class expressions. --- src/compiler/checker.ts | 2 +- .../reference/privateNameMethodClassExpression.errors.txt | 5 +---- tests/baselines/reference/privateNameReadonly.errors.txt | 5 +---- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 0627820809b8b..25fdbac8b3bda 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32315,7 +32315,7 @@ namespace ts { } // Private named methods are only allowed in class declarations - if (isPrivateIdentifier(node.name) && !isClassDeclaration(node.parent)) { + if (isPrivateIdentifier(node.name) && !getContainingClass(node)) { error(node, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); } } diff --git a/tests/baselines/reference/privateNameMethodClassExpression.errors.txt b/tests/baselines/reference/privateNameMethodClassExpression.errors.txt index c03f18b10696b..2b44629ccabbf 100644 --- a/tests/baselines/reference/privateNameMethodClassExpression.errors.txt +++ b/tests/baselines/reference/privateNameMethodClassExpression.errors.txt @@ -1,14 +1,11 @@ -tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(3,5): error TS18016: Private identifiers are not allowed outside class bodies. tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(9,17): error TS18013: Property '#method' is not accessible outside class '(anonymous)' because it has a private identifier. tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts(10,17): error TS18013: Property '#field' is not accessible outside class '(anonymous)' because it has a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameMethodClassExpression.ts (2 errors) ==== const C = class { #field = this.#method(); #method() { return 42; } - ~~~~~~~ -!!! error TS18016: Private identifiers are not allowed outside class bodies. static getInstance() { return new C(); } getField() { return this.#field }; } diff --git a/tests/baselines/reference/privateNameReadonly.errors.txt b/tests/baselines/reference/privateNameReadonly.errors.txt index df4adc632a809..7f2ea879ec8c6 100644 --- a/tests/baselines/reference/privateNameReadonly.errors.txt +++ b/tests/baselines/reference/privateNameReadonly.errors.txt @@ -1,13 +1,10 @@ -tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(2,5): error TS18016: Private identifiers are not allowed outside class bodies. tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,9): error TS2322: Type 'void' is not assignable to type '() => void'. tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2798: Cannot assign to private method '#bar'. Private methods are not writable. -==== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts (2 errors) ==== const C = class { #bar() {} - ~~~~ -!!! error TS18016: Private identifiers are not allowed outside class bodies. foo() { this.#bar = console.log("should log this then throw"); ~~~~~~~~~ From 3a056b251814227d59bb0e722512537e7a33c2fc Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 1 Feb 2021 12:35:37 +0000 Subject: [PATCH 24/68] change error message Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 2 +- tests/baselines/reference/privateNameSetterNoGetter.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 80576e9aabb11..1dc40b01c7b1e 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -908,7 +908,7 @@ namespace ts { scoped: false, text: ` var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { - throw new TypeError("private element was defined without a getter"); + throw new TypeError("private setter was defined without a getter"); };` }; diff --git a/tests/baselines/reference/privateNameSetterNoGetter.js b/tests/baselines/reference/privateNameSetterNoGetter.js index 0a94778f30ffc..938f74b0f608e 100644 --- a/tests/baselines/reference/privateNameSetterNoGetter.js +++ b/tests/baselines/reference/privateNameSetterNoGetter.js @@ -11,7 +11,7 @@ console.log(new C().m()); //// [privateNameSetterNoGetter.js] var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { - throw new TypeError("private element was defined without a getter"); + throw new TypeError("private setter was defined without a getter"); }; var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { if (!instances.has(receiver)) { From 95df2d14285cb89a6d9b086d03625022ab1f5dbd Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 1 Feb 2021 13:32:56 +0000 Subject: [PATCH 25/68] add a test for async private methods with a higher target Signed-off-by: Kubilay Kahveci --- .../reference/privateNameMethodAsync.js | 41 +++++++++ .../reference/privateNameMethodAsync.symbols | 56 ++++++++++++ .../reference/privateNameMethodAsync.types | 86 +++++++++++++++++++ .../privateNames/privateNameMethodAsync.ts | 15 ++++ 4 files changed, 198 insertions(+) create mode 100644 tests/baselines/reference/privateNameMethodAsync.js create mode 100644 tests/baselines/reference/privateNameMethodAsync.symbols create mode 100644 tests/baselines/reference/privateNameMethodAsync.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts diff --git a/tests/baselines/reference/privateNameMethodAsync.js b/tests/baselines/reference/privateNameMethodAsync.js new file mode 100644 index 0000000000000..becbf7b0bcc79 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAsync.js @@ -0,0 +1,41 @@ +//// [privateNameMethodAsync.ts] +const C = class { + async #bar() { return await Promise.resolve(42); } + async foo() { + const b = await this.#bar(); + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); + } + *#baz() { yield 42; } + async *#qux() { + yield (await Promise.resolve(42)); + } +} + +new C().foo().then(console.log); + + +//// [privateNameMethodAsync.js] +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _C_bar, _C_baz, _C_qux, _C_instances, _a; +const C = (_a = class { + constructor() { + _C_instances.add(this); + } + async foo() { + const b = await __classPrivateMethodGet(this, _C_instances, _C_bar).call(this); + return b + (__classPrivateMethodGet(this, _C_instances, _C_baz).call(this).next().value || 0) + ((await __classPrivateMethodGet(this, _C_instances, _C_qux).call(this).next()).value || 0); + } + }, + _C_instances = new WeakSet(), + _C_bar = async function _C_bar() { return await Promise.resolve(42); }, + _C_baz = function* _C_baz() { yield 42; }, + _C_qux = async function* _C_qux() { + yield (await Promise.resolve(42)); + }, + _a); +new C().foo().then(console.log); diff --git a/tests/baselines/reference/privateNameMethodAsync.symbols b/tests/baselines/reference/privateNameMethodAsync.symbols new file mode 100644 index 0000000000000..f3c70cb19eda7 --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAsync.symbols @@ -0,0 +1,56 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts === +const C = class { +>C : Symbol(C, Decl(privateNameMethodAsync.ts, 0, 5)) + + async #bar() { return await Promise.resolve(42); } +>#bar : Symbol(C.#bar, Decl(privateNameMethodAsync.ts, 0, 17)) +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + + async foo() { +>foo : Symbol(C.foo, Decl(privateNameMethodAsync.ts, 1, 54)) + + const b = await this.#bar(); +>b : Symbol(b, Decl(privateNameMethodAsync.ts, 3, 13)) +>this.#bar : Symbol(C.#bar, Decl(privateNameMethodAsync.ts, 0, 17)) +>this : Symbol(C, Decl(privateNameMethodAsync.ts, 0, 9)) + + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); +>b : Symbol(b, Decl(privateNameMethodAsync.ts, 3, 13)) +>this.#baz().next().value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>this.#baz().next : Symbol(Generator.next, Decl(lib.es2015.generator.d.ts, --, --)) +>this.#baz : Symbol(C.#baz, Decl(privateNameMethodAsync.ts, 5, 5)) +>this : Symbol(C, Decl(privateNameMethodAsync.ts, 0, 9)) +>next : Symbol(Generator.next, Decl(lib.es2015.generator.d.ts, --, --)) +>value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>(await this.#qux().next()).value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>this.#qux().next : Symbol(AsyncGenerator.next, Decl(lib.es2018.asyncgenerator.d.ts, --, --)) +>this.#qux : Symbol(C.#qux, Decl(privateNameMethodAsync.ts, 6, 25)) +>this : Symbol(C, Decl(privateNameMethodAsync.ts, 0, 9)) +>next : Symbol(AsyncGenerator.next, Decl(lib.es2018.asyncgenerator.d.ts, --, --)) +>value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) + } + *#baz() { yield 42; } +>#baz : Symbol(C.#baz, Decl(privateNameMethodAsync.ts, 5, 5)) + + async *#qux() { +>#qux : Symbol(C.#qux, Decl(privateNameMethodAsync.ts, 6, 25)) + + yield (await Promise.resolve(42)); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + } +} + +new C().foo().then(console.log); +>new C().foo().then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) +>new C().foo : Symbol(C.foo, Decl(privateNameMethodAsync.ts, 1, 54)) +>C : Symbol(C, Decl(privateNameMethodAsync.ts, 0, 5)) +>foo : Symbol(C.foo, Decl(privateNameMethodAsync.ts, 1, 54)) +>then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + diff --git a/tests/baselines/reference/privateNameMethodAsync.types b/tests/baselines/reference/privateNameMethodAsync.types new file mode 100644 index 0000000000000..3ac547af0404c --- /dev/null +++ b/tests/baselines/reference/privateNameMethodAsync.types @@ -0,0 +1,86 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts === +const C = class { +>C : typeof C +>class { async #bar() { return await Promise.resolve(42); } async foo() { const b = await this.#bar(); return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); } *#baz() { yield 42; } async *#qux() { yield (await Promise.resolve(42)); }} : typeof C + + async #bar() { return await Promise.resolve(42); } +>#bar : () => Promise +>await Promise.resolve(42) : number +>Promise.resolve(42) : Promise +>Promise.resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>Promise : PromiseConstructor +>resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>42 : 42 + + async foo() { +>foo : () => Promise + + const b = await this.#bar(); +>b : number +>await this.#bar() : number +>this.#bar() : Promise +>this.#bar : () => Promise +>this : this + + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); +>b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0) : number +>b + (this.#baz().next().value || 0) : number +>b : number +>(this.#baz().next().value || 0) : number +>this.#baz().next().value || 0 : number +>this.#baz().next().value : number | void +>this.#baz().next() : IteratorResult +>this.#baz().next : (...args: [] | [unknown]) => IteratorResult +>this.#baz() : Generator +>this.#baz : () => Generator +>this : this +>next : (...args: [] | [unknown]) => IteratorResult +>value : number | void +>0 : 0 +>((await this.#qux().next()).value || 0) : number +>(await this.#qux().next()).value || 0 : number +>(await this.#qux().next()).value : number | void +>(await this.#qux().next()) : IteratorResult +>await this.#qux().next() : IteratorResult +>this.#qux().next() : Promise> +>this.#qux().next : (...args: [] | [unknown]) => Promise> +>this.#qux() : AsyncGenerator +>this.#qux : () => AsyncGenerator +>this : this +>next : (...args: [] | [unknown]) => Promise> +>value : number | void +>0 : 0 + } + *#baz() { yield 42; } +>#baz : () => Generator +>yield 42 : any +>42 : 42 + + async *#qux() { +>#qux : () => AsyncGenerator + + yield (await Promise.resolve(42)); +>yield (await Promise.resolve(42)) : any +>(await Promise.resolve(42)) : number +>await Promise.resolve(42) : number +>Promise.resolve(42) : Promise +>Promise.resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>Promise : PromiseConstructor +>resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>42 : 42 + } +} + +new C().foo().then(console.log); +>new C().foo().then(console.log) : Promise +>new C().foo().then : (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike) => Promise +>new C().foo() : Promise +>new C().foo : () => Promise +>new C() : C +>C : typeof C +>foo : () => Promise +>then : (onfulfilled?: (value: number) => TResult1 | PromiseLike, onrejected?: (reason: any) => TResult2 | PromiseLike) => Promise +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts new file mode 100644 index 0000000000000..1b1cc59d99d42 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameMethodAsync.ts @@ -0,0 +1,15 @@ +// @target: es2019 + +const C = class { + async #bar() { return await Promise.resolve(42); } + async foo() { + const b = await this.#bar(); + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); + } + *#baz() { yield 42; } + async *#qux() { + yield (await Promise.resolve(42)); + } +} + +new C().foo().then(console.log); From 590124e22528b7f43b33a59738a241b2aa66ac1b Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 3 Feb 2021 10:01:22 +0000 Subject: [PATCH 26/68] fix: setter assignment returns rhs value Signed-off-by: Kubilay Kahveci --- src/compiler/factory/emitHelpers.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 1dc40b01c7b1e..8e629bb96e663 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -934,7 +934,8 @@ namespace ts { if (!instances.has(receiver)) { throw new TypeError("attempted to set private accessor on non-instance"); } - return fn.call(receiver, value); + fn.call(receiver, value); + return value; };` }; From 219ea8340f510034bdbfc161c880616a87197da7 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 3 Feb 2021 10:02:45 +0000 Subject: [PATCH 27/68] add a test for setter assignment return value Signed-off-by: Kubilay Kahveci --- .../reference/privateNameAccessors.js | 3 +- .../privateNameSetterExprReturnValue.js | 32 ++++++++++++++++ .../privateNameSetterExprReturnValue.symbols | 29 +++++++++++++++ .../privateNameSetterExprReturnValue.types | 37 +++++++++++++++++++ .../reference/privateNameSetterNoGetter.js | 3 +- .../privateNameSetterExprReturnValue.ts | 11 ++++++ 6 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/privateNameSetterExprReturnValue.js create mode 100644 tests/baselines/reference/privateNameSetterExprReturnValue.symbols create mode 100644 tests/baselines/reference/privateNameSetterExprReturnValue.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index d08be3efc3678..dd0b577b5a754 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -20,7 +20,8 @@ var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || func if (!instances.has(receiver)) { throw new TypeError("attempted to set private accessor on non-instance"); } - return fn.call(receiver, value); + fn.call(receiver, value); + return value; }; var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { throw new TypeError("private element is not writable"); diff --git a/tests/baselines/reference/privateNameSetterExprReturnValue.js b/tests/baselines/reference/privateNameSetterExprReturnValue.js new file mode 100644 index 0000000000000..06d8d9cc5807e --- /dev/null +++ b/tests/baselines/reference/privateNameSetterExprReturnValue.js @@ -0,0 +1,32 @@ +//// [privateNameSetterExprReturnValue.ts] +class C { + set #foo(a: number) {} + bar() { + let x = (this.#foo = 42 * 2); + console.log(x); // 84 + } +} + +new C().bar(); + + +//// [privateNameSetterExprReturnValue.js] +var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to set private accessor on non-instance"); + } + fn.call(receiver, value); + return value; +}; +var _C_foo_set, _C_instances; +class C { + constructor() { + _C_instances.add(this); + } + bar() { + let x = (__classPrivateAccessorSet(this, _C_instances, _C_foo_set, 42 * 2)); + console.log(x); // 84 + } +} +_C_instances = new WeakSet(), _C_foo_set = function _C_foo_set(a) { }; +new C().bar(); diff --git a/tests/baselines/reference/privateNameSetterExprReturnValue.symbols b/tests/baselines/reference/privateNameSetterExprReturnValue.symbols new file mode 100644 index 0000000000000..56f6e1099bff2 --- /dev/null +++ b/tests/baselines/reference/privateNameSetterExprReturnValue.symbols @@ -0,0 +1,29 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts === +class C { +>C : Symbol(C, Decl(privateNameSetterExprReturnValue.ts, 0, 0)) + + set #foo(a: number) {} +>#foo : Symbol(C.#foo, Decl(privateNameSetterExprReturnValue.ts, 0, 9)) +>a : Symbol(a, Decl(privateNameSetterExprReturnValue.ts, 1, 13)) + + bar() { +>bar : Symbol(C.bar, Decl(privateNameSetterExprReturnValue.ts, 1, 26)) + + let x = (this.#foo = 42 * 2); +>x : Symbol(x, Decl(privateNameSetterExprReturnValue.ts, 3, 11)) +>this.#foo : Symbol(C.#foo, Decl(privateNameSetterExprReturnValue.ts, 0, 9)) +>this : Symbol(C, Decl(privateNameSetterExprReturnValue.ts, 0, 0)) + + console.log(x); // 84 +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameSetterExprReturnValue.ts, 3, 11)) + } +} + +new C().bar(); +>new C().bar : Symbol(C.bar, Decl(privateNameSetterExprReturnValue.ts, 1, 26)) +>C : Symbol(C, Decl(privateNameSetterExprReturnValue.ts, 0, 0)) +>bar : Symbol(C.bar, Decl(privateNameSetterExprReturnValue.ts, 1, 26)) + diff --git a/tests/baselines/reference/privateNameSetterExprReturnValue.types b/tests/baselines/reference/privateNameSetterExprReturnValue.types new file mode 100644 index 0000000000000..2713756c0ab69 --- /dev/null +++ b/tests/baselines/reference/privateNameSetterExprReturnValue.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts === +class C { +>C : C + + set #foo(a: number) {} +>#foo : number +>a : number + + bar() { +>bar : () => void + + let x = (this.#foo = 42 * 2); +>x : number +>(this.#foo = 42 * 2) : number +>this.#foo = 42 * 2 : number +>this.#foo : number +>this : this +>42 * 2 : number +>42 : 42 +>2 : 2 + + console.log(x); // 84 +>console.log(x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x : number + } +} + +new C().bar(); +>new C().bar() : void +>new C().bar : () => void +>new C() : C +>C : typeof C +>bar : () => void + diff --git a/tests/baselines/reference/privateNameSetterNoGetter.js b/tests/baselines/reference/privateNameSetterNoGetter.js index 938f74b0f608e..2d3823faef87e 100644 --- a/tests/baselines/reference/privateNameSetterNoGetter.js +++ b/tests/baselines/reference/privateNameSetterNoGetter.js @@ -17,7 +17,8 @@ var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || func if (!instances.has(receiver)) { throw new TypeError("attempted to set private accessor on non-instance"); } - return fn.call(receiver, value); + fn.call(receiver, value); + return value; }; var _C_x_set, _C_instances, _a; const C = (_a = class { diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts b/tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts new file mode 100644 index 0000000000000..c9def078b2994 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameSetterExprReturnValue.ts @@ -0,0 +1,11 @@ +// @target: es2019 + +class C { + set #foo(a: number) {} + bar() { + let x = (this.#foo = 42 * 2); + console.log(x); // 84 + } +} + +new C().bar(); From 25da8caf53ce241a61d1b876fa8c857a966b86b2 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 3 Feb 2021 10:08:43 +0000 Subject: [PATCH 28/68] fix: handle duplicate accessors Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 284a72aa2357e..01b7e6281efe9 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -1128,8 +1128,7 @@ namespace ts { if (isGetAccessor(node)) { const getterName = createHoistedVariableForPrivateName(text + "_get"); - if (previousInfo) { - Debug.assert(previousInfo.placement === PrivateIdentifierPlacement.InstanceSetterOnly); + if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceSetterOnly) { info = { placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, getterName, @@ -1146,8 +1145,7 @@ namespace ts { else { const setterName = createHoistedVariableForPrivateName(text + "_set"); - if (previousInfo) { - Debug.assert(previousInfo.placement === PrivateIdentifierPlacement.InstanceGetterOnly); + if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceGetterOnly) { info = { placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, setterName, From a2228bed99f5d96cae93d1f1e8c423dab09fa5df Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 3 Feb 2021 10:12:58 +0000 Subject: [PATCH 29/68] add tests for duplicate accessors Signed-off-by: Kubilay Kahveci --- .../privateNameDuplicateField.errors.txt | 43 +++++++++++++++++- .../reference/privateNameDuplicateField.js | 37 +++++++++++++++- .../privateNameDuplicateField.symbols | 40 +++++++++++++++++ .../reference/privateNameDuplicateField.types | 44 +++++++++++++++++++ .../privateNames/privateNameDuplicateField.ts | 17 +++++++ 5 files changed, 179 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/privateNameDuplicateField.errors.txt b/tests/baselines/reference/privateNameDuplicateField.errors.txt index 519a2b85f2657..c724fd80b6713 100644 --- a/tests/baselines/reference/privateNameDuplicateField.errors.txt +++ b/tests/baselines/reference/privateNameDuplicateField.errors.txt @@ -10,9 +10,17 @@ tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.t tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(30,5): error TS2300: Duplicate identifier '#foo'. tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(31,5): error TS2300: Duplicate identifier '#foo'. tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(32,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(36,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(37,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(41,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(42,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(46,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(47,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(48,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(49,9): error TS2300: Duplicate identifier '#foo'. -==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (12 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (20 errors) ==== class A { #foo = "foo"; #foo = "foo"; @@ -70,4 +78,37 @@ tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.t ~~~~ !!! error TS2300: Duplicate identifier '#foo'. } + + class A7 { + get #foo() { return ""; } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""; } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + class A8 { + set #foo(a: string) {} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + set #foo(a: string) {} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + class A9 { + get #foo() { return ""; } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + set #foo(a: string) {} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""; } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + set #foo(a: string) {} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index c4fef233f801b..820f9e76f6fdb 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -32,11 +32,28 @@ class A6 { #foo() { return ""} get #foo() { return ""} } + +class A7 { + get #foo() { return ""; } + get #foo() { return ""; } +} + +class A8 { + set #foo(a: string) {} + set #foo(a: string) {} +} + +class A9 { + get #foo() { return ""; } + set #foo(a: string) {} + get #foo() { return ""; } + set #foo(a: string) {} +} //// [privateNameDuplicateField.js] "use strict"; -var _A_foo, _A_foo_1, _A2_foo, _A2_foo_1, _A2_instances, _A3_foo, _A3_foo_get, _A3_instances, _A4_foo, _A4_foo_1, _A4_instances, _A5_foo, _A5_foo_get, _A5_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A6_instances; +var _A_foo, _A_foo_1, _A2_foo, _A2_foo_1, _A2_instances, _A3_foo, _A3_foo_get, _A3_instances, _A4_foo, _A4_foo_1, _A4_instances, _A5_foo, _A5_foo_get, _A5_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A6_instances, _A7_foo_get, _A7_foo_get_1, _A7_instances, _A8_foo_set, _A8_foo_set_1, _A8_instances, _A9_foo_get, _A9_foo_set, _A9_foo_get_1, _A9_foo_set_1, _A9_instances; class A { constructor() { _A_foo_1.set(this, "foo"); @@ -74,3 +91,21 @@ class A6 { } } _A6_foo = new WeakMap(), _A6_instances = new WeakSet(), _A6_foo_get = function _A6_foo_get() { return ""; }; +class A7 { + constructor() { + _A7_instances.add(this); + } +} +_A7_instances = new WeakSet(), _A7_foo_get_1 = function _A7_foo_get_1() { return ""; }, _A7_foo_get_1 = function _A7_foo_get_1() { return ""; }; +class A8 { + constructor() { + _A8_instances.add(this); + } +} +_A8_instances = new WeakSet(), _A8_foo_set_1 = function _A8_foo_set_1(a) { }, _A8_foo_set_1 = function _A8_foo_set_1(a) { }; +class A9 { + constructor() { + _A9_instances.add(this); + } +} +_A9_instances = new WeakSet(), _A9_foo_get_1 = function _A9_foo_get_1() { return ""; }, _A9_foo_set_1 = function _A9_foo_set_1(a) { }, _A9_foo_get_1 = function _A9_foo_get_1() { return ""; }, _A9_foo_set_1 = function _A9_foo_set_1(a) { }; diff --git a/tests/baselines/reference/privateNameDuplicateField.symbols b/tests/baselines/reference/privateNameDuplicateField.symbols index 85c8eb0ecb05d..bc037e01e8119 100644 --- a/tests/baselines/reference/privateNameDuplicateField.symbols +++ b/tests/baselines/reference/privateNameDuplicateField.symbols @@ -65,3 +65,43 @@ class A6 { >#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 30, 23)) } +class A7 { +>A7 : Symbol(A7, Decl(privateNameDuplicateField.ts, 32, 1)) + + get #foo() { return ""; } +>#foo : Symbol(A7.#foo, Decl(privateNameDuplicateField.ts, 34, 10)) + + get #foo() { return ""; } +>#foo : Symbol(A7.#foo, Decl(privateNameDuplicateField.ts, 35, 29)) +} + +class A8 { +>A8 : Symbol(A8, Decl(privateNameDuplicateField.ts, 37, 1)) + + set #foo(a: string) {} +>#foo : Symbol(A8.#foo, Decl(privateNameDuplicateField.ts, 39, 10)) +>a : Symbol(a, Decl(privateNameDuplicateField.ts, 40, 13)) + + set #foo(a: string) {} +>#foo : Symbol(A8.#foo, Decl(privateNameDuplicateField.ts, 40, 26)) +>a : Symbol(a, Decl(privateNameDuplicateField.ts, 41, 13)) +} + +class A9 { +>A9 : Symbol(A9, Decl(privateNameDuplicateField.ts, 42, 1)) + + get #foo() { return ""; } +>#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 44, 10), Decl(privateNameDuplicateField.ts, 45, 29)) + + set #foo(a: string) {} +>#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 44, 10), Decl(privateNameDuplicateField.ts, 45, 29)) +>a : Symbol(a, Decl(privateNameDuplicateField.ts, 46, 13)) + + get #foo() { return ""; } +>#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 46, 26)) + + set #foo(a: string) {} +>#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 47, 29)) +>a : Symbol(a, Decl(privateNameDuplicateField.ts, 48, 13)) +} + diff --git a/tests/baselines/reference/privateNameDuplicateField.types b/tests/baselines/reference/privateNameDuplicateField.types index 962b1282c5c5a..7b60a0bb2fca5 100644 --- a/tests/baselines/reference/privateNameDuplicateField.types +++ b/tests/baselines/reference/privateNameDuplicateField.types @@ -77,3 +77,47 @@ class A6 { >"" : "" } +class A7 { +>A7 : A7 + + get #foo() { return ""; } +>#foo : string +>"" : "" + + get #foo() { return ""; } +>#foo : string +>"" : "" +} + +class A8 { +>A8 : A8 + + set #foo(a: string) {} +>#foo : string +>a : string + + set #foo(a: string) {} +>#foo : string +>a : string +} + +class A9 { +>A9 : A9 + + get #foo() { return ""; } +>#foo : string +>"" : "" + + set #foo(a: string) {} +>#foo : string +>a : string + + get #foo() { return ""; } +>#foo : string +>"" : "" + + set #foo(a: string) {} +>#foo : string +>a : string +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts index e2b911b0afd40..3959fcdb8b85f 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts @@ -34,3 +34,20 @@ class A6 { #foo() { return ""} get #foo() { return ""} } + +class A7 { + get #foo() { return ""; } + get #foo() { return ""; } +} + +class A8 { + set #foo(a: string) {} + set #foo(a: string) {} +} + +class A9 { + get #foo() { return ""; } + set #foo(a: string) {} + get #foo() { return ""; } + set #foo(a: string) {} +} From ff4f73785e0e03c197bf373a4a43337b6c7ed274 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 3 Feb 2021 10:59:45 +0000 Subject: [PATCH 30/68] docs: add missing parameter docs Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 01b7e6281efe9..f14866f4b90b2 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -981,6 +981,7 @@ namespace ts { /** * Generates brand-check initializer for private methods. * + * @param statements Statement list that should be used to append new statements. * @param methods An array of method declarations. * @param receiver The receiver on which each method should be assigned. */ From 704727cb24b949658baa4e252b4f11a07a177244 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 3 Feb 2021 19:38:40 +0200 Subject: [PATCH 31/68] Fixed failing test. --- tests/baselines/reference/privateNameReadonly.errors.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/privateNameReadonly.errors.txt b/tests/baselines/reference/privateNameReadonly.errors.txt index 7f2ea879ec8c6..6cdef381c04aa 100644 --- a/tests/baselines/reference/privateNameReadonly.errors.txt +++ b/tests/baselines/reference/privateNameReadonly.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,9): error TS2322: Type 'void' is not assignable to type '() => void'. -tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2798: Cannot assign to private method '#bar'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2801: Cannot assign to private method '#bar'. Private methods are not writable. ==== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts (2 errors) ==== @@ -10,7 +10,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14 ~~~~~~~~~ !!! error TS2322: Type 'void' is not assignable to type '() => void'. ~~~~ -!!! error TS2798: Cannot assign to private method '#bar'. Private methods are not writable. +!!! error TS2801: Cannot assign to private method '#bar'. Private methods are not writable. } } From 73925dcc1c523c53770da809a48f6628ccf96c23 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Feb 2021 13:18:27 +0000 Subject: [PATCH 32/68] baseline-accept: ordering changes Signed-off-by: Kubilay Kahveci --- tests/baselines/reference/privateNameAccessors.js | 2 +- tests/baselines/reference/privateNameAccessorsAccess.js | 2 +- .../baselines/reference/privateNameAccessorsCallExpression.js | 2 +- .../reference/privateNameAccessorssDerivedClasses.js | 2 +- tests/baselines/reference/privateNameConstructorReserved.js | 2 +- tests/baselines/reference/privateNameDuplicateField.js | 2 +- tests/baselines/reference/privateNameES5Ban(target=es3).js | 2 +- tests/baselines/reference/privateNameES5Ban(target=es5).js | 2 +- tests/baselines/reference/privateNameMethod.js | 2 +- tests/baselines/reference/privateNameMethodAccess.js | 2 +- tests/baselines/reference/privateNameMethodAssignment.js | 2 +- tests/baselines/reference/privateNameMethodAsync.js | 2 +- tests/baselines/reference/privateNameMethodCallExpression.js | 2 +- tests/baselines/reference/privateNameMethodClassExpression.js | 2 +- .../baselines/reference/privateNameMethodInStaticFieldInit.js | 2 +- tests/baselines/reference/privateNameMethodsDerivedClasses.js | 2 +- .../reference/privateNameNestedClassAccessorsShadowing.js | 4 ++-- .../reference/privateNameNestedClassMethodShadowing.js | 4 ++-- tests/baselines/reference/privateNameReadonly.js | 2 +- tests/baselines/reference/privateNameSetterExprReturnValue.js | 2 +- tests/baselines/reference/privateNameSetterNoGetter.js | 2 +- tests/baselines/reference/privateNamesAndDecorators.js | 2 +- tests/baselines/reference/privateNamesAndGenericClasses-2.js | 2 +- tests/baselines/reference/privateNamesAndkeyof.js | 2 +- tests/baselines/reference/privateNamesInGenericClasses.js | 2 +- .../baselines/reference/privateNamesIncompatibleModifiers.js | 2 +- tests/baselines/reference/privateNamesUseBeforeDef.js | 2 +- 27 files changed, 29 insertions(+), 29 deletions(-) diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index dd0b577b5a754..f2c736fa52376 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -32,7 +32,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _A1_prop_get, _A1_prop_set, _A1_roProp_get, _A1_instances; +var _A1_instances, _A1_prop_get, _A1_prop_set, _A1_roProp_get; class A1 { constructor(name) { _A1_instances.add(this); diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js index 06f2cde867b75..5420d8bec82bb 100644 --- a/tests/baselines/reference/privateNameAccessorsAccess.js +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -32,7 +32,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _A2_prop_get, _A2_prop_set, _A2_instances; +var _A2_instances, _A2_prop_get, _A2_prop_set; class A2 { constructor() { _A2_instances.add(this); diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js index f3cf7687d6438..edfc6ae9aa08c 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -25,7 +25,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _A_fieldFunc_get, _A_fieldFunc2_get, _A_instances; +var _A_instances, _A_fieldFunc_get, _A_fieldFunc2_get; class A { constructor() { _A_instances.add(this); diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js index 42e518dd1e827..445716f35f753 100644 --- a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -19,7 +19,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _Base_prop_get, _Base_instances; +var _Base_instances, _Base_prop_get; class Base { constructor() { _Base_instances.add(this); diff --git a/tests/baselines/reference/privateNameConstructorReserved.js b/tests/baselines/reference/privateNameConstructorReserved.js index b3e48fdb5bf69..d1de278658b38 100644 --- a/tests/baselines/reference/privateNameConstructorReserved.js +++ b/tests/baselines/reference/privateNameConstructorReserved.js @@ -5,7 +5,7 @@ class A { //// [privateNameConstructorReserved.js] -var _A_constructor, _A_instances; +var _A_instances, _A_constructor; class A { constructor() { _A_instances.add(this); diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 820f9e76f6fdb..4120187527a1f 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -53,7 +53,7 @@ class A9 { //// [privateNameDuplicateField.js] "use strict"; -var _A_foo, _A_foo_1, _A2_foo, _A2_foo_1, _A2_instances, _A3_foo, _A3_foo_get, _A3_instances, _A4_foo, _A4_foo_1, _A4_instances, _A5_foo, _A5_foo_get, _A5_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A6_instances, _A7_foo_get, _A7_foo_get_1, _A7_instances, _A8_foo_set, _A8_foo_set_1, _A8_instances, _A9_foo_get, _A9_foo_set, _A9_foo_get_1, _A9_foo_set_1, _A9_instances; +var _A_foo, _A_foo_1, _A2_instances, _A2_foo, _A2_foo_1, _A3_instances, _A3_foo, _A3_foo_get, _A4_instances, _A4_foo, _A4_foo_1, _A5_instances, _A5_foo, _A5_foo_get, _A6_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A7_instances, _A7_foo_get, _A7_foo_get_1, _A8_instances, _A8_foo_set, _A8_foo_set_1, _A9_instances, _A9_foo_get, _A9_foo_set, _A9_foo_get_1, _A9_foo_set_1; class A { constructor() { _A_foo_1.set(this, "foo"); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index 24a301e676033..d32433a42867e 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -19,7 +19,7 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set, _A_instances; + var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField.set(A, "hello world"); return A; diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index 24a301e676033..d32433a42867e 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -19,7 +19,7 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - var _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set, _A_instances; + var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField.set(A, "hello world"); return A; diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js index 1fda4cb711940..204ea377e1590 100644 --- a/tests/baselines/reference/privateNameMethod.js +++ b/tests/baselines/reference/privateNameMethod.js @@ -20,7 +20,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _A1_method, _A1_instances; +var _A1_instances, _A1_method; class A1 { constructor(name) { _A1_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodAccess.js b/tests/baselines/reference/privateNameMethodAccess.js index ce3d039c67fd0..7d07b2275238e 100644 --- a/tests/baselines/reference/privateNameMethodAccess.js +++ b/tests/baselines/reference/privateNameMethodAccess.js @@ -30,7 +30,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _A2_method, _A2_instances, _a; +var _A2_instances, _A2_method, _a; class A2 { constructor() { _A2_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js index 2b1618e9938c7..3e1041bad4e47 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.js +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -22,7 +22,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _A3_method, _A3_instances; +var _A3_instances, _A3_method; class A3 { constructor(a, b) { var _a, _b; diff --git a/tests/baselines/reference/privateNameMethodAsync.js b/tests/baselines/reference/privateNameMethodAsync.js index becbf7b0bcc79..1e9924c5e35d0 100644 --- a/tests/baselines/reference/privateNameMethodAsync.js +++ b/tests/baselines/reference/privateNameMethodAsync.js @@ -21,7 +21,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _C_bar, _C_baz, _C_qux, _C_instances, _a; +var _C_instances, _C_bar, _C_baz, _C_qux, _a; const C = (_a = class { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js index b97b529024177..7d1ac5e672104 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.js +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -31,7 +31,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _AA_method, _AA_method2, _AA_instances; +var _AA_instances, _AA_method, _AA_method2; class AA { constructor() { _AA_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodClassExpression.js b/tests/baselines/reference/privateNameMethodClassExpression.js index e4a327c16d219..af2caf339cef9 100644 --- a/tests/baselines/reference/privateNameMethodClassExpression.js +++ b/tests/baselines/reference/privateNameMethodClassExpression.js @@ -25,7 +25,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _C_field, _C_method, _C_instances, _a; +var _C_instances, _C_field, _C_method, _a; const C = (_a = class { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js index 4ea2c49e6ba85..0b330e3ed2109 100644 --- a/tests/baselines/reference/privateNameMethodInStaticFieldInit.js +++ b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js @@ -14,7 +14,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _C_method, _C_instances, _a; +var _C_instances, _C_method, _a; class C { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.js b/tests/baselines/reference/privateNameMethodsDerivedClasses.js index cff6820a5cae7..509e385aec786 100644 --- a/tests/baselines/reference/privateNameMethodsDerivedClasses.js +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.js @@ -19,7 +19,7 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _Base_prop, _Base_instances; +var _Base_instances, _Base_prop; class Base { constructor() { _Base_instances.add(this); diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js index b650ce90b7d2d..c41b08adf1506 100644 --- a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -22,10 +22,10 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _Base_x_get, _Base_instances; +var _Base_instances, _Base_x_get; class Base { constructor() { - var _Derived_x_get, _Derived_instances; + var _Derived_instances, _Derived_x_get; _Base_instances.add(this); class Derived { constructor() { diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js index b8141f77f69f9..da45fba97e18d 100644 --- a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js @@ -22,10 +22,10 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _Base_x, _Base_instances; +var _Base_instances, _Base_x; class Base { constructor() { - var _Derived_x, _Derived_instances; + var _Derived_instances, _Derived_x; _Base_instances.add(this); class Derived { constructor() { diff --git a/tests/baselines/reference/privateNameReadonly.js b/tests/baselines/reference/privateNameReadonly.js index 53d39ac5c7164..b87dd98372218 100644 --- a/tests/baselines/reference/privateNameReadonly.js +++ b/tests/baselines/reference/privateNameReadonly.js @@ -13,7 +13,7 @@ console.log(new C().foo()); var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { throw new TypeError("private element is not writable"); }; -var _C_bar, _C_instances, _a; +var _C_instances, _C_bar, _a; const C = (_a = class { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNameSetterExprReturnValue.js b/tests/baselines/reference/privateNameSetterExprReturnValue.js index 06d8d9cc5807e..f4ef50f2d28d2 100644 --- a/tests/baselines/reference/privateNameSetterExprReturnValue.js +++ b/tests/baselines/reference/privateNameSetterExprReturnValue.js @@ -18,7 +18,7 @@ var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || func fn.call(receiver, value); return value; }; -var _C_foo_set, _C_instances; +var _C_instances, _C_foo_set; class C { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNameSetterNoGetter.js b/tests/baselines/reference/privateNameSetterNoGetter.js index 2d3823faef87e..3a4c9e97ea619 100644 --- a/tests/baselines/reference/privateNameSetterNoGetter.js +++ b/tests/baselines/reference/privateNameSetterNoGetter.js @@ -20,7 +20,7 @@ var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || func fn.call(receiver, value); return value; }; -var _C_x_set, _C_instances, _a; +var _C_instances, _C_x_set, _a; const C = (_a = class { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNamesAndDecorators.js b/tests/baselines/reference/privateNamesAndDecorators.js index 9fd8181f6f006..087ad2bb9a512 100644 --- a/tests/baselines/reference/privateNamesAndDecorators.js +++ b/tests/baselines/reference/privateNamesAndDecorators.js @@ -10,7 +10,7 @@ class A { //// [privateNamesAndDecorators.js] -var _A_foo, _A_bar, _A_instances; +var _A_instances, _A_foo, _A_bar; var A = /** @class */ (function () { function A() { _A_instances.add(this); diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index f9901a710c269..ba3bb5e3942b1 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -48,7 +48,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _C_foo, _C_bar, _C_instances; +var _C_instances, _C_foo, _C_bar; class C { constructor(t) { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNamesAndkeyof.js b/tests/baselines/reference/privateNamesAndkeyof.js index 20d4e1122013c..c250a02741afd 100644 --- a/tests/baselines/reference/privateNamesAndkeyof.js +++ b/tests/baselines/reference/privateNamesAndkeyof.js @@ -13,7 +13,7 @@ type T = keyof A // should not include '#foo*' //// [privateNamesAndkeyof.js] "use strict"; -var _A_fooField, _A_fooMethod, _A_fooProp_get, _A_fooProp_set, _A_instances; +var _A_instances, _A_fooField, _A_fooMethod, _A_fooProp_get, _A_fooProp_set; class A { constructor() { _A_instances.add(this); diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index e1ea4b49d09b0..efb0b6e96d90e 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -54,7 +54,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _C_foo, _C_method, _C_prop_get, _C_prop_set, _C_instances; +var _C_instances, _C_foo, _C_method, _C_prop_get, _C_prop_set; class C { constructor() { _C_instances.add(this); diff --git a/tests/baselines/reference/privateNamesIncompatibleModifiers.js b/tests/baselines/reference/privateNamesIncompatibleModifiers.js index 32a249ac3c5ed..23a87dd94c8a9 100644 --- a/tests/baselines/reference/privateNamesIncompatibleModifiers.js +++ b/tests/baselines/reference/privateNamesIncompatibleModifiers.js @@ -57,7 +57,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; -var _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp_get, _A_fooProp_set, _A_barProp_get, _A_barProp_set, _A_bazProp_get, _A_bazProp_set, _A_quxProp_get, _A_quxProp_set, _A_whatProp_get, _A_whatProp_set, _A_asyncProp_get, _A_asyncProp_set, _A_instances; +var _A_instances, _A_foo, _A_bar, _A_baz, _A_qux, _A_fooMethod, _A_barMethod, _A_bazMethod, _A_quxMethod, _A_asyncMethod, _A_genMethod, _A_asyncGenMethod, _A_fooProp_get, _A_fooProp_set, _A_barProp_get, _A_barProp_set, _A_bazProp_get, _A_bazProp_set, _A_quxProp_get, _A_quxProp_set, _A_whatProp_get, _A_whatProp_set, _A_asyncProp_get, _A_asyncProp_set; class A { constructor() { _A_instances.add(this); diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index 271cde160438e..90146102f9e35 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -39,7 +39,7 @@ var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || func } return fn.call(receiver); }; -var _A_foo, _A_bar, _A2_foo, _A2_bar, _A2_instances, _A3_foo, _A3_bar_get, _A3_instances, _B_foo, _B_bar; +var _A_foo, _A_bar, _A2_instances, _A2_foo, _A2_bar, _A3_instances, _A3_foo, _A3_bar_get, _B_foo, _B_bar; class A { constructor() { _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); // Error From 67fd38df0474d13cb127526e934cd20cfebebe66 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Feb 2021 13:24:12 +0000 Subject: [PATCH 33/68] fix: attach weakSetName to property declaration Signed-off-by: Kubilay Kahveci --- src/compiler/transformers/classFields.ts | 54 +++++++++++++----------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index f14866f4b90b2..d9be7159454d7 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -30,21 +30,25 @@ namespace ts { interface PrivateIdentifierInstanceMethod { placement: PrivateIdentifierPlacement.InstanceMethod; + weakSetName: Identifier; functionName: Identifier; } interface PrivateIdentifierInstanceGetterOnly { placement: PrivateIdentifierPlacement.InstanceGetterOnly; + weakSetName: Identifier; getterName: Identifier; } interface PrivateIdentifierInstanceSetterOnly { placement: PrivateIdentifierPlacement.InstanceSetterOnly; + weakSetName: Identifier; setterName: Identifier; } interface PrivateIdentifierInstanceGetterAndSetter { placement: PrivateIdentifierPlacement.InstanceGetterAndSetter; + weakSetName: Identifier; getterName: Identifier; setterName: Identifier; } @@ -54,7 +58,6 @@ namespace ts { * Used for prefixing generated variable names. */ className: string; - hasPrivateMethods: boolean; /** * Used for brand check on private methods. */ @@ -325,14 +328,14 @@ namespace ts { case PrivateIdentifierPlacement.InstanceMethod: return context.getEmitHelperFactory().createClassPrivateMethodGetHelper( receiver, - getPrivateIdentifierEnvironment().weakSetName, + info.weakSetName, info.functionName ); case PrivateIdentifierPlacement.InstanceGetterOnly: case PrivateIdentifierPlacement.InstanceGetterAndSetter: return context.getEmitHelperFactory().createClassPrivateAccessorGetHelper( receiver, - getPrivateIdentifierEnvironment().weakSetName, + info.weakSetName, info.getterName ); case PrivateIdentifierPlacement.InstanceSetterOnly: @@ -550,7 +553,7 @@ namespace ts { case PrivateIdentifierPlacement.InstanceGetterAndSetter: return context.getEmitHelperFactory().createClassPrivateAccessorSetHelper( receiver, - getPrivateIdentifierEnvironment().weakSetName, + info.weakSetName, info.setterName, right ); @@ -571,6 +574,10 @@ namespace ts { if (name && isIdentifier(name)) { getPrivateIdentifierEnvironment().className = name.escapedText as string; } + + if (some(getPrivateInstanceMethods(node))) { + getPrivateIdentifierEnvironment().weakSetName = createHoistedVariableForClass("instances"); + } } const result = isClassDeclaration(node) ? @@ -588,6 +595,13 @@ namespace ts { return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } + function getPrivateInstanceMethods(node: ClassLikeDeclaration) { + return filter( + [...getMethods(node, /*isStatic*/ false), ...getAccessors(node, /*isStatic*/ false)], + method => isPrivateIdentifier(method.name) + ); + } + function visitClassDeclaration(node: ClassDeclaration) { if (!forEach(node.members, doesClassElementNeedTransform)) { return visitEachChild(node, visitor, context); @@ -705,7 +719,9 @@ namespace ts { } } - createBrandCheckWeakSetForPrivateMethods(); + if (some(getPrivateInstanceMethods(node))) { + createBrandCheckWeakSetForPrivateMethods(); + } } const members: ClassElement[] = []; @@ -718,17 +734,9 @@ namespace ts { } function createBrandCheckWeakSetForPrivateMethods() { - const env = getPrivateIdentifierEnvironment(); - if (!env.hasPrivateMethods) { - return; - } - - const weakSetName = createHoistedVariableForClass("instances"); - env.weakSetName = weakSetName; - getPendingExpressions().push( factory.createAssignment( - env.weakSetName, + getPrivateIdentifierEnvironment().weakSetName, factory.createNewExpression( factory.createIdentifier("WeakSet"), /*typeArguments*/ undefined, @@ -784,10 +792,7 @@ namespace ts { properties = filter(properties, property => !!property.initializer || isPrivateIdentifier(property.name)); } - const privateMethods = filter( - [...getMethods(node, /*isStatic*/ false), ...getAccessors(node, /*isStatic*/ false)], - method => isPrivateIdentifier(method.name) - ); + const privateMethods = getPrivateInstanceMethods(node); const needsConstructorBody = some(properties) || some(privateMethods); // Only generate synthetic constructor when there are property initializers to move. @@ -1081,7 +1086,6 @@ namespace ts { if (!currentPrivateIdentifierEnvironment) { currentPrivateIdentifierEnvironment = { className: "", - hasPrivateMethods: false, weakSetName: factory.createUniqueName("_instances", GeneratedIdentifierFlags.Optimistic), identifiers: new Map() }; @@ -1096,6 +1100,7 @@ namespace ts { function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { const text = getTextOfPropertyName(node.name) as string; + const { weakSetName } = getPrivateIdentifierEnvironment(); let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; @@ -1118,10 +1123,9 @@ namespace ts { else if (isMethodDeclaration(node)) { info = { placement: PrivateIdentifierPlacement.InstanceMethod, - functionName: createHoistedVariableForPrivateName(text) + weakSetName, + functionName: createHoistedVariableForPrivateName(text), }; - - getPrivateIdentifierEnvironment().hasPrivateMethods = true; } else if (isAccessor(node)) { const previousInfo = findPreviousAccessorInfo(node); @@ -1132,6 +1136,7 @@ namespace ts { if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceSetterOnly) { info = { placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, + weakSetName, getterName, setterName: previousInfo.setterName }; @@ -1139,6 +1144,7 @@ namespace ts { else { info = { placement: PrivateIdentifierPlacement.InstanceGetterOnly, + weakSetName, getterName }; } @@ -1149,6 +1155,7 @@ namespace ts { if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceGetterOnly) { info = { placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, + weakSetName, setterName, getterName: previousInfo.getterName }; @@ -1156,12 +1163,11 @@ namespace ts { else { info = { placement: PrivateIdentifierPlacement.InstanceSetterOnly, + weakSetName, setterName }; } } - - getPrivateIdentifierEnvironment().hasPrivateMethods = true; } else { return; From 45c2a410e91df464a884de6f67fb4f54eb3d5a53 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Feb 2021 15:22:21 +0000 Subject: [PATCH 34/68] add a test for nested private methods Signed-off-by: Kubilay Kahveci --- .../privateNameNestedMethodAccess.errors.txt | 26 ++++++++ .../privateNameNestedMethodAccess.js | 66 +++++++++++++++++++ .../privateNameNestedMethodAccess.symbols | 44 +++++++++++++ .../privateNameNestedMethodAccess.types | 54 +++++++++++++++ .../privateNameNestedMethodAccess.ts | 19 ++++++ 5 files changed, 209 insertions(+) create mode 100644 tests/baselines/reference/privateNameNestedMethodAccess.errors.txt create mode 100644 tests/baselines/reference/privateNameNestedMethodAccess.js create mode 100644 tests/baselines/reference/privateNameNestedMethodAccess.symbols create mode 100644 tests/baselines/reference/privateNameNestedMethodAccess.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt b/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt new file mode 100644 index 0000000000000..c2b2400174046 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt @@ -0,0 +1,26 @@ +tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts(11,25): error TS18014: The property '#bar' cannot be accessed on type 'C' within this class because it is shadowed by another private identifier with the same spelling. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts (1 errors) ==== + const C = class { + #foo = 42; + #bar() { new C().#baz; } + get #baz() { return 42; } + + m() { + return class D { + #bar() {} + constructor() { + new C().#foo; + new C().#bar; // Error + ~~~~ +!!! error TS18014: The property '#bar' cannot be accessed on type 'C' within this class because it is shadowed by another private identifier with the same spelling. +!!! related TS18017 tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts:8:13: The shadowing declaration of '#bar' is defined here +!!! related TS18018 tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts:3:5: The declaration of '#bar' that you probably intended to use is defined here + new C().#baz; + new D().#bar; + } + } + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.js b/tests/baselines/reference/privateNameNestedMethodAccess.js new file mode 100644 index 0000000000000..1734e781b43b3 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedMethodAccess.js @@ -0,0 +1,66 @@ +//// [privateNameNestedMethodAccess.ts] +const C = class { + #foo = 42; + #bar() { new C().#baz; } + get #baz() { return 42; } + + m() { + return class D { + #bar() {} + constructor() { + new C().#foo; + new C().#bar; // Error + new C().#baz; + new D().#bar; + } + } + } +} + + +//// [privateNameNestedMethodAccess.js] +var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private accessor on non-instance"); + } + return fn.call(receiver); +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { + if (!privateMap.has(receiver)) { + throw new TypeError("attempted to get private field on non-instance"); + } + return privateMap.get(receiver); +}; +var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { + if (!instances.has(receiver)) { + throw new TypeError("attempted to get private method on non-instance"); + } + return fn; +}; +var _C_instances, _C_foo, _C_bar, _C_baz_get, _a; +const C = (_a = class { + constructor() { + _C_instances.add(this); + _C_foo.set(this, 42); + } + m() { + var _D_instances, _D_bar, _a; + return _a = class D { + constructor() { + _D_instances.add(this); + __classPrivateFieldGet(new C(), _C_foo); + __classPrivateMethodGet(new C(), _D_instances, _D_bar); // Error + __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); + __classPrivateMethodGet(new D(), _D_instances, _D_bar); + } + }, + _D_instances = new WeakSet(), + _D_bar = function _D_bar() { }, + _a; + } + }, + _C_foo = new WeakMap(), + _C_instances = new WeakSet(), + _C_bar = function _C_bar() { __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); }, + _C_baz_get = function _C_baz_get() { return 42; }, + _a); diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.symbols b/tests/baselines/reference/privateNameNestedMethodAccess.symbols new file mode 100644 index 0000000000000..3b14c08f746f6 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedMethodAccess.symbols @@ -0,0 +1,44 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts === +const C = class { +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) + + #foo = 42; +>#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 17)) + + #bar() { new C().#baz; } +>#bar : Symbol(C.#bar, Decl(privateNameNestedMethodAccess.ts, 1, 14)) +>new C().#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) + + get #baz() { return 42; } +>#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) + + m() { +>m : Symbol(C.m, Decl(privateNameNestedMethodAccess.ts, 3, 29)) + + return class D { +>D : Symbol(D, Decl(privateNameNestedMethodAccess.ts, 6, 14)) + + #bar() {} +>#bar : Symbol(D.#bar, Decl(privateNameNestedMethodAccess.ts, 6, 24)) + + constructor() { + new C().#foo; +>new C().#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 17)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) + + new C().#bar; // Error +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) + + new C().#baz; +>new C().#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) + + new D().#bar; +>new D().#bar : Symbol(D.#bar, Decl(privateNameNestedMethodAccess.ts, 6, 24)) +>D : Symbol(D, Decl(privateNameNestedMethodAccess.ts, 6, 14)) + } + } + } +} + diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.types b/tests/baselines/reference/privateNameNestedMethodAccess.types new file mode 100644 index 0000000000000..94df88de28516 --- /dev/null +++ b/tests/baselines/reference/privateNameNestedMethodAccess.types @@ -0,0 +1,54 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts === +const C = class { +>C : typeof C +>class { #foo = 42; #bar() { new C().#baz; } get #baz() { return 42; } m() { return class D { #bar() {} constructor() { new C().#foo; new C().#bar; // Error new C().#baz; new D().#bar; } } }} : typeof C + + #foo = 42; +>#foo : number +>42 : 42 + + #bar() { new C().#baz; } +>#bar : () => void +>new C().#baz : number +>new C() : C +>C : typeof C + + get #baz() { return 42; } +>#baz : number +>42 : 42 + + m() { +>m : () => typeof D + + return class D { +>class D { #bar() {} constructor() { new C().#foo; new C().#bar; // Error new C().#baz; new D().#bar; } } : typeof D +>D : typeof D + + #bar() {} +>#bar : () => void + + constructor() { + new C().#foo; +>new C().#foo : number +>new C() : C +>C : typeof C + + new C().#bar; // Error +>new C().#bar : any +>new C() : C +>C : typeof C + + new C().#baz; +>new C().#baz : number +>new C() : C +>C : typeof C + + new D().#bar; +>new D().#bar : () => void +>new D() : D +>D : typeof D + } + } + } +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts new file mode 100644 index 0000000000000..63d2a302615e7 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts @@ -0,0 +1,19 @@ +// @target: es2015 + +const C = class { + #foo = 42; + #bar() { new C().#baz; } + get #baz() { return 42; } + + m() { + return class D { + #bar() {} + constructor() { + new C().#foo; + new C().#bar; // Error + new C().#baz; + new D().#bar; + } + } + } +} From 356b91d21daffd66fc051ac75757c75ff831e758 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Feb 2021 18:29:48 +0000 Subject: [PATCH 35/68] add a test with any Signed-off-by: Kubilay Kahveci --- .../privateNameNestedMethodAccess.errors.txt | 13 +++- .../privateNameNestedMethodAccess.js | 63 ++++++++++--------- .../privateNameNestedMethodAccess.symbols | 30 ++++++--- .../privateNameNestedMethodAccess.types | 24 +++++-- .../privateNameNestedMethodAccess.ts | 8 ++- 5 files changed, 95 insertions(+), 43 deletions(-) diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt b/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt index c2b2400174046..93c48aea734e1 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt +++ b/tests/baselines/reference/privateNameNestedMethodAccess.errors.txt @@ -1,8 +1,9 @@ tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts(11,25): error TS18014: The property '#bar' cannot be accessed on type 'C' within this class because it is shadowed by another private identifier with the same spelling. +tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts(19,19): error TS2339: Property '#unknown' does not exist on type 'any'. -==== tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts (1 errors) ==== - const C = class { +==== tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts (2 errors) ==== + class C { #foo = 42; #bar() { new C().#baz; } get #baz() { return 42; } @@ -20,6 +21,14 @@ tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAcce new C().#baz; new D().#bar; } + + n(x: any) { + x.#foo; + x.#bar; + x.#unknown; // Error + ~~~~~~~~ +!!! error TS2339: Property '#unknown' does not exist on type 'any'. + } } } } diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.js b/tests/baselines/reference/privateNameNestedMethodAccess.js index 1734e781b43b3..a870c205da41f 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.js +++ b/tests/baselines/reference/privateNameNestedMethodAccess.js @@ -1,5 +1,5 @@ //// [privateNameNestedMethodAccess.ts] -const C = class { +class C { #foo = 42; #bar() { new C().#baz; } get #baz() { return 42; } @@ -13,6 +13,12 @@ const C = class { new C().#baz; new D().#bar; } + + n(x: any) { + x.#foo; + x.#bar; + x.#unknown; // Error + } } } } @@ -37,30 +43,31 @@ var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function } return fn; }; -var _C_instances, _C_foo, _C_bar, _C_baz_get, _a; -const C = (_a = class { - constructor() { - _C_instances.add(this); - _C_foo.set(this, 42); - } - m() { - var _D_instances, _D_bar, _a; - return _a = class D { - constructor() { - _D_instances.add(this); - __classPrivateFieldGet(new C(), _C_foo); - __classPrivateMethodGet(new C(), _D_instances, _D_bar); // Error - __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); - __classPrivateMethodGet(new D(), _D_instances, _D_bar); - } - }, - _D_instances = new WeakSet(), - _D_bar = function _D_bar() { }, - _a; - } - }, - _C_foo = new WeakMap(), - _C_instances = new WeakSet(), - _C_bar = function _C_bar() { __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); }, - _C_baz_get = function _C_baz_get() { return 42; }, - _a); +var _C_instances, _C_foo, _C_bar, _C_baz_get; +class C { + constructor() { + _C_instances.add(this); + _C_foo.set(this, 42); + } + m() { + var _D_instances, _D_bar, _a; + return _a = class D { + constructor() { + _D_instances.add(this); + __classPrivateFieldGet(new C(), _C_foo); + __classPrivateMethodGet(new C(), _D_instances, _D_bar); // Error + __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); + __classPrivateMethodGet(new D(), _D_instances, _D_bar); + } + n(x) { + __classPrivateFieldGet(x, _C_foo); + __classPrivateMethodGet(x, _D_instances, _D_bar); + x.; // Error + } + }, + _D_instances = new WeakSet(), + _D_bar = function _D_bar() { }, + _a; + } +} +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_bar = function _C_bar() { __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); }, _C_baz_get = function _C_baz_get() { return 42; }; diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.symbols b/tests/baselines/reference/privateNameNestedMethodAccess.symbols index 3b14c08f746f6..689923e5b9d98 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.symbols +++ b/tests/baselines/reference/privateNameNestedMethodAccess.symbols @@ -1,14 +1,14 @@ === tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts === -const C = class { ->C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) +class C { +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 0)) #foo = 42; ->#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 17)) +>#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 9)) #bar() { new C().#baz; } >#bar : Symbol(C.#bar, Decl(privateNameNestedMethodAccess.ts, 1, 14)) >new C().#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) ->C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 0)) get #baz() { return 42; } >#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) @@ -24,20 +24,34 @@ const C = class { constructor() { new C().#foo; ->new C().#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 17)) ->C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) +>new C().#foo : Symbol(C.#foo, Decl(privateNameNestedMethodAccess.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 0)) new C().#bar; // Error ->C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 0)) new C().#baz; >new C().#baz : Symbol(C.#baz, Decl(privateNameNestedMethodAccess.ts, 2, 28)) ->C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 5)) +>C : Symbol(C, Decl(privateNameNestedMethodAccess.ts, 0, 0)) new D().#bar; >new D().#bar : Symbol(D.#bar, Decl(privateNameNestedMethodAccess.ts, 6, 24)) >D : Symbol(D, Decl(privateNameNestedMethodAccess.ts, 6, 14)) } + + n(x: any) { +>n : Symbol(D.n, Decl(privateNameNestedMethodAccess.ts, 13, 13)) +>x : Symbol(x, Decl(privateNameNestedMethodAccess.ts, 15, 14)) + + x.#foo; +>x : Symbol(x, Decl(privateNameNestedMethodAccess.ts, 15, 14)) + + x.#bar; +>x : Symbol(x, Decl(privateNameNestedMethodAccess.ts, 15, 14)) + + x.#unknown; // Error +>x : Symbol(x, Decl(privateNameNestedMethodAccess.ts, 15, 14)) + } } } } diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.types b/tests/baselines/reference/privateNameNestedMethodAccess.types index 94df88de28516..1527391504f42 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.types +++ b/tests/baselines/reference/privateNameNestedMethodAccess.types @@ -1,7 +1,6 @@ === tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts === -const C = class { ->C : typeof C ->class { #foo = 42; #bar() { new C().#baz; } get #baz() { return 42; } m() { return class D { #bar() {} constructor() { new C().#foo; new C().#bar; // Error new C().#baz; new D().#bar; } } }} : typeof C +class C { +>C : C #foo = 42; >#foo : number @@ -21,7 +20,7 @@ const C = class { >m : () => typeof D return class D { ->class D { #bar() {} constructor() { new C().#foo; new C().#bar; // Error new C().#baz; new D().#bar; } } : typeof D +>class D { #bar() {} constructor() { new C().#foo; new C().#bar; // Error new C().#baz; new D().#bar; } n(x: any) { x.#foo; x.#bar; x.#unknown; // Error } } : typeof D >D : typeof D #bar() {} @@ -48,6 +47,23 @@ const C = class { >new D() : D >D : typeof D } + + n(x: any) { +>n : (x: any) => void +>x : any + + x.#foo; +>x.#foo : any +>x : any + + x.#bar; +>x.#bar : any +>x : any + + x.#unknown; // Error +>x.#unknown : any +>x : any + } } } } diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts index 63d2a302615e7..0c10fbce59d29 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameNestedMethodAccess.ts @@ -1,6 +1,6 @@ // @target: es2015 -const C = class { +class C { #foo = 42; #bar() { new C().#baz; } get #baz() { return 42; } @@ -14,6 +14,12 @@ const C = class { new C().#baz; new D().#bar; } + + n(x: any) { + x.#foo; + x.#bar; + x.#unknown; // Error + } } } } From 5ebb3d632704d244573181999873c0b17329e69d Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Tue, 16 Feb 2021 15:57:15 +0200 Subject: [PATCH 36/68] Added support for static private fields accessors and methods. --- src/compiler/checker.ts | 3 - src/compiler/factory/emitHelpers.ts | 137 +++++++++++++ src/compiler/transformers/classFields.ts | 194 +++++++++++++++++- .../privateNameES5Ban(target=es3).errors.txt | 24 +-- .../privateNameES5Ban(target=es3).js | 4 +- .../privateNameES5Ban(target=es5).errors.txt | 24 +-- .../privateNameES5Ban(target=es5).js | 4 +- .../privateNameFieldsESNext.errors.txt | 8 +- .../privateNamesAndStaticFields.errors.txt | 11 +- .../reference/privateNamesAndStaticFields.js | 29 +-- .../privateNamesAndStaticMethods.errors.txt | 54 ----- .../privateNamesConstructorChain-1.errors.txt | 5 +- .../privateNamesConstructorChain-1.js | 12 +- .../privateNamesConstructorChain-2.errors.txt | 5 +- .../privateNamesConstructorChain-2.js | 12 +- .../privateNamesInNestedClasses-2.errors.txt | 5 +- .../privateNamesInNestedClasses-2.js | 3 +- .../reference/privateNamesUnique-3.errors.txt | 8 +- .../reference/privateNamesUnique-3.js | 19 +- 19 files changed, 400 insertions(+), 161 deletions(-) delete mode 100644 tests/baselines/reference/privateNamesAndStaticMethods.errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 25fdbac8b3bda..703ae2b00fbc1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -39550,9 +39550,6 @@ namespace ts { else if (flags & ModifierFlags.Abstract) { return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "static", "abstract"); } - else if (isPrivateIdentifierClassElementDeclaration(node)) { - return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_a_private_identifier, "static"); - } flags |= ModifierFlags.Static; lastStatic = modifier; break; diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 8e629bb96e663..c816ade231528 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -39,6 +39,14 @@ namespace ts { createClassPrivateWriteonlyHelper(receiver: Expression): Expression; createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression; + // Class Static Private Helpers + createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier): Expression; + createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression): Expression; + createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression; + createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; + createClassStaticPrivateWriteonlyHelper(receiver: Expression): Expression; + createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression; + createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -82,6 +90,13 @@ namespace ts { createClassPrivateWriteonlyHelper, createClassPrivateAccessorGetHelper, createClassPrivateAccessorSetHelper, + createClassStaticPrivateFieldGetHelper, + createClassStaticPrivateFieldSetHelper, + createClassStaticPrivateMethodGetHelper, + createClassStaticPrivateReadonlyHelper, + createClassStaticPrivateWriteonlyHelper, + createClassStaticPrivateAccessorGetHelper, + createClassStaticPrivateAccessorSetHelper, }; /** @@ -412,6 +427,41 @@ namespace ts { context.requestEmitHelper(classPrivateAccessorSetHelper); return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, instances, fn, value]); } + // Class Private Static Helpers + function createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier) { + context.requestEmitHelper(classStaticPrivateFieldGetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldGet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField]); + } + + function createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression) { + context.requestEmitHelper(classStaticPrivateFieldSetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField, value]); + } + + function createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) { + context.requestEmitHelper(classStaticPrivateMethodGetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]); + } + + function createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression) { + context.requestEmitHelper(classStaticPrivateReadonlyHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); + } + + function createClassStaticPrivateWriteonlyHelper(receiver: Expression) { + context.requestEmitHelper(classStaticPrivateWriteonlyHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]); + } + + function createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) { + context.requestEmitHelper(classStaticPrivateAccessorGetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]); + } + + function createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression) { + context.requestEmitHelper(classStaticPrivateAccessorSetHelper); + return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn, value]); + } } /* @internal */ @@ -939,6 +989,93 @@ namespace ts { };` }; + export const classStaticPrivateFieldGetHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateFieldGet", + importName: "__classStaticPrivateFieldGet", + scoped: false, + text: ` + var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; + };` + }; + + export const classStaticPrivateFieldSetHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateFieldSet", + importName: "__classStaticPrivateFieldSet", + scoped: false, + text: ` + var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; + };` + }; + + export const classStaticPrivateMethodGetHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateMethodGet", + importName: "__classStaticPrivateMethodGet", + scoped: false, + text: ` + var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; + };` + }; + + export const classStaticPrivateReadonlyHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateReadonly", + importName: "__classStaticPrivateReadonly", + scoped: false, + text: ` + var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { + throw new TypeError("Private static element is not writable"); + };` + }; + + export const classStaticPrivateWriteonlyHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateWriteonly", + importName: "__classStaticPrivateWriteonly", + scoped: false, + text: ` + var __classStaticPrivateWriteonly = (this && this.__classStaticPrivateWriteonly) || function () { + throw new TypeError("Private static element is not readable"); + };` + }; + + export const classStaticPrivateAccessorGetHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateAccessorGet", + importName: "__classStaticPrivateAccessorGet", + scoped: false, + text: ` + var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn.call(receiver); + };` + }; + + export const classStaticPrivateAccessorSetHelper: UnscopedEmitHelper = { + name: "typescript:classStaticPrivateAccessorSet", + importName: "__classStaticPrivateAccessorSet", + scoped: false, + text: ` + var __classStaticPrivateAccessorSet = (this && this.__classStaticPrivateAccessorSet) || function (receiver, classConstructor, fn, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + fn.call(receiver, value); + return value; + };` + }; + let allUnscopedEmitHelpers: ReadonlyESMap | undefined; export function getAllUnscopedEmitHelpers() { diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index d9be7159454d7..137a8adbfc237 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -13,16 +13,47 @@ namespace ts { InstanceMethod, InstanceGetterOnly, InstanceSetterOnly, - InstanceGetterAndSetter + InstanceGetterAndSetter, + StaticField, + StaticMethod, + StaticGetterOnly, + StaticSetterOnly, + StaticGetterAndSetter, } type PrivateIdentifierInfo = + | PrivateIdentifierStaticField + | PrivateIdentifierStaticMethod + | PrivateIdentifierStaticGetterOnly + | PrivateIdentifierStaticSetterOnly + | PrivateIdentifierStaticGetterAndSetterOnly | PrivateIdentifierInstanceField | PrivateIdentifierInstanceMethod | PrivateIdentifierInstanceGetterOnly | PrivateIdentifierInstanceSetterOnly | PrivateIdentifierInstanceGetterAndSetter; + interface PrivateIdentifierStaticField { + placement: PrivateIdentifierPlacement.StaticField; + variableName: Identifier; + } + interface PrivateIdentifierStaticMethod { + placement: PrivateIdentifierPlacement.StaticMethod; + functionName: Identifier; + } + interface PrivateIdentifierStaticGetterOnly { + placement: PrivateIdentifierPlacement.StaticGetterOnly; + getterName: Identifier; + } + interface PrivateIdentifierStaticSetterOnly { + placement: PrivateIdentifierPlacement.StaticSetterOnly; + setterName: Identifier; + } + interface PrivateIdentifierStaticGetterAndSetterOnly { + placement: PrivateIdentifierPlacement.StaticGetterAndSetter; + getterName: Identifier; + setterName: Identifier; + } interface PrivateIdentifierInstanceField { placement: PrivateIdentifierPlacement.InstanceField; weakMapName: Identifier; @@ -58,6 +89,10 @@ namespace ts { * Used for prefixing generated variable names. */ className: string; + /** + * Used for brand ckeck on static members + */ + classConstructor: Identifier; /** * Used for brand check on private methods. */ @@ -251,7 +286,7 @@ namespace ts { factory.createAssignment( functionName, factory.createFunctionExpression( - transformedMethod.modifiers, + filter(transformedMethod.modifiers, m => !isStaticModifier(m)), transformedMethod.asteriskToken, functionName, transformedMethod.typeParameters, @@ -272,18 +307,22 @@ namespace ts { const info = accessPrivateIdentifier(node.name); Debug.assert(info, "Undeclared private name for property declaration."); - if (info.placement === PrivateIdentifierPlacement.InstanceMethod) { + if (info.placement === PrivateIdentifierPlacement.InstanceMethod || info.placement === PrivateIdentifierPlacement.StaticMethod) { return info.functionName; } if (isGetAccessor(node) && (info.placement === PrivateIdentifierPlacement.InstanceGetterOnly || - info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter)) { + info.placement === PrivateIdentifierPlacement.StaticGetterOnly || + info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter || + info.placement === PrivateIdentifierPlacement.StaticGetterAndSetter)) { return info.getterName; } if (isSetAccessor(node) && (info.placement === PrivateIdentifierPlacement.InstanceSetterOnly || - info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter)) { + info.placement === PrivateIdentifierPlacement.StaticSetterOnly || + info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter || + info.placement === PrivateIdentifierPlacement.StaticGetterAndSetter)) { return info.setterName; } } @@ -342,6 +381,29 @@ namespace ts { return context.getEmitHelperFactory().createClassPrivateWriteonlyHelper( receiver ); + case PrivateIdentifierPlacement.StaticField: + return context.getEmitHelperFactory().createClassStaticPrivateFieldGetHelper( + receiver, + getPrivateIdentifierEnvironment().classConstructor, + info.variableName + ); + case PrivateIdentifierPlacement.StaticMethod: + return context.getEmitHelperFactory().createClassStaticPrivateMethodGetHelper( + receiver, + getPrivateIdentifierEnvironment().classConstructor, + info.functionName + ); + case PrivateIdentifierPlacement.StaticGetterOnly: + case PrivateIdentifierPlacement.StaticGetterAndSetter: + return context.getEmitHelperFactory().createClassStaticPrivateAccessorGetHelper( + receiver, + getPrivateIdentifierEnvironment().classConstructor, + info.getterName + ); + case PrivateIdentifierPlacement.StaticSetterOnly: + return context.getEmitHelperFactory().createClassStaticPrivateWriteonlyHelper( + receiver + ); default: return Debug.fail("Unexpected private identifier placement"); } } @@ -557,6 +619,27 @@ namespace ts { info.setterName, right ); + case PrivateIdentifierPlacement.StaticField: + return context.getEmitHelperFactory().createClassStaticPrivateFieldSetHelper( + receiver, + getPrivateIdentifierEnvironment().classConstructor, + info.variableName, + right + ); + case PrivateIdentifierPlacement.StaticMethod: + case PrivateIdentifierPlacement.StaticGetterOnly: + return context.getEmitHelperFactory().createClassStaticPrivateReadonlyHelper( + receiver, + right + ); + case PrivateIdentifierPlacement.StaticSetterOnly: + case PrivateIdentifierPlacement.StaticGetterAndSetter: + return context.getEmitHelperFactory().createClassStaticPrivateAccessorSetHelper( + receiver, + getPrivateIdentifierEnvironment().classConstructor, + info.setterName, + right + ); default: return Debug.fail("Unexpected private identifier placement"); } } @@ -603,6 +686,7 @@ namespace ts { } function visitClassDeclaration(node: ClassDeclaration) { + getPrivateIdentifierEnvironment().classConstructor = factory.getInternalName(node) ; if (!forEach(node.members, doesClassElementNeedTransform)) { return visitEachChild(node, visitor, context); } @@ -636,6 +720,10 @@ namespace ts { if (some(staticProperties)) { addPropertyStatements(statements, staticProperties, factory.getInternalName(node)); } + const staticPrivateProperties = filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); + if(some(staticPrivateProperties)) { + addPropertyStatements(statements, staticPrivateProperties, factory.getInternalName(node)); + } return statements; } @@ -658,6 +746,13 @@ namespace ts { const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); + const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & NodeCheckFlags.ClassWithConstructorReference; + let temp: Identifier | undefined; + if (some(node.members, m => hasStaticModifier(m) && !!m.name && isPrivateIdentifier(m.name))) { + temp = factory.createTempVariable(hoistVariableDeclaration, !!isClassWithConstructorReference); + getPrivateIdentifierEnvironment().classConstructor = factory.cloneNode(temp); + } + const classExpression = factory.updateClassExpression( node, visitNodes(node.decorators, visitor, isDecorator), @@ -680,12 +775,14 @@ namespace ts { if (pendingStatements && some(staticProperties)) { addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); } + if(temp) { + return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]); + } return classExpression; } else { const expressions: Expression[] = []; - const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & NodeCheckFlags.ClassWithConstructorReference; - const temp = factory.createTempVariable(hoistVariableDeclaration, !!isClassWithConstructorReference); + temp = temp ?? factory.createTempVariable(hoistVariableDeclaration, !!isClassWithConstructorReference); if (isClassWithConstructorReference) { // record an alias as the class name is not in scope for statics. enableSubstitutionForClassAliases(); @@ -937,6 +1034,12 @@ namespace ts { privateIdentifierInfo.weakMapName ); } + case PrivateIdentifierPlacement.StaticField: { + return createPrivateStaticFieldInitializer( + privateIdentifierInfo.variableName, + visitNode(property.initializer, visitor, isExpression) + ); + } default: return undefined; } @@ -1086,6 +1189,7 @@ namespace ts { if (!currentPrivateIdentifierEnvironment) { currentPrivateIdentifierEnvironment = { className: "", + classConstructor: factory.createUniqueName("_class", GeneratedIdentifierFlags.Optimistic), weakSetName: factory.createUniqueName("_instances", GeneratedIdentifierFlags.Optimistic), identifiers: new Map() }; @@ -1104,7 +1208,62 @@ namespace ts { let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; - if (isPropertyDeclaration(node)) { + if(hasStaticModifier(node)) { + if (isPropertyDeclaration(node)) { + const variableName = createHoistedVariableForPrivateName(text); + info = { + placement: PrivateIdentifierPlacement.StaticField, + variableName + }; + } + else if(isMethodDeclaration(node)) { + const functionName = createHoistedVariableForPrivateName(text); + info = { + placement: PrivateIdentifierPlacement.StaticMethod, + functionName + }; + } + else if(isGetAccessorDeclaration(node)) { + const getterName = createHoistedVariableForPrivateName(text + "_get"); + const previousInfo = findPreviousStaticAccessorInfo(node); + if (previousInfo?.placement === PrivateIdentifierPlacement.StaticSetterOnly) { + info = { + ...previousInfo, + placement: PrivateIdentifierPlacement.StaticGetterAndSetter, + getterName, + setterName: previousInfo.setterName, + }; + } + else { + info = { + placement: PrivateIdentifierPlacement.StaticGetterOnly, + getterName, + }; + } + } + else if(isSetAccessorDeclaration(node)) { + const setterName = createHoistedVariableForPrivateName(text + "_set"); + const previousInfo = findPreviousStaticAccessorInfo(node); + if (previousInfo?.placement === PrivateIdentifierPlacement.StaticGetterOnly) { + info = { + ...previousInfo, + placement: PrivateIdentifierPlacement.StaticGetterAndSetter, + getterName: previousInfo.getterName, + setterName, + }; + } + else { + info = { + placement: PrivateIdentifierPlacement.StaticSetterOnly, + setterName, + }; + } + } + else { + return; + } + } + else if (isPropertyDeclaration(node)) { const weakMapName = createHoistedVariableForPrivateName(text); info = { placement: PrivateIdentifierPlacement.InstanceField, @@ -1187,6 +1346,16 @@ namespace ts { } } + function findPreviousStaticAccessorInfo( + node: PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration + ): PrivateIdentifierStaticGetterOnly | PrivateIdentifierStaticSetterOnly | undefined { + const info = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); + if (info?.placement === PrivateIdentifierPlacement.StaticGetterOnly || + info?.placement === PrivateIdentifierPlacement.StaticSetterOnly) { + return info; + } + } + function createHoistedVariableForClass(name: string): Identifier { const { className } = getPrivateIdentifierEnvironment(); const prefix = className ? `_${className}` : ""; @@ -1341,6 +1510,15 @@ namespace ts { } } + function createPrivateStaticFieldInitializer(variableName: Identifier, initializer: Expression | undefined) { + return factory.createAssignment( + variableName, + factory.createObjectLiteralExpression([ + factory.createPropertyAssignment("value", initializer || factory.createVoidZero()) + ]) + ); + } + function createPrivateInstanceFieldInitializer(receiver: LeftHandSideExpression, initializer: Expression | undefined, weakMapName: Identifier) { return factory.createCallExpression( factory.createPropertyAccessExpression(weakMapName, "set"), diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt b/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt index a5c48c8461826..7d7cc6e006dbe 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).errors.txt @@ -1,11 +1,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(3,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,12): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,12): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. ==== tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts (8 errors) ==== @@ -18,11 +18,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): ~~~~~~~ !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sField = "hello world"; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sMethod() {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. get #acc() { return ""; } ~~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. @@ -30,11 +30,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): ~~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. static get #sAcc() { return 0; } - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. static set #sAcc(x: number) {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index d32433a42867e..486e2d2d5455c 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -20,7 +20,7 @@ var A = /** @class */ (function () { _A_field.set(this, 123); } var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; - _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; - _A_sField.set(A, "hello world"); + _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; + _A_sField = { value: "hello world" }; return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt b/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt index 6261ff415a483..76ab55e14f711 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).errors.txt @@ -1,11 +1,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(3,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(4,5): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(5,12): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(6,12): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(7,9): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(8,9): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): error TS18019: 'static' modifier cannot be used with a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(9,16): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,16): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. ==== tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts (8 errors) ==== @@ -18,11 +18,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): ~~~~~~~ !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sField = "hello world"; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static #sMethod() {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. get #acc() { return ""; } ~~~~ !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. @@ -30,11 +30,11 @@ tests/cases/conformance/classes/members/privateNames/privateNameES5Ban.ts(10,5): ~~~~ !!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static get #sAcc() { return 0; } - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. static set #sAcc(x: number) {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. + ~~~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index d32433a42867e..486e2d2d5455c 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -20,7 +20,7 @@ var A = /** @class */ (function () { _A_field.set(this, 123); } var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; - _A_field = new WeakMap(), _A_sField = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; - _A_sField.set(A, "hello world"); + _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; + _A_sField = { value: "hello world" }; return A; }()); diff --git a/tests/baselines/reference/privateNameFieldsESNext.errors.txt b/tests/baselines/reference/privateNameFieldsESNext.errors.txt index 5416ecb75a470..28f283e66a817 100644 --- a/tests/baselines/reference/privateNameFieldsESNext.errors.txt +++ b/tests/baselines/reference/privateNameFieldsESNext.errors.txt @@ -1,9 +1,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts(8,9): error TS2322: Type 'string' is not assignable to type 'number'. -tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts(11,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts(12,5): error TS18019: 'static' modifier cannot be used with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts (3 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts (1 errors) ==== class C { a = 123; #a = 10; @@ -17,11 +15,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts( console.log(this.#b); } static #m = "test"; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. static #x; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. static test() { console.log(this.#m); console.log(this.#x = "test"); diff --git a/tests/baselines/reference/privateNamesAndStaticFields.errors.txt b/tests/baselines/reference/privateNamesAndStaticFields.errors.txt index 4ff9fb50d9295..5efd57230d022 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.errors.txt +++ b/tests/baselines/reference/privateNamesAndStaticFields.errors.txt @@ -1,18 +1,11 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts(2,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts(6,11): error TS18013: Property '#foo' is not accessible outside class 'B' because it has a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts(7,11): error TS2339: Property '#bar' does not exist on type 'typeof B'. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts(12,5): error TS18019: 'static' modifier cannot be used with a private identifier. -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts (5 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields.ts (2 errors) ==== class A { static #foo: number; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. static #bar: number; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. constructor () { A.#foo = 3; B.#foo; // Error @@ -26,8 +19,6 @@ tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticFields class B extends A { static #foo: string; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. constructor () { super(); B.#foo = "some string"; diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index b6adb45a818dd..6bebd095e4550 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -24,35 +24,36 @@ const willErrorSomeDay: typeof A = class {}; // OK for now //// [privateNamesAndStaticFields.js] "use strict"; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); } - privateMap.set(receiver, value); + propertyDescriptor.value = value; return value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); } - return privateMap.get(receiver); + return propertyDescriptor.value; }; var _A_foo, _A_bar, _B_foo; class A { constructor() { - __classPrivateFieldSet(A, _A_foo, 3); - __classPrivateFieldGet(B, _A_foo); // Error - __classPrivateFieldGet(B, _A_bar); // Error + __classStaticPrivateFieldSet(A, A, _A_foo, 3); + __classStaticPrivateFieldGet(B, A, _A_foo); // Error + __classStaticPrivateFieldGet(B, A, _A_bar); // Error } } -_A_foo = new WeakMap(), _A_bar = new WeakMap(); +_A_foo = { value: void 0 }; +_A_bar = { value: void 0 }; class B extends A { constructor() { super(); - __classPrivateFieldSet(B, _B_foo, "some string"); + __classStaticPrivateFieldSet(B, B, _B_foo, "some string"); } } -_B_foo = new WeakMap(); +_B_foo = { value: void 0 }; // We currently filter out static private identifier fields in `getUnmatchedProperties`. // We will need a more robust solution when we support static fields const willErrorSomeDay = class { diff --git a/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt b/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt deleted file mode 100644 index 2191f73a0d6be..0000000000000 --- a/tests/baselines/reference/privateNamesAndStaticMethods.errors.txt +++ /dev/null @@ -1,54 +0,0 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(2,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(4,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(7,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(8,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(11,5): error TS18019: 'static' modifier cannot be used with a private identifier. -tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts(24,5): error TS18019: 'static' modifier cannot be used with a private identifier. - - -==== tests/cases/conformance/classes/members/privateNames/privateNamesAndStaticMethods.ts (7 errors) ==== - class A { - static #foo(a: number) {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - static async #bar(a: number) {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - static async *#baz(a: number) { - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - return 3; - } - static #_quux: number; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - static get #quux (): number { - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - return this.#_quux; - } - static set #quux (val: number) { - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - this.#_quux = val; - } - constructor () { - A.#foo(30); - A.#bar(30); - A.#bar(30); - A.#quux = A.#quux + 1; - A.#quux++; - } - } - - class B extends A { - static #foo(a: string) {} - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. - constructor () { - super(); - B.#foo("str"); - } - } - \ No newline at end of file diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.errors.txt b/tests/baselines/reference/privateNamesConstructorChain-1.errors.txt index badf4f2966f9e..a8d081a35662c 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.errors.txt +++ b/tests/baselines/reference/privateNamesConstructorChain-1.errors.txt @@ -1,13 +1,10 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-1.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-1.ts(6,15): error TS2339: Property '#bar' does not exist on type 'typeof Child'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-1.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-1.ts (1 errors) ==== class Parent { #foo = 3; static #bar = 5; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. accessChildProps() { new Child().#foo; // OK (`#foo` was added when `Parent`'s constructor was called on `child`) Child.#bar; // Error: not found diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index a3676eb8e4c9c..dc6977aa3bbc7 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -21,6 +21,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { @@ -28,11 +34,11 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _Parent_bar); // Error: not found + __classStaticPrivateFieldGet(Child, Parent, _Parent_bar); // Error: not found } } -_Parent_foo = new WeakMap(), _Parent_bar = new WeakMap(); -_Parent_bar.set(Parent, 5); +_Parent_foo = new WeakMap(); +_Parent_bar = { value: 5 }; class Child extends Parent { constructor() { super(...arguments); diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.errors.txt b/tests/baselines/reference/privateNamesConstructorChain-2.errors.txt index b72ae5d84aea6..c9be71136b01c 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.errors.txt +++ b/tests/baselines/reference/privateNamesConstructorChain-2.errors.txt @@ -1,13 +1,10 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-2.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-2.ts(6,15): error TS2339: Property '#bar' does not exist on type 'typeof Child'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-2.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesConstructorChain-2.ts (1 errors) ==== class Parent { #foo = 3; static #bar = 5; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. accessChildProps() { new Child().#foo; // OK (`#foo` was added when `Parent`'s constructor was called on `child`) Child.#bar; // Error: not found diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index 7b4f40b8de8ef..d375038281c29 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -23,6 +23,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { @@ -30,11 +36,11 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _Parent_bar); // Error: not found + __classStaticPrivateFieldGet(Child, Parent, _Parent_bar); // Error: not found } } -_Parent_foo = new WeakMap(), _Parent_bar = new WeakMap(); -_Parent_bar.set(Parent, 5); +_Parent_foo = new WeakMap(); +_Parent_bar = { value: 5 }; class Child extends Parent { constructor() { super(...arguments); diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.errors.txt b/tests/baselines/reference/privateNamesInNestedClasses-2.errors.txt index 01c69f9b0f2ae..c9c8c78ce2c43 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.errors.txt +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.errors.txt @@ -1,12 +1,9 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesInNestedClasses-2.ts(2,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesInNestedClasses-2.ts(9,27): error TS18014: The property '#x' cannot be accessed on type 'typeof A' within this class because it is shadowed by another private identifier with the same spelling. -==== tests/cases/conformance/classes/members/privateNames/privateNamesInNestedClasses-2.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesInNestedClasses-2.ts (1 errors) ==== class A { static #x = 5; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. constructor () { class B { #x = 5; diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.js b/tests/baselines/reference/privateNamesInNestedClasses-2.js index a01a20f452981..26cace2ed9b70 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.js @@ -41,5 +41,4 @@ class A { _B_x = new WeakMap(); } } -_A_x = new WeakMap(); -_A_x.set(A, 5); +_A_x = { value: 5 }; diff --git a/tests/baselines/reference/privateNamesUnique-3.errors.txt b/tests/baselines/reference/privateNamesUnique-3.errors.txt index 51084f4d40561..03b52f61ce4f1 100644 --- a/tests/baselines/reference/privateNamesUnique-3.errors.txt +++ b/tests/baselines/reference/privateNamesUnique-3.errors.txt @@ -1,15 +1,11 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(3,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(3,12): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(9,5): error TS18019: 'static' modifier cannot be used with a private identifier. tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(11,11): error TS2339: Property '#foo' does not exist on type 'B'. -==== tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts (4 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts (2 errors) ==== class A { #foo = 1; static #foo = true; // error (duplicate) - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. ~~~~ !!! error TS2300: Duplicate identifier '#foo'. // because static and instance private names @@ -18,8 +14,6 @@ tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(11, } class B { static #foo = true; - ~~~~~~ -!!! error TS18019: 'static' modifier cannot be used with a private identifier. test(x: B) { x.#foo; // error (#foo is a static property on B, not an instance property) ~~~~ diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index 3368aff5ed039..a0d46b395cc08 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -15,27 +15,26 @@ class B { //// [privateNamesUnique-3.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); } - return privateMap.get(receiver); + return propertyDescriptor.value; }; var _A_foo, _A_foo_1, _B_foo; class A { constructor() { - _A_foo_1.set(this, 1); + _A_foo_1 = { value: 1 }; // because static and instance private names // share the same lexical scope // https://tc39.es/proposal-class-fields/#prod-ClassBody } } -_A_foo = new WeakMap(), _A_foo_1 = new WeakMap(); -_A_foo_1.set(A, true); // error (duplicate) +_A_foo = new WeakMap(); +_A_foo_1 = { value: true }; // error (duplicate) class B { test(x) { - __classPrivateFieldGet(x, _B_foo); // error (#foo is a static property on B, not an instance property) + __classStaticPrivateFieldGet(x, B, _B_foo); // error (#foo is a static property on B, not an instance property) } } -_B_foo = new WeakMap(); -_B_foo.set(B, true); +_B_foo = { value: true }; From 7006c091c63803aa3559d9e63a67ec9c6371a727 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Tue, 16 Feb 2021 16:58:56 +0200 Subject: [PATCH 37/68] Added error message for private identifiers used with static decorators. There is no spec to go with this behavior as of yet. --- src/compiler/checker.ts | 3 +++ src/compiler/diagnosticMessages.json | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 703ae2b00fbc1..908e0bbcd41f5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -35993,6 +35993,9 @@ namespace ts { } function checkClassDeclaration(node: ClassDeclaration) { + if (some(node.decorators) && some(node.members, p => hasStaticModifier(p) && isPrivateIdentifierClassElementDeclaration(p))) { + grammarErrorOnNode(node.decorators[0], Diagnostics.Class_decorators_can_t_be_used_with_static_private_identifier_Consider_removing_the_experimental_decorator); + } if (!node.name && !hasSyntacticModifier(node, ModifierFlags.Default)) { grammarErrorOnFirstToken(node, Diagnostics.A_class_declaration_without_the_default_modifier_must_have_a_name); } diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index fbb76afc581eb..07733831be915 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -6350,5 +6350,9 @@ "Invalid value for 'jsxFragmentFactory'. '{0}' is not a valid identifier or qualified-name.": { "category": "Error", "code": 18035 + }, + "Class decorators can't be used with static private identifier. Consider removing the experimental decorator.": { + "category": "Error", + "code": 18036 } } From b8766135e0f9f39603e064a02813732484bc7652 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 18 Feb 2021 15:36:24 +0200 Subject: [PATCH 38/68] Fixed emit static bug that used private names outside of classes for initialization in esnext. Fixed issue where nested privates produce incorrect brand check. --- src/compiler/transformers/classFields.ts | 74 +++++++++++++++++------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 137a8adbfc237..bb7c67585c568 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -36,23 +36,28 @@ namespace ts { interface PrivateIdentifierStaticField { placement: PrivateIdentifierPlacement.StaticField; variableName: Identifier; + classConstructor: Identifier; } interface PrivateIdentifierStaticMethod { placement: PrivateIdentifierPlacement.StaticMethod; functionName: Identifier; + classConstructor: Identifier; } interface PrivateIdentifierStaticGetterOnly { placement: PrivateIdentifierPlacement.StaticGetterOnly; getterName: Identifier; + classConstructor: Identifier; } interface PrivateIdentifierStaticSetterOnly { placement: PrivateIdentifierPlacement.StaticSetterOnly; setterName: Identifier; + classConstructor: Identifier; } interface PrivateIdentifierStaticGetterAndSetterOnly { placement: PrivateIdentifierPlacement.StaticGetterAndSetter; getterName: Identifier; setterName: Identifier; + classConstructor: Identifier; } interface PrivateIdentifierInstanceField { placement: PrivateIdentifierPlacement.InstanceField; @@ -331,6 +336,8 @@ namespace ts { Debug.assert(!some(node.decorators)); if (!shouldTransformPrivateElements && isPrivateIdentifier(node.name)) { // Initializer is elided as the field is initialized in transformConstructor. + // We include initalizers for static private fields as there is no simple way to do this emit, + // and nobody is relying on the old assignment semantics for private static fields. return factory.updatePropertyDeclaration( node, /*decorators*/ undefined, @@ -338,7 +345,7 @@ namespace ts { node.name, /*questionOrExclamationToken*/ undefined, /*type*/ undefined, - /*initializer*/ undefined + /*initializer*/ hasStaticModifier(node) ? node.initializer : undefined ); } // Create a temporary variable to store a computed property name (if necessary). @@ -384,20 +391,20 @@ namespace ts { case PrivateIdentifierPlacement.StaticField: return context.getEmitHelperFactory().createClassStaticPrivateFieldGetHelper( receiver, - getPrivateIdentifierEnvironment().classConstructor, + info.classConstructor, info.variableName ); case PrivateIdentifierPlacement.StaticMethod: return context.getEmitHelperFactory().createClassStaticPrivateMethodGetHelper( receiver, - getPrivateIdentifierEnvironment().classConstructor, + info.classConstructor, info.functionName ); case PrivateIdentifierPlacement.StaticGetterOnly: case PrivateIdentifierPlacement.StaticGetterAndSetter: return context.getEmitHelperFactory().createClassStaticPrivateAccessorGetHelper( receiver, - getPrivateIdentifierEnvironment().classConstructor, + info.classConstructor, info.getterName ); case PrivateIdentifierPlacement.StaticSetterOnly: @@ -622,7 +629,7 @@ namespace ts { case PrivateIdentifierPlacement.StaticField: return context.getEmitHelperFactory().createClassStaticPrivateFieldSetHelper( receiver, - getPrivateIdentifierEnvironment().classConstructor, + info.classConstructor, info.variableName, right ); @@ -636,7 +643,7 @@ namespace ts { case PrivateIdentifierPlacement.StaticGetterAndSetter: return context.getEmitHelperFactory().createClassStaticPrivateAccessorSetHelper( receiver, - getPrivateIdentifierEnvironment().classConstructor, + info.classConstructor, info.setterName, right ); @@ -716,14 +723,24 @@ namespace ts { // From ES6 specification: // HasLexicalDeclaration (N) : Determines if the argument identifier has a binding in this environment record that was created using // a lexical declaration such as a LexicalDeclaration or a ClassDeclaration. - const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + let staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + + if (languageVersion === ScriptTarget.ESNext) { + // We can't initialize static private properties after the class as the are not in the lexical scope + // so we rely on standard init even under useDefineForClassFields:false + staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); + } + else { + // We must initialize static private properties even if the don't have a value as we initialize them with a wrapper object which mist always exist. + const staticUninitializedPrivateProperties = filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); + if (some(staticUninitializedPrivateProperties)) { + addPropertyStatements(statements, staticUninitializedPrivateProperties, factory.getInternalName(node)); + } + } + if (some(staticProperties)) { addPropertyStatements(statements, staticProperties, factory.getInternalName(node)); } - const staticPrivateProperties = filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); - if(some(staticPrivateProperties)) { - addPropertyStatements(statements, staticPrivateProperties, factory.getInternalName(node)); - } return statements; } @@ -742,13 +759,20 @@ namespace ts { // these statements after the class expression variable statement. const isDecoratedClassDeclaration = isClassDeclaration(getOriginalNode(node)); - const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + let staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + if (!shouldTransformPrivateElements) { + // We can't initialize static private properties after the class as the are not in the lexical scope + // so we rely on standard init even under useDefineForClassFields:false + staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); + } + const staticUninitializedPrivateProperties = !shouldTransformPrivateElements ? []: + filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); const isClassWithConstructorReference = resolver.getNodeCheckFlags(node) & NodeCheckFlags.ClassWithConstructorReference; let temp: Identifier | undefined; - if (some(node.members, m => hasStaticModifier(m) && !!m.name && isPrivateIdentifier(m.name))) { + if (shouldTransformPrivateElements && some(node.members, m => hasStaticModifier(m) && !!m.name && isPrivateIdentifier(m.name))) { temp = factory.createTempVariable(hoistVariableDeclaration, !!isClassWithConstructorReference); getPrivateIdentifierEnvironment().classConstructor = factory.cloneNode(temp); } @@ -763,7 +787,7 @@ namespace ts { transformClassMembers(node, isDerivedClass) ); - if (some(staticProperties) || some(pendingExpressions)) { + if (some(staticUninitializedPrivateProperties) ||some(staticProperties) || some(pendingExpressions)) { if (isDecoratedClassDeclaration) { Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."); @@ -772,8 +796,13 @@ namespace ts { pendingStatements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))); } - if (pendingStatements && some(staticProperties)) { - addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); + if (pendingStatements ) { + if (some(staticProperties)) { + addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); + } + if (some(staticUninitializedPrivateProperties)) { + addPropertyStatements(pendingStatements, staticUninitializedPrivateProperties, factory.getInternalName(node)); + } } if(temp) { return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]); @@ -798,6 +827,7 @@ namespace ts { // Add any pending expressions leftover from elided or relocated computed property names addRange(expressions, map(pendingExpressions, startOnNewLine)); addRange(expressions, generateInitializedPropertyExpressions(staticProperties, temp)); + addRange(expressions, generateInitializedPropertyExpressions(staticUninitializedPrivateProperties, temp)); expressions.push(startOnNewLine(temp)); return factory.inlineExpressions(expressions); @@ -1207,20 +1237,22 @@ namespace ts { const { weakSetName } = getPrivateIdentifierEnvironment(); let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; - + const env = getPrivateIdentifierEnvironment(); if(hasStaticModifier(node)) { if (isPropertyDeclaration(node)) { const variableName = createHoistedVariableForPrivateName(text); info = { placement: PrivateIdentifierPlacement.StaticField, - variableName + variableName, + classConstructor: env.classConstructor }; } else if(isMethodDeclaration(node)) { const functionName = createHoistedVariableForPrivateName(text); info = { placement: PrivateIdentifierPlacement.StaticMethod, - functionName + functionName, + classConstructor: env.classConstructor }; } else if(isGetAccessorDeclaration(node)) { @@ -1238,6 +1270,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticGetterOnly, getterName, + classConstructor: env.classConstructor }; } } @@ -1256,6 +1289,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticSetterOnly, setterName, + classConstructor: env.classConstructor }; } } @@ -1332,7 +1366,7 @@ namespace ts { return; } - getPrivateIdentifierEnvironment().identifiers.set(node.name.escapedText, info); + env.identifiers.set(node.name.escapedText, info); getPendingExpressions().push(...assignmentExpressions); } From 31a8c00fe6e574dff301a9430299f02d5068202c Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 18 Feb 2021 15:39:09 +0200 Subject: [PATCH 39/68] Added tests for private static fields methods and accessors. --- .../privateNameAndObjectRestSpread.errors.txt | 18 +- .../privateNameAndObjectRestSpread.js | 19 +- .../privateNameAndObjectRestSpread.symbols | 33 ++- .../privateNameAndObjectRestSpread.types | 21 ++ .../reference/privateNameFieldsESNext.js | 3 +- .../privateNameStaticAccessors.errors.txt | 20 ++ .../reference/privateNameStaticAccessors.js | 44 ++++ .../privateNameStaticAccessors.symbols | 41 ++++ .../privateNameStaticAccessors.types | 49 ++++ ...rivateNameStaticAccessorsAccess.errors.txt | 39 ++++ .../privateNameStaticAccessorsAccess.js | 58 +++++ .../privateNameStaticAccessorsAccess.symbols | 60 +++++ .../privateNameStaticAccessorsAccess.types | 65 ++++++ ...rivateNameStaticAccessorsCallExpression.js | 52 +++++ ...eNameStaticAccessorsCallExpression.symbols | 65 ++++++ ...ateNameStaticAccessorsCallExpression.types | 93 ++++++++ ...eStaticAccessorssDerivedClasses.errors.txt | 21 ++ ...ivateNameStaticAccessorssDerivedClasses.js | 33 +++ ...NameStaticAccessorssDerivedClasses.symbols | 36 +++ ...teNameStaticAccessorssDerivedClasses.types | 41 ++++ ...aticAndStaticInitializer(target=es2015).js | 14 ++ ...ndStaticInitializer(target=es2015).symbols | 12 + ...cAndStaticInitializer(target=es2015).types | 14 ++ ...aticAndStaticInitializer(target=esnext).js | 13 ++ ...ndStaticInitializer(target=esnext).symbols | 12 + ...cAndStaticInitializer(target=esnext).types | 14 ++ .../privateNameStaticFieldAccess.errors.txt | 14 ++ .../reference/privateNameStaticFieldAccess.js | 25 +++ .../privateNameStaticFieldAccess.symbols | 23 ++ .../privateNameStaticFieldAccess.types | 27 +++ .../privateNameStaticFieldAssignment.js | 87 +++++++ .../privateNameStaticFieldAssignment.symbols | 146 ++++++++++++ .../privateNameStaticFieldAssignment.types | 212 ++++++++++++++++++ .../privateNameStaticFieldCallExpression.js | 52 +++++ ...ivateNameStaticFieldCallExpression.symbols | 68 ++++++ ...privateNameStaticFieldCallExpression.types | 100 +++++++++ .../privateNameStaticFieldClassExpression.js | 52 +++++ ...vateNameStaticFieldClassExpression.symbols | 61 +++++ ...rivateNameStaticFieldClassExpression.types | 73 ++++++ ...teNameStaticFieldDerivedClasses.errors.txt | 25 +++ .../privateNameStaticFieldDerivedClasses.js | 48 ++++ ...ivateNameStaticFieldDerivedClasses.symbols | 42 ++++ ...privateNameStaticFieldDerivedClasses.types | 48 ++++ ...FieldDestructuredBinding(target=es2015).js | 59 +++++ ...DestructuredBinding(target=es2015).symbols | 90 ++++++++ ...ldDestructuredBinding(target=es2015).types | 144 ++++++++++++ ...FieldDestructuredBinding(target=esnext).js | 50 +++++ ...DestructuredBinding(target=esnext).symbols | 90 ++++++++ ...ldDestructuredBinding(target=esnext).types | 144 ++++++++++++ ...meStaticFieldInitializer(target=es2015).js | 13 ++ ...ticFieldInitializer(target=es2015).symbols | 11 + ...taticFieldInitializer(target=es2015).types | 12 + ...meStaticFieldInitializer(target=esnext).js | 12 + ...ticFieldInitializer(target=esnext).symbols | 11 + ...taticFieldInitializer(target=esnext).types | 12 + .../privateNameStaticFieldInitializer.js | 13 ++ .../privateNameStaticFieldInitializer.symbols | 11 + .../privateNameStaticFieldInitializer.types | 12 + .../privateNameStaticFieldUnaryMutation.js | 76 +++++++ ...rivateNameStaticFieldUnaryMutation.symbols | 148 ++++++++++++ .../privateNameStaticFieldUnaryMutation.types | 199 ++++++++++++++++ .../privateNameStaticMethod.errors.txt | 22 ++ .../reference/privateNameStaticMethod.js | 34 +++ .../reference/privateNameStaticMethod.symbols | 26 +++ .../reference/privateNameStaticMethod.types | 32 +++ ...ivateNameStaticMethodAssignment.errors.txt | 30 +++ .../privateNameStaticMethodAssignment.js | 40 ++++ .../privateNameStaticMethodAssignment.symbols | 39 ++++ .../privateNameStaticMethodAssignment.types | 53 +++++ .../privateNameStaticMethodAsync.errors.txt | 21 ++ .../reference/privateNameStaticMethodAsync.js | 38 ++++ .../privateNameStaticMethodAsync.symbols | 50 +++++ .../privateNameStaticMethodAsync.types | 79 +++++++ .../privateNameStaticMethodCallExpression.js | 56 +++++ ...vateNameStaticMethodCallExpression.symbols | 89 ++++++++ ...rivateNameStaticMethodCallExpression.types | 131 +++++++++++ ...NameStaticMethodClassExpression.errors.txt | 21 ++ .../privateNameStaticMethodClassExpression.js | 39 ++++ ...ateNameStaticMethodClassExpression.symbols | 44 ++++ ...ivateNameStaticMethodClassExpression.types | 54 +++++ ...rivateNameStaticMethodInStaticFieldInit.js | 22 ++ ...eNameStaticMethodInStaticFieldInit.symbols | 21 ++ ...ateNameStaticMethodInStaticFieldInit.types | 24 ++ .../privateNameStaticsAndStaticMethods.js | 62 +++++ ...privateNameStaticsAndStaticMethods.symbols | 80 +++++++ .../privateNameStaticsAndStaticMethods.types | 95 ++++++++ .../members/privateNames/privateNameAndAny.ts | 6 +- .../privateNameAndObjectRestSpread.ts | 6 + .../privateNameStaticAccessors.ts | 16 ++ .../privateNameStaticAccessorsAccess.ts | 27 +++ ...rivateNameStaticAccessorsCallExpression.ts | 20 ++ ...ivateNameStaticAccessorssDerivedClasses.ts | 13 ++ .../privateNameStaticAndStaticInitializer.ts | 7 + .../privateNameStaticFieldAccess.ts | 9 + .../privateNameStaticFieldAssignment.ts | 36 +++ .../privateNameStaticFieldCallExpression.ts | 21 ++ .../privateNameStaticFieldClassExpression.ts | 23 ++ .../privateNameStaticFieldDerivedClasses.ts | 17 ++ ...ivateNameStaticFieldDestructuredBinding.ts | 25 +++ .../privateNameStaticFieldInitializer.ts | 6 + .../privateNameStaticFieldUnaryMutation.ts | 30 +++ .../privateNames/privateNameStaticMethod.ts | 14 ++ .../privateNameStaticMethodAssignment.ts | 13 ++ .../privateNameStaticMethodAsync.ts | 16 ++ .../privateNameStaticMethodCallExpression.ts | 25 +++ .../privateNameStaticMethodClassExpression.ts | 13 ++ ...rivateNameStaticMethodInStaticFieldInit.ts | 8 + .../privateNameStaticsAndStaticMethods.ts | 33 +++ 108 files changed, 4671 insertions(+), 15 deletions(-) create mode 100644 tests/baselines/reference/privateNameStaticAccessors.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticAccessors.js create mode 100644 tests/baselines/reference/privateNameStaticAccessors.symbols create mode 100644 tests/baselines/reference/privateNameStaticAccessors.types create mode 100644 tests/baselines/reference/privateNameStaticAccessorsAccess.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticAccessorsAccess.js create mode 100644 tests/baselines/reference/privateNameStaticAccessorsAccess.symbols create mode 100644 tests/baselines/reference/privateNameStaticAccessorsAccess.types create mode 100644 tests/baselines/reference/privateNameStaticAccessorsCallExpression.js create mode 100644 tests/baselines/reference/privateNameStaticAccessorsCallExpression.symbols create mode 100644 tests/baselines/reference/privateNameStaticAccessorsCallExpression.types create mode 100644 tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js create mode 100644 tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.symbols create mode 100644 tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.types create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).symbols create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).types create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).symbols create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).types create mode 100644 tests/baselines/reference/privateNameStaticFieldAccess.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticFieldAccess.js create mode 100644 tests/baselines/reference/privateNameStaticFieldAccess.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldAccess.types create mode 100644 tests/baselines/reference/privateNameStaticFieldAssignment.js create mode 100644 tests/baselines/reference/privateNameStaticFieldAssignment.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldAssignment.types create mode 100644 tests/baselines/reference/privateNameStaticFieldCallExpression.js create mode 100644 tests/baselines/reference/privateNameStaticFieldCallExpression.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldCallExpression.types create mode 100644 tests/baselines/reference/privateNameStaticFieldClassExpression.js create mode 100644 tests/baselines/reference/privateNameStaticFieldClassExpression.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldClassExpression.types create mode 100644 tests/baselines/reference/privateNameStaticFieldDerivedClasses.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticFieldDerivedClasses.js create mode 100644 tests/baselines/reference/privateNameStaticFieldDerivedClasses.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldDerivedClasses.types create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).types create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).types create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).types create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).types create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer.js create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer.types create mode 100644 tests/baselines/reference/privateNameStaticFieldUnaryMutation.js create mode 100644 tests/baselines/reference/privateNameStaticFieldUnaryMutation.symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldUnaryMutation.types create mode 100644 tests/baselines/reference/privateNameStaticMethod.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticMethod.js create mode 100644 tests/baselines/reference/privateNameStaticMethod.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethod.types create mode 100644 tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticMethodAssignment.js create mode 100644 tests/baselines/reference/privateNameStaticMethodAssignment.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethodAssignment.types create mode 100644 tests/baselines/reference/privateNameStaticMethodAsync.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticMethodAsync.js create mode 100644 tests/baselines/reference/privateNameStaticMethodAsync.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethodAsync.types create mode 100644 tests/baselines/reference/privateNameStaticMethodCallExpression.js create mode 100644 tests/baselines/reference/privateNameStaticMethodCallExpression.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethodCallExpression.types create mode 100644 tests/baselines/reference/privateNameStaticMethodClassExpression.errors.txt create mode 100644 tests/baselines/reference/privateNameStaticMethodClassExpression.js create mode 100644 tests/baselines/reference/privateNameStaticMethodClassExpression.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethodClassExpression.types create mode 100644 tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js create mode 100644 tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.symbols create mode 100644 tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.types create mode 100644 tests/baselines/reference/privateNameStaticsAndStaticMethods.js create mode 100644 tests/baselines/reference/privateNameStaticsAndStaticMethods.symbols create mode 100644 tests/baselines/reference/privateNameStaticsAndStaticMethods.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.errors.txt b/tests/baselines/reference/privateNameAndObjectRestSpread.errors.txt index e55f40f3ba4d6..e4f5e59b9e580 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.errors.txt +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.errors.txt @@ -1,10 +1,13 @@ -tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(6,13): error TS2339: Property '#prop' does not exist on type '{}'. -tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(8,14): error TS2339: Property '#prop' does not exist on type '{}'. +tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(7,13): error TS2339: Property '#prop' does not exist on type '{}'. +tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(9,14): error TS2339: Property '#prop' does not exist on type '{}'. +tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(12,17): error TS2339: Property '#propStatic' does not exist on type '{ prototype: C; }'. +tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts(14,15): error TS2339: Property '#propStatic' does not exist on type '{ prototype: C; }'. -==== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts (2 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts (4 errors) ==== class C { #prop = 1; + static #propStatic = 1; method(other: C) { const obj = { ...other }; @@ -15,5 +18,14 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpr rest.#prop; ~~~~~ !!! error TS2339: Property '#prop' does not exist on type '{}'. + + const statics = { ... C}; + statics.#propStatic + ~~~~~~~~~~~ +!!! error TS2339: Property '#propStatic' does not exist on type '{ prototype: C; }'. + const { ...sRest } = C; + sRest.#propStatic; + ~~~~~~~~~~~ +!!! error TS2339: Property '#propStatic' does not exist on type '{ prototype: C; }'. } } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index cc8c64619e1c5..44ca402544baa 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -1,12 +1,18 @@ //// [privateNameAndObjectRestSpread.ts] class C { #prop = 1; + static #propStatic = 1; method(other: C) { const obj = { ...other }; obj.#prop; const { ...rest } = other; rest.#prop; + + const statics = { ... C}; + statics.#propStatic + const { ...sRest } = C; + sRest.#propStatic; } } @@ -18,6 +24,12 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) @@ -29,7 +41,7 @@ var __rest = (this && this.__rest) || function (s, e) { } return t; }; -var _C_prop; +var _C_prop, _C_propStatic; class C { constructor() { _C_prop.set(this, 1); @@ -39,6 +51,11 @@ class C { __classPrivateFieldGet(obj, _C_prop); const rest = __rest(other, []); __classPrivateFieldGet(rest, _C_prop); + const statics = Object.assign({}, C); + __classStaticPrivateFieldGet(statics, C, _C_propStatic); + const sRest = __rest(C, []); + __classStaticPrivateFieldGet(sRest, C, _C_propStatic); } } _C_prop = new WeakMap(); +_C_propStatic = { value: 1 }; diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.symbols b/tests/baselines/reference/privateNameAndObjectRestSpread.symbols index b9b3ef5eed438..8d930393ee143 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.symbols +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.symbols @@ -5,23 +5,40 @@ class C { #prop = 1; >#prop : Symbol(C.#prop, Decl(privateNameAndObjectRestSpread.ts, 0, 9)) + static #propStatic = 1; +>#propStatic : Symbol(C.#propStatic, Decl(privateNameAndObjectRestSpread.ts, 1, 14)) + method(other: C) { ->method : Symbol(C.method, Decl(privateNameAndObjectRestSpread.ts, 1, 14)) ->other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11)) +>method : Symbol(C.method, Decl(privateNameAndObjectRestSpread.ts, 2, 27)) +>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 4, 11)) >C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0)) const obj = { ...other }; ->obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13)) ->other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11)) +>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 5, 13)) +>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 4, 11)) obj.#prop; ->obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 4, 13)) +>obj : Symbol(obj, Decl(privateNameAndObjectRestSpread.ts, 5, 13)) const { ...rest } = other; ->rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15)) ->other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 3, 11)) +>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 7, 15)) +>other : Symbol(other, Decl(privateNameAndObjectRestSpread.ts, 4, 11)) rest.#prop; ->rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 6, 15)) +>rest : Symbol(rest, Decl(privateNameAndObjectRestSpread.ts, 7, 15)) + + const statics = { ... C}; +>statics : Symbol(statics, Decl(privateNameAndObjectRestSpread.ts, 10, 13)) +>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0)) + + statics.#propStatic +>statics : Symbol(statics, Decl(privateNameAndObjectRestSpread.ts, 10, 13)) + + const { ...sRest } = C; +>sRest : Symbol(sRest, Decl(privateNameAndObjectRestSpread.ts, 12, 15)) +>C : Symbol(C, Decl(privateNameAndObjectRestSpread.ts, 0, 0)) + + sRest.#propStatic; +>sRest : Symbol(sRest, Decl(privateNameAndObjectRestSpread.ts, 12, 15)) } } diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.types b/tests/baselines/reference/privateNameAndObjectRestSpread.types index 0bab5992fa62c..96af44dbf5917 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.types +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.types @@ -4,6 +4,10 @@ class C { #prop = 1; >#prop : number +>1 : 1 + + static #propStatic = 1; +>#propStatic : number >1 : 1 method(other: C) { @@ -26,5 +30,22 @@ class C { rest.#prop; >rest.#prop : any >rest : {} + + const statics = { ... C}; +>statics : { prototype: C; } +>{ ... C} : { prototype: C; } +>C : typeof C + + statics.#propStatic +>statics.#propStatic : any +>statics : { prototype: C; } + + const { ...sRest } = C; +>sRest : { prototype: C; } +>C : typeof C + + sRest.#propStatic; +>sRest.#propStatic : any +>sRest : { prototype: C; } } } diff --git a/tests/baselines/reference/privateNameFieldsESNext.js b/tests/baselines/reference/privateNameFieldsESNext.js index acc37caa3cc8f..99abdeb482a20 100644 --- a/tests/baselines/reference/privateNameFieldsESNext.js +++ b/tests/baselines/reference/privateNameFieldsESNext.js @@ -35,7 +35,7 @@ class C { this.#a = "hello"; console.log(this.#b); } - static #m; + static #m = "test"; static #x; static test() { console.log(this.#m); @@ -43,4 +43,3 @@ class C { } #something; } -C.#m = "test"; diff --git a/tests/baselines/reference/privateNameStaticAccessors.errors.txt b/tests/baselines/reference/privateNameStaticAccessors.errors.txt new file mode 100644 index 0000000000000..ad5c9cea1faba --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessors.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts(9,12): error TS2540: Cannot assign to '#roProp' because it is a read-only property. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts (1 errors) ==== + class A1 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + static get #roProp() { return ""; } + + constructor(name: string) { + A1.#prop = ""; + A1.#roProp = ""; // Error + ~~~~~~~ +!!! error TS2540: Cannot assign to '#roProp' because it is a read-only property. + console.log(A1.#prop); + console.log(A1.#roProp); + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticAccessors.js b/tests/baselines/reference/privateNameStaticAccessors.js new file mode 100644 index 0000000000000..417e8ed72f2a3 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessors.js @@ -0,0 +1,44 @@ +//// [privateNameStaticAccessors.ts] +class A1 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + static get #roProp() { return ""; } + + constructor(name: string) { + A1.#prop = ""; + A1.#roProp = ""; // Error + console.log(A1.#prop); + console.log(A1.#roProp); + } +} + + +//// [privateNameStaticAccessors.js] +"use strict"; +var __classStaticPrivateAccessorSet = (this && this.__classStaticPrivateAccessorSet) || function (receiver, classConstructor, fn, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + fn.call(receiver, value); + return value; +}; +var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { + throw new TypeError("Private static element is not writable"); +}; +var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn.call(receiver); +}; +var _A1_prop_get, _A1_prop_set, _A1_roProp_get; +class A1 { + constructor(name) { + __classStaticPrivateAccessorSet(A1, A1, _A1_prop_set, ""); + __classStaticPrivateReadonly(A1, ""); // Error + console.log(__classStaticPrivateAccessorGet(A1, A1, _A1_prop_get)); + console.log(__classStaticPrivateAccessorGet(A1, A1, _A1_roProp_get)); + } +} +_A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; diff --git a/tests/baselines/reference/privateNameStaticAccessors.symbols b/tests/baselines/reference/privateNameStaticAccessors.symbols new file mode 100644 index 0000000000000..d43d930992ec8 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessors.symbols @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts === +class A1 { +>A1 : Symbol(A1, Decl(privateNameStaticAccessors.ts, 0, 0)) + + static get #prop() { return ""; } +>#prop : Symbol(A1.#prop, Decl(privateNameStaticAccessors.ts, 0, 10), Decl(privateNameStaticAccessors.ts, 1, 37)) + + static set #prop(param: string) { } +>#prop : Symbol(A1.#prop, Decl(privateNameStaticAccessors.ts, 0, 10), Decl(privateNameStaticAccessors.ts, 1, 37)) +>param : Symbol(param, Decl(privateNameStaticAccessors.ts, 2, 21)) + + static get #roProp() { return ""; } +>#roProp : Symbol(A1.#roProp, Decl(privateNameStaticAccessors.ts, 2, 39)) + + constructor(name: string) { +>name : Symbol(name, Decl(privateNameStaticAccessors.ts, 6, 16)) + + A1.#prop = ""; +>A1.#prop : Symbol(A1.#prop, Decl(privateNameStaticAccessors.ts, 0, 10), Decl(privateNameStaticAccessors.ts, 1, 37)) +>A1 : Symbol(A1, Decl(privateNameStaticAccessors.ts, 0, 0)) + + A1.#roProp = ""; // Error +>A1.#roProp : Symbol(A1.#roProp, Decl(privateNameStaticAccessors.ts, 2, 39)) +>A1 : Symbol(A1, Decl(privateNameStaticAccessors.ts, 0, 0)) + + console.log(A1.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>A1.#prop : Symbol(A1.#prop, Decl(privateNameStaticAccessors.ts, 0, 10), Decl(privateNameStaticAccessors.ts, 1, 37)) +>A1 : Symbol(A1, Decl(privateNameStaticAccessors.ts, 0, 0)) + + console.log(A1.#roProp); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>A1.#roProp : Symbol(A1.#roProp, Decl(privateNameStaticAccessors.ts, 2, 39)) +>A1 : Symbol(A1, Decl(privateNameStaticAccessors.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticAccessors.types b/tests/baselines/reference/privateNameStaticAccessors.types new file mode 100644 index 0000000000000..7a903c854282b --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessors.types @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts === +class A1 { +>A1 : A1 + + static get #prop() { return ""; } +>#prop : string +>"" : "" + + static set #prop(param: string) { } +>#prop : string +>param : string + + static get #roProp() { return ""; } +>#roProp : string +>"" : "" + + constructor(name: string) { +>name : string + + A1.#prop = ""; +>A1.#prop = "" : "" +>A1.#prop : string +>A1 : typeof A1 +>"" : "" + + A1.#roProp = ""; // Error +>A1.#roProp = "" : "" +>A1.#roProp : any +>A1 : typeof A1 +>"" : "" + + console.log(A1.#prop); +>console.log(A1.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>A1.#prop : string +>A1 : typeof A1 + + console.log(A1.#roProp); +>console.log(A1.#roProp) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>A1.#roProp : string +>A1 : typeof A1 + } +} + diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.errors.txt b/tests/baselines/reference/privateNameStaticAccessorsAccess.errors.txt new file mode 100644 index 0000000000000..a41043d318791 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.errors.txt @@ -0,0 +1,39 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts(16,4): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts(19,8): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts(24,12): error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts (3 errors) ==== + export {} + class A2 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + constructor() { + console.log(A2.#prop); + let a: typeof A2 = A2; + a.#prop; + function foo (){ + a.#prop; + } + } + } + + A2.#prop; // Error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + + function foo (){ + A2.#prop; // Error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + } + + class B2 { + m() { + A2.#prop; + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'A2' because it has a private identifier. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.js b/tests/baselines/reference/privateNameStaticAccessorsAccess.js new file mode 100644 index 0000000000000..d17b31c467e6c --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.js @@ -0,0 +1,58 @@ +//// [privateNameStaticAccessorsAccess.ts] +export {} +class A2 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + constructor() { + console.log(A2.#prop); + let a: typeof A2 = A2; + a.#prop; + function foo (){ + a.#prop; + } + } +} + +A2.#prop; // Error + +function foo (){ + A2.#prop; // Error +} + +class B2 { + m() { + A2.#prop; + } +} + + +//// [privateNameStaticAccessorsAccess.js] +var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn.call(receiver); +}; +var _A2_prop_get, _A2_prop_set; +class A2 { + constructor() { + console.log(__classStaticPrivateAccessorGet(A2, A2, _A2_prop_get)); + let a = A2; + __classStaticPrivateAccessorGet(a, A2, _A2_prop_get); + function foo() { + __classStaticPrivateAccessorGet(a, A2, _A2_prop_get); + } + } +} +_A2_prop_get = function _A2_prop_get() { return ""; }, _A2_prop_set = function _A2_prop_set(param) { }; +A2.; // Error +function foo() { + A2.; // Error +} +class B2 { + m() { + A2.; + } +} +export {}; diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.symbols b/tests/baselines/reference/privateNameStaticAccessorsAccess.symbols new file mode 100644 index 0000000000000..140f6e23aa10b --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.symbols @@ -0,0 +1,60 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts === +export {} +class A2 { +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) + + static get #prop() { return ""; } +>#prop : Symbol(A2.#prop, Decl(privateNameStaticAccessorsAccess.ts, 1, 10), Decl(privateNameStaticAccessorsAccess.ts, 2, 37)) + + static set #prop(param: string) { } +>#prop : Symbol(A2.#prop, Decl(privateNameStaticAccessorsAccess.ts, 1, 10), Decl(privateNameStaticAccessorsAccess.ts, 2, 37)) +>param : Symbol(param, Decl(privateNameStaticAccessorsAccess.ts, 3, 21)) + + constructor() { + console.log(A2.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>A2.#prop : Symbol(A2.#prop, Decl(privateNameStaticAccessorsAccess.ts, 1, 10), Decl(privateNameStaticAccessorsAccess.ts, 2, 37)) +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) + + let a: typeof A2 = A2; +>a : Symbol(a, Decl(privateNameStaticAccessorsAccess.ts, 7, 11)) +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) + + a.#prop; +>a.#prop : Symbol(A2.#prop, Decl(privateNameStaticAccessorsAccess.ts, 1, 10), Decl(privateNameStaticAccessorsAccess.ts, 2, 37)) +>a : Symbol(a, Decl(privateNameStaticAccessorsAccess.ts, 7, 11)) + + function foo (){ +>foo : Symbol(foo, Decl(privateNameStaticAccessorsAccess.ts, 8, 16)) + + a.#prop; +>a.#prop : Symbol(A2.#prop, Decl(privateNameStaticAccessorsAccess.ts, 1, 10), Decl(privateNameStaticAccessorsAccess.ts, 2, 37)) +>a : Symbol(a, Decl(privateNameStaticAccessorsAccess.ts, 7, 11)) + } + } +} + +A2.#prop; // Error +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) + +function foo (){ +>foo : Symbol(foo, Decl(privateNameStaticAccessorsAccess.ts, 15, 9)) + + A2.#prop; // Error +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) +} + +class B2 { +>B2 : Symbol(B2, Decl(privateNameStaticAccessorsAccess.ts, 19, 1)) + + m() { +>m : Symbol(B2.m, Decl(privateNameStaticAccessorsAccess.ts, 21, 10)) + + A2.#prop; +>A2 : Symbol(A2, Decl(privateNameStaticAccessorsAccess.ts, 0, 9)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.types b/tests/baselines/reference/privateNameStaticAccessorsAccess.types new file mode 100644 index 0000000000000..71171d25f34c3 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.types @@ -0,0 +1,65 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts === +export {} +class A2 { +>A2 : A2 + + static get #prop() { return ""; } +>#prop : string +>"" : "" + + static set #prop(param: string) { } +>#prop : string +>param : string + + constructor() { + console.log(A2.#prop); +>console.log(A2.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>A2.#prop : string +>A2 : typeof A2 + + let a: typeof A2 = A2; +>a : typeof A2 +>A2 : typeof A2 +>A2 : typeof A2 + + a.#prop; +>a.#prop : string +>a : typeof A2 + + function foo (){ +>foo : () => void + + a.#prop; +>a.#prop : string +>a : typeof A2 + } + } +} + +A2.#prop; // Error +>A2.#prop : any +>A2 : typeof A2 + +function foo (){ +>foo : () => void + + A2.#prop; // Error +>A2.#prop : any +>A2 : typeof A2 +} + +class B2 { +>B2 : B2 + + m() { +>m : () => void + + A2.#prop; +>A2.#prop : any +>A2 : typeof A2 + } +} + diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js new file mode 100644 index 0000000000000..3636bda179073 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js @@ -0,0 +1,52 @@ +//// [privateNameStaticAccessorsCallExpression.ts] +class A { + static get #fieldFunc() { return function() { A.#x = 10; } } + static get #fieldFunc2() { return function(a, ...b) {}; } + static #x = 1; + static test() { + this.#fieldFunc(); + const func = this.#fieldFunc; + func(); + new this.#fieldFunc(); + + const arr = [ 1, 2 ]; + this.#fieldFunc2(0, ...arr, 3); + const b = new this.#fieldFunc2(0, ...arr, 3); + const str = this.#fieldFunc2`head${1}middle${2}tail`; + this.getClass().#fieldFunc2`test${1}and${2}`; + } + static getClass() { return A; } +} + +//// [privateNameStaticAccessorsCallExpression.js] +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; +}; +var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn.call(receiver); +}; +var _A_fieldFunc_get, _A_fieldFunc2_get, _A_x; +class A { + static test() { + var _a; + __classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get).call(this); + const func = __classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get); + func(); + new (__classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get))(); + const arr = [1, 2]; + __classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get).call(this, 0, ...arr, 3); + const b = new (__classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get))(0, ...arr, 3); + const str = __classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; + __classStaticPrivateAccessorGet((_a = this.getClass()), A, _A_fieldFunc2_get).bind(_a) `test${1}and${2}`; + } + static getClass() { return A; } +} +_A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classStaticPrivateFieldSet(A, A, _A_x, 10); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; +_A_x = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.symbols b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.symbols new file mode 100644 index 0000000000000..c11fd82677997 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.symbols @@ -0,0 +1,65 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + static get #fieldFunc() { return function() { A.#x = 10; } } +>#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 9)) +>A.#x : Symbol(A.#x, Decl(privateNameStaticAccessorsCallExpression.ts, 2, 62)) +>A : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + static get #fieldFunc2() { return function(a, ...b) {}; } +>#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticAccessorsCallExpression.ts, 1, 65)) +>a : Symbol(a, Decl(privateNameStaticAccessorsCallExpression.ts, 2, 48)) +>b : Symbol(b, Decl(privateNameStaticAccessorsCallExpression.ts, 2, 50)) + + static #x = 1; +>#x : Symbol(A.#x, Decl(privateNameStaticAccessorsCallExpression.ts, 2, 62)) + + static test() { +>test : Symbol(A.test, Decl(privateNameStaticAccessorsCallExpression.ts, 3, 18)) + + this.#fieldFunc(); +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + const func = this.#fieldFunc; +>func : Symbol(func, Decl(privateNameStaticAccessorsCallExpression.ts, 6, 13)) +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + func(); +>func : Symbol(func, Decl(privateNameStaticAccessorsCallExpression.ts, 6, 13)) + + new this.#fieldFunc(); +>this.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 9)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + const arr = [ 1, 2 ]; +>arr : Symbol(arr, Decl(privateNameStaticAccessorsCallExpression.ts, 10, 13)) + + this.#fieldFunc2(0, ...arr, 3); +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticAccessorsCallExpression.ts, 1, 65)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticAccessorsCallExpression.ts, 10, 13)) + + const b = new this.#fieldFunc2(0, ...arr, 3); +>b : Symbol(b, Decl(privateNameStaticAccessorsCallExpression.ts, 12, 13)) +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticAccessorsCallExpression.ts, 1, 65)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticAccessorsCallExpression.ts, 10, 13)) + + const str = this.#fieldFunc2`head${1}middle${2}tail`; +>str : Symbol(str, Decl(privateNameStaticAccessorsCallExpression.ts, 13, 13)) +>this.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticAccessorsCallExpression.ts, 1, 65)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) + + this.getClass().#fieldFunc2`test${1}and${2}`; +>this.getClass().#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticAccessorsCallExpression.ts, 1, 65)) +>this.getClass : Symbol(A.getClass, Decl(privateNameStaticAccessorsCallExpression.ts, 15, 5)) +>this : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticAccessorsCallExpression.ts, 15, 5)) + } + static getClass() { return A; } +>getClass : Symbol(A.getClass, Decl(privateNameStaticAccessorsCallExpression.ts, 15, 5)) +>A : Symbol(A, Decl(privateNameStaticAccessorsCallExpression.ts, 0, 0)) +} diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types new file mode 100644 index 0000000000000..d7b95a9ec70a6 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types @@ -0,0 +1,93 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts === +class A { +>A : A + + static get #fieldFunc() { return function() { A.#x = 10; } } +>#fieldFunc : () => void +>function() { A.#x = 10; } : () => void +>A.#x = 10 : 10 +>A.#x : number +>A : typeof A +>10 : 10 + + static get #fieldFunc2() { return function(a, ...b) {}; } +>#fieldFunc2 : (a: any, ...b: any[]) => void +>function(a, ...b) {} : (a: any, ...b: any[]) => void +>a : any +>b : any[] + + static #x = 1; +>#x : number +>1 : 1 + + static test() { +>test : () => void + + this.#fieldFunc(); +>this.#fieldFunc() : void +>this.#fieldFunc : () => void +>this : typeof A + + const func = this.#fieldFunc; +>func : () => void +>this.#fieldFunc : () => void +>this : typeof A + + func(); +>func() : void +>func : () => void + + new this.#fieldFunc(); +>new this.#fieldFunc() : any +>this.#fieldFunc : () => void +>this : typeof A + + const arr = [ 1, 2 ]; +>arr : number[] +>[ 1, 2 ] : number[] +>1 : 1 +>2 : 2 + + this.#fieldFunc2(0, ...arr, 3); +>this.#fieldFunc2(0, ...arr, 3) : void +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : typeof A +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b = new this.#fieldFunc2(0, ...arr, 3); +>b : any +>new this.#fieldFunc2(0, ...arr, 3) : any +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : typeof A +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str = this.#fieldFunc2`head${1}middle${2}tail`; +>str : void +>this.#fieldFunc2`head${1}middle${2}tail` : void +>this.#fieldFunc2 : (a: any, ...b: any[]) => void +>this : typeof A +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + + this.getClass().#fieldFunc2`test${1}and${2}`; +>this.getClass().#fieldFunc2`test${1}and${2}` : void +>this.getClass().#fieldFunc2 : (a: any, ...b: any[]) => void +>this.getClass() : typeof A +>this.getClass : () => typeof A +>this : typeof A +>getClass : () => typeof A +>`test${1}and${2}` : "test1and2" +>1 : 1 +>2 : 2 + } + static getClass() { return A; } +>getClass : () => typeof A +>A : typeof A +} diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.errors.txt b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.errors.txt new file mode 100644 index 0000000000000..0cbbfd03d4420 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts(4,23): error TS2339: Property '#prop' does not exist on type 'typeof Derived'. +tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts(9,23): error TS2339: Property '#prop' does not exist on type 'typeof Derived'. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts (2 errors) ==== + class Base { + static get #prop(): number { return 123; } + static method(x: typeof Derived) { + console.log(x.#prop); + ~~~~~ +!!! error TS2339: Property '#prop' does not exist on type 'typeof Derived'. + } + } + class Derived extends Base { + static method(x: typeof Derived) { + console.log(x.#prop); + ~~~~~ +!!! error TS2339: Property '#prop' does not exist on type 'typeof Derived'. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js new file mode 100644 index 0000000000000..16bf81a00cadb --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js @@ -0,0 +1,33 @@ +//// [privateNameStaticAccessorssDerivedClasses.ts] +class Base { + static get #prop(): number { return 123; } + static method(x: typeof Derived) { + console.log(x.#prop); + } +} +class Derived extends Base { + static method(x: typeof Derived) { + console.log(x.#prop); + } +} + + +//// [privateNameStaticAccessorssDerivedClasses.js] +var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn.call(receiver); +}; +var _Base_prop_get; +class Base { + static method(x) { + console.log(__classStaticPrivateAccessorGet(x, Base, _Base_prop_get)); + } +} +_Base_prop_get = function _Base_prop_get() { return 123; }; +class Derived extends Base { + static method(x) { + console.log(x.); + } +} diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.symbols b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.symbols new file mode 100644 index 0000000000000..c5f03fb577ae4 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.symbols @@ -0,0 +1,36 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameStaticAccessorssDerivedClasses.ts, 0, 0)) + + static get #prop(): number { return 123; } +>#prop : Symbol(Base.#prop, Decl(privateNameStaticAccessorssDerivedClasses.ts, 0, 12)) + + static method(x: typeof Derived) { +>method : Symbol(Base.method, Decl(privateNameStaticAccessorssDerivedClasses.ts, 1, 47)) +>x : Symbol(x, Decl(privateNameStaticAccessorssDerivedClasses.ts, 2, 18)) +>Derived : Symbol(Derived, Decl(privateNameStaticAccessorssDerivedClasses.ts, 5, 1)) + + console.log(x.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameStaticAccessorssDerivedClasses.ts, 2, 18)) + } +} +class Derived extends Base { +>Derived : Symbol(Derived, Decl(privateNameStaticAccessorssDerivedClasses.ts, 5, 1)) +>Base : Symbol(Base, Decl(privateNameStaticAccessorssDerivedClasses.ts, 0, 0)) + + static method(x: typeof Derived) { +>method : Symbol(Derived.method, Decl(privateNameStaticAccessorssDerivedClasses.ts, 6, 28)) +>x : Symbol(x, Decl(privateNameStaticAccessorssDerivedClasses.ts, 7, 18)) +>Derived : Symbol(Derived, Decl(privateNameStaticAccessorssDerivedClasses.ts, 5, 1)) + + console.log(x.#prop); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>x : Symbol(x, Decl(privateNameStaticAccessorssDerivedClasses.ts, 7, 18)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.types b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.types new file mode 100644 index 0000000000000..ef775104abfbc --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts === +class Base { +>Base : Base + + static get #prop(): number { return 123; } +>#prop : number +>123 : 123 + + static method(x: typeof Derived) { +>method : (x: typeof Derived) => void +>x : typeof Derived +>Derived : typeof Derived + + console.log(x.#prop); +>console.log(x.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop : any +>x : typeof Derived + } +} +class Derived extends Base { +>Derived : Derived +>Base : Base + + static method(x: typeof Derived) { +>method : (x: typeof Derived) => void +>x : typeof Derived +>Derived : typeof Derived + + console.log(x.#prop); +>console.log(x.#prop) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>x.#prop : any +>x : typeof Derived + } +} + diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js new file mode 100644 index 0000000000000..363aace223b36 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js @@ -0,0 +1,14 @@ +//// [privateNameStaticAndStaticInitializer.ts] +class A { + static #foo = 1; + static #prop = 2; +} + + + +//// [privateNameStaticAndStaticInitializer.js] +var _A_foo, _A_prop; +class A { +} +_A_foo = { value: 1 }; +_A_prop = { value: 2 }; diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).symbols b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).symbols new file mode 100644 index 0000000000000..c0085bdc9b9c0 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticAndStaticInitializer.ts, 0, 0)) + + static #foo = 1; +>#foo : Symbol(A.#foo, Decl(privateNameStaticAndStaticInitializer.ts, 0, 9)) + + static #prop = 2; +>#prop : Symbol(A.#prop, Decl(privateNameStaticAndStaticInitializer.ts, 1, 18)) +} + + diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).types b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).types new file mode 100644 index 0000000000000..956a0474bfb07 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts === +class A { +>A : A + + static #foo = 1; +>#foo : number +>1 : 1 + + static #prop = 2; +>#prop : number +>2 : 2 +} + + diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js new file mode 100644 index 0000000000000..ccd7fec0c66bc --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js @@ -0,0 +1,13 @@ +//// [privateNameStaticAndStaticInitializer.ts] +class A { + static #foo = 1; + static #prop = 2; +} + + + +//// [privateNameStaticAndStaticInitializer.js] +class A { + static #foo = 1; + static #prop = 2; +} diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).symbols b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).symbols new file mode 100644 index 0000000000000..c0085bdc9b9c0 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).symbols @@ -0,0 +1,12 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticAndStaticInitializer.ts, 0, 0)) + + static #foo = 1; +>#foo : Symbol(A.#foo, Decl(privateNameStaticAndStaticInitializer.ts, 0, 9)) + + static #prop = 2; +>#prop : Symbol(A.#prop, Decl(privateNameStaticAndStaticInitializer.ts, 1, 18)) +} + + diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).types b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).types new file mode 100644 index 0000000000000..956a0474bfb07 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts === +class A { +>A : A + + static #foo = 1; +>#foo : number +>1 : 1 + + static #prop = 2; +>#prop : number +>2 : 2 +} + + diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.errors.txt b/tests/baselines/reference/privateNameStaticFieldAccess.errors.txt new file mode 100644 index 0000000000000..cc1659560febd --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAccess.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts(5,26): error TS2339: Property '#myField' does not exist on type 'A'. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts (1 errors) ==== + class A { + static #myField = "hello world"; + constructor() { + console.log(A.#myField); //Ok + console.log(this.#myField); //Error + ~~~~~~~~ +!!! error TS2339: Property '#myField' does not exist on type 'A'. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.js b/tests/baselines/reference/privateNameStaticFieldAccess.js new file mode 100644 index 0000000000000..1493de026075f --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAccess.js @@ -0,0 +1,25 @@ +//// [privateNameStaticFieldAccess.ts] +class A { + static #myField = "hello world"; + constructor() { + console.log(A.#myField); //Ok + console.log(this.#myField); //Error + } +} + + +//// [privateNameStaticFieldAccess.js] +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var _A_myField; +class A { + constructor() { + console.log(__classStaticPrivateFieldGet(A, A, _A_myField)); //Ok + console.log(__classStaticPrivateFieldGet(this, A, _A_myField)); //Error + } +} +_A_myField = { value: "hello world" }; diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.symbols b/tests/baselines/reference/privateNameStaticFieldAccess.symbols new file mode 100644 index 0000000000000..e7a6bee379ee2 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAccess.symbols @@ -0,0 +1,23 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldAccess.ts, 0, 0)) + + static #myField = "hello world"; +>#myField : Symbol(A.#myField, Decl(privateNameStaticFieldAccess.ts, 0, 9)) + + constructor() { + console.log(A.#myField); //Ok +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>A.#myField : Symbol(A.#myField, Decl(privateNameStaticFieldAccess.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAccess.ts, 0, 0)) + + console.log(this.#myField); //Error +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>this : Symbol(A, Decl(privateNameStaticFieldAccess.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.types b/tests/baselines/reference/privateNameStaticFieldAccess.types new file mode 100644 index 0000000000000..4d549b845bc39 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAccess.types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts === +class A { +>A : A + + static #myField = "hello world"; +>#myField : string +>"hello world" : "hello world" + + constructor() { + console.log(A.#myField); //Ok +>console.log(A.#myField) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>A.#myField : string +>A : typeof A + + console.log(this.#myField); //Error +>console.log(this.#myField) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>this.#myField : any +>this : this + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.js b/tests/baselines/reference/privateNameStaticFieldAssignment.js new file mode 100644 index 0000000000000..76c140da1e309 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.js @@ -0,0 +1,87 @@ +//// [privateNameStaticFieldAssignment.ts] +class A { + static #field = 0; + constructor() { + A.#field = 1; + A.#field += 2; + A.#field -= 3; + A.#field /= 4; + A.#field *= 5; + A.#field **= 6; + A.#field %= 7; + A.#field <<= 8; + A.#field >>= 9; + A.#field >>>= 10; + A.#field &= 11; + A.#field |= 12; + A.#field ^= 13; + A.getClass().#field = 1; + A.getClass().#field += 2; + A.getClass().#field -= 3; + A.getClass().#field /= 4; + A.getClass().#field *= 5; + A.getClass().#field **= 6; + A.getClass().#field %= 7; + A.getClass().#field <<= 8; + A.getClass().#field >>= 9; + A.getClass().#field >>>= 10; + A.getClass().#field &= 11; + A.getClass().#field |= 12; + A.getClass().#field ^= 13; + } + static getClass() { + return A; + } +} + + +//// [privateNameStaticFieldAssignment.js] +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; +}; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var _A_field; +class A { + constructor() { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z; + __classStaticPrivateFieldSet(A, A, _A_field, 1); + __classStaticPrivateFieldSet(_a = A, A, _A_field, __classStaticPrivateFieldGet(_a, A, _A_field) + 2); + __classStaticPrivateFieldSet(_b = A, A, _A_field, __classStaticPrivateFieldGet(_b, A, _A_field) - 3); + __classStaticPrivateFieldSet(_c = A, A, _A_field, __classStaticPrivateFieldGet(_c, A, _A_field) / 4); + __classStaticPrivateFieldSet(_d = A, A, _A_field, __classStaticPrivateFieldGet(_d, A, _A_field) * 5); + __classStaticPrivateFieldSet(_e = A, A, _A_field, Math.pow(__classStaticPrivateFieldGet(_e, A, _A_field), 6)); + __classStaticPrivateFieldSet(_f = A, A, _A_field, __classStaticPrivateFieldGet(_f, A, _A_field) % 7); + __classStaticPrivateFieldSet(_g = A, A, _A_field, __classStaticPrivateFieldGet(_g, A, _A_field) << 8); + __classStaticPrivateFieldSet(_h = A, A, _A_field, __classStaticPrivateFieldGet(_h, A, _A_field) >> 9); + __classStaticPrivateFieldSet(_j = A, A, _A_field, __classStaticPrivateFieldGet(_j, A, _A_field) >>> 10); + __classStaticPrivateFieldSet(_k = A, A, _A_field, __classStaticPrivateFieldGet(_k, A, _A_field) & 11); + __classStaticPrivateFieldSet(_l = A, A, _A_field, __classStaticPrivateFieldGet(_l, A, _A_field) | 12); + __classStaticPrivateFieldSet(_m = A, A, _A_field, __classStaticPrivateFieldGet(_m, A, _A_field) ^ 13); + __classStaticPrivateFieldSet(A.getClass(), A, _A_field, 1); + __classStaticPrivateFieldSet(_o = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_o, A, _A_field) + 2); + __classStaticPrivateFieldSet(_p = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_p, A, _A_field) - 3); + __classStaticPrivateFieldSet(_q = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_q, A, _A_field) / 4); + __classStaticPrivateFieldSet(_r = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_r, A, _A_field) * 5); + __classStaticPrivateFieldSet(_s = A.getClass(), A, _A_field, Math.pow(__classStaticPrivateFieldGet(_s, A, _A_field), 6)); + __classStaticPrivateFieldSet(_t = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_t, A, _A_field) % 7); + __classStaticPrivateFieldSet(_u = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_u, A, _A_field) << 8); + __classStaticPrivateFieldSet(_v = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_v, A, _A_field) >> 9); + __classStaticPrivateFieldSet(_w = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_w, A, _A_field) >>> 10); + __classStaticPrivateFieldSet(_x = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_x, A, _A_field) & 11); + __classStaticPrivateFieldSet(_y = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_y, A, _A_field) | 12); + __classStaticPrivateFieldSet(_z = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_z, A, _A_field) ^ 13); + } + static getClass() { + return A; + } +} +_A_field = { value: 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.symbols b/tests/baselines/reference/privateNameStaticFieldAssignment.symbols new file mode 100644 index 0000000000000..1d11fc0aa603d --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.symbols @@ -0,0 +1,146 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + static #field = 0; +>#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) + + constructor() { + A.#field = 1; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field += 2; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field -= 3; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field /= 4; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field *= 5; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field **= 6; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field %= 7; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field <<= 8; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field >>= 9; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field >>>= 10; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field &= 11; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field |= 12; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.#field ^= 13; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + + A.getClass().#field = 1; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field += 2; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field -= 3; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field /= 4; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field *= 5; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field **= 6; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field %= 7; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field <<= 8; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field >>= 9; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field >>>= 10; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field &= 11; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field |= 12; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + A.getClass().#field ^= 13; +>A.getClass().#field : Symbol(A.#field, Decl(privateNameStaticFieldAssignment.ts, 0, 9)) +>A.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + } + static getClass() { +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldAssignment.ts, 29, 5)) + + return A; +>A : Symbol(A, Decl(privateNameStaticFieldAssignment.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.types b/tests/baselines/reference/privateNameStaticFieldAssignment.types new file mode 100644 index 0000000000000..679df4ca7f352 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.types @@ -0,0 +1,212 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts === +class A { +>A : A + + static #field = 0; +>#field : number +>0 : 0 + + constructor() { + A.#field = 1; +>A.#field = 1 : 1 +>A.#field : number +>A : typeof A +>1 : 1 + + A.#field += 2; +>A.#field += 2 : number +>A.#field : number +>A : typeof A +>2 : 2 + + A.#field -= 3; +>A.#field -= 3 : number +>A.#field : number +>A : typeof A +>3 : 3 + + A.#field /= 4; +>A.#field /= 4 : number +>A.#field : number +>A : typeof A +>4 : 4 + + A.#field *= 5; +>A.#field *= 5 : number +>A.#field : number +>A : typeof A +>5 : 5 + + A.#field **= 6; +>A.#field **= 6 : number +>A.#field : number +>A : typeof A +>6 : 6 + + A.#field %= 7; +>A.#field %= 7 : number +>A.#field : number +>A : typeof A +>7 : 7 + + A.#field <<= 8; +>A.#field <<= 8 : number +>A.#field : number +>A : typeof A +>8 : 8 + + A.#field >>= 9; +>A.#field >>= 9 : number +>A.#field : number +>A : typeof A +>9 : 9 + + A.#field >>>= 10; +>A.#field >>>= 10 : number +>A.#field : number +>A : typeof A +>10 : 10 + + A.#field &= 11; +>A.#field &= 11 : number +>A.#field : number +>A : typeof A +>11 : 11 + + A.#field |= 12; +>A.#field |= 12 : number +>A.#field : number +>A : typeof A +>12 : 12 + + A.#field ^= 13; +>A.#field ^= 13 : number +>A.#field : number +>A : typeof A +>13 : 13 + + A.getClass().#field = 1; +>A.getClass().#field = 1 : 1 +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>1 : 1 + + A.getClass().#field += 2; +>A.getClass().#field += 2 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>2 : 2 + + A.getClass().#field -= 3; +>A.getClass().#field -= 3 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>3 : 3 + + A.getClass().#field /= 4; +>A.getClass().#field /= 4 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>4 : 4 + + A.getClass().#field *= 5; +>A.getClass().#field *= 5 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>5 : 5 + + A.getClass().#field **= 6; +>A.getClass().#field **= 6 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>6 : 6 + + A.getClass().#field %= 7; +>A.getClass().#field %= 7 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>7 : 7 + + A.getClass().#field <<= 8; +>A.getClass().#field <<= 8 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>8 : 8 + + A.getClass().#field >>= 9; +>A.getClass().#field >>= 9 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>9 : 9 + + A.getClass().#field >>>= 10; +>A.getClass().#field >>>= 10 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>10 : 10 + + A.getClass().#field &= 11; +>A.getClass().#field &= 11 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>11 : 11 + + A.getClass().#field |= 12; +>A.getClass().#field |= 12 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>12 : 12 + + A.getClass().#field ^= 13; +>A.getClass().#field ^= 13 : number +>A.getClass().#field : number +>A.getClass() : typeof A +>A.getClass : () => typeof A +>A : typeof A +>getClass : () => typeof A +>13 : 13 + } + static getClass() { +>getClass : () => typeof A + + return A; +>A : typeof A + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.js b/tests/baselines/reference/privateNameStaticFieldCallExpression.js new file mode 100644 index 0000000000000..4bd4350fc0118 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.js @@ -0,0 +1,52 @@ +//// [privateNameStaticFieldCallExpression.ts] +class A { + static #fieldFunc = function () { this.x = 10; }; + static #fieldFunc2 = function (a, ...b) {}; + x = 1; + test() { + A.#fieldFunc(); + A.#fieldFunc?.(); + const func = A.#fieldFunc; + func(); + new A.#fieldFunc(); + + const arr = [ 1, 2 ]; + A.#fieldFunc2(0, ...arr, 3); + const b = new A.#fieldFunc2(0, ...arr, 3); + const str = A.#fieldFunc2`head${1}middle${2}tail`; + this.getClass().#fieldFunc2`test${1}and${2}`; + } + getClass() { return A; } +} + + +//// [privateNameStaticFieldCallExpression.js] +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var _A_fieldFunc, _A_fieldFunc2; +class A { + constructor() { + this.x = 1; + } + test() { + var _a; + var _b; + __classStaticPrivateFieldGet(A, A, _A_fieldFunc).call(A); + (_a = __classStaticPrivateFieldGet(A, A, _A_fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(A); + const func = __classStaticPrivateFieldGet(A, A, _A_fieldFunc); + func(); + new (__classStaticPrivateFieldGet(A, A, _A_fieldFunc))(); + const arr = [1, 2]; + __classStaticPrivateFieldGet(A, A, _A_fieldFunc2).call(A, 0, ...arr, 3); + const b = new (__classStaticPrivateFieldGet(A, A, _A_fieldFunc2))(0, ...arr, 3); + const str = __classStaticPrivateFieldGet(A, A, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; + __classStaticPrivateFieldGet((_b = this.getClass()), A, _A_fieldFunc2).bind(_b) `test${1}and${2}`; + } + getClass() { return A; } +} +_A_fieldFunc = { value: function () { this.x = 10; } }; +_A_fieldFunc2 = { value: function (a, ...b) { } }; diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.symbols b/tests/baselines/reference/privateNameStaticFieldCallExpression.symbols new file mode 100644 index 0000000000000..955ab2080b884 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.symbols @@ -0,0 +1,68 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + static #fieldFunc = function () { this.x = 10; }; +>#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticFieldCallExpression.ts, 0, 9)) + + static #fieldFunc2 = function (a, ...b) {}; +>#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticFieldCallExpression.ts, 1, 53)) +>a : Symbol(a, Decl(privateNameStaticFieldCallExpression.ts, 2, 35)) +>b : Symbol(b, Decl(privateNameStaticFieldCallExpression.ts, 2, 37)) + + x = 1; +>x : Symbol(A.x, Decl(privateNameStaticFieldCallExpression.ts, 2, 47)) + + test() { +>test : Symbol(A.test, Decl(privateNameStaticFieldCallExpression.ts, 3, 10)) + + A.#fieldFunc(); +>A.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticFieldCallExpression.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + A.#fieldFunc?.(); +>A.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticFieldCallExpression.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + const func = A.#fieldFunc; +>func : Symbol(func, Decl(privateNameStaticFieldCallExpression.ts, 7, 13)) +>A.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticFieldCallExpression.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + func(); +>func : Symbol(func, Decl(privateNameStaticFieldCallExpression.ts, 7, 13)) + + new A.#fieldFunc(); +>A.#fieldFunc : Symbol(A.#fieldFunc, Decl(privateNameStaticFieldCallExpression.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + const arr = [ 1, 2 ]; +>arr : Symbol(arr, Decl(privateNameStaticFieldCallExpression.ts, 11, 13)) + + A.#fieldFunc2(0, ...arr, 3); +>A.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticFieldCallExpression.ts, 1, 53)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticFieldCallExpression.ts, 11, 13)) + + const b = new A.#fieldFunc2(0, ...arr, 3); +>b : Symbol(b, Decl(privateNameStaticFieldCallExpression.ts, 13, 13)) +>A.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticFieldCallExpression.ts, 1, 53)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticFieldCallExpression.ts, 11, 13)) + + const str = A.#fieldFunc2`head${1}middle${2}tail`; +>str : Symbol(str, Decl(privateNameStaticFieldCallExpression.ts, 14, 13)) +>A.#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticFieldCallExpression.ts, 1, 53)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) + + this.getClass().#fieldFunc2`test${1}and${2}`; +>this.getClass().#fieldFunc2 : Symbol(A.#fieldFunc2, Decl(privateNameStaticFieldCallExpression.ts, 1, 53)) +>this.getClass : Symbol(A.getClass, Decl(privateNameStaticFieldCallExpression.ts, 16, 5)) +>this : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldCallExpression.ts, 16, 5)) + } + getClass() { return A; } +>getClass : Symbol(A.getClass, Decl(privateNameStaticFieldCallExpression.ts, 16, 5)) +>A : Symbol(A, Decl(privateNameStaticFieldCallExpression.ts, 0, 0)) +} + diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.types b/tests/baselines/reference/privateNameStaticFieldCallExpression.types new file mode 100644 index 0000000000000..320520f14f814 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.types @@ -0,0 +1,100 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts === +class A { +>A : A + + static #fieldFunc = function () { this.x = 10; }; +>#fieldFunc : () => void +>function () { this.x = 10; } : () => void +>this.x = 10 : 10 +>this.x : any +>this : any +>x : any +>10 : 10 + + static #fieldFunc2 = function (a, ...b) {}; +>#fieldFunc2 : (a: any, ...b: any[]) => void +>function (a, ...b) {} : (a: any, ...b: any[]) => void +>a : any +>b : any[] + + x = 1; +>x : number +>1 : 1 + + test() { +>test : () => void + + A.#fieldFunc(); +>A.#fieldFunc() : void +>A.#fieldFunc : () => void +>A : typeof A + + A.#fieldFunc?.(); +>A.#fieldFunc?.() : void +>A.#fieldFunc : () => void +>A : typeof A + + const func = A.#fieldFunc; +>func : () => void +>A.#fieldFunc : () => void +>A : typeof A + + func(); +>func() : void +>func : () => void + + new A.#fieldFunc(); +>new A.#fieldFunc() : any +>A.#fieldFunc : () => void +>A : typeof A + + const arr = [ 1, 2 ]; +>arr : number[] +>[ 1, 2 ] : number[] +>1 : 1 +>2 : 2 + + A.#fieldFunc2(0, ...arr, 3); +>A.#fieldFunc2(0, ...arr, 3) : void +>A.#fieldFunc2 : (a: any, ...b: any[]) => void +>A : typeof A +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b = new A.#fieldFunc2(0, ...arr, 3); +>b : any +>new A.#fieldFunc2(0, ...arr, 3) : any +>A.#fieldFunc2 : (a: any, ...b: any[]) => void +>A : typeof A +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str = A.#fieldFunc2`head${1}middle${2}tail`; +>str : void +>A.#fieldFunc2`head${1}middle${2}tail` : void +>A.#fieldFunc2 : (a: any, ...b: any[]) => void +>A : typeof A +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + + this.getClass().#fieldFunc2`test${1}and${2}`; +>this.getClass().#fieldFunc2`test${1}and${2}` : void +>this.getClass().#fieldFunc2 : (a: any, ...b: any[]) => void +>this.getClass() : typeof A +>this.getClass : () => typeof A +>this : this +>getClass : () => typeof A +>`test${1}and${2}` : "test1and2" +>1 : 1 +>2 : 2 + } + getClass() { return A; } +>getClass : () => typeof A +>A : typeof A +} + diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.js b/tests/baselines/reference/privateNameStaticFieldClassExpression.js new file mode 100644 index 0000000000000..6bad09f78d404 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.js @@ -0,0 +1,52 @@ +//// [privateNameStaticFieldClassExpression.ts] +class B { + static #foo = class { + constructor() { + console.log("hello"); + new B.#foo2(); + } + static test = 123; + field = 10; + }; + static #foo2 = class Foo { + static otherClass = 123; + }; + + m() { + console.log(B.#foo.test) + B.#foo.test = 10; + new B.#foo().field; + } +} + + + + +//// [privateNameStaticFieldClassExpression.js] +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var _B_foo, _B_foo2, _a, _b; +class B { + m() { + console.log(__classStaticPrivateFieldGet(B, B, _B_foo).test); + __classStaticPrivateFieldGet(B, B, _B_foo).test = 10; + new (__classStaticPrivateFieldGet(B, B, _B_foo))().field; + } +} +_B_foo = { value: (_a = class { + constructor() { + this.field = 10; + console.log("hello"); + new (__classStaticPrivateFieldGet(B, B, _B_foo2))(); + } + }, + _a.test = 123, + _a) }; +_B_foo2 = { value: (_b = class Foo { + }, + _b.otherClass = 123, + _b) }; diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.symbols b/tests/baselines/reference/privateNameStaticFieldClassExpression.symbols new file mode 100644 index 0000000000000..f6bee58f5f494 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.symbols @@ -0,0 +1,61 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts === +class B { +>B : Symbol(B, Decl(privateNameStaticFieldClassExpression.ts, 0, 0)) + + static #foo = class { +>#foo : Symbol(B.#foo, Decl(privateNameStaticFieldClassExpression.ts, 0, 9)) + + constructor() { + console.log("hello"); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + + new B.#foo2(); +>B.#foo2 : Symbol(B.#foo2, Decl(privateNameStaticFieldClassExpression.ts, 8, 6)) +>B : Symbol(B, Decl(privateNameStaticFieldClassExpression.ts, 0, 0)) + } + static test = 123; +>test : Symbol((Anonymous class).test, Decl(privateNameStaticFieldClassExpression.ts, 5, 9)) + + field = 10; +>field : Symbol((Anonymous class).field, Decl(privateNameStaticFieldClassExpression.ts, 6, 26)) + + }; + static #foo2 = class Foo { +>#foo2 : Symbol(B.#foo2, Decl(privateNameStaticFieldClassExpression.ts, 8, 6)) +>Foo : Symbol(Foo, Decl(privateNameStaticFieldClassExpression.ts, 9, 18)) + + static otherClass = 123; +>otherClass : Symbol(Foo.otherClass, Decl(privateNameStaticFieldClassExpression.ts, 9, 30)) + + }; + + m() { +>m : Symbol(B.m, Decl(privateNameStaticFieldClassExpression.ts, 11, 6)) + + console.log(B.#foo.test) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>B.#foo.test : Symbol((Anonymous class).test, Decl(privateNameStaticFieldClassExpression.ts, 5, 9)) +>B.#foo : Symbol(B.#foo, Decl(privateNameStaticFieldClassExpression.ts, 0, 9)) +>B : Symbol(B, Decl(privateNameStaticFieldClassExpression.ts, 0, 0)) +>test : Symbol((Anonymous class).test, Decl(privateNameStaticFieldClassExpression.ts, 5, 9)) + + B.#foo.test = 10; +>B.#foo.test : Symbol((Anonymous class).test, Decl(privateNameStaticFieldClassExpression.ts, 5, 9)) +>B.#foo : Symbol(B.#foo, Decl(privateNameStaticFieldClassExpression.ts, 0, 9)) +>B : Symbol(B, Decl(privateNameStaticFieldClassExpression.ts, 0, 0)) +>test : Symbol((Anonymous class).test, Decl(privateNameStaticFieldClassExpression.ts, 5, 9)) + + new B.#foo().field; +>new B.#foo().field : Symbol((Anonymous class).field, Decl(privateNameStaticFieldClassExpression.ts, 6, 26)) +>B.#foo : Symbol(B.#foo, Decl(privateNameStaticFieldClassExpression.ts, 0, 9)) +>B : Symbol(B, Decl(privateNameStaticFieldClassExpression.ts, 0, 0)) +>field : Symbol((Anonymous class).field, Decl(privateNameStaticFieldClassExpression.ts, 6, 26)) + } +} + + + diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.types b/tests/baselines/reference/privateNameStaticFieldClassExpression.types new file mode 100644 index 0000000000000..31ca3abe90f6a --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.types @@ -0,0 +1,73 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts === +class B { +>B : B + + static #foo = class { +>#foo : typeof (Anonymous class) +>class { constructor() { console.log("hello"); new B.#foo2(); } static test = 123; field = 10; } : typeof (Anonymous class) + + constructor() { + console.log("hello"); +>console.log("hello") : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>"hello" : "hello" + + new B.#foo2(); +>new B.#foo2() : Foo +>B.#foo2 : typeof Foo +>B : typeof B + } + static test = 123; +>test : number +>123 : 123 + + field = 10; +>field : number +>10 : 10 + + }; + static #foo2 = class Foo { +>#foo2 : typeof Foo +>class Foo { static otherClass = 123; } : typeof Foo +>Foo : typeof Foo + + static otherClass = 123; +>otherClass : number +>123 : 123 + + }; + + m() { +>m : () => void + + console.log(B.#foo.test) +>console.log(B.#foo.test) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>B.#foo.test : number +>B.#foo : typeof (Anonymous class) +>B : typeof B +>test : number + + B.#foo.test = 10; +>B.#foo.test = 10 : 10 +>B.#foo.test : number +>B.#foo : typeof (Anonymous class) +>B : typeof B +>test : number +>10 : 10 + + new B.#foo().field; +>new B.#foo().field : number +>new B.#foo() : (Anonymous class) +>B.#foo : typeof (Anonymous class) +>B : typeof B +>field : number + } +} + + + diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.errors.txt b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.errors.txt new file mode 100644 index 0000000000000..8e845cdbcaee3 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.errors.txt @@ -0,0 +1,25 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts(4,17): error TS18013: Property '#derivedProp' is not accessible outside class 'Derived' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts(12,14): error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts (2 errors) ==== + class Base { + static #prop: number = 123; + static method(x: Derived) { + Derived.#derivedProp // error + ~~~~~~~~~~~~ +!!! error TS18013: Property '#derivedProp' is not accessible outside class 'Derived' because it has a private identifier. + Base.#prop = 10; + } + } + class Derived extends Base { + static #derivedProp: number = 10; + static method(x: Derived) { + Derived.#derivedProp + Base.#prop = 10; // error + ~~~~~ +!!! error TS18013: Property '#prop' is not accessible outside class 'Base' because it has a private identifier. + } + } + + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js new file mode 100644 index 0000000000000..bdad1319d82c1 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js @@ -0,0 +1,48 @@ +//// [privateNameStaticFieldDerivedClasses.ts] +class Base { + static #prop: number = 123; + static method(x: Derived) { + Derived.#derivedProp // error + Base.#prop = 10; + } +} +class Derived extends Base { + static #derivedProp: number = 10; + static method(x: Derived) { + Derived.#derivedProp + Base.#prop = 10; // error + } +} + + + +//// [privateNameStaticFieldDerivedClasses.js] +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; +}; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var _Base_prop, _Derived_derivedProp; +class Base { + static method(x) { + Derived.; // error + __classStaticPrivateFieldSet(// error + Base, Base, _Base_prop, 10); + } +} +_Base_prop = { value: 123 }; +class Derived extends Base { + static method(x) { + __classStaticPrivateFieldGet(Derived, Derived, _Derived_derivedProp); + Base. = 10; // error + } +} +_Derived_derivedProp = { value: 10 }; diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.symbols b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.symbols new file mode 100644 index 0000000000000..44da6b8ecaddd --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.symbols @@ -0,0 +1,42 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts === +class Base { +>Base : Symbol(Base, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 0)) + + static #prop: number = 123; +>#prop : Symbol(Base.#prop, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 12)) + + static method(x: Derived) { +>method : Symbol(Base.method, Decl(privateNameStaticFieldDerivedClasses.ts, 1, 31)) +>x : Symbol(x, Decl(privateNameStaticFieldDerivedClasses.ts, 2, 18)) +>Derived : Symbol(Derived, Decl(privateNameStaticFieldDerivedClasses.ts, 6, 1)) + + Derived.#derivedProp // error +>Derived : Symbol(Derived, Decl(privateNameStaticFieldDerivedClasses.ts, 6, 1)) + + Base.#prop = 10; +>Base.#prop : Symbol(Base.#prop, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 12)) +>Base : Symbol(Base, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 0)) + } +} +class Derived extends Base { +>Derived : Symbol(Derived, Decl(privateNameStaticFieldDerivedClasses.ts, 6, 1)) +>Base : Symbol(Base, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 0)) + + static #derivedProp: number = 10; +>#derivedProp : Symbol(Derived.#derivedProp, Decl(privateNameStaticFieldDerivedClasses.ts, 7, 28)) + + static method(x: Derived) { +>method : Symbol(Derived.method, Decl(privateNameStaticFieldDerivedClasses.ts, 8, 37)) +>x : Symbol(x, Decl(privateNameStaticFieldDerivedClasses.ts, 9, 18)) +>Derived : Symbol(Derived, Decl(privateNameStaticFieldDerivedClasses.ts, 6, 1)) + + Derived.#derivedProp +>Derived.#derivedProp : Symbol(Derived.#derivedProp, Decl(privateNameStaticFieldDerivedClasses.ts, 7, 28)) +>Derived : Symbol(Derived, Decl(privateNameStaticFieldDerivedClasses.ts, 6, 1)) + + Base.#prop = 10; // error +>Base : Symbol(Base, Decl(privateNameStaticFieldDerivedClasses.ts, 0, 0)) + } +} + + diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.types b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.types new file mode 100644 index 0000000000000..8db01be0a072b --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.types @@ -0,0 +1,48 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts === +class Base { +>Base : Base + + static #prop: number = 123; +>#prop : number +>123 : 123 + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + Derived.#derivedProp // error +>Derived.#derivedProp : any +>Derived : typeof Derived + + Base.#prop = 10; +>Base.#prop = 10 : 10 +>Base.#prop : number +>Base : typeof Base +>10 : 10 + } +} +class Derived extends Base { +>Derived : Derived +>Base : Base + + static #derivedProp: number = 10; +>#derivedProp : number +>10 : 10 + + static method(x: Derived) { +>method : (x: Derived) => void +>x : Derived + + Derived.#derivedProp +>Derived.#derivedProp : number +>Derived : typeof Derived + + Base.#prop = 10; // error +>Base.#prop = 10 : 10 +>Base.#prop : any +>Base : typeof Base +>10 : 10 + } +} + + diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js new file mode 100644 index 0000000000000..cdd7cecba6daf --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js @@ -0,0 +1,59 @@ +//// [privateNameStaticFieldDestructuredBinding.ts] +class A { + static #field = 1; + otherClass = A; + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + constructor() { + let y: number; + ({ x: A.#field, y } = this.testObject()); + ([A.#field, y] = this.testArray()); + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); + [A.#field, [A.#field]] = [1, [2]]; + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); + [A.#field = 2] = []; + [this.otherClass.#field = 2] = []; + } + static test(_a: typeof A) { + [_a.#field] = [2]; + } +} + + +//// [privateNameStaticFieldDestructuredBinding.js] +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; +}; +var _A_field; +class A { + constructor() { + var _b; + this.otherClass = A; + let y; + ({ x: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, y } = this.testObject()); + ([({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, y] = this.testArray()); + ({ a: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, b: [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value] } = { a: 1, b: [2] }); + [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value]] = [1, [2]]; + ({ a: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 1, b: [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 1] } = { b: [] }); + [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 2] = []; + _b = this.otherClass, [({ set value(_c) { __classStaticPrivateFieldSet(_b, A, _A_field, _c); } }).value = 2] = []; + } + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + static test(_a) { + [({ set value(_b) { __classStaticPrivateFieldSet(_a, A, _A_field, _b); } }).value] = [2]; + } +} +_A_field = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).symbols b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).symbols new file mode 100644 index 0000000000000..a539e6833531e --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).symbols @@ -0,0 +1,90 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + static #field = 1; +>#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) + + otherClass = A; +>otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + testObject() { +>testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) + + return { x: 10, y: 6 }; +>x : Symbol(x, Decl(privateNameStaticFieldDestructuredBinding.ts, 4, 16)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 4, 23)) + } + testArray() { +>testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) + + return [10, 11]; + } + constructor() { + let y: number; +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 10, 11)) + + ({ x: A.#field, y } = this.testObject()); +>x : Symbol(x, Decl(privateNameStaticFieldDestructuredBinding.ts, 11, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 11, 23)) +>this.testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) + + ([A.#field, y] = this.testArray()); +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 10, 11)) +>this.testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) + + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 23)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 43)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 49)) + + [A.#field, [A.#field]] = [1, [2]]; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 27)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 51)) + + [A.#field = 2] = []; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + [this.otherClass.#field = 2] = []; +>this.otherClass.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>this.otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) + } + static test(_a: typeof A) { +>test : Symbol(A.test, Decl(privateNameStaticFieldDestructuredBinding.ts, 18, 5)) +>_a : Symbol(_a, Decl(privateNameStaticFieldDestructuredBinding.ts, 19, 16)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + [_a.#field] = [2]; +>_a.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>_a : Symbol(_a, Decl(privateNameStaticFieldDestructuredBinding.ts, 19, 16)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).types b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).types new file mode 100644 index 0000000000000..ef8a216bdb295 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).types @@ -0,0 +1,144 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts === +class A { +>A : A + + static #field = 1; +>#field : number +>1 : 1 + + otherClass = A; +>otherClass : typeof A +>A : typeof A + + testObject() { +>testObject : () => { x: number; y: number; } + + return { x: 10, y: 6 }; +>{ x: 10, y: 6 } : { x: number; y: number; } +>x : number +>10 : 10 +>y : number +>6 : 6 + } + testArray() { +>testArray : () => number[] + + return [10, 11]; +>[10, 11] : number[] +>10 : 10 +>11 : 11 + } + constructor() { + let y: number; +>y : number + + ({ x: A.#field, y } = this.testObject()); +>({ x: A.#field, y } = this.testObject()) : { x: number; y: number; } +>{ x: A.#field, y } = this.testObject() : { x: number; y: number; } +>{ x: A.#field, y } : { x: number; y: number; } +>x : number +>A.#field : number +>A : typeof A +>y : number +>this.testObject() : { x: number; y: number; } +>this.testObject : () => { x: number; y: number; } +>this : this +>testObject : () => { x: number; y: number; } + + ([A.#field, y] = this.testArray()); +>([A.#field, y] = this.testArray()) : number[] +>[A.#field, y] = this.testArray() : number[] +>[A.#field, y] : [number, number] +>A.#field : number +>A : typeof A +>y : number +>this.testArray() : number[] +>this.testArray : () => number[] +>this : this +>testArray : () => number[] + + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); +>({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }) : { a: number; b: [number]; } +>{ a: A.#field, b: [A.#field] } = { a: 1, b: [2] } : { a: number; b: [number]; } +>{ a: A.#field, b: [A.#field] } : { a: number; b: [number]; } +>a : number +>A.#field : number +>A : typeof A +>b : [number] +>[A.#field] : [number] +>A.#field : number +>A : typeof A +>{ a: 1, b: [2] } : { a: number; b: [number]; } +>a : number +>1 : 1 +>b : [number] +>[2] : [number] +>2 : 2 + + [A.#field, [A.#field]] = [1, [2]]; +>[A.#field, [A.#field]] = [1, [2]] : [number, [number]] +>[A.#field, [A.#field]] : [number, [number]] +>A.#field : number +>A : typeof A +>[A.#field] : [number] +>A.#field : number +>A : typeof A +>[1, [2]] : [number, [number]] +>1 : 1 +>[2] : [number] +>2 : 2 + + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); +>({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }) : { b: []; a?: number; } +>{ a: A.#field = 1, b: [A.#field = 1] } = { b: [] } : { b: []; a?: number; } +>{ a: A.#field = 1, b: [A.#field = 1] } : { a?: number; b: [number]; } +>a : number +>A.#field = 1 : 1 +>A.#field : number +>A : typeof A +>1 : 1 +>b : [number] +>[A.#field = 1] : [number] +>A.#field = 1 : 1 +>A.#field : number +>A : typeof A +>1 : 1 +>{ b: [] } : { b: []; a?: number; } +>b : [] +>[] : [] + + [A.#field = 2] = []; +>[A.#field = 2] = [] : [] +>[A.#field = 2] : [number] +>A.#field = 2 : 2 +>A.#field : number +>A : typeof A +>2 : 2 +>[] : [] + + [this.otherClass.#field = 2] = []; +>[this.otherClass.#field = 2] = [] : [] +>[this.otherClass.#field = 2] : [number] +>this.otherClass.#field = 2 : 2 +>this.otherClass.#field : number +>this.otherClass : typeof A +>this : this +>otherClass : typeof A +>2 : 2 +>[] : [] + } + static test(_a: typeof A) { +>test : (_a: typeof A) => void +>_a : typeof A +>A : typeof A + + [_a.#field] = [2]; +>[_a.#field] = [2] : [number] +>[_a.#field] : [number] +>_a.#field : number +>_a : typeof A +>[2] : [number] +>2 : 2 + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js new file mode 100644 index 0000000000000..69b4fff34e2bf --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js @@ -0,0 +1,50 @@ +//// [privateNameStaticFieldDestructuredBinding.ts] +class A { + static #field = 1; + otherClass = A; + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + constructor() { + let y: number; + ({ x: A.#field, y } = this.testObject()); + ([A.#field, y] = this.testArray()); + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); + [A.#field, [A.#field]] = [1, [2]]; + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); + [A.#field = 2] = []; + [this.otherClass.#field = 2] = []; + } + static test(_a: typeof A) { + [_a.#field] = [2]; + } +} + + +//// [privateNameStaticFieldDestructuredBinding.js] +class A { + constructor() { + this.otherClass = A; + let y; + ({ x: A.#field, y } = this.testObject()); + ([A.#field, y] = this.testArray()); + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); + [A.#field, [A.#field]] = [1, [2]]; + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); + [A.#field = 2] = []; + [this.otherClass.#field = 2] = []; + } + static #field = 1; + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + static test(_a) { + [_a.#field] = [2]; + } +} diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).symbols b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).symbols new file mode 100644 index 0000000000000..a539e6833531e --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).symbols @@ -0,0 +1,90 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + static #field = 1; +>#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) + + otherClass = A; +>otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + testObject() { +>testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) + + return { x: 10, y: 6 }; +>x : Symbol(x, Decl(privateNameStaticFieldDestructuredBinding.ts, 4, 16)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 4, 23)) + } + testArray() { +>testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) + + return [10, 11]; + } + constructor() { + let y: number; +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 10, 11)) + + ({ x: A.#field, y } = this.testObject()); +>x : Symbol(x, Decl(privateNameStaticFieldDestructuredBinding.ts, 11, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 11, 23)) +>this.testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>testObject : Symbol(A.testObject, Decl(privateNameStaticFieldDestructuredBinding.ts, 2, 19)) + + ([A.#field, y] = this.testArray()); +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>y : Symbol(y, Decl(privateNameStaticFieldDestructuredBinding.ts, 10, 11)) +>this.testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>testArray : Symbol(A.testArray, Decl(privateNameStaticFieldDestructuredBinding.ts, 5, 5)) + + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 23)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 43)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 13, 49)) + + [A.#field, [A.#field]] = [1, [2]]; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); +>a : Symbol(a, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 10)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 27)) +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticFieldDestructuredBinding.ts, 15, 51)) + + [A.#field = 2] = []; +>A.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + [this.otherClass.#field = 2] = []; +>this.otherClass.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>this.otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) +>this : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) +>otherClass : Symbol(A.otherClass, Decl(privateNameStaticFieldDestructuredBinding.ts, 1, 22)) + } + static test(_a: typeof A) { +>test : Symbol(A.test, Decl(privateNameStaticFieldDestructuredBinding.ts, 18, 5)) +>_a : Symbol(_a, Decl(privateNameStaticFieldDestructuredBinding.ts, 19, 16)) +>A : Symbol(A, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 0)) + + [_a.#field] = [2]; +>_a.#field : Symbol(A.#field, Decl(privateNameStaticFieldDestructuredBinding.ts, 0, 9)) +>_a : Symbol(_a, Decl(privateNameStaticFieldDestructuredBinding.ts, 19, 16)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).types b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).types new file mode 100644 index 0000000000000..ef8a216bdb295 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).types @@ -0,0 +1,144 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts === +class A { +>A : A + + static #field = 1; +>#field : number +>1 : 1 + + otherClass = A; +>otherClass : typeof A +>A : typeof A + + testObject() { +>testObject : () => { x: number; y: number; } + + return { x: 10, y: 6 }; +>{ x: 10, y: 6 } : { x: number; y: number; } +>x : number +>10 : 10 +>y : number +>6 : 6 + } + testArray() { +>testArray : () => number[] + + return [10, 11]; +>[10, 11] : number[] +>10 : 10 +>11 : 11 + } + constructor() { + let y: number; +>y : number + + ({ x: A.#field, y } = this.testObject()); +>({ x: A.#field, y } = this.testObject()) : { x: number; y: number; } +>{ x: A.#field, y } = this.testObject() : { x: number; y: number; } +>{ x: A.#field, y } : { x: number; y: number; } +>x : number +>A.#field : number +>A : typeof A +>y : number +>this.testObject() : { x: number; y: number; } +>this.testObject : () => { x: number; y: number; } +>this : this +>testObject : () => { x: number; y: number; } + + ([A.#field, y] = this.testArray()); +>([A.#field, y] = this.testArray()) : number[] +>[A.#field, y] = this.testArray() : number[] +>[A.#field, y] : [number, number] +>A.#field : number +>A : typeof A +>y : number +>this.testArray() : number[] +>this.testArray : () => number[] +>this : this +>testArray : () => number[] + + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); +>({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }) : { a: number; b: [number]; } +>{ a: A.#field, b: [A.#field] } = { a: 1, b: [2] } : { a: number; b: [number]; } +>{ a: A.#field, b: [A.#field] } : { a: number; b: [number]; } +>a : number +>A.#field : number +>A : typeof A +>b : [number] +>[A.#field] : [number] +>A.#field : number +>A : typeof A +>{ a: 1, b: [2] } : { a: number; b: [number]; } +>a : number +>1 : 1 +>b : [number] +>[2] : [number] +>2 : 2 + + [A.#field, [A.#field]] = [1, [2]]; +>[A.#field, [A.#field]] = [1, [2]] : [number, [number]] +>[A.#field, [A.#field]] : [number, [number]] +>A.#field : number +>A : typeof A +>[A.#field] : [number] +>A.#field : number +>A : typeof A +>[1, [2]] : [number, [number]] +>1 : 1 +>[2] : [number] +>2 : 2 + + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); +>({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }) : { b: []; a?: number; } +>{ a: A.#field = 1, b: [A.#field = 1] } = { b: [] } : { b: []; a?: number; } +>{ a: A.#field = 1, b: [A.#field = 1] } : { a?: number; b: [number]; } +>a : number +>A.#field = 1 : 1 +>A.#field : number +>A : typeof A +>1 : 1 +>b : [number] +>[A.#field = 1] : [number] +>A.#field = 1 : 1 +>A.#field : number +>A : typeof A +>1 : 1 +>{ b: [] } : { b: []; a?: number; } +>b : [] +>[] : [] + + [A.#field = 2] = []; +>[A.#field = 2] = [] : [] +>[A.#field = 2] : [number] +>A.#field = 2 : 2 +>A.#field : number +>A : typeof A +>2 : 2 +>[] : [] + + [this.otherClass.#field = 2] = []; +>[this.otherClass.#field = 2] = [] : [] +>[this.otherClass.#field = 2] : [number] +>this.otherClass.#field = 2 : 2 +>this.otherClass.#field : number +>this.otherClass : typeof A +>this : this +>otherClass : typeof A +>2 : 2 +>[] : [] + } + static test(_a: typeof A) { +>test : (_a: typeof A) => void +>_a : typeof A +>A : typeof A + + [_a.#field] = [2]; +>[_a.#field] = [2] : [number] +>[_a.#field] : [number] +>_a.#field : number +>_a : typeof A +>[2] : [number] +>2 : 2 + } +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js new file mode 100644 index 0000000000000..302cb724a91f7 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js @@ -0,0 +1,13 @@ +//// [privateNameStaticFieldInitializer.ts] +class A { + static #field = 10; + static #uninitialized; +} + + +//// [privateNameStaticFieldInitializer.js] +var _A_field, _A_uninitialized; +class A { +} +_A_uninitialized = { value: void 0 }; +_A_field = { value: 10 }; diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).symbols b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).symbols new file mode 100644 index 0000000000000..d503ebe5086a4 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldInitializer.ts, 0, 0)) + + static #field = 10; +>#field : Symbol(A.#field, Decl(privateNameStaticFieldInitializer.ts, 0, 9)) + + static #uninitialized; +>#uninitialized : Symbol(A.#uninitialized, Decl(privateNameStaticFieldInitializer.ts, 1, 23)) +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).types b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).types new file mode 100644 index 0000000000000..d50c9a2533f0c --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts === +class A { +>A : A + + static #field = 10; +>#field : number +>10 : 10 + + static #uninitialized; +>#uninitialized : any +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js new file mode 100644 index 0000000000000..f52e29bf027e5 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js @@ -0,0 +1,12 @@ +//// [privateNameStaticFieldInitializer.ts] +class A { + static #field = 10; + static #uninitialized; +} + + +//// [privateNameStaticFieldInitializer.js] +class A { + static #field = 10; + static #uninitialized; +} diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).symbols b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).symbols new file mode 100644 index 0000000000000..d503ebe5086a4 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticFieldInitializer.ts, 0, 0)) + + static #field = 10; +>#field : Symbol(A.#field, Decl(privateNameStaticFieldInitializer.ts, 0, 9)) + + static #uninitialized; +>#uninitialized : Symbol(A.#uninitialized, Decl(privateNameStaticFieldInitializer.ts, 1, 23)) +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).types b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).types new file mode 100644 index 0000000000000..d50c9a2533f0c --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts === +class A { +>A : A + + static #field = 10; +>#field : number +>10 : 10 + + static #uninitialized; +>#uninitialized : any +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer.js b/tests/baselines/reference/privateNameStaticFieldInitializer.js new file mode 100644 index 0000000000000..e0eff7b616ba5 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer.js @@ -0,0 +1,13 @@ +//// [privateNameFieldInitializer-static.ts] +class A { + static #field = 10; + static #uninitialized; +} + + +//// [privateNameFieldInitializer-static.js] +var _A_field, _A_uninitialized; +class A { +} +_A_field = { value: 10 }; +_A_uninitialized = { value: void 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer.symbols b/tests/baselines/reference/privateNameStaticFieldInitializer.symbols new file mode 100644 index 0000000000000..a3bbabd600f76 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer.symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameFieldInitializer-static.ts === +class A { +>A : Symbol(A, Decl(privateNameFieldInitializer-static.ts, 0, 0)) + + static #field = 10; +>#field : Symbol(A.#field, Decl(privateNameFieldInitializer-static.ts, 0, 9)) + + static #uninitialized; +>#uninitialized : Symbol(A.#uninitialized, Decl(privateNameFieldInitializer-static.ts, 1, 23)) +} + diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer.types b/tests/baselines/reference/privateNameStaticFieldInitializer.types new file mode 100644 index 0000000000000..dd134ee706593 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameFieldInitializer-static.ts === +class A { +>A : A + + static #field = 10; +>#field : number +>10 : 10 + + static #uninitialized; +>#uninitialized : any +} + diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js new file mode 100644 index 0000000000000..ed80b28631f79 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js @@ -0,0 +1,76 @@ +//// [privateNameStaticFieldUnaryMutation.ts] +class C { + static #test: number = 24; + constructor() { + C.#test++; + C.#test--; + ++C.#test; + --C.#test; + const a = C.#test++; + const b = C.#test--; + const c = ++C.#test; + const d = --C.#test; + for (C.#test = 0; C.#test < 10; ++C.#test) {} + for (C.#test = 0; C.#test < 10; C.#test++) {} + } + test() { + this.getClass().#test++; + this.getClass().#test--; + ++this.getClass().#test; + --this.getClass().#test; + const a = this.getClass().#test++; + const b = this.getClass().#test--; + const c = ++this.getClass().#test; + const d = --this.getClass().#test; + for (this.getClass().#test = 0; this.getClass().#test < 10; ++this.getClass().#test) {} + for (this.getClass().#test = 0; this.getClass().#test < 10; this.getClass().#test++) {} + } + getClass() { return C; } +} + + +//// [privateNameStaticFieldUnaryMutation.js] +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + propertyDescriptor.value = value; + return value; +}; +var _C_test; +class C { + constructor() { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; + __classStaticPrivateFieldSet(_a = C, C, _C_test, +__classStaticPrivateFieldGet(_a, C, _C_test) + 1); + __classStaticPrivateFieldSet(_b = C, C, _C_test, +__classStaticPrivateFieldGet(_b, C, _C_test) - 1); + __classStaticPrivateFieldSet(_c = C, C, _C_test, +__classStaticPrivateFieldGet(_c, C, _C_test) + 1); + __classStaticPrivateFieldSet(_d = C, C, _C_test, +__classStaticPrivateFieldGet(_d, C, _C_test) - 1); + const a = (__classStaticPrivateFieldSet(_e = C, C, _C_test, (_f = +__classStaticPrivateFieldGet(_e, C, _C_test)) + 1), _f); + const b = (__classStaticPrivateFieldSet(_g = C, C, _C_test, (_h = +__classStaticPrivateFieldGet(_g, C, _C_test)) - 1), _h); + const c = __classStaticPrivateFieldSet(_j = C, C, _C_test, +__classStaticPrivateFieldGet(_j, C, _C_test) + 1); + const d = __classStaticPrivateFieldSet(_k = C, C, _C_test, +__classStaticPrivateFieldGet(_k, C, _C_test) - 1); + for (__classStaticPrivateFieldSet(C, C, _C_test, 0); __classStaticPrivateFieldGet(C, C, _C_test) < 10; __classStaticPrivateFieldSet(_l = C, C, _C_test, +__classStaticPrivateFieldGet(_l, C, _C_test) + 1)) { } + for (__classStaticPrivateFieldSet(C, C, _C_test, 0); __classStaticPrivateFieldGet(C, C, _C_test) < 10; __classStaticPrivateFieldSet(_m = C, C, _C_test, +__classStaticPrivateFieldGet(_m, C, _C_test) + 1)) { } + } + test() { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; + __classStaticPrivateFieldSet(_a = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_a, C, _C_test) + 1); + __classStaticPrivateFieldSet(_b = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_b, C, _C_test) - 1); + __classStaticPrivateFieldSet(_c = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_c, C, _C_test) + 1); + __classStaticPrivateFieldSet(_d = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_d, C, _C_test) - 1); + const a = (__classStaticPrivateFieldSet(_e = this.getClass(), C, _C_test, (_f = +__classStaticPrivateFieldGet(_e, C, _C_test)) + 1), _f); + const b = (__classStaticPrivateFieldSet(_g = this.getClass(), C, _C_test, (_h = +__classStaticPrivateFieldGet(_g, C, _C_test)) - 1), _h); + const c = __classStaticPrivateFieldSet(_j = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_j, C, _C_test) + 1); + const d = __classStaticPrivateFieldSet(_k = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_k, C, _C_test) - 1); + for (__classStaticPrivateFieldSet(this.getClass(), C, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), C, _C_test) < 10; __classStaticPrivateFieldSet(_l = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_l, C, _C_test) + 1)) { } + for (__classStaticPrivateFieldSet(this.getClass(), C, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), C, _C_test) < 10; __classStaticPrivateFieldSet(_m = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_m, C, _C_test) + 1)) { } + } + getClass() { return C; } +} +_C_test = { value: 24 }; diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.symbols b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.symbols new file mode 100644 index 0000000000000..dbc298bdcce2c --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.symbols @@ -0,0 +1,148 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts === +class C { +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + static #test: number = 24; +>#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) + + constructor() { + C.#test++; +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + C.#test--; +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + ++C.#test; +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + --C.#test; +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + const a = C.#test++; +>a : Symbol(a, Decl(privateNameStaticFieldUnaryMutation.ts, 7, 13)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + const b = C.#test--; +>b : Symbol(b, Decl(privateNameStaticFieldUnaryMutation.ts, 8, 13)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + const c = ++C.#test; +>c : Symbol(c, Decl(privateNameStaticFieldUnaryMutation.ts, 9, 13)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + const d = --C.#test; +>d : Symbol(d, Decl(privateNameStaticFieldUnaryMutation.ts, 10, 13)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + for (C.#test = 0; C.#test < 10; ++C.#test) {} +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + + for (C.#test = 0; C.#test < 10; C.#test++) {} +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>C.#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) + } + test() { +>test : Symbol(C.test, Decl(privateNameStaticFieldUnaryMutation.ts, 13, 5)) + + this.getClass().#test++; +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + this.getClass().#test--; +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + ++this.getClass().#test; +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + --this.getClass().#test; +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + const a = this.getClass().#test++; +>a : Symbol(a, Decl(privateNameStaticFieldUnaryMutation.ts, 19, 13)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + const b = this.getClass().#test--; +>b : Symbol(b, Decl(privateNameStaticFieldUnaryMutation.ts, 20, 13)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + const c = ++this.getClass().#test; +>c : Symbol(c, Decl(privateNameStaticFieldUnaryMutation.ts, 21, 13)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + const d = --this.getClass().#test; +>d : Symbol(d, Decl(privateNameStaticFieldUnaryMutation.ts, 22, 13)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + for (this.getClass().#test = 0; this.getClass().#test < 10; ++this.getClass().#test) {} +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + + for (this.getClass().#test = 0; this.getClass().#test < 10; this.getClass().#test++) {} +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this.getClass().#test : Symbol(C.#test, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 9)) +>this.getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>this : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) + } + getClass() { return C; } +>getClass : Symbol(C.getClass, Decl(privateNameStaticFieldUnaryMutation.ts, 25, 5)) +>C : Symbol(C, Decl(privateNameStaticFieldUnaryMutation.ts, 0, 0)) +} + diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.types b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.types new file mode 100644 index 0000000000000..893f9dd472bf8 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.types @@ -0,0 +1,199 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts === +class C { +>C : C + + static #test: number = 24; +>#test : number +>24 : 24 + + constructor() { + C.#test++; +>C.#test++ : number +>C.#test : number +>C : typeof C + + C.#test--; +>C.#test-- : number +>C.#test : number +>C : typeof C + + ++C.#test; +>++C.#test : number +>C.#test : number +>C : typeof C + + --C.#test; +>--C.#test : number +>C.#test : number +>C : typeof C + + const a = C.#test++; +>a : number +>C.#test++ : number +>C.#test : number +>C : typeof C + + const b = C.#test--; +>b : number +>C.#test-- : number +>C.#test : number +>C : typeof C + + const c = ++C.#test; +>c : number +>++C.#test : number +>C.#test : number +>C : typeof C + + const d = --C.#test; +>d : number +>--C.#test : number +>C.#test : number +>C : typeof C + + for (C.#test = 0; C.#test < 10; ++C.#test) {} +>C.#test = 0 : 0 +>C.#test : number +>C : typeof C +>0 : 0 +>C.#test < 10 : boolean +>C.#test : number +>C : typeof C +>10 : 10 +>++C.#test : number +>C.#test : number +>C : typeof C + + for (C.#test = 0; C.#test < 10; C.#test++) {} +>C.#test = 0 : 0 +>C.#test : number +>C : typeof C +>0 : 0 +>C.#test < 10 : boolean +>C.#test : number +>C : typeof C +>10 : 10 +>C.#test++ : number +>C.#test : number +>C : typeof C + } + test() { +>test : () => void + + this.getClass().#test++; +>this.getClass().#test++ : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + this.getClass().#test--; +>this.getClass().#test-- : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + ++this.getClass().#test; +>++this.getClass().#test : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + --this.getClass().#test; +>--this.getClass().#test : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + const a = this.getClass().#test++; +>a : number +>this.getClass().#test++ : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + const b = this.getClass().#test--; +>b : number +>this.getClass().#test-- : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + const c = ++this.getClass().#test; +>c : number +>++this.getClass().#test : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + const d = --this.getClass().#test; +>d : number +>--this.getClass().#test : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + for (this.getClass().#test = 0; this.getClass().#test < 10; ++this.getClass().#test) {} +>this.getClass().#test = 0 : 0 +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C +>0 : 0 +>this.getClass().#test < 10 : boolean +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C +>10 : 10 +>++this.getClass().#test : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + + for (this.getClass().#test = 0; this.getClass().#test < 10; this.getClass().#test++) {} +>this.getClass().#test = 0 : 0 +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C +>0 : 0 +>this.getClass().#test < 10 : boolean +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C +>10 : 10 +>this.getClass().#test++ : number +>this.getClass().#test : number +>this.getClass() : typeof C +>this.getClass : () => typeof C +>this : this +>getClass : () => typeof C + } + getClass() { return C; } +>getClass : () => typeof C +>C : typeof C +} + diff --git a/tests/baselines/reference/privateNameStaticMethod.errors.txt b/tests/baselines/reference/privateNameStaticMethod.errors.txt new file mode 100644 index 0000000000000..c5f2e10bc0c56 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethod.errors.txt @@ -0,0 +1,22 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts(7,20): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts(8,12): error TS2554: Expected 1 arguments, but got 0. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts (2 errors) ==== + class A1 { + static #method(param: string): string { + return ""; + } + constructor() { + A1.#method("") + A1.#method(1) // Error + ~ +!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. + A1.#method() // Error + ~~~~~~~~~ +!!! error TS2554: Expected 1 arguments, but got 0. +!!! related TS6210 tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts:2:20: An argument for 'param' was not provided. + + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticMethod.js b/tests/baselines/reference/privateNameStaticMethod.js new file mode 100644 index 0000000000000..df59439c5d12b --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethod.js @@ -0,0 +1,34 @@ +//// [privateNameStaticMethod.ts] +class A1 { + static #method(param: string): string { + return ""; + } + constructor() { + A1.#method("") + A1.#method(1) // Error + A1.#method() // Error + + } +} + + +//// [privateNameStaticMethod.js] +"use strict"; +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _A1_method; +class A1 { + constructor() { + __classStaticPrivateMethodGet(A1, A1, _A1_method).call(A1, ""); + __classStaticPrivateMethodGet(A1, A1, _A1_method).call(A1, 1); // Error + __classStaticPrivateMethodGet(A1, A1, _A1_method).call(// Error + A1); // Error + } +} +_A1_method = function _A1_method(param) { + return ""; +}; diff --git a/tests/baselines/reference/privateNameStaticMethod.symbols b/tests/baselines/reference/privateNameStaticMethod.symbols new file mode 100644 index 0000000000000..5773a754a476c --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethod.symbols @@ -0,0 +1,26 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts === +class A1 { +>A1 : Symbol(A1, Decl(privateNameStaticMethod.ts, 0, 0)) + + static #method(param: string): string { +>#method : Symbol(A1.#method, Decl(privateNameStaticMethod.ts, 0, 10)) +>param : Symbol(param, Decl(privateNameStaticMethod.ts, 1, 19)) + + return ""; + } + constructor() { + A1.#method("") +>A1.#method : Symbol(A1.#method, Decl(privateNameStaticMethod.ts, 0, 10)) +>A1 : Symbol(A1, Decl(privateNameStaticMethod.ts, 0, 0)) + + A1.#method(1) // Error +>A1.#method : Symbol(A1.#method, Decl(privateNameStaticMethod.ts, 0, 10)) +>A1 : Symbol(A1, Decl(privateNameStaticMethod.ts, 0, 0)) + + A1.#method() // Error +>A1.#method : Symbol(A1.#method, Decl(privateNameStaticMethod.ts, 0, 10)) +>A1 : Symbol(A1, Decl(privateNameStaticMethod.ts, 0, 0)) + + } +} + diff --git a/tests/baselines/reference/privateNameStaticMethod.types b/tests/baselines/reference/privateNameStaticMethod.types new file mode 100644 index 0000000000000..5e3455150d081 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethod.types @@ -0,0 +1,32 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts === +class A1 { +>A1 : A1 + + static #method(param: string): string { +>#method : (param: string) => string +>param : string + + return ""; +>"" : "" + } + constructor() { + A1.#method("") +>A1.#method("") : string +>A1.#method : (param: string) => string +>A1 : typeof A1 +>"" : "" + + A1.#method(1) // Error +>A1.#method(1) : string +>A1.#method : (param: string) => string +>A1 : typeof A1 +>1 : 1 + + A1.#method() // Error +>A1.#method() : string +>A1.#method : (param: string) => string +>A1 : typeof A1 + + } +} + diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt b/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt new file mode 100644 index 0000000000000..43a2938b6fbf1 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt @@ -0,0 +1,30 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(4,12): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(5,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(6,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(7,18): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(9,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts (5 errors) ==== + class A3 { + static #method() { }; + constructor(a: typeof A3, b: any) { + A3.#method = () => {} // Error, not writable + ~~~~~~~ +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + a.#method = () => { }; // Error, not writable + ~~~~~~~ +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + b.#method = () => { } //Error, not writable + ~~~~~~~ +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + ({ x: A3.#method } = { x: () => {}}); //Error, not writable + ~~~~~~~ +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + let x = A3.#method; + b.#method++ //Error, not writable + ~~~~~~~ +!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.js b/tests/baselines/reference/privateNameStaticMethodAssignment.js new file mode 100644 index 0000000000000..9271a62906b5d --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.js @@ -0,0 +1,40 @@ +//// [privateNameStaticMethodAssignment.ts] +class A3 { + static #method() { }; + constructor(a: typeof A3, b: any) { + A3.#method = () => {} // Error, not writable + a.#method = () => { }; // Error, not writable + b.#method = () => { } //Error, not writable + ({ x: A3.#method } = { x: () => {}}); //Error, not writable + let x = A3.#method; + b.#method++ //Error, not writable + } +} + + +//// [privateNameStaticMethodAssignment.js] +var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { + throw new TypeError("Private static element is not writable"); +}; +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _A3_method; +class A3 { + constructor(a, b) { + var _a; + __classStaticPrivateReadonly(A3, () => { }); // Error, not writable + __classStaticPrivateReadonly(// Error, not writable + a, () => { }); // Error, not writable + __classStaticPrivateReadonly(// Error, not writable + b, () => { }); //Error, not writable + ({ x: ({ set value(_a) { __classStaticPrivateReadonly(A3, _a); } }).value } = { x: () => { } }); //Error, not writable + let x = __classStaticPrivateMethodGet(A3, A3, _A3_method); + __classStaticPrivateReadonly(_a = b, +__classStaticPrivateMethodGet(_a, A3, _A3_method) + 1); //Error, not writable + } + ; +} +_A3_method = function _A3_method() { }; diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.symbols b/tests/baselines/reference/privateNameStaticMethodAssignment.symbols new file mode 100644 index 0000000000000..778730246452e --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.symbols @@ -0,0 +1,39 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts === +class A3 { +>A3 : Symbol(A3, Decl(privateNameStaticMethodAssignment.ts, 0, 0)) + + static #method() { }; +>#method : Symbol(A3.#method, Decl(privateNameStaticMethodAssignment.ts, 0, 10)) + + constructor(a: typeof A3, b: any) { +>a : Symbol(a, Decl(privateNameStaticMethodAssignment.ts, 2, 16)) +>A3 : Symbol(A3, Decl(privateNameStaticMethodAssignment.ts, 0, 0)) +>b : Symbol(b, Decl(privateNameStaticMethodAssignment.ts, 2, 29)) + + A3.#method = () => {} // Error, not writable +>A3.#method : Symbol(A3.#method, Decl(privateNameStaticMethodAssignment.ts, 0, 10)) +>A3 : Symbol(A3, Decl(privateNameStaticMethodAssignment.ts, 0, 0)) + + a.#method = () => { }; // Error, not writable +>a.#method : Symbol(A3.#method, Decl(privateNameStaticMethodAssignment.ts, 0, 10)) +>a : Symbol(a, Decl(privateNameStaticMethodAssignment.ts, 2, 16)) + + b.#method = () => { } //Error, not writable +>b : Symbol(b, Decl(privateNameStaticMethodAssignment.ts, 2, 29)) + + ({ x: A3.#method } = { x: () => {}}); //Error, not writable +>x : Symbol(x, Decl(privateNameStaticMethodAssignment.ts, 6, 10)) +>A3.#method : Symbol(A3.#method, Decl(privateNameStaticMethodAssignment.ts, 0, 10)) +>A3 : Symbol(A3, Decl(privateNameStaticMethodAssignment.ts, 0, 0)) +>x : Symbol(x, Decl(privateNameStaticMethodAssignment.ts, 6, 30)) + + let x = A3.#method; +>x : Symbol(x, Decl(privateNameStaticMethodAssignment.ts, 7, 11)) +>A3.#method : Symbol(A3.#method, Decl(privateNameStaticMethodAssignment.ts, 0, 10)) +>A3 : Symbol(A3, Decl(privateNameStaticMethodAssignment.ts, 0, 0)) + + b.#method++ //Error, not writable +>b : Symbol(b, Decl(privateNameStaticMethodAssignment.ts, 2, 29)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.types b/tests/baselines/reference/privateNameStaticMethodAssignment.types new file mode 100644 index 0000000000000..927ecd2de79c0 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.types @@ -0,0 +1,53 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts === +class A3 { +>A3 : A3 + + static #method() { }; +>#method : () => void + + constructor(a: typeof A3, b: any) { +>a : typeof A3 +>A3 : typeof A3 +>b : any + + A3.#method = () => {} // Error, not writable +>A3.#method = () => {} : () => void +>A3.#method : () => void +>A3 : typeof A3 +>() => {} : () => void + + a.#method = () => { }; // Error, not writable +>a.#method = () => { } : () => void +>a.#method : () => void +>a : typeof A3 +>() => { } : () => void + + b.#method = () => { } //Error, not writable +>b.#method = () => { } : () => void +>b.#method : any +>b : any +>() => { } : () => void + + ({ x: A3.#method } = { x: () => {}}); //Error, not writable +>({ x: A3.#method } = { x: () => {}}) : { x: () => void; } +>{ x: A3.#method } = { x: () => {}} : { x: () => void; } +>{ x: A3.#method } : { x: () => void; } +>x : () => void +>A3.#method : () => void +>A3 : typeof A3 +>{ x: () => {}} : { x: () => void; } +>x : () => void +>() => {} : () => void + + let x = A3.#method; +>x : () => void +>A3.#method : () => void +>A3 : typeof A3 + + b.#method++ //Error, not writable +>b.#method++ : number +>b.#method : any +>b : any + } +} + diff --git a/tests/baselines/reference/privateNameStaticMethodAsync.errors.txt b/tests/baselines/reference/privateNameStaticMethodAsync.errors.txt new file mode 100644 index 0000000000000..26cd65be3ceea --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAsync.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts(11,11): error TS1029: 'static' modifier must precede 'async' modifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts (1 errors) ==== + const C = class { + static async #bar() { return await Promise.resolve(42); } + static async foo() { + const b = await this.#bar(); + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); + } + static *#baz() { yield 42; } + static async *#qux() { + yield (await Promise.resolve(42)); + } + async static *#bazBad() { yield 42; } + ~~~~~~ +!!! error TS1029: 'static' modifier must precede 'async' modifier. + } + + + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticMethodAsync.js b/tests/baselines/reference/privateNameStaticMethodAsync.js new file mode 100644 index 0000000000000..5cb7c6fc8c2d9 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAsync.js @@ -0,0 +1,38 @@ +//// [privateNameStaticMethodAsync.ts] +const C = class { + static async #bar() { return await Promise.resolve(42); } + static async foo() { + const b = await this.#bar(); + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); + } + static *#baz() { yield 42; } + static async *#qux() { + yield (await Promise.resolve(42)); + } + async static *#bazBad() { yield 42; } +} + + + + +//// [privateNameStaticMethodAsync.js] +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _a, _C_bar, _C_baz, _C_qux, _C_bazBad; +const C = (_a = class { + static async foo() { + const b = await __classStaticPrivateMethodGet(this, _a, _C_bar).call(this); + return b + (__classStaticPrivateMethodGet(this, _a, _C_baz).call(this).next().value || 0) + ((await __classStaticPrivateMethodGet(this, _a, _C_qux).call(this).next()).value || 0); + } + }, + _C_bar = async function _C_bar() { return await Promise.resolve(42); }, + _C_baz = function* _C_baz() { yield 42; }, + _C_qux = async function* _C_qux() { + yield (await Promise.resolve(42)); + }, + _C_bazBad = async function* _C_bazBad() { yield 42; }, + _a); diff --git a/tests/baselines/reference/privateNameStaticMethodAsync.symbols b/tests/baselines/reference/privateNameStaticMethodAsync.symbols new file mode 100644 index 0000000000000..0e13961283a06 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAsync.symbols @@ -0,0 +1,50 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts === +const C = class { +>C : Symbol(C, Decl(privateNameStaticMethodAsync.ts, 0, 5)) + + static async #bar() { return await Promise.resolve(42); } +>#bar : Symbol(C.#bar, Decl(privateNameStaticMethodAsync.ts, 0, 17)) +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + + static async foo() { +>foo : Symbol(C.foo, Decl(privateNameStaticMethodAsync.ts, 1, 61)) + + const b = await this.#bar(); +>b : Symbol(b, Decl(privateNameStaticMethodAsync.ts, 3, 13)) +>this.#bar : Symbol(C.#bar, Decl(privateNameStaticMethodAsync.ts, 0, 17)) +>this : Symbol(C, Decl(privateNameStaticMethodAsync.ts, 0, 9)) + + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); +>b : Symbol(b, Decl(privateNameStaticMethodAsync.ts, 3, 13)) +>this.#baz().next().value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>this.#baz().next : Symbol(Generator.next, Decl(lib.es2015.generator.d.ts, --, --)) +>this.#baz : Symbol(C.#baz, Decl(privateNameStaticMethodAsync.ts, 5, 5)) +>this : Symbol(C, Decl(privateNameStaticMethodAsync.ts, 0, 9)) +>next : Symbol(Generator.next, Decl(lib.es2015.generator.d.ts, --, --)) +>value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>(await this.#qux().next()).value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>this.#qux().next : Symbol(AsyncGenerator.next, Decl(lib.es2018.asyncgenerator.d.ts, --, --)) +>this.#qux : Symbol(C.#qux, Decl(privateNameStaticMethodAsync.ts, 6, 32)) +>this : Symbol(C, Decl(privateNameStaticMethodAsync.ts, 0, 9)) +>next : Symbol(AsyncGenerator.next, Decl(lib.es2018.asyncgenerator.d.ts, --, --)) +>value : Symbol(value, Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) + } + static *#baz() { yield 42; } +>#baz : Symbol(C.#baz, Decl(privateNameStaticMethodAsync.ts, 5, 5)) + + static async *#qux() { +>#qux : Symbol(C.#qux, Decl(privateNameStaticMethodAsync.ts, 6, 32)) + + yield (await Promise.resolve(42)); +>Promise.resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) +>Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2018.promise.d.ts, --, --)) +>resolve : Symbol(PromiseConstructor.resolve, Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) + } + async static *#bazBad() { yield 42; } +>#bazBad : Symbol(C.#bazBad, Decl(privateNameStaticMethodAsync.ts, 9, 5)) +} + + + diff --git a/tests/baselines/reference/privateNameStaticMethodAsync.types b/tests/baselines/reference/privateNameStaticMethodAsync.types new file mode 100644 index 0000000000000..6da52fd602fc2 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodAsync.types @@ -0,0 +1,79 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts === +const C = class { +>C : typeof C +>class { static async #bar() { return await Promise.resolve(42); } static async foo() { const b = await this.#bar(); return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); } static *#baz() { yield 42; } static async *#qux() { yield (await Promise.resolve(42)); } async static *#bazBad() { yield 42; }} : typeof C + + static async #bar() { return await Promise.resolve(42); } +>#bar : () => Promise +>await Promise.resolve(42) : number +>Promise.resolve(42) : Promise +>Promise.resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>Promise : PromiseConstructor +>resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>42 : 42 + + static async foo() { +>foo : () => Promise + + const b = await this.#bar(); +>b : number +>await this.#bar() : number +>this.#bar() : Promise +>this.#bar : () => Promise +>this : typeof C + + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); +>b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0) : number +>b + (this.#baz().next().value || 0) : number +>b : number +>(this.#baz().next().value || 0) : number +>this.#baz().next().value || 0 : number +>this.#baz().next().value : number | void +>this.#baz().next() : IteratorResult +>this.#baz().next : (...args: [] | [unknown]) => IteratorResult +>this.#baz() : Generator +>this.#baz : () => Generator +>this : typeof C +>next : (...args: [] | [unknown]) => IteratorResult +>value : number | void +>0 : 0 +>((await this.#qux().next()).value || 0) : number +>(await this.#qux().next()).value || 0 : number +>(await this.#qux().next()).value : number | void +>(await this.#qux().next()) : IteratorResult +>await this.#qux().next() : IteratorResult +>this.#qux().next() : Promise> +>this.#qux().next : (...args: [] | [unknown]) => Promise> +>this.#qux() : AsyncGenerator +>this.#qux : () => AsyncGenerator +>this : typeof C +>next : (...args: [] | [unknown]) => Promise> +>value : number | void +>0 : 0 + } + static *#baz() { yield 42; } +>#baz : () => Generator +>yield 42 : any +>42 : 42 + + static async *#qux() { +>#qux : () => AsyncGenerator + + yield (await Promise.resolve(42)); +>yield (await Promise.resolve(42)) : any +>(await Promise.resolve(42)) : number +>await Promise.resolve(42) : number +>Promise.resolve(42) : Promise +>Promise.resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>Promise : PromiseConstructor +>resolve : { (): Promise; (value: T | PromiseLike): Promise; } +>42 : 42 + } + async static *#bazBad() { yield 42; } +>#bazBad : () => AsyncGenerator +>yield 42 : any +>42 : 42 +} + + + diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.js b/tests/baselines/reference/privateNameStaticMethodCallExpression.js new file mode 100644 index 0000000000000..0ca367948c498 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.js @@ -0,0 +1,56 @@ +//// [privateNameStaticMethodCallExpression.ts] +class AA { + static #method() { this.x = 10; }; + static #method2(a, ...b) {}; + static x = 1; + test() { + AA.#method(); + const func = AA.#method; + func(); + new AA.#method(); + + const arr = [ 1, 2 ]; + AA.#method2(0, ...arr, 3); + + const b = new AA.#method2(0, ...arr, 3); //Error + const str = AA.#method2`head${1}middle${2}tail`; + AA.getClass().#method2`test${1}and${2}`; + + AA.getClass().#method2(0, ...arr, 3); + const b2 = new (AA.getClass().#method2)(0, ...arr, 3); //Error + const str2 = AA.getClass().#method2`head${1}middle${2}tail`; + } + static getClass() { return AA; } +} + + +//// [privateNameStaticMethodCallExpression.js] +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _AA_method, _AA_method2; +class AA { + ; + ; + test() { + var _a, _b, _c; + __classStaticPrivateMethodGet(AA, AA, _AA_method).call(AA); + const func = __classStaticPrivateMethodGet(AA, AA, _AA_method); + func(); + new (__classStaticPrivateMethodGet(AA, AA, _AA_method))(); + const arr = [1, 2]; + __classStaticPrivateMethodGet(AA, AA, _AA_method2).call(AA, 0, ...arr, 3); + const b = new (__classStaticPrivateMethodGet(AA, AA, _AA_method2))(0, ...arr, 3); //Error + const str = __classStaticPrivateMethodGet(AA, AA, _AA_method2).bind(AA) `head${1}middle${2}tail`; + __classStaticPrivateMethodGet((_a = AA.getClass()), AA, _AA_method2).bind(_a) `test${1}and${2}`; + __classStaticPrivateMethodGet((_b = AA.getClass()), AA, _AA_method2).call(_b, 0, ...arr, 3); + const b2 = new (__classStaticPrivateMethodGet(AA.getClass(), AA, _AA_method2))(0, ...arr, 3); //Error + const str2 = __classStaticPrivateMethodGet((_c = AA.getClass()), AA, _AA_method2).bind(_c) `head${1}middle${2}tail`; + } + static getClass() { return AA; } +} +_AA_method = function _AA_method() { this.x = 10; }, _AA_method2 = function _AA_method2(a, ...b) { }; +AA.x = 1; diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.symbols b/tests/baselines/reference/privateNameStaticMethodCallExpression.symbols new file mode 100644 index 0000000000000..b661493cd69cf --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.symbols @@ -0,0 +1,89 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts === +class AA { +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) + + static #method() { this.x = 10; }; +>#method : Symbol(AA.#method, Decl(privateNameStaticMethodCallExpression.ts, 0, 10)) +>this.x : Symbol(AA.x, Decl(privateNameStaticMethodCallExpression.ts, 2, 32)) +>this : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>x : Symbol(AA.x, Decl(privateNameStaticMethodCallExpression.ts, 2, 32)) + + static #method2(a, ...b) {}; +>#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>a : Symbol(a, Decl(privateNameStaticMethodCallExpression.ts, 2, 20)) +>b : Symbol(b, Decl(privateNameStaticMethodCallExpression.ts, 2, 22)) + + static x = 1; +>x : Symbol(AA.x, Decl(privateNameStaticMethodCallExpression.ts, 2, 32)) + + test() { +>test : Symbol(AA.test, Decl(privateNameStaticMethodCallExpression.ts, 3, 17)) + + AA.#method(); +>AA.#method : Symbol(AA.#method, Decl(privateNameStaticMethodCallExpression.ts, 0, 10)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) + + const func = AA.#method; +>func : Symbol(func, Decl(privateNameStaticMethodCallExpression.ts, 6, 13)) +>AA.#method : Symbol(AA.#method, Decl(privateNameStaticMethodCallExpression.ts, 0, 10)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) + + func(); +>func : Symbol(func, Decl(privateNameStaticMethodCallExpression.ts, 6, 13)) + + new AA.#method(); +>AA.#method : Symbol(AA.#method, Decl(privateNameStaticMethodCallExpression.ts, 0, 10)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) + + const arr = [ 1, 2 ]; +>arr : Symbol(arr, Decl(privateNameStaticMethodCallExpression.ts, 10, 13)) + + AA.#method2(0, ...arr, 3); +>AA.#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticMethodCallExpression.ts, 10, 13)) + + const b = new AA.#method2(0, ...arr, 3); //Error +>b : Symbol(b, Decl(privateNameStaticMethodCallExpression.ts, 13, 13)) +>AA.#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>arr : Symbol(arr, Decl(privateNameStaticMethodCallExpression.ts, 10, 13)) + + const str = AA.#method2`head${1}middle${2}tail`; +>str : Symbol(str, Decl(privateNameStaticMethodCallExpression.ts, 14, 13)) +>AA.#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) + + AA.getClass().#method2`test${1}and${2}`; +>AA.getClass().#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA.getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) + + AA.getClass().#method2(0, ...arr, 3); +>AA.getClass().#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA.getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>arr : Symbol(arr, Decl(privateNameStaticMethodCallExpression.ts, 10, 13)) + + const b2 = new (AA.getClass().#method2)(0, ...arr, 3); //Error +>b2 : Symbol(b2, Decl(privateNameStaticMethodCallExpression.ts, 18, 13)) +>AA.getClass().#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA.getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>arr : Symbol(arr, Decl(privateNameStaticMethodCallExpression.ts, 10, 13)) + + const str2 = AA.getClass().#method2`head${1}middle${2}tail`; +>str2 : Symbol(str2, Decl(privateNameStaticMethodCallExpression.ts, 19, 13)) +>AA.getClass().#method2 : Symbol(AA.#method2, Decl(privateNameStaticMethodCallExpression.ts, 1, 38)) +>AA.getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +>getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) + } + static getClass() { return AA; } +>getClass : Symbol(AA.getClass, Decl(privateNameStaticMethodCallExpression.ts, 20, 5)) +>AA : Symbol(AA, Decl(privateNameStaticMethodCallExpression.ts, 0, 0)) +} + diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.types b/tests/baselines/reference/privateNameStaticMethodCallExpression.types new file mode 100644 index 0000000000000..4590b7545a873 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.types @@ -0,0 +1,131 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts === +class AA { +>AA : AA + + static #method() { this.x = 10; }; +>#method : () => void +>this.x = 10 : 10 +>this.x : number +>this : typeof AA +>x : number +>10 : 10 + + static #method2(a, ...b) {}; +>#method2 : (a: any, ...b: any[]) => void +>a : any +>b : any[] + + static x = 1; +>x : number +>1 : 1 + + test() { +>test : () => void + + AA.#method(); +>AA.#method() : void +>AA.#method : () => void +>AA : typeof AA + + const func = AA.#method; +>func : () => void +>AA.#method : () => void +>AA : typeof AA + + func(); +>func() : void +>func : () => void + + new AA.#method(); +>new AA.#method() : any +>AA.#method : () => void +>AA : typeof AA + + const arr = [ 1, 2 ]; +>arr : number[] +>[ 1, 2 ] : number[] +>1 : 1 +>2 : 2 + + AA.#method2(0, ...arr, 3); +>AA.#method2(0, ...arr, 3) : void +>AA.#method2 : (a: any, ...b: any[]) => void +>AA : typeof AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b = new AA.#method2(0, ...arr, 3); //Error +>b : any +>new AA.#method2(0, ...arr, 3) : any +>AA.#method2 : (a: any, ...b: any[]) => void +>AA : typeof AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str = AA.#method2`head${1}middle${2}tail`; +>str : void +>AA.#method2`head${1}middle${2}tail` : void +>AA.#method2 : (a: any, ...b: any[]) => void +>AA : typeof AA +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + + AA.getClass().#method2`test${1}and${2}`; +>AA.getClass().#method2`test${1}and${2}` : void +>AA.getClass().#method2 : (a: any, ...b: any[]) => void +>AA.getClass() : typeof AA +>AA.getClass : () => typeof AA +>AA : typeof AA +>getClass : () => typeof AA +>`test${1}and${2}` : "test1and2" +>1 : 1 +>2 : 2 + + AA.getClass().#method2(0, ...arr, 3); +>AA.getClass().#method2(0, ...arr, 3) : void +>AA.getClass().#method2 : (a: any, ...b: any[]) => void +>AA.getClass() : typeof AA +>AA.getClass : () => typeof AA +>AA : typeof AA +>getClass : () => typeof AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const b2 = new (AA.getClass().#method2)(0, ...arr, 3); //Error +>b2 : any +>new (AA.getClass().#method2)(0, ...arr, 3) : any +>(AA.getClass().#method2) : (a: any, ...b: any[]) => void +>AA.getClass().#method2 : (a: any, ...b: any[]) => void +>AA.getClass() : typeof AA +>AA.getClass : () => typeof AA +>AA : typeof AA +>getClass : () => typeof AA +>0 : 0 +>...arr : number +>arr : number[] +>3 : 3 + + const str2 = AA.getClass().#method2`head${1}middle${2}tail`; +>str2 : void +>AA.getClass().#method2`head${1}middle${2}tail` : void +>AA.getClass().#method2 : (a: any, ...b: any[]) => void +>AA.getClass() : typeof AA +>AA.getClass : () => typeof AA +>AA : typeof AA +>getClass : () => typeof AA +>`head${1}middle${2}tail` : "head1middle2tail" +>1 : 1 +>2 : 2 + } + static getClass() { return AA; } +>getClass : () => typeof AA +>AA : typeof AA +} + diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.errors.txt b/tests/baselines/reference/privateNameStaticMethodClassExpression.errors.txt new file mode 100644 index 0000000000000..48a7ffe7f02df --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts(9,14): error TS18013: Property '#method' is not accessible outside class 'D' because it has a private identifier. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts(10,14): error TS18013: Property '#field' is not accessible outside class 'D' because it has a private identifier. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts (2 errors) ==== + const C = class D { + static #field = D.#method(); + static #method() { return 42; } + static getClass() { return D; } + static getField() { return C.#field }; + } + + console.log(C.getClass().getField()); + C.getClass().#method; // Error + ~~~~~~~ +!!! error TS18013: Property '#method' is not accessible outside class 'D' because it has a private identifier. + C.getClass().#field; // Error + ~~~~~~ +!!! error TS18013: Property '#field' is not accessible outside class 'D' because it has a private identifier. + + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.js b/tests/baselines/reference/privateNameStaticMethodClassExpression.js new file mode 100644 index 0000000000000..1d321c7af3c59 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.js @@ -0,0 +1,39 @@ +//// [privateNameStaticMethodClassExpression.ts] +const C = class D { + static #field = D.#method(); + static #method() { return 42; } + static getClass() { return D; } + static getField() { return C.#field }; +} + +console.log(C.getClass().getField()); +C.getClass().#method; // Error +C.getClass().#field; // Error + + + +//// [privateNameStaticMethodClassExpression.js] +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return propertyDescriptor.value; +}; +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _a, _D_field, _D_method; +const C = (_a = class D { + static getClass() { return D; } + static getField() { return __classStaticPrivateFieldGet(C, _a, _D_field); } + ; + }, + _D_method = function _D_method() { return 42; }, + _D_field = { value: __classStaticPrivateMethodGet(_a, _a, _D_method).call(_a) }, + _a); +console.log(C.getClass().getField()); +C.getClass().; // Error +C.getClass().; // Error diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.symbols b/tests/baselines/reference/privateNameStaticMethodClassExpression.symbols new file mode 100644 index 0000000000000..1804076d049b0 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.symbols @@ -0,0 +1,44 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts === +const C = class D { +>C : Symbol(C, Decl(privateNameStaticMethodClassExpression.ts, 0, 5)) +>D : Symbol(D, Decl(privateNameStaticMethodClassExpression.ts, 0, 9)) + + static #field = D.#method(); +>#field : Symbol(D.#field, Decl(privateNameStaticMethodClassExpression.ts, 0, 19)) +>D.#method : Symbol(D.#method, Decl(privateNameStaticMethodClassExpression.ts, 1, 32)) +>D : Symbol(D, Decl(privateNameStaticMethodClassExpression.ts, 0, 9)) + + static #method() { return 42; } +>#method : Symbol(D.#method, Decl(privateNameStaticMethodClassExpression.ts, 1, 32)) + + static getClass() { return D; } +>getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) +>D : Symbol(D, Decl(privateNameStaticMethodClassExpression.ts, 0, 9)) + + static getField() { return C.#field }; +>getField : Symbol(D.getField, Decl(privateNameStaticMethodClassExpression.ts, 3, 35)) +>C.#field : Symbol(D.#field, Decl(privateNameStaticMethodClassExpression.ts, 0, 19)) +>C : Symbol(C, Decl(privateNameStaticMethodClassExpression.ts, 0, 5)) +} + +console.log(C.getClass().getField()); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.getClass().getField : Symbol(D.getField, Decl(privateNameStaticMethodClassExpression.ts, 3, 35)) +>C.getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) +>C : Symbol(C, Decl(privateNameStaticMethodClassExpression.ts, 0, 5)) +>getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) +>getField : Symbol(D.getField, Decl(privateNameStaticMethodClassExpression.ts, 3, 35)) + +C.getClass().#method; // Error +>C.getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) +>C : Symbol(C, Decl(privateNameStaticMethodClassExpression.ts, 0, 5)) +>getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) + +C.getClass().#field; // Error +>C.getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) +>C : Symbol(C, Decl(privateNameStaticMethodClassExpression.ts, 0, 5)) +>getClass : Symbol(D.getClass, Decl(privateNameStaticMethodClassExpression.ts, 2, 35)) + + diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.types b/tests/baselines/reference/privateNameStaticMethodClassExpression.types new file mode 100644 index 0000000000000..5144a6aeaf5b0 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.types @@ -0,0 +1,54 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts === +const C = class D { +>C : typeof D +>class D { static #field = D.#method(); static #method() { return 42; } static getClass() { return D; } static getField() { return C.#field };} : typeof D +>D : typeof D + + static #field = D.#method(); +>#field : number +>D.#method() : number +>D.#method : () => number +>D : typeof D + + static #method() { return 42; } +>#method : () => number +>42 : 42 + + static getClass() { return D; } +>getClass : () => typeof D +>D : typeof D + + static getField() { return C.#field }; +>getField : () => number +>C.#field : number +>C : typeof D +} + +console.log(C.getClass().getField()); +>console.log(C.getClass().getField()) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.getClass().getField() : number +>C.getClass().getField : () => number +>C.getClass() : typeof D +>C.getClass : () => typeof D +>C : typeof D +>getClass : () => typeof D +>getField : () => number + +C.getClass().#method; // Error +>C.getClass().#method : any +>C.getClass() : typeof D +>C.getClass : () => typeof D +>C : typeof D +>getClass : () => typeof D + +C.getClass().#field; // Error +>C.getClass().#field : any +>C.getClass() : typeof D +>C.getClass : () => typeof D +>C : typeof D +>getClass : () => typeof D + + diff --git a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js new file mode 100644 index 0000000000000..2dfb9750fed8a --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js @@ -0,0 +1,22 @@ +//// [privateNameStaticMethodInStaticFieldInit.ts] +class C { + static s = C.#method(); + static #method() { return 42; } +} + +console.log(C.s); + + +//// [privateNameStaticMethodInStaticFieldInit.js] +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _C_method; +class C { +} +_C_method = function _C_method() { return 42; }; +C.s = __classStaticPrivateMethodGet(C, C, _C_method).call(C); +console.log(C.s); diff --git a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.symbols b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.symbols new file mode 100644 index 0000000000000..94f39eb67830d --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.symbols @@ -0,0 +1,21 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts === +class C { +>C : Symbol(C, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 0)) + + static s = C.#method(); +>s : Symbol(C.s, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 9)) +>C.#method : Symbol(C.#method, Decl(privateNameStaticMethodInStaticFieldInit.ts, 1, 27)) +>C : Symbol(C, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 0)) + + static #method() { return 42; } +>#method : Symbol(C.#method, Decl(privateNameStaticMethodInStaticFieldInit.ts, 1, 27)) +} + +console.log(C.s); +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.s : Symbol(C.s, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 9)) +>C : Symbol(C, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 0)) +>s : Symbol(C.s, Decl(privateNameStaticMethodInStaticFieldInit.ts, 0, 9)) + diff --git a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.types b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.types new file mode 100644 index 0000000000000..a251b7b41b0c2 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts === +class C { +>C : C + + static s = C.#method(); +>s : number +>C.#method() : number +>C.#method : () => number +>C : typeof C + + static #method() { return 42; } +>#method : () => number +>42 : 42 +} + +console.log(C.s); +>console.log(C.s) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.s : number +>C : typeof C +>s : number + diff --git a/tests/baselines/reference/privateNameStaticsAndStaticMethods.js b/tests/baselines/reference/privateNameStaticsAndStaticMethods.js new file mode 100644 index 0000000000000..a2f814b593467 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticsAndStaticMethods.js @@ -0,0 +1,62 @@ +//// [privateNameStaticsAndStaticMethods.ts] +class A { + static #foo(a: number) {} + static async #bar(a: number) {} + static async *#baz(a: number) { + return 3; + } + static #_quux: number; + static get #quux (): number { + return this.#_quux; + } + static set #quux (val: number) { + this.#_quux = val; + } + constructor () { + A.#foo(30); + A.#bar(30); + A.#bar(30); + A.#quux = A.#quux + 1; + A.#quux++; + } +} + +class B extends A { + static #foo(a: string) {} + constructor () { + super(); + B.#foo("str"); + } +} + + +//// [privateNameStaticsAndStaticMethods.js] +"use strict"; +class A { + constructor() { + A.#foo(30); + A.#bar(30); + A.#bar(30); + A.#quux = A.#quux + 1; + A.#quux++; + } + static #foo(a) { } + static async #bar(a) { } + static async *#baz(a) { + return 3; + } + static #_quux; + static get #quux() { + return this.#_quux; + } + static set #quux(val) { + this.#_quux = val; + } +} +class B extends A { + static #foo(a) { } + constructor() { + super(); + B.#foo("str"); + } +} diff --git a/tests/baselines/reference/privateNameStaticsAndStaticMethods.symbols b/tests/baselines/reference/privateNameStaticsAndStaticMethods.symbols new file mode 100644 index 0000000000000..b12f3fa4c464d --- /dev/null +++ b/tests/baselines/reference/privateNameStaticsAndStaticMethods.symbols @@ -0,0 +1,80 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts === +class A { +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + static #foo(a: number) {} +>#foo : Symbol(A.#foo, Decl(privateNameStaticsAndStaticMethods.ts, 0, 9)) +>a : Symbol(a, Decl(privateNameStaticsAndStaticMethods.ts, 1, 16)) + + static async #bar(a: number) {} +>#bar : Symbol(A.#bar, Decl(privateNameStaticsAndStaticMethods.ts, 1, 29)) +>a : Symbol(a, Decl(privateNameStaticsAndStaticMethods.ts, 2, 22)) + + static async *#baz(a: number) { +>#baz : Symbol(A.#baz, Decl(privateNameStaticsAndStaticMethods.ts, 2, 35)) +>a : Symbol(a, Decl(privateNameStaticsAndStaticMethods.ts, 3, 23)) + + return 3; + } + static #_quux: number; +>#_quux : Symbol(A.#_quux, Decl(privateNameStaticsAndStaticMethods.ts, 5, 5)) + + static get #quux (): number { +>#quux : Symbol(A.#quux, Decl(privateNameStaticsAndStaticMethods.ts, 6, 26), Decl(privateNameStaticsAndStaticMethods.ts, 9, 5)) + + return this.#_quux; +>this.#_quux : Symbol(A.#_quux, Decl(privateNameStaticsAndStaticMethods.ts, 5, 5)) +>this : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + } + static set #quux (val: number) { +>#quux : Symbol(A.#quux, Decl(privateNameStaticsAndStaticMethods.ts, 6, 26), Decl(privateNameStaticsAndStaticMethods.ts, 9, 5)) +>val : Symbol(val, Decl(privateNameStaticsAndStaticMethods.ts, 10, 22)) + + this.#_quux = val; +>this.#_quux : Symbol(A.#_quux, Decl(privateNameStaticsAndStaticMethods.ts, 5, 5)) +>this : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) +>val : Symbol(val, Decl(privateNameStaticsAndStaticMethods.ts, 10, 22)) + } + constructor () { + A.#foo(30); +>A.#foo : Symbol(A.#foo, Decl(privateNameStaticsAndStaticMethods.ts, 0, 9)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + A.#bar(30); +>A.#bar : Symbol(A.#bar, Decl(privateNameStaticsAndStaticMethods.ts, 1, 29)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + A.#bar(30); +>A.#bar : Symbol(A.#bar, Decl(privateNameStaticsAndStaticMethods.ts, 1, 29)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + A.#quux = A.#quux + 1; +>A.#quux : Symbol(A.#quux, Decl(privateNameStaticsAndStaticMethods.ts, 6, 26), Decl(privateNameStaticsAndStaticMethods.ts, 9, 5)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) +>A.#quux : Symbol(A.#quux, Decl(privateNameStaticsAndStaticMethods.ts, 6, 26), Decl(privateNameStaticsAndStaticMethods.ts, 9, 5)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + A.#quux++; +>A.#quux : Symbol(A.#quux, Decl(privateNameStaticsAndStaticMethods.ts, 6, 26), Decl(privateNameStaticsAndStaticMethods.ts, 9, 5)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + } +} + +class B extends A { +>B : Symbol(B, Decl(privateNameStaticsAndStaticMethods.ts, 20, 1)) +>A : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + static #foo(a: string) {} +>#foo : Symbol(B.#foo, Decl(privateNameStaticsAndStaticMethods.ts, 22, 19)) +>a : Symbol(a, Decl(privateNameStaticsAndStaticMethods.ts, 23, 16)) + + constructor () { + super(); +>super : Symbol(A, Decl(privateNameStaticsAndStaticMethods.ts, 0, 0)) + + B.#foo("str"); +>B.#foo : Symbol(B.#foo, Decl(privateNameStaticsAndStaticMethods.ts, 22, 19)) +>B : Symbol(B, Decl(privateNameStaticsAndStaticMethods.ts, 20, 1)) + } +} + diff --git a/tests/baselines/reference/privateNameStaticsAndStaticMethods.types b/tests/baselines/reference/privateNameStaticsAndStaticMethods.types new file mode 100644 index 0000000000000..c9e37e68f5134 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticsAndStaticMethods.types @@ -0,0 +1,95 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts === +class A { +>A : A + + static #foo(a: number) {} +>#foo : (a: number) => void +>a : number + + static async #bar(a: number) {} +>#bar : (a: number) => Promise +>a : number + + static async *#baz(a: number) { +>#baz : (a: number) => AsyncGenerator +>a : number + + return 3; +>3 : 3 + } + static #_quux: number; +>#_quux : number + + static get #quux (): number { +>#quux : number + + return this.#_quux; +>this.#_quux : number +>this : typeof A + } + static set #quux (val: number) { +>#quux : number +>val : number + + this.#_quux = val; +>this.#_quux = val : number +>this.#_quux : number +>this : typeof A +>val : number + } + constructor () { + A.#foo(30); +>A.#foo(30) : void +>A.#foo : (a: number) => void +>A : typeof A +>30 : 30 + + A.#bar(30); +>A.#bar(30) : Promise +>A.#bar : (a: number) => Promise +>A : typeof A +>30 : 30 + + A.#bar(30); +>A.#bar(30) : Promise +>A.#bar : (a: number) => Promise +>A : typeof A +>30 : 30 + + A.#quux = A.#quux + 1; +>A.#quux = A.#quux + 1 : number +>A.#quux : number +>A : typeof A +>A.#quux + 1 : number +>A.#quux : number +>A : typeof A +>1 : 1 + + A.#quux++; +>A.#quux++ : number +>A.#quux : number +>A : typeof A + } +} + +class B extends A { +>B : B +>A : A + + static #foo(a: string) {} +>#foo : (a: string) => void +>a : string + + constructor () { + super(); +>super() : void +>super : typeof A + + B.#foo("str"); +>B.#foo("str") : void +>B.#foo : (a: string) => void +>B : typeof B +>"str" : "str" + } +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts index 099e734594684..c12dc3032b775 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts @@ -2,9 +2,13 @@ // @target: es6 class A { - #foo = true; + #foo = true; + static #baz = 10; + static #m() {} method(thing: any) { thing.#foo; // OK + thing.#m(); + thing.#bar; thing.#bar; // Error } }; diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts index 9fed89d65499a..20185b3185c45 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAndObjectRestSpread.ts @@ -3,11 +3,17 @@ class C { #prop = 1; + static #propStatic = 1; method(other: C) { const obj = { ...other }; obj.#prop; const { ...rest } = other; rest.#prop; + + const statics = { ... C}; + statics.#propStatic + const { ...sRest } = C; + sRest.#propStatic; } } \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts new file mode 100644 index 0000000000000..5f3c20210be0e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessors.ts @@ -0,0 +1,16 @@ +// @strict: true +// @target: es6 + +class A1 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + static get #roProp() { return ""; } + + constructor(name: string) { + A1.#prop = ""; + A1.#roProp = ""; // Error + console.log(A1.#prop); + console.log(A1.#roProp); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts new file mode 100644 index 0000000000000..d57ae7893813b --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsAccess.ts @@ -0,0 +1,27 @@ +// @target: es2015 +export {} +class A2 { + static get #prop() { return ""; } + static set #prop(param: string) { } + + constructor() { + console.log(A2.#prop); + let a: typeof A2 = A2; + a.#prop; + function foo (){ + a.#prop; + } + } +} + +A2.#prop; // Error + +function foo (){ + A2.#prop; // Error +} + +class B2 { + m() { + A2.#prop; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts new file mode 100644 index 0000000000000..ac5a5ade7e3d2 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorsCallExpression.ts @@ -0,0 +1,20 @@ +// @target: es2015 + +class A { + static get #fieldFunc() { return function() { A.#x = 10; } } + static get #fieldFunc2() { return function(a, ...b) {}; } + static #x = 1; + static test() { + this.#fieldFunc(); + const func = this.#fieldFunc; + func(); + new this.#fieldFunc(); + + const arr = [ 1, 2 ]; + this.#fieldFunc2(0, ...arr, 3); + const b = new this.#fieldFunc2(0, ...arr, 3); + const str = this.#fieldFunc2`head${1}middle${2}tail`; + this.getClass().#fieldFunc2`test${1}and${2}`; + } + static getClass() { return A; } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts new file mode 100644 index 0000000000000..80d81fed1f326 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAccessorssDerivedClasses.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +class Base { + static get #prop(): number { return 123; } + static method(x: typeof Derived) { + console.log(x.#prop); + } +} +class Derived extends Base { + static method(x: typeof Derived) { + console.log(x.#prop); + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts new file mode 100644 index 0000000000000..f163ab8cf1263 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts @@ -0,0 +1,7 @@ +// @target: esnext, es2015 + +class A { + static #foo = 1; + static #prop = 2; +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts new file mode 100644 index 0000000000000..8aea7860b7292 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAccess.ts @@ -0,0 +1,9 @@ +// @target: es2015 + +class A { + static #myField = "hello world"; + constructor() { + console.log(A.#myField); //Ok + console.log(this.#myField); //Error + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts new file mode 100644 index 0000000000000..76428f33cb435 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldAssignment.ts @@ -0,0 +1,36 @@ +// @target: es2015 + +class A { + static #field = 0; + constructor() { + A.#field = 1; + A.#field += 2; + A.#field -= 3; + A.#field /= 4; + A.#field *= 5; + A.#field **= 6; + A.#field %= 7; + A.#field <<= 8; + A.#field >>= 9; + A.#field >>>= 10; + A.#field &= 11; + A.#field |= 12; + A.#field ^= 13; + A.getClass().#field = 1; + A.getClass().#field += 2; + A.getClass().#field -= 3; + A.getClass().#field /= 4; + A.getClass().#field *= 5; + A.getClass().#field **= 6; + A.getClass().#field %= 7; + A.getClass().#field <<= 8; + A.getClass().#field >>= 9; + A.getClass().#field >>>= 10; + A.getClass().#field &= 11; + A.getClass().#field |= 12; + A.getClass().#field ^= 13; + } + static getClass() { + return A; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts new file mode 100644 index 0000000000000..723a36842c7f7 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldCallExpression.ts @@ -0,0 +1,21 @@ +// @target: es2015 + +class A { + static #fieldFunc = function () { this.x = 10; }; + static #fieldFunc2 = function (a, ...b) {}; + x = 1; + test() { + A.#fieldFunc(); + A.#fieldFunc?.(); + const func = A.#fieldFunc; + func(); + new A.#fieldFunc(); + + const arr = [ 1, 2 ]; + A.#fieldFunc2(0, ...arr, 3); + const b = new A.#fieldFunc2(0, ...arr, 3); + const str = A.#fieldFunc2`head${1}middle${2}tail`; + this.getClass().#fieldFunc2`test${1}and${2}`; + } + getClass() { return A; } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts new file mode 100644 index 0000000000000..b57a64ca65adb --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldClassExpression.ts @@ -0,0 +1,23 @@ +// @target: es2015 + +class B { + static #foo = class { + constructor() { + console.log("hello"); + new B.#foo2(); + } + static test = 123; + field = 10; + }; + static #foo2 = class Foo { + static otherClass = 123; + }; + + m() { + console.log(B.#foo.test) + B.#foo.test = 10; + new B.#foo().field; + } +} + + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts new file mode 100644 index 0000000000000..92024df3a074e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDerivedClasses.ts @@ -0,0 +1,17 @@ +// @target: es2015 + +class Base { + static #prop: number = 123; + static method(x: Derived) { + Derived.#derivedProp // error + Base.#prop = 10; + } +} +class Derived extends Base { + static #derivedProp: number = 10; + static method(x: Derived) { + Derived.#derivedProp + Base.#prop = 10; // error + } +} + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts new file mode 100644 index 0000000000000..2822bb8813ec9 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts @@ -0,0 +1,25 @@ +// @target: esnext, es2015 + +class A { + static #field = 1; + otherClass = A; + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + constructor() { + let y: number; + ({ x: A.#field, y } = this.testObject()); + ([A.#field, y] = this.testArray()); + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); + [A.#field, [A.#field]] = [1, [2]]; + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); + [A.#field = 2] = []; + [this.otherClass.#field = 2] = []; + } + static test(_a: typeof A) { + [_a.#field] = [2]; + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts new file mode 100644 index 0000000000000..2866eb42eded8 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts @@ -0,0 +1,6 @@ +// @target: es2015, esnext + +class A { + static #field = 10; + static #uninitialized; +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts new file mode 100644 index 0000000000000..8d37986db42a6 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldUnaryMutation.ts @@ -0,0 +1,30 @@ +// @target: es2015 + +class C { + static #test: number = 24; + constructor() { + C.#test++; + C.#test--; + ++C.#test; + --C.#test; + const a = C.#test++; + const b = C.#test--; + const c = ++C.#test; + const d = --C.#test; + for (C.#test = 0; C.#test < 10; ++C.#test) {} + for (C.#test = 0; C.#test < 10; C.#test++) {} + } + test() { + this.getClass().#test++; + this.getClass().#test--; + ++this.getClass().#test; + --this.getClass().#test; + const a = this.getClass().#test++; + const b = this.getClass().#test--; + const c = ++this.getClass().#test; + const d = --this.getClass().#test; + for (this.getClass().#test = 0; this.getClass().#test < 10; ++this.getClass().#test) {} + for (this.getClass().#test = 0; this.getClass().#test < 10; this.getClass().#test++) {} + } + getClass() { return C; } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts new file mode 100644 index 0000000000000..00b73232c4299 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethod.ts @@ -0,0 +1,14 @@ +// @strict: true +// @target: es6 + +class A1 { + static #method(param: string): string { + return ""; + } + constructor() { + A1.#method("") + A1.#method(1) // Error + A1.#method() // Error + + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts new file mode 100644 index 0000000000000..756fbe2feb59d --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +class A3 { + static #method() { }; + constructor(a: typeof A3, b: any) { + A3.#method = () => {} // Error, not writable + a.#method = () => { }; // Error, not writable + b.#method = () => { } //Error, not writable + ({ x: A3.#method } = { x: () => {}}); //Error, not writable + let x = A3.#method; + b.#method++ //Error, not writable + } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts new file mode 100644 index 0000000000000..cdfc422e36252 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAsync.ts @@ -0,0 +1,16 @@ +// @target: es2019 + +const C = class { + static async #bar() { return await Promise.resolve(42); } + static async foo() { + const b = await this.#bar(); + return b + (this.#baz().next().value || 0) + ((await this.#qux().next()).value || 0); + } + static *#baz() { yield 42; } + static async *#qux() { + yield (await Promise.resolve(42)); + } + async static *#bazBad() { yield 42; } +} + + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts new file mode 100644 index 0000000000000..8205599dc96ab --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodCallExpression.ts @@ -0,0 +1,25 @@ +// @target: es2015 + +class AA { + static #method() { this.x = 10; }; + static #method2(a, ...b) {}; + static x = 1; + test() { + AA.#method(); + const func = AA.#method; + func(); + new AA.#method(); + + const arr = [ 1, 2 ]; + AA.#method2(0, ...arr, 3); + + const b = new AA.#method2(0, ...arr, 3); //Error + const str = AA.#method2`head${1}middle${2}tail`; + AA.getClass().#method2`test${1}and${2}`; + + AA.getClass().#method2(0, ...arr, 3); + const b2 = new (AA.getClass().#method2)(0, ...arr, 3); //Error + const str2 = AA.getClass().#method2`head${1}middle${2}tail`; + } + static getClass() { return AA; } +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts new file mode 100644 index 0000000000000..1b8a5c082cc00 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodClassExpression.ts @@ -0,0 +1,13 @@ +// @target: es2015 + +const C = class D { + static #field = D.#method(); + static #method() { return 42; } + static getClass() { return D; } + static getField() { return C.#field }; +} + +console.log(C.getClass().getField()); +C.getClass().#method; // Error +C.getClass().#field; // Error + diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts new file mode 100644 index 0000000000000..826cc72624029 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodInStaticFieldInit.ts @@ -0,0 +1,8 @@ +// @target: es2015 + +class C { + static s = C.#method(); + static #method() { return 42; } +} + +console.log(C.s); diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts new file mode 100644 index 0000000000000..7cbf9f8f9992b --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticsAndStaticMethods.ts @@ -0,0 +1,33 @@ +// @strict: true +// @target: esnext +// @lib: esnext + +class A { + static #foo(a: number) {} + static async #bar(a: number) {} + static async *#baz(a: number) { + return 3; + } + static #_quux: number; + static get #quux (): number { + return this.#_quux; + } + static set #quux (val: number) { + this.#_quux = val; + } + constructor () { + A.#foo(30); + A.#bar(30); + A.#bar(30); + A.#quux = A.#quux + 1; + A.#quux++; + } +} + +class B extends A { + static #foo(a: string) {} + constructor () { + super(); + B.#foo("str"); + } +} From 964fc27efd653b48a35db07c4b39dfd2d5684e61 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Fri, 19 Feb 2021 09:40:07 +0200 Subject: [PATCH 40/68] Fixed error messages and tests after merge. --- src/compiler/diagnosticMessages.json | 2 +- .../privateNameAccessorsCallExpression.types | 4 ++-- .../baselines/reference/privateNameAndAny.js | 10 +++++----- .../privateNameMethodAssignment.errors.txt | 20 +++++++++---------- .../privateNameMethodCallExpression.types | 6 +++--- .../reference/privateNameReadonly.errors.txt | 4 ++-- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index bf21c1fb0db5e..72f10c2066c9f 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3267,7 +3267,7 @@ "Cannot assign to private method '{0}'. Private methods are not writable.": { "category": "Error", - "code": 2801 + "code": 2803 }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.types b/tests/baselines/reference/privateNameAccessorsCallExpression.types index 69810b957993c..3beb279a5cb3c 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.types +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.types @@ -73,7 +73,7 @@ class A { >this.#fieldFunc2`head${1}middle${2}tail` : void >this.#fieldFunc2 : (a: any, ...b: any[]) => void >this : this ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 @@ -84,7 +84,7 @@ class A { >this.getInstance : () => A >this : this >getInstance : () => A ->`test${1}and${2}` : "test1and2" +>`test${1}and${2}` : string >1 : 1 >2 : 2 } diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index e97c890f228f3..4a82505e7078e 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -35,18 +35,18 @@ class A { method(thing) { __classPrivateFieldGet(thing, _A_foo); // OK thing.; // Error - __classPrivateFieldGet(thing, _foo).call(// Error + __classPrivateFieldGet(thing, _A_foo).call(// Error thing); } methodU(thing) { - __classPrivateFieldGet(thing, _foo); + __classPrivateFieldGet(thing, _A_foo); thing.; - __classPrivateFieldGet(thing, _foo).call(thing); + __classPrivateFieldGet(thing, _A_foo).call(thing); } methodN(thing) { - __classPrivateFieldGet(thing, _foo); + __classPrivateFieldGet(thing, _A_foo); thing.; - __classPrivateFieldGet(thing, _foo).call(thing); + __classPrivateFieldGet(thing, _A_foo).call(thing); } } _A_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNameMethodAssignment.errors.txt b/tests/baselines/reference/privateNameMethodAssignment.errors.txt index 46d714ba467ec..41dc9f85464c2 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.errors.txt +++ b/tests/baselines/reference/privateNameMethodAssignment.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(4,14): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(5,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(6,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(7,20): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(9,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(4,14): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(5,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(6,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(7,20): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts(9,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. ==== tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment.ts (5 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/classes/members/privateNames/privateNameMethodAssignment constructor(a: A3, b: any) { this.#method = () => {} // Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. a.#method = () => { }; // Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. b.#method = () => { } //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. ({ x: this.#method } = { x: () => {}}); //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. let x = this.#method; b.#method++ //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. } } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameMethodCallExpression.types b/tests/baselines/reference/privateNameMethodCallExpression.types index 4f769429259e2..6937a06a63edd 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.types +++ b/tests/baselines/reference/privateNameMethodCallExpression.types @@ -71,7 +71,7 @@ class AA { >this.#method2`head${1}middle${2}tail` : void >this.#method2 : (a: any, ...b: any[]) => void >this : this ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 @@ -82,7 +82,7 @@ class AA { >this.getInstance : () => AA >this : this >getInstance : () => AA ->`test${1}and${2}` : "test1and2" +>`test${1}and${2}` : string >1 : 1 >2 : 2 @@ -120,7 +120,7 @@ class AA { >this.getInstance : () => AA >this : this >getInstance : () => AA ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 } diff --git a/tests/baselines/reference/privateNameReadonly.errors.txt b/tests/baselines/reference/privateNameReadonly.errors.txt index 6cdef381c04aa..a5e430833cbe6 100644 --- a/tests/baselines/reference/privateNameReadonly.errors.txt +++ b/tests/baselines/reference/privateNameReadonly.errors.txt @@ -1,5 +1,5 @@ tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,9): error TS2322: Type 'void' is not assignable to type '() => void'. -tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2801: Cannot assign to private method '#bar'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14): error TS2803: Cannot assign to private method '#bar'. Private methods are not writable. ==== tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts (2 errors) ==== @@ -10,7 +10,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameReadonly.ts(4,14 ~~~~~~~~~ !!! error TS2322: Type 'void' is not assignable to type '() => void'. ~~~~ -!!! error TS2801: Cannot assign to private method '#bar'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#bar'. Private methods are not writable. } } From 23f6c6759a95909d3cacabc5e0549d922ec41e9d Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Fri, 19 Feb 2021 10:00:47 +0200 Subject: [PATCH 41/68] Accept new baseline. --- src/compiler/transformers/classFields.ts | 4 +- .../reference/privateNameAndAny.errors.txt | 27 +++++++----- .../baselines/reference/privateNameAndAny.js | 20 +++++++-- .../reference/privateNameAndAny.symbols | 44 ++++++++++++------- .../reference/privateNameAndAny.types | 18 +++++++- ...ateNameStaticAccessorsCallExpression.types | 4 +- ...privateNameStaticFieldCallExpression.types | 4 +- ...ivateNameStaticMethodAssignment.errors.txt | 20 ++++----- ...rivateNameStaticMethodCallExpression.types | 6 +-- 9 files changed, 98 insertions(+), 49 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index bb7c67585c568..487d2fcd2e4a0 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -337,7 +337,7 @@ namespace ts { if (!shouldTransformPrivateElements && isPrivateIdentifier(node.name)) { // Initializer is elided as the field is initialized in transformConstructor. // We include initalizers for static private fields as there is no simple way to do this emit, - // and nobody is relying on the old assignment semantics for private static fields. + // and nobody is relying on the old assignment semantics for private static fields. return factory.updatePropertyDeclaration( node, /*decorators*/ undefined, @@ -796,7 +796,7 @@ namespace ts { pendingStatements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))); } - if (pendingStatements ) { + if (pendingStatements) { if (some(staticProperties)) { addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); } diff --git a/tests/baselines/reference/privateNameAndAny.errors.txt b/tests/baselines/reference/privateNameAndAny.errors.txt index 51c072c43a83e..4f409ed2df5cc 100644 --- a/tests/baselines/reference/privateNameAndAny.errors.txt +++ b/tests/baselines/reference/privateNameAndAny.errors.txt @@ -1,18 +1,25 @@ -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(5,15): error TS2339: Property '#bar' does not exist on type 'any'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(9,9): error TS2571: Object is of type 'unknown'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(10,9): error TS2571: Object is of type 'unknown'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(10,15): error TS2339: Property '#bar' does not exist on type 'any'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(11,9): error TS2571: Object is of type 'unknown'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,15): error TS2339: Property '#foo' does not exist on type 'never'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(15,15): error TS2339: Property '#bar' does not exist on type 'never'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(16,15): error TS2339: Property '#foo' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(8,15): error TS2339: Property '#bar' does not exist on type 'any'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(9,15): error TS2339: Property '#bar' does not exist on type 'any'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(13,9): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,9): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,15): error TS2339: Property '#bar' does not exist on type 'any'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(15,9): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(18,15): error TS2339: Property '#foo' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(19,15): error TS2339: Property '#bar' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(20,15): error TS2339: Property '#foo' does not exist on type 'never'. -==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (8 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (9 errors) ==== class A { - #foo = true; + #foo = true; + static #baz = 10; + static #m() {} method(thing: any) { thing.#foo; // OK + thing.#m(); + thing.#bar; + ~~~~ +!!! error TS2339: Property '#bar' does not exist on type 'any'. thing.#bar; // Error ~~~~ !!! error TS2339: Property '#bar' does not exist on type 'any'. diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index 4a82505e7078e..db0b146c8db42 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -1,8 +1,12 @@ //// [privateNameAndAny.ts] class A { - #foo = true; + #foo = true; + static #baz = 10; + static #m() {} method(thing: any) { thing.#foo; // OK + thing.#m(); + thing.#bar; thing.#bar; // Error thing.#foo(); } @@ -27,13 +31,22 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _A_foo; +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _A_foo, _A_baz, _A_m; class A { constructor() { _A_foo.set(this, true); } method(thing) { __classPrivateFieldGet(thing, _A_foo); // OK + __classStaticPrivateMethodGet(thing, A, _A_m).call(// OK + thing); + thing.; thing.; // Error __classPrivateFieldGet(thing, _A_foo).call(// Error thing); @@ -49,5 +62,6 @@ class A { __classPrivateFieldGet(thing, _A_foo).call(thing); } } -_A_foo = new WeakMap(); +_A_foo = new WeakMap(), _A_m = function _A_m() { }; +_A_baz = { value: 10 }; ; diff --git a/tests/baselines/reference/privateNameAndAny.symbols b/tests/baselines/reference/privateNameAndAny.symbols index 5a8c528e2ed9b..ace5ce1d7ef9b 100644 --- a/tests/baselines/reference/privateNameAndAny.symbols +++ b/tests/baselines/reference/privateNameAndAny.symbols @@ -2,47 +2,59 @@ class A { >A : Symbol(A, Decl(privateNameAndAny.ts, 0, 0)) - #foo = true; + #foo = true; >#foo : Symbol(A.#foo, Decl(privateNameAndAny.ts, 0, 9)) + static #baz = 10; +>#baz : Symbol(A.#baz, Decl(privateNameAndAny.ts, 1, 16)) + + static #m() {} +>#m : Symbol(A.#m, Decl(privateNameAndAny.ts, 2, 21)) + method(thing: any) { ->method : Symbol(A.method, Decl(privateNameAndAny.ts, 1, 16)) ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11)) +>method : Symbol(A.method, Decl(privateNameAndAny.ts, 3, 18)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) thing.#foo; // OK ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) + + thing.#m(); +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) + + thing.#bar; +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) thing.#bar; // Error ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) thing.#foo(); ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 2, 11)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) } methodU(thing: unknown) { ->methodU : Symbol(A.methodU, Decl(privateNameAndAny.ts, 6, 5)) ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12)) +>methodU : Symbol(A.methodU, Decl(privateNameAndAny.ts, 10, 5)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) thing.#foo; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) thing.#bar; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) thing.#foo(); ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 7, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) } methodN(thing: never) { ->methodN : Symbol(A.methodN, Decl(privateNameAndAny.ts, 11, 5)) ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12)) +>methodN : Symbol(A.methodN, Decl(privateNameAndAny.ts, 15, 5)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) thing.#foo; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) thing.#bar; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) thing.#foo(); ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 12, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) } }; diff --git a/tests/baselines/reference/privateNameAndAny.types b/tests/baselines/reference/privateNameAndAny.types index 4216626f5a73d..016debf7df0aa 100644 --- a/tests/baselines/reference/privateNameAndAny.types +++ b/tests/baselines/reference/privateNameAndAny.types @@ -2,16 +2,32 @@ class A { >A : A - #foo = true; + #foo = true; >#foo : boolean >true : true + static #baz = 10; +>#baz : number +>10 : 10 + + static #m() {} +>#m : () => void + method(thing: any) { >method : (thing: any) => void >thing : any thing.#foo; // OK >thing.#foo : any +>thing : any + + thing.#m(); +>thing.#m() : any +>thing.#m : any +>thing : any + + thing.#bar; +>thing.#bar : any >thing : any thing.#bar; // Error diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types index d7b95a9ec70a6..6ad27c928d045 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.types @@ -72,7 +72,7 @@ class A { >this.#fieldFunc2`head${1}middle${2}tail` : void >this.#fieldFunc2 : (a: any, ...b: any[]) => void >this : typeof A ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 @@ -83,7 +83,7 @@ class A { >this.getClass : () => typeof A >this : typeof A >getClass : () => typeof A ->`test${1}and${2}` : "test1and2" +>`test${1}and${2}` : string >1 : 1 >2 : 2 } diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.types b/tests/baselines/reference/privateNameStaticFieldCallExpression.types index 320520f14f814..45b26b4edd688 100644 --- a/tests/baselines/reference/privateNameStaticFieldCallExpression.types +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.types @@ -78,7 +78,7 @@ class A { >A.#fieldFunc2`head${1}middle${2}tail` : void >A.#fieldFunc2 : (a: any, ...b: any[]) => void >A : typeof A ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 @@ -89,7 +89,7 @@ class A { >this.getClass : () => typeof A >this : this >getClass : () => typeof A ->`test${1}and${2}` : "test1and2" +>`test${1}and${2}` : string >1 : 1 >2 : 2 } diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt b/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt index 43a2938b6fbf1..7f416f5181be7 100644 --- a/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(4,12): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(5,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(6,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(7,18): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. -tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(9,11): error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(4,12): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(5,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(6,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(7,18): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. +tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts(9,11): error TS2803: Cannot assign to private method '#method'. Private methods are not writable. ==== tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssignment.ts (5 errors) ==== @@ -11,20 +11,20 @@ tests/cases/conformance/classes/members/privateNames/privateNameStaticMethodAssi constructor(a: typeof A3, b: any) { A3.#method = () => {} // Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. a.#method = () => { }; // Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. b.#method = () => { } //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. ({ x: A3.#method } = { x: () => {}}); //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. let x = A3.#method; b.#method++ //Error, not writable ~~~~~~~ -!!! error TS2801: Cannot assign to private method '#method'. Private methods are not writable. +!!! error TS2803: Cannot assign to private method '#method'. Private methods are not writable. } } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.types b/tests/baselines/reference/privateNameStaticMethodCallExpression.types index 4590b7545a873..09f0ca83fa16c 100644 --- a/tests/baselines/reference/privateNameStaticMethodCallExpression.types +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.types @@ -71,7 +71,7 @@ class AA { >AA.#method2`head${1}middle${2}tail` : void >AA.#method2 : (a: any, ...b: any[]) => void >AA : typeof AA ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 @@ -82,7 +82,7 @@ class AA { >AA.getClass : () => typeof AA >AA : typeof AA >getClass : () => typeof AA ->`test${1}and${2}` : "test1and2" +>`test${1}and${2}` : string >1 : 1 >2 : 2 @@ -120,7 +120,7 @@ class AA { >AA.getClass : () => typeof AA >AA : typeof AA >getClass : () => typeof AA ->`head${1}middle${2}tail` : "head1middle2tail" +>`head${1}middle${2}tail` : string >1 : 1 >2 : 2 } From 374e6f3e40d810caa8a750f448f4d54e0d5b653e Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Fri, 19 Feb 2021 20:14:41 +0200 Subject: [PATCH 42/68] Improved duplicate identifier checks for static private class elements. --- src/compiler/checker.ts | 41 +- src/compiler/diagnosticMessages.json | 6 +- .../privateNameDuplicateField.errors.txt | 677 ++++++++++++-- .../reference/privateNameDuplicateField.js | 866 ++++++++++++++++-- .../privateNameDuplicateField.symbols | 793 ++++++++++++++-- .../reference/privateNameDuplicateField.types | 805 +++++++++++++++- .../reference/privateNamesUnique-3.errors.txt | 4 +- .../privateNames/privateNameDuplicateField.ts | 414 ++++++++- 8 files changed, 3308 insertions(+), 298 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index f131a81bd5bab..c96c626c4f91a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -240,6 +240,7 @@ namespace ts { SetAccessor = 2, PropertyAssignment = 4, Method = 8, + PrivateStatic = 16, GetOrSetAccessor = GetAccessor | SetAccessor, PropertyAssignmentOrMethod = PropertyAssignment | Method, } @@ -32131,29 +32132,32 @@ namespace ts { const isStatic = hasSyntacticModifier(member, ModifierFlags.Static); const name = member.name; if (!name) { - return; + continue; } + const isPrivate = isPrivateIdentifier(name); + const isPrivateStatic = isPrivate && isStatic ? DeclarationMeaning.PrivateStatic : 0; const names = - isPrivateIdentifier(name) ? privateIdentifiers : + isPrivate ? privateIdentifiers : isStatic ? staticNames : instanceNames; + const memberName = name && getPropertyNameForPropertyNameNode(name); if (memberName) { switch (member.kind) { case SyntaxKind.GetAccessor: - addName(names, name, memberName, DeclarationMeaning.GetAccessor); + addName(names, name, memberName, DeclarationMeaning.GetAccessor | isPrivateStatic); break; case SyntaxKind.SetAccessor: - addName(names, name, memberName, DeclarationMeaning.SetAccessor); + addName(names, name, memberName, DeclarationMeaning.SetAccessor | isPrivateStatic); break; case SyntaxKind.PropertyDeclaration: - addName(names, name, memberName, DeclarationMeaning.GetOrSetAccessor); + addName(names, name, memberName, DeclarationMeaning.GetOrSetAccessor | isPrivateStatic); break; case SyntaxKind.MethodDeclaration: - addName(names, name, memberName, DeclarationMeaning.Method); + addName(names, name, memberName, DeclarationMeaning.Method | isPrivateStatic); break; } } @@ -32163,16 +32167,25 @@ namespace ts { function addName(names: UnderscoreEscapedMap, location: Node, name: __String, meaning: DeclarationMeaning) { const prev = names.get(name); if (prev) { - if (prev & DeclarationMeaning.Method) { - if (meaning !== DeclarationMeaning.Method) { - error(location, Diagnostics.Duplicate_identifier_0, getTextOfNode(location)); - } - } - else if (prev & meaning) { - error(location, Diagnostics.Duplicate_identifier_0, getTextOfNode(location)); + // For private identifiers, do not allow mixing of static and instance members with the same name + if((prev & DeclarationMeaning.PrivateStatic) !== (meaning & DeclarationMeaning.PrivateStatic)) { + error(location, Diagnostics.Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name, getTextOfNode(location)); } else { - names.set(name, prev | meaning); + const prevIsMethod = !!(prev & DeclarationMeaning.Method); + const isMethod = !!(meaning & DeclarationMeaning.Method); + if (prevIsMethod || isMethod) { + if (prevIsMethod !== isMethod) { + error(location, Diagnostics.Duplicate_identifier_0, getTextOfNode(location)); + } + // If this is a method/method duplication is might be an overload, so this will be handled when overloads are considered + } + else if (prev & meaning & ~DeclarationMeaning.PrivateStatic) { + error(location, Diagnostics.Duplicate_identifier_0, getTextOfNode(location)); + } + else { + names.set(name, prev | meaning); + } } } else { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index ff361ffa8f74d..456bd85619c6a 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3264,11 +3264,15 @@ "category": "Error", "code": 2802 }, - "Cannot assign to private method '{0}'. Private methods are not writable.": { "category": "Error", "code": 2803 }, + "Duplicate identifier '{0}'. Static and instance elements cannot share the same private name.": { + "category": "Error", + "code": 2804 + }, + "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 diff --git a/tests/baselines/reference/privateNameDuplicateField.errors.txt b/tests/baselines/reference/privateNameDuplicateField.errors.txt index c724fd80b6713..d766021845e93 100644 --- a/tests/baselines/reference/privateNameDuplicateField.errors.txt +++ b/tests/baselines/reference/privateNameDuplicateField.errors.txt @@ -1,114 +1,657 @@ -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(3,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(7,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(8,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(13,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(14,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(18,5): error TS2393: Duplicate function implementation. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(19,5): error TS2393: Duplicate function implementation. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(24,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(25,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(30,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(31,5): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(32,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(36,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(37,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(41,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(42,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(46,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(47,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(48,9): error TS2300: Duplicate identifier '#foo'. -tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(49,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(6,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(11,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(12,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(17,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(18,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(23,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(24,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(30,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(36,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(42,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(48,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(56,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(56,9): error TS2717: Subsequent property declarations must have the same type. Property '#foo' must be of type '() => void', but here has type 'string'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(61,9): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(62,9): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(67,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(68,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(73,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(74,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(80,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(86,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(92,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(98,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(107,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(112,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(113,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(118,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(119,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(131,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(137,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(143,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(149,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(157,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(162,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(163,9): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(174,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(175,13): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(181,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(187,16): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(193,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(199,20): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(207,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(213,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(219,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(225,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(231,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(236,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(237,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(242,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(243,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(248,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(249,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(257,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(263,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(269,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(275,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(281,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(281,16): error TS2717: Subsequent property declarations must have the same type. Property '#foo' must be of type '() => void', but here has type 'string'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(286,16): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(287,16): error TS2393: Duplicate function implementation. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(292,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(293,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(298,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(299,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(308,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(314,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(320,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(326,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(331,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(332,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(337,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(338,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(343,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(344,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(357,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(363,9): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(370,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(376,13): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(382,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(387,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(388,16): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(399,20): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts(400,20): error TS2300: Duplicate identifier '#foo'. -==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (20 errors) ==== - class A { - #foo = "foo"; - #foo = "foo"; - ~~~~ +==== tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts (83 errors) ==== + function Field() { + + // Error + class A_Field_Field { + #foo = "foo"; + #foo = "foo"; + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - } + } - class A2 { - #foo = "foo"; - ~~~~ + // Error + class A_Field_Method { + #foo = "foo"; + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - #foo() {} - ~~~~ + #foo() { } + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - } - + } - class A3 { - #foo = "foo"; - ~~~~ + // Error + class A_Field_Getter { + #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - get #foo() { return ""} + } + + // Error + class A_Field_Setter { + #foo = "foo"; ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_Field_StaticField { + #foo = "foo"; + static #foo = "foo"; + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Field_StaticMethod { + #foo = "foo"; + static #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Field_StaticGetter { + #foo = "foo"; + static get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Field_StaticSetter { + #foo = "foo"; + static set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } } - class A4 { - #foo() { return ""} - ~~~~ + function Method() { + // Error + class A_Method_Field { + #foo() { } + #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + ~~~~ +!!! error TS2717: Subsequent property declarations must have the same type. Property '#foo' must be of type '() => void', but here has type 'string'. +!!! related TS6203 tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts:55:9: '#foo' was also declared here. + } + + // Error + class A_Method_Method { + #foo() { } + ~~~~ !!! error TS2393: Duplicate function implementation. - #foo() { return ""} - ~~~~ + #foo() { } + ~~~~ !!! error TS2393: Duplicate function implementation. - } - + } - class A5 { - #foo() { return ""} - ~~~~ + // Error + class A_Method_Getter { + #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - get #foo() { return ""} + } + + // Error + class A_Method_Setter { + #foo() { } ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_Method_StaticField { + #foo() { } + static #foo = "foo"; + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Method_StaticMethod { + #foo() { } + static #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Method_StaticGetter { + #foo() { } + static get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Method_StaticSetter { + #foo() { } + static set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } } - class A6 { - #foo = "foo"; - ~~~~ + function Getter() { + // Error + class A_Getter_Field { + get #foo() { return ""} + #foo = "foo"; + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - #foo() { return ""} - ~~~~ + } + + // Error + class A_Getter_Method { + get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - get #foo() { return ""} + #foo() { } ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_Getter_Getter { + get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + //OK + class A_Getter_Setter { + get #foo() { return ""} + set #foo(value: string) { } + } + + // Error + class A_Getter_StaticField { + get #foo() { return ""} + static #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Getter_StaticMethod { + get #foo() { return ""} + static #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Getter_StaticGetter { + get #foo() { return ""} + static get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Getter_StaticSetter { + get #foo() { return ""} + static set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } } - class A7 { - get #foo() { return ""; } + function Setter() { + // Error + class A_Setter_Field { + set #foo(value: string) { } + #foo = "foo"; ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - get #foo() { return ""; } + } + + // Error + class A_Setter_Method { + set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + #foo() { } ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + } + + // OK + class A_Setter_Getter { + set #foo(value: string) { } + get #foo() { return ""} + } + + // Error + class A_Setter_Setter { + set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_Setter_StaticField { + set #foo(value: string) { } + static #foo = "foo"; + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Setter_StaticMethod { + set #foo(value: string) { } + static #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Setter_StaticGetter { + set #foo(value: string) { } + static get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_Setter_StaticSetter { + set #foo(value: string) { } + static set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } } - class A8 { - set #foo(a: string) {} + function StaticField() { + // Error + class A_StaticField_Field { + static #foo = "foo"; + #foo = "foo"; ~~~~ -!!! error TS2300: Duplicate identifier '#foo'. - set #foo(a: string) {} +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticField_Method { + static #foo = "foo"; + #foo() { } ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticField_Getter { + static #foo = "foo"; + get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticField_Setter { + static #foo = "foo"; + set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticField_StaticField { + static #foo = "foo"; + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticField_StaticMethod { + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticField_StaticGetter { + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticField_StaticSetter { + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } } - class A9 { - get #foo() { return ""; } + function StaticMethod() { + // Error + class A_StaticMethod_Field { + static #foo() { } + #foo = "foo"; ~~~~ -!!! error TS2300: Duplicate identifier '#foo'. - set #foo(a: string) {} +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticMethod_Method { + static #foo() { } + #foo() { } ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticMethod_Getter { + static #foo() { } + get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticMethod_Setter { + static #foo() { } + set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticMethod_StaticField { + static #foo() { } + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + ~~~~ +!!! error TS2717: Subsequent property declarations must have the same type. Property '#foo' must be of type '() => void', but here has type 'string'. +!!! related TS6203 tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts:280:16: '#foo' was also declared here. + } + + // Error + class A_StaticMethod_StaticMethod { + static #foo() { } + ~~~~ +!!! error TS2393: Duplicate function implementation. + static #foo() { } + ~~~~ +!!! error TS2393: Duplicate function implementation. + } + + // Error + class A_StaticMethod_StaticGetter { + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - get #foo() { return ""; } + } + + // Error + class A_StaticMethod_StaticSetter { + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + } + + function StaticGetter() { + + // Error + class A_StaticGetter_Field { + static get #foo() { return ""} + #foo = "foo"; ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticGetter_Method { + static get #foo() { return ""} + #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticGetter_Getter { + static get #foo() { return ""} + get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticGetter_Setter { + static get #foo() { return ""} + set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticGetter_StaticField { + static get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticGetter_StaticMethod { + static get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticGetter_StaticGetter { + static get #foo() { return ""} + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. - set #foo(a: string) {} + static get #foo() { return ""} + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + // OK + class A_StaticGetter_StaticSetter { + static get #foo() { return ""} + static set #foo(value: string) { } + } + } + + function StaticSetter() { + // Error + class A_StaticSetter_Field { + static set #foo(value: string) { } + #foo = "foo"; ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticSetter_Method { + static set #foo(value: string) { } + #foo() { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + + // Error + class A_StaticSetter_Getter { + static set #foo(value: string) { } + get #foo() { return ""} + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticSetter_Setter { + static set #foo(value: string) { } + set #foo(value: string) { } + ~~~~ +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. + } + + // Error + class A_StaticSetter_StaticField { + static set #foo(value: string) { } + static #foo = "foo"; + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // Error + class A_StaticSetter_StaticMethod { + static set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static #foo() { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + } + + // OK + class A_StaticSetter_StaticGetter { + static set #foo(value: string) { } + static get #foo() { return ""} + } + + // Error + class A_StaticSetter_StaticSetter { + static set #foo(value: string) { } + ~~~~ +!!! error TS2300: Duplicate identifier '#foo'. + static set #foo(value: string) { } + ~~~~ !!! error TS2300: Duplicate identifier '#foo'. + } } \ No newline at end of file diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 4120187527a1f..93e0bbe2a5dc7 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -1,111 +1,837 @@ //// [privateNameDuplicateField.ts] -class A { - #foo = "foo"; - #foo = "foo"; -} +function Field() { + + // Error + class A_Field_Field { + #foo = "foo"; + #foo = "foo"; + } + + // Error + class A_Field_Method { + #foo = "foo"; + #foo() { } + } + + // Error + class A_Field_Getter { + #foo = "foo"; + get #foo() { return ""} + } + + // Error + class A_Field_Setter { + #foo = "foo"; + set #foo(value: string) { } + } + + // Error + class A_Field_StaticField { + #foo = "foo"; + static #foo = "foo"; + } + + // Error + class A_Field_StaticMethod { + #foo = "foo"; + static #foo() { } + } -class A2 { - #foo = "foo"; - #foo() {} + // Error + class A_Field_StaticGetter { + #foo = "foo"; + static get #foo() { return ""} + } + + // Error + class A_Field_StaticSetter { + #foo = "foo"; + static set #foo(value: string) { } + } } +function Method() { + // Error + class A_Method_Field { + #foo() { } + #foo = "foo"; + } + + // Error + class A_Method_Method { + #foo() { } + #foo() { } + } + + // Error + class A_Method_Getter { + #foo() { } + get #foo() { return ""} + } + + // Error + class A_Method_Setter { + #foo() { } + set #foo(value: string) { } + } + + // Error + class A_Method_StaticField { + #foo() { } + static #foo = "foo"; + } + + // Error + class A_Method_StaticMethod { + #foo() { } + static #foo() { } + } + + // Error + class A_Method_StaticGetter { + #foo() { } + static get #foo() { return ""} + } -class A3 { - #foo = "foo"; - get #foo() { return ""} + // Error + class A_Method_StaticSetter { + #foo() { } + static set #foo(value: string) { } + } } -class A4 { - #foo() { return ""} - #foo() { return ""} + +function Getter() { + // Error + class A_Getter_Field { + get #foo() { return ""} + #foo = "foo"; + } + + // Error + class A_Getter_Method { + get #foo() { return ""} + #foo() { } + } + + // Error + class A_Getter_Getter { + get #foo() { return ""} + get #foo() { return ""} + } + + //OK + class A_Getter_Setter { + get #foo() { return ""} + set #foo(value: string) { } + } + + // Error + class A_Getter_StaticField { + get #foo() { return ""} + static #foo() { } + } + + // Error + class A_Getter_StaticMethod { + get #foo() { return ""} + static #foo() { } + } + + // Error + class A_Getter_StaticGetter { + get #foo() { return ""} + static get #foo() { return ""} + } + + // Error + class A_Getter_StaticSetter { + get #foo() { return ""} + static set #foo(value: string) { } + } } +function Setter() { + // Error + class A_Setter_Field { + set #foo(value: string) { } + #foo = "foo"; + } + + // Error + class A_Setter_Method { + set #foo(value: string) { } + #foo() { } + } + + // OK + class A_Setter_Getter { + set #foo(value: string) { } + get #foo() { return ""} + } + + // Error + class A_Setter_Setter { + set #foo(value: string) { } + set #foo(value: string) { } + } + + // Error + class A_Setter_StaticField { + set #foo(value: string) { } + static #foo = "foo"; + } + + // Error + class A_Setter_StaticMethod { + set #foo(value: string) { } + static #foo() { } + } + + // Error + class A_Setter_StaticGetter { + set #foo(value: string) { } + static get #foo() { return ""} + } -class A5 { - #foo() { return ""} - get #foo() { return ""} + // Error + class A_Setter_StaticSetter { + set #foo(value: string) { } + static set #foo(value: string) { } + } } +function StaticField() { + // Error + class A_StaticField_Field { + static #foo = "foo"; + #foo = "foo"; + } -class A6 { - #foo = "foo"; - #foo() { return ""} - get #foo() { return ""} + // Error + class A_StaticField_Method { + static #foo = "foo"; + #foo() { } + } + + // Error + class A_StaticField_Getter { + static #foo = "foo"; + get #foo() { return ""} + } + + // Error + class A_StaticField_Setter { + static #foo = "foo"; + set #foo(value: string) { } + } + + // Error + class A_StaticField_StaticField { + static #foo = "foo"; + static #foo = "foo"; + } + + // Error + class A_StaticField_StaticMethod { + static #foo = "foo"; + static #foo() { } + } + + // Error + class A_StaticField_StaticGetter { + static #foo = "foo"; + static get #foo() { return ""} + } + + // Error + class A_StaticField_StaticSetter { + static #foo = "foo"; + static set #foo(value: string) { } + } } -class A7 { - get #foo() { return ""; } - get #foo() { return ""; } +function StaticMethod() { + // Error + class A_StaticMethod_Field { + static #foo() { } + #foo = "foo"; + } + + // Error + class A_StaticMethod_Method { + static #foo() { } + #foo() { } + } + + // Error + class A_StaticMethod_Getter { + static #foo() { } + get #foo() { return ""} + } + + // Error + class A_StaticMethod_Setter { + static #foo() { } + set #foo(value: string) { } + } + + // Error + class A_StaticMethod_StaticField { + static #foo() { } + static #foo = "foo"; + } + + // Error + class A_StaticMethod_StaticMethod { + static #foo() { } + static #foo() { } + } + + // Error + class A_StaticMethod_StaticGetter { + static #foo() { } + static get #foo() { return ""} + } + + // Error + class A_StaticMethod_StaticSetter { + static #foo() { } + static set #foo(value: string) { } + } } -class A8 { - set #foo(a: string) {} - set #foo(a: string) {} +function StaticGetter() { + + // Error + class A_StaticGetter_Field { + static get #foo() { return ""} + #foo = "foo"; + } + + // Error + class A_StaticGetter_Method { + static get #foo() { return ""} + #foo() { } + } + + // Error + class A_StaticGetter_Getter { + static get #foo() { return ""} + get #foo() { return ""} + } + + // Error + class A_StaticGetter_Setter { + static get #foo() { return ""} + set #foo(value: string) { } + } + + // Error + class A_StaticGetter_StaticField { + static get #foo() { return ""} + static #foo() { } + } + + // Error + class A_StaticGetter_StaticMethod { + static get #foo() { return ""} + static #foo() { } + } + + // Error + class A_StaticGetter_StaticGetter { + static get #foo() { return ""} + static get #foo() { return ""} + } + // OK + class A_StaticGetter_StaticSetter { + static get #foo() { return ""} + static set #foo(value: string) { } + } } -class A9 { - get #foo() { return ""; } - set #foo(a: string) {} - get #foo() { return ""; } - set #foo(a: string) {} +function StaticSetter() { + // Error + class A_StaticSetter_Field { + static set #foo(value: string) { } + #foo = "foo"; + } + + // Error + class A_StaticSetter_Method { + static set #foo(value: string) { } + #foo() { } + } + + + // Error + class A_StaticSetter_Getter { + static set #foo(value: string) { } + get #foo() { return ""} + } + + // Error + class A_StaticSetter_Setter { + static set #foo(value: string) { } + set #foo(value: string) { } + } + + // Error + class A_StaticSetter_StaticField { + static set #foo(value: string) { } + static #foo = "foo"; + } + + // Error + class A_StaticSetter_StaticMethod { + static set #foo(value: string) { } + static #foo() { } + } + + // OK + class A_StaticSetter_StaticGetter { + static set #foo(value: string) { } + static get #foo() { return ""} + } + + // Error + class A_StaticSetter_StaticSetter { + static set #foo(value: string) { } + static set #foo(value: string) { } + } } //// [privateNameDuplicateField.js] "use strict"; -var _A_foo, _A_foo_1, _A2_instances, _A2_foo, _A2_foo_1, _A3_instances, _A3_foo, _A3_foo_get, _A4_instances, _A4_foo, _A4_foo_1, _A5_instances, _A5_foo, _A5_foo_get, _A6_instances, _A6_foo, _A6_foo_1, _A6_foo_get, _A7_instances, _A7_foo_get, _A7_foo_get_1, _A8_instances, _A8_foo_set, _A8_foo_set_1, _A9_instances, _A9_foo_get, _A9_foo_set, _A9_foo_get_1, _A9_foo_set_1; -class A { - constructor() { - _A_foo_1.set(this, "foo"); - _A_foo_1.set(this, "foo"); +function Field() { + var _A_Field_Field_foo, _A_Field_Field_foo_1, _A_Field_Method_instances, _A_Field_Method_foo, _A_Field_Method_foo_1, _A_Field_Getter_instances, _A_Field_Getter_foo, _A_Field_Getter_foo_get, _A_Field_Setter_instances, _A_Field_Setter_foo, _A_Field_Setter_foo_set, _A_Field_StaticField_foo, _A_Field_StaticField_foo_1, _A_Field_StaticMethod_foo, _A_Field_StaticMethod_foo_1, _A_Field_StaticGetter_foo, _A_Field_StaticGetter_foo_get, _A_Field_StaticSetter_foo, _A_Field_StaticSetter_foo_set; + // Error + class A_Field_Field { + constructor() { + _A_Field_Field_foo_1.set(this, "foo"); + _A_Field_Field_foo_1.set(this, "foo"); + } } -} -_A_foo = new WeakMap(), _A_foo_1 = new WeakMap(); -class A2 { - constructor() { - _A2_instances.add(this); + _A_Field_Field_foo = new WeakMap(), _A_Field_Field_foo_1 = new WeakMap(); + // Error + class A_Field_Method { + constructor() { + _A_Field_Method_instances.add(this); + } + } + _A_Field_Method_foo = new WeakMap(), _A_Field_Method_instances = new WeakSet(), _A_Field_Method_foo_1 = function _A_Field_Method_foo_1() { }; + // Error + class A_Field_Getter { + constructor() { + _A_Field_Getter_instances.add(this); + } + } + _A_Field_Getter_foo = new WeakMap(), _A_Field_Getter_instances = new WeakSet(), _A_Field_Getter_foo_get = function _A_Field_Getter_foo_get() { return ""; }; + // Error + class A_Field_Setter { + constructor() { + _A_Field_Setter_instances.add(this); + } + } + _A_Field_Setter_foo = new WeakMap(), _A_Field_Setter_instances = new WeakSet(), _A_Field_Setter_foo_set = function _A_Field_Setter_foo_set(value) { }; + // Error + class A_Field_StaticField { + constructor() { + _A_Field_StaticField_foo_1 = { value: "foo" }; + } + } + _A_Field_StaticField_foo = new WeakMap(); + _A_Field_StaticField_foo_1 = { value: "foo" }; + // Error + class A_Field_StaticMethod { + constructor() { + } + } + _A_Field_StaticMethod_foo = new WeakMap(), _A_Field_StaticMethod_foo_1 = function _A_Field_StaticMethod_foo_1() { }; + // Error + class A_Field_StaticGetter { + constructor() { + } + } + _A_Field_StaticGetter_foo = new WeakMap(), _A_Field_StaticGetter_foo_get = function _A_Field_StaticGetter_foo_get() { return ""; }; + // Error + class A_Field_StaticSetter { + constructor() { + } } + _A_Field_StaticSetter_foo = new WeakMap(), _A_Field_StaticSetter_foo_set = function _A_Field_StaticSetter_foo_set(value) { }; } -_A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_foo_1 = function _A2_foo_1() { }; -class A3 { - constructor() { - _A3_instances.add(this); +function Method() { + var _A_Method_Field_instances, _A_Method_Field_foo, _A_Method_Field_foo_1, _A_Method_Method_instances, _A_Method_Method_foo, _A_Method_Method_foo_1, _A_Method_Getter_instances, _A_Method_Getter_foo, _A_Method_Getter_foo_get, _A_Method_Setter_instances, _A_Method_Setter_foo, _A_Method_Setter_foo_set, _A_Method_StaticField_instances, _A_Method_StaticField_foo, _A_Method_StaticField_foo_1, _A_Method_StaticMethod_instances, _A_Method_StaticMethod_foo, _A_Method_StaticMethod_foo_1, _A_Method_StaticGetter_instances, _A_Method_StaticGetter_foo, _A_Method_StaticGetter_foo_get, _A_Method_StaticSetter_instances, _A_Method_StaticSetter_foo, _A_Method_StaticSetter_foo_set; + // Error + class A_Method_Field { + constructor() { + _A_Method_Field_instances.add(this); + _A_Method_Field_foo_1.set(this, "foo"); + } + } + _A_Method_Field_foo_1 = new WeakMap(), _A_Method_Field_instances = new WeakSet(); + // Error + class A_Method_Method { + constructor() { + _A_Method_Method_instances.add(this); + } + } + _A_Method_Method_instances = new WeakSet(), _A_Method_Method_foo_1 = function _A_Method_Method_foo_1() { }, _A_Method_Method_foo_1 = function _A_Method_Method_foo_1() { }; + // Error + class A_Method_Getter { + constructor() { + _A_Method_Getter_instances.add(this); + } + } + _A_Method_Getter_instances = new WeakSet(), _A_Method_Getter_foo_get = function _A_Method_Getter_foo_get() { return ""; }; + // Error + class A_Method_Setter { + constructor() { + _A_Method_Setter_instances.add(this); + } + } + _A_Method_Setter_instances = new WeakSet(), _A_Method_Setter_foo_set = function _A_Method_Setter_foo_set(value) { }; + // Error + class A_Method_StaticField { + constructor() { + _A_Method_StaticField_instances.add(this); + } + } + _A_Method_StaticField_instances = new WeakSet(); + _A_Method_StaticField_foo_1 = { value: "foo" }; + // Error + class A_Method_StaticMethod { + constructor() { + _A_Method_StaticMethod_instances.add(this); + } + } + _A_Method_StaticMethod_instances = new WeakSet(), _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }, _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }; + // Error + class A_Method_StaticGetter { + constructor() { + _A_Method_StaticGetter_instances.add(this); + } + } + _A_Method_StaticGetter_instances = new WeakSet(), _A_Method_StaticGetter_foo_get = function _A_Method_StaticGetter_foo_get() { return ""; }; + // Error + class A_Method_StaticSetter { + constructor() { + _A_Method_StaticSetter_instances.add(this); + } } + _A_Method_StaticSetter_instances = new WeakSet(), _A_Method_StaticSetter_foo_set = function _A_Method_StaticSetter_foo_set(value) { }; } -_A3_foo = new WeakMap(), _A3_instances = new WeakSet(), _A3_foo_get = function _A3_foo_get() { return ""; }; -class A4 { - constructor() { - _A4_instances.add(this); +function Getter() { + var _A_Getter_Field_instances, _A_Getter_Field_foo_get, _A_Getter_Field_foo, _A_Getter_Method_instances, _A_Getter_Method_foo_get, _A_Getter_Method_foo, _A_Getter_Getter_instances, _A_Getter_Getter_foo_get, _A_Getter_Getter_foo_get_1, _A_Getter_Setter_instances, _A_Getter_Setter_foo_get, _A_Getter_Setter_foo_set, _A_Getter_StaticField_instances, _A_Getter_StaticField_foo_get, _A_Getter_StaticField_foo, _A_Getter_StaticMethod_instances, _A_Getter_StaticMethod_foo_get, _A_Getter_StaticMethod_foo, _A_Getter_StaticGetter_instances, _A_Getter_StaticGetter_foo_get, _A_Getter_StaticGetter_foo_get_1, _A_Getter_StaticSetter_instances, _A_Getter_StaticSetter_foo_get, _A_Getter_StaticSetter_foo_set; + // Error + class A_Getter_Field { + constructor() { + _A_Getter_Field_instances.add(this); + _A_Getter_Field_foo.set(this, "foo"); + } } + _A_Getter_Field_foo = new WeakMap(), _A_Getter_Field_instances = new WeakSet(); + // Error + class A_Getter_Method { + constructor() { + _A_Getter_Method_instances.add(this); + } + } + _A_Getter_Method_instances = new WeakSet(), _A_Getter_Method_foo = function _A_Getter_Method_foo() { return ""; }, _A_Getter_Method_foo = function _A_Getter_Method_foo() { }; + // Error + class A_Getter_Getter { + constructor() { + _A_Getter_Getter_instances.add(this); + } + } + _A_Getter_Getter_instances = new WeakSet(), _A_Getter_Getter_foo_get_1 = function _A_Getter_Getter_foo_get_1() { return ""; }, _A_Getter_Getter_foo_get_1 = function _A_Getter_Getter_foo_get_1() { return ""; }; + //OK + class A_Getter_Setter { + constructor() { + _A_Getter_Setter_instances.add(this); + } + } + _A_Getter_Setter_instances = new WeakSet(), _A_Getter_Setter_foo_get = function _A_Getter_Setter_foo_get() { return ""; }, _A_Getter_Setter_foo_set = function _A_Getter_Setter_foo_set(value) { }; + // Error + class A_Getter_StaticField { + constructor() { + _A_Getter_StaticField_instances.add(this); + } + } + _A_Getter_StaticField_instances = new WeakSet(), _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { return ""; }, _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { }; + // Error + class A_Getter_StaticMethod { + constructor() { + _A_Getter_StaticMethod_instances.add(this); + } + } + _A_Getter_StaticMethod_instances = new WeakSet(), _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { return ""; }, _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { }; + // Error + class A_Getter_StaticGetter { + constructor() { + _A_Getter_StaticGetter_instances.add(this); + } + } + _A_Getter_StaticGetter_instances = new WeakSet(), _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }, _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }; + // Error + class A_Getter_StaticSetter { + constructor() { + _A_Getter_StaticSetter_instances.add(this); + } + } + _A_Getter_StaticSetter_instances = new WeakSet(), _A_Getter_StaticSetter_foo_set = function _A_Getter_StaticSetter_foo_set(value) { }; } -_A4_instances = new WeakSet(), _A4_foo_1 = function _A4_foo_1() { return ""; }, _A4_foo_1 = function _A4_foo_1() { return ""; }; -class A5 { - constructor() { - _A5_instances.add(this); +function Setter() { + var _A_Setter_Field_instances, _A_Setter_Field_foo_set, _A_Setter_Field_foo, _A_Setter_Method_instances, _A_Setter_Method_foo_set, _A_Setter_Method_foo, _A_Setter_Getter_instances, _A_Setter_Getter_foo_set, _A_Setter_Getter_foo_get, _A_Setter_Setter_instances, _A_Setter_Setter_foo_set, _A_Setter_Setter_foo_set_1, _A_Setter_StaticField_instances, _A_Setter_StaticField_foo_set, _A_Setter_StaticField_foo, _A_Setter_StaticMethod_instances, _A_Setter_StaticMethod_foo_set, _A_Setter_StaticMethod_foo, _A_Setter_StaticGetter_instances, _A_Setter_StaticGetter_foo_set, _A_Setter_StaticGetter_foo_get, _A_Setter_StaticSetter_instances, _A_Setter_StaticSetter_foo_set, _A_Setter_StaticSetter_foo_set_1; + // Error + class A_Setter_Field { + constructor() { + _A_Setter_Field_instances.add(this); + _A_Setter_Field_foo.set(this, "foo"); + } + } + _A_Setter_Field_foo = new WeakMap(), _A_Setter_Field_instances = new WeakSet(); + // Error + class A_Setter_Method { + constructor() { + _A_Setter_Method_instances.add(this); + } + } + _A_Setter_Method_instances = new WeakSet(), _A_Setter_Method_foo = function _A_Setter_Method_foo(value) { }, _A_Setter_Method_foo = function _A_Setter_Method_foo() { }; + // OK + class A_Setter_Getter { + constructor() { + _A_Setter_Getter_instances.add(this); + } + } + _A_Setter_Getter_instances = new WeakSet(), _A_Setter_Getter_foo_set = function _A_Setter_Getter_foo_set(value) { }, _A_Setter_Getter_foo_get = function _A_Setter_Getter_foo_get() { return ""; }; + // Error + class A_Setter_Setter { + constructor() { + _A_Setter_Setter_instances.add(this); + } + } + _A_Setter_Setter_instances = new WeakSet(), _A_Setter_Setter_foo_set_1 = function _A_Setter_Setter_foo_set_1(value) { }, _A_Setter_Setter_foo_set_1 = function _A_Setter_Setter_foo_set_1(value) { }; + // Error + class A_Setter_StaticField { + constructor() { + _A_Setter_StaticField_instances.add(this); + } + } + _A_Setter_StaticField_instances = new WeakSet(); + _A_Setter_StaticField_foo = { value: "foo" }; + // Error + class A_Setter_StaticMethod { + constructor() { + _A_Setter_StaticMethod_instances.add(this); + } + } + _A_Setter_StaticMethod_instances = new WeakSet(), _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo(value) { }, _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo() { }; + // Error + class A_Setter_StaticGetter { + constructor() { + _A_Setter_StaticGetter_instances.add(this); + } + } + _A_Setter_StaticGetter_instances = new WeakSet(), _A_Setter_StaticGetter_foo_get = function _A_Setter_StaticGetter_foo_get() { return ""; }; + // Error + class A_Setter_StaticSetter { + constructor() { + _A_Setter_StaticSetter_instances.add(this); + } } + _A_Setter_StaticSetter_instances = new WeakSet(), _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }, _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }; } -_A5_instances = new WeakSet(), _A5_foo_get = function _A5_foo_get() { return ""; }; -class A6 { - constructor() { - _A6_instances.add(this); +function StaticField() { + var _A_StaticField_Field_foo, _A_StaticField_Field_foo_1, _A_StaticField_Method_instances, _A_StaticField_Method_foo, _A_StaticField_Method_foo_1, _A_StaticField_Getter_instances, _A_StaticField_Getter_foo, _A_StaticField_Getter_foo_get, _A_StaticField_Setter_instances, _A_StaticField_Setter_foo, _A_StaticField_Setter_foo_set, _A_StaticField_StaticField_foo, _A_StaticField_StaticField_foo_1, _A_StaticField_StaticMethod_foo, _A_StaticField_StaticMethod_foo_1, _A_StaticField_StaticGetter_foo, _A_StaticField_StaticGetter_foo_get, _A_StaticField_StaticSetter_foo, _A_StaticField_StaticSetter_foo_set; + // Error + class A_StaticField_Field { + constructor() { + _A_StaticField_Field_foo_1.set(this, "foo"); + } } + _A_StaticField_Field_foo_1 = new WeakMap(); + _A_StaticField_Field_foo_1.set(A_StaticField_Field, "foo"); + // Error + class A_StaticField_Method { + constructor() { + _A_StaticField_Method_instances.add(this); + } + } + _A_StaticField_Method_instances = new WeakSet(), _A_StaticField_Method_foo_1 = function _A_StaticField_Method_foo_1() { }; + // Error + class A_StaticField_Getter { + constructor() { + _A_StaticField_Getter_instances.add(this); + } + } + _A_StaticField_Getter_instances = new WeakSet(), _A_StaticField_Getter_foo_get = function _A_StaticField_Getter_foo_get() { return ""; }; + // Error + class A_StaticField_Setter { + constructor() { + _A_StaticField_Setter_instances.add(this); + } + } + _A_StaticField_Setter_instances = new WeakSet(), _A_StaticField_Setter_foo_set = function _A_StaticField_Setter_foo_set(value) { }; + // Error + class A_StaticField_StaticField { + } + _A_StaticField_StaticField_foo_1 = { value: "foo" }; + _A_StaticField_StaticField_foo_1 = { value: "foo" }; + // Error + class A_StaticField_StaticMethod { + } + _A_StaticField_StaticMethod_foo_1 = function _A_StaticField_StaticMethod_foo_1() { }; + // Error + class A_StaticField_StaticGetter { + } + _A_StaticField_StaticGetter_foo_get = function _A_StaticField_StaticGetter_foo_get() { return ""; }; + // Error + class A_StaticField_StaticSetter { + } + _A_StaticField_StaticSetter_foo_set = function _A_StaticField_StaticSetter_foo_set(value) { }; } -_A6_foo = new WeakMap(), _A6_instances = new WeakSet(), _A6_foo_get = function _A6_foo_get() { return ""; }; -class A7 { - constructor() { - _A7_instances.add(this); +function StaticMethod() { + var _A_StaticMethod_Field_foo, _A_StaticMethod_Field_foo_1, _A_StaticMethod_Method_instances, _A_StaticMethod_Method_foo, _A_StaticMethod_Method_foo_1, _A_StaticMethod_Getter_instances, _A_StaticMethod_Getter_foo, _A_StaticMethod_Getter_foo_get, _A_StaticMethod_Setter_instances, _A_StaticMethod_Setter_foo, _A_StaticMethod_Setter_foo_set, _A_StaticMethod_StaticField_foo, _A_StaticMethod_StaticField_foo_1, _A_StaticMethod_StaticMethod_foo, _A_StaticMethod_StaticMethod_foo_1, _A_StaticMethod_StaticGetter_foo, _A_StaticMethod_StaticGetter_foo_get, _A_StaticMethod_StaticSetter_foo, _A_StaticMethod_StaticSetter_foo_set; + // Error + class A_StaticMethod_Field { + constructor() { + _A_StaticMethod_Field_foo_1.set(this, "foo"); + } + } + _A_StaticMethod_Field_foo_1 = new WeakMap(); + // Error + class A_StaticMethod_Method { + constructor() { + _A_StaticMethod_Method_instances.add(this); + } + } + _A_StaticMethod_Method_instances = new WeakSet(), _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }, _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }; + // Error + class A_StaticMethod_Getter { + constructor() { + _A_StaticMethod_Getter_instances.add(this); + } + } + _A_StaticMethod_Getter_instances = new WeakSet(), _A_StaticMethod_Getter_foo_get = function _A_StaticMethod_Getter_foo_get() { return ""; }; + // Error + class A_StaticMethod_Setter { + constructor() { + _A_StaticMethod_Setter_instances.add(this); + } + } + _A_StaticMethod_Setter_instances = new WeakSet(), _A_StaticMethod_Setter_foo_set = function _A_StaticMethod_Setter_foo_set(value) { }; + // Error + class A_StaticMethod_StaticField { + } + _A_StaticMethod_StaticField_foo_1 = { value: "foo" }; + // Error + class A_StaticMethod_StaticMethod { + } + _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }, _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }; + // Error + class A_StaticMethod_StaticGetter { + } + _A_StaticMethod_StaticGetter_foo_get = function _A_StaticMethod_StaticGetter_foo_get() { return ""; }; + // Error + class A_StaticMethod_StaticSetter { } + _A_StaticMethod_StaticSetter_foo_set = function _A_StaticMethod_StaticSetter_foo_set(value) { }; } -_A7_instances = new WeakSet(), _A7_foo_get_1 = function _A7_foo_get_1() { return ""; }, _A7_foo_get_1 = function _A7_foo_get_1() { return ""; }; -class A8 { - constructor() { - _A8_instances.add(this); +function StaticGetter() { + var _A_StaticGetter_Field_foo_get, _A_StaticGetter_Field_foo, _A_StaticGetter_Method_instances, _A_StaticGetter_Method_foo_get, _A_StaticGetter_Method_foo, _A_StaticGetter_Getter_instances, _A_StaticGetter_Getter_foo_get, _A_StaticGetter_Getter_foo_get_1, _A_StaticGetter_Setter_instances, _A_StaticGetter_Setter_foo_get, _A_StaticGetter_Setter_foo_set, _A_StaticGetter_StaticField_foo_get, _A_StaticGetter_StaticField_foo, _A_StaticGetter_StaticMethod_foo_get, _A_StaticGetter_StaticMethod_foo, _A_StaticGetter_StaticGetter_foo_get, _A_StaticGetter_StaticGetter_foo_get_1, _A_StaticGetter_StaticSetter_foo_get, _A_StaticGetter_StaticSetter_foo_set; + // Error + class A_StaticGetter_Field { + constructor() { + _A_StaticGetter_Field_foo.set(this, "foo"); + } } + _A_StaticGetter_Field_foo = new WeakMap(); + // Error + class A_StaticGetter_Method { + constructor() { + _A_StaticGetter_Method_instances.add(this); + } + } + _A_StaticGetter_Method_instances = new WeakSet(), _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { return ""; }, _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { }; + // Error + class A_StaticGetter_Getter { + constructor() { + _A_StaticGetter_Getter_instances.add(this); + } + } + _A_StaticGetter_Getter_instances = new WeakSet(), _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }, _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }; + // Error + class A_StaticGetter_Setter { + constructor() { + _A_StaticGetter_Setter_instances.add(this); + } + } + _A_StaticGetter_Setter_instances = new WeakSet(), _A_StaticGetter_Setter_foo_set = function _A_StaticGetter_Setter_foo_set(value) { }; + // Error + class A_StaticGetter_StaticField { + } + _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { return ""; }, _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { }; + // Error + class A_StaticGetter_StaticMethod { + } + _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { return ""; }, _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { }; + // Error + class A_StaticGetter_StaticGetter { + } + _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }, _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }; + // OK + class A_StaticGetter_StaticSetter { + } + _A_StaticGetter_StaticSetter_foo_get = function _A_StaticGetter_StaticSetter_foo_get() { return ""; }, _A_StaticGetter_StaticSetter_foo_set = function _A_StaticGetter_StaticSetter_foo_set(value) { }; } -_A8_instances = new WeakSet(), _A8_foo_set_1 = function _A8_foo_set_1(a) { }, _A8_foo_set_1 = function _A8_foo_set_1(a) { }; -class A9 { - constructor() { - _A9_instances.add(this); +function StaticSetter() { + var _A_StaticSetter_Field_foo_set, _A_StaticSetter_Field_foo, _A_StaticSetter_Method_instances, _A_StaticSetter_Method_foo_set, _A_StaticSetter_Method_foo, _A_StaticSetter_Getter_instances, _A_StaticSetter_Getter_foo_set, _A_StaticSetter_Getter_foo_get, _A_StaticSetter_Setter_instances, _A_StaticSetter_Setter_foo_set, _A_StaticSetter_Setter_foo_set_1, _A_StaticSetter_StaticField_foo_set, _A_StaticSetter_StaticField_foo, _A_StaticSetter_StaticMethod_foo_set, _A_StaticSetter_StaticMethod_foo, _A_StaticSetter_StaticGetter_foo_set, _A_StaticSetter_StaticGetter_foo_get, _A_StaticSetter_StaticSetter_foo_set, _A_StaticSetter_StaticSetter_foo_set_1; + // Error + class A_StaticSetter_Field { + constructor() { + _A_StaticSetter_Field_foo.set(this, "foo"); + } + } + _A_StaticSetter_Field_foo = new WeakMap(); + // Error + class A_StaticSetter_Method { + constructor() { + _A_StaticSetter_Method_instances.add(this); + } + } + _A_StaticSetter_Method_instances = new WeakSet(), _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo(value) { }, _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo() { }; + // Error + class A_StaticSetter_Getter { + constructor() { + _A_StaticSetter_Getter_instances.add(this); + } + } + _A_StaticSetter_Getter_instances = new WeakSet(), _A_StaticSetter_Getter_foo_get = function _A_StaticSetter_Getter_foo_get() { return ""; }; + // Error + class A_StaticSetter_Setter { + constructor() { + _A_StaticSetter_Setter_instances.add(this); + } + } + _A_StaticSetter_Setter_instances = new WeakSet(), _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }, _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }; + // Error + class A_StaticSetter_StaticField { + } + _A_StaticSetter_StaticField_foo = { value: "foo" }; + // Error + class A_StaticSetter_StaticMethod { + } + _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo(value) { }, _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo() { }; + // OK + class A_StaticSetter_StaticGetter { + } + _A_StaticSetter_StaticGetter_foo_set = function _A_StaticSetter_StaticGetter_foo_set(value) { }, _A_StaticSetter_StaticGetter_foo_get = function _A_StaticSetter_StaticGetter_foo_get() { return ""; }; + // Error + class A_StaticSetter_StaticSetter { } + _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }, _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }; } -_A9_instances = new WeakSet(), _A9_foo_get_1 = function _A9_foo_get_1() { return ""; }, _A9_foo_set_1 = function _A9_foo_set_1(a) { }, _A9_foo_get_1 = function _A9_foo_get_1() { return ""; }, _A9_foo_set_1 = function _A9_foo_set_1(a) { }; diff --git a/tests/baselines/reference/privateNameDuplicateField.symbols b/tests/baselines/reference/privateNameDuplicateField.symbols index bc037e01e8119..eb8a982581ed2 100644 --- a/tests/baselines/reference/privateNameDuplicateField.symbols +++ b/tests/baselines/reference/privateNameDuplicateField.symbols @@ -1,107 +1,770 @@ === tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts === -class A { ->A : Symbol(A, Decl(privateNameDuplicateField.ts, 0, 0)) +function Field() { +>Field : Symbol(Field, Decl(privateNameDuplicateField.ts, 0, 0)) - #foo = "foo"; ->#foo : Symbol(A.#foo, Decl(privateNameDuplicateField.ts, 0, 9), Decl(privateNameDuplicateField.ts, 1, 17)) + // Error + class A_Field_Field { +>A_Field_Field : Symbol(A_Field_Field, Decl(privateNameDuplicateField.ts, 0, 18)) - #foo = "foo"; ->#foo : Symbol(A.#foo, Decl(privateNameDuplicateField.ts, 0, 9), Decl(privateNameDuplicateField.ts, 1, 17)) -} + #foo = "foo"; +>#foo : Symbol(A_Field_Field.#foo, Decl(privateNameDuplicateField.ts, 3, 25), Decl(privateNameDuplicateField.ts, 4, 21)) + + #foo = "foo"; +>#foo : Symbol(A_Field_Field.#foo, Decl(privateNameDuplicateField.ts, 3, 25), Decl(privateNameDuplicateField.ts, 4, 21)) + } + + // Error + class A_Field_Method { +>A_Field_Method : Symbol(A_Field_Method, Decl(privateNameDuplicateField.ts, 6, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_Method.#foo, Decl(privateNameDuplicateField.ts, 9, 26)) + + #foo() { } +>#foo : Symbol(A_Field_Method.#foo, Decl(privateNameDuplicateField.ts, 10, 21)) + } + + // Error + class A_Field_Getter { +>A_Field_Getter : Symbol(A_Field_Getter, Decl(privateNameDuplicateField.ts, 12, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_Getter.#foo, Decl(privateNameDuplicateField.ts, 15, 26)) + + get #foo() { return ""} +>#foo : Symbol(A_Field_Getter.#foo, Decl(privateNameDuplicateField.ts, 16, 21)) + } + + // Error + class A_Field_Setter { +>A_Field_Setter : Symbol(A_Field_Setter, Decl(privateNameDuplicateField.ts, 18, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_Setter.#foo, Decl(privateNameDuplicateField.ts, 21, 26)) + + set #foo(value: string) { } +>#foo : Symbol(A_Field_Setter.#foo, Decl(privateNameDuplicateField.ts, 22, 21)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 23, 17)) + } -class A2 { ->A2 : Symbol(A2, Decl(privateNameDuplicateField.ts, 3, 1)) + // Error + class A_Field_StaticField { +>A_Field_StaticField : Symbol(A_Field_StaticField, Decl(privateNameDuplicateField.ts, 24, 5)) - #foo = "foo"; ->#foo : Symbol(A2.#foo, Decl(privateNameDuplicateField.ts, 5, 10)) + #foo = "foo"; +>#foo : Symbol(A_Field_StaticField.#foo, Decl(privateNameDuplicateField.ts, 27, 31)) - #foo() {} ->#foo : Symbol(A2.#foo, Decl(privateNameDuplicateField.ts, 6, 17)) + static #foo = "foo"; +>#foo : Symbol(A_Field_StaticField.#foo, Decl(privateNameDuplicateField.ts, 28, 21)) + } + + // Error + class A_Field_StaticMethod { +>A_Field_StaticMethod : Symbol(A_Field_StaticMethod, Decl(privateNameDuplicateField.ts, 30, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 33, 32)) + + static #foo() { } +>#foo : Symbol(A_Field_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 34, 21)) + } + + // Error + class A_Field_StaticGetter { +>A_Field_StaticGetter : Symbol(A_Field_StaticGetter, Decl(privateNameDuplicateField.ts, 36, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 39, 32)) + + static get #foo() { return ""} +>#foo : Symbol(A_Field_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 40, 21)) + } + + // Error + class A_Field_StaticSetter { +>A_Field_StaticSetter : Symbol(A_Field_StaticSetter, Decl(privateNameDuplicateField.ts, 42, 5)) + + #foo = "foo"; +>#foo : Symbol(A_Field_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 45, 32)) + + static set #foo(value: string) { } +>#foo : Symbol(A_Field_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 46, 21)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 47, 24)) + } } +function Method() { +>Method : Symbol(Method, Decl(privateNameDuplicateField.ts, 49, 1)) + + // Error + class A_Method_Field { +>A_Method_Field : Symbol(A_Method_Field, Decl(privateNameDuplicateField.ts, 51, 19)) + + #foo() { } +>#foo : Symbol(A_Method_Field.#foo, Decl(privateNameDuplicateField.ts, 53, 26), Decl(privateNameDuplicateField.ts, 54, 18)) -class A3 { ->A3 : Symbol(A3, Decl(privateNameDuplicateField.ts, 8, 1)) + #foo = "foo"; +>#foo : Symbol(A_Method_Field.#foo, Decl(privateNameDuplicateField.ts, 53, 26), Decl(privateNameDuplicateField.ts, 54, 18)) + } - #foo = "foo"; ->#foo : Symbol(A3.#foo, Decl(privateNameDuplicateField.ts, 11, 10)) + // Error + class A_Method_Method { +>A_Method_Method : Symbol(A_Method_Method, Decl(privateNameDuplicateField.ts, 56, 5)) - get #foo() { return ""} ->#foo : Symbol(A3.#foo, Decl(privateNameDuplicateField.ts, 12, 17)) + #foo() { } +>#foo : Symbol(A_Method_Method.#foo, Decl(privateNameDuplicateField.ts, 59, 27), Decl(privateNameDuplicateField.ts, 60, 18)) + + #foo() { } +>#foo : Symbol(A_Method_Method.#foo, Decl(privateNameDuplicateField.ts, 59, 27), Decl(privateNameDuplicateField.ts, 60, 18)) + } + + // Error + class A_Method_Getter { +>A_Method_Getter : Symbol(A_Method_Getter, Decl(privateNameDuplicateField.ts, 62, 5)) + + #foo() { } +>#foo : Symbol(A_Method_Getter.#foo, Decl(privateNameDuplicateField.ts, 65, 27)) + + get #foo() { return ""} +>#foo : Symbol(A_Method_Getter.#foo, Decl(privateNameDuplicateField.ts, 66, 18)) + } + + // Error + class A_Method_Setter { +>A_Method_Setter : Symbol(A_Method_Setter, Decl(privateNameDuplicateField.ts, 68, 5)) + + #foo() { } +>#foo : Symbol(A_Method_Setter.#foo, Decl(privateNameDuplicateField.ts, 71, 27)) + + set #foo(value: string) { } +>#foo : Symbol(A_Method_Setter.#foo, Decl(privateNameDuplicateField.ts, 72, 18)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 73, 17)) + } + + // Error + class A_Method_StaticField { +>A_Method_StaticField : Symbol(A_Method_StaticField, Decl(privateNameDuplicateField.ts, 74, 5)) + + #foo() { } +>#foo : Symbol(A_Method_StaticField.#foo, Decl(privateNameDuplicateField.ts, 77, 32)) + + static #foo = "foo"; +>#foo : Symbol(A_Method_StaticField.#foo, Decl(privateNameDuplicateField.ts, 78, 18)) + } + + // Error + class A_Method_StaticMethod { +>A_Method_StaticMethod : Symbol(A_Method_StaticMethod, Decl(privateNameDuplicateField.ts, 80, 5)) + + #foo() { } +>#foo : Symbol(A_Method_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 83, 33)) + + static #foo() { } +>#foo : Symbol(A_Method_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 84, 18)) + } + + // Error + class A_Method_StaticGetter { +>A_Method_StaticGetter : Symbol(A_Method_StaticGetter, Decl(privateNameDuplicateField.ts, 86, 5)) + + #foo() { } +>#foo : Symbol(A_Method_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 89, 33)) + + static get #foo() { return ""} +>#foo : Symbol(A_Method_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 90, 18)) + } + + // Error + class A_Method_StaticSetter { +>A_Method_StaticSetter : Symbol(A_Method_StaticSetter, Decl(privateNameDuplicateField.ts, 92, 5)) + + #foo() { } +>#foo : Symbol(A_Method_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 95, 33)) + + static set #foo(value: string) { } +>#foo : Symbol(A_Method_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 96, 18)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 97, 24)) + } } -class A4 { ->A4 : Symbol(A4, Decl(privateNameDuplicateField.ts, 14, 1)) - #foo() { return ""} ->#foo : Symbol(A4.#foo, Decl(privateNameDuplicateField.ts, 16, 10), Decl(privateNameDuplicateField.ts, 17, 23)) +function Getter() { +>Getter : Symbol(Getter, Decl(privateNameDuplicateField.ts, 99, 1)) + + // Error + class A_Getter_Field { +>A_Getter_Field : Symbol(A_Getter_Field, Decl(privateNameDuplicateField.ts, 102, 19)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_Field.#foo, Decl(privateNameDuplicateField.ts, 104, 26), Decl(privateNameDuplicateField.ts, 105, 31)) - #foo() { return ""} ->#foo : Symbol(A4.#foo, Decl(privateNameDuplicateField.ts, 16, 10), Decl(privateNameDuplicateField.ts, 17, 23)) + #foo = "foo"; +>#foo : Symbol(A_Getter_Field.#foo, Decl(privateNameDuplicateField.ts, 104, 26), Decl(privateNameDuplicateField.ts, 105, 31)) + } + + // Error + class A_Getter_Method { +>A_Getter_Method : Symbol(A_Getter_Method, Decl(privateNameDuplicateField.ts, 107, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_Method.#foo, Decl(privateNameDuplicateField.ts, 110, 27)) + + #foo() { } +>#foo : Symbol(A_Getter_Method.#foo, Decl(privateNameDuplicateField.ts, 111, 31)) + } + + // Error + class A_Getter_Getter { +>A_Getter_Getter : Symbol(A_Getter_Getter, Decl(privateNameDuplicateField.ts, 113, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_Getter.#foo, Decl(privateNameDuplicateField.ts, 116, 27)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_Getter.#foo, Decl(privateNameDuplicateField.ts, 117, 31)) + } + + //OK + class A_Getter_Setter { +>A_Getter_Setter : Symbol(A_Getter_Setter, Decl(privateNameDuplicateField.ts, 119, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_Setter.#foo, Decl(privateNameDuplicateField.ts, 122, 27), Decl(privateNameDuplicateField.ts, 123, 31)) + + set #foo(value: string) { } +>#foo : Symbol(A_Getter_Setter.#foo, Decl(privateNameDuplicateField.ts, 122, 27), Decl(privateNameDuplicateField.ts, 123, 31)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 124, 17)) + } + + // Error + class A_Getter_StaticField { +>A_Getter_StaticField : Symbol(A_Getter_StaticField, Decl(privateNameDuplicateField.ts, 125, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 128, 32)) + + static #foo() { } +>#foo : Symbol(A_Getter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 129, 31)) + } + + // Error + class A_Getter_StaticMethod { +>A_Getter_StaticMethod : Symbol(A_Getter_StaticMethod, Decl(privateNameDuplicateField.ts, 131, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 134, 33)) + + static #foo() { } +>#foo : Symbol(A_Getter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 135, 31)) + } + + // Error + class A_Getter_StaticGetter { +>A_Getter_StaticGetter : Symbol(A_Getter_StaticGetter, Decl(privateNameDuplicateField.ts, 137, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 140, 33)) + + static get #foo() { return ""} +>#foo : Symbol(A_Getter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 141, 31)) + } + + // Error + class A_Getter_StaticSetter { +>A_Getter_StaticSetter : Symbol(A_Getter_StaticSetter, Decl(privateNameDuplicateField.ts, 143, 5)) + + get #foo() { return ""} +>#foo : Symbol(A_Getter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 146, 33)) + + static set #foo(value: string) { } +>#foo : Symbol(A_Getter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 147, 31)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 148, 24)) + } } +function Setter() { +>Setter : Symbol(Setter, Decl(privateNameDuplicateField.ts, 150, 1)) + + // Error + class A_Setter_Field { +>A_Setter_Field : Symbol(A_Setter_Field, Decl(privateNameDuplicateField.ts, 152, 19)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_Field.#foo, Decl(privateNameDuplicateField.ts, 154, 26), Decl(privateNameDuplicateField.ts, 155, 35)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 155, 17)) + + #foo = "foo"; +>#foo : Symbol(A_Setter_Field.#foo, Decl(privateNameDuplicateField.ts, 154, 26), Decl(privateNameDuplicateField.ts, 155, 35)) + } + + // Error + class A_Setter_Method { +>A_Setter_Method : Symbol(A_Setter_Method, Decl(privateNameDuplicateField.ts, 157, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_Method.#foo, Decl(privateNameDuplicateField.ts, 160, 27)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 161, 17)) + + #foo() { } +>#foo : Symbol(A_Setter_Method.#foo, Decl(privateNameDuplicateField.ts, 161, 35)) + } + + // OK + class A_Setter_Getter { +>A_Setter_Getter : Symbol(A_Setter_Getter, Decl(privateNameDuplicateField.ts, 163, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_Getter.#foo, Decl(privateNameDuplicateField.ts, 166, 27), Decl(privateNameDuplicateField.ts, 167, 35)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 167, 17)) + + get #foo() { return ""} +>#foo : Symbol(A_Setter_Getter.#foo, Decl(privateNameDuplicateField.ts, 166, 27), Decl(privateNameDuplicateField.ts, 167, 35)) + } + + // Error + class A_Setter_Setter { +>A_Setter_Setter : Symbol(A_Setter_Setter, Decl(privateNameDuplicateField.ts, 169, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_Setter.#foo, Decl(privateNameDuplicateField.ts, 172, 27)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 173, 17)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_Setter.#foo, Decl(privateNameDuplicateField.ts, 173, 35)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 174, 17)) + } + + // Error + class A_Setter_StaticField { +>A_Setter_StaticField : Symbol(A_Setter_StaticField, Decl(privateNameDuplicateField.ts, 175, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 178, 32)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 179, 17)) + + static #foo = "foo"; +>#foo : Symbol(A_Setter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 179, 35)) + } + + // Error + class A_Setter_StaticMethod { +>A_Setter_StaticMethod : Symbol(A_Setter_StaticMethod, Decl(privateNameDuplicateField.ts, 181, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 184, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 185, 17)) + + static #foo() { } +>#foo : Symbol(A_Setter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 185, 35)) + } + + // Error + class A_Setter_StaticGetter { +>A_Setter_StaticGetter : Symbol(A_Setter_StaticGetter, Decl(privateNameDuplicateField.ts, 187, 5)) + + set #foo(value: string) { } +>#foo : Symbol(A_Setter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 190, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 191, 17)) + + static get #foo() { return ""} +>#foo : Symbol(A_Setter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 191, 35)) + } -class A5 { ->A5 : Symbol(A5, Decl(privateNameDuplicateField.ts, 19, 1)) + // Error + class A_Setter_StaticSetter { +>A_Setter_StaticSetter : Symbol(A_Setter_StaticSetter, Decl(privateNameDuplicateField.ts, 193, 5)) - #foo() { return ""} ->#foo : Symbol(A5.#foo, Decl(privateNameDuplicateField.ts, 22, 10)) + set #foo(value: string) { } +>#foo : Symbol(A_Setter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 196, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 197, 17)) - get #foo() { return ""} ->#foo : Symbol(A5.#foo, Decl(privateNameDuplicateField.ts, 23, 23)) + static set #foo(value: string) { } +>#foo : Symbol(A_Setter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 197, 35)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 198, 24)) + } } +function StaticField() { +>StaticField : Symbol(StaticField, Decl(privateNameDuplicateField.ts, 200, 1)) -class A6 { ->A6 : Symbol(A6, Decl(privateNameDuplicateField.ts, 25, 1)) + // Error + class A_StaticField_Field { +>A_StaticField_Field : Symbol(A_StaticField_Field, Decl(privateNameDuplicateField.ts, 202, 24)) - #foo = "foo"; ->#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 28, 10)) + static #foo = "foo"; +>#foo : Symbol(A_StaticField_Field.#foo, Decl(privateNameDuplicateField.ts, 204, 31)) - #foo() { return ""} ->#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 29, 17)) + #foo = "foo"; +>#foo : Symbol(A_StaticField_Field.#foo, Decl(privateNameDuplicateField.ts, 205, 28)) + } - get #foo() { return ""} ->#foo : Symbol(A6.#foo, Decl(privateNameDuplicateField.ts, 30, 23)) + // Error + class A_StaticField_Method { +>A_StaticField_Method : Symbol(A_StaticField_Method, Decl(privateNameDuplicateField.ts, 207, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_Method.#foo, Decl(privateNameDuplicateField.ts, 210, 32)) + + #foo() { } +>#foo : Symbol(A_StaticField_Method.#foo, Decl(privateNameDuplicateField.ts, 211, 28)) + } + + // Error + class A_StaticField_Getter { +>A_StaticField_Getter : Symbol(A_StaticField_Getter, Decl(privateNameDuplicateField.ts, 213, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_Getter.#foo, Decl(privateNameDuplicateField.ts, 216, 32)) + + get #foo() { return ""} +>#foo : Symbol(A_StaticField_Getter.#foo, Decl(privateNameDuplicateField.ts, 217, 28)) + } + + // Error + class A_StaticField_Setter { +>A_StaticField_Setter : Symbol(A_StaticField_Setter, Decl(privateNameDuplicateField.ts, 219, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_Setter.#foo, Decl(privateNameDuplicateField.ts, 222, 32)) + + set #foo(value: string) { } +>#foo : Symbol(A_StaticField_Setter.#foo, Decl(privateNameDuplicateField.ts, 223, 28)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 224, 17)) + } + + // Error + class A_StaticField_StaticField { +>A_StaticField_StaticField : Symbol(A_StaticField_StaticField, Decl(privateNameDuplicateField.ts, 225, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_StaticField.#foo, Decl(privateNameDuplicateField.ts, 228, 37), Decl(privateNameDuplicateField.ts, 229, 28)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_StaticField.#foo, Decl(privateNameDuplicateField.ts, 228, 37), Decl(privateNameDuplicateField.ts, 229, 28)) + } + + // Error + class A_StaticField_StaticMethod { +>A_StaticField_StaticMethod : Symbol(A_StaticField_StaticMethod, Decl(privateNameDuplicateField.ts, 231, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 234, 38)) + + static #foo() { } +>#foo : Symbol(A_StaticField_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 235, 28)) + } + + // Error + class A_StaticField_StaticGetter { +>A_StaticField_StaticGetter : Symbol(A_StaticField_StaticGetter, Decl(privateNameDuplicateField.ts, 237, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 240, 38)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticField_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 241, 28)) + } + + // Error + class A_StaticField_StaticSetter { +>A_StaticField_StaticSetter : Symbol(A_StaticField_StaticSetter, Decl(privateNameDuplicateField.ts, 243, 5)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticField_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 246, 38)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticField_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 247, 28)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 248, 24)) + } } -class A7 { ->A7 : Symbol(A7, Decl(privateNameDuplicateField.ts, 32, 1)) +function StaticMethod() { +>StaticMethod : Symbol(StaticMethod, Decl(privateNameDuplicateField.ts, 250, 1)) + + // Error + class A_StaticMethod_Field { +>A_StaticMethod_Field : Symbol(A_StaticMethod_Field, Decl(privateNameDuplicateField.ts, 252, 25)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_Field.#foo, Decl(privateNameDuplicateField.ts, 254, 32)) + + #foo = "foo"; +>#foo : Symbol(A_StaticMethod_Field.#foo, Decl(privateNameDuplicateField.ts, 255, 25)) + } + + // Error + class A_StaticMethod_Method { +>A_StaticMethod_Method : Symbol(A_StaticMethod_Method, Decl(privateNameDuplicateField.ts, 257, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_Method.#foo, Decl(privateNameDuplicateField.ts, 260, 33)) + + #foo() { } +>#foo : Symbol(A_StaticMethod_Method.#foo, Decl(privateNameDuplicateField.ts, 261, 25)) + } + + // Error + class A_StaticMethod_Getter { +>A_StaticMethod_Getter : Symbol(A_StaticMethod_Getter, Decl(privateNameDuplicateField.ts, 263, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_Getter.#foo, Decl(privateNameDuplicateField.ts, 266, 33)) + + get #foo() { return ""} +>#foo : Symbol(A_StaticMethod_Getter.#foo, Decl(privateNameDuplicateField.ts, 267, 25)) + } + + // Error + class A_StaticMethod_Setter { +>A_StaticMethod_Setter : Symbol(A_StaticMethod_Setter, Decl(privateNameDuplicateField.ts, 269, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_Setter.#foo, Decl(privateNameDuplicateField.ts, 272, 33)) + + set #foo(value: string) { } +>#foo : Symbol(A_StaticMethod_Setter.#foo, Decl(privateNameDuplicateField.ts, 273, 25)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 274, 17)) + } + + // Error + class A_StaticMethod_StaticField { +>A_StaticMethod_StaticField : Symbol(A_StaticMethod_StaticField, Decl(privateNameDuplicateField.ts, 275, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_StaticField.#foo, Decl(privateNameDuplicateField.ts, 278, 38), Decl(privateNameDuplicateField.ts, 279, 25)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticMethod_StaticField.#foo, Decl(privateNameDuplicateField.ts, 278, 38), Decl(privateNameDuplicateField.ts, 279, 25)) + } + + // Error + class A_StaticMethod_StaticMethod { +>A_StaticMethod_StaticMethod : Symbol(A_StaticMethod_StaticMethod, Decl(privateNameDuplicateField.ts, 281, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 284, 39), Decl(privateNameDuplicateField.ts, 285, 25)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 284, 39), Decl(privateNameDuplicateField.ts, 285, 25)) + } + + // Error + class A_StaticMethod_StaticGetter { +>A_StaticMethod_StaticGetter : Symbol(A_StaticMethod_StaticGetter, Decl(privateNameDuplicateField.ts, 287, 5)) + + static #foo() { } +>#foo : Symbol(A_StaticMethod_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 290, 39)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticMethod_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 291, 25)) + } + + // Error + class A_StaticMethod_StaticSetter { +>A_StaticMethod_StaticSetter : Symbol(A_StaticMethod_StaticSetter, Decl(privateNameDuplicateField.ts, 293, 5)) - get #foo() { return ""; } ->#foo : Symbol(A7.#foo, Decl(privateNameDuplicateField.ts, 34, 10)) + static #foo() { } +>#foo : Symbol(A_StaticMethod_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 296, 39)) - get #foo() { return ""; } ->#foo : Symbol(A7.#foo, Decl(privateNameDuplicateField.ts, 35, 29)) + static set #foo(value: string) { } +>#foo : Symbol(A_StaticMethod_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 297, 25)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 298, 24)) + } } -class A8 { ->A8 : Symbol(A8, Decl(privateNameDuplicateField.ts, 37, 1)) +function StaticGetter() { +>StaticGetter : Symbol(StaticGetter, Decl(privateNameDuplicateField.ts, 300, 1)) - set #foo(a: string) {} ->#foo : Symbol(A8.#foo, Decl(privateNameDuplicateField.ts, 39, 10)) ->a : Symbol(a, Decl(privateNameDuplicateField.ts, 40, 13)) + // Error + class A_StaticGetter_Field { +>A_StaticGetter_Field : Symbol(A_StaticGetter_Field, Decl(privateNameDuplicateField.ts, 302, 25)) - set #foo(a: string) {} ->#foo : Symbol(A8.#foo, Decl(privateNameDuplicateField.ts, 40, 26)) ->a : Symbol(a, Decl(privateNameDuplicateField.ts, 41, 13)) + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_Field.#foo, Decl(privateNameDuplicateField.ts, 305, 32)) + + #foo = "foo"; +>#foo : Symbol(A_StaticGetter_Field.#foo, Decl(privateNameDuplicateField.ts, 306, 38)) + } + + // Error + class A_StaticGetter_Method { +>A_StaticGetter_Method : Symbol(A_StaticGetter_Method, Decl(privateNameDuplicateField.ts, 308, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_Method.#foo, Decl(privateNameDuplicateField.ts, 311, 33)) + + #foo() { } +>#foo : Symbol(A_StaticGetter_Method.#foo, Decl(privateNameDuplicateField.ts, 312, 38)) + } + + // Error + class A_StaticGetter_Getter { +>A_StaticGetter_Getter : Symbol(A_StaticGetter_Getter, Decl(privateNameDuplicateField.ts, 314, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_Getter.#foo, Decl(privateNameDuplicateField.ts, 317, 33)) + + get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_Getter.#foo, Decl(privateNameDuplicateField.ts, 318, 38)) + } + + // Error + class A_StaticGetter_Setter { +>A_StaticGetter_Setter : Symbol(A_StaticGetter_Setter, Decl(privateNameDuplicateField.ts, 320, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_Setter.#foo, Decl(privateNameDuplicateField.ts, 323, 33)) + + set #foo(value: string) { } +>#foo : Symbol(A_StaticGetter_Setter.#foo, Decl(privateNameDuplicateField.ts, 324, 38)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 325, 17)) + } + + // Error + class A_StaticGetter_StaticField { +>A_StaticGetter_StaticField : Symbol(A_StaticGetter_StaticField, Decl(privateNameDuplicateField.ts, 326, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 329, 38)) + + static #foo() { } +>#foo : Symbol(A_StaticGetter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 330, 38)) + } + + // Error + class A_StaticGetter_StaticMethod { +>A_StaticGetter_StaticMethod : Symbol(A_StaticGetter_StaticMethod, Decl(privateNameDuplicateField.ts, 332, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 335, 39)) + + static #foo() { } +>#foo : Symbol(A_StaticGetter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 336, 38)) + } + + // Error + class A_StaticGetter_StaticGetter { +>A_StaticGetter_StaticGetter : Symbol(A_StaticGetter_StaticGetter, Decl(privateNameDuplicateField.ts, 338, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 341, 39)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 342, 38)) + } + // OK + class A_StaticGetter_StaticSetter { +>A_StaticGetter_StaticSetter : Symbol(A_StaticGetter_StaticSetter, Decl(privateNameDuplicateField.ts, 344, 5)) + + static get #foo() { return ""} +>#foo : Symbol(A_StaticGetter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 346, 39), Decl(privateNameDuplicateField.ts, 347, 38)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticGetter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 346, 39), Decl(privateNameDuplicateField.ts, 347, 38)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 348, 24)) + } } -class A9 { ->A9 : Symbol(A9, Decl(privateNameDuplicateField.ts, 42, 1)) +function StaticSetter() { +>StaticSetter : Symbol(StaticSetter, Decl(privateNameDuplicateField.ts, 350, 1)) + + // Error + class A_StaticSetter_Field { +>A_StaticSetter_Field : Symbol(A_StaticSetter_Field, Decl(privateNameDuplicateField.ts, 352, 25)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_Field.#foo, Decl(privateNameDuplicateField.ts, 354, 32)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 355, 24)) + + #foo = "foo"; +>#foo : Symbol(A_StaticSetter_Field.#foo, Decl(privateNameDuplicateField.ts, 355, 42)) + } + + // Error + class A_StaticSetter_Method { +>A_StaticSetter_Method : Symbol(A_StaticSetter_Method, Decl(privateNameDuplicateField.ts, 357, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_Method.#foo, Decl(privateNameDuplicateField.ts, 360, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 361, 24)) + + #foo() { } +>#foo : Symbol(A_StaticSetter_Method.#foo, Decl(privateNameDuplicateField.ts, 361, 42)) + } + + + // Error + class A_StaticSetter_Getter { +>A_StaticSetter_Getter : Symbol(A_StaticSetter_Getter, Decl(privateNameDuplicateField.ts, 363, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_Getter.#foo, Decl(privateNameDuplicateField.ts, 367, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 368, 24)) + + get #foo() { return ""} +>#foo : Symbol(A_StaticSetter_Getter.#foo, Decl(privateNameDuplicateField.ts, 368, 42)) + } + + // Error + class A_StaticSetter_Setter { +>A_StaticSetter_Setter : Symbol(A_StaticSetter_Setter, Decl(privateNameDuplicateField.ts, 370, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_Setter.#foo, Decl(privateNameDuplicateField.ts, 373, 33)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 374, 24)) + + set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_Setter.#foo, Decl(privateNameDuplicateField.ts, 374, 42)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 375, 17)) + } + + // Error + class A_StaticSetter_StaticField { +>A_StaticSetter_StaticField : Symbol(A_StaticSetter_StaticField, Decl(privateNameDuplicateField.ts, 376, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 379, 38), Decl(privateNameDuplicateField.ts, 380, 42)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 380, 24)) + + static #foo = "foo"; +>#foo : Symbol(A_StaticSetter_StaticField.#foo, Decl(privateNameDuplicateField.ts, 379, 38), Decl(privateNameDuplicateField.ts, 380, 42)) + } + + // Error + class A_StaticSetter_StaticMethod { +>A_StaticSetter_StaticMethod : Symbol(A_StaticSetter_StaticMethod, Decl(privateNameDuplicateField.ts, 382, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 385, 39)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 386, 24)) + + static #foo() { } +>#foo : Symbol(A_StaticSetter_StaticMethod.#foo, Decl(privateNameDuplicateField.ts, 386, 42)) + } + + // OK + class A_StaticSetter_StaticGetter { +>A_StaticSetter_StaticGetter : Symbol(A_StaticSetter_StaticGetter, Decl(privateNameDuplicateField.ts, 388, 5)) + + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 391, 39), Decl(privateNameDuplicateField.ts, 392, 42)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 392, 24)) - get #foo() { return ""; } ->#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 44, 10), Decl(privateNameDuplicateField.ts, 45, 29)) + static get #foo() { return ""} +>#foo : Symbol(A_StaticSetter_StaticGetter.#foo, Decl(privateNameDuplicateField.ts, 391, 39), Decl(privateNameDuplicateField.ts, 392, 42)) + } - set #foo(a: string) {} ->#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 44, 10), Decl(privateNameDuplicateField.ts, 45, 29)) ->a : Symbol(a, Decl(privateNameDuplicateField.ts, 46, 13)) + // Error + class A_StaticSetter_StaticSetter { +>A_StaticSetter_StaticSetter : Symbol(A_StaticSetter_StaticSetter, Decl(privateNameDuplicateField.ts, 394, 5)) - get #foo() { return ""; } ->#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 46, 26)) + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 397, 39)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 398, 24)) - set #foo(a: string) {} ->#foo : Symbol(A9.#foo, Decl(privateNameDuplicateField.ts, 47, 29)) ->a : Symbol(a, Decl(privateNameDuplicateField.ts, 48, 13)) + static set #foo(value: string) { } +>#foo : Symbol(A_StaticSetter_StaticSetter.#foo, Decl(privateNameDuplicateField.ts, 398, 42)) +>value : Symbol(value, Decl(privateNameDuplicateField.ts, 399, 24)) + } } diff --git a/tests/baselines/reference/privateNameDuplicateField.types b/tests/baselines/reference/privateNameDuplicateField.types index 7b60a0bb2fca5..38614717ec2ad 100644 --- a/tests/baselines/reference/privateNameDuplicateField.types +++ b/tests/baselines/reference/privateNameDuplicateField.types @@ -1,123 +1,832 @@ === tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts === -class A { ->A : A +function Field() { +>Field : () => void - #foo = "foo"; + // Error + class A_Field_Field { +>A_Field_Field : A_Field_Field + + #foo = "foo"; >#foo : string >"foo" : "foo" - #foo = "foo"; + #foo = "foo"; >#foo : string >"foo" : "foo" -} + } -class A2 { ->A2 : A2 + // Error + class A_Field_Method { +>A_Field_Method : A_Field_Method - #foo = "foo"; + #foo = "foo"; >#foo : string >"foo" : "foo" - #foo() {} + #foo() { } >#foo : () => void + } + + // Error + class A_Field_Getter { +>A_Field_Getter : A_Field_Getter + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + get #foo() { return ""} +>#foo : string +>"" : "" + } + + // Error + class A_Field_Setter { +>A_Field_Setter : A_Field_Setter + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_Field_StaticField { +>A_Field_StaticField : A_Field_StaticField + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_Field_StaticMethod { +>A_Field_StaticMethod : A_Field_StaticMethod + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_Field_StaticGetter { +>A_Field_StaticGetter : A_Field_StaticGetter + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static get #foo() { return ""} +>#foo : string +>"" : "" + } + + // Error + class A_Field_StaticSetter { +>A_Field_StaticSetter : A_Field_StaticSetter + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static set #foo(value: string) { } +>#foo : string +>value : string + } } +function Method() { +>Method : () => void -class A3 { ->A3 : A3 + // Error + class A_Method_Field { +>A_Method_Field : A_Method_Field - #foo = "foo"; + #foo() { } +>#foo : () => void + + #foo = "foo"; +>#foo : () => void +>"foo" : "foo" + } + + // Error + class A_Method_Method { +>A_Method_Method : A_Method_Method + + #foo() { } +>#foo : () => void + + #foo() { } +>#foo : () => void + } + + // Error + class A_Method_Getter { +>A_Method_Getter : A_Method_Getter + + #foo() { } +>#foo : () => void + + get #foo() { return ""} +>#foo : string +>"" : "" + } + + // Error + class A_Method_Setter { +>A_Method_Setter : A_Method_Setter + + #foo() { } +>#foo : () => void + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_Method_StaticField { +>A_Method_StaticField : A_Method_StaticField + + #foo() { } +>#foo : () => void + + static #foo = "foo"; >#foo : string >"foo" : "foo" + } + + // Error + class A_Method_StaticMethod { +>A_Method_StaticMethod : A_Method_StaticMethod + + #foo() { } +>#foo : () => void + + static #foo() { } +>#foo : () => void + } + + // Error + class A_Method_StaticGetter { +>A_Method_StaticGetter : A_Method_StaticGetter + + #foo() { } +>#foo : () => void - get #foo() { return ""} + static get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_Method_StaticSetter { +>A_Method_StaticSetter : A_Method_StaticSetter + + #foo() { } +>#foo : () => void + + static set #foo(value: string) { } +>#foo : string +>value : string + } } -class A4 { ->A4 : A4 - #foo() { return ""} ->#foo : () => string +function Getter() { +>Getter : () => void + + // Error + class A_Getter_Field { +>A_Getter_Field : A_Getter_Field + + get #foo() { return ""} +>#foo : string >"" : "" - #foo() { return ""} ->#foo : () => string + #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_Getter_Method { +>A_Getter_Method : A_Getter_Method + + get #foo() { return ""} +>#foo : string >"" : "" + + #foo() { } +>#foo : () => void + } + + // Error + class A_Getter_Getter { +>A_Getter_Getter : A_Getter_Getter + + get #foo() { return ""} +>#foo : string +>"" : "" + + get #foo() { return ""} +>#foo : string +>"" : "" + } + + //OK + class A_Getter_Setter { +>A_Getter_Setter : A_Getter_Setter + + get #foo() { return ""} +>#foo : string +>"" : "" + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_Getter_StaticField { +>A_Getter_StaticField : A_Getter_StaticField + + get #foo() { return ""} +>#foo : string +>"" : "" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_Getter_StaticMethod { +>A_Getter_StaticMethod : A_Getter_StaticMethod + + get #foo() { return ""} +>#foo : string +>"" : "" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_Getter_StaticGetter { +>A_Getter_StaticGetter : A_Getter_StaticGetter + + get #foo() { return ""} +>#foo : string +>"" : "" + + static get #foo() { return ""} +>#foo : string +>"" : "" + } + + // Error + class A_Getter_StaticSetter { +>A_Getter_StaticSetter : A_Getter_StaticSetter + + get #foo() { return ""} +>#foo : string +>"" : "" + + static set #foo(value: string) { } +>#foo : string +>value : string + } } +function Setter() { +>Setter : () => void + + // Error + class A_Setter_Field { +>A_Setter_Field : A_Setter_Field + + set #foo(value: string) { } +>#foo : string +>value : string + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_Setter_Method { +>A_Setter_Method : A_Setter_Method -class A5 { ->A5 : A5 + set #foo(value: string) { } +>#foo : string +>value : string + + #foo() { } +>#foo : () => void + } + + // OK + class A_Setter_Getter { +>A_Setter_Getter : A_Setter_Getter + + set #foo(value: string) { } +>#foo : string +>value : string - #foo() { return ""} ->#foo : () => string + get #foo() { return ""} +>#foo : string >"" : "" + } + + // Error + class A_Setter_Setter { +>A_Setter_Setter : A_Setter_Setter + + set #foo(value: string) { } +>#foo : string +>value : string - get #foo() { return ""} + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_Setter_StaticField { +>A_Setter_StaticField : A_Setter_StaticField + + set #foo(value: string) { } +>#foo : string +>value : string + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_Setter_StaticMethod { +>A_Setter_StaticMethod : A_Setter_StaticMethod + + set #foo(value: string) { } +>#foo : string +>value : string + + static #foo() { } +>#foo : () => void + } + + // Error + class A_Setter_StaticGetter { +>A_Setter_StaticGetter : A_Setter_StaticGetter + + set #foo(value: string) { } +>#foo : string +>value : string + + static get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_Setter_StaticSetter { +>A_Setter_StaticSetter : A_Setter_StaticSetter + + set #foo(value: string) { } +>#foo : string +>value : string + + static set #foo(value: string) { } +>#foo : string +>value : string + } } +function StaticField() { +>StaticField : () => void + + // Error + class A_StaticField_Field { +>A_StaticField_Field : A_StaticField_Field -class A6 { ->A6 : A6 + static #foo = "foo"; +>#foo : string +>"foo" : "foo" - #foo = "foo"; + #foo = "foo"; >#foo : string >"foo" : "foo" + } + + // Error + class A_StaticField_Method { +>A_StaticField_Method : A_StaticField_Method + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + #foo() { } +>#foo : () => void + } + + // Error + class A_StaticField_Getter { +>A_StaticField_Getter : A_StaticField_Getter - #foo() { return ""} ->#foo : () => string + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + get #foo() { return ""} +>#foo : string >"" : "" + } + + // Error + class A_StaticField_Setter { +>A_StaticField_Setter : A_StaticField_Setter - get #foo() { return ""} + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_StaticField_StaticField { +>A_StaticField_StaticField : A_StaticField_StaticField + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_StaticField_StaticMethod { +>A_StaticField_StaticMethod : A_StaticField_StaticMethod + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_StaticField_StaticGetter { +>A_StaticField_StaticGetter : A_StaticField_StaticGetter + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_StaticField_StaticSetter { +>A_StaticField_StaticSetter : A_StaticField_StaticSetter + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + + static set #foo(value: string) { } +>#foo : string +>value : string + } } -class A7 { ->A7 : A7 +function StaticMethod() { +>StaticMethod : () => void + + // Error + class A_StaticMethod_Field { +>A_StaticMethod_Field : A_StaticMethod_Field + + static #foo() { } +>#foo : () => void - get #foo() { return ""; } + #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_StaticMethod_Method { +>A_StaticMethod_Method : A_StaticMethod_Method + + static #foo() { } +>#foo : () => void + + #foo() { } +>#foo : () => void + } + + // Error + class A_StaticMethod_Getter { +>A_StaticMethod_Getter : A_StaticMethod_Getter + + static #foo() { } +>#foo : () => void + + get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_StaticMethod_Setter { +>A_StaticMethod_Setter : A_StaticMethod_Setter - get #foo() { return ""; } + static #foo() { } +>#foo : () => void + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_StaticMethod_StaticField { +>A_StaticMethod_StaticField : A_StaticMethod_StaticField + + static #foo() { } +>#foo : () => void + + static #foo = "foo"; +>#foo : () => void +>"foo" : "foo" + } + + // Error + class A_StaticMethod_StaticMethod { +>A_StaticMethod_StaticMethod : A_StaticMethod_StaticMethod + + static #foo() { } +>#foo : () => void + + static #foo() { } +>#foo : () => void + } + + // Error + class A_StaticMethod_StaticGetter { +>A_StaticMethod_StaticGetter : A_StaticMethod_StaticGetter + + static #foo() { } +>#foo : () => void + + static get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_StaticMethod_StaticSetter { +>A_StaticMethod_StaticSetter : A_StaticMethod_StaticSetter + + static #foo() { } +>#foo : () => void + + static set #foo(value: string) { } +>#foo : string +>value : string + } } -class A8 { ->A8 : A8 +function StaticGetter() { +>StaticGetter : () => void - set #foo(a: string) {} + // Error + class A_StaticGetter_Field { +>A_StaticGetter_Field : A_StaticGetter_Field + + static get #foo() { return ""} +>#foo : string +>"" : "" + + #foo = "foo"; >#foo : string ->a : string +>"foo" : "foo" + } + + // Error + class A_StaticGetter_Method { +>A_StaticGetter_Method : A_StaticGetter_Method - set #foo(a: string) {} + static get #foo() { return ""} >#foo : string ->a : string +>"" : "" + + #foo() { } +>#foo : () => void + } + + // Error + class A_StaticGetter_Getter { +>A_StaticGetter_Getter : A_StaticGetter_Getter + + static get #foo() { return ""} +>#foo : string +>"" : "" + + get #foo() { return ""} +>#foo : string +>"" : "" + } + + // Error + class A_StaticGetter_Setter { +>A_StaticGetter_Setter : A_StaticGetter_Setter + + static get #foo() { return ""} +>#foo : string +>"" : "" + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_StaticGetter_StaticField { +>A_StaticGetter_StaticField : A_StaticGetter_StaticField + + static get #foo() { return ""} +>#foo : string +>"" : "" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_StaticGetter_StaticMethod { +>A_StaticGetter_StaticMethod : A_StaticGetter_StaticMethod + + static get #foo() { return ""} +>#foo : string +>"" : "" + + static #foo() { } +>#foo : () => void + } + + // Error + class A_StaticGetter_StaticGetter { +>A_StaticGetter_StaticGetter : A_StaticGetter_StaticGetter + + static get #foo() { return ""} +>#foo : string +>"" : "" + + static get #foo() { return ""} +>#foo : string +>"" : "" + } + // OK + class A_StaticGetter_StaticSetter { +>A_StaticGetter_StaticSetter : A_StaticGetter_StaticSetter + + static get #foo() { return ""} +>#foo : string +>"" : "" + + static set #foo(value: string) { } +>#foo : string +>value : string + } } -class A9 { ->A9 : A9 +function StaticSetter() { +>StaticSetter : () => void + + // Error + class A_StaticSetter_Field { +>A_StaticSetter_Field : A_StaticSetter_Field + + static set #foo(value: string) { } +>#foo : string +>value : string + + #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_StaticSetter_Method { +>A_StaticSetter_Method : A_StaticSetter_Method + + static set #foo(value: string) { } +>#foo : string +>value : string + + #foo() { } +>#foo : () => void + } + + + // Error + class A_StaticSetter_Getter { +>A_StaticSetter_Getter : A_StaticSetter_Getter + + static set #foo(value: string) { } +>#foo : string +>value : string - get #foo() { return ""; } + get #foo() { return ""} >#foo : string >"" : "" + } - set #foo(a: string) {} + // Error + class A_StaticSetter_Setter { +>A_StaticSetter_Setter : A_StaticSetter_Setter + + static set #foo(value: string) { } +>#foo : string +>value : string + + set #foo(value: string) { } +>#foo : string +>value : string + } + + // Error + class A_StaticSetter_StaticField { +>A_StaticSetter_StaticField : A_StaticSetter_StaticField + + static set #foo(value: string) { } +>#foo : string +>value : string + + static #foo = "foo"; +>#foo : string +>"foo" : "foo" + } + + // Error + class A_StaticSetter_StaticMethod { +>A_StaticSetter_StaticMethod : A_StaticSetter_StaticMethod + + static set #foo(value: string) { } +>#foo : string +>value : string + + static #foo() { } +>#foo : () => void + } + + // OK + class A_StaticSetter_StaticGetter { +>A_StaticSetter_StaticGetter : A_StaticSetter_StaticGetter + + static set #foo(value: string) { } >#foo : string ->a : string +>value : string - get #foo() { return ""; } + static get #foo() { return ""} >#foo : string >"" : "" + } + + // Error + class A_StaticSetter_StaticSetter { +>A_StaticSetter_StaticSetter : A_StaticSetter_StaticSetter + + static set #foo(value: string) { } +>#foo : string +>value : string - set #foo(a: string) {} + static set #foo(value: string) { } >#foo : string ->a : string +>value : string + } } diff --git a/tests/baselines/reference/privateNamesUnique-3.errors.txt b/tests/baselines/reference/privateNamesUnique-3.errors.txt index 03b52f61ce4f1..d77e1823388a5 100644 --- a/tests/baselines/reference/privateNamesUnique-3.errors.txt +++ b/tests/baselines/reference/privateNamesUnique-3.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(3,12): error TS2300: Duplicate identifier '#foo'. +tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(3,12): error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(11,11): error TS2339: Property '#foo' does not exist on type 'B'. @@ -7,7 +7,7 @@ tests/cases/conformance/classes/members/privateNames/privateNamesUnique-3.ts(11, #foo = 1; static #foo = true; // error (duplicate) ~~~~ -!!! error TS2300: Duplicate identifier '#foo'. +!!! error TS2804: Duplicate identifier '#foo'. Static and instance elements cannot share the same private name. // because static and instance private names // share the same lexical scope // https://tc39.es/proposal-class-fields/#prod-ClassBody diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts index 3959fcdb8b85f..2813327ccecf1 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameDuplicateField.ts @@ -1,53 +1,405 @@ // @strict: true // @target: es6 -class A { - #foo = "foo"; - #foo = "foo"; -} +function Field() { + + // Error + class A_Field_Field { + #foo = "foo"; + #foo = "foo"; + } + + // Error + class A_Field_Method { + #foo = "foo"; + #foo() { } + } + + // Error + class A_Field_Getter { + #foo = "foo"; + get #foo() { return ""} + } + + // Error + class A_Field_Setter { + #foo = "foo"; + set #foo(value: string) { } + } + + // Error + class A_Field_StaticField { + #foo = "foo"; + static #foo = "foo"; + } + + // Error + class A_Field_StaticMethod { + #foo = "foo"; + static #foo() { } + } -class A2 { - #foo = "foo"; - #foo() {} + // Error + class A_Field_StaticGetter { + #foo = "foo"; + static get #foo() { return ""} + } + + // Error + class A_Field_StaticSetter { + #foo = "foo"; + static set #foo(value: string) { } + } } +function Method() { + // Error + class A_Method_Field { + #foo() { } + #foo = "foo"; + } + + // Error + class A_Method_Method { + #foo() { } + #foo() { } + } + + // Error + class A_Method_Getter { + #foo() { } + get #foo() { return ""} + } + + // Error + class A_Method_Setter { + #foo() { } + set #foo(value: string) { } + } + + // Error + class A_Method_StaticField { + #foo() { } + static #foo = "foo"; + } + + // Error + class A_Method_StaticMethod { + #foo() { } + static #foo() { } + } + + // Error + class A_Method_StaticGetter { + #foo() { } + static get #foo() { return ""} + } -class A3 { - #foo = "foo"; - get #foo() { return ""} + // Error + class A_Method_StaticSetter { + #foo() { } + static set #foo(value: string) { } + } } -class A4 { - #foo() { return ""} - #foo() { return ""} + +function Getter() { + // Error + class A_Getter_Field { + get #foo() { return ""} + #foo = "foo"; + } + + // Error + class A_Getter_Method { + get #foo() { return ""} + #foo() { } + } + + // Error + class A_Getter_Getter { + get #foo() { return ""} + get #foo() { return ""} + } + + //OK + class A_Getter_Setter { + get #foo() { return ""} + set #foo(value: string) { } + } + + // Error + class A_Getter_StaticField { + get #foo() { return ""} + static #foo() { } + } + + // Error + class A_Getter_StaticMethod { + get #foo() { return ""} + static #foo() { } + } + + // Error + class A_Getter_StaticGetter { + get #foo() { return ""} + static get #foo() { return ""} + } + + // Error + class A_Getter_StaticSetter { + get #foo() { return ""} + static set #foo(value: string) { } + } } +function Setter() { + // Error + class A_Setter_Field { + set #foo(value: string) { } + #foo = "foo"; + } + + // Error + class A_Setter_Method { + set #foo(value: string) { } + #foo() { } + } + + // OK + class A_Setter_Getter { + set #foo(value: string) { } + get #foo() { return ""} + } + + // Error + class A_Setter_Setter { + set #foo(value: string) { } + set #foo(value: string) { } + } + + // Error + class A_Setter_StaticField { + set #foo(value: string) { } + static #foo = "foo"; + } + + // Error + class A_Setter_StaticMethod { + set #foo(value: string) { } + static #foo() { } + } + + // Error + class A_Setter_StaticGetter { + set #foo(value: string) { } + static get #foo() { return ""} + } -class A5 { - #foo() { return ""} - get #foo() { return ""} + // Error + class A_Setter_StaticSetter { + set #foo(value: string) { } + static set #foo(value: string) { } + } } +function StaticField() { + // Error + class A_StaticField_Field { + static #foo = "foo"; + #foo = "foo"; + } -class A6 { - #foo = "foo"; - #foo() { return ""} - get #foo() { return ""} + // Error + class A_StaticField_Method { + static #foo = "foo"; + #foo() { } + } + + // Error + class A_StaticField_Getter { + static #foo = "foo"; + get #foo() { return ""} + } + + // Error + class A_StaticField_Setter { + static #foo = "foo"; + set #foo(value: string) { } + } + + // Error + class A_StaticField_StaticField { + static #foo = "foo"; + static #foo = "foo"; + } + + // Error + class A_StaticField_StaticMethod { + static #foo = "foo"; + static #foo() { } + } + + // Error + class A_StaticField_StaticGetter { + static #foo = "foo"; + static get #foo() { return ""} + } + + // Error + class A_StaticField_StaticSetter { + static #foo = "foo"; + static set #foo(value: string) { } + } } -class A7 { - get #foo() { return ""; } - get #foo() { return ""; } +function StaticMethod() { + // Error + class A_StaticMethod_Field { + static #foo() { } + #foo = "foo"; + } + + // Error + class A_StaticMethod_Method { + static #foo() { } + #foo() { } + } + + // Error + class A_StaticMethod_Getter { + static #foo() { } + get #foo() { return ""} + } + + // Error + class A_StaticMethod_Setter { + static #foo() { } + set #foo(value: string) { } + } + + // Error + class A_StaticMethod_StaticField { + static #foo() { } + static #foo = "foo"; + } + + // Error + class A_StaticMethod_StaticMethod { + static #foo() { } + static #foo() { } + } + + // Error + class A_StaticMethod_StaticGetter { + static #foo() { } + static get #foo() { return ""} + } + + // Error + class A_StaticMethod_StaticSetter { + static #foo() { } + static set #foo(value: string) { } + } } -class A8 { - set #foo(a: string) {} - set #foo(a: string) {} +function StaticGetter() { + + // Error + class A_StaticGetter_Field { + static get #foo() { return ""} + #foo = "foo"; + } + + // Error + class A_StaticGetter_Method { + static get #foo() { return ""} + #foo() { } + } + + // Error + class A_StaticGetter_Getter { + static get #foo() { return ""} + get #foo() { return ""} + } + + // Error + class A_StaticGetter_Setter { + static get #foo() { return ""} + set #foo(value: string) { } + } + + // Error + class A_StaticGetter_StaticField { + static get #foo() { return ""} + static #foo() { } + } + + // Error + class A_StaticGetter_StaticMethod { + static get #foo() { return ""} + static #foo() { } + } + + // Error + class A_StaticGetter_StaticGetter { + static get #foo() { return ""} + static get #foo() { return ""} + } + // OK + class A_StaticGetter_StaticSetter { + static get #foo() { return ""} + static set #foo(value: string) { } + } } -class A9 { - get #foo() { return ""; } - set #foo(a: string) {} - get #foo() { return ""; } - set #foo(a: string) {} +function StaticSetter() { + // Error + class A_StaticSetter_Field { + static set #foo(value: string) { } + #foo = "foo"; + } + + // Error + class A_StaticSetter_Method { + static set #foo(value: string) { } + #foo() { } + } + + + // Error + class A_StaticSetter_Getter { + static set #foo(value: string) { } + get #foo() { return ""} + } + + // Error + class A_StaticSetter_Setter { + static set #foo(value: string) { } + set #foo(value: string) { } + } + + // Error + class A_StaticSetter_StaticField { + static set #foo(value: string) { } + static #foo = "foo"; + } + + // Error + class A_StaticSetter_StaticMethod { + static set #foo(value: string) { } + static #foo() { } + } + + // OK + class A_StaticSetter_StaticGetter { + static set #foo(value: string) { } + static get #foo() { return ""} + } + + // Error + class A_StaticSetter_StaticSetter { + static set #foo(value: string) { } + static set #foo(value: string) { } + } } From 62b4f2f6edf3fb89acd206422073feb41780d30e Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Tue, 23 Feb 2021 19:54:06 +0200 Subject: [PATCH 43/68] Added error when using initializers with private static fields when useDefineForClassFields is not specified and target is esnext. --- src/compiler/checker.ts | 3 ++ src/compiler/diagnosticMessages.json | 4 +++ .../privateNameFieldsESNext.errors.txt | 5 +++- ...taticInitializer(target=esnext).errors.txt | 15 ++++++++++ ...tructuredBinding(target=esnext).errors.txt | 30 +++++++++++++++++++ ...FieldInitializer(target=esnext).errors.txt | 11 +++++++ 6 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).errors.txt create mode 100644 tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).errors.txt create mode 100644 tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).errors.txt diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c96c626c4f91a..3361eddf4a311 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32309,6 +32309,9 @@ namespace ts { getNodeLinks(lexicalScope).flags |= NodeCheckFlags.ContainsClassWithPrivateIdentifiers; } } + if (isPrivateIdentifier(node.name) && hasStaticModifier(node) && node.initializer && languageVersion === ScriptTarget.ESNext && !compilerOptions.useDefineForClassFields) { + error(node.initializer, Diagnostics.Static_fields_with_private_names_can_t_have_initializers_when_the_useDefineForClassFields_flag_is_not_specified_with_a_target_of_esnext_Consider_adding_the_useDefineForClassFields_flag); + } } function checkPropertySignature(node: PropertySignature) { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 456bd85619c6a..9053e5e99e97f 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -3272,6 +3272,10 @@ "category": "Error", "code": 2804 }, + "Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag.": { + "category": "Error", + "code": 2805 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/privateNameFieldsESNext.errors.txt b/tests/baselines/reference/privateNameFieldsESNext.errors.txt index 28f283e66a817..10288bc30085d 100644 --- a/tests/baselines/reference/privateNameFieldsESNext.errors.txt +++ b/tests/baselines/reference/privateNameFieldsESNext.errors.txt @@ -1,7 +1,8 @@ tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts(8,9): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts(11,17): error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. -==== tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts (1 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts (2 errors) ==== class C { a = 123; #a = 10; @@ -15,6 +16,8 @@ tests/cases/conformance/classes/members/privateNames/privateNameFieldsESNext.ts( console.log(this.#b); } static #m = "test"; + ~~~~~~ +!!! error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. static #x; static test() { console.log(this.#m); diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).errors.txt b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).errors.txt new file mode 100644 index 0000000000000..ae43b5335e8f9 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts(2,17): error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. +tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts(3,18): error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticAndStaticInitializer.ts (2 errors) ==== + class A { + static #foo = 1; + ~ +!!! error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + static #prop = 2; + ~ +!!! error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + } + + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).errors.txt b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).errors.txt new file mode 100644 index 0000000000000..f0932d7ba51aa --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).errors.txt @@ -0,0 +1,30 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts(2,21): error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldDestructuredBinding.ts (1 errors) ==== + class A { + static #field = 1; + ~ +!!! error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + otherClass = A; + testObject() { + return { x: 10, y: 6 }; + } + testArray() { + return [10, 11]; + } + constructor() { + let y: number; + ({ x: A.#field, y } = this.testObject()); + ([A.#field, y] = this.testArray()); + ({ a: A.#field, b: [A.#field] } = { a: 1, b: [2] }); + [A.#field, [A.#field]] = [1, [2]]; + ({ a: A.#field = 1, b: [A.#field = 1] } = { b: [] }); + [A.#field = 2] = []; + [this.otherClass.#field = 2] = []; + } + static test(_a: typeof A) { + [_a.#field] = [2]; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).errors.txt b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).errors.txt new file mode 100644 index 0000000000000..13dc546e2dd96 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts(2,21): error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + + +==== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldInitializer.ts (1 errors) ==== + class A { + static #field = 10; + ~~ +!!! error TS2805: Static fields with private names can't have initializers when the '--useDefineForClassFields' flag is not specified with a '--target' of 'esnext'. Consider adding the '--useDefineForClassFields' flag. + static #uninitialized; + } + \ No newline at end of file From b2a692d684b0be1590cfaabb4eb94233aea4e125 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 24 Feb 2021 10:03:04 +0200 Subject: [PATCH 44/68] Fixed code review issues. --- src/compiler/checker.ts | 2 +- src/compiler/transformers/classFields.ts | 28 +++++++++++++----------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3361eddf4a311..40800e1d6bbbd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32168,7 +32168,7 @@ namespace ts { const prev = names.get(name); if (prev) { // For private identifiers, do not allow mixing of static and instance members with the same name - if((prev & DeclarationMeaning.PrivateStatic) !== (meaning & DeclarationMeaning.PrivateStatic)) { + if ((prev & DeclarationMeaning.PrivateStatic) !== (meaning & DeclarationMeaning.PrivateStatic)) { error(location, Diagnostics.Duplicate_identifier_0_Static_and_instance_elements_cannot_share_the_same_private_name, getTextOfNode(location)); } else { diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 487d2fcd2e4a0..214819ef5d8c4 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -684,6 +684,9 @@ namespace ts { function doesClassElementNeedTransform(node: ClassElement) { return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } + function getPrivateUnitializedPrivateStaticFields(node: ClassLikeDeclaration) { + return filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer) + } function getPrivateInstanceMethods(node: ClassLikeDeclaration) { return filter( @@ -731,8 +734,8 @@ namespace ts { staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); } else { - // We must initialize static private properties even if the don't have a value as we initialize them with a wrapper object which mist always exist. - const staticUninitializedPrivateProperties = filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); + // We must initialize static private properties even if the don't have a value as we initialize them with a wrapper object which must always exist. + const staticUninitializedPrivateProperties = getPrivateUnitializedPrivateStaticFields(node); if (some(staticUninitializedPrivateProperties)) { addPropertyStatements(statements, staticUninitializedPrivateProperties, factory.getInternalName(node)); } @@ -765,8 +768,7 @@ namespace ts { // so we rely on standard init even under useDefineForClassFields:false staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); } - const staticUninitializedPrivateProperties = !shouldTransformPrivateElements ? []: - filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); + const staticUninitializedPrivateProperties = !shouldTransformPrivateElements ? []: getPrivateUnitializedPrivateStaticFields(node); const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); @@ -787,7 +789,7 @@ namespace ts { transformClassMembers(node, isDerivedClass) ); - if (some(staticUninitializedPrivateProperties) ||some(staticProperties) || some(pendingExpressions)) { + if (some(staticUninitializedPrivateProperties) || some(staticProperties) || some(pendingExpressions)) { if (isDecoratedClassDeclaration) { Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."); @@ -804,7 +806,7 @@ namespace ts { addPropertyStatements(pendingStatements, staticUninitializedPrivateProperties, factory.getInternalName(node)); } } - if(temp) { + if (temp) { return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]); } return classExpression; @@ -1234,11 +1236,11 @@ namespace ts { function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { const text = getTextOfPropertyName(node.name) as string; - const { weakSetName } = getPrivateIdentifierEnvironment(); + const env = getPrivateIdentifierEnvironment(); + const { weakSetName } = env; let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; - const env = getPrivateIdentifierEnvironment(); - if(hasStaticModifier(node)) { + if (hasStaticModifier(node)) { if (isPropertyDeclaration(node)) { const variableName = createHoistedVariableForPrivateName(text); info = { @@ -1247,7 +1249,7 @@ namespace ts { classConstructor: env.classConstructor }; } - else if(isMethodDeclaration(node)) { + else if (isMethodDeclaration(node)) { const functionName = createHoistedVariableForPrivateName(text); info = { placement: PrivateIdentifierPlacement.StaticMethod, @@ -1255,7 +1257,7 @@ namespace ts { classConstructor: env.classConstructor }; } - else if(isGetAccessorDeclaration(node)) { + else if (isGetAccessorDeclaration(node)) { const getterName = createHoistedVariableForPrivateName(text + "_get"); const previousInfo = findPreviousStaticAccessorInfo(node); if (previousInfo?.placement === PrivateIdentifierPlacement.StaticSetterOnly) { @@ -1274,7 +1276,7 @@ namespace ts { }; } } - else if(isSetAccessorDeclaration(node)) { + else if (isSetAccessorDeclaration(node)) { const setterName = createHoistedVariableForPrivateName(text + "_set"); const previousInfo = findPreviousStaticAccessorInfo(node); if (previousInfo?.placement === PrivateIdentifierPlacement.StaticGetterOnly) { @@ -1294,7 +1296,7 @@ namespace ts { } } else { - return; + Debug.assertNever(node, "Unknown class element type.") } } else if (isPropertyDeclaration(node)) { From 363041ec46929f970d0adad36d075e09915ef219 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 24 Feb 2021 11:34:03 +0200 Subject: [PATCH 45/68] Removed semantically wrong emit on `useDefineForClassFields:true` with `target:esnext` --- src/compiler/transformers/classFields.ts | 24 +++++-------------- .../reference/privateNameFieldsESNext.js | 3 ++- ...aticAndStaticInitializer(target=esnext).js | 6 +++-- ...FieldDestructuredBinding(target=esnext).js | 3 ++- ...meStaticFieldInitializer(target=esnext).js | 3 ++- 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 214819ef5d8c4..4696693a1f1f5 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -336,8 +336,6 @@ namespace ts { Debug.assert(!some(node.decorators)); if (!shouldTransformPrivateElements && isPrivateIdentifier(node.name)) { // Initializer is elided as the field is initialized in transformConstructor. - // We include initalizers for static private fields as there is no simple way to do this emit, - // and nobody is relying on the old assignment semantics for private static fields. return factory.updatePropertyDeclaration( node, /*decorators*/ undefined, @@ -345,7 +343,7 @@ namespace ts { node.name, /*questionOrExclamationToken*/ undefined, /*type*/ undefined, - /*initializer*/ hasStaticModifier(node) ? node.initializer : undefined + /*initializer*/ undefined ); } // Create a temporary variable to store a computed property name (if necessary). @@ -685,7 +683,7 @@ namespace ts { return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } function getPrivateUnitializedPrivateStaticFields(node: ClassLikeDeclaration) { - return filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer) + return filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); } function getPrivateInstanceMethods(node: ClassLikeDeclaration) { @@ -726,14 +724,9 @@ namespace ts { // From ES6 specification: // HasLexicalDeclaration (N) : Determines if the argument identifier has a binding in this environment record that was created using // a lexical declaration such as a LexicalDeclaration or a ClassDeclaration. - let staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); - if (languageVersion === ScriptTarget.ESNext) { - // We can't initialize static private properties after the class as the are not in the lexical scope - // so we rely on standard init even under useDefineForClassFields:false - staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); - } - else { + if (languageVersion < ScriptTarget.ESNext) { // We must initialize static private properties even if the don't have a value as we initialize them with a wrapper object which must always exist. const staticUninitializedPrivateProperties = getPrivateUnitializedPrivateStaticFields(node); if (some(staticUninitializedPrivateProperties)) { @@ -762,12 +755,8 @@ namespace ts { // these statements after the class expression variable statement. const isDecoratedClassDeclaration = isClassDeclaration(getOriginalNode(node)); - let staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); - if (!shouldTransformPrivateElements) { - // We can't initialize static private properties after the class as the are not in the lexical scope - // so we rely on standard init even under useDefineForClassFields:false - staticProperties = filter(staticProperties, p => !isPrivateIdentifier(p.name)); - } + const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + const staticUninitializedPrivateProperties = !shouldTransformPrivateElements ? []: getPrivateUnitializedPrivateStaticFields(node); const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); @@ -1265,7 +1254,6 @@ namespace ts { ...previousInfo, placement: PrivateIdentifierPlacement.StaticGetterAndSetter, getterName, - setterName: previousInfo.setterName, }; } else { diff --git a/tests/baselines/reference/privateNameFieldsESNext.js b/tests/baselines/reference/privateNameFieldsESNext.js index 99abdeb482a20..acc37caa3cc8f 100644 --- a/tests/baselines/reference/privateNameFieldsESNext.js +++ b/tests/baselines/reference/privateNameFieldsESNext.js @@ -35,7 +35,7 @@ class C { this.#a = "hello"; console.log(this.#b); } - static #m = "test"; + static #m; static #x; static test() { console.log(this.#m); @@ -43,3 +43,4 @@ class C { } #something; } +C.#m = "test"; diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js index ccd7fec0c66bc..2e3d168e42004 100644 --- a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=esnext).js @@ -8,6 +8,8 @@ class A { //// [privateNameStaticAndStaticInitializer.js] class A { - static #foo = 1; - static #prop = 2; + static #foo; + static #prop; } +A.#foo = 1; +A.#prop = 2; diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js index 69b4fff34e2bf..bbaf5cd7601ab 100644 --- a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=esnext).js @@ -37,7 +37,7 @@ class A { [A.#field = 2] = []; [this.otherClass.#field = 2] = []; } - static #field = 1; + static #field; testObject() { return { x: 10, y: 6 }; } @@ -48,3 +48,4 @@ class A { [_a.#field] = [2]; } } +A.#field = 1; diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js index f52e29bf027e5..fddf56e1754c5 100644 --- a/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=esnext).js @@ -7,6 +7,7 @@ class A { //// [privateNameStaticFieldInitializer.js] class A { - static #field = 10; + static #field; static #uninitialized; } +A.#field = 10; From 64757e0e78f689d022962783b4fd80d41eb9fea2 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 25 Feb 2021 10:11:04 +0200 Subject: [PATCH 46/68] Changed emit for uninitialized private static fields. --- src/compiler/transformers/classFields.ts | 27 +++++-------------- ...meStaticFieldInitializer(target=es2015).js | 2 +- 2 files changed, 7 insertions(+), 22 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 4696693a1f1f5..38822a7ab0741 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -682,9 +682,6 @@ namespace ts { function doesClassElementNeedTransform(node: ClassElement) { return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } - function getPrivateUnitializedPrivateStaticFields(node: ClassLikeDeclaration) { - return filter(node.members, (p): p is PropertyDeclaration => isPropertyDeclaration(p) && isPrivateIdentifier(p.name) && hasStaticModifier(p) && !p.initializer); - } function getPrivateInstanceMethods(node: ClassLikeDeclaration) { return filter( @@ -724,15 +721,7 @@ namespace ts { // From ES6 specification: // HasLexicalDeclaration (N) : Determines if the argument identifier has a binding in this environment record that was created using // a lexical declaration such as a LexicalDeclaration or a ClassDeclaration. - const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); - - if (languageVersion < ScriptTarget.ESNext) { - // We must initialize static private properties even if the don't have a value as we initialize them with a wrapper object which must always exist. - const staticUninitializedPrivateProperties = getPrivateUnitializedPrivateStaticFields(node); - if (some(staticUninitializedPrivateProperties)) { - addPropertyStatements(statements, staticUninitializedPrivateProperties, factory.getInternalName(node)); - } - } + const staticProperties = getProperties(node, /*requireInitializer*/ false, /*isStatic*/ true); if (some(staticProperties)) { addPropertyStatements(statements, staticProperties, factory.getInternalName(node)); @@ -755,9 +744,8 @@ namespace ts { // these statements after the class expression variable statement. const isDecoratedClassDeclaration = isClassDeclaration(getOriginalNode(node)); - const staticProperties = getProperties(node, /*requireInitializer*/ true, /*isStatic*/ true); + const staticProperties = getProperties(node, /*requireInitializer*/ false, /*isStatic*/ true); - const staticUninitializedPrivateProperties = !shouldTransformPrivateElements ? []: getPrivateUnitializedPrivateStaticFields(node); const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); @@ -778,7 +766,7 @@ namespace ts { transformClassMembers(node, isDerivedClass) ); - if (some(staticUninitializedPrivateProperties) || some(staticProperties) || some(pendingExpressions)) { + if (some(staticProperties, p => !!p.initializer || isPrivateIdentifier(p.name)) || some(pendingExpressions)) { if (isDecoratedClassDeclaration) { Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."); @@ -791,9 +779,6 @@ namespace ts { if (some(staticProperties)) { addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); } - if (some(staticUninitializedPrivateProperties)) { - addPropertyStatements(pendingStatements, staticUninitializedPrivateProperties, factory.getInternalName(node)); - } } if (temp) { return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]); @@ -818,7 +803,7 @@ namespace ts { // Add any pending expressions leftover from elided or relocated computed property names addRange(expressions, map(pendingExpressions, startOnNewLine)); addRange(expressions, generateInitializedPropertyExpressions(staticProperties, temp)); - addRange(expressions, generateInitializedPropertyExpressions(staticUninitializedPrivateProperties, temp)); + expressions.push(startOnNewLine(temp)); return factory.inlineExpressions(expressions); @@ -1069,7 +1054,7 @@ namespace ts { Debug.fail("Undeclared private name for property declaration."); } } - if (isPrivateIdentifier(propertyName) && !property.initializer) { + if ((isPrivateIdentifier(propertyName) || hasStaticModifier(property)) && !property.initializer) { return undefined; } @@ -1284,7 +1269,7 @@ namespace ts { } } else { - Debug.assertNever(node, "Unknown class element type.") + Debug.assertNever(node, "Unknown class element type."); } } else if (isPropertyDeclaration(node)) { diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js index 302cb724a91f7..de150cb8fd87f 100644 --- a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js @@ -9,5 +9,5 @@ class A { var _A_field, _A_uninitialized; class A { } -_A_uninitialized = { value: void 0 }; _A_field = { value: 10 }; +_A_uninitialized = { value: void 0 }; From 68a7f800ec37c3ebbeb10670598c628f94d59816 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 25 Feb 2021 11:05:32 +0200 Subject: [PATCH 47/68] Added runtime error in helper if a static private field is accessed before it was declared. --- src/compiler/factory/emitHelpers.ts | 6 ++++++ tests/baselines/reference/privateNameAndObjectRestSpread.js | 3 +++ .../reference/privateNameStaticAccessorsCallExpression.js | 3 +++ tests/baselines/reference/privateNameStaticFieldAccess.js | 3 +++ .../baselines/reference/privateNameStaticFieldAssignment.js | 6 ++++++ .../reference/privateNameStaticFieldCallExpression.js | 3 +++ .../reference/privateNameStaticFieldClassExpression.js | 3 +++ .../reference/privateNameStaticFieldDerivedClasses.js | 6 ++++++ ...vateNameStaticFieldDestructuredBinding(target=es2015).js | 3 +++ .../reference/privateNameStaticFieldUnaryMutation.js | 6 ++++++ .../reference/privateNameStaticMethodClassExpression.js | 3 +++ tests/baselines/reference/privateNamesAndStaticFields.js | 6 ++++++ tests/baselines/reference/privateNamesConstructorChain-1.js | 3 +++ tests/baselines/reference/privateNamesConstructorChain-2.js | 3 +++ tests/baselines/reference/privateNamesUnique-3.js | 3 +++ 15 files changed, 60 insertions(+) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index c816ade231528..a65e32b220ef7 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -998,6 +998,9 @@ namespace ts { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; };` }; @@ -1011,6 +1014,9 @@ namespace ts { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; };` diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index 44ca402544baa..c1f8288ff3b31 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -28,6 +28,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var __rest = (this && this.__rest) || function (s, e) { diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js index 3636bda179073..a34f6f9ee361b 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js @@ -23,6 +23,9 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.js b/tests/baselines/reference/privateNameStaticFieldAccess.js index 1493de026075f..9ccf5db488e29 100644 --- a/tests/baselines/reference/privateNameStaticFieldAccess.js +++ b/tests/baselines/reference/privateNameStaticFieldAccess.js @@ -13,6 +13,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _A_myField; diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.js b/tests/baselines/reference/privateNameStaticFieldAssignment.js index 76c140da1e309..94778a41f3667 100644 --- a/tests/baselines/reference/privateNameStaticFieldAssignment.js +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.js @@ -40,6 +40,9 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; @@ -47,6 +50,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _A_field; diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.js b/tests/baselines/reference/privateNameStaticFieldCallExpression.js index 4bd4350fc0118..6ecf4ee1367e5 100644 --- a/tests/baselines/reference/privateNameStaticFieldCallExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.js @@ -25,6 +25,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _A_fieldFunc, _A_fieldFunc2; diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.js b/tests/baselines/reference/privateNameStaticFieldClassExpression.js index 6bad09f78d404..78ec26dd09ebe 100644 --- a/tests/baselines/reference/privateNameStaticFieldClassExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.js @@ -27,6 +27,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _B_foo, _B_foo2, _a, _b; diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js index bdad1319d82c1..b87120baff81c 100644 --- a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js @@ -21,6 +21,9 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; @@ -28,6 +31,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _Base_prop, _Derived_derivedProp; diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js index cdd7cecba6daf..670bdb67f084c 100644 --- a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js @@ -29,6 +29,9 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js index ed80b28631f79..34c9cb9d0e223 100644 --- a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js @@ -34,12 +34,18 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.js b/tests/baselines/reference/privateNameStaticMethodClassExpression.js index 1d321c7af3c59..8b7e3859d885e 100644 --- a/tests/baselines/reference/privateNameStaticMethodClassExpression.js +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.js @@ -17,6 +17,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index 6bebd095e4550..09bf413c203f1 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -28,6 +28,9 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } propertyDescriptor.value = value; return value; }; @@ -35,6 +38,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _A_foo, _A_bar, _B_foo; diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index dc6977aa3bbc7..b97c0939da014 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -25,6 +25,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index d375038281c29..4e53e4b954c42 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -27,6 +27,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index a0d46b395cc08..a6a4ba06d4b6e 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -19,6 +19,9 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } return propertyDescriptor.value; }; var _A_foo, _A_foo_1, _B_foo; From 7e7b0b18a906fd94a62cb8de038276b338f0b791 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 25 Feb 2021 19:20:02 +0200 Subject: [PATCH 48/68] Fixed code review comments for private identifier static class elements. --- src/compiler/transformers/classFields.ts | 23 +++++++-------- .../reference/privateNameAndAny.errors.txt | 29 ++++++++++++++----- .../baselines/reference/privateNameAndAny.js | 21 ++++++++++++-- .../reference/privateNameAndAny.symbols | 24 +++++++++++---- .../reference/privateNameAndAny.types | 22 ++++++++++++-- ...StaticFieldNoInitializer(target=es2015).js | 18 ++++++++++++ ...cFieldNoInitializer(target=es2015).symbols | 14 +++++++++ ...ticFieldNoInitializer(target=es2015).types | 15 ++++++++++ ...StaticFieldNoInitializer(target=esnext).js | 16 ++++++++++ ...cFieldNoInitializer(target=esnext).symbols | 14 +++++++++ ...ticFieldNoInitializer(target=esnext).types | 15 ++++++++++ .../members/privateNames/privateNameAndAny.ts | 6 +++- .../privateNameStaticFieldNoInitializer.ts | 9 ++++++ 13 files changed, 194 insertions(+), 32 deletions(-) create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).types create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).js create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).symbols create mode 100644 tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 38822a7ab0741..2370daade5c66 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -691,7 +691,7 @@ namespace ts { } function visitClassDeclaration(node: ClassDeclaration) { - getPrivateIdentifierEnvironment().classConstructor = factory.getInternalName(node) ; + getPrivateIdentifierEnvironment().classConstructor = factory.getInternalName(node); if (!forEach(node.members, doesClassElementNeedTransform)) { return visitEachChild(node, visitor, context); } @@ -765,8 +765,8 @@ namespace ts { visitNodes(node.heritageClauses, visitor, isHeritageClause), transformClassMembers(node, isDerivedClass) ); - - if (some(staticProperties, p => !!p.initializer || isPrivateIdentifier(p.name)) || some(pendingExpressions)) { + const hasTransformableStatics = some(staticProperties, p => !!p.initializer || (shouldTransformPrivateElements && isPrivateIdentifier(p.name))); + if (hasTransformableStatics || some(pendingExpressions)) { if (isDecoratedClassDeclaration) { Debug.assertIsDefined(pendingStatements, "Decorated classes transformed by TypeScript are expected to be within a variable declaration."); @@ -775,10 +775,8 @@ namespace ts { pendingStatements.push(factory.createExpressionStatement(factory.inlineExpressions(pendingExpressions))); } - if (pendingStatements) { - if (some(staticProperties)) { - addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); - } + if (pendingStatements && some(staticProperties)) { + addPropertyStatements(pendingStatements, staticProperties, factory.getInternalName(node)); } if (temp) { return factory.inlineExpressions([factory.createAssignment(temp, classExpression), temp]); @@ -1211,7 +1209,7 @@ namespace ts { function addPrivateIdentifierToEnvironment(node: PrivateClassElementDeclaration) { const text = getTextOfPropertyName(node.name) as string; const env = getPrivateIdentifierEnvironment(); - const { weakSetName } = env; + const { weakSetName, classConstructor } = env; let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; if (hasStaticModifier(node)) { @@ -1220,7 +1218,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticField, variableName, - classConstructor: env.classConstructor + classConstructor }; } else if (isMethodDeclaration(node)) { @@ -1228,7 +1226,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticMethod, functionName, - classConstructor: env.classConstructor + classConstructor }; } else if (isGetAccessorDeclaration(node)) { @@ -1245,7 +1243,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticGetterOnly, getterName, - classConstructor: env.classConstructor + classConstructor }; } } @@ -1256,7 +1254,6 @@ namespace ts { info = { ...previousInfo, placement: PrivateIdentifierPlacement.StaticGetterAndSetter, - getterName: previousInfo.getterName, setterName, }; } @@ -1264,7 +1261,7 @@ namespace ts { info = { placement: PrivateIdentifierPlacement.StaticSetterOnly, setterName, - classConstructor: env.classConstructor + classConstructor }; } } diff --git a/tests/baselines/reference/privateNameAndAny.errors.txt b/tests/baselines/reference/privateNameAndAny.errors.txt index 4f409ed2df5cc..dbc6209113729 100644 --- a/tests/baselines/reference/privateNameAndAny.errors.txt +++ b/tests/baselines/reference/privateNameAndAny.errors.txt @@ -1,15 +1,18 @@ -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(8,15): error TS2339: Property '#bar' does not exist on type 'any'. tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(9,15): error TS2339: Property '#bar' does not exist on type 'any'. tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(13,9): error TS2571: Object is of type 'unknown'. tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,9): error TS2571: Object is of type 'unknown'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(14,15): error TS2339: Property '#bar' does not exist on type 'any'. tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(15,9): error TS2571: Object is of type 'unknown'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(18,15): error TS2339: Property '#foo' does not exist on type 'never'. -tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(19,15): error TS2339: Property '#bar' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(16,9): error TS2571: Object is of type 'unknown'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(16,15): error TS2339: Property '#bar' does not exist on type 'any'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(17,9): error TS2571: Object is of type 'unknown'. tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(20,15): error TS2339: Property '#foo' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(21,15): error TS2339: Property '#m' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(22,15): error TS2339: Property '#baz' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(23,15): error TS2339: Property '#bar' does not exist on type 'never'. +tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(24,15): error TS2339: Property '#foo' does not exist on type 'never'. -==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (9 errors) ==== +==== tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts (12 errors) ==== class A { #foo = true; static #baz = 10; @@ -17,9 +20,7 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(20,15) method(thing: any) { thing.#foo; // OK thing.#m(); - thing.#bar; - ~~~~ -!!! error TS2339: Property '#bar' does not exist on type 'any'. + thing.#baz; thing.#bar; // Error ~~~~ !!! error TS2339: Property '#bar' does not exist on type 'any'. @@ -28,6 +29,12 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(20,15) methodU(thing: unknown) { thing.#foo; ~~~~~ +!!! error TS2571: Object is of type 'unknown'. + thing.#m(); + ~~~~~ +!!! error TS2571: Object is of type 'unknown'. + thing.#baz; + ~~~~~ !!! error TS2571: Object is of type 'unknown'. thing.#bar; ~~~~~ @@ -42,6 +49,12 @@ tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts(20,15) thing.#foo; ~~~~ !!! error TS2339: Property '#foo' does not exist on type 'never'. + thing.#m(); + ~~ +!!! error TS2339: Property '#m' does not exist on type 'never'. + thing.#baz; + ~~~~ +!!! error TS2339: Property '#baz' does not exist on type 'never'. thing.#bar; ~~~~ !!! error TS2339: Property '#bar' does not exist on type 'never'. diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index db0b146c8db42..0a43da2be0639 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -6,17 +6,21 @@ class A { method(thing: any) { thing.#foo; // OK thing.#m(); - thing.#bar; + thing.#baz; thing.#bar; // Error thing.#foo(); } methodU(thing: unknown) { thing.#foo; + thing.#m(); + thing.#baz; thing.#bar; thing.#foo(); } methodN(thing: never) { thing.#foo; + thing.#m(); + thing.#baz; thing.#bar; thing.#foo(); } @@ -37,6 +41,15 @@ var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) } return fn; }; +var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + if (propertyDescriptor === undefined) { + throw new TypeError("Private static field was accessed before its declaration."); + } + return propertyDescriptor.value; +}; var _A_foo, _A_baz, _A_m; class A { constructor() { @@ -46,18 +59,22 @@ class A { __classPrivateFieldGet(thing, _A_foo); // OK __classStaticPrivateMethodGet(thing, A, _A_m).call(// OK thing); - thing.; + __classStaticPrivateFieldGet(thing, A, _A_baz); thing.; // Error __classPrivateFieldGet(thing, _A_foo).call(// Error thing); } methodU(thing) { __classPrivateFieldGet(thing, _A_foo); + __classStaticPrivateMethodGet(thing, A, _A_m).call(thing); + __classStaticPrivateFieldGet(thing, A, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } methodN(thing) { __classPrivateFieldGet(thing, _A_foo); + __classStaticPrivateMethodGet(thing, A, _A_m).call(thing); + __classStaticPrivateFieldGet(thing, A, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } diff --git a/tests/baselines/reference/privateNameAndAny.symbols b/tests/baselines/reference/privateNameAndAny.symbols index ace5ce1d7ef9b..2d18a97fd431a 100644 --- a/tests/baselines/reference/privateNameAndAny.symbols +++ b/tests/baselines/reference/privateNameAndAny.symbols @@ -21,7 +21,7 @@ class A { thing.#m(); >thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) - thing.#bar; + thing.#baz; >thing : Symbol(thing, Decl(privateNameAndAny.ts, 4, 11)) thing.#bar; // Error @@ -37,6 +37,12 @@ class A { thing.#foo; >thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) + thing.#m(); +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) + + thing.#baz; +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) + thing.#bar; >thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) @@ -44,17 +50,23 @@ class A { >thing : Symbol(thing, Decl(privateNameAndAny.ts, 11, 12)) } methodN(thing: never) { ->methodN : Symbol(A.methodN, Decl(privateNameAndAny.ts, 15, 5)) ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) +>methodN : Symbol(A.methodN, Decl(privateNameAndAny.ts, 17, 5)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) thing.#foo; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) + + thing.#m(); +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) + + thing.#baz; +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) thing.#bar; ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) thing.#foo(); ->thing : Symbol(thing, Decl(privateNameAndAny.ts, 16, 12)) +>thing : Symbol(thing, Decl(privateNameAndAny.ts, 18, 12)) } }; diff --git a/tests/baselines/reference/privateNameAndAny.types b/tests/baselines/reference/privateNameAndAny.types index 016debf7df0aa..8ac6efcbf2bfa 100644 --- a/tests/baselines/reference/privateNameAndAny.types +++ b/tests/baselines/reference/privateNameAndAny.types @@ -26,8 +26,8 @@ class A { >thing.#m : any >thing : any - thing.#bar; ->thing.#bar : any + thing.#baz; +>thing.#baz : any >thing : any thing.#bar; // Error @@ -45,6 +45,15 @@ class A { thing.#foo; >thing.#foo : any +>thing : unknown + + thing.#m(); +>thing.#m() : any +>thing.#m : any +>thing : unknown + + thing.#baz; +>thing.#baz : any >thing : unknown thing.#bar; @@ -62,6 +71,15 @@ class A { thing.#foo; >thing.#foo : any +>thing : never + + thing.#m(); +>thing.#m() : any +>thing.#m : any +>thing : never + + thing.#baz; +>thing.#baz : any >thing : never thing.#bar; diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js new file mode 100644 index 0000000000000..dcfcf0ee30651 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js @@ -0,0 +1,18 @@ +//// [privateNameStaticFieldNoInitializer.ts] +const C = class { + static #x; +} + +class C2 { + static #x; +} + +//// [privateNameStaticFieldNoInitializer.js] +var _a, _C_x, _C2_x; +const C = (_a = class { + }, + _C_x = { value: void 0 }, + _a); +class C2 { +} +_C2_x = { value: void 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).symbols b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).symbols new file mode 100644 index 0000000000000..282fbce172a80 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts === +const C = class { +>C : Symbol(C, Decl(privateNameStaticFieldNoInitializer.ts, 0, 5)) + + static #x; +>#x : Symbol(C.#x, Decl(privateNameStaticFieldNoInitializer.ts, 0, 17)) +} + +class C2 { +>C2 : Symbol(C2, Decl(privateNameStaticFieldNoInitializer.ts, 2, 1)) + + static #x; +>#x : Symbol(C2.#x, Decl(privateNameStaticFieldNoInitializer.ts, 4, 10)) +} diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).types b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).types new file mode 100644 index 0000000000000..a9ecdc42725e9 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts === +const C = class { +>C : typeof C +>class { static #x;} : typeof C + + static #x; +>#x : any +} + +class C2 { +>C2 : C2 + + static #x; +>#x : any +} diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).js b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).js new file mode 100644 index 0000000000000..df9759b3ea594 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).js @@ -0,0 +1,16 @@ +//// [privateNameStaticFieldNoInitializer.ts] +const C = class { + static #x; +} + +class C2 { + static #x; +} + +//// [privateNameStaticFieldNoInitializer.js] +const C = class { + static #x; +}; +class C2 { + static #x; +} diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).symbols b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).symbols new file mode 100644 index 0000000000000..282fbce172a80 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts === +const C = class { +>C : Symbol(C, Decl(privateNameStaticFieldNoInitializer.ts, 0, 5)) + + static #x; +>#x : Symbol(C.#x, Decl(privateNameStaticFieldNoInitializer.ts, 0, 17)) +} + +class C2 { +>C2 : Symbol(C2, Decl(privateNameStaticFieldNoInitializer.ts, 2, 1)) + + static #x; +>#x : Symbol(C2.#x, Decl(privateNameStaticFieldNoInitializer.ts, 4, 10)) +} diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).types b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).types new file mode 100644 index 0000000000000..a9ecdc42725e9 --- /dev/null +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=esnext).types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts === +const C = class { +>C : typeof C +>class { static #x;} : typeof C + + static #x; +>#x : any +} + +class C2 { +>C2 : C2 + + static #x; +>#x : any +} diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts b/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts index 91eb98a25186f..a0d06e0aebdf6 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameAndAny.ts @@ -8,17 +8,21 @@ class A { method(thing: any) { thing.#foo; // OK thing.#m(); - thing.#bar; + thing.#baz; thing.#bar; // Error thing.#foo(); } methodU(thing: unknown) { thing.#foo; + thing.#m(); + thing.#baz; thing.#bar; thing.#foo(); } methodN(thing: never) { thing.#foo; + thing.#m(); + thing.#baz; thing.#bar; thing.#foo(); } diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts new file mode 100644 index 0000000000000..815a5d40f632e --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateNameStaticFieldNoInitializer.ts @@ -0,0 +1,9 @@ +// @target: es2015, esnext + +const C = class { + static #x; +} + +class C2 { + static #x; +} \ No newline at end of file From 30c7f69c91611c2588f6cf51465730380486420f Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Mon, 1 Mar 2021 08:44:09 +0000 Subject: [PATCH 49/68] add debug.assertNever for unknown node type (#53) --- src/compiler/transformers/classFields.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index d9be7159454d7..f701a521dee50 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -1170,7 +1170,7 @@ namespace ts { } } else { - return; + Debug.assertNever(node, "Unknown class element type."); } getPrivateIdentifierEnvironment().identifiers.set(node.name.escapedText, info); From 4748c870fb5ee24a6b71f2678937c9d2f0fd37bc Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 3 Mar 2021 18:40:58 +0200 Subject: [PATCH 50/68] Fixed code review issues. --- src/compiler/checker.ts | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9169298d8c46e..5b269d6ea9d7d 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26407,7 +26407,7 @@ namespace ts { // a super property access is permitted and must specify a public static member function of the base class. if (languageVersion < ScriptTarget.ES2015) { if (symbolHasNonMethodDeclaration(prop)) { - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Only_public_and_protected_methods_of_the_base_class_are_accessible_via_the_super_keyword); } return false; @@ -26418,7 +26418,7 @@ namespace ts { // This error could mask a private property access error. But, a member // cannot simultaneously be private and abstract, so this will trigger an // additional error elsewhere. - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Abstract_method_0_in_class_1_cannot_be_accessed_via_super_expression, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); } return false; @@ -26429,7 +26429,7 @@ namespace ts { if ((flags & ModifierFlags.Abstract) && isThisProperty(node) && symbolHasNonMethodDeclaration(prop)) { const declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop)!); if (declaringClassDeclaration && isNodeUsedDuringClassInitialization(node)) { - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Abstract_property_0_in_class_1_cannot_be_accessed_in_the_constructor, symbolToString(prop), getTextOfIdentifierOrLiteral(declaringClassDeclaration.name!)); // TODO: GH#18217 } return false; @@ -26447,7 +26447,7 @@ namespace ts { if (flags & ModifierFlags.Private) { const declaringClassDeclaration = getClassLikeDeclarationOfSymbol(getParentOfSymbol(prop)!)!; if (!isNodeWithinClass(node, declaringClassDeclaration)) { - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Property_0_is_private_and_only_accessible_within_class_1, symbolToString(prop), typeToString(getDeclaringClass(prop)!)); } return false; @@ -26474,7 +26474,7 @@ namespace ts { // static member access is disallow let thisParameter: ParameterDeclaration | undefined; if (flags & ModifierFlags.Static || !(thisParameter = getThisParameterFromNodeContext(node)) || !thisParameter.type) { - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_within_class_1_and_its_subclasses, symbolToString(prop), typeToString(getDeclaringClass(prop) || type)); } return false; @@ -26492,7 +26492,7 @@ namespace ts { type = (type as TypeParameter).isThisType ? getConstraintOfTypeParameter(type)! : getBaseConstraintOfType(type)!; // TODO: GH#18217 Use a different variable that's allowed to be undefined } if (!type || !hasBaseType(type, enclosingClass)) { - if(reportError) { + if (reportError) { error(errorNode, Diagnostics.Property_0_is_protected_and_only_accessible_through_an_instance_of_class_1, symbolToString(prop), typeToString(enclosingClass)); } return false; @@ -26683,7 +26683,7 @@ namespace ts { let prop: Symbol | undefined; if (isPrivateIdentifier(right)) { const lexicallyScopedSymbol = lookupSymbolForPrivateIdentifierDeclaration(right.escapedText, right); - if(assignmentKind && lexicallyScopedSymbol && isMethodDeclaration(lexicallyScopedSymbol.valueDeclaration)) { + if (assignmentKind && lexicallyScopedSymbol && isMethodDeclaration(lexicallyScopedSymbol.valueDeclaration)) { grammarErrorOnNode(right, Diagnostics.Cannot_assign_to_private_method_0_Private_methods_are_not_writable, idText(right)); } if (isAnyLike) { @@ -26973,13 +26973,14 @@ namespace ts { function getSuggestedSymbolForNonexistentProperty(name: Identifier | PrivateIdentifier | string, containingType: Type): Symbol | undefined { let props = getPropertiesOfType(containingType); - if(typeof name !== "string") { + if (typeof name !== "string") { const parent = name.parent; - if(isPropertyAccessExpression(parent)) { + if (isPropertyAccessExpression(parent)) { props = filter(props, prop => isValidPropertyAccessForCompletions(parent, containingType, prop)); } + name = idText(name); } - return getSpellingSuggestionForName(isString(name) ? name : idText(name), props, SymbolFlags.Value); + return getSpellingSuggestionForName(name, props, SymbolFlags.Value); } function getSuggestedSymbolForNonexistentJSXAttribute(name: Identifier | PrivateIdentifier | string, containingType: Type): Symbol | undefined { From 497e47ff03e65a2ba7a0e852ab38a49c999bbdb2 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 3 Mar 2021 19:02:43 +0200 Subject: [PATCH 51/68] Fixed code review issues for private class elements. --- 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 cffd970f005a8..de2dc8a31e0be 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32417,7 +32417,7 @@ namespace ts { continue; } const isPrivate = isPrivateIdentifier(name); - const isPrivateStatic = isPrivate && isStatic ? DeclarationMeaning.PrivateStatic : 0; + const privateStaticFlags = isPrivate && isStatic ? DeclarationMeaning.PrivateStatic : 0; const names = isPrivate ? privateIdentifiers : isStatic ? staticNames : @@ -32427,19 +32427,19 @@ namespace ts { if (memberName) { switch (member.kind) { case SyntaxKind.GetAccessor: - addName(names, name, memberName, DeclarationMeaning.GetAccessor | isPrivateStatic); + addName(names, name, memberName, DeclarationMeaning.GetAccessor | privateStaticFlags); break; case SyntaxKind.SetAccessor: - addName(names, name, memberName, DeclarationMeaning.SetAccessor | isPrivateStatic); + addName(names, name, memberName, DeclarationMeaning.SetAccessor | privateStaticFlags); break; case SyntaxKind.PropertyDeclaration: - addName(names, name, memberName, DeclarationMeaning.GetOrSetAccessor | isPrivateStatic); + addName(names, name, memberName, DeclarationMeaning.GetOrSetAccessor | privateStaticFlags); break; case SyntaxKind.MethodDeclaration: - addName(names, name, memberName, DeclarationMeaning.Method | isPrivateStatic); + addName(names, name, memberName, DeclarationMeaning.Method | privateStaticFlags); break; } } From 294cc48f5e93ea061a911e134d091a7cf9b64e15 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Mon, 8 Mar 2021 15:23:53 +0200 Subject: [PATCH 52/68] Fixes class shadowing when checking access to a private static class element. --- src/compiler/transformers/classFields.ts | 12 +- .../baselines/reference/privateNameAndAny.js | 16 +-- .../privateNameAndObjectRestSpread.js | 8 +- .../reference/privateNameDuplicateField.js | 109 +++++++++--------- .../privateNameES5Ban(target=es3).js | 4 +- .../privateNameES5Ban(target=es5).js | 4 +- .../reference/privateNameStaticAccessors.js | 10 +- .../privateNameStaticAccessorsAccess.js | 10 +- ...rivateNameStaticAccessorsCallExpression.js | 20 ++-- ...ivateNameStaticAccessorssDerivedClasses.js | 6 +- ...aticAndStaticInitializer(target=es2015).js | 3 +- .../reference/privateNameStaticFieldAccess.js | 7 +- .../privateNameStaticFieldAssignment.js | 57 ++++----- .../privateNameStaticFieldCallExpression.js | 21 ++-- .../privateNameStaticFieldClassExpression.js | 23 ++-- .../privateNameStaticFieldDerivedClasses.js | 8 +- ...FieldDestructuredBinding(target=es2015).js | 21 ++-- ...meStaticFieldInitializer(target=es2015).js | 3 +- ...StaticFieldNoInitializer(target=es2015).js | 3 +- .../privateNameStaticFieldUnaryMutation.js | 47 ++++---- .../reference/privateNameStaticMethod.js | 10 +- .../privateNameStaticMethodAssignment.js | 12 +- .../privateNameStaticMethodCallExpression.js | 26 ++--- ...rivateNameStaticMethodInStaticFieldInit.js | 6 +- .../reference/privateNamesAndStaticFields.js | 12 +- .../privateNamesConstructorChain-1.js | 6 +- .../privateNamesConstructorChain-2.js | 6 +- .../privateNamesInNestedClasses-2.js | 3 +- .../reference/privateNamesUnique-3.js | 7 +- .../reference/privateStaticNameShadowing.js | 36 ++++++ .../privateStaticNameShadowing.symbols | 30 +++++ .../privateStaticNameShadowing.types | 37 ++++++ .../privateStaticNameShadowing.ts | 15 +++ 33 files changed, 371 insertions(+), 227 deletions(-) create mode 100644 tests/baselines/reference/privateStaticNameShadowing.js create mode 100644 tests/baselines/reference/privateStaticNameShadowing.symbols create mode 100644 tests/baselines/reference/privateStaticNameShadowing.types create mode 100644 tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 5a81f02d75409..b3bcb01fac055 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -691,11 +691,20 @@ namespace ts { } function visitClassDeclaration(node: ClassDeclaration) { - getPrivateIdentifierEnvironment().classConstructor = factory.getInternalName(node); if (!forEach(node.members, doesClassElementNeedTransform)) { return visitEachChild(node, visitor, context); } + const staticProperties = getProperties(node, /*requireInitializer*/ false, /*isStatic*/ true); + if (shouldTransformPrivateElements && some(node.members, m => hasStaticModifier(m) && !!m.name && isPrivateIdentifier(m.name))) { + const temp = factory.createTempVariable(hoistVariableDeclaration, /* reservedInNestedScopes */ true); + getPrivateIdentifierEnvironment().classConstructor = factory.cloneNode(temp); + getPendingExpressions().push(factory.createAssignment( + temp, + factory.getInternalName(node) + )); + } + const extendsClauseElement = getEffectiveBaseTypeNode(node); const isDerivedClass = !!(extendsClauseElement && skipOuterExpressions(extendsClauseElement.expression).kind !== SyntaxKind.NullKeyword); @@ -721,7 +730,6 @@ namespace ts { // From ES6 specification: // HasLexicalDeclaration (N) : Determines if the argument identifier has a binding in this environment record that was created using // a lexical declaration such as a LexicalDeclaration or a ClassDeclaration. - const staticProperties = getProperties(node, /*requireInitializer*/ false, /*isStatic*/ true); if (some(staticProperties)) { addPropertyStatements(statements, staticProperties, factory.getInternalName(node)); diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index 0a43da2be0639..e80ac060f9ab6 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -50,35 +50,35 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_foo, _A_baz, _A_m; +var _a, _A_foo, _A_baz, _A_m; class A { constructor() { _A_foo.set(this, true); } method(thing) { __classPrivateFieldGet(thing, _A_foo); // OK - __classStaticPrivateMethodGet(thing, A, _A_m).call(// OK + __classStaticPrivateMethodGet(thing, _a, _A_m).call(// OK thing); - __classStaticPrivateFieldGet(thing, A, _A_baz); + __classStaticPrivateFieldGet(thing, _a, _A_baz); thing.; // Error __classPrivateFieldGet(thing, _A_foo).call(// Error thing); } methodU(thing) { __classPrivateFieldGet(thing, _A_foo); - __classStaticPrivateMethodGet(thing, A, _A_m).call(thing); - __classStaticPrivateFieldGet(thing, A, _A_baz); + __classStaticPrivateMethodGet(thing, _a, _A_m).call(thing); + __classStaticPrivateFieldGet(thing, _a, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } methodN(thing) { __classPrivateFieldGet(thing, _A_foo); - __classStaticPrivateMethodGet(thing, A, _A_m).call(thing); - __classStaticPrivateFieldGet(thing, A, _A_baz); + __classStaticPrivateMethodGet(thing, _a, _A_m).call(thing); + __classStaticPrivateFieldGet(thing, _a, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } } -_A_foo = new WeakMap(), _A_m = function _A_m() { }; +_a = A, _A_foo = new WeakMap(), _A_m = function _A_m() { }; _A_baz = { value: 10 }; ; diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index c1f8288ff3b31..7dba9fa4fb55d 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -44,7 +44,7 @@ var __rest = (this && this.__rest) || function (s, e) { } return t; }; -var _C_prop, _C_propStatic; +var _a, _C_prop, _C_propStatic; class C { constructor() { _C_prop.set(this, 1); @@ -55,10 +55,10 @@ class C { const rest = __rest(other, []); __classPrivateFieldGet(rest, _C_prop); const statics = Object.assign({}, C); - __classStaticPrivateFieldGet(statics, C, _C_propStatic); + __classStaticPrivateFieldGet(statics, _a, _C_propStatic); const sRest = __rest(C, []); - __classStaticPrivateFieldGet(sRest, C, _C_propStatic); + __classStaticPrivateFieldGet(sRest, _a, _C_propStatic); } } -_C_prop = new WeakMap(); +_a = C, _C_prop = new WeakMap(); _C_propStatic = { value: 1 }; diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 93e0bbe2a5dc7..24ef61f637011 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -406,7 +406,7 @@ function StaticSetter() { //// [privateNameDuplicateField.js] "use strict"; function Field() { - var _A_Field_Field_foo, _A_Field_Field_foo_1, _A_Field_Method_instances, _A_Field_Method_foo, _A_Field_Method_foo_1, _A_Field_Getter_instances, _A_Field_Getter_foo, _A_Field_Getter_foo_get, _A_Field_Setter_instances, _A_Field_Setter_foo, _A_Field_Setter_foo_set, _A_Field_StaticField_foo, _A_Field_StaticField_foo_1, _A_Field_StaticMethod_foo, _A_Field_StaticMethod_foo_1, _A_Field_StaticGetter_foo, _A_Field_StaticGetter_foo_get, _A_Field_StaticSetter_foo, _A_Field_StaticSetter_foo_set; + var _A_Field_Field_foo, _A_Field_Field_foo_1, _A_Field_Method_instances, _A_Field_Method_foo, _A_Field_Method_foo_1, _A_Field_Getter_instances, _A_Field_Getter_foo, _A_Field_Getter_foo_get, _A_Field_Setter_instances, _A_Field_Setter_foo, _A_Field_Setter_foo_set, _a, _A_Field_StaticField_foo, _A_Field_StaticField_foo_1, _b, _A_Field_StaticMethod_foo, _A_Field_StaticMethod_foo_1, _c, _A_Field_StaticGetter_foo, _A_Field_StaticGetter_foo_get, _d, _A_Field_StaticSetter_foo, _A_Field_StaticSetter_foo_set; // Error class A_Field_Field { constructor() { @@ -442,29 +442,29 @@ function Field() { _A_Field_StaticField_foo_1 = { value: "foo" }; } } - _A_Field_StaticField_foo = new WeakMap(); + _a = A_Field_StaticField, _A_Field_StaticField_foo = new WeakMap(); _A_Field_StaticField_foo_1 = { value: "foo" }; // Error class A_Field_StaticMethod { constructor() { } } - _A_Field_StaticMethod_foo = new WeakMap(), _A_Field_StaticMethod_foo_1 = function _A_Field_StaticMethod_foo_1() { }; + _b = A_Field_StaticMethod, _A_Field_StaticMethod_foo = new WeakMap(), _A_Field_StaticMethod_foo_1 = function _A_Field_StaticMethod_foo_1() { }; // Error class A_Field_StaticGetter { constructor() { } } - _A_Field_StaticGetter_foo = new WeakMap(), _A_Field_StaticGetter_foo_get = function _A_Field_StaticGetter_foo_get() { return ""; }; + _c = A_Field_StaticGetter, _A_Field_StaticGetter_foo = new WeakMap(), _A_Field_StaticGetter_foo_get = function _A_Field_StaticGetter_foo_get() { return ""; }; // Error class A_Field_StaticSetter { constructor() { } } - _A_Field_StaticSetter_foo = new WeakMap(), _A_Field_StaticSetter_foo_set = function _A_Field_StaticSetter_foo_set(value) { }; + _d = A_Field_StaticSetter, _A_Field_StaticSetter_foo = new WeakMap(), _A_Field_StaticSetter_foo_set = function _A_Field_StaticSetter_foo_set(value) { }; } function Method() { - var _A_Method_Field_instances, _A_Method_Field_foo, _A_Method_Field_foo_1, _A_Method_Method_instances, _A_Method_Method_foo, _A_Method_Method_foo_1, _A_Method_Getter_instances, _A_Method_Getter_foo, _A_Method_Getter_foo_get, _A_Method_Setter_instances, _A_Method_Setter_foo, _A_Method_Setter_foo_set, _A_Method_StaticField_instances, _A_Method_StaticField_foo, _A_Method_StaticField_foo_1, _A_Method_StaticMethod_instances, _A_Method_StaticMethod_foo, _A_Method_StaticMethod_foo_1, _A_Method_StaticGetter_instances, _A_Method_StaticGetter_foo, _A_Method_StaticGetter_foo_get, _A_Method_StaticSetter_instances, _A_Method_StaticSetter_foo, _A_Method_StaticSetter_foo_set; + var _A_Method_Field_instances, _A_Method_Field_foo, _A_Method_Field_foo_1, _A_Method_Method_instances, _A_Method_Method_foo, _A_Method_Method_foo_1, _A_Method_Getter_instances, _A_Method_Getter_foo, _A_Method_Getter_foo_get, _A_Method_Setter_instances, _A_Method_Setter_foo, _A_Method_Setter_foo_set, _A_Method_StaticField_instances, _a, _A_Method_StaticField_foo, _A_Method_StaticField_foo_1, _A_Method_StaticMethod_instances, _b, _A_Method_StaticMethod_foo, _A_Method_StaticMethod_foo_1, _A_Method_StaticGetter_instances, _c, _A_Method_StaticGetter_foo, _A_Method_StaticGetter_foo_get, _A_Method_StaticSetter_instances, _d, _A_Method_StaticSetter_foo, _A_Method_StaticSetter_foo_set; // Error class A_Method_Field { constructor() { @@ -500,7 +500,7 @@ function Method() { _A_Method_StaticField_instances.add(this); } } - _A_Method_StaticField_instances = new WeakSet(); + _a = A_Method_StaticField, _A_Method_StaticField_instances = new WeakSet(); _A_Method_StaticField_foo_1 = { value: "foo" }; // Error class A_Method_StaticMethod { @@ -508,24 +508,24 @@ function Method() { _A_Method_StaticMethod_instances.add(this); } } - _A_Method_StaticMethod_instances = new WeakSet(), _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }, _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }; + _b = A_Method_StaticMethod, _A_Method_StaticMethod_instances = new WeakSet(), _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }, _A_Method_StaticMethod_foo_1 = function _A_Method_StaticMethod_foo_1() { }; // Error class A_Method_StaticGetter { constructor() { _A_Method_StaticGetter_instances.add(this); } } - _A_Method_StaticGetter_instances = new WeakSet(), _A_Method_StaticGetter_foo_get = function _A_Method_StaticGetter_foo_get() { return ""; }; + _c = A_Method_StaticGetter, _A_Method_StaticGetter_instances = new WeakSet(), _A_Method_StaticGetter_foo_get = function _A_Method_StaticGetter_foo_get() { return ""; }; // Error class A_Method_StaticSetter { constructor() { _A_Method_StaticSetter_instances.add(this); } } - _A_Method_StaticSetter_instances = new WeakSet(), _A_Method_StaticSetter_foo_set = function _A_Method_StaticSetter_foo_set(value) { }; + _d = A_Method_StaticSetter, _A_Method_StaticSetter_instances = new WeakSet(), _A_Method_StaticSetter_foo_set = function _A_Method_StaticSetter_foo_set(value) { }; } function Getter() { - var _A_Getter_Field_instances, _A_Getter_Field_foo_get, _A_Getter_Field_foo, _A_Getter_Method_instances, _A_Getter_Method_foo_get, _A_Getter_Method_foo, _A_Getter_Getter_instances, _A_Getter_Getter_foo_get, _A_Getter_Getter_foo_get_1, _A_Getter_Setter_instances, _A_Getter_Setter_foo_get, _A_Getter_Setter_foo_set, _A_Getter_StaticField_instances, _A_Getter_StaticField_foo_get, _A_Getter_StaticField_foo, _A_Getter_StaticMethod_instances, _A_Getter_StaticMethod_foo_get, _A_Getter_StaticMethod_foo, _A_Getter_StaticGetter_instances, _A_Getter_StaticGetter_foo_get, _A_Getter_StaticGetter_foo_get_1, _A_Getter_StaticSetter_instances, _A_Getter_StaticSetter_foo_get, _A_Getter_StaticSetter_foo_set; + var _A_Getter_Field_instances, _A_Getter_Field_foo_get, _A_Getter_Field_foo, _A_Getter_Method_instances, _A_Getter_Method_foo_get, _A_Getter_Method_foo, _A_Getter_Getter_instances, _A_Getter_Getter_foo_get, _A_Getter_Getter_foo_get_1, _A_Getter_Setter_instances, _A_Getter_Setter_foo_get, _A_Getter_Setter_foo_set, _A_Getter_StaticField_instances, _a, _A_Getter_StaticField_foo_get, _A_Getter_StaticField_foo, _A_Getter_StaticMethod_instances, _b, _A_Getter_StaticMethod_foo_get, _A_Getter_StaticMethod_foo, _A_Getter_StaticGetter_instances, _c, _A_Getter_StaticGetter_foo_get, _A_Getter_StaticGetter_foo_get_1, _A_Getter_StaticSetter_instances, _d, _A_Getter_StaticSetter_foo_get, _A_Getter_StaticSetter_foo_set; // Error class A_Getter_Field { constructor() { @@ -561,31 +561,31 @@ function Getter() { _A_Getter_StaticField_instances.add(this); } } - _A_Getter_StaticField_instances = new WeakSet(), _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { return ""; }, _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { }; + _a = A_Getter_StaticField, _A_Getter_StaticField_instances = new WeakSet(), _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { return ""; }, _A_Getter_StaticField_foo = function _A_Getter_StaticField_foo() { }; // Error class A_Getter_StaticMethod { constructor() { _A_Getter_StaticMethod_instances.add(this); } } - _A_Getter_StaticMethod_instances = new WeakSet(), _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { return ""; }, _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { }; + _b = A_Getter_StaticMethod, _A_Getter_StaticMethod_instances = new WeakSet(), _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { return ""; }, _A_Getter_StaticMethod_foo = function _A_Getter_StaticMethod_foo() { }; // Error class A_Getter_StaticGetter { constructor() { _A_Getter_StaticGetter_instances.add(this); } } - _A_Getter_StaticGetter_instances = new WeakSet(), _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }, _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }; + _c = A_Getter_StaticGetter, _A_Getter_StaticGetter_instances = new WeakSet(), _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }, _A_Getter_StaticGetter_foo_get_1 = function _A_Getter_StaticGetter_foo_get_1() { return ""; }; // Error class A_Getter_StaticSetter { constructor() { _A_Getter_StaticSetter_instances.add(this); } } - _A_Getter_StaticSetter_instances = new WeakSet(), _A_Getter_StaticSetter_foo_set = function _A_Getter_StaticSetter_foo_set(value) { }; + _d = A_Getter_StaticSetter, _A_Getter_StaticSetter_instances = new WeakSet(), _A_Getter_StaticSetter_foo_set = function _A_Getter_StaticSetter_foo_set(value) { }; } function Setter() { - var _A_Setter_Field_instances, _A_Setter_Field_foo_set, _A_Setter_Field_foo, _A_Setter_Method_instances, _A_Setter_Method_foo_set, _A_Setter_Method_foo, _A_Setter_Getter_instances, _A_Setter_Getter_foo_set, _A_Setter_Getter_foo_get, _A_Setter_Setter_instances, _A_Setter_Setter_foo_set, _A_Setter_Setter_foo_set_1, _A_Setter_StaticField_instances, _A_Setter_StaticField_foo_set, _A_Setter_StaticField_foo, _A_Setter_StaticMethod_instances, _A_Setter_StaticMethod_foo_set, _A_Setter_StaticMethod_foo, _A_Setter_StaticGetter_instances, _A_Setter_StaticGetter_foo_set, _A_Setter_StaticGetter_foo_get, _A_Setter_StaticSetter_instances, _A_Setter_StaticSetter_foo_set, _A_Setter_StaticSetter_foo_set_1; + var _A_Setter_Field_instances, _A_Setter_Field_foo_set, _A_Setter_Field_foo, _A_Setter_Method_instances, _A_Setter_Method_foo_set, _A_Setter_Method_foo, _A_Setter_Getter_instances, _A_Setter_Getter_foo_set, _A_Setter_Getter_foo_get, _A_Setter_Setter_instances, _A_Setter_Setter_foo_set, _A_Setter_Setter_foo_set_1, _A_Setter_StaticField_instances, _a, _A_Setter_StaticField_foo_set, _A_Setter_StaticField_foo, _A_Setter_StaticMethod_instances, _b, _A_Setter_StaticMethod_foo_set, _A_Setter_StaticMethod_foo, _A_Setter_StaticGetter_instances, _c, _A_Setter_StaticGetter_foo_set, _A_Setter_StaticGetter_foo_get, _A_Setter_StaticSetter_instances, _d, _A_Setter_StaticSetter_foo_set, _A_Setter_StaticSetter_foo_set_1; // Error class A_Setter_Field { constructor() { @@ -621,7 +621,7 @@ function Setter() { _A_Setter_StaticField_instances.add(this); } } - _A_Setter_StaticField_instances = new WeakSet(); + _a = A_Setter_StaticField, _A_Setter_StaticField_instances = new WeakSet(); _A_Setter_StaticField_foo = { value: "foo" }; // Error class A_Setter_StaticMethod { @@ -629,31 +629,31 @@ function Setter() { _A_Setter_StaticMethod_instances.add(this); } } - _A_Setter_StaticMethod_instances = new WeakSet(), _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo(value) { }, _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo() { }; + _b = A_Setter_StaticMethod, _A_Setter_StaticMethod_instances = new WeakSet(), _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo(value) { }, _A_Setter_StaticMethod_foo = function _A_Setter_StaticMethod_foo() { }; // Error class A_Setter_StaticGetter { constructor() { _A_Setter_StaticGetter_instances.add(this); } } - _A_Setter_StaticGetter_instances = new WeakSet(), _A_Setter_StaticGetter_foo_get = function _A_Setter_StaticGetter_foo_get() { return ""; }; + _c = A_Setter_StaticGetter, _A_Setter_StaticGetter_instances = new WeakSet(), _A_Setter_StaticGetter_foo_get = function _A_Setter_StaticGetter_foo_get() { return ""; }; // Error class A_Setter_StaticSetter { constructor() { _A_Setter_StaticSetter_instances.add(this); } } - _A_Setter_StaticSetter_instances = new WeakSet(), _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }, _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }; + _d = A_Setter_StaticSetter, _A_Setter_StaticSetter_instances = new WeakSet(), _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }, _A_Setter_StaticSetter_foo_set_1 = function _A_Setter_StaticSetter_foo_set_1(value) { }; } function StaticField() { - var _A_StaticField_Field_foo, _A_StaticField_Field_foo_1, _A_StaticField_Method_instances, _A_StaticField_Method_foo, _A_StaticField_Method_foo_1, _A_StaticField_Getter_instances, _A_StaticField_Getter_foo, _A_StaticField_Getter_foo_get, _A_StaticField_Setter_instances, _A_StaticField_Setter_foo, _A_StaticField_Setter_foo_set, _A_StaticField_StaticField_foo, _A_StaticField_StaticField_foo_1, _A_StaticField_StaticMethod_foo, _A_StaticField_StaticMethod_foo_1, _A_StaticField_StaticGetter_foo, _A_StaticField_StaticGetter_foo_get, _A_StaticField_StaticSetter_foo, _A_StaticField_StaticSetter_foo_set; + var _a, _A_StaticField_Field_foo, _A_StaticField_Field_foo_1, _A_StaticField_Method_instances, _b, _A_StaticField_Method_foo, _A_StaticField_Method_foo_1, _A_StaticField_Getter_instances, _c, _A_StaticField_Getter_foo, _A_StaticField_Getter_foo_get, _A_StaticField_Setter_instances, _d, _A_StaticField_Setter_foo, _A_StaticField_Setter_foo_set, _e, _A_StaticField_StaticField_foo, _A_StaticField_StaticField_foo_1, _f, _A_StaticField_StaticMethod_foo, _A_StaticField_StaticMethod_foo_1, _g, _A_StaticField_StaticGetter_foo, _A_StaticField_StaticGetter_foo_get, _h, _A_StaticField_StaticSetter_foo, _A_StaticField_StaticSetter_foo_set; // Error class A_StaticField_Field { constructor() { _A_StaticField_Field_foo_1.set(this, "foo"); } } - _A_StaticField_Field_foo_1 = new WeakMap(); + _a = A_StaticField_Field, _A_StaticField_Field_foo_1 = new WeakMap(); _A_StaticField_Field_foo_1.set(A_StaticField_Field, "foo"); // Error class A_StaticField_Method { @@ -661,177 +661,180 @@ function StaticField() { _A_StaticField_Method_instances.add(this); } } - _A_StaticField_Method_instances = new WeakSet(), _A_StaticField_Method_foo_1 = function _A_StaticField_Method_foo_1() { }; + _b = A_StaticField_Method, _A_StaticField_Method_instances = new WeakSet(), _A_StaticField_Method_foo_1 = function _A_StaticField_Method_foo_1() { }; // Error class A_StaticField_Getter { constructor() { _A_StaticField_Getter_instances.add(this); } } - _A_StaticField_Getter_instances = new WeakSet(), _A_StaticField_Getter_foo_get = function _A_StaticField_Getter_foo_get() { return ""; }; + _c = A_StaticField_Getter, _A_StaticField_Getter_instances = new WeakSet(), _A_StaticField_Getter_foo_get = function _A_StaticField_Getter_foo_get() { return ""; }; // Error class A_StaticField_Setter { constructor() { _A_StaticField_Setter_instances.add(this); } } - _A_StaticField_Setter_instances = new WeakSet(), _A_StaticField_Setter_foo_set = function _A_StaticField_Setter_foo_set(value) { }; + _d = A_StaticField_Setter, _A_StaticField_Setter_instances = new WeakSet(), _A_StaticField_Setter_foo_set = function _A_StaticField_Setter_foo_set(value) { }; // Error class A_StaticField_StaticField { } + _e = A_StaticField_StaticField; _A_StaticField_StaticField_foo_1 = { value: "foo" }; _A_StaticField_StaticField_foo_1 = { value: "foo" }; // Error class A_StaticField_StaticMethod { } - _A_StaticField_StaticMethod_foo_1 = function _A_StaticField_StaticMethod_foo_1() { }; + _f = A_StaticField_StaticMethod, _A_StaticField_StaticMethod_foo_1 = function _A_StaticField_StaticMethod_foo_1() { }; // Error class A_StaticField_StaticGetter { } - _A_StaticField_StaticGetter_foo_get = function _A_StaticField_StaticGetter_foo_get() { return ""; }; + _g = A_StaticField_StaticGetter, _A_StaticField_StaticGetter_foo_get = function _A_StaticField_StaticGetter_foo_get() { return ""; }; // Error class A_StaticField_StaticSetter { } - _A_StaticField_StaticSetter_foo_set = function _A_StaticField_StaticSetter_foo_set(value) { }; + _h = A_StaticField_StaticSetter, _A_StaticField_StaticSetter_foo_set = function _A_StaticField_StaticSetter_foo_set(value) { }; } function StaticMethod() { - var _A_StaticMethod_Field_foo, _A_StaticMethod_Field_foo_1, _A_StaticMethod_Method_instances, _A_StaticMethod_Method_foo, _A_StaticMethod_Method_foo_1, _A_StaticMethod_Getter_instances, _A_StaticMethod_Getter_foo, _A_StaticMethod_Getter_foo_get, _A_StaticMethod_Setter_instances, _A_StaticMethod_Setter_foo, _A_StaticMethod_Setter_foo_set, _A_StaticMethod_StaticField_foo, _A_StaticMethod_StaticField_foo_1, _A_StaticMethod_StaticMethod_foo, _A_StaticMethod_StaticMethod_foo_1, _A_StaticMethod_StaticGetter_foo, _A_StaticMethod_StaticGetter_foo_get, _A_StaticMethod_StaticSetter_foo, _A_StaticMethod_StaticSetter_foo_set; + var _a, _A_StaticMethod_Field_foo, _A_StaticMethod_Field_foo_1, _A_StaticMethod_Method_instances, _b, _A_StaticMethod_Method_foo, _A_StaticMethod_Method_foo_1, _A_StaticMethod_Getter_instances, _c, _A_StaticMethod_Getter_foo, _A_StaticMethod_Getter_foo_get, _A_StaticMethod_Setter_instances, _d, _A_StaticMethod_Setter_foo, _A_StaticMethod_Setter_foo_set, _e, _A_StaticMethod_StaticField_foo, _A_StaticMethod_StaticField_foo_1, _f, _A_StaticMethod_StaticMethod_foo, _A_StaticMethod_StaticMethod_foo_1, _g, _A_StaticMethod_StaticGetter_foo, _A_StaticMethod_StaticGetter_foo_get, _h, _A_StaticMethod_StaticSetter_foo, _A_StaticMethod_StaticSetter_foo_set; // Error class A_StaticMethod_Field { constructor() { _A_StaticMethod_Field_foo_1.set(this, "foo"); } } - _A_StaticMethod_Field_foo_1 = new WeakMap(); + _a = A_StaticMethod_Field, _A_StaticMethod_Field_foo_1 = new WeakMap(); // Error class A_StaticMethod_Method { constructor() { _A_StaticMethod_Method_instances.add(this); } } - _A_StaticMethod_Method_instances = new WeakSet(), _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }, _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }; + _b = A_StaticMethod_Method, _A_StaticMethod_Method_instances = new WeakSet(), _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }, _A_StaticMethod_Method_foo_1 = function _A_StaticMethod_Method_foo_1() { }; // Error class A_StaticMethod_Getter { constructor() { _A_StaticMethod_Getter_instances.add(this); } } - _A_StaticMethod_Getter_instances = new WeakSet(), _A_StaticMethod_Getter_foo_get = function _A_StaticMethod_Getter_foo_get() { return ""; }; + _c = A_StaticMethod_Getter, _A_StaticMethod_Getter_instances = new WeakSet(), _A_StaticMethod_Getter_foo_get = function _A_StaticMethod_Getter_foo_get() { return ""; }; // Error class A_StaticMethod_Setter { constructor() { _A_StaticMethod_Setter_instances.add(this); } } - _A_StaticMethod_Setter_instances = new WeakSet(), _A_StaticMethod_Setter_foo_set = function _A_StaticMethod_Setter_foo_set(value) { }; + _d = A_StaticMethod_Setter, _A_StaticMethod_Setter_instances = new WeakSet(), _A_StaticMethod_Setter_foo_set = function _A_StaticMethod_Setter_foo_set(value) { }; // Error class A_StaticMethod_StaticField { } + _e = A_StaticMethod_StaticField; _A_StaticMethod_StaticField_foo_1 = { value: "foo" }; // Error class A_StaticMethod_StaticMethod { } - _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }, _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }; + _f = A_StaticMethod_StaticMethod, _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }, _A_StaticMethod_StaticMethod_foo_1 = function _A_StaticMethod_StaticMethod_foo_1() { }; // Error class A_StaticMethod_StaticGetter { } - _A_StaticMethod_StaticGetter_foo_get = function _A_StaticMethod_StaticGetter_foo_get() { return ""; }; + _g = A_StaticMethod_StaticGetter, _A_StaticMethod_StaticGetter_foo_get = function _A_StaticMethod_StaticGetter_foo_get() { return ""; }; // Error class A_StaticMethod_StaticSetter { } - _A_StaticMethod_StaticSetter_foo_set = function _A_StaticMethod_StaticSetter_foo_set(value) { }; + _h = A_StaticMethod_StaticSetter, _A_StaticMethod_StaticSetter_foo_set = function _A_StaticMethod_StaticSetter_foo_set(value) { }; } function StaticGetter() { - var _A_StaticGetter_Field_foo_get, _A_StaticGetter_Field_foo, _A_StaticGetter_Method_instances, _A_StaticGetter_Method_foo_get, _A_StaticGetter_Method_foo, _A_StaticGetter_Getter_instances, _A_StaticGetter_Getter_foo_get, _A_StaticGetter_Getter_foo_get_1, _A_StaticGetter_Setter_instances, _A_StaticGetter_Setter_foo_get, _A_StaticGetter_Setter_foo_set, _A_StaticGetter_StaticField_foo_get, _A_StaticGetter_StaticField_foo, _A_StaticGetter_StaticMethod_foo_get, _A_StaticGetter_StaticMethod_foo, _A_StaticGetter_StaticGetter_foo_get, _A_StaticGetter_StaticGetter_foo_get_1, _A_StaticGetter_StaticSetter_foo_get, _A_StaticGetter_StaticSetter_foo_set; + var _a, _A_StaticGetter_Field_foo_get, _A_StaticGetter_Field_foo, _A_StaticGetter_Method_instances, _b, _A_StaticGetter_Method_foo_get, _A_StaticGetter_Method_foo, _A_StaticGetter_Getter_instances, _c, _A_StaticGetter_Getter_foo_get, _A_StaticGetter_Getter_foo_get_1, _A_StaticGetter_Setter_instances, _d, _A_StaticGetter_Setter_foo_get, _A_StaticGetter_Setter_foo_set, _e, _A_StaticGetter_StaticField_foo_get, _A_StaticGetter_StaticField_foo, _f, _A_StaticGetter_StaticMethod_foo_get, _A_StaticGetter_StaticMethod_foo, _g, _A_StaticGetter_StaticGetter_foo_get, _A_StaticGetter_StaticGetter_foo_get_1, _h, _A_StaticGetter_StaticSetter_foo_get, _A_StaticGetter_StaticSetter_foo_set; // Error class A_StaticGetter_Field { constructor() { _A_StaticGetter_Field_foo.set(this, "foo"); } } - _A_StaticGetter_Field_foo = new WeakMap(); + _a = A_StaticGetter_Field, _A_StaticGetter_Field_foo = new WeakMap(); // Error class A_StaticGetter_Method { constructor() { _A_StaticGetter_Method_instances.add(this); } } - _A_StaticGetter_Method_instances = new WeakSet(), _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { return ""; }, _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { }; + _b = A_StaticGetter_Method, _A_StaticGetter_Method_instances = new WeakSet(), _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { return ""; }, _A_StaticGetter_Method_foo = function _A_StaticGetter_Method_foo() { }; // Error class A_StaticGetter_Getter { constructor() { _A_StaticGetter_Getter_instances.add(this); } } - _A_StaticGetter_Getter_instances = new WeakSet(), _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }, _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }; + _c = A_StaticGetter_Getter, _A_StaticGetter_Getter_instances = new WeakSet(), _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }, _A_StaticGetter_Getter_foo_get_1 = function _A_StaticGetter_Getter_foo_get_1() { return ""; }; // Error class A_StaticGetter_Setter { constructor() { _A_StaticGetter_Setter_instances.add(this); } } - _A_StaticGetter_Setter_instances = new WeakSet(), _A_StaticGetter_Setter_foo_set = function _A_StaticGetter_Setter_foo_set(value) { }; + _d = A_StaticGetter_Setter, _A_StaticGetter_Setter_instances = new WeakSet(), _A_StaticGetter_Setter_foo_set = function _A_StaticGetter_Setter_foo_set(value) { }; // Error class A_StaticGetter_StaticField { } - _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { return ""; }, _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { }; + _e = A_StaticGetter_StaticField, _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { return ""; }, _A_StaticGetter_StaticField_foo = function _A_StaticGetter_StaticField_foo() { }; // Error class A_StaticGetter_StaticMethod { } - _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { return ""; }, _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { }; + _f = A_StaticGetter_StaticMethod, _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { return ""; }, _A_StaticGetter_StaticMethod_foo = function _A_StaticGetter_StaticMethod_foo() { }; // Error class A_StaticGetter_StaticGetter { } - _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }, _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }; + _g = A_StaticGetter_StaticGetter, _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }, _A_StaticGetter_StaticGetter_foo_get_1 = function _A_StaticGetter_StaticGetter_foo_get_1() { return ""; }; // OK class A_StaticGetter_StaticSetter { } - _A_StaticGetter_StaticSetter_foo_get = function _A_StaticGetter_StaticSetter_foo_get() { return ""; }, _A_StaticGetter_StaticSetter_foo_set = function _A_StaticGetter_StaticSetter_foo_set(value) { }; + _h = A_StaticGetter_StaticSetter, _A_StaticGetter_StaticSetter_foo_get = function _A_StaticGetter_StaticSetter_foo_get() { return ""; }, _A_StaticGetter_StaticSetter_foo_set = function _A_StaticGetter_StaticSetter_foo_set(value) { }; } function StaticSetter() { - var _A_StaticSetter_Field_foo_set, _A_StaticSetter_Field_foo, _A_StaticSetter_Method_instances, _A_StaticSetter_Method_foo_set, _A_StaticSetter_Method_foo, _A_StaticSetter_Getter_instances, _A_StaticSetter_Getter_foo_set, _A_StaticSetter_Getter_foo_get, _A_StaticSetter_Setter_instances, _A_StaticSetter_Setter_foo_set, _A_StaticSetter_Setter_foo_set_1, _A_StaticSetter_StaticField_foo_set, _A_StaticSetter_StaticField_foo, _A_StaticSetter_StaticMethod_foo_set, _A_StaticSetter_StaticMethod_foo, _A_StaticSetter_StaticGetter_foo_set, _A_StaticSetter_StaticGetter_foo_get, _A_StaticSetter_StaticSetter_foo_set, _A_StaticSetter_StaticSetter_foo_set_1; + var _a, _A_StaticSetter_Field_foo_set, _A_StaticSetter_Field_foo, _A_StaticSetter_Method_instances, _b, _A_StaticSetter_Method_foo_set, _A_StaticSetter_Method_foo, _A_StaticSetter_Getter_instances, _c, _A_StaticSetter_Getter_foo_set, _A_StaticSetter_Getter_foo_get, _A_StaticSetter_Setter_instances, _d, _A_StaticSetter_Setter_foo_set, _A_StaticSetter_Setter_foo_set_1, _e, _A_StaticSetter_StaticField_foo_set, _A_StaticSetter_StaticField_foo, _f, _A_StaticSetter_StaticMethod_foo_set, _A_StaticSetter_StaticMethod_foo, _g, _A_StaticSetter_StaticGetter_foo_set, _A_StaticSetter_StaticGetter_foo_get, _h, _A_StaticSetter_StaticSetter_foo_set, _A_StaticSetter_StaticSetter_foo_set_1; // Error class A_StaticSetter_Field { constructor() { _A_StaticSetter_Field_foo.set(this, "foo"); } } - _A_StaticSetter_Field_foo = new WeakMap(); + _a = A_StaticSetter_Field, _A_StaticSetter_Field_foo = new WeakMap(); // Error class A_StaticSetter_Method { constructor() { _A_StaticSetter_Method_instances.add(this); } } - _A_StaticSetter_Method_instances = new WeakSet(), _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo(value) { }, _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo() { }; + _b = A_StaticSetter_Method, _A_StaticSetter_Method_instances = new WeakSet(), _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo(value) { }, _A_StaticSetter_Method_foo = function _A_StaticSetter_Method_foo() { }; // Error class A_StaticSetter_Getter { constructor() { _A_StaticSetter_Getter_instances.add(this); } } - _A_StaticSetter_Getter_instances = new WeakSet(), _A_StaticSetter_Getter_foo_get = function _A_StaticSetter_Getter_foo_get() { return ""; }; + _c = A_StaticSetter_Getter, _A_StaticSetter_Getter_instances = new WeakSet(), _A_StaticSetter_Getter_foo_get = function _A_StaticSetter_Getter_foo_get() { return ""; }; // Error class A_StaticSetter_Setter { constructor() { _A_StaticSetter_Setter_instances.add(this); } } - _A_StaticSetter_Setter_instances = new WeakSet(), _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }, _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }; + _d = A_StaticSetter_Setter, _A_StaticSetter_Setter_instances = new WeakSet(), _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }, _A_StaticSetter_Setter_foo_set_1 = function _A_StaticSetter_Setter_foo_set_1(value) { }; // Error class A_StaticSetter_StaticField { } + _e = A_StaticSetter_StaticField; _A_StaticSetter_StaticField_foo = { value: "foo" }; // Error class A_StaticSetter_StaticMethod { } - _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo(value) { }, _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo() { }; + _f = A_StaticSetter_StaticMethod, _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo(value) { }, _A_StaticSetter_StaticMethod_foo = function _A_StaticSetter_StaticMethod_foo() { }; // OK class A_StaticSetter_StaticGetter { } - _A_StaticSetter_StaticGetter_foo_set = function _A_StaticSetter_StaticGetter_foo_set(value) { }, _A_StaticSetter_StaticGetter_foo_get = function _A_StaticSetter_StaticGetter_foo_get() { return ""; }; + _g = A_StaticSetter_StaticGetter, _A_StaticSetter_StaticGetter_foo_set = function _A_StaticSetter_StaticGetter_foo_set(value) { }, _A_StaticSetter_StaticGetter_foo_get = function _A_StaticSetter_StaticGetter_foo_get() { return ""; }; // Error class A_StaticSetter_StaticSetter { } - _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }, _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }; + _h = A_StaticSetter_StaticSetter, _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }, _A_StaticSetter_StaticSetter_foo_set_1 = function _A_StaticSetter_StaticSetter_foo_set_1(value) { }; } diff --git a/tests/baselines/reference/privateNameES5Ban(target=es3).js b/tests/baselines/reference/privateNameES5Ban(target=es3).js index 486e2d2d5455c..c7626d30e12fb 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es3).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es3).js @@ -19,8 +19,8 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; - _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; + var _A_instances, _a, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; + _a = A, _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField = { value: "hello world" }; return A; }()); diff --git a/tests/baselines/reference/privateNameES5Ban(target=es5).js b/tests/baselines/reference/privateNameES5Ban(target=es5).js index 486e2d2d5455c..c7626d30e12fb 100644 --- a/tests/baselines/reference/privateNameES5Ban(target=es5).js +++ b/tests/baselines/reference/privateNameES5Ban(target=es5).js @@ -19,8 +19,8 @@ var A = /** @class */ (function () { _A_instances.add(this); _A_field.set(this, 123); } - var _A_instances, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; - _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; + var _A_instances, _a, _A_field, _A_method, _A_sField, _A_sMethod, _A_acc_get, _A_acc_set, _A_sAcc_get, _A_sAcc_set; + _a = A, _A_field = new WeakMap(), _A_instances = new WeakSet(), _A_method = function _A_method() { }, _A_sMethod = function _A_sMethod() { }, _A_acc_get = function _A_acc_get() { return ""; }, _A_acc_set = function _A_acc_set(x) { }, _A_sAcc_get = function _A_sAcc_get() { return 0; }, _A_sAcc_set = function _A_sAcc_set(x) { }; _A_sField = { value: "hello world" }; return A; }()); diff --git a/tests/baselines/reference/privateNameStaticAccessors.js b/tests/baselines/reference/privateNameStaticAccessors.js index 417e8ed72f2a3..5b241a3087f8c 100644 --- a/tests/baselines/reference/privateNameStaticAccessors.js +++ b/tests/baselines/reference/privateNameStaticAccessors.js @@ -32,13 +32,13 @@ var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessor } return fn.call(receiver); }; -var _A1_prop_get, _A1_prop_set, _A1_roProp_get; +var _a, _A1_prop_get, _A1_prop_set, _A1_roProp_get; class A1 { constructor(name) { - __classStaticPrivateAccessorSet(A1, A1, _A1_prop_set, ""); + __classStaticPrivateAccessorSet(A1, _a, _A1_prop_set, ""); __classStaticPrivateReadonly(A1, ""); // Error - console.log(__classStaticPrivateAccessorGet(A1, A1, _A1_prop_get)); - console.log(__classStaticPrivateAccessorGet(A1, A1, _A1_roProp_get)); + console.log(__classStaticPrivateAccessorGet(A1, _a, _A1_prop_get)); + console.log(__classStaticPrivateAccessorGet(A1, _a, _A1_roProp_get)); } } -_A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; +_a = A1, _A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.js b/tests/baselines/reference/privateNameStaticAccessorsAccess.js index d17b31c467e6c..5eb1d38a85363 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsAccess.js +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.js @@ -34,18 +34,18 @@ var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessor } return fn.call(receiver); }; -var _A2_prop_get, _A2_prop_set; +var _a, _A2_prop_get, _A2_prop_set; class A2 { constructor() { - console.log(__classStaticPrivateAccessorGet(A2, A2, _A2_prop_get)); + console.log(__classStaticPrivateAccessorGet(A2, _a, _A2_prop_get)); let a = A2; - __classStaticPrivateAccessorGet(a, A2, _A2_prop_get); + __classStaticPrivateAccessorGet(a, _a, _A2_prop_get); function foo() { - __classStaticPrivateAccessorGet(a, A2, _A2_prop_get); + __classStaticPrivateAccessorGet(a, _a, _A2_prop_get); } } } -_A2_prop_get = function _A2_prop_get() { return ""; }, _A2_prop_set = function _A2_prop_set(param) { }; +_a = A2, _A2_prop_get = function _A2_prop_get() { return ""; }, _A2_prop_set = function _A2_prop_set(param) { }; A2.; // Error function foo() { A2.; // Error diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js index a34f6f9ee361b..9a4e3dba5248d 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js @@ -35,21 +35,21 @@ var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessor } return fn.call(receiver); }; -var _A_fieldFunc_get, _A_fieldFunc2_get, _A_x; +var _a, _A_fieldFunc_get, _A_fieldFunc2_get, _A_x; class A { static test() { - var _a; - __classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get).call(this); - const func = __classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get); + var _b; + __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get).call(this); + const func = __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get); func(); - new (__classStaticPrivateAccessorGet(this, A, _A_fieldFunc_get))(); + new (__classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get))(); const arr = [1, 2]; - __classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get).call(this, 0, ...arr, 3); - const b = new (__classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get))(0, ...arr, 3); - const str = __classStaticPrivateAccessorGet(this, A, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; - __classStaticPrivateAccessorGet((_a = this.getClass()), A, _A_fieldFunc2_get).bind(_a) `test${1}and${2}`; + __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get).call(this, 0, ...arr, 3); + const b = new (__classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get))(0, ...arr, 3); + const str = __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; + __classStaticPrivateAccessorGet((_b = this.getClass()), _a, _A_fieldFunc2_get).bind(_b) `test${1}and${2}`; } static getClass() { return A; } } -_A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classStaticPrivateFieldSet(A, A, _A_x, 10); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; +_a = A, _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classStaticPrivateFieldSet(A, _a, _A_x, 10); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; _A_x = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js index 16bf81a00cadb..db9ef90b6ccb0 100644 --- a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js @@ -19,13 +19,13 @@ var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessor } return fn.call(receiver); }; -var _Base_prop_get; +var _a, _Base_prop_get; class Base { static method(x) { - console.log(__classStaticPrivateAccessorGet(x, Base, _Base_prop_get)); + console.log(__classStaticPrivateAccessorGet(x, _a, _Base_prop_get)); } } -_Base_prop_get = function _Base_prop_get() { return 123; }; +_a = Base, _Base_prop_get = function _Base_prop_get() { return 123; }; class Derived extends Base { static method(x) { console.log(x.); diff --git a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js index 363aace223b36..13c17f4f97233 100644 --- a/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticAndStaticInitializer(target=es2015).js @@ -7,8 +7,9 @@ class A { //// [privateNameStaticAndStaticInitializer.js] -var _A_foo, _A_prop; +var _a, _A_foo, _A_prop; class A { } +_a = A; _A_foo = { value: 1 }; _A_prop = { value: 2 }; diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.js b/tests/baselines/reference/privateNameStaticFieldAccess.js index 9ccf5db488e29..3033f7ea26adc 100644 --- a/tests/baselines/reference/privateNameStaticFieldAccess.js +++ b/tests/baselines/reference/privateNameStaticFieldAccess.js @@ -18,11 +18,12 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_myField; +var _a, _A_myField; class A { constructor() { - console.log(__classStaticPrivateFieldGet(A, A, _A_myField)); //Ok - console.log(__classStaticPrivateFieldGet(this, A, _A_myField)); //Error + console.log(__classStaticPrivateFieldGet(A, _a, _A_myField)); //Ok + console.log(__classStaticPrivateFieldGet(this, _a, _A_myField)); //Error } } +_a = A; _A_myField = { value: "hello world" }; diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.js b/tests/baselines/reference/privateNameStaticFieldAssignment.js index 94778a41f3667..0c08b004ff55c 100644 --- a/tests/baselines/reference/privateNameStaticFieldAssignment.js +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.js @@ -55,39 +55,40 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_field; +var _a, _A_field; class A { constructor() { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z; - __classStaticPrivateFieldSet(A, A, _A_field, 1); - __classStaticPrivateFieldSet(_a = A, A, _A_field, __classStaticPrivateFieldGet(_a, A, _A_field) + 2); - __classStaticPrivateFieldSet(_b = A, A, _A_field, __classStaticPrivateFieldGet(_b, A, _A_field) - 3); - __classStaticPrivateFieldSet(_c = A, A, _A_field, __classStaticPrivateFieldGet(_c, A, _A_field) / 4); - __classStaticPrivateFieldSet(_d = A, A, _A_field, __classStaticPrivateFieldGet(_d, A, _A_field) * 5); - __classStaticPrivateFieldSet(_e = A, A, _A_field, Math.pow(__classStaticPrivateFieldGet(_e, A, _A_field), 6)); - __classStaticPrivateFieldSet(_f = A, A, _A_field, __classStaticPrivateFieldGet(_f, A, _A_field) % 7); - __classStaticPrivateFieldSet(_g = A, A, _A_field, __classStaticPrivateFieldGet(_g, A, _A_field) << 8); - __classStaticPrivateFieldSet(_h = A, A, _A_field, __classStaticPrivateFieldGet(_h, A, _A_field) >> 9); - __classStaticPrivateFieldSet(_j = A, A, _A_field, __classStaticPrivateFieldGet(_j, A, _A_field) >>> 10); - __classStaticPrivateFieldSet(_k = A, A, _A_field, __classStaticPrivateFieldGet(_k, A, _A_field) & 11); - __classStaticPrivateFieldSet(_l = A, A, _A_field, __classStaticPrivateFieldGet(_l, A, _A_field) | 12); - __classStaticPrivateFieldSet(_m = A, A, _A_field, __classStaticPrivateFieldGet(_m, A, _A_field) ^ 13); - __classStaticPrivateFieldSet(A.getClass(), A, _A_field, 1); - __classStaticPrivateFieldSet(_o = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_o, A, _A_field) + 2); - __classStaticPrivateFieldSet(_p = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_p, A, _A_field) - 3); - __classStaticPrivateFieldSet(_q = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_q, A, _A_field) / 4); - __classStaticPrivateFieldSet(_r = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_r, A, _A_field) * 5); - __classStaticPrivateFieldSet(_s = A.getClass(), A, _A_field, Math.pow(__classStaticPrivateFieldGet(_s, A, _A_field), 6)); - __classStaticPrivateFieldSet(_t = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_t, A, _A_field) % 7); - __classStaticPrivateFieldSet(_u = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_u, A, _A_field) << 8); - __classStaticPrivateFieldSet(_v = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_v, A, _A_field) >> 9); - __classStaticPrivateFieldSet(_w = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_w, A, _A_field) >>> 10); - __classStaticPrivateFieldSet(_x = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_x, A, _A_field) & 11); - __classStaticPrivateFieldSet(_y = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_y, A, _A_field) | 12); - __classStaticPrivateFieldSet(_z = A.getClass(), A, _A_field, __classStaticPrivateFieldGet(_z, A, _A_field) ^ 13); + var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; + __classStaticPrivateFieldSet(A, _a, _A_field, 1); + __classStaticPrivateFieldSet(_b = A, _a, _A_field, __classStaticPrivateFieldGet(_b, _a, _A_field) + 2); + __classStaticPrivateFieldSet(_c = A, _a, _A_field, __classStaticPrivateFieldGet(_c, _a, _A_field) - 3); + __classStaticPrivateFieldSet(_d = A, _a, _A_field, __classStaticPrivateFieldGet(_d, _a, _A_field) / 4); + __classStaticPrivateFieldSet(_e = A, _a, _A_field, __classStaticPrivateFieldGet(_e, _a, _A_field) * 5); + __classStaticPrivateFieldSet(_f = A, _a, _A_field, Math.pow(__classStaticPrivateFieldGet(_f, _a, _A_field), 6)); + __classStaticPrivateFieldSet(_g = A, _a, _A_field, __classStaticPrivateFieldGet(_g, _a, _A_field) % 7); + __classStaticPrivateFieldSet(_h = A, _a, _A_field, __classStaticPrivateFieldGet(_h, _a, _A_field) << 8); + __classStaticPrivateFieldSet(_j = A, _a, _A_field, __classStaticPrivateFieldGet(_j, _a, _A_field) >> 9); + __classStaticPrivateFieldSet(_k = A, _a, _A_field, __classStaticPrivateFieldGet(_k, _a, _A_field) >>> 10); + __classStaticPrivateFieldSet(_l = A, _a, _A_field, __classStaticPrivateFieldGet(_l, _a, _A_field) & 11); + __classStaticPrivateFieldSet(_m = A, _a, _A_field, __classStaticPrivateFieldGet(_m, _a, _A_field) | 12); + __classStaticPrivateFieldSet(_o = A, _a, _A_field, __classStaticPrivateFieldGet(_o, _a, _A_field) ^ 13); + __classStaticPrivateFieldSet(A.getClass(), _a, _A_field, 1); + __classStaticPrivateFieldSet(_p = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_p, _a, _A_field) + 2); + __classStaticPrivateFieldSet(_q = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_q, _a, _A_field) - 3); + __classStaticPrivateFieldSet(_r = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_r, _a, _A_field) / 4); + __classStaticPrivateFieldSet(_s = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_s, _a, _A_field) * 5); + __classStaticPrivateFieldSet(_t = A.getClass(), _a, _A_field, Math.pow(__classStaticPrivateFieldGet(_t, _a, _A_field), 6)); + __classStaticPrivateFieldSet(_u = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_u, _a, _A_field) % 7); + __classStaticPrivateFieldSet(_v = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_v, _a, _A_field) << 8); + __classStaticPrivateFieldSet(_w = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_w, _a, _A_field) >> 9); + __classStaticPrivateFieldSet(_x = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_x, _a, _A_field) >>> 10); + __classStaticPrivateFieldSet(_y = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_y, _a, _A_field) & 11); + __classStaticPrivateFieldSet(_z = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_z, _a, _A_field) | 12); + __classStaticPrivateFieldSet(_0 = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_0, _a, _A_field) ^ 13); } static getClass() { return A; } } +_a = A; _A_field = { value: 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.js b/tests/baselines/reference/privateNameStaticFieldCallExpression.js index 6ecf4ee1367e5..5fd8143449ed8 100644 --- a/tests/baselines/reference/privateNameStaticFieldCallExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.js @@ -30,26 +30,27 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_fieldFunc, _A_fieldFunc2; +var _a, _A_fieldFunc, _A_fieldFunc2; class A { constructor() { this.x = 1; } test() { - var _a; var _b; - __classStaticPrivateFieldGet(A, A, _A_fieldFunc).call(A); - (_a = __classStaticPrivateFieldGet(A, A, _A_fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(A); - const func = __classStaticPrivateFieldGet(A, A, _A_fieldFunc); + var _c; + __classStaticPrivateFieldGet(A, _a, _A_fieldFunc).call(A); + (_b = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc)) === null || _b === void 0 ? void 0 : _b.call(A); + const func = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc); func(); - new (__classStaticPrivateFieldGet(A, A, _A_fieldFunc))(); + new (__classStaticPrivateFieldGet(A, _a, _A_fieldFunc))(); const arr = [1, 2]; - __classStaticPrivateFieldGet(A, A, _A_fieldFunc2).call(A, 0, ...arr, 3); - const b = new (__classStaticPrivateFieldGet(A, A, _A_fieldFunc2))(0, ...arr, 3); - const str = __classStaticPrivateFieldGet(A, A, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; - __classStaticPrivateFieldGet((_b = this.getClass()), A, _A_fieldFunc2).bind(_b) `test${1}and${2}`; + __classStaticPrivateFieldGet(A, _a, _A_fieldFunc2).call(A, 0, ...arr, 3); + const b = new (__classStaticPrivateFieldGet(A, _a, _A_fieldFunc2))(0, ...arr, 3); + const str = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; + __classStaticPrivateFieldGet((_c = this.getClass()), _a, _A_fieldFunc2).bind(_c) `test${1}and${2}`; } getClass() { return A; } } +_a = A; _A_fieldFunc = { value: function () { this.x = 10; } }; _A_fieldFunc2 = { value: function (a, ...b) { } }; diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.js b/tests/baselines/reference/privateNameStaticFieldClassExpression.js index 78ec26dd09ebe..862a409022392 100644 --- a/tests/baselines/reference/privateNameStaticFieldClassExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.js @@ -32,24 +32,25 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _B_foo, _B_foo2, _a, _b; +var _a, _B_foo, _B_foo2, _b, _c; class B { m() { - console.log(__classStaticPrivateFieldGet(B, B, _B_foo).test); - __classStaticPrivateFieldGet(B, B, _B_foo).test = 10; - new (__classStaticPrivateFieldGet(B, B, _B_foo))().field; + console.log(__classStaticPrivateFieldGet(B, _a, _B_foo).test); + __classStaticPrivateFieldGet(B, _a, _B_foo).test = 10; + new (__classStaticPrivateFieldGet(B, _a, _B_foo))().field; } } -_B_foo = { value: (_a = class { +_a = B; +_B_foo = { value: (_b = class { constructor() { this.field = 10; console.log("hello"); - new (__classStaticPrivateFieldGet(B, B, _B_foo2))(); + new (__classStaticPrivateFieldGet(B, _a, _B_foo2))(); } }, - _a.test = 123, - _a) }; -_B_foo2 = { value: (_b = class Foo { - }, - _b.otherClass = 123, + _b.test = 123, _b) }; +_B_foo2 = { value: (_c = class Foo { + }, + _c.otherClass = 123, + _c) }; diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js index b87120baff81c..ab43235eacb93 100644 --- a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js @@ -36,19 +36,21 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _Base_prop, _Derived_derivedProp; +var _a, _Base_prop, _b, _Derived_derivedProp; class Base { static method(x) { Derived.; // error __classStaticPrivateFieldSet(// error - Base, Base, _Base_prop, 10); + Base, _a, _Base_prop, 10); } } +_a = Base; _Base_prop = { value: 123 }; class Derived extends Base { static method(x) { - __classStaticPrivateFieldGet(Derived, Derived, _Derived_derivedProp); + __classStaticPrivateFieldGet(Derived, _b, _Derived_derivedProp); Base. = 10; // error } } +_b = Derived; _Derived_derivedProp = { value: 10 }; diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js index 670bdb67f084c..74ca6c3a9d50d 100644 --- a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js @@ -35,19 +35,19 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | propertyDescriptor.value = value; return value; }; -var _A_field; +var _b, _A_field; class A { constructor() { - var _b; + var _c; this.otherClass = A; let y; - ({ x: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, y } = this.testObject()); - ([({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, y] = this.testArray()); - ({ a: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, b: [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value] } = { a: 1, b: [2] }); - [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value, [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value]] = [1, [2]]; - ({ a: ({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 1, b: [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 1] } = { b: [] }); - [({ set value(_c) { __classStaticPrivateFieldSet(A, A, _A_field, _c); } }).value = 2] = []; - _b = this.otherClass, [({ set value(_c) { __classStaticPrivateFieldSet(_b, A, _A_field, _c); } }).value = 2] = []; + ({ x: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, y } = this.testObject()); + ([({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, y] = this.testArray()); + ({ a: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, b: [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value] } = { a: 1, b: [2] }); + [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value]] = [1, [2]]; + ({ a: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 1, b: [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 1] } = { b: [] }); + [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 2] = []; + _c = this.otherClass, [({ set value(_b) { __classStaticPrivateFieldSet(_c, _b, _A_field, _b); } }).value = 2] = []; } testObject() { return { x: 10, y: 6 }; @@ -56,7 +56,8 @@ class A { return [10, 11]; } static test(_a) { - [({ set value(_b) { __classStaticPrivateFieldSet(_a, A, _A_field, _b); } }).value] = [2]; + [({ set value(_c) { __classStaticPrivateFieldSet(_a, _b, _A_field, _c); } }).value] = [2]; } } +_b = A; _A_field = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js index de150cb8fd87f..a9da2fa9aa41b 100644 --- a/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldInitializer(target=es2015).js @@ -6,8 +6,9 @@ class A { //// [privateNameStaticFieldInitializer.js] -var _A_field, _A_uninitialized; +var _a, _A_field, _A_uninitialized; class A { } +_a = A; _A_field = { value: 10 }; _A_uninitialized = { value: void 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js index dcfcf0ee30651..a2caf1c9fd25f 100644 --- a/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldNoInitializer(target=es2015).js @@ -8,11 +8,12 @@ class C2 { } //// [privateNameStaticFieldNoInitializer.js] -var _a, _C_x, _C2_x; +var _a, _C_x, _b, _C2_x; const C = (_a = class { }, _C_x = { value: void 0 }, _a); class C2 { } +_b = C2; _C2_x = { value: void 0 }; diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js index 34c9cb9d0e223..49634f15cb01c 100644 --- a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js @@ -49,34 +49,35 @@ var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) | propertyDescriptor.value = value; return value; }; -var _C_test; +var _a, _C_test; class C { constructor() { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; - __classStaticPrivateFieldSet(_a = C, C, _C_test, +__classStaticPrivateFieldGet(_a, C, _C_test) + 1); - __classStaticPrivateFieldSet(_b = C, C, _C_test, +__classStaticPrivateFieldGet(_b, C, _C_test) - 1); - __classStaticPrivateFieldSet(_c = C, C, _C_test, +__classStaticPrivateFieldGet(_c, C, _C_test) + 1); - __classStaticPrivateFieldSet(_d = C, C, _C_test, +__classStaticPrivateFieldGet(_d, C, _C_test) - 1); - const a = (__classStaticPrivateFieldSet(_e = C, C, _C_test, (_f = +__classStaticPrivateFieldGet(_e, C, _C_test)) + 1), _f); - const b = (__classStaticPrivateFieldSet(_g = C, C, _C_test, (_h = +__classStaticPrivateFieldGet(_g, C, _C_test)) - 1), _h); - const c = __classStaticPrivateFieldSet(_j = C, C, _C_test, +__classStaticPrivateFieldGet(_j, C, _C_test) + 1); - const d = __classStaticPrivateFieldSet(_k = C, C, _C_test, +__classStaticPrivateFieldGet(_k, C, _C_test) - 1); - for (__classStaticPrivateFieldSet(C, C, _C_test, 0); __classStaticPrivateFieldGet(C, C, _C_test) < 10; __classStaticPrivateFieldSet(_l = C, C, _C_test, +__classStaticPrivateFieldGet(_l, C, _C_test) + 1)) { } - for (__classStaticPrivateFieldSet(C, C, _C_test, 0); __classStaticPrivateFieldGet(C, C, _C_test) < 10; __classStaticPrivateFieldSet(_m = C, C, _C_test, +__classStaticPrivateFieldGet(_m, C, _C_test) + 1)) { } + var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; + __classStaticPrivateFieldSet(_b = C, _a, _C_test, +__classStaticPrivateFieldGet(_b, _a, _C_test) + 1); + __classStaticPrivateFieldSet(_c = C, _a, _C_test, +__classStaticPrivateFieldGet(_c, _a, _C_test) - 1); + __classStaticPrivateFieldSet(_d = C, _a, _C_test, +__classStaticPrivateFieldGet(_d, _a, _C_test) + 1); + __classStaticPrivateFieldSet(_e = C, _a, _C_test, +__classStaticPrivateFieldGet(_e, _a, _C_test) - 1); + const a = (__classStaticPrivateFieldSet(_f = C, _a, _C_test, (_g = +__classStaticPrivateFieldGet(_f, _a, _C_test)) + 1), _g); + const b = (__classStaticPrivateFieldSet(_h = C, _a, _C_test, (_j = +__classStaticPrivateFieldGet(_h, _a, _C_test)) - 1), _j); + const c = __classStaticPrivateFieldSet(_k = C, _a, _C_test, +__classStaticPrivateFieldGet(_k, _a, _C_test) + 1); + const d = __classStaticPrivateFieldSet(_l = C, _a, _C_test, +__classStaticPrivateFieldGet(_l, _a, _C_test) - 1); + for (__classStaticPrivateFieldSet(C, _a, _C_test, 0); __classStaticPrivateFieldGet(C, _a, _C_test) < 10; __classStaticPrivateFieldSet(_m = C, _a, _C_test, +__classStaticPrivateFieldGet(_m, _a, _C_test) + 1)) { } + for (__classStaticPrivateFieldSet(C, _a, _C_test, 0); __classStaticPrivateFieldGet(C, _a, _C_test) < 10; __classStaticPrivateFieldSet(_o = C, _a, _C_test, +__classStaticPrivateFieldGet(_o, _a, _C_test) + 1)) { } } test() { - var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; - __classStaticPrivateFieldSet(_a = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_a, C, _C_test) + 1); - __classStaticPrivateFieldSet(_b = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_b, C, _C_test) - 1); - __classStaticPrivateFieldSet(_c = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_c, C, _C_test) + 1); - __classStaticPrivateFieldSet(_d = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_d, C, _C_test) - 1); - const a = (__classStaticPrivateFieldSet(_e = this.getClass(), C, _C_test, (_f = +__classStaticPrivateFieldGet(_e, C, _C_test)) + 1), _f); - const b = (__classStaticPrivateFieldSet(_g = this.getClass(), C, _C_test, (_h = +__classStaticPrivateFieldGet(_g, C, _C_test)) - 1), _h); - const c = __classStaticPrivateFieldSet(_j = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_j, C, _C_test) + 1); - const d = __classStaticPrivateFieldSet(_k = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_k, C, _C_test) - 1); - for (__classStaticPrivateFieldSet(this.getClass(), C, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), C, _C_test) < 10; __classStaticPrivateFieldSet(_l = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_l, C, _C_test) + 1)) { } - for (__classStaticPrivateFieldSet(this.getClass(), C, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), C, _C_test) < 10; __classStaticPrivateFieldSet(_m = this.getClass(), C, _C_test, +__classStaticPrivateFieldGet(_m, C, _C_test) + 1)) { } + var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; + __classStaticPrivateFieldSet(_b = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_b, _a, _C_test) + 1); + __classStaticPrivateFieldSet(_c = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_c, _a, _C_test) - 1); + __classStaticPrivateFieldSet(_d = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_d, _a, _C_test) + 1); + __classStaticPrivateFieldSet(_e = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_e, _a, _C_test) - 1); + const a = (__classStaticPrivateFieldSet(_f = this.getClass(), _a, _C_test, (_g = +__classStaticPrivateFieldGet(_f, _a, _C_test)) + 1), _g); + const b = (__classStaticPrivateFieldSet(_h = this.getClass(), _a, _C_test, (_j = +__classStaticPrivateFieldGet(_h, _a, _C_test)) - 1), _j); + const c = __classStaticPrivateFieldSet(_k = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_k, _a, _C_test) + 1); + const d = __classStaticPrivateFieldSet(_l = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_l, _a, _C_test) - 1); + for (__classStaticPrivateFieldSet(this.getClass(), _a, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), _a, _C_test) < 10; __classStaticPrivateFieldSet(_m = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_m, _a, _C_test) + 1)) { } + for (__classStaticPrivateFieldSet(this.getClass(), _a, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), _a, _C_test) < 10; __classStaticPrivateFieldSet(_o = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_o, _a, _C_test) + 1)) { } } getClass() { return C; } } +_a = C; _C_test = { value: 24 }; diff --git a/tests/baselines/reference/privateNameStaticMethod.js b/tests/baselines/reference/privateNameStaticMethod.js index df59439c5d12b..14ef06a04e49f 100644 --- a/tests/baselines/reference/privateNameStaticMethod.js +++ b/tests/baselines/reference/privateNameStaticMethod.js @@ -20,15 +20,15 @@ var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) } return fn; }; -var _A1_method; +var _a, _A1_method; class A1 { constructor() { - __classStaticPrivateMethodGet(A1, A1, _A1_method).call(A1, ""); - __classStaticPrivateMethodGet(A1, A1, _A1_method).call(A1, 1); // Error - __classStaticPrivateMethodGet(A1, A1, _A1_method).call(// Error + __classStaticPrivateMethodGet(A1, _a, _A1_method).call(A1, ""); + __classStaticPrivateMethodGet(A1, _a, _A1_method).call(A1, 1); // Error + __classStaticPrivateMethodGet(A1, _a, _A1_method).call(// Error A1); // Error } } -_A1_method = function _A1_method(param) { +_a = A1, _A1_method = function _A1_method(param) { return ""; }; diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.js b/tests/baselines/reference/privateNameStaticMethodAssignment.js index 9271a62906b5d..73895eebc64d3 100644 --- a/tests/baselines/reference/privateNameStaticMethodAssignment.js +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.js @@ -22,19 +22,19 @@ var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) } return fn; }; -var _A3_method; +var _a, _A3_method; class A3 { constructor(a, b) { - var _a; + var _b; __classStaticPrivateReadonly(A3, () => { }); // Error, not writable __classStaticPrivateReadonly(// Error, not writable a, () => { }); // Error, not writable __classStaticPrivateReadonly(// Error, not writable b, () => { }); //Error, not writable - ({ x: ({ set value(_a) { __classStaticPrivateReadonly(A3, _a); } }).value } = { x: () => { } }); //Error, not writable - let x = __classStaticPrivateMethodGet(A3, A3, _A3_method); - __classStaticPrivateReadonly(_a = b, +__classStaticPrivateMethodGet(_a, A3, _A3_method) + 1); //Error, not writable + ({ x: ({ set value(_b) { __classStaticPrivateReadonly(A3, _b); } }).value } = { x: () => { } }); //Error, not writable + let x = __classStaticPrivateMethodGet(A3, _a, _A3_method); + __classStaticPrivateReadonly(_b = b, +__classStaticPrivateMethodGet(_b, _a, _A3_method) + 1); //Error, not writable } ; } -_A3_method = function _A3_method() { }; +_a = A3, _A3_method = function _A3_method() { }; diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.js b/tests/baselines/reference/privateNameStaticMethodCallExpression.js index 0ca367948c498..18fc07816c07e 100644 --- a/tests/baselines/reference/privateNameStaticMethodCallExpression.js +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.js @@ -31,26 +31,26 @@ var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) } return fn; }; -var _AA_method, _AA_method2; +var _a, _AA_method, _AA_method2; class AA { ; ; test() { - var _a, _b, _c; - __classStaticPrivateMethodGet(AA, AA, _AA_method).call(AA); - const func = __classStaticPrivateMethodGet(AA, AA, _AA_method); + var _b, _c, _d; + __classStaticPrivateMethodGet(AA, _a, _AA_method).call(AA); + const func = __classStaticPrivateMethodGet(AA, _a, _AA_method); func(); - new (__classStaticPrivateMethodGet(AA, AA, _AA_method))(); + new (__classStaticPrivateMethodGet(AA, _a, _AA_method))(); const arr = [1, 2]; - __classStaticPrivateMethodGet(AA, AA, _AA_method2).call(AA, 0, ...arr, 3); - const b = new (__classStaticPrivateMethodGet(AA, AA, _AA_method2))(0, ...arr, 3); //Error - const str = __classStaticPrivateMethodGet(AA, AA, _AA_method2).bind(AA) `head${1}middle${2}tail`; - __classStaticPrivateMethodGet((_a = AA.getClass()), AA, _AA_method2).bind(_a) `test${1}and${2}`; - __classStaticPrivateMethodGet((_b = AA.getClass()), AA, _AA_method2).call(_b, 0, ...arr, 3); - const b2 = new (__classStaticPrivateMethodGet(AA.getClass(), AA, _AA_method2))(0, ...arr, 3); //Error - const str2 = __classStaticPrivateMethodGet((_c = AA.getClass()), AA, _AA_method2).bind(_c) `head${1}middle${2}tail`; + __classStaticPrivateMethodGet(AA, _a, _AA_method2).call(AA, 0, ...arr, 3); + const b = new (__classStaticPrivateMethodGet(AA, _a, _AA_method2))(0, ...arr, 3); //Error + const str = __classStaticPrivateMethodGet(AA, _a, _AA_method2).bind(AA) `head${1}middle${2}tail`; + __classStaticPrivateMethodGet((_b = AA.getClass()), _a, _AA_method2).bind(_b) `test${1}and${2}`; + __classStaticPrivateMethodGet((_c = AA.getClass()), _a, _AA_method2).call(_c, 0, ...arr, 3); + const b2 = new (__classStaticPrivateMethodGet(AA.getClass(), _a, _AA_method2))(0, ...arr, 3); //Error + const str2 = __classStaticPrivateMethodGet((_d = AA.getClass()), _a, _AA_method2).bind(_d) `head${1}middle${2}tail`; } static getClass() { return AA; } } -_AA_method = function _AA_method() { this.x = 10; }, _AA_method2 = function _AA_method2(a, ...b) { }; +_a = AA, _AA_method = function _AA_method() { this.x = 10; }, _AA_method2 = function _AA_method2(a, ...b) { }; AA.x = 1; diff --git a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js index 2dfb9750fed8a..4e2160d101585 100644 --- a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js +++ b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js @@ -14,9 +14,9 @@ var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) } return fn; }; -var _C_method; +var _a, _C_method; class C { } -_C_method = function _C_method() { return 42; }; -C.s = __classStaticPrivateMethodGet(C, C, _C_method).call(C); +_a = C, _C_method = function _C_method() { return 42; }; +C.s = __classStaticPrivateMethodGet(C, _a, _C_method).call(C); console.log(C.s); diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index 09bf413c203f1..dcb14a8997386 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -43,22 +43,24 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_foo, _A_bar, _B_foo; +var _a, _A_foo, _A_bar, _b, _B_foo; class A { constructor() { - __classStaticPrivateFieldSet(A, A, _A_foo, 3); - __classStaticPrivateFieldGet(B, A, _A_foo); // Error - __classStaticPrivateFieldGet(B, A, _A_bar); // Error + __classStaticPrivateFieldSet(A, _a, _A_foo, 3); + __classStaticPrivateFieldGet(B, _a, _A_foo); // Error + __classStaticPrivateFieldGet(B, _a, _A_bar); // Error } } +_a = A; _A_foo = { value: void 0 }; _A_bar = { value: void 0 }; class B extends A { constructor() { super(); - __classStaticPrivateFieldSet(B, B, _B_foo, "some string"); + __classStaticPrivateFieldSet(B, _b, _B_foo, "some string"); } } +_b = B; _B_foo = { value: void 0 }; // We currently filter out static private identifier fields in `getUnmatchedProperties`. // We will need a more robust solution when we support static fields diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index b97c0939da014..eb0dbd87e498d 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -30,17 +30,17 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; +var _a, _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { _Parent_foo.set(this, 3); } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classStaticPrivateFieldGet(Child, Parent, _Parent_bar); // Error: not found + __classStaticPrivateFieldGet(Child, _a, _Parent_bar); // Error: not found } } -_Parent_foo = new WeakMap(); +_a = Parent, _Parent_foo = new WeakMap(); _Parent_bar = { value: 5 }; class Child extends Parent { constructor() { diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index 4e53e4b954c42..e54eba4f5c4ee 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -32,17 +32,17 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; +var _a, _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { constructor() { _Parent_foo.set(this, 3); } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classStaticPrivateFieldGet(Child, Parent, _Parent_bar); // Error: not found + __classStaticPrivateFieldGet(Child, _a, _Parent_bar); // Error: not found } } -_Parent_foo = new WeakMap(); +_a = Parent, _Parent_foo = new WeakMap(); _Parent_bar = { value: 5 }; class Child extends Parent { constructor() { diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.js b/tests/baselines/reference/privateNamesInNestedClasses-2.js index 26cace2ed9b70..b64df29fe560e 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.js @@ -24,7 +24,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( } return privateMap.get(receiver); }; -var _A_x; +var _a, _A_x; class A { constructor() { var _B_x; @@ -41,4 +41,5 @@ class A { _B_x = new WeakMap(); } } +_a = A; _A_x = { value: 5 }; diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index a6a4ba06d4b6e..fc63600568b39 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -24,7 +24,7 @@ var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) | } return propertyDescriptor.value; }; -var _A_foo, _A_foo_1, _B_foo; +var _a, _A_foo, _A_foo_1, _b, _B_foo; class A { constructor() { _A_foo_1 = { value: 1 }; @@ -33,11 +33,12 @@ class A { // https://tc39.es/proposal-class-fields/#prod-ClassBody } } -_A_foo = new WeakMap(); +_a = A, _A_foo = new WeakMap(); _A_foo_1 = { value: true }; // error (duplicate) class B { test(x) { - __classStaticPrivateFieldGet(x, B, _B_foo); // error (#foo is a static property on B, not an instance property) + __classStaticPrivateFieldGet(x, _b, _B_foo); // error (#foo is a static property on B, not an instance property) } } +_b = B; _B_foo = { value: true }; diff --git a/tests/baselines/reference/privateStaticNameShadowing.js b/tests/baselines/reference/privateStaticNameShadowing.js new file mode 100644 index 0000000000000..c37aba06f7471 --- /dev/null +++ b/tests/baselines/reference/privateStaticNameShadowing.js @@ -0,0 +1,36 @@ +//// [privateStaticNameShadowing.ts] +class X { + static #f = X.#m(); + constructor() { + X.#m(); + } + static #m() { + const X: any = {}; // shadow the class + const _a: any = {}; // shadow the first generated var + X.#m(); // Should check with X as the receiver with _b as the class constructor + return 1; + } + } + + +//// [privateStaticNameShadowing.js] +var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { + if (receiver !== classConstructor) { + throw new TypeError("Private static access of wrong provenance"); + } + return fn; +}; +var _b, _X_f, _X_m; +class X { + constructor() { + __classStaticPrivateMethodGet(X, _b, _X_m).call(X); + } +} +_b = X, _X_m = function _X_m() { + const X = {}; // shadow the class + const _a = {}; // shadow the first generated var + __classStaticPrivateMethodGet(X, _b, _X_m).call(// shadow the first generated var + X); // Should check with X as the receiver with _b as the class constructor + return 1; +}; +_X_f = { value: __classStaticPrivateMethodGet(X, _b, _X_m).call(X) }; diff --git a/tests/baselines/reference/privateStaticNameShadowing.symbols b/tests/baselines/reference/privateStaticNameShadowing.symbols new file mode 100644 index 0000000000000..95ad9ffc738bb --- /dev/null +++ b/tests/baselines/reference/privateStaticNameShadowing.symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts === +class X { +>X : Symbol(X, Decl(privateStaticNameShadowing.ts, 0, 0)) + + static #f = X.#m(); +>#f : Symbol(X.#f, Decl(privateStaticNameShadowing.ts, 0, 9)) +>X.#m : Symbol(X.#m, Decl(privateStaticNameShadowing.ts, 4, 5)) +>X : Symbol(X, Decl(privateStaticNameShadowing.ts, 0, 0)) + + constructor() { + X.#m(); +>X.#m : Symbol(X.#m, Decl(privateStaticNameShadowing.ts, 4, 5)) +>X : Symbol(X, Decl(privateStaticNameShadowing.ts, 0, 0)) + } + static #m() { +>#m : Symbol(X.#m, Decl(privateStaticNameShadowing.ts, 4, 5)) + + const X: any = {}; // shadow the class +>X : Symbol(X, Decl(privateStaticNameShadowing.ts, 6, 11)) + + const _a: any = {}; // shadow the first generated var +>_a : Symbol(_a, Decl(privateStaticNameShadowing.ts, 7, 11)) + + X.#m(); // Should check with X as the receiver with _b as the class constructor +>X : Symbol(X, Decl(privateStaticNameShadowing.ts, 6, 11)) + + return 1; + } + } + diff --git a/tests/baselines/reference/privateStaticNameShadowing.types b/tests/baselines/reference/privateStaticNameShadowing.types new file mode 100644 index 0000000000000..e636c4d063344 --- /dev/null +++ b/tests/baselines/reference/privateStaticNameShadowing.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts === +class X { +>X : X + + static #f = X.#m(); +>#f : number +>X.#m() : number +>X.#m : () => number +>X : typeof X + + constructor() { + X.#m(); +>X.#m() : number +>X.#m : () => number +>X : typeof X + } + static #m() { +>#m : () => number + + const X: any = {}; // shadow the class +>X : any +>{} : {} + + const _a: any = {}; // shadow the first generated var +>_a : any +>{} : {} + + X.#m(); // Should check with X as the receiver with _b as the class constructor +>X.#m() : any +>X.#m : any +>X : any + + return 1; +>1 : 1 + } + } + diff --git a/tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts b/tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts new file mode 100644 index 0000000000000..2d660f064cf23 --- /dev/null +++ b/tests/cases/conformance/classes/members/privateNames/privateStaticNameShadowing.ts @@ -0,0 +1,15 @@ +// @target: es2015 + +class X { + static #f = X.#m(); + constructor() { + X.#m(); + } + static #m() { + const X: any = {}; // shadow the class + const _a: any = {}; // shadow the first generated var + X.#m(); // Should check with X as the receiver with _b as the class constructor + return 1; + } + } + \ No newline at end of file From dd526e7109ad0e67dc06e225854fa9b986a76a9d Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 08:04:44 +0000 Subject: [PATCH 53/68] fix private methods/accessors in class expr inside a loop --- src/compiler/checker.ts | 39 +++++++++++-------- .../privateNameClassExpressionLoop.js | 14 +++++-- .../privateNameClassExpressionLoop.symbols | 10 +++++ .../privateNameClassExpressionLoop.types | 15 ++++++- .../privateNameClassExpressionLoop.ts | 3 ++ 5 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d93c2ba6c8d26..d5b0bce5416cd 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -32690,22 +32690,7 @@ namespace ts { if (!checkGrammarDecoratorsAndModifiers(node) && !checkGrammarProperty(node)) checkGrammarComputedPropertyName(node.name); checkVariableLikeDeclaration(node); - // Private class fields transformation relies on WeakMaps. - if (isPrivateIdentifier(node.name) && languageVersion < ScriptTarget.ESNext) { - for (let lexicalScope = getEnclosingBlockScopeContainer(node); !!lexicalScope; lexicalScope = getEnclosingBlockScopeContainer(lexicalScope)) { - getNodeLinks(lexicalScope).flags |= NodeCheckFlags.ContainsClassWithPrivateIdentifiers; - } - - // If this is a private field in a class expression inside the body of a loop, - // then we must use a block-scoped binding to store the WeakMap. - if (isClassExpression(node.parent)) { - const enclosingIterationStatement = getEnclosingIterationStatement(node.parent); - if (enclosingIterationStatement) { - getNodeLinks(node.name).flags |= NodeCheckFlags.BlockScopedBindingInLoop; - getNodeLinks(enclosingIterationStatement).flags |= NodeCheckFlags.LoopWithCapturedBlockScopedBinding; - } - } - } + setNodeLinksForPrivateIdentifierScope(node); } function checkPropertySignature(node: PropertySignature) { @@ -32732,6 +32717,27 @@ namespace ts { if (isPrivateIdentifier(node.name) && !getContainingClass(node)) { error(node, Diagnostics.Private_identifiers_are_not_allowed_outside_class_bodies); } + + setNodeLinksForPrivateIdentifierScope(node); + } + + function setNodeLinksForPrivateIdentifierScope(node: PropertyDeclaration | PropertySignature | MethodDeclaration | MethodSignature | AccessorDeclaration) { + if (isPrivateIdentifier(node.name) && languageVersion < ScriptTarget.ESNext) { + for (let lexicalScope = getEnclosingBlockScopeContainer(node); !!lexicalScope; lexicalScope = getEnclosingBlockScopeContainer(lexicalScope)) { + getNodeLinks(lexicalScope).flags |= NodeCheckFlags.ContainsClassWithPrivateIdentifiers; + } + + // If this is a private element in a class expression inside the body of a loop, + // then we must use a block-scoped binding to store the additional variables required + // to transform private elements. + if (isClassExpression(node.parent)) { + const enclosingIterationStatement = getEnclosingIterationStatement(node.parent); + if (enclosingIterationStatement) { + getNodeLinks(node.name).flags |= NodeCheckFlags.BlockScopedBindingInLoop; + getNodeLinks(enclosingIterationStatement).flags |= NodeCheckFlags.LoopWithCapturedBlockScopedBinding; + } + } + } } function checkConstructorDeclaration(node: ConstructorDeclaration) { @@ -32865,6 +32871,7 @@ namespace ts { } } checkSourceElement(node.body); + setNodeLinksForPrivateIdentifierScope(node); } function checkAccessorDeclarationTypesIdentical(first: AccessorDeclaration, second: AccessorDeclaration, getAnnotatedType: (a: AccessorDeclaration) => Type | undefined, message: DiagnosticMessage) { diff --git a/tests/baselines/reference/privateNameClassExpressionLoop.js b/tests/baselines/reference/privateNameClassExpressionLoop.js index bd83a8c9db829..dac5891a65ec3 100644 --- a/tests/baselines/reference/privateNameClassExpressionLoop.js +++ b/tests/baselines/reference/privateNameClassExpressionLoop.js @@ -3,6 +3,9 @@ const array = []; for (let i = 0; i < 10; ++i) { array.push(class C { #myField = "hello"; + #method() {} + get #accessor() { return 42; } + set #accessor(val) { } }); } @@ -11,12 +14,17 @@ for (let i = 0; i < 10; ++i) { var _a; const array = []; for (let i = 0; i < 10; ++i) { - let _myField; + let _C_instances, _C_myField, _C_method, _C_accessor_get, _C_accessor_set; array.push((_a = class C { constructor() { - _myField.set(this, "hello"); + _C_instances.add(this); + _C_myField.set(this, "hello"); } }, - _myField = new WeakMap(), + _C_myField = new WeakMap(), + _C_instances = new WeakSet(), + _C_method = function _C_method() { }, + _C_accessor_get = function _C_accessor_get() { return 42; }, + _C_accessor_set = function _C_accessor_set(val) { }, _a)); } diff --git a/tests/baselines/reference/privateNameClassExpressionLoop.symbols b/tests/baselines/reference/privateNameClassExpressionLoop.symbols index ac503fc6c9c08..3f303cbdde849 100644 --- a/tests/baselines/reference/privateNameClassExpressionLoop.symbols +++ b/tests/baselines/reference/privateNameClassExpressionLoop.symbols @@ -16,6 +16,16 @@ for (let i = 0; i < 10; ++i) { #myField = "hello"; >#myField : Symbol(C.#myField, Decl(privateNameClassExpressionLoop.ts, 2, 24)) + #method() {} +>#method : Symbol(C.#method, Decl(privateNameClassExpressionLoop.ts, 3, 27)) + + get #accessor() { return 42; } +>#accessor : Symbol(C.#accessor, Decl(privateNameClassExpressionLoop.ts, 4, 20), Decl(privateNameClassExpressionLoop.ts, 5, 38)) + + set #accessor(val) { } +>#accessor : Symbol(C.#accessor, Decl(privateNameClassExpressionLoop.ts, 4, 20), Decl(privateNameClassExpressionLoop.ts, 5, 38)) +>val : Symbol(val, Decl(privateNameClassExpressionLoop.ts, 6, 22)) + }); } diff --git a/tests/baselines/reference/privateNameClassExpressionLoop.types b/tests/baselines/reference/privateNameClassExpressionLoop.types index 5775f9fd042d8..5367c80e5db06 100644 --- a/tests/baselines/reference/privateNameClassExpressionLoop.types +++ b/tests/baselines/reference/privateNameClassExpressionLoop.types @@ -13,17 +13,28 @@ for (let i = 0; i < 10; ++i) { >i : number array.push(class C { ->array.push(class C { #myField = "hello"; }) : number +>array.push(class C { #myField = "hello"; #method() {} get #accessor() { return 42; } set #accessor(val) { } }) : number >array.push : (...items: any[]) => number >array : any[] >push : (...items: any[]) => number ->class C { #myField = "hello"; } : typeof C +>class C { #myField = "hello"; #method() {} get #accessor() { return 42; } set #accessor(val) { } } : typeof C >C : typeof C #myField = "hello"; >#myField : string >"hello" : "hello" + #method() {} +>#method : () => void + + get #accessor() { return 42; } +>#accessor : number +>42 : 42 + + set #accessor(val) { } +>#accessor : number +>val : number + }); } diff --git a/tests/cases/conformance/classes/members/privateNames/privateNameClassExpressionLoop.ts b/tests/cases/conformance/classes/members/privateNames/privateNameClassExpressionLoop.ts index 222be787d0e67..333a69f79f570 100644 --- a/tests/cases/conformance/classes/members/privateNames/privateNameClassExpressionLoop.ts +++ b/tests/cases/conformance/classes/members/privateNames/privateNameClassExpressionLoop.ts @@ -3,5 +3,8 @@ const array = []; for (let i = 0; i < 10; ++i) { array.push(class C { #myField = "hello"; + #method() {} + get #accessor() { return 42; } + set #accessor(val) { } }); } From f6ecfab59a6e09cf997ea6506132f1b7cdcf50d5 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 08:48:03 +0000 Subject: [PATCH 54/68] collapse switch case --- src/compiler/transformers/classFields.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 47f32762f7bfd..b0863c4a4e875 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -192,10 +192,8 @@ namespace ts { case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - return visitMethodDeclaration(node as AccessorDeclaration); - case SyntaxKind.MethodDeclaration: - return visitMethodDeclaration(node as MethodDeclaration); + return visitMethodOrAccessorDeclaration(node as MethodDeclaration | AccessorDeclaration); case SyntaxKind.PropertyDeclaration: return visitPropertyDeclaration(node as PropertyDeclaration); @@ -238,7 +236,7 @@ namespace ts { return node; } - function visitMethodDeclaration(node: MethodDeclaration | AccessorDeclaration) { + function visitMethodOrAccessorDeclaration(node: MethodDeclaration | AccessorDeclaration) { Debug.assert(!some(node.decorators)); const transformedMethod = visitEachChild(node, classElementVisitor, context); From 6c3f6610500fa9d39681c39c40428af4df910e9a Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 08:48:17 +0000 Subject: [PATCH 55/68] fix class name --- src/compiler/transformers/classFields.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index b0863c4a4e875..63f9ebd965c15 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -571,7 +571,7 @@ namespace ts { const name = getNameOfDeclaration(node); if (name && isIdentifier(name)) { - getPrivateIdentifierEnvironment().className = name.escapedText as string; + getPrivateIdentifierEnvironment().className = idText(name); } const privateInstanceMethods = getPrivateInstanceMethods(node); From ef69c6c7d8587bb8122fa967abcc9ce12e30e1c4 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 08:48:37 +0000 Subject: [PATCH 56/68] simplify getPrivateMethodsAndAccessors --- src/compiler/transformers/classFields.ts | 24 +++++++-------- src/compiler/transformers/utilities.ts | 37 ++---------------------- src/compiler/types.ts | 2 ++ 3 files changed, 17 insertions(+), 46 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 63f9ebd965c15..31cc86f0e1aa2 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -574,9 +574,12 @@ namespace ts { getPrivateIdentifierEnvironment().className = idText(name); } - const privateInstanceMethods = getPrivateInstanceMethods(node); - if (some(privateInstanceMethods)) { - getPrivateIdentifierEnvironment().weakSetName = createHoistedVariableForClass("instances", privateInstanceMethods[0].name as PrivateIdentifier); + const privateInstanceMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node); + if (some(privateInstanceMethodsAndAccessors)) { + getPrivateIdentifierEnvironment().weakSetName = createHoistedVariableForClass( + "instances", + privateInstanceMethodsAndAccessors[0].name + ); } } @@ -595,11 +598,8 @@ namespace ts { return isPropertyDeclaration(node) || (shouldTransformPrivateElements && node.name && isPrivateIdentifier(node.name)); } - function getPrivateInstanceMethods(node: ClassLikeDeclaration) { - return filter( - [...getMethods(node, /*isStatic*/ false), ...getAccessors(node, /*isStatic*/ false)], - method => isPrivateIdentifier(method.name) - ); + function getPrivateInstanceMethodsAndAccessors(node: ClassLikeDeclaration) { + return filter(node.members, isNonStaticMethodOrAccessorWithPrivateName); } function visitClassDeclaration(node: ClassDeclaration) { @@ -721,7 +721,7 @@ namespace ts { } } - if (some(getPrivateInstanceMethods(node))) { + if (some(getPrivateInstanceMethodsAndAccessors(node))) { createBrandCheckWeakSetForPrivateMethods(); } } @@ -794,8 +794,8 @@ namespace ts { properties = filter(properties, property => !!property.initializer || isPrivateIdentifier(property.name)); } - const privateMethods = getPrivateInstanceMethods(node); - const needsConstructorBody = some(properties) || some(privateMethods); + const privateMethodsAndAccessors = getPrivateInstanceMethodsAndAccessors(node); + const needsConstructorBody = some(properties) || some(privateMethodsAndAccessors); // Only generate synthetic constructor when there are property initializers to move. if (!constructor && !needsConstructorBody) { @@ -850,7 +850,7 @@ namespace ts { } const receiver = factory.createThis(); // private methods can be called in property initializers, they should execute first. - addMethodStatements(statements, privateMethods, receiver); + addMethodStatements(statements, privateMethodsAndAccessors, receiver); addPropertyStatements(statements, properties, receiver); // Add existing statements, skipping the initial super call. diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index 8f6ea8edf9ea3..e1c3b0b957d6d 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -342,26 +342,6 @@ namespace ts { return filter(node.members, m => isInitializedOrStaticProperty(m, requireInitializer, isStatic)) as PropertyDeclaration[]; } - /** - * Gets all the static or all the instance method declarations of a class. - * - * @param node The class node. - * @param isStatic A value indicating whether to get methods from the static or instance side of the class. - */ - export function getMethods(node: ClassExpression | ClassDeclaration, isStatic: boolean): readonly MethodDeclaration[] { - return filter(node.members, m => isStaticMethodDeclaration(m, isStatic)) as MethodDeclaration[]; - } - - /** - * Gets all the static or all the instance accessor declarations of a class. - * - * @param node The class node. - * @param isStatic A value indicating whether to get accessors from the static or instance side of the class. - */ - export function getAccessors(node: ClassExpression | ClassDeclaration, isStatic: boolean): readonly AccessorDeclaration[] { - return filter(node.members, m => isStaticAccessorDeclaration(m, isStatic)) as AccessorDeclaration[]; - } - /** * Is a class element either a static or an instance property declaration with an initializer? * @@ -386,22 +366,11 @@ namespace ts { } /** - * Gets a value indicating whether a class element is either a static or an instance method declaration. - * - * @param member The class element node. - * @param isStatic A value indicating whether the member should be a static or instance member. - */ - export function isStaticMethodDeclaration(member: ClassElement, isStatic: boolean): member is MethodDeclaration { - return isMethodDeclaration(member) && hasStaticModifier(member) === isStatic; - } - - /** - * Gets a value indicating whether a class element is either a static or an instance accessor declaration. + * Gets a value indicating whether a class element is a private instance method or accessor. * * @param member The class element node. - * @param isStatic A value indicating whether the member should be a static or instance member. */ - export function isStaticAccessorDeclaration(member: ClassElement, isStatic: boolean): member is AccessorDeclaration { - return isGetOrSetAccessorDeclaration(member) && hasStaticModifier(member) === isStatic; + export function isNonStaticMethodOrAccessorWithPrivateName(member: ClassElement): member is PrivateIdentifierMethodDeclaration | PrivateIdentifierAccessorDeclaration { + return !hasStaticModifier(member) && isMethodOrAccessor(member) && isPrivateIdentifier(member.name); } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 44190aa10c388..11f4c6d3ea7e1 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1315,6 +1315,8 @@ namespace ts { name: PrivateIdentifier; } /*@internal*/ + export type PrivateIdentifierAccessorDeclaration = PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration; + /*@internal*/ export type PrivateClassElementDeclaration = | PrivateIdentifierPropertyDeclaration | PrivateIdentifierMethodDeclaration From 2a646ed7e7f2bb140aee50408a70b1a6333bb9f3 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 08:54:19 +0000 Subject: [PATCH 57/68] remove findPreviousAccessorInfo --- src/compiler/transformers/classFields.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 31cc86f0e1aa2..b0d85b3b2612c 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -1134,7 +1134,7 @@ namespace ts { }; } else if (isAccessor(node)) { - const previousInfo = findPreviousAccessorInfo(node); + const previousInfo = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); if (isGetAccessor(node)) { const getterName = createHoistedVariableForPrivateName(text + "_get", node); @@ -1183,16 +1183,6 @@ namespace ts { getPendingExpressions().push(...assignmentExpressions); } - function findPreviousAccessorInfo( - node: PrivateIdentifierGetAccessorDeclaration | PrivateIdentifierSetAccessorDeclaration - ): PrivateIdentifierInstanceGetterOnly | PrivateIdentifierInstanceSetterOnly | undefined { - const info = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); - if (info?.placement === PrivateIdentifierPlacement.InstanceGetterOnly || - info?.placement === PrivateIdentifierPlacement.InstanceSetterOnly) { - return info; - } - } - function createHoistedVariableForClass(name: string, node: PrivateIdentifier): Identifier { const { className } = getPrivateIdentifierEnvironment(); const prefix = className ? `_${className}` : ""; From d8136f7628467e07a81ec42cdb4ad9b093213eef Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Wed, 17 Mar 2021 13:48:03 +0000 Subject: [PATCH 58/68] lazily create weakSetName identifier --- src/compiler/transformers/classFields.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index b0d85b3b2612c..74fd686373c32 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -61,7 +61,7 @@ namespace ts { /** * Used for brand check on private methods. */ - weakSetName: Identifier; + weakSetName?: Identifier; /** * A mapping of private names to information needed for transformation. */ @@ -736,9 +736,12 @@ namespace ts { } function createBrandCheckWeakSetForPrivateMethods() { + const { weakSetName } = getPrivateIdentifierEnvironment(); + Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); + getPendingExpressions().push( factory.createAssignment( - getPrivateIdentifierEnvironment().weakSetName, + weakSetName, factory.createNewExpression( factory.createIdentifier("WeakSet"), /*typeArguments*/ undefined, @@ -997,9 +1000,11 @@ namespace ts { return; } + const { weakSetName } = getPrivateIdentifierEnvironment(); + Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); statements.push( factory.createExpressionStatement( - createPrivateInstanceMethodInitializer(receiver, getPrivateIdentifierEnvironment().weakSetName) + createPrivateInstanceMethodInitializer(receiver, weakSetName) ) ); } @@ -1092,7 +1097,6 @@ namespace ts { if (!currentPrivateIdentifierEnvironment) { currentPrivateIdentifierEnvironment = { className: "", - weakSetName: factory.createUniqueName("_instances", GeneratedIdentifierFlags.Optimistic), identifiers: new Map() }; } @@ -1127,6 +1131,8 @@ namespace ts { )); } else if (isMethodDeclaration(node)) { + Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); + info = { placement: PrivateIdentifierPlacement.InstanceMethod, weakSetName, @@ -1134,6 +1140,7 @@ namespace ts { }; } else if (isAccessor(node)) { + Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); const previousInfo = getPrivateIdentifierEnvironment().identifiers.get(node.name.escapedText); if (isGetAccessor(node)) { From 5a2f195ac657865d784235b34838274391c476ec Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Wed, 17 Mar 2021 20:11:45 +0200 Subject: [PATCH 59/68] Removed all the emit helpers for private identifier methods accessors and modified the existing helpers for get and set fields to do the same job. --- src/compiler/factory/emitHelpers.ts | 300 +++--------------- src/compiler/transformers/classFields.ts | 69 ++-- .../reference/privateNameAccessors.js | 31 +- .../reference/privateNameAccessorsAccess.js | 15 +- .../privateNameAccessorsCallExpression.js | 23 +- .../privateNameAccessorssDerivedClasses.js | 11 +- .../baselines/reference/privateNameAndAny.js | 36 +-- .../privateNameAndObjectRestSpread.js | 22 +- .../reference/privateNameBadAssignment.js | 11 +- .../reference/privateNameCircularReference.js | 9 +- ...ameComputedPropertyName1(target=es2015).js | 20 +- ...ameComputedPropertyName2(target=es2015).js | 9 +- ...ameComputedPropertyName3(target=es2015).js | 20 +- .../privateNameConstructorSignature.js | 11 +- .../privateNameDeclarationMerging.js | 9 +- tests/baselines/reference/privateNameField.js | 11 +- .../reference/privateNameFieldAccess.js | 9 +- .../reference/privateNameFieldAssignment.js | 20 +- .../privateNameFieldCallExpression.js | 9 +- .../privateNameFieldDerivedClasses.js | 9 +- ...FieldDestructuredBinding(target=es2015).js | 11 +- .../privateNameFieldUnaryMutation.js | 20 +- .../privateNameInLhsReceiverExpression.js | 20 +- .../baselines/reference/privateNameMethod.js | 15 +- .../reference/privateNameMethodAccess.js | 15 +- .../reference/privateNameMethodAssignment.js | 32 +- .../reference/privateNameMethodAsync.js | 13 +- .../privateNameMethodCallExpression.js | 29 +- .../privateNameMethodClassExpression.js | 17 +- .../privateNameMethodInStaticFieldInit.js | 11 +- .../privateNameMethodsDerivedClasses.js | 11 +- ...rivateNameNestedClassAccessorsShadowing.js | 13 +- .../privateNameNestedClassFieldShadowing.js | 9 +- .../privateNameNestedClassMethodShadowing.js | 13 +- .../privateNameNestedMethodAccess.js | 31 +- .../reference/privateNameReadonly.js | 9 +- .../privateNameSetterExprReturnValue.js | 13 +- .../reference/privateNameSetterNoGetter.js | 19 +- .../reference/privateNameStaticAccessors.js | 31 +- .../privateNameStaticAccessorsAccess.js | 15 +- ...rivateNameStaticAccessorsCallExpression.js | 39 +-- ...ivateNameStaticAccessorssDerivedClasses.js | 11 +- .../reference/privateNameStaticFieldAccess.js | 16 +- .../privateNameStaticFieldAssignment.js | 78 ++--- .../privateNameStaticFieldCallExpression.js | 28 +- .../privateNameStaticFieldClassExpression.js | 20 +- .../privateNameStaticFieldDerivedClasses.js | 32 +- ...FieldDestructuredBinding(target=es2015).js | 30 +- .../privateNameStaticFieldUnaryMutation.js | 66 ++-- .../reference/privateNameStaticMethod.js | 15 +- .../privateNameStaticMethodAssignment.js | 32 +- .../reference/privateNameStaticMethodAsync.js | 13 +- .../privateNameStaticMethodCallExpression.js | 29 +- .../privateNameStaticMethodClassExpression.js | 22 +- ...rivateNameStaticMethodInStaticFieldInit.js | 11 +- .../reference/privateNamesAndFields.js | 11 +- .../privateNamesAndGenericClasses-2.js | 28 +- .../reference/privateNamesAndStaticFields.js | 34 +- .../privateNamesConstructorChain-1.js | 20 +- .../privateNamesConstructorChain-2.js | 20 +- .../reference/privateNamesInGenericClasses.js | 44 +-- .../privateNamesInNestedClasses-1.js | 9 +- .../privateNamesInNestedClasses-2.js | 9 +- .../privateNamesInterfaceExtendingClass.js | 11 +- .../reference/privateNamesNoDelete.js | 9 +- .../reference/privateNamesUnique-2.js | 9 +- .../reference/privateNamesUnique-3.js | 14 +- .../reference/privateNamesUseBeforeDef.js | 25 +- .../reference/privateStaticNameShadowing.js | 15 +- .../reference/strictPropertyInitialization.js | 20 +- 70 files changed, 656 insertions(+), 1065 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index a65e32b220ef7..29049f126057b 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -32,21 +32,8 @@ namespace ts { createImportDefaultHelper(expression: Expression): Expression; createExportStarHelper(moduleExpression: Expression, exportsExpression?: Expression): Expression; // Class Fields Helpers - createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier): Expression; - createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression): Expression; - createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; - createClassPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; - createClassPrivateWriteonlyHelper(receiver: Expression): Expression; - createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier): Expression; - createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression): Expression; - // Class Static Private Helpers - createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier): Expression; - createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression): Expression; - createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression; - createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression): Expression; - createClassStaticPrivateWriteonlyHelper(receiver: Expression): Expression; - createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier): Expression; - createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression): Expression; + createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier, kind?: "a" | "m" | undefined, f?: Identifier | undefined): Expression; + createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression, kind?: "a" | "m" | undefined, f?: Identifier | undefined): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -85,18 +72,6 @@ namespace ts { // Class Fields Helpers createClassPrivateFieldGetHelper, createClassPrivateFieldSetHelper, - createClassPrivateMethodGetHelper, - createClassPrivateReadonlyHelper, - createClassPrivateWriteonlyHelper, - createClassPrivateAccessorGetHelper, - createClassPrivateAccessorSetHelper, - createClassStaticPrivateFieldGetHelper, - createClassStaticPrivateFieldSetHelper, - createClassStaticPrivateMethodGetHelper, - createClassStaticPrivateReadonlyHelper, - createClassStaticPrivateWriteonlyHelper, - createClassStaticPrivateAccessorGetHelper, - createClassStaticPrivateAccessorSetHelper, }; /** @@ -393,75 +368,42 @@ namespace ts { // Class Fields Helpers - function createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier) { + function createClassPrivateFieldGetHelper(receiver: Expression, state: Identifier, kind?: "a" | "m" | undefined, f?: Identifier | undefined) { context.requestEmitHelper(classPrivateFieldGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldGet"), /*typeArguments*/ undefined, [receiver, privateField]); + let args; + if(!kind && !f) { + args = [receiver, state]; + } + else if(kind && !f) { + args = [receiver, state, factory.createStringLiteral(kind)]; + } + else if(!kind && f) { + args = [receiver, state, factory.createVoidZero(), f]; + } + else { + args = [receiver, state, factory.createStringLiteral(kind!), f!]; + } + return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldGet"), /*typeArguments*/ undefined, args); } - function createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression) { + function createClassPrivateFieldSetHelper(receiver: Expression, state: Identifier, value: Expression, kind?: "a" | "m" | undefined, f?: Identifier | undefined) { context.requestEmitHelper(classPrivateFieldSetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, privateField, value]); - } - - function createClassPrivateMethodGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) { - context.requestEmitHelper(classPrivateMethodGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); - } - - function createClassPrivateReadonlyHelper(receiver: Expression, value: Expression) { - context.requestEmitHelper(classPrivateReadonlyHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); - } - - function createClassPrivateWriteonlyHelper(receiver: Expression) { - context.requestEmitHelper(classPrivateWriteonlyHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]); - } - - function createClassPrivateAccessorGetHelper(receiver: Expression, instances: Identifier, fn: Identifier) { - context.requestEmitHelper(classPrivateAccessorGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, instances, fn]); - } - - function createClassPrivateAccessorSetHelper(receiver: Expression, instances: Identifier, fn: Identifier, value: Expression) { - context.requestEmitHelper(classPrivateAccessorSetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, instances, fn, value]); - } - // Class Private Static Helpers - function createClassStaticPrivateFieldGetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier) { - context.requestEmitHelper(classStaticPrivateFieldGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldGet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField]); - } - - function createClassStaticPrivateFieldSetHelper(receiver: Expression, classConstructor: Identifier, privateField: Identifier, value: Expression) { - context.requestEmitHelper(classStaticPrivateFieldSetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateFieldSet"), /*typeArguments*/ undefined, [receiver, classConstructor, privateField, value]); - } - - function createClassStaticPrivateMethodGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) { - context.requestEmitHelper(classStaticPrivateMethodGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateMethodGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]); - } - - function createClassStaticPrivateReadonlyHelper(receiver: Expression, value: Expression) { - context.requestEmitHelper(classStaticPrivateReadonlyHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateReadonly"), /*typeArguments*/ undefined, [receiver, value]); - } - - function createClassStaticPrivateWriteonlyHelper(receiver: Expression) { - context.requestEmitHelper(classStaticPrivateWriteonlyHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateWriteonly"), /*typeArguments*/ undefined, [receiver]); - } - - function createClassStaticPrivateAccessorGetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier) { - context.requestEmitHelper(classStaticPrivateAccessorGetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorGet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn]); + let args; + if(!kind && !f) { + args = [receiver, state, value]; + } + else if(kind && !f) { + args = [receiver, state, value, factory.createStringLiteral(kind)]; + } + else if(!kind && f) { + args = [receiver, state, value, factory.createVoidZero(), f]; + } + else { + args = [receiver, state, value, factory.createStringLiteral(kind!), f!]; + } + return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, args); } - function createClassStaticPrivateAccessorSetHelper(receiver: Expression, classConstructor: Identifier, fn: Identifier, value: Expression) { - context.requestEmitHelper(classStaticPrivateAccessorSetHelper); - return factory.createCallExpression(getUnscopedHelperName("__classStaticPrivateAccessorSet"), /*typeArguments*/ undefined, [receiver, classConstructor, fn, value]); - } } /* @internal */ @@ -907,11 +849,10 @@ namespace ts { importName: "__classPrivateFieldGet", scoped: false, text: ` - var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); + var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); };` }; @@ -920,165 +861,11 @@ namespace ts { importName: "__classPrivateFieldSet", scoped: false, text: ` - var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; - };` - }; - - export const classPrivateMethodGetHelper: UnscopedEmitHelper = { - name: "typescript:classPrivateMethodGet", - importName: "__classPrivateMethodGet", - scoped: false, - text: ` - var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; - };` - }; - - export const classPrivateReadonlyHelper: UnscopedEmitHelper = { - name: "typescript:classPrivateReadonly", - importName: "__classPrivateReadonly", - scoped: false, - text: ` - var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { - throw new TypeError("private element is not writable"); - };` - }; - - export const classPrivateWriteonlyHelper: UnscopedEmitHelper = { - name: "typescript:classPrivateWriteonly", - importName: "__classPrivateWriteonly", - scoped: false, - text: ` - var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { - throw new TypeError("private setter was defined without a getter"); - };` - }; - - export const classPrivateAccessorGetHelper: UnscopedEmitHelper = { - name: "typescript:classPrivateAccessorGet", - importName: "__classPrivateAccessorGet", - scoped: false, - text: ` - var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); - };` - }; - - export const classPrivateAccessorSetHelper: UnscopedEmitHelper = { - name: "typescript:classPrivateAccessorSet", - importName: "__classPrivateAccessorSet", - scoped: false, - text: ` - var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to set private accessor on non-instance"); - } - fn.call(receiver, value); - return value; - };` - }; - - export const classStaticPrivateFieldGetHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateFieldGet", - importName: "__classStaticPrivateFieldGet", - scoped: false, - text: ` - var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; - };` - }; - - export const classStaticPrivateFieldSetHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateFieldSet", - importName: "__classStaticPrivateFieldSet", - scoped: false, - text: ` - var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; - };` - }; - - export const classStaticPrivateMethodGetHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateMethodGet", - importName: "__classStaticPrivateMethodGet", - scoped: false, - text: ` - var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; - };` - }; - - export const classStaticPrivateReadonlyHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateReadonly", - importName: "__classStaticPrivateReadonly", - scoped: false, - text: ` - var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { - throw new TypeError("Private static element is not writable"); - };` - }; - - export const classStaticPrivateWriteonlyHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateWriteonly", - importName: "__classStaticPrivateWriteonly", - scoped: false, - text: ` - var __classStaticPrivateWriteonly = (this && this.__classStaticPrivateWriteonly) || function () { - throw new TypeError("Private static element is not readable"); - };` - }; - - export const classStaticPrivateAccessorGetHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateAccessorGet", - importName: "__classStaticPrivateAccessorGet", - scoped: false, - text: ` - var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn.call(receiver); - };` - }; - - export const classStaticPrivateAccessorSetHelper: UnscopedEmitHelper = { - name: "typescript:classStaticPrivateAccessorSet", - importName: "__classStaticPrivateAccessorSet", - scoped: false, - text: ` - var __classStaticPrivateAccessorSet = (this && this.__classStaticPrivateAccessorSet) || function (receiver, classConstructor, fn, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - fn.call(receiver, value); - return value; + var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; };` }; @@ -1107,11 +894,6 @@ namespace ts { exportStarHelper, classPrivateFieldGetHelper, classPrivateFieldSetHelper, - classPrivateMethodGetHelper, - classPrivateReadonlyHelper, - classPrivateWriteonlyHelper, - classPrivateAccessorGetHelper, - classPrivateAccessorSetHelper, createBindingHelper, setModuleDefaultHelper ], helper => helper.name)); diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index b0bdec96bf229..28d51013faa7f 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -46,11 +46,13 @@ namespace ts { interface PrivateIdentifierStaticGetterOnly { placement: PrivateIdentifierPlacement.StaticGetterOnly; getterName: Identifier; + setterName?: undefined; classConstructor: Identifier; } interface PrivateIdentifierStaticSetterOnly { placement: PrivateIdentifierPlacement.StaticSetterOnly; setterName: Identifier; + getterName?: undefined; classConstructor: Identifier; } interface PrivateIdentifierStaticGetterAndSetterOnly { @@ -74,12 +76,14 @@ namespace ts { placement: PrivateIdentifierPlacement.InstanceGetterOnly; weakSetName: Identifier; getterName: Identifier; + setterName?: undefined; } interface PrivateIdentifierInstanceSetterOnly { placement: PrivateIdentifierPlacement.InstanceSetterOnly; weakSetName: Identifier; setterName: Identifier; + getterName?: undefined; } interface PrivateIdentifierInstanceGetterAndSetter { @@ -369,44 +373,48 @@ namespace ts { info.weakMapName ); case PrivateIdentifierPlacement.InstanceMethod: - return context.getEmitHelperFactory().createClassPrivateMethodGetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, info.weakSetName, + "m", info.functionName ); case PrivateIdentifierPlacement.InstanceGetterOnly: case PrivateIdentifierPlacement.InstanceGetterAndSetter: - return context.getEmitHelperFactory().createClassPrivateAccessorGetHelper( + case PrivateIdentifierPlacement.InstanceSetterOnly: + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, info.weakSetName, + "a", info.getterName ); - case PrivateIdentifierPlacement.InstanceSetterOnly: - return context.getEmitHelperFactory().createClassPrivateWriteonlyHelper( - receiver - ); case PrivateIdentifierPlacement.StaticField: - return context.getEmitHelperFactory().createClassStaticPrivateFieldGetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, info.classConstructor, + undefined, info.variableName ); case PrivateIdentifierPlacement.StaticMethod: - return context.getEmitHelperFactory().createClassStaticPrivateMethodGetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, info.classConstructor, + "m", info.functionName ); case PrivateIdentifierPlacement.StaticGetterOnly: case PrivateIdentifierPlacement.StaticGetterAndSetter: - return context.getEmitHelperFactory().createClassStaticPrivateAccessorGetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, info.classConstructor, + "a", info.getterName ); case PrivateIdentifierPlacement.StaticSetterOnly: - return context.getEmitHelperFactory().createClassStaticPrivateWriteonlyHelper( - receiver + return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( + receiver, + info.classConstructor, + "a" ); default: return Debug.fail("Unexpected private identifier placement"); } @@ -610,39 +618,58 @@ namespace ts { right ); case PrivateIdentifierPlacement.InstanceMethod: + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( + receiver, + info.weakSetName, + right, + "m" + ); case PrivateIdentifierPlacement.InstanceGetterOnly: - return context.getEmitHelperFactory().createClassPrivateReadonlyHelper( + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, - right + info.weakSetName, + right, + "a" ); case PrivateIdentifierPlacement.InstanceSetterOnly: case PrivateIdentifierPlacement.InstanceGetterAndSetter: - return context.getEmitHelperFactory().createClassPrivateAccessorSetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, info.weakSetName, + right, + "a", info.setterName, - right ); case PrivateIdentifierPlacement.StaticField: - return context.getEmitHelperFactory().createClassStaticPrivateFieldSetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, info.classConstructor, + right, + undefined, info.variableName, - right ); case PrivateIdentifierPlacement.StaticMethod: + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( + receiver, + info.classConstructor, + right, + "m", + ); case PrivateIdentifierPlacement.StaticGetterOnly: - return context.getEmitHelperFactory().createClassStaticPrivateReadonlyHelper( + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, - right + info.classConstructor, + right, + "a", ); case PrivateIdentifierPlacement.StaticSetterOnly: case PrivateIdentifierPlacement.StaticGetterAndSetter: - return context.getEmitHelperFactory().createClassStaticPrivateAccessorSetHelper( + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, info.classConstructor, + right, + "a", info.setterName, - right ); default: return Debug.fail("Unexpected private identifier placement"); } diff --git a/tests/baselines/reference/privateNameAccessors.js b/tests/baselines/reference/privateNameAccessors.js index f2c736fa52376..231ea602882b8 100644 --- a/tests/baselines/reference/privateNameAccessors.js +++ b/tests/baselines/reference/privateNameAccessors.js @@ -16,30 +16,25 @@ class A1 { //// [privateNameAccessors.js] "use strict"; -var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to set private accessor on non-instance"); - } - fn.call(receiver, value); - return value; -}; -var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { - throw new TypeError("private element is not writable"); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A1_instances, _A1_prop_get, _A1_prop_set, _A1_roProp_get; class A1 { constructor(name) { _A1_instances.add(this); - __classPrivateAccessorSet(this, _A1_instances, _A1_prop_set, ""); - __classPrivateReadonly(this, ""); // Error - console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_prop_get)); - console.log(__classPrivateAccessorGet(this, _A1_instances, _A1_roProp_get)); + __classPrivateFieldSet(this, _A1_instances, "", "a", _A1_prop_set); + __classPrivateFieldSet(this, _A1_instances, "", "a"); // Error + console.log(__classPrivateFieldGet(this, _A1_instances, "a", _A1_prop_get)); + console.log(__classPrivateFieldGet(this, _A1_instances, "a", _A1_roProp_get)); } } _A1_instances = new WeakSet(), _A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; diff --git a/tests/baselines/reference/privateNameAccessorsAccess.js b/tests/baselines/reference/privateNameAccessorsAccess.js index 5420d8bec82bb..b680f6964e2c9 100644 --- a/tests/baselines/reference/privateNameAccessorsAccess.js +++ b/tests/baselines/reference/privateNameAccessorsAccess.js @@ -26,21 +26,20 @@ class B2 { //// [privateNameAccessorsAccess.js] -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A2_instances, _A2_prop_get, _A2_prop_set; class A2 { constructor() { _A2_instances.add(this); - console.log(__classPrivateAccessorGet(this, _A2_instances, _A2_prop_get)); + console.log(__classPrivateFieldGet(this, _A2_instances, "a", _A2_prop_get)); let a = this; - __classPrivateAccessorGet(a, _A2_instances, _A2_prop_get); + __classPrivateFieldGet(a, _A2_instances, "a", _A2_prop_get); function foo() { - __classPrivateAccessorGet(a, _A2_instances, _A2_prop_get); + __classPrivateFieldGet(a, _A2_instances, "a", _A2_prop_get); } } } diff --git a/tests/baselines/reference/privateNameAccessorsCallExpression.js b/tests/baselines/reference/privateNameAccessorsCallExpression.js index edfc6ae9aa08c..a75e534b816a9 100644 --- a/tests/baselines/reference/privateNameAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameAccessorsCallExpression.js @@ -19,11 +19,10 @@ class A { } //// [privateNameAccessorsCallExpression.js] -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_instances, _A_fieldFunc_get, _A_fieldFunc2_get; class A { @@ -33,15 +32,15 @@ class A { } test() { var _a; - __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get).call(this); - const func = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get); + __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get).call(this); + const func = __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get); func(); - new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc_get))(); + new (__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc_get))(); const arr = [1, 2]; - __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).call(this, 0, ...arr, 3); - const b = new (__classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get))(0, ...arr, 3); - const str = __classPrivateAccessorGet(this, _A_instances, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; - __classPrivateAccessorGet((_a = this.getInstance()), _A_instances, _A_fieldFunc2_get).bind(_a) `test${1}and${2}`; + __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get))(0, ...arr, 3); + const str = __classPrivateFieldGet(this, _A_instances, "a", _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_a = this.getInstance()), _A_instances, "a", _A_fieldFunc2_get).bind(_a) `test${1}and${2}`; } getInstance() { return new A(); } } diff --git a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js index 445716f35f753..fca5cb4544b68 100644 --- a/tests/baselines/reference/privateNameAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameAccessorssDerivedClasses.js @@ -13,11 +13,10 @@ class Derived extends Base { //// [privateNameAccessorssDerivedClasses.js] -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_instances, _Base_prop_get; class Base { @@ -25,7 +24,7 @@ class Base { _Base_instances.add(this); } static method(x) { - console.log(__classPrivateAccessorGet(x, _Base_instances, _Base_prop_get)); + console.log(__classPrivateFieldGet(x, _Base_instances, "a", _Base_prop_get)); } } _Base_instances = new WeakSet(), _Base_prop_get = function _Base_prop_get() { return 123; }; diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index e80ac060f9ab6..8d2a35e26e0f5 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -29,26 +29,10 @@ class A { //// [privateNameAndAny.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; -}; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_foo, _A_baz, _A_m; class A { @@ -57,24 +41,24 @@ class A { } method(thing) { __classPrivateFieldGet(thing, _A_foo); // OK - __classStaticPrivateMethodGet(thing, _a, _A_m).call(// OK + __classPrivateFieldGet(thing, _a, "m", _A_m).call(// OK thing); - __classStaticPrivateFieldGet(thing, _a, _A_baz); + __classPrivateFieldGet(thing, _a, void 0, _A_baz); thing.; // Error __classPrivateFieldGet(thing, _A_foo).call(// Error thing); } methodU(thing) { __classPrivateFieldGet(thing, _A_foo); - __classStaticPrivateMethodGet(thing, _a, _A_m).call(thing); - __classStaticPrivateFieldGet(thing, _a, _A_baz); + __classPrivateFieldGet(thing, _a, "m", _A_m).call(thing); + __classPrivateFieldGet(thing, _a, void 0, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } methodN(thing) { __classPrivateFieldGet(thing, _A_foo); - __classStaticPrivateMethodGet(thing, _a, _A_m).call(thing); - __classStaticPrivateFieldGet(thing, _a, _A_baz); + __classPrivateFieldGet(thing, _a, "m", _A_m).call(thing); + __classPrivateFieldGet(thing, _a, void 0, _A_baz); thing.; __classPrivateFieldGet(thing, _A_foo).call(thing); } diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index 7dba9fa4fb55d..40578d864c3e3 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -18,20 +18,10 @@ class C { //// [privateNameAndObjectRestSpread.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; @@ -55,9 +45,9 @@ class C { const rest = __rest(other, []); __classPrivateFieldGet(rest, _C_prop); const statics = Object.assign({}, C); - __classStaticPrivateFieldGet(statics, _a, _C_propStatic); + __classPrivateFieldGet(statics, _a, void 0, _C_propStatic); const sRest = __rest(C, []); - __classStaticPrivateFieldGet(sRest, _a, _C_propStatic); + __classPrivateFieldGet(sRest, _a, void 0, _C_propStatic); } } _a = C, _C_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNameBadAssignment.js b/tests/baselines/reference/privateNameBadAssignment.js index 7d13cbd05de64..6dfdb911e3745 100644 --- a/tests/baselines/reference/privateNameBadAssignment.js +++ b/tests/baselines/reference/privateNameBadAssignment.js @@ -16,12 +16,11 @@ class C { //// [privateNameBadAssignment.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_bar; exports. = 1; // Error (outside class body) diff --git a/tests/baselines/reference/privateNameCircularReference.js b/tests/baselines/reference/privateNameCircularReference.js index c74ba4d84e9b2..731447f0a43dc 100644 --- a/tests/baselines/reference/privateNameCircularReference.js +++ b/tests/baselines/reference/privateNameCircularReference.js @@ -8,11 +8,10 @@ class A { //// [privateNameCircularReference.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_foo, _A_bar; class A { diff --git a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js index 3392289b5bc4c..60c0aae5b378d 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js @@ -38,18 +38,16 @@ new A().test(); //// [privateNameComputedPropertyName1.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_a, _A_b, _A_c, _A_d, _A_e; class A { diff --git a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js index 23a34074d441d..f1c2f488c88f6 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js @@ -10,11 +10,10 @@ console.log(getX(new A)); //// [privateNameComputedPropertyName2.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_x; let getX; diff --git a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js index f404487ac3501..931acdae9fc35 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js @@ -25,18 +25,16 @@ console.log(new Foo("NAME").getValue(100)); //// [privateNameComputedPropertyName3.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Foo_name; class Foo { diff --git a/tests/baselines/reference/privateNameConstructorSignature.js b/tests/baselines/reference/privateNameConstructorSignature.js index adc58b3d9b8e0..897e2ae76041a 100644 --- a/tests/baselines/reference/privateNameConstructorSignature.js +++ b/tests/baselines/reference/privateNameConstructorSignature.js @@ -18,12 +18,11 @@ interface C { //// [privateNameConstructorSignature.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_x; class C { diff --git a/tests/baselines/reference/privateNameDeclarationMerging.js b/tests/baselines/reference/privateNameDeclarationMerging.js index 0927854a50f29..a55b1a7336dd8 100644 --- a/tests/baselines/reference/privateNameDeclarationMerging.js +++ b/tests/baselines/reference/privateNameDeclarationMerging.js @@ -16,11 +16,10 @@ interface C { //// [privateNameDeclarationMerging.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_x; class D { diff --git a/tests/baselines/reference/privateNameField.js b/tests/baselines/reference/privateNameField.js index 96a11b48cdb7b..b070508ba3557 100644 --- a/tests/baselines/reference/privateNameField.js +++ b/tests/baselines/reference/privateNameField.js @@ -9,12 +9,11 @@ class A { //// [privateNameField.js] "use strict"; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _A_name; class A { diff --git a/tests/baselines/reference/privateNameFieldAccess.js b/tests/baselines/reference/privateNameFieldAccess.js index 1c8d1920c6de1..bb50afdef80e9 100644 --- a/tests/baselines/reference/privateNameFieldAccess.js +++ b/tests/baselines/reference/privateNameFieldAccess.js @@ -8,11 +8,10 @@ class A { //// [privateNameFieldAccess.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_myField; class A { diff --git a/tests/baselines/reference/privateNameFieldAssignment.js b/tests/baselines/reference/privateNameFieldAssignment.js index 717d782cd3e48..e264a767fc821 100644 --- a/tests/baselines/reference/privateNameFieldAssignment.js +++ b/tests/baselines/reference/privateNameFieldAssignment.js @@ -36,18 +36,16 @@ class A { //// [privateNameFieldAssignment.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_field; class A { diff --git a/tests/baselines/reference/privateNameFieldCallExpression.js b/tests/baselines/reference/privateNameFieldCallExpression.js index 47026bcc59e59..956b43152a0d9 100644 --- a/tests/baselines/reference/privateNameFieldCallExpression.js +++ b/tests/baselines/reference/privateNameFieldCallExpression.js @@ -21,11 +21,10 @@ class A { //// [privateNameFieldCallExpression.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_fieldFunc, _A_fieldFunc2; class A { diff --git a/tests/baselines/reference/privateNameFieldDerivedClasses.js b/tests/baselines/reference/privateNameFieldDerivedClasses.js index 8241accdcb85d..5b7d8adb9287b 100644 --- a/tests/baselines/reference/privateNameFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameFieldDerivedClasses.js @@ -14,11 +14,10 @@ class Derived extends Base { //// [privateNameFieldDerivedClasses.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_prop; class Base { diff --git a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js index 618ab2c02897b..d7ae4ace24f10 100644 --- a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js @@ -25,12 +25,11 @@ class A { //// [privateNameFieldDestructuredBinding.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _A_field; class A { diff --git a/tests/baselines/reference/privateNameFieldUnaryMutation.js b/tests/baselines/reference/privateNameFieldUnaryMutation.js index 43e87ce7e6ac0..0ea369296adac 100644 --- a/tests/baselines/reference/privateNameFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameFieldUnaryMutation.js @@ -30,18 +30,16 @@ class C { //// [privateNameFieldUnaryMutation.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_test; class C { diff --git a/tests/baselines/reference/privateNameInLhsReceiverExpression.js b/tests/baselines/reference/privateNameInLhsReceiverExpression.js index 9a12ec666de0c..f335acb32c029 100644 --- a/tests/baselines/reference/privateNameInLhsReceiverExpression.js +++ b/tests/baselines/reference/privateNameInLhsReceiverExpression.js @@ -10,18 +10,16 @@ class Test { //// [privateNameInLhsReceiverExpression.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Test_y; class Test { diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js index 204ea377e1590..5f2ec20469a81 100644 --- a/tests/baselines/reference/privateNameMethod.js +++ b/tests/baselines/reference/privateNameMethod.js @@ -14,19 +14,18 @@ class A1 { //// [privateNameMethod.js] "use strict"; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A1_instances, _A1_method; class A1 { constructor(name) { _A1_instances.add(this); - __classPrivateMethodGet(this, _A1_instances, _A1_method).call(this, ""); - __classPrivateMethodGet(this, _A1_instances, _A1_method).call(this, 1); // Error - __classPrivateMethodGet(this, _A1_instances, _A1_method).call(// Error + __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(this, ""); + __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(this, 1); // Error + __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(// Error this); // Error } } diff --git a/tests/baselines/reference/privateNameMethodAccess.js b/tests/baselines/reference/privateNameMethodAccess.js index 7d07b2275238e..de9680a242698 100644 --- a/tests/baselines/reference/privateNameMethodAccess.js +++ b/tests/baselines/reference/privateNameMethodAccess.js @@ -24,21 +24,20 @@ class B2 { //// [privateNameMethodAccess.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A2_instances, _A2_method, _a; class A2 { constructor() { _A2_instances.add(this); - console.log(__classPrivateMethodGet(this, _A2_instances, _A2_method)); + console.log(__classPrivateFieldGet(this, _A2_instances, "m", _A2_method)); let a = this; - __classPrivateMethodGet(a, _A2_instances, _A2_method).call(a); + __classPrivateFieldGet(a, _A2_instances, "m", _A2_method).call(a); function foo() { - __classPrivateMethodGet(a, _A2_instances, _A2_method).call(a); + __classPrivateFieldGet(a, _A2_instances, "m", _A2_method).call(a); } } } diff --git a/tests/baselines/reference/privateNameMethodAssignment.js b/tests/baselines/reference/privateNameMethodAssignment.js index 3e1041bad4e47..47eff0877d838 100644 --- a/tests/baselines/reference/privateNameMethodAssignment.js +++ b/tests/baselines/reference/privateNameMethodAssignment.js @@ -13,28 +13,30 @@ class A3 { //// [privateNameMethodAssignment.js] -var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { - throw new TypeError("private element is not writable"); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A3_instances, _A3_method; class A3 { constructor(a, b) { var _a, _b; _A3_instances.add(this); - __classPrivateReadonly(this, () => { }); // Error, not writable - __classPrivateReadonly(// Error, not writable - a, () => { }); // Error, not writable - __classPrivateReadonly(// Error, not writable - b, () => { }); //Error, not writable - (_a = this, { x: ({ set value(_b) { __classPrivateReadonly(_a, _b); } }).value } = { x: () => { } }); //Error, not writable - let x = __classPrivateMethodGet(this, _A3_instances, _A3_method); - __classPrivateReadonly(_b = b, +__classPrivateMethodGet(_b, _A3_instances, _A3_method) + 1); //Error, not writable + __classPrivateFieldSet(this, _A3_instances, () => { }, "m"); // Error, not writable + __classPrivateFieldSet(// Error, not writable + a, _A3_instances, () => { }, "m"); // Error, not writable + __classPrivateFieldSet(// Error, not writable + b, _A3_instances, () => { }, "m"); //Error, not writable + (_a = this, { x: ({ set value(_b) { __classPrivateFieldSet(_a, _A3_instances, _b, "m"); } }).value } = { x: () => { } }); //Error, not writable + let x = __classPrivateFieldGet(this, _A3_instances, "m", _A3_method); + __classPrivateFieldSet(_b = b, _A3_instances, +__classPrivateFieldGet(_b, _A3_instances, "m", _A3_method) + 1, "m"); //Error, not writable } ; } diff --git a/tests/baselines/reference/privateNameMethodAsync.js b/tests/baselines/reference/privateNameMethodAsync.js index 1e9924c5e35d0..71c5cef304ef1 100644 --- a/tests/baselines/reference/privateNameMethodAsync.js +++ b/tests/baselines/reference/privateNameMethodAsync.js @@ -15,11 +15,10 @@ new C().foo().then(console.log); //// [privateNameMethodAsync.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_instances, _C_bar, _C_baz, _C_qux, _a; const C = (_a = class { @@ -27,8 +26,8 @@ const C = (_a = class { _C_instances.add(this); } async foo() { - const b = await __classPrivateMethodGet(this, _C_instances, _C_bar).call(this); - return b + (__classPrivateMethodGet(this, _C_instances, _C_baz).call(this).next().value || 0) + ((await __classPrivateMethodGet(this, _C_instances, _C_qux).call(this).next()).value || 0); + const b = await __classPrivateFieldGet(this, _C_instances, "m", _C_bar).call(this); + return b + (__classPrivateFieldGet(this, _C_instances, "m", _C_baz).call(this).next().value || 0) + ((await __classPrivateFieldGet(this, _C_instances, "m", _C_qux).call(this).next()).value || 0); } }, _C_instances = new WeakSet(), diff --git a/tests/baselines/reference/privateNameMethodCallExpression.js b/tests/baselines/reference/privateNameMethodCallExpression.js index 7d1ac5e672104..caa5c421fc548 100644 --- a/tests/baselines/reference/privateNameMethodCallExpression.js +++ b/tests/baselines/reference/privateNameMethodCallExpression.js @@ -25,11 +25,10 @@ class AA { //// [privateNameMethodCallExpression.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _AA_instances, _AA_method, _AA_method2; class AA { @@ -41,18 +40,18 @@ class AA { ; test() { var _a, _b, _c; - __classPrivateMethodGet(this, _AA_instances, _AA_method).call(this); - const func = __classPrivateMethodGet(this, _AA_instances, _AA_method); + __classPrivateFieldGet(this, _AA_instances, "m", _AA_method).call(this); + const func = __classPrivateFieldGet(this, _AA_instances, "m", _AA_method); func(); - new (__classPrivateMethodGet(this, _AA_instances, _AA_method))(); + new (__classPrivateFieldGet(this, _AA_instances, "m", _AA_method))(); const arr = [1, 2]; - __classPrivateMethodGet(this, _AA_instances, _AA_method2).call(this, 0, ...arr, 3); - const b = new (__classPrivateMethodGet(this, _AA_instances, _AA_method2))(0, ...arr, 3); //Error - const str = __classPrivateMethodGet(this, _AA_instances, _AA_method2).bind(this) `head${1}middle${2}tail`; - __classPrivateMethodGet((_a = this.getInstance()), _AA_instances, _AA_method2).bind(_a) `test${1}and${2}`; - __classPrivateMethodGet((_b = this.getInstance()), _AA_instances, _AA_method2).call(_b, 0, ...arr, 3); - const b2 = new (__classPrivateMethodGet(this.getInstance(), _AA_instances, _AA_method2))(0, ...arr, 3); //Error - const str2 = __classPrivateMethodGet((_c = this.getInstance()), _AA_instances, _AA_method2).bind(_c) `head${1}middle${2}tail`; + __classPrivateFieldGet(this, _AA_instances, "m", _AA_method2).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _AA_instances, "m", _AA_method2))(0, ...arr, 3); //Error + const str = __classPrivateFieldGet(this, _AA_instances, "m", _AA_method2).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_a = this.getInstance()), _AA_instances, "m", _AA_method2).bind(_a) `test${1}and${2}`; + __classPrivateFieldGet((_b = this.getInstance()), _AA_instances, "m", _AA_method2).call(_b, 0, ...arr, 3); + const b2 = new (__classPrivateFieldGet(this.getInstance(), _AA_instances, "m", _AA_method2))(0, ...arr, 3); //Error + const str2 = __classPrivateFieldGet((_c = this.getInstance()), _AA_instances, "m", _AA_method2).bind(_c) `head${1}middle${2}tail`; } getInstance() { return new AA(); } } diff --git a/tests/baselines/reference/privateNameMethodClassExpression.js b/tests/baselines/reference/privateNameMethodClassExpression.js index af2caf339cef9..08bee9225835e 100644 --- a/tests/baselines/reference/privateNameMethodClassExpression.js +++ b/tests/baselines/reference/privateNameMethodClassExpression.js @@ -13,23 +13,16 @@ C.getInstance().#field; // Error //// [privateNameMethodClassExpression.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_instances, _C_field, _C_method, _a; const C = (_a = class { constructor() { _C_instances.add(this); - _C_field.set(this, __classPrivateMethodGet(this, _C_instances, _C_method).call(this)); + _C_field.set(this, __classPrivateFieldGet(this, _C_instances, "m", _C_method).call(this)); } static getInstance() { return new C(); } getField() { return __classPrivateFieldGet(this, _C_field); } diff --git a/tests/baselines/reference/privateNameMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js index 0b330e3ed2109..199c1c17e0114 100644 --- a/tests/baselines/reference/privateNameMethodInStaticFieldInit.js +++ b/tests/baselines/reference/privateNameMethodInStaticFieldInit.js @@ -8,11 +8,10 @@ console.log(C.s); //// [privateNameMethodInStaticFieldInit.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_instances, _C_method, _a; class C { @@ -21,5 +20,5 @@ class C { } } _C_instances = new WeakSet(), _C_method = function _C_method() { return 42; }; -C.s = __classPrivateMethodGet((_a = new C()), _C_instances, _C_method).call(_a); +C.s = __classPrivateFieldGet((_a = new C()), _C_instances, "m", _C_method).call(_a); console.log(C.s); diff --git a/tests/baselines/reference/privateNameMethodsDerivedClasses.js b/tests/baselines/reference/privateNameMethodsDerivedClasses.js index 509e385aec786..b6b4027e749b1 100644 --- a/tests/baselines/reference/privateNameMethodsDerivedClasses.js +++ b/tests/baselines/reference/privateNameMethodsDerivedClasses.js @@ -13,11 +13,10 @@ class Derived extends Base { //// [privateNameMethodsDerivedClasses.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_instances, _Base_prop; class Base { @@ -25,7 +24,7 @@ class Base { _Base_instances.add(this); } static method(x) { - console.log(__classPrivateMethodGet(x, _Base_instances, _Base_prop).call(x)); + console.log(__classPrivateFieldGet(x, _Base_instances, "m", _Base_prop).call(x)); } } _Base_instances = new WeakSet(), _Base_prop = function _Base_prop() { return 123; }; diff --git a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js index c41b08adf1506..05e47e8bc5337 100644 --- a/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassAccessorsShadowing.js @@ -16,11 +16,10 @@ class Base { //// [privateNameNestedClassAccessorsShadowing.js] -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_instances, _Base_x_get; class Base { @@ -33,10 +32,10 @@ class Base { } ; testBase(x) { - console.log(__classPrivateAccessorGet(x, _Derived_instances, _Derived_x_get)); + console.log(__classPrivateFieldGet(x, _Derived_instances, "a", _Derived_x_get)); } testDerived(x) { - console.log(__classPrivateAccessorGet(x, _Derived_instances, _Derived_x_get)); + console.log(__classPrivateFieldGet(x, _Derived_instances, "a", _Derived_x_get)); } } _Derived_instances = new WeakSet(), _Derived_x_get = function _Derived_x_get() { return 1; }; diff --git a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js index f55944d9e53aa..598acfb16a403 100644 --- a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js @@ -16,11 +16,10 @@ class Base { //// [privateNameNestedClassFieldShadowing.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_x; class Base { diff --git a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js index da45fba97e18d..df19ceac68b07 100644 --- a/tests/baselines/reference/privateNameNestedClassMethodShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassMethodShadowing.js @@ -16,11 +16,10 @@ class Base { //// [privateNameNestedClassMethodShadowing.js] -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Base_instances, _Base_x; class Base { @@ -33,10 +32,10 @@ class Base { } ; testBase(x) { - console.log(__classPrivateMethodGet(x, _Derived_instances, _Derived_x)); + console.log(__classPrivateFieldGet(x, _Derived_instances, "m", _Derived_x)); } testDerived(x) { - console.log(__classPrivateMethodGet(x, _Derived_instances, _Derived_x)); + console.log(__classPrivateFieldGet(x, _Derived_instances, "m", _Derived_x)); } } _Derived_instances = new WeakSet(), _Derived_x = function _Derived_x() { }; diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.js b/tests/baselines/reference/privateNameNestedMethodAccess.js index a870c205da41f..e80fc49be6e90 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.js +++ b/tests/baselines/reference/privateNameNestedMethodAccess.js @@ -25,23 +25,10 @@ class C { //// [privateNameNestedMethodAccess.js] -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_instances, _C_foo, _C_bar, _C_baz_get; class C { @@ -55,13 +42,13 @@ class C { constructor() { _D_instances.add(this); __classPrivateFieldGet(new C(), _C_foo); - __classPrivateMethodGet(new C(), _D_instances, _D_bar); // Error - __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); - __classPrivateMethodGet(new D(), _D_instances, _D_bar); + __classPrivateFieldGet(new C(), _D_instances, "m", _D_bar); // Error + __classPrivateFieldGet(new C(), _C_instances, "a", _C_baz_get); + __classPrivateFieldGet(new D(), _D_instances, "m", _D_bar); } n(x) { __classPrivateFieldGet(x, _C_foo); - __classPrivateMethodGet(x, _D_instances, _D_bar); + __classPrivateFieldGet(x, _D_instances, "m", _D_bar); x.; // Error } }, @@ -70,4 +57,4 @@ class C { _a; } } -_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_bar = function _C_bar() { __classPrivateAccessorGet(new C(), _C_instances, _C_baz_get); }, _C_baz_get = function _C_baz_get() { return 42; }; +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_bar = function _C_bar() { __classPrivateFieldGet(new C(), _C_instances, "a", _C_baz_get); }, _C_baz_get = function _C_baz_get() { return 42; }; diff --git a/tests/baselines/reference/privateNameReadonly.js b/tests/baselines/reference/privateNameReadonly.js index b87dd98372218..30c7378c25f8c 100644 --- a/tests/baselines/reference/privateNameReadonly.js +++ b/tests/baselines/reference/privateNameReadonly.js @@ -10,8 +10,11 @@ console.log(new C().foo()); //// [privateNameReadonly.js] -var __classPrivateReadonly = (this && this.__classPrivateReadonly) || function () { - throw new TypeError("private element is not writable"); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_instances, _C_bar, _a; const C = (_a = class { @@ -19,7 +22,7 @@ const C = (_a = class { _C_instances.add(this); } foo() { - __classPrivateReadonly(this, console.log("should log this then throw")); + __classPrivateFieldSet(this, _C_instances, console.log("should log this then throw"), "m"); } }, _C_instances = new WeakSet(), diff --git a/tests/baselines/reference/privateNameSetterExprReturnValue.js b/tests/baselines/reference/privateNameSetterExprReturnValue.js index f4ef50f2d28d2..2f4af65aff2ff 100644 --- a/tests/baselines/reference/privateNameSetterExprReturnValue.js +++ b/tests/baselines/reference/privateNameSetterExprReturnValue.js @@ -11,12 +11,11 @@ new C().bar(); //// [privateNameSetterExprReturnValue.js] -var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to set private accessor on non-instance"); - } - fn.call(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_instances, _C_foo_set; class C { @@ -24,7 +23,7 @@ class C { _C_instances.add(this); } bar() { - let x = (__classPrivateAccessorSet(this, _C_instances, _C_foo_set, 42 * 2)); + let x = (__classPrivateFieldSet(this, _C_instances, 42 * 2, "a", _C_foo_set)); console.log(x); // 84 } } diff --git a/tests/baselines/reference/privateNameSetterNoGetter.js b/tests/baselines/reference/privateNameSetterNoGetter.js index 3a4c9e97ea619..c3408a5dc8fd0 100644 --- a/tests/baselines/reference/privateNameSetterNoGetter.js +++ b/tests/baselines/reference/privateNameSetterNoGetter.js @@ -10,15 +10,16 @@ console.log(new C().m()); //// [privateNameSetterNoGetter.js] -var __classPrivateWriteonly = (this && this.__classPrivateWriteonly) || function () { - throw new TypeError("private setter was defined without a getter"); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; -var __classPrivateAccessorSet = (this && this.__classPrivateAccessorSet) || function (receiver, instances, fn, value) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to set private accessor on non-instance"); - } - fn.call(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_instances, _C_x_set, _a; const C = (_a = class { @@ -26,7 +27,7 @@ const C = (_a = class { _C_instances.add(this); } m() { - __classPrivateAccessorSet(this, _C_instances, _C_x_set, __classPrivateWriteonly(this) + 2); // Error + __classPrivateFieldSet(this, _C_instances, __classPrivateFieldGet(this, _C_instances, "a") + 2, "a", _C_x_set); // Error } }, _C_instances = new WeakSet(), diff --git a/tests/baselines/reference/privateNameStaticAccessors.js b/tests/baselines/reference/privateNameStaticAccessors.js index 5b241a3087f8c..8859c2ca2b736 100644 --- a/tests/baselines/reference/privateNameStaticAccessors.js +++ b/tests/baselines/reference/privateNameStaticAccessors.js @@ -16,29 +16,24 @@ class A1 { //// [privateNameStaticAccessors.js] "use strict"; -var __classStaticPrivateAccessorSet = (this && this.__classStaticPrivateAccessorSet) || function (receiver, classConstructor, fn, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - fn.call(receiver, value); - return value; -}; -var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { - throw new TypeError("Private static element is not writable"); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A1_prop_get, _A1_prop_set, _A1_roProp_get; class A1 { constructor(name) { - __classStaticPrivateAccessorSet(A1, _a, _A1_prop_set, ""); - __classStaticPrivateReadonly(A1, ""); // Error - console.log(__classStaticPrivateAccessorGet(A1, _a, _A1_prop_get)); - console.log(__classStaticPrivateAccessorGet(A1, _a, _A1_roProp_get)); + __classPrivateFieldSet(A1, _a, "", "a", _A1_prop_set); + __classPrivateFieldSet(A1, _a, "", "a"); // Error + console.log(__classPrivateFieldGet(A1, _a, "a", _A1_prop_get)); + console.log(__classPrivateFieldGet(A1, _a, "a", _A1_roProp_get)); } } _a = A1, _A1_prop_get = function _A1_prop_get() { return ""; }, _A1_prop_set = function _A1_prop_set(param) { }, _A1_roProp_get = function _A1_roProp_get() { return ""; }; diff --git a/tests/baselines/reference/privateNameStaticAccessorsAccess.js b/tests/baselines/reference/privateNameStaticAccessorsAccess.js index 5eb1d38a85363..f79688892ec10 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsAccess.js +++ b/tests/baselines/reference/privateNameStaticAccessorsAccess.js @@ -28,20 +28,19 @@ class B2 { //// [privateNameStaticAccessorsAccess.js] -var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A2_prop_get, _A2_prop_set; class A2 { constructor() { - console.log(__classStaticPrivateAccessorGet(A2, _a, _A2_prop_get)); + console.log(__classPrivateFieldGet(A2, _a, "a", _A2_prop_get)); let a = A2; - __classStaticPrivateAccessorGet(a, _a, _A2_prop_get); + __classPrivateFieldGet(a, _a, "a", _A2_prop_get); function foo() { - __classStaticPrivateAccessorGet(a, _a, _A2_prop_get); + __classPrivateFieldGet(a, _a, "a", _A2_prop_get); } } } diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js index 9a4e3dba5248d..13a9847b775d4 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js @@ -19,37 +19,32 @@ class A { } //// [privateNameStaticAccessorsCallExpression.js] -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_fieldFunc_get, _A_fieldFunc2_get, _A_x; class A { static test() { var _b; - __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get).call(this); - const func = __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get); + __classPrivateFieldGet(this, _a, "a", _A_fieldFunc_get).call(this); + const func = __classPrivateFieldGet(this, _a, "a", _A_fieldFunc_get); func(); - new (__classStaticPrivateAccessorGet(this, _a, _A_fieldFunc_get))(); + new (__classPrivateFieldGet(this, _a, "a", _A_fieldFunc_get))(); const arr = [1, 2]; - __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get).call(this, 0, ...arr, 3); - const b = new (__classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get))(0, ...arr, 3); - const str = __classStaticPrivateAccessorGet(this, _a, _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; - __classStaticPrivateAccessorGet((_b = this.getClass()), _a, _A_fieldFunc2_get).bind(_b) `test${1}and${2}`; + __classPrivateFieldGet(this, _a, "a", _A_fieldFunc2_get).call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _a, "a", _A_fieldFunc2_get))(0, ...arr, 3); + const str = __classPrivateFieldGet(this, _a, "a", _A_fieldFunc2_get).bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_b = this.getClass()), _a, "a", _A_fieldFunc2_get).bind(_b) `test${1}and${2}`; } static getClass() { return A; } } -_a = A, _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classStaticPrivateFieldSet(A, _a, _A_x, 10); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; +_a = A, _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classPrivateFieldSet(A, _a, 10, void 0, _A_x); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; _A_x = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js index db9ef90b6ccb0..dfcbb352150bf 100644 --- a/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticAccessorssDerivedClasses.js @@ -13,16 +13,15 @@ class Derived extends Base { //// [privateNameStaticAccessorssDerivedClasses.js] -var __classStaticPrivateAccessorGet = (this && this.__classStaticPrivateAccessorGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _Base_prop_get; class Base { static method(x) { - console.log(__classStaticPrivateAccessorGet(x, _a, _Base_prop_get)); + console.log(__classPrivateFieldGet(x, _a, "a", _Base_prop_get)); } } _a = Base, _Base_prop_get = function _Base_prop_get() { return 123; }; diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.js b/tests/baselines/reference/privateNameStaticFieldAccess.js index 3033f7ea26adc..7c9accb92a4e9 100644 --- a/tests/baselines/reference/privateNameStaticFieldAccess.js +++ b/tests/baselines/reference/privateNameStaticFieldAccess.js @@ -9,20 +9,16 @@ class A { //// [privateNameStaticFieldAccess.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_myField; class A { constructor() { - console.log(__classStaticPrivateFieldGet(A, _a, _A_myField)); //Ok - console.log(__classStaticPrivateFieldGet(this, _a, _A_myField)); //Error + console.log(__classPrivateFieldGet(A, _a, void 0, _A_myField)); //Ok + console.log(__classPrivateFieldGet(this, _a, void 0, _A_myField)); //Error } } _a = A; diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.js b/tests/baselines/reference/privateNameStaticFieldAssignment.js index 0c08b004ff55c..5561dc1ce8492 100644 --- a/tests/baselines/reference/privateNameStaticFieldAssignment.js +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.js @@ -36,55 +36,47 @@ class A { //// [privateNameStaticFieldAssignment.js] -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_field; class A { constructor() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; - __classStaticPrivateFieldSet(A, _a, _A_field, 1); - __classStaticPrivateFieldSet(_b = A, _a, _A_field, __classStaticPrivateFieldGet(_b, _a, _A_field) + 2); - __classStaticPrivateFieldSet(_c = A, _a, _A_field, __classStaticPrivateFieldGet(_c, _a, _A_field) - 3); - __classStaticPrivateFieldSet(_d = A, _a, _A_field, __classStaticPrivateFieldGet(_d, _a, _A_field) / 4); - __classStaticPrivateFieldSet(_e = A, _a, _A_field, __classStaticPrivateFieldGet(_e, _a, _A_field) * 5); - __classStaticPrivateFieldSet(_f = A, _a, _A_field, Math.pow(__classStaticPrivateFieldGet(_f, _a, _A_field), 6)); - __classStaticPrivateFieldSet(_g = A, _a, _A_field, __classStaticPrivateFieldGet(_g, _a, _A_field) % 7); - __classStaticPrivateFieldSet(_h = A, _a, _A_field, __classStaticPrivateFieldGet(_h, _a, _A_field) << 8); - __classStaticPrivateFieldSet(_j = A, _a, _A_field, __classStaticPrivateFieldGet(_j, _a, _A_field) >> 9); - __classStaticPrivateFieldSet(_k = A, _a, _A_field, __classStaticPrivateFieldGet(_k, _a, _A_field) >>> 10); - __classStaticPrivateFieldSet(_l = A, _a, _A_field, __classStaticPrivateFieldGet(_l, _a, _A_field) & 11); - __classStaticPrivateFieldSet(_m = A, _a, _A_field, __classStaticPrivateFieldGet(_m, _a, _A_field) | 12); - __classStaticPrivateFieldSet(_o = A, _a, _A_field, __classStaticPrivateFieldGet(_o, _a, _A_field) ^ 13); - __classStaticPrivateFieldSet(A.getClass(), _a, _A_field, 1); - __classStaticPrivateFieldSet(_p = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_p, _a, _A_field) + 2); - __classStaticPrivateFieldSet(_q = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_q, _a, _A_field) - 3); - __classStaticPrivateFieldSet(_r = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_r, _a, _A_field) / 4); - __classStaticPrivateFieldSet(_s = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_s, _a, _A_field) * 5); - __classStaticPrivateFieldSet(_t = A.getClass(), _a, _A_field, Math.pow(__classStaticPrivateFieldGet(_t, _a, _A_field), 6)); - __classStaticPrivateFieldSet(_u = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_u, _a, _A_field) % 7); - __classStaticPrivateFieldSet(_v = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_v, _a, _A_field) << 8); - __classStaticPrivateFieldSet(_w = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_w, _a, _A_field) >> 9); - __classStaticPrivateFieldSet(_x = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_x, _a, _A_field) >>> 10); - __classStaticPrivateFieldSet(_y = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_y, _a, _A_field) & 11); - __classStaticPrivateFieldSet(_z = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_z, _a, _A_field) | 12); - __classStaticPrivateFieldSet(_0 = A.getClass(), _a, _A_field, __classStaticPrivateFieldGet(_0, _a, _A_field) ^ 13); + __classPrivateFieldSet(A, _a, 1, void 0, _A_field); + __classPrivateFieldSet(_b = A, _a, __classPrivateFieldGet(_b, _a, void 0, _A_field) + 2, void 0, _A_field); + __classPrivateFieldSet(_c = A, _a, __classPrivateFieldGet(_c, _a, void 0, _A_field) - 3, void 0, _A_field); + __classPrivateFieldSet(_d = A, _a, __classPrivateFieldGet(_d, _a, void 0, _A_field) / 4, void 0, _A_field); + __classPrivateFieldSet(_e = A, _a, __classPrivateFieldGet(_e, _a, void 0, _A_field) * 5, void 0, _A_field); + __classPrivateFieldSet(_f = A, _a, Math.pow(__classPrivateFieldGet(_f, _a, void 0, _A_field), 6), void 0, _A_field); + __classPrivateFieldSet(_g = A, _a, __classPrivateFieldGet(_g, _a, void 0, _A_field) % 7, void 0, _A_field); + __classPrivateFieldSet(_h = A, _a, __classPrivateFieldGet(_h, _a, void 0, _A_field) << 8, void 0, _A_field); + __classPrivateFieldSet(_j = A, _a, __classPrivateFieldGet(_j, _a, void 0, _A_field) >> 9, void 0, _A_field); + __classPrivateFieldSet(_k = A, _a, __classPrivateFieldGet(_k, _a, void 0, _A_field) >>> 10, void 0, _A_field); + __classPrivateFieldSet(_l = A, _a, __classPrivateFieldGet(_l, _a, void 0, _A_field) & 11, void 0, _A_field); + __classPrivateFieldSet(_m = A, _a, __classPrivateFieldGet(_m, _a, void 0, _A_field) | 12, void 0, _A_field); + __classPrivateFieldSet(_o = A, _a, __classPrivateFieldGet(_o, _a, void 0, _A_field) ^ 13, void 0, _A_field); + __classPrivateFieldSet(A.getClass(), _a, 1, void 0, _A_field); + __classPrivateFieldSet(_p = A.getClass(), _a, __classPrivateFieldGet(_p, _a, void 0, _A_field) + 2, void 0, _A_field); + __classPrivateFieldSet(_q = A.getClass(), _a, __classPrivateFieldGet(_q, _a, void 0, _A_field) - 3, void 0, _A_field); + __classPrivateFieldSet(_r = A.getClass(), _a, __classPrivateFieldGet(_r, _a, void 0, _A_field) / 4, void 0, _A_field); + __classPrivateFieldSet(_s = A.getClass(), _a, __classPrivateFieldGet(_s, _a, void 0, _A_field) * 5, void 0, _A_field); + __classPrivateFieldSet(_t = A.getClass(), _a, Math.pow(__classPrivateFieldGet(_t, _a, void 0, _A_field), 6), void 0, _A_field); + __classPrivateFieldSet(_u = A.getClass(), _a, __classPrivateFieldGet(_u, _a, void 0, _A_field) % 7, void 0, _A_field); + __classPrivateFieldSet(_v = A.getClass(), _a, __classPrivateFieldGet(_v, _a, void 0, _A_field) << 8, void 0, _A_field); + __classPrivateFieldSet(_w = A.getClass(), _a, __classPrivateFieldGet(_w, _a, void 0, _A_field) >> 9, void 0, _A_field); + __classPrivateFieldSet(_x = A.getClass(), _a, __classPrivateFieldGet(_x, _a, void 0, _A_field) >>> 10, void 0, _A_field); + __classPrivateFieldSet(_y = A.getClass(), _a, __classPrivateFieldGet(_y, _a, void 0, _A_field) & 11, void 0, _A_field); + __classPrivateFieldSet(_z = A.getClass(), _a, __classPrivateFieldGet(_z, _a, void 0, _A_field) | 12, void 0, _A_field); + __classPrivateFieldSet(_0 = A.getClass(), _a, __classPrivateFieldGet(_0, _a, void 0, _A_field) ^ 13, void 0, _A_field); } static getClass() { return A; diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.js b/tests/baselines/reference/privateNameStaticFieldCallExpression.js index 5fd8143449ed8..ca6f4817de647 100644 --- a/tests/baselines/reference/privateNameStaticFieldCallExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.js @@ -21,14 +21,10 @@ class A { //// [privateNameStaticFieldCallExpression.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_fieldFunc, _A_fieldFunc2; class A { @@ -38,16 +34,16 @@ class A { test() { var _b; var _c; - __classStaticPrivateFieldGet(A, _a, _A_fieldFunc).call(A); - (_b = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc)) === null || _b === void 0 ? void 0 : _b.call(A); - const func = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc); + __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc).call(A); + (_b = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc)) === null || _b === void 0 ? void 0 : _b.call(A); + const func = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc); func(); - new (__classStaticPrivateFieldGet(A, _a, _A_fieldFunc))(); + new (__classPrivateFieldGet(A, _a, void 0, _A_fieldFunc))(); const arr = [1, 2]; - __classStaticPrivateFieldGet(A, _a, _A_fieldFunc2).call(A, 0, ...arr, 3); - const b = new (__classStaticPrivateFieldGet(A, _a, _A_fieldFunc2))(0, ...arr, 3); - const str = __classStaticPrivateFieldGet(A, _a, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; - __classStaticPrivateFieldGet((_c = this.getClass()), _a, _A_fieldFunc2).bind(_c) `test${1}and${2}`; + __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2).call(A, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2))(0, ...arr, 3); + const str = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; + __classPrivateFieldGet((_c = this.getClass()), _a, void 0, _A_fieldFunc2).bind(_c) `test${1}and${2}`; } getClass() { return A; } } diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.js b/tests/baselines/reference/privateNameStaticFieldClassExpression.js index 862a409022392..f7029035947ff 100644 --- a/tests/baselines/reference/privateNameStaticFieldClassExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.js @@ -23,21 +23,17 @@ class B { //// [privateNameStaticFieldClassExpression.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _B_foo, _B_foo2, _b, _c; class B { m() { - console.log(__classStaticPrivateFieldGet(B, _a, _B_foo).test); - __classStaticPrivateFieldGet(B, _a, _B_foo).test = 10; - new (__classStaticPrivateFieldGet(B, _a, _B_foo))().field; + console.log(__classPrivateFieldGet(B, _a, void 0, _B_foo).test); + __classPrivateFieldGet(B, _a, void 0, _B_foo).test = 10; + new (__classPrivateFieldGet(B, _a, void 0, _B_foo))().field; } } _a = B; @@ -45,7 +41,7 @@ _B_foo = { value: (_b = class { constructor() { this.field = 10; console.log("hello"); - new (__classStaticPrivateFieldGet(B, _a, _B_foo2))(); + new (__classPrivateFieldGet(B, _a, void 0, _B_foo2))(); } }, _b.test = 123, diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js index ab43235eacb93..69c22f9523292 100644 --- a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js @@ -17,38 +17,30 @@ class Derived extends Base { //// [privateNameStaticFieldDerivedClasses.js] -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _Base_prop, _b, _Derived_derivedProp; class Base { static method(x) { Derived.; // error - __classStaticPrivateFieldSet(// error - Base, _a, _Base_prop, 10); + __classPrivateFieldSet(// error + Base, _a, 10, void 0, _Base_prop); } } _a = Base; _Base_prop = { value: 123 }; class Derived extends Base { static method(x) { - __classStaticPrivateFieldGet(Derived, _b, _Derived_derivedProp); + __classPrivateFieldGet(Derived, _b, void 0, _Derived_derivedProp); Base. = 10; // error } } diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js index 74ca6c3a9d50d..d8295ab570489 100644 --- a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js @@ -25,15 +25,11 @@ class A { //// [privateNameStaticFieldDestructuredBinding.js] -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _b, _A_field; class A { @@ -41,13 +37,13 @@ class A { var _c; this.otherClass = A; let y; - ({ x: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, y } = this.testObject()); - ([({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, y] = this.testArray()); - ({ a: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, b: [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value] } = { a: 1, b: [2] }); - [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value, [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value]] = [1, [2]]; - ({ a: ({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 1, b: [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 1] } = { b: [] }); - [({ set value(_b) { __classStaticPrivateFieldSet(A, _b, _A_field, _b); } }).value = 2] = []; - _c = this.otherClass, [({ set value(_b) { __classStaticPrivateFieldSet(_c, _b, _A_field, _b); } }).value = 2] = []; + ({ x: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, y } = this.testObject()); + ([({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, y] = this.testArray()); + ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value] } = { a: 1, b: [2] }); + [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value]] = [1, [2]]; + ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 1, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 1] } = { b: [] }); + [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 2] = []; + _c = this.otherClass, [({ set value(_b) { __classPrivateFieldSet(_c, _b, _b, void 0, _A_field); } }).value = 2] = []; } testObject() { return { x: 10, y: 6 }; @@ -56,7 +52,7 @@ class A { return [10, 11]; } static test(_a) { - [({ set value(_c) { __classStaticPrivateFieldSet(_a, _b, _A_field, _c); } }).value] = [2]; + [({ set value(_c) { __classPrivateFieldSet(_a, _b, _c, void 0, _A_field); } }).value] = [2]; } } _b = A; diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js index 49634f15cb01c..da157d2d83a2b 100644 --- a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js @@ -30,52 +30,44 @@ class C { //// [privateNameStaticFieldUnaryMutation.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _a, _C_test; class C { constructor() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - __classStaticPrivateFieldSet(_b = C, _a, _C_test, +__classStaticPrivateFieldGet(_b, _a, _C_test) + 1); - __classStaticPrivateFieldSet(_c = C, _a, _C_test, +__classStaticPrivateFieldGet(_c, _a, _C_test) - 1); - __classStaticPrivateFieldSet(_d = C, _a, _C_test, +__classStaticPrivateFieldGet(_d, _a, _C_test) + 1); - __classStaticPrivateFieldSet(_e = C, _a, _C_test, +__classStaticPrivateFieldGet(_e, _a, _C_test) - 1); - const a = (__classStaticPrivateFieldSet(_f = C, _a, _C_test, (_g = +__classStaticPrivateFieldGet(_f, _a, _C_test)) + 1), _g); - const b = (__classStaticPrivateFieldSet(_h = C, _a, _C_test, (_j = +__classStaticPrivateFieldGet(_h, _a, _C_test)) - 1), _j); - const c = __classStaticPrivateFieldSet(_k = C, _a, _C_test, +__classStaticPrivateFieldGet(_k, _a, _C_test) + 1); - const d = __classStaticPrivateFieldSet(_l = C, _a, _C_test, +__classStaticPrivateFieldGet(_l, _a, _C_test) - 1); - for (__classStaticPrivateFieldSet(C, _a, _C_test, 0); __classStaticPrivateFieldGet(C, _a, _C_test) < 10; __classStaticPrivateFieldSet(_m = C, _a, _C_test, +__classStaticPrivateFieldGet(_m, _a, _C_test) + 1)) { } - for (__classStaticPrivateFieldSet(C, _a, _C_test, 0); __classStaticPrivateFieldGet(C, _a, _C_test) < 10; __classStaticPrivateFieldSet(_o = C, _a, _C_test, +__classStaticPrivateFieldGet(_o, _a, _C_test) + 1)) { } + __classPrivateFieldSet(_b = C, _a, +__classPrivateFieldGet(_b, _a, void 0, _C_test) + 1, void 0, _C_test); + __classPrivateFieldSet(_c = C, _a, +__classPrivateFieldGet(_c, _a, void 0, _C_test) - 1, void 0, _C_test); + __classPrivateFieldSet(_d = C, _a, +__classPrivateFieldGet(_d, _a, void 0, _C_test) + 1, void 0, _C_test); + __classPrivateFieldSet(_e = C, _a, +__classPrivateFieldGet(_e, _a, void 0, _C_test) - 1, void 0, _C_test); + const a = (__classPrivateFieldSet(_f = C, _a, (_g = +__classPrivateFieldGet(_f, _a, void 0, _C_test)) + 1, void 0, _C_test), _g); + const b = (__classPrivateFieldSet(_h = C, _a, (_j = +__classPrivateFieldGet(_h, _a, void 0, _C_test)) - 1, void 0, _C_test), _j); + const c = __classPrivateFieldSet(_k = C, _a, +__classPrivateFieldGet(_k, _a, void 0, _C_test) + 1, void 0, _C_test); + const d = __classPrivateFieldSet(_l = C, _a, +__classPrivateFieldGet(_l, _a, void 0, _C_test) - 1, void 0, _C_test); + for (__classPrivateFieldSet(C, _a, 0, void 0, _C_test); __classPrivateFieldGet(C, _a, void 0, _C_test) < 10; __classPrivateFieldSet(_m = C, _a, +__classPrivateFieldGet(_m, _a, void 0, _C_test) + 1, void 0, _C_test)) { } + for (__classPrivateFieldSet(C, _a, 0, void 0, _C_test); __classPrivateFieldGet(C, _a, void 0, _C_test) < 10; __classPrivateFieldSet(_o = C, _a, +__classPrivateFieldGet(_o, _a, void 0, _C_test) + 1, void 0, _C_test)) { } } test() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - __classStaticPrivateFieldSet(_b = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_b, _a, _C_test) + 1); - __classStaticPrivateFieldSet(_c = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_c, _a, _C_test) - 1); - __classStaticPrivateFieldSet(_d = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_d, _a, _C_test) + 1); - __classStaticPrivateFieldSet(_e = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_e, _a, _C_test) - 1); - const a = (__classStaticPrivateFieldSet(_f = this.getClass(), _a, _C_test, (_g = +__classStaticPrivateFieldGet(_f, _a, _C_test)) + 1), _g); - const b = (__classStaticPrivateFieldSet(_h = this.getClass(), _a, _C_test, (_j = +__classStaticPrivateFieldGet(_h, _a, _C_test)) - 1), _j); - const c = __classStaticPrivateFieldSet(_k = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_k, _a, _C_test) + 1); - const d = __classStaticPrivateFieldSet(_l = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_l, _a, _C_test) - 1); - for (__classStaticPrivateFieldSet(this.getClass(), _a, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), _a, _C_test) < 10; __classStaticPrivateFieldSet(_m = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_m, _a, _C_test) + 1)) { } - for (__classStaticPrivateFieldSet(this.getClass(), _a, _C_test, 0); __classStaticPrivateFieldGet(this.getClass(), _a, _C_test) < 10; __classStaticPrivateFieldSet(_o = this.getClass(), _a, _C_test, +__classStaticPrivateFieldGet(_o, _a, _C_test) + 1)) { } + __classPrivateFieldSet(_b = this.getClass(), _a, +__classPrivateFieldGet(_b, _a, void 0, _C_test) + 1, void 0, _C_test); + __classPrivateFieldSet(_c = this.getClass(), _a, +__classPrivateFieldGet(_c, _a, void 0, _C_test) - 1, void 0, _C_test); + __classPrivateFieldSet(_d = this.getClass(), _a, +__classPrivateFieldGet(_d, _a, void 0, _C_test) + 1, void 0, _C_test); + __classPrivateFieldSet(_e = this.getClass(), _a, +__classPrivateFieldGet(_e, _a, void 0, _C_test) - 1, void 0, _C_test); + const a = (__classPrivateFieldSet(_f = this.getClass(), _a, (_g = +__classPrivateFieldGet(_f, _a, void 0, _C_test)) + 1, void 0, _C_test), _g); + const b = (__classPrivateFieldSet(_h = this.getClass(), _a, (_j = +__classPrivateFieldGet(_h, _a, void 0, _C_test)) - 1, void 0, _C_test), _j); + const c = __classPrivateFieldSet(_k = this.getClass(), _a, +__classPrivateFieldGet(_k, _a, void 0, _C_test) + 1, void 0, _C_test); + const d = __classPrivateFieldSet(_l = this.getClass(), _a, +__classPrivateFieldGet(_l, _a, void 0, _C_test) - 1, void 0, _C_test); + for (__classPrivateFieldSet(this.getClass(), _a, 0, void 0, _C_test); __classPrivateFieldGet(this.getClass(), _a, void 0, _C_test) < 10; __classPrivateFieldSet(_m = this.getClass(), _a, +__classPrivateFieldGet(_m, _a, void 0, _C_test) + 1, void 0, _C_test)) { } + for (__classPrivateFieldSet(this.getClass(), _a, 0, void 0, _C_test); __classPrivateFieldGet(this.getClass(), _a, void 0, _C_test) < 10; __classPrivateFieldSet(_o = this.getClass(), _a, +__classPrivateFieldGet(_o, _a, void 0, _C_test) + 1, void 0, _C_test)) { } } getClass() { return C; } } diff --git a/tests/baselines/reference/privateNameStaticMethod.js b/tests/baselines/reference/privateNameStaticMethod.js index 14ef06a04e49f..38bc0e54b0b7a 100644 --- a/tests/baselines/reference/privateNameStaticMethod.js +++ b/tests/baselines/reference/privateNameStaticMethod.js @@ -14,18 +14,17 @@ class A1 { //// [privateNameStaticMethod.js] "use strict"; -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A1_method; class A1 { constructor() { - __classStaticPrivateMethodGet(A1, _a, _A1_method).call(A1, ""); - __classStaticPrivateMethodGet(A1, _a, _A1_method).call(A1, 1); // Error - __classStaticPrivateMethodGet(A1, _a, _A1_method).call(// Error + __classPrivateFieldGet(A1, _a, "m", _A1_method).call(A1, ""); + __classPrivateFieldGet(A1, _a, "m", _A1_method).call(A1, 1); // Error + __classPrivateFieldGet(A1, _a, "m", _A1_method).call(// Error A1); // Error } } diff --git a/tests/baselines/reference/privateNameStaticMethodAssignment.js b/tests/baselines/reference/privateNameStaticMethodAssignment.js index 73895eebc64d3..909f4ca65f717 100644 --- a/tests/baselines/reference/privateNameStaticMethodAssignment.js +++ b/tests/baselines/reference/privateNameStaticMethodAssignment.js @@ -13,27 +13,29 @@ class A3 { //// [privateNameStaticMethodAssignment.js] -var __classStaticPrivateReadonly = (this && this.__classStaticPrivateReadonly) || function () { - throw new TypeError("Private static element is not writable"); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A3_method; class A3 { constructor(a, b) { var _b; - __classStaticPrivateReadonly(A3, () => { }); // Error, not writable - __classStaticPrivateReadonly(// Error, not writable - a, () => { }); // Error, not writable - __classStaticPrivateReadonly(// Error, not writable - b, () => { }); //Error, not writable - ({ x: ({ set value(_b) { __classStaticPrivateReadonly(A3, _b); } }).value } = { x: () => { } }); //Error, not writable - let x = __classStaticPrivateMethodGet(A3, _a, _A3_method); - __classStaticPrivateReadonly(_b = b, +__classStaticPrivateMethodGet(_b, _a, _A3_method) + 1); //Error, not writable + __classPrivateFieldSet(A3, _a, () => { }, "m"); // Error, not writable + __classPrivateFieldSet(// Error, not writable + a, _a, () => { }, "m"); // Error, not writable + __classPrivateFieldSet(// Error, not writable + b, _a, () => { }, "m"); //Error, not writable + ({ x: ({ set value(_b) { __classPrivateFieldSet(A3, _a, _b, "m"); } }).value } = { x: () => { } }); //Error, not writable + let x = __classPrivateFieldGet(A3, _a, "m", _A3_method); + __classPrivateFieldSet(_b = b, _a, +__classPrivateFieldGet(_b, _a, "m", _A3_method) + 1, "m"); //Error, not writable } ; } diff --git a/tests/baselines/reference/privateNameStaticMethodAsync.js b/tests/baselines/reference/privateNameStaticMethodAsync.js index 5cb7c6fc8c2d9..541c1b18ad5f0 100644 --- a/tests/baselines/reference/privateNameStaticMethodAsync.js +++ b/tests/baselines/reference/privateNameStaticMethodAsync.js @@ -16,17 +16,16 @@ const C = class { //// [privateNameStaticMethodAsync.js] -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _C_bar, _C_baz, _C_qux, _C_bazBad; const C = (_a = class { static async foo() { - const b = await __classStaticPrivateMethodGet(this, _a, _C_bar).call(this); - return b + (__classStaticPrivateMethodGet(this, _a, _C_baz).call(this).next().value || 0) + ((await __classStaticPrivateMethodGet(this, _a, _C_qux).call(this).next()).value || 0); + const b = await __classPrivateFieldGet(this, _a, "m", _C_bar).call(this); + return b + (__classPrivateFieldGet(this, _a, "m", _C_baz).call(this).next().value || 0) + ((await __classPrivateFieldGet(this, _a, "m", _C_qux).call(this).next()).value || 0); } }, _C_bar = async function _C_bar() { return await Promise.resolve(42); }, diff --git a/tests/baselines/reference/privateNameStaticMethodCallExpression.js b/tests/baselines/reference/privateNameStaticMethodCallExpression.js index 18fc07816c07e..0495fc8873363 100644 --- a/tests/baselines/reference/privateNameStaticMethodCallExpression.js +++ b/tests/baselines/reference/privateNameStaticMethodCallExpression.js @@ -25,11 +25,10 @@ class AA { //// [privateNameStaticMethodCallExpression.js] -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _AA_method, _AA_method2; class AA { @@ -37,18 +36,18 @@ class AA { ; test() { var _b, _c, _d; - __classStaticPrivateMethodGet(AA, _a, _AA_method).call(AA); - const func = __classStaticPrivateMethodGet(AA, _a, _AA_method); + __classPrivateFieldGet(AA, _a, "m", _AA_method).call(AA); + const func = __classPrivateFieldGet(AA, _a, "m", _AA_method); func(); - new (__classStaticPrivateMethodGet(AA, _a, _AA_method))(); + new (__classPrivateFieldGet(AA, _a, "m", _AA_method))(); const arr = [1, 2]; - __classStaticPrivateMethodGet(AA, _a, _AA_method2).call(AA, 0, ...arr, 3); - const b = new (__classStaticPrivateMethodGet(AA, _a, _AA_method2))(0, ...arr, 3); //Error - const str = __classStaticPrivateMethodGet(AA, _a, _AA_method2).bind(AA) `head${1}middle${2}tail`; - __classStaticPrivateMethodGet((_b = AA.getClass()), _a, _AA_method2).bind(_b) `test${1}and${2}`; - __classStaticPrivateMethodGet((_c = AA.getClass()), _a, _AA_method2).call(_c, 0, ...arr, 3); - const b2 = new (__classStaticPrivateMethodGet(AA.getClass(), _a, _AA_method2))(0, ...arr, 3); //Error - const str2 = __classStaticPrivateMethodGet((_d = AA.getClass()), _a, _AA_method2).bind(_d) `head${1}middle${2}tail`; + __classPrivateFieldGet(AA, _a, "m", _AA_method2).call(AA, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(AA, _a, "m", _AA_method2))(0, ...arr, 3); //Error + const str = __classPrivateFieldGet(AA, _a, "m", _AA_method2).bind(AA) `head${1}middle${2}tail`; + __classPrivateFieldGet((_b = AA.getClass()), _a, "m", _AA_method2).bind(_b) `test${1}and${2}`; + __classPrivateFieldGet((_c = AA.getClass()), _a, "m", _AA_method2).call(_c, 0, ...arr, 3); + const b2 = new (__classPrivateFieldGet(AA.getClass(), _a, "m", _AA_method2))(0, ...arr, 3); //Error + const str2 = __classPrivateFieldGet((_d = AA.getClass()), _a, "m", _AA_method2).bind(_d) `head${1}middle${2}tail`; } static getClass() { return AA; } } diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.js b/tests/baselines/reference/privateNameStaticMethodClassExpression.js index 8b7e3859d885e..bd873a33fcdd4 100644 --- a/tests/baselines/reference/privateNameStaticMethodClassExpression.js +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.js @@ -13,29 +13,19 @@ C.getClass().#field; // Error //// [privateNameStaticMethodClassExpression.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; -}; -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _D_field, _D_method; const C = (_a = class D { static getClass() { return D; } - static getField() { return __classStaticPrivateFieldGet(C, _a, _D_field); } + static getField() { return __classPrivateFieldGet(C, _a, void 0, _D_field); } ; }, _D_method = function _D_method() { return 42; }, - _D_field = { value: __classStaticPrivateMethodGet(_a, _a, _D_method).call(_a) }, + _D_field = { value: __classPrivateFieldGet(_a, _a, "m", _D_method).call(_a) }, _a); console.log(C.getClass().getField()); C.getClass().; // Error diff --git a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js index 4e2160d101585..1d2e16d722089 100644 --- a/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js +++ b/tests/baselines/reference/privateNameStaticMethodInStaticFieldInit.js @@ -8,15 +8,14 @@ console.log(C.s); //// [privateNameStaticMethodInStaticFieldInit.js] -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _C_method; class C { } _a = C, _C_method = function _C_method() { return 42; }; -C.s = __classStaticPrivateMethodGet(C, _a, _C_method).call(C); +C.s = __classPrivateFieldGet(C, _a, "m", _C_method).call(C); console.log(C.s); diff --git a/tests/baselines/reference/privateNamesAndFields.js b/tests/baselines/reference/privateNamesAndFields.js index c2eb9e45e71ca..519a63909a276 100644 --- a/tests/baselines/reference/privateNamesAndFields.js +++ b/tests/baselines/reference/privateNamesAndFields.js @@ -17,12 +17,11 @@ class B extends A { //// [privateNamesAndFields.js] "use strict"; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _A_foo, _B_foo; class A { diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index ba3bb5e3942b1..66a4fdac2208c 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -29,24 +29,16 @@ b = a; // Error //// [privateNamesAndGenericClasses-2.js] "use strict"; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; -}; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C_instances, _C_foo, _C_bar; class C { @@ -54,7 +46,7 @@ class C { _C_instances.add(this); _C_foo.set(this, void 0); __classPrivateFieldSet(this, _C_foo, t); - t = __classPrivateMethodGet(this, _C_instances, _C_bar).call(this); + t = __classPrivateFieldGet(this, _C_instances, "m", _C_bar).call(this); } set baz(t) { __classPrivateFieldSet(this, _C_foo, t); diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index dcb14a8997386..f182735068847 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -24,31 +24,23 @@ const willErrorSomeDay: typeof A = class {}; // OK for now //// [privateNamesAndStaticFields.js] "use strict"; -var __classStaticPrivateFieldSet = (this && this.__classStaticPrivateFieldSet) || function (receiver, classConstructor, propertyDescriptor, value) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - propertyDescriptor.value = value; - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_foo, _A_bar, _b, _B_foo; class A { constructor() { - __classStaticPrivateFieldSet(A, _a, _A_foo, 3); - __classStaticPrivateFieldGet(B, _a, _A_foo); // Error - __classStaticPrivateFieldGet(B, _a, _A_bar); // Error + __classPrivateFieldSet(A, _a, 3, void 0, _A_foo); + __classPrivateFieldGet(B, _a, void 0, _A_foo); // Error + __classPrivateFieldGet(B, _a, void 0, _A_bar); // Error } } _a = A; @@ -57,7 +49,7 @@ _A_bar = { value: void 0 }; class B extends A { constructor() { super(); - __classStaticPrivateFieldSet(B, _b, _B_foo, "some string"); + __classPrivateFieldSet(B, _b, "some string", void 0, _B_foo); } } _b = B; diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index eb0dbd87e498d..958df88562dff 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -15,20 +15,10 @@ class Child extends Parent { //// [privateNamesConstructorChain-1.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { @@ -37,7 +27,7 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classStaticPrivateFieldGet(Child, _a, _Parent_bar); // Error: not found + __classPrivateFieldGet(Child, _a, void 0, _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index e54eba4f5c4ee..3970efe16f821 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -17,20 +17,10 @@ new Parent().accessChildProps(); //// [privateNamesConstructorChain-2.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _Parent_foo, _Parent_bar, _Child_foo, _Child_bar; class Parent { @@ -39,7 +29,7 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classStaticPrivateFieldGet(Child, _a, _Parent_bar); // Error: not found + __classPrivateFieldGet(Child, _a, void 0, _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index efb0b6e96d90e..718ceefe54797 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -29,30 +29,16 @@ b = a; // Error //// [privateNamesInGenericClasses.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; -}; -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_instances, _C_foo, _C_method, _C_prop_get, _C_prop_set; class C { @@ -61,14 +47,14 @@ class C { _C_foo.set(this, void 0); } bar(x) { return __classPrivateFieldGet(x, _C_foo); } // OK - bar2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method).call(x); } // OK - bar3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK + bar2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method).call(x); } // OK + bar3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK baz(x) { return __classPrivateFieldGet(x, _C_foo); } // OK - baz2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK - baz3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK + baz2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method); } // OK + baz3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK quux(x) { return __classPrivateFieldGet(x, _C_foo); } // OK - quux2(x) { return __classPrivateMethodGet(x, _C_instances, _C_method); } // OK - quux3(x) { return __classPrivateAccessorGet(x, _C_instances, _C_prop_get); } // OK + quux2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method); } // OK + quux3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK } _C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_get = function _C_prop_get() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_set = function _C_prop_set(value) { __classPrivateFieldSet(this, _C_foo, value); }; a.; // Error diff --git a/tests/baselines/reference/privateNamesInNestedClasses-1.js b/tests/baselines/reference/privateNamesInNestedClasses-1.js index 22730b36fcf49..3554cd45da4bc 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-1.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-1.js @@ -28,11 +28,10 @@ new A().method(); //// [privateNamesInNestedClasses-1.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_foo, _A_bar; class A { diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.js b/tests/baselines/reference/privateNamesInNestedClasses-2.js index b64df29fe560e..70b07da3dcced 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.js @@ -18,11 +18,10 @@ class A { //// [privateNamesInNestedClasses-2.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_x; class A { diff --git a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js index 3958fa5ab2b26..1784f7de35d04 100644 --- a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js +++ b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js @@ -14,12 +14,11 @@ function func(x: I) { //// [privateNamesInterfaceExtendingClass.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var _C_prop; class C { diff --git a/tests/baselines/reference/privateNamesNoDelete.js b/tests/baselines/reference/privateNamesNoDelete.js index 1614af7f8850b..0828a447b9d9c 100644 --- a/tests/baselines/reference/privateNamesNoDelete.js +++ b/tests/baselines/reference/privateNamesNoDelete.js @@ -9,11 +9,10 @@ class A { //// [privateNamesNoDelete.js] "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_v; class A { diff --git a/tests/baselines/reference/privateNamesUnique-2.js b/tests/baselines/reference/privateNamesUnique-2.js index b973c3fa3e5cf..380159d4fe5a6 100644 --- a/tests/baselines/reference/privateNamesUnique-2.js +++ b/tests/baselines/reference/privateNamesUnique-2.js @@ -31,11 +31,10 @@ export class Foo { } _Foo_x = new WeakMap(); //// [a.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _Foo_x; export class Foo { diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index fc63600568b39..c12ac22c347d9 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -15,14 +15,10 @@ class B { //// [privateNamesUnique-3.js] -var __classStaticPrivateFieldGet = (this && this.__classStaticPrivateFieldGet) || function (receiver, classConstructor, propertyDescriptor) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - if (propertyDescriptor === undefined) { - throw new TypeError("Private static field was accessed before its declaration."); - } - return propertyDescriptor.value; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _a, _A_foo, _A_foo_1, _b, _B_foo; class A { @@ -37,7 +33,7 @@ _a = A, _A_foo = new WeakMap(); _A_foo_1 = { value: true }; // error (duplicate) class B { test(x) { - __classStaticPrivateFieldGet(x, _b, _B_foo); // error (#foo is a static property on B, not an instance property) + __classPrivateFieldGet(x, _b, void 0, _B_foo); // error (#foo is a static property on B, not an instance property) } } _b = B; diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index 90146102f9e35..c250d4cc2c50a 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -21,23 +21,10 @@ class B { //// [privateNamesUseBeforeDef.js] -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); -}; -var __classPrivateMethodGet = (this && this.__classPrivateMethodGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private method on non-instance"); - } - return fn; -}; -var __classPrivateAccessorGet = (this && this.__classPrivateAccessorGet) || function (receiver, instances, fn) { - if (!instances.has(receiver)) { - throw new TypeError("attempted to get private accessor on non-instance"); - } - return fn.call(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _A_foo, _A_bar, _A2_instances, _A2_foo, _A2_bar, _A3_instances, _A3_foo, _A3_bar_get, _B_foo, _B_bar; class A { @@ -50,7 +37,7 @@ _A_foo = new WeakMap(), _A_bar = new WeakMap(); class A2 { constructor() { _A2_instances.add(this); - _A2_foo.set(this, __classPrivateMethodGet(this, _A2_instances, _A2_bar).call(this)); // No Error + _A2_foo.set(this, __classPrivateFieldGet(this, _A2_instances, "m", _A2_bar).call(this)); // No Error } ; } @@ -58,7 +45,7 @@ _A2_foo = new WeakMap(), _A2_instances = new WeakSet(), _A2_bar = function _A2_b class A3 { constructor() { _A3_instances.add(this); - _A3_foo.set(this, __classPrivateAccessorGet(this, _A3_instances, _A3_bar_get)); // No Error + _A3_foo.set(this, __classPrivateFieldGet(this, _A3_instances, "a", _A3_bar_get)); // No Error } ; } diff --git a/tests/baselines/reference/privateStaticNameShadowing.js b/tests/baselines/reference/privateStaticNameShadowing.js index c37aba06f7471..4959e2fec893b 100644 --- a/tests/baselines/reference/privateStaticNameShadowing.js +++ b/tests/baselines/reference/privateStaticNameShadowing.js @@ -14,23 +14,22 @@ class X { //// [privateStaticNameShadowing.js] -var __classStaticPrivateMethodGet = (this && this.__classStaticPrivateMethodGet) || function (receiver, classConstructor, fn) { - if (receiver !== classConstructor) { - throw new TypeError("Private static access of wrong provenance"); - } - return fn; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _b, _X_f, _X_m; class X { constructor() { - __classStaticPrivateMethodGet(X, _b, _X_m).call(X); + __classPrivateFieldGet(X, _b, "m", _X_m).call(X); } } _b = X, _X_m = function _X_m() { const X = {}; // shadow the class const _a = {}; // shadow the first generated var - __classStaticPrivateMethodGet(X, _b, _X_m).call(// shadow the first generated var + __classPrivateFieldGet(X, _b, "m", _X_m).call(// shadow the first generated var X); // Should check with X as the receiver with _b as the class constructor return 1; }; -_X_f = { value: __classStaticPrivateMethodGet(X, _b, _X_m).call(X) }; +_X_f = { value: __classPrivateFieldGet(X, _b, "m", _X_m).call(X) }; diff --git a/tests/baselines/reference/strictPropertyInitialization.js b/tests/baselines/reference/strictPropertyInitialization.js index 23505b7087f47..0d74861983dec 100644 --- a/tests/baselines/reference/strictPropertyInitialization.js +++ b/tests/baselines/reference/strictPropertyInitialization.js @@ -137,18 +137,16 @@ class C11 { //// [strictPropertyInitialization.js] "use strict"; // Properties with non-undefined types require initialization -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, privateMap, value) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to set private field on non-instance"); - } - privateMap.set(receiver, value); - return value; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, privateMap) { - if (!privateMap.has(receiver)) { - throw new TypeError("attempted to get private field on non-instance"); - } - return privateMap.get(receiver); +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _C1_f, _C1_g, _C1_h, _C1_i, _C4_d, _C4_e, _C4_f, _C5_b, _C6_b, _C7_b, _C10_d, _C11_b; class C1 { From 7490a36397b3dc4b9425b2293756e00d7b496148 Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 18 Mar 2021 09:13:31 +0000 Subject: [PATCH 60/68] do not allocate a node if not needed in visitMehodDeclaration (#55) --- src/compiler/transformers/classFields.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index b0bdec96bf229..0ed4509fcd906 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -278,10 +278,9 @@ namespace ts { function visitMethodOrAccessorDeclaration(node: MethodDeclaration | AccessorDeclaration) { Debug.assert(!some(node.decorators)); - const transformedMethod = visitEachChild(node, classElementVisitor, context); - if (!shouldTransformPrivateElements || !isPrivateIdentifier(node.name) || !transformedMethod.body) { - return transformedMethod; + if (!shouldTransformPrivateElements || !isPrivateIdentifier(node.name)) { + return visitEachChild(node, classElementVisitor, context); } const functionName = getHoistedFunctionName(node); @@ -290,13 +289,13 @@ namespace ts { factory.createAssignment( functionName, factory.createFunctionExpression( - filter(transformedMethod.modifiers, m => !isStaticModifier(m)), - transformedMethod.asteriskToken, + filter(node.modifiers, m => !isStaticModifier(m)), + node.asteriskToken, functionName, - transformedMethod.typeParameters, - transformedMethod.parameters, - transformedMethod.type, - transformedMethod.body + /* typeParameters */ undefined, + visitParameterList(node.parameters, classElementVisitor, context), + /* type */ undefined, + visitFunctionBody(node.body!, classElementVisitor, context) ) ) ); From a3fdc4b013f3fac630b2a31fa7684516b5aad986 Mon Sep 17 00:00:00 2001 From: Titian Cernicova-Dragomir Date: Thu, 18 Mar 2021 09:45:33 +0200 Subject: [PATCH 61/68] Simplified emit for private identifier class elements. --- src/compiler/factory/emitHelpers.ts | 129 +++++- src/compiler/transformers/classFields.ts | 409 +++++++----------- tests/baselines/reference/importHelpersES6.js | 2 +- .../baselines/reference/privateNameAndAny.js | 18 +- .../privateNameAndObjectRestSpread.js | 8 +- .../reference/privateNameBadAssignment.js | 2 +- .../reference/privateNameCircularReference.js | 4 +- ...ameComputedPropertyName1(target=es2015).js | 16 +- ...ameComputedPropertyName2(target=es2015).js | 2 +- ...ameComputedPropertyName3(target=es2015).js | 8 +- .../privateNameConstructorSignature.js | 2 +- .../privateNameDeclarationMerging.js | 4 +- .../reference/privateNameDuplicateField.js | 8 +- tests/baselines/reference/privateNameField.js | 2 +- .../reference/privateNameFieldAccess.js | 2 +- .../reference/privateNameFieldAssignment.js | 52 +-- .../privateNameFieldCallExpression.js | 16 +- .../privateNameFieldDerivedClasses.js | 2 +- ...FieldDestructuredBinding(target=es2015).js | 16 +- .../privateNameFieldUnaryMutation.js | 40 +- .../privateNameInLhsReceiverExpression.js | 4 +- .../privateNameMethodClassExpression.js | 2 +- .../privateNameNestedClassFieldShadowing.js | 4 +- .../privateNameNestedMethodAccess.js | 4 +- ...rivateNameStaticAccessorsCallExpression.js | 2 +- .../reference/privateNameStaticFieldAccess.js | 4 +- .../privateNameStaticFieldAssignment.js | 52 +-- .../privateNameStaticFieldCallExpression.js | 16 +- .../privateNameStaticFieldClassExpression.js | 8 +- .../privateNameStaticFieldDerivedClasses.js | 4 +- ...FieldDestructuredBinding(target=es2015).js | 16 +- .../privateNameStaticFieldUnaryMutation.js | 40 +- .../privateNameStaticMethodClassExpression.js | 2 +- .../reference/privateNamesAndFields.js | 4 +- .../privateNamesAndGenericClasses-2.js | 8 +- .../reference/privateNamesAndStaticFields.js | 8 +- .../privateNamesConstructorChain-1.js | 4 +- .../privateNamesConstructorChain-2.js | 4 +- .../reference/privateNamesInGenericClasses.js | 8 +- .../privateNamesInNestedClasses-1.js | 6 +- .../privateNamesInNestedClasses-2.js | 2 +- .../privateNamesInterfaceExtendingClass.js | 2 +- .../reference/privateNamesNoDelete.js | 2 +- .../reference/privateNamesUnique-2.js | 2 +- .../reference/privateNamesUnique-3.js | 2 +- .../reference/privateNamesUseBeforeDef.js | 6 +- .../reference/strictPropertyInitialization.js | 14 +- 47 files changed, 478 insertions(+), 494 deletions(-) diff --git a/src/compiler/factory/emitHelpers.ts b/src/compiler/factory/emitHelpers.ts index 29049f126057b..8eb5affa73f8f 100644 --- a/src/compiler/factory/emitHelpers.ts +++ b/src/compiler/factory/emitHelpers.ts @@ -32,8 +32,8 @@ namespace ts { createImportDefaultHelper(expression: Expression): Expression; createExportStarHelper(moduleExpression: Expression, exportsExpression?: Expression): Expression; // Class Fields Helpers - createClassPrivateFieldGetHelper(receiver: Expression, privateField: Identifier, kind?: "a" | "m" | undefined, f?: Identifier | undefined): Expression; - createClassPrivateFieldSetHelper(receiver: Expression, privateField: Identifier, value: Expression, kind?: "a" | "m" | undefined, f?: Identifier | undefined): Expression; + createClassPrivateFieldGetHelper(receiver: Expression, state: Identifier, kind: PrivateIdentifierKind, f: Identifier | undefined): Expression; + createClassPrivateFieldSetHelper(receiver: Expression, state: Identifier, value: Expression, kind: PrivateIdentifierKind, f: Identifier | undefined): Expression; } export function createEmitHelperFactory(context: TransformationContext): EmitHelperFactory { @@ -368,38 +368,26 @@ namespace ts { // Class Fields Helpers - function createClassPrivateFieldGetHelper(receiver: Expression, state: Identifier, kind?: "a" | "m" | undefined, f?: Identifier | undefined) { + function createClassPrivateFieldGetHelper(receiver: Expression, state: Identifier, kind: PrivateIdentifierKind, f: Identifier | undefined) { context.requestEmitHelper(classPrivateFieldGetHelper); let args; - if(!kind && !f) { - args = [receiver, state]; - } - else if(kind && !f) { + if (!f) { args = [receiver, state, factory.createStringLiteral(kind)]; } - else if(!kind && f) { - args = [receiver, state, factory.createVoidZero(), f]; - } else { - args = [receiver, state, factory.createStringLiteral(kind!), f!]; + args = [receiver, state, factory.createStringLiteral(kind), f]; } return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldGet"), /*typeArguments*/ undefined, args); } - function createClassPrivateFieldSetHelper(receiver: Expression, state: Identifier, value: Expression, kind?: "a" | "m" | undefined, f?: Identifier | undefined) { + function createClassPrivateFieldSetHelper(receiver: Expression, state: Identifier, value: Expression, kind: PrivateIdentifierKind, f: Identifier | undefined) { context.requestEmitHelper(classPrivateFieldSetHelper); let args; - if(!kind && !f) { - args = [receiver, state, value]; - } - else if(kind && !f) { + if (!f) { args = [receiver, state, value, factory.createStringLiteral(kind)]; } - else if(!kind && f) { - args = [receiver, state, value, factory.createVoidZero(), f]; - } else { - args = [receiver, state, value, factory.createStringLiteral(kind!), f!]; + args = [receiver, state, value, factory.createStringLiteral(kind), f]; } return factory.createCallExpression(getUnscopedHelperName("__classPrivateFieldSet"), /*typeArguments*/ undefined, args); } @@ -830,7 +818,6 @@ namespace ts { };` }; - // emit output for the __export helper function export const exportStarHelper: UnscopedEmitHelper = { name: "typescript:export-star", importName: "__exportStar", @@ -843,7 +830,57 @@ namespace ts { };` }; - // Class fields helpers + /** + * Parameters: + * @param receiver — The object on which the private member will be set. + * @param state — One of the following: + * - A WeakMap used to store a private instance field. + * - A WeakSet used as an instance brand for private instance methods and accessors. + * - A function value that should be the undecorated class constructor used to brand check private static fields, methods, and accessors. + * @param value — The value to set. + * @param kind — (optional pre TS 4.3, required for TS 4.3+) One of the following values: + * - undefined — Indicates a private instance field (pre TS 4.3). + * - "f" — Indicates a private field (instance or static). + * - "m" — Indicates a private method (instance or static). + * - "a" — Indicates a private accessor (instance or static). + * @param f — (optional pre TS 4.3) Depends on the arguments for state and kind: + * - If kind is "m", this should be the function corresponding to the static or instance method. + * - If kind is "a", this should be the function corresponding to the setter method, or undefined if the setter was not defined. + * - If kind is "f" and state is a function, this should be an object holding the value of a static field, or undefined if the static field declaration has not yet been evaluated. + * Usage: + * This helper will only ever be used by the compiler in the following ways: + * + * Writing to a private instance field (pre TS 4.3): + * __classPrivateFieldSet(, , ) + * + * Writing to a private instance field (TS 4.3+): + * __classPrivateFieldSet(, , , "f") + * + * Writing to a private instance set accessor (when defined, TS 4.3+): + * __classPrivateFieldSet(, , , "a", ) + * + * Writing to a private instance set accessor (when not defined, TS 4.3+): + * __classPrivateFieldSet(, , , "a", void 0) + * NOTE: This always results in a runtime error. + * + * Writing to a private instance method (TS 4.3+): + * __classPrivateFieldSet(, , , "m", ) + * NOTE: This always results in a runtime error. + * + * Writing to a private static field (TS 4.3+): + * __classPrivateFieldSet(, , , "f", <{ value: any }>) + * + * Writing to a private static set accessor (when defined, TS 4.3+): + * __classPrivateFieldSet(, , , "a", ) + * + * Writing to a private static set accessor (when not defined, TS 4.3+): + * __classPrivateFieldSet(, , , "a", void 0) + * NOTE: This always results in a runtime error. + * + * Writing to a private static method (TS 4.3+): + * __classPrivateFieldSet(, , , "m", ) + * NOTE: This always results in a runtime error. + */ export const classPrivateFieldGetHelper: UnscopedEmitHelper = { name: "typescript:classPrivateFieldGet", importName: "__classPrivateFieldGet", @@ -856,6 +893,54 @@ namespace ts { };` }; + /** + * Parameters: + * @param receiver — The object from which the private member will be read. + * @param state — One of the following: + * - A WeakMap used to read a private instance field. + * - A WeakSet used as an instance brand for private instance methods and accessors. + * - A function value that should be the undecorated class constructor used to brand check private static fields, methods, and accessors. + * @param kind — (optional pre TS 4.3, required for TS 4.3+) One of the following values: + * - undefined — Indicates a private instance field (pre TS 4.3). + * - "f" — Indicates a private field (instance or static). + * - "m" — Indicates a private method (instance or static). + * - "a" — Indicates a private accessor (instance or static). + * @param f — (optional pre TS 4.3) Depends on the arguments for state and kind: + * - If kind is "m", this should be the function corresponding to the static or instance method. + * - If kind is "a", this should be the function corresponding to the getter method, or undefined if the getter was not defined. + * - If kind is "f" and state is a function, this should be an object holding the value of a static field, or undefined if the static field declaration has not yet been evaluated. + * Usage: + * This helper will only ever be used by the compiler in the following ways: + * + * Reading from a private instance field (pre TS 4.3): + * __classPrivateFieldGet(, ) + * + * Reading from a private instance field (TS 4.3+): + * __classPrivateFieldGet(, , "f") + * + * Reading from a private instance get accessor (when defined, TS 4.3+): + * __classPrivateFieldGet(, , "a", ) + * + * Reading from a private instance get accessor (when not defined, TS 4.3+): + * __classPrivateFieldGet(, , "a", void 0) + * NOTE: This always results in a runtime error. + * + * Reading from a private instance method (TS 4.3+): + * __classPrivateFieldGet(, , "m", ) + * + * Reading from a private static field (TS 4.3+): + * __classPrivateFieldGet(, , "f", <{ value: any }>) + * + * Reading from a private static get accessor (when defined, TS 4.3+): + * __classPrivateFieldGet(, , "a", ) + * + * Reading from a private static get accessor (when not defined, TS 4.3+): + * __classPrivateFieldGet(, , "a", void 0) + * NOTE: This always results in a runtime error. + * + * Reading from a private static method (TS 4.3+): + * __classPrivateFieldGet(, , "m", ) + */ export const classPrivateFieldSetHelper: UnscopedEmitHelper = { name: "typescript:classPrivateFieldSet", importName: "__classPrivateFieldSet", diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 28d51013faa7f..cac93596ea3de 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -7,91 +7,64 @@ namespace ts { */ ClassAliases = 1 << 0, } - - const enum PrivateIdentifierPlacement { - InstanceField, - InstanceMethod, - InstanceGetterOnly, - InstanceSetterOnly, - InstanceGetterAndSetter, - StaticField, - StaticMethod, - StaticGetterOnly, - StaticSetterOnly, - StaticGetterAndSetter, - } - - type PrivateIdentifierInfo = - | PrivateIdentifierStaticField - | PrivateIdentifierStaticMethod - | PrivateIdentifierStaticGetterOnly - | PrivateIdentifierStaticSetterOnly - | PrivateIdentifierStaticGetterAndSetterOnly - | PrivateIdentifierInstanceField - | PrivateIdentifierInstanceMethod - | PrivateIdentifierInstanceGetterOnly - | PrivateIdentifierInstanceSetterOnly - | PrivateIdentifierInstanceGetterAndSetter; - - interface PrivateIdentifierStaticField { - placement: PrivateIdentifierPlacement.StaticField; - variableName: Identifier; - classConstructor: Identifier; - } - interface PrivateIdentifierStaticMethod { - placement: PrivateIdentifierPlacement.StaticMethod; - functionName: Identifier; - classConstructor: Identifier; + export const enum PrivateIdentifierKind { + Field = "f", + Method = "m", + Accessor = "a" } - interface PrivateIdentifierStaticGetterOnly { - placement: PrivateIdentifierPlacement.StaticGetterOnly; - getterName: Identifier; - setterName?: undefined; - classConstructor: Identifier; - } - interface PrivateIdentifierStaticSetterOnly { - placement: PrivateIdentifierPlacement.StaticSetterOnly; - setterName: Identifier; - getterName?: undefined; - classConstructor: Identifier; - } - interface PrivateIdentifierStaticGetterAndSetterOnly { - placement: PrivateIdentifierPlacement.StaticGetterAndSetter; - getterName: Identifier; - setterName: Identifier; - classConstructor: Identifier; + interface PrivateIdentifierInfoBase { + /** + * brandCheckIdentifier can contain: + * - For instance field: The WeakMap that will be the storage for the field. + * - For instance methods or accessors: The WeakSet that will be used for brand checking. + * - For static members: The constructor that will be used for brand checking. + */ + brandCheckIdentifier: Identifier; + /** + * Stores if the identifier is static or not + */ + isStatic: boolean; } - interface PrivateIdentifierInstanceField { - placement: PrivateIdentifierPlacement.InstanceField; - weakMapName: Identifier; + interface PrivateIdentifierAccessorInfo extends PrivateIdentifierInfoBase { + kind: PrivateIdentifierKind.Accessor; + /** + * Identifier for a variable that will contain the private get accessor implementation, if any. + */ + getterName?: Identifier; + /** + * Identifier for a variable that will contain the private set accessor implementation, if any. + */ + setterName?: Identifier; } - - interface PrivateIdentifierInstanceMethod { - placement: PrivateIdentifierPlacement.InstanceMethod; - weakSetName: Identifier; - functionName: Identifier; + interface PrivateIdentifierMethodInfo extends PrivateIdentifierInfoBase { + kind: PrivateIdentifierKind.Method; + /** + * Identifier for a variable that will contain the private method implementation. + */ + methodName: Identifier; } - - interface PrivateIdentifierInstanceGetterOnly { - placement: PrivateIdentifierPlacement.InstanceGetterOnly; - weakSetName: Identifier; - getterName: Identifier; - setterName?: undefined; + interface PrivateIdentifierInstanceFieldInfo extends PrivateIdentifierInfoBase { + kind: PrivateIdentifierKind.Field; + isStatic: false; + /** + * Defined for ease of access when in a union with PrivateIdentifierStaticFieldInfo. + */ + variableName: undefined; } - - interface PrivateIdentifierInstanceSetterOnly { - placement: PrivateIdentifierPlacement.InstanceSetterOnly; - weakSetName: Identifier; - setterName: Identifier; - getterName?: undefined; + interface PrivateIdentifierStaticFieldInfo extends PrivateIdentifierInfoBase { + kind: PrivateIdentifierKind.Field; + isStatic: true; + /** + * Contains the variable that will server as the storage for the field. + */ + variableName: Identifier; } - interface PrivateIdentifierInstanceGetterAndSetter { - placement: PrivateIdentifierPlacement.InstanceGetterAndSetter; - weakSetName: Identifier; - getterName: Identifier; - setterName: Identifier; - } + type PrivateIdentifierInfo = + | PrivateIdentifierMethodInfo + | PrivateIdentifierInstanceFieldInfo + | PrivateIdentifierStaticFieldInfo + | PrivateIdentifierAccessorInfo; interface PrivateIdentifierEnvironment { /** @@ -99,7 +72,7 @@ namespace ts { */ className: string; /** - * Used for brand ckeck on static members + * Used for brand check on static members */ classConstructor?: Identifier; /** @@ -315,23 +288,17 @@ namespace ts { const info = accessPrivateIdentifier(node.name); Debug.assert(info, "Undeclared private name for property declaration."); - if (info.placement === PrivateIdentifierPlacement.InstanceMethod || info.placement === PrivateIdentifierPlacement.StaticMethod) { - return info.functionName; + if (info.kind === PrivateIdentifierKind.Method) { + return info.methodName; } - if (isGetAccessor(node) && - (info.placement === PrivateIdentifierPlacement.InstanceGetterOnly || - info.placement === PrivateIdentifierPlacement.StaticGetterOnly || - info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter || - info.placement === PrivateIdentifierPlacement.StaticGetterAndSetter)) { - return info.getterName; - } - if (isSetAccessor(node) && - (info.placement === PrivateIdentifierPlacement.InstanceSetterOnly || - info.placement === PrivateIdentifierPlacement.StaticSetterOnly || - info.placement === PrivateIdentifierPlacement.InstanceGetterAndSetter || - info.placement === PrivateIdentifierPlacement.StaticGetterAndSetter)) { - return info.setterName; + if (info.kind === PrivateIdentifierKind.Accessor) { + if (isGetAccessor(node)) { + return info.getterName; + } + if (isSetAccessor(node)) { + return info.setterName; + } } } @@ -366,57 +333,30 @@ namespace ts { } function createPrivateIdentifierAccessHelper(info: PrivateIdentifierInfo, receiver: Expression): Expression { - switch (info.placement) { - case PrivateIdentifierPlacement.InstanceField: - return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - receiver, - info.weakMapName - ); - case PrivateIdentifierPlacement.InstanceMethod: - return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - receiver, - info.weakSetName, - "m", - info.functionName - ); - case PrivateIdentifierPlacement.InstanceGetterOnly: - case PrivateIdentifierPlacement.InstanceGetterAndSetter: - case PrivateIdentifierPlacement.InstanceSetterOnly: + switch(info.kind) { + case PrivateIdentifierKind.Accessor: return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, - info.weakSetName, - "a", + info.brandCheckIdentifier, + info.kind, info.getterName ); - case PrivateIdentifierPlacement.StaticField: - return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - receiver, - info.classConstructor, - undefined, - info.variableName - ); - case PrivateIdentifierPlacement.StaticMethod: - return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( - receiver, - info.classConstructor, - "m", - info.functionName - ); - case PrivateIdentifierPlacement.StaticGetterOnly: - case PrivateIdentifierPlacement.StaticGetterAndSetter: + case PrivateIdentifierKind.Method: return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, - info.classConstructor, - "a", - info.getterName + info.brandCheckIdentifier, + info.kind, + info.methodName ); - case PrivateIdentifierPlacement.StaticSetterOnly: + case PrivateIdentifierKind.Field: return context.getEmitHelperFactory().createClassPrivateFieldGetHelper( receiver, - info.classConstructor, - "a" + info.brandCheckIdentifier, + info.kind, + info.variableName ); - default: return Debug.fail("Unexpected private identifier placement"); + default: + Debug.assertNever(info, "Unknown private element type"); } } @@ -610,68 +550,33 @@ namespace ts { ); } - switch (info.placement) { - case PrivateIdentifierPlacement.InstanceField: + switch(info.kind) { + case PrivateIdentifierKind.Accessor: return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, - info.weakMapName, - right - ); - case PrivateIdentifierPlacement.InstanceMethod: - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - info.weakSetName, + info.brandCheckIdentifier, right, - "m" + info.kind, + info.setterName ); - case PrivateIdentifierPlacement.InstanceGetterOnly: + case PrivateIdentifierKind.Method: return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, - info.weakSetName, + info.brandCheckIdentifier, right, - "a" + info.kind, + /* f */ undefined ); - case PrivateIdentifierPlacement.InstanceSetterOnly: - case PrivateIdentifierPlacement.InstanceGetterAndSetter: + case PrivateIdentifierKind.Field: return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( receiver, - info.weakSetName, + info.brandCheckIdentifier, right, - "a", - info.setterName, - ); - case PrivateIdentifierPlacement.StaticField: - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - info.classConstructor, - right, - undefined, - info.variableName, - ); - case PrivateIdentifierPlacement.StaticMethod: - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - info.classConstructor, - right, - "m", - ); - case PrivateIdentifierPlacement.StaticGetterOnly: - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - info.classConstructor, - right, - "a", - ); - case PrivateIdentifierPlacement.StaticSetterOnly: - case PrivateIdentifierPlacement.StaticGetterAndSetter: - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - info.classConstructor, - right, - "a", - info.setterName, + info.kind, + info.variableName ); - default: return Debug.fail("Unexpected private identifier placement"); + default: + Debug.assertNever(info, "Unknown private element type"); } } @@ -1074,22 +979,23 @@ namespace ts { if (shouldTransformPrivateElements && isPrivateIdentifier(propertyName)) { const privateIdentifierInfo = accessPrivateIdentifier(propertyName); if (privateIdentifierInfo) { - switch (privateIdentifierInfo.placement) { - case PrivateIdentifierPlacement.InstanceField: { + if (privateIdentifierInfo.kind === PrivateIdentifierKind.Field) { + if (!privateIdentifierInfo.isStatic) { return createPrivateInstanceFieldInitializer( receiver, visitNode(property.initializer, visitor, isExpression), - privateIdentifierInfo.weakMapName + privateIdentifierInfo.brandCheckIdentifier ); } - case PrivateIdentifierPlacement.StaticField: { + else { return createPrivateStaticFieldInitializer( privateIdentifierInfo.variableName, visitNode(property.initializer, visitor, isExpression) ); } - default: - return undefined; + } + else { + return undefined; } } else { @@ -1258,60 +1164,57 @@ namespace ts { const text = getTextOfPropertyName(node.name) as string; const env = getPrivateIdentifierEnvironment(); const { weakSetName, classConstructor } = env; - let info: PrivateIdentifierInfo; const assignmentExpressions: Expression[] = []; if (hasStaticModifier(node)) { Debug.assert(classConstructor, "weakSetName should be set in private identifier environment"); if (isPropertyDeclaration(node)) { const variableName = createHoistedVariableForPrivateName(text, node); - info = { - placement: PrivateIdentifierPlacement.StaticField, + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Field, variableName, - classConstructor - }; + brandCheckIdentifier: classConstructor, + isStatic: true, + }); } else if (isMethodDeclaration(node)) { const functionName = createHoistedVariableForPrivateName(text, node); - info = { - placement: PrivateIdentifierPlacement.StaticMethod, - functionName, - classConstructor - }; + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Method, + methodName: functionName, + brandCheckIdentifier: classConstructor, + isStatic: true, + }); } else if (isGetAccessorDeclaration(node)) { const getterName = createHoistedVariableForPrivateName(text + "_get", node); const previousInfo = env.identifiers.get(node.name.escapedText); - if (previousInfo?.placement === PrivateIdentifierPlacement.StaticSetterOnly) { - info = { - ...previousInfo, - placement: PrivateIdentifierPlacement.StaticGetterAndSetter, - getterName, - }; + if (previousInfo?.kind === PrivateIdentifierKind.Accessor) { + previousInfo.getterName = getterName; } else { - info = { - placement: PrivateIdentifierPlacement.StaticGetterOnly, + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Accessor, getterName, - classConstructor - }; + setterName: undefined, + brandCheckIdentifier: classConstructor, + isStatic: true, + }); } } else if (isSetAccessorDeclaration(node)) { const setterName = createHoistedVariableForPrivateName(text + "_set", node); const previousInfo = env.identifiers.get(node.name.escapedText); - if (previousInfo?.placement === PrivateIdentifierPlacement.StaticGetterOnly) { - info = { - ...previousInfo, - placement: PrivateIdentifierPlacement.StaticGetterAndSetter, - setterName, - }; + if (previousInfo?.kind === PrivateIdentifierKind.Accessor) { + previousInfo.setterName = setterName; } else { - info = { - placement: PrivateIdentifierPlacement.StaticSetterOnly, + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Accessor, + getterName: undefined, setterName, - classConstructor - }; + brandCheckIdentifier: classConstructor, + isStatic: true, + }); } } else { @@ -1320,10 +1223,12 @@ namespace ts { } else if (isPropertyDeclaration(node)) { const weakMapName = createHoistedVariableForPrivateName(text, node); - info = { - placement: PrivateIdentifierPlacement.InstanceField, - weakMapName, - }; + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Field, + brandCheckIdentifier: weakMapName, + isStatic: false, + variableName: undefined + }); assignmentExpressions.push(factory.createAssignment( weakMapName, @@ -1337,11 +1242,12 @@ namespace ts { else if (isMethodDeclaration(node)) { Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); - info = { - placement: PrivateIdentifierPlacement.InstanceMethod, - weakSetName, - functionName: createHoistedVariableForPrivateName(text, node), - }; + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Method, + methodName: createHoistedVariableForPrivateName(text, node), + brandCheckIdentifier: weakSetName, + isStatic: false, + }); } else if (isAccessor(node)) { Debug.assert(weakSetName, "weakSetName should be set in private identifier environment"); @@ -1350,39 +1256,33 @@ namespace ts { if (isGetAccessor(node)) { const getterName = createHoistedVariableForPrivateName(text + "_get", node); - if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceSetterOnly) { - info = { - placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, - weakSetName, - getterName, - setterName: previousInfo.setterName - }; + if (previousInfo?.kind === PrivateIdentifierKind.Accessor) { + previousInfo.getterName = getterName; } else { - info = { - placement: PrivateIdentifierPlacement.InstanceGetterOnly, - weakSetName, - getterName - }; + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Accessor, + getterName, + setterName: undefined, + brandCheckIdentifier: weakSetName, + isStatic: false, + }); } } else { const setterName = createHoistedVariableForPrivateName(text + "_set", node); - if (previousInfo?.placement === PrivateIdentifierPlacement.InstanceGetterOnly) { - info = { - placement: PrivateIdentifierPlacement.InstanceGetterAndSetter, - weakSetName, - setterName, - getterName: previousInfo.getterName - }; + if (previousInfo?.kind === PrivateIdentifierKind.Accessor) { + previousInfo.setterName = setterName; } else { - info = { - placement: PrivateIdentifierPlacement.InstanceSetterOnly, - weakSetName, - setterName - }; + env.identifiers.set(node.name.escapedText, { + kind: PrivateIdentifierKind.Accessor, + getterName: undefined, + setterName, + brandCheckIdentifier: weakSetName, + isStatic: false, + }); } } } @@ -1390,7 +1290,6 @@ namespace ts { Debug.assertNever(node, "Unknown class element type."); } - env.identifiers.set(node.name.escapedText, info); getPendingExpressions().push(...assignmentExpressions); } diff --git a/tests/baselines/reference/importHelpersES6.js b/tests/baselines/reference/importHelpersES6.js index a93ecc8c0281b..3137f21da06f8 100644 --- a/tests/baselines/reference/importHelpersES6.js +++ b/tests/baselines/reference/importHelpersES6.js @@ -27,7 +27,7 @@ let A = class A { _A_x.set(this, 1); } f() { - return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _A_x, yield __classPrivateFieldGet(this, _A_x)); }); + return __awaiter(this, void 0, void 0, function* () { __classPrivateFieldSet(this, _A_x, yield __classPrivateFieldGet(this, _A_x, "f"), "f"); }); } }; _A_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index 8d2a35e26e0f5..210f8cceb9478 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -40,27 +40,27 @@ class A { _A_foo.set(this, true); } method(thing) { - __classPrivateFieldGet(thing, _A_foo); // OK + __classPrivateFieldGet(thing, _A_foo, "f"); // OK __classPrivateFieldGet(thing, _a, "m", _A_m).call(// OK thing); - __classPrivateFieldGet(thing, _a, void 0, _A_baz); + __classPrivateFieldGet(thing, _a, "f", _A_baz); thing.; // Error - __classPrivateFieldGet(thing, _A_foo).call(// Error + __classPrivateFieldGet(thing, _A_foo, "f").call(// Error thing); } methodU(thing) { - __classPrivateFieldGet(thing, _A_foo); + __classPrivateFieldGet(thing, _A_foo, "f"); __classPrivateFieldGet(thing, _a, "m", _A_m).call(thing); - __classPrivateFieldGet(thing, _a, void 0, _A_baz); + __classPrivateFieldGet(thing, _a, "f", _A_baz); thing.; - __classPrivateFieldGet(thing, _A_foo).call(thing); + __classPrivateFieldGet(thing, _A_foo, "f").call(thing); } methodN(thing) { - __classPrivateFieldGet(thing, _A_foo); + __classPrivateFieldGet(thing, _A_foo, "f"); __classPrivateFieldGet(thing, _a, "m", _A_m).call(thing); - __classPrivateFieldGet(thing, _a, void 0, _A_baz); + __classPrivateFieldGet(thing, _a, "f", _A_baz); thing.; - __classPrivateFieldGet(thing, _A_foo).call(thing); + __classPrivateFieldGet(thing, _A_foo, "f").call(thing); } } _a = A, _A_foo = new WeakMap(), _A_m = function _A_m() { }; diff --git a/tests/baselines/reference/privateNameAndObjectRestSpread.js b/tests/baselines/reference/privateNameAndObjectRestSpread.js index 40578d864c3e3..64247610dfd91 100644 --- a/tests/baselines/reference/privateNameAndObjectRestSpread.js +++ b/tests/baselines/reference/privateNameAndObjectRestSpread.js @@ -41,13 +41,13 @@ class C { } method(other) { const obj = Object.assign({}, other); - __classPrivateFieldGet(obj, _C_prop); + __classPrivateFieldGet(obj, _C_prop, "f"); const rest = __rest(other, []); - __classPrivateFieldGet(rest, _C_prop); + __classPrivateFieldGet(rest, _C_prop, "f"); const statics = Object.assign({}, C); - __classPrivateFieldGet(statics, _a, void 0, _C_propStatic); + __classPrivateFieldGet(statics, _a, "f", _C_propStatic); const sRest = __rest(C, []); - __classPrivateFieldGet(sRest, _a, void 0, _C_propStatic); + __classPrivateFieldGet(sRest, _a, "f", _C_propStatic); } } _a = C, _C_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNameBadAssignment.js b/tests/baselines/reference/privateNameBadAssignment.js index 6dfdb911e3745..aad5f192333bc 100644 --- a/tests/baselines/reference/privateNameBadAssignment.js +++ b/tests/baselines/reference/privateNameBadAssignment.js @@ -32,7 +32,7 @@ B. = 3; // Error (outside class body) class C { constructor() { _C_bar.set(this, 6); - __classPrivateFieldSet(exports, _C_bar, 6); // Error + __classPrivateFieldSet(exports, _C_bar, 6, "f"); // Error this. = 3; // Error (undeclared) } } diff --git a/tests/baselines/reference/privateNameCircularReference.js b/tests/baselines/reference/privateNameCircularReference.js index 731447f0a43dc..a88e94a11ef8b 100644 --- a/tests/baselines/reference/privateNameCircularReference.js +++ b/tests/baselines/reference/privateNameCircularReference.js @@ -16,8 +16,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _A_foo, _A_bar; class A { constructor() { - _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); - _A_bar.set(this, __classPrivateFieldGet(this, _A_foo)); + _A_foo.set(this, __classPrivateFieldGet(this, _A_bar, "f")); + _A_bar.set(this, __classPrivateFieldGet(this, _A_foo, "f")); this["#baz"] = this["#baz"]; // Error (should *not* be private name error) } } diff --git a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js index 60c0aae5b378d..ce7464a5541ec 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName1(target=es2015).js @@ -57,18 +57,18 @@ class A { _A_c.set(this, 'c'); _A_d.set(this, void 0); _A_e.set(this, ''); - __classPrivateFieldSet(this, _A_b, 'b'); - __classPrivateFieldSet(this, _A_d, 'd'); + __classPrivateFieldSet(this, _A_b, 'b', "f"); + __classPrivateFieldSet(this, _A_d, 'd', "f"); } test() { const data = { a: 'a', b: 'b', c: 'c', d: 'd', e: 'e' }; - const { [__classPrivateFieldGet(this, _A_a)]: a, [__classPrivateFieldGet(this, _A_b)]: b, [__classPrivateFieldGet(this, _A_c)]: c, [__classPrivateFieldGet(this, _A_d)]: d, [__classPrivateFieldSet(this, _A_e, 'e')]: e, } = data; + const { [__classPrivateFieldGet(this, _A_a, "f")]: a, [__classPrivateFieldGet(this, _A_b, "f")]: b, [__classPrivateFieldGet(this, _A_c, "f")]: c, [__classPrivateFieldGet(this, _A_d, "f")]: d, [__classPrivateFieldSet(this, _A_e, 'e', "f")]: e, } = data; console.log(a, b, c, d, e); - const a1 = data[__classPrivateFieldGet(this, _A_a)]; - const b1 = data[__classPrivateFieldGet(this, _A_b)]; - const c1 = data[__classPrivateFieldGet(this, _A_c)]; - const d1 = data[__classPrivateFieldGet(this, _A_d)]; - const e1 = data[__classPrivateFieldGet(this, _A_e)]; + const a1 = data[__classPrivateFieldGet(this, _A_a, "f")]; + const b1 = data[__classPrivateFieldGet(this, _A_b, "f")]; + const c1 = data[__classPrivateFieldGet(this, _A_c, "f")]; + const d1 = data[__classPrivateFieldGet(this, _A_d, "f")]; + const e1 = data[__classPrivateFieldGet(this, _A_e, "f")]; console.log(a1, b1, c1, d1); } } diff --git a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js index f1c2f488c88f6..248d8203636d6 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName2(target=es2015).js @@ -21,6 +21,6 @@ class A { constructor() { _A_x.set(this, 100); } - [(_A_x = new WeakMap(), (getX = (a) => __classPrivateFieldGet(a, _A_x), "_"))]() { } + [(_A_x = new WeakMap(), (getX = (a) => __classPrivateFieldGet(a, _A_x, "f"), "_"))]() { } } console.log(getX(new A)); diff --git a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js index 931acdae9fc35..03fc2a9272b21 100644 --- a/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js +++ b/tests/baselines/reference/privateNameComputedPropertyName3(target=es2015).js @@ -40,7 +40,7 @@ var _Foo_name; class Foo { constructor(name) { _Foo_name.set(this, void 0); - __classPrivateFieldSet(this, _Foo_name, name); + __classPrivateFieldSet(this, _Foo_name, name, "f"); } getValue(x) { var _Bar_y; @@ -49,11 +49,11 @@ class Foo { constructor() { _Bar_y.set(this, 100); } - [(_Bar_y = new WeakMap(), __classPrivateFieldGet(obj, _Foo_name))]() { - return x + __classPrivateFieldGet(this, _Bar_y); + [(_Bar_y = new WeakMap(), __classPrivateFieldGet(obj, _Foo_name, "f"))]() { + return x + __classPrivateFieldGet(this, _Bar_y, "f"); } } - return new Bar()[__classPrivateFieldGet(obj, _Foo_name)](); + return new Bar()[__classPrivateFieldGet(obj, _Foo_name, "f")](); } } _Foo_name = new WeakMap(); diff --git a/tests/baselines/reference/privateNameConstructorSignature.js b/tests/baselines/reference/privateNameConstructorSignature.js index 897e2ae76041a..e7c07e2316542 100644 --- a/tests/baselines/reference/privateNameConstructorSignature.js +++ b/tests/baselines/reference/privateNameConstructorSignature.js @@ -30,7 +30,7 @@ class C { _C_x.set(this, void 0); } static test() { - __classPrivateFieldSet(new C(), _C_x, 10); + __classPrivateFieldSet(new C(), _C_x, 10, "f"); const y = new C(); const z = new y(); z.x = 123; diff --git a/tests/baselines/reference/privateNameDeclarationMerging.js b/tests/baselines/reference/privateNameDeclarationMerging.js index a55b1a7336dd8..28b2a1f6b8e13 100644 --- a/tests/baselines/reference/privateNameDeclarationMerging.js +++ b/tests/baselines/reference/privateNameDeclarationMerging.js @@ -31,9 +31,9 @@ class C { } foo() { const c = new C(); - __classPrivateFieldGet(c, _C_x); // OK + __classPrivateFieldGet(c, _C_x, "f"); // OK const d = new C(); - __classPrivateFieldGet(d, _C_x); // Error + __classPrivateFieldGet(d, _C_x, "f"); // Error } } _C_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameDuplicateField.js b/tests/baselines/reference/privateNameDuplicateField.js index 24ef61f637011..255fb235ecc1c 100644 --- a/tests/baselines/reference/privateNameDuplicateField.js +++ b/tests/baselines/reference/privateNameDuplicateField.js @@ -582,7 +582,7 @@ function Getter() { _A_Getter_StaticSetter_instances.add(this); } } - _d = A_Getter_StaticSetter, _A_Getter_StaticSetter_instances = new WeakSet(), _A_Getter_StaticSetter_foo_set = function _A_Getter_StaticSetter_foo_set(value) { }; + _d = A_Getter_StaticSetter, _A_Getter_StaticSetter_instances = new WeakSet(), _A_Getter_StaticSetter_foo_get = function _A_Getter_StaticSetter_foo_get() { return ""; }, _A_Getter_StaticSetter_foo_set = function _A_Getter_StaticSetter_foo_set(value) { }; } function Setter() { var _A_Setter_Field_instances, _A_Setter_Field_foo_set, _A_Setter_Field_foo, _A_Setter_Method_instances, _A_Setter_Method_foo_set, _A_Setter_Method_foo, _A_Setter_Getter_instances, _A_Setter_Getter_foo_set, _A_Setter_Getter_foo_get, _A_Setter_Setter_instances, _A_Setter_Setter_foo_set, _A_Setter_Setter_foo_set_1, _A_Setter_StaticField_instances, _a, _A_Setter_StaticField_foo_set, _A_Setter_StaticField_foo, _A_Setter_StaticMethod_instances, _b, _A_Setter_StaticMethod_foo_set, _A_Setter_StaticMethod_foo, _A_Setter_StaticGetter_instances, _c, _A_Setter_StaticGetter_foo_set, _A_Setter_StaticGetter_foo_get, _A_Setter_StaticSetter_instances, _d, _A_Setter_StaticSetter_foo_set, _A_Setter_StaticSetter_foo_set_1; @@ -636,7 +636,7 @@ function Setter() { _A_Setter_StaticGetter_instances.add(this); } } - _c = A_Setter_StaticGetter, _A_Setter_StaticGetter_instances = new WeakSet(), _A_Setter_StaticGetter_foo_get = function _A_Setter_StaticGetter_foo_get() { return ""; }; + _c = A_Setter_StaticGetter, _A_Setter_StaticGetter_instances = new WeakSet(), _A_Setter_StaticGetter_foo_set = function _A_Setter_StaticGetter_foo_set(value) { }, _A_Setter_StaticGetter_foo_get = function _A_Setter_StaticGetter_foo_get() { return ""; }; // Error class A_Setter_StaticSetter { constructor() { @@ -772,7 +772,7 @@ function StaticGetter() { _A_StaticGetter_Setter_instances.add(this); } } - _d = A_StaticGetter_Setter, _A_StaticGetter_Setter_instances = new WeakSet(), _A_StaticGetter_Setter_foo_set = function _A_StaticGetter_Setter_foo_set(value) { }; + _d = A_StaticGetter_Setter, _A_StaticGetter_Setter_instances = new WeakSet(), _A_StaticGetter_Setter_foo_get = function _A_StaticGetter_Setter_foo_get() { return ""; }, _A_StaticGetter_Setter_foo_set = function _A_StaticGetter_Setter_foo_set(value) { }; // Error class A_StaticGetter_StaticField { } @@ -812,7 +812,7 @@ function StaticSetter() { _A_StaticSetter_Getter_instances.add(this); } } - _c = A_StaticSetter_Getter, _A_StaticSetter_Getter_instances = new WeakSet(), _A_StaticSetter_Getter_foo_get = function _A_StaticSetter_Getter_foo_get() { return ""; }; + _c = A_StaticSetter_Getter, _A_StaticSetter_Getter_instances = new WeakSet(), _A_StaticSetter_Getter_foo_set = function _A_StaticSetter_Getter_foo_set(value) { }, _A_StaticSetter_Getter_foo_get = function _A_StaticSetter_Getter_foo_get() { return ""; }; // Error class A_StaticSetter_Setter { constructor() { diff --git a/tests/baselines/reference/privateNameField.js b/tests/baselines/reference/privateNameField.js index b070508ba3557..cf1da2bfb3f78 100644 --- a/tests/baselines/reference/privateNameField.js +++ b/tests/baselines/reference/privateNameField.js @@ -19,7 +19,7 @@ var _A_name; class A { constructor(name) { _A_name.set(this, void 0); - __classPrivateFieldSet(this, _A_name, name); + __classPrivateFieldSet(this, _A_name, name, "f"); } } _A_name = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldAccess.js b/tests/baselines/reference/privateNameFieldAccess.js index bb50afdef80e9..c6cb80234ec09 100644 --- a/tests/baselines/reference/privateNameFieldAccess.js +++ b/tests/baselines/reference/privateNameFieldAccess.js @@ -17,7 +17,7 @@ var _A_myField; class A { constructor() { _A_myField.set(this, "hello world"); - console.log(__classPrivateFieldGet(this, _A_myField)); + console.log(__classPrivateFieldGet(this, _A_myField, "f")); } } _A_myField = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldAssignment.js b/tests/baselines/reference/privateNameFieldAssignment.js index e264a767fc821..86d8d6fed8214 100644 --- a/tests/baselines/reference/privateNameFieldAssignment.js +++ b/tests/baselines/reference/privateNameFieldAssignment.js @@ -52,32 +52,32 @@ class A { constructor() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; _A_field.set(this, 0); - __classPrivateFieldSet(this, _A_field, 1); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) + 2); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) - 3); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) / 4); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) * 5); - __classPrivateFieldSet(this, _A_field, Math.pow(__classPrivateFieldGet(this, _A_field), 6)); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) % 7); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) << 8); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) >> 9); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) >>> 10); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) & 11); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) | 12); - __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field) ^ 13); - __classPrivateFieldSet(A.getInstance(), _A_field, 1); - __classPrivateFieldSet(_a = A.getInstance(), _A_field, __classPrivateFieldGet(_a, _A_field) + 2); - __classPrivateFieldSet(_b = A.getInstance(), _A_field, __classPrivateFieldGet(_b, _A_field) - 3); - __classPrivateFieldSet(_c = A.getInstance(), _A_field, __classPrivateFieldGet(_c, _A_field) / 4); - __classPrivateFieldSet(_d = A.getInstance(), _A_field, __classPrivateFieldGet(_d, _A_field) * 5); - __classPrivateFieldSet(_e = A.getInstance(), _A_field, Math.pow(__classPrivateFieldGet(_e, _A_field), 6)); - __classPrivateFieldSet(_f = A.getInstance(), _A_field, __classPrivateFieldGet(_f, _A_field) % 7); - __classPrivateFieldSet(_g = A.getInstance(), _A_field, __classPrivateFieldGet(_g, _A_field) << 8); - __classPrivateFieldSet(_h = A.getInstance(), _A_field, __classPrivateFieldGet(_h, _A_field) >> 9); - __classPrivateFieldSet(_j = A.getInstance(), _A_field, __classPrivateFieldGet(_j, _A_field) >>> 10); - __classPrivateFieldSet(_k = A.getInstance(), _A_field, __classPrivateFieldGet(_k, _A_field) & 11); - __classPrivateFieldSet(_l = A.getInstance(), _A_field, __classPrivateFieldGet(_l, _A_field) | 12); - __classPrivateFieldSet(_m = A.getInstance(), _A_field, __classPrivateFieldGet(_m, _A_field) ^ 13); + __classPrivateFieldSet(this, _A_field, 1, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") + 2, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") - 3, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") / 4, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") * 5, "f"); + __classPrivateFieldSet(this, _A_field, Math.pow(__classPrivateFieldGet(this, _A_field, "f"), 6), "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") % 7, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") << 8, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") >> 9, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") >>> 10, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") & 11, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") | 12, "f"); + __classPrivateFieldSet(this, _A_field, __classPrivateFieldGet(this, _A_field, "f") ^ 13, "f"); + __classPrivateFieldSet(A.getInstance(), _A_field, 1, "f"); + __classPrivateFieldSet(_a = A.getInstance(), _A_field, __classPrivateFieldGet(_a, _A_field, "f") + 2, "f"); + __classPrivateFieldSet(_b = A.getInstance(), _A_field, __classPrivateFieldGet(_b, _A_field, "f") - 3, "f"); + __classPrivateFieldSet(_c = A.getInstance(), _A_field, __classPrivateFieldGet(_c, _A_field, "f") / 4, "f"); + __classPrivateFieldSet(_d = A.getInstance(), _A_field, __classPrivateFieldGet(_d, _A_field, "f") * 5, "f"); + __classPrivateFieldSet(_e = A.getInstance(), _A_field, Math.pow(__classPrivateFieldGet(_e, _A_field, "f"), 6), "f"); + __classPrivateFieldSet(_f = A.getInstance(), _A_field, __classPrivateFieldGet(_f, _A_field, "f") % 7, "f"); + __classPrivateFieldSet(_g = A.getInstance(), _A_field, __classPrivateFieldGet(_g, _A_field, "f") << 8, "f"); + __classPrivateFieldSet(_h = A.getInstance(), _A_field, __classPrivateFieldGet(_h, _A_field, "f") >> 9, "f"); + __classPrivateFieldSet(_j = A.getInstance(), _A_field, __classPrivateFieldGet(_j, _A_field, "f") >>> 10, "f"); + __classPrivateFieldSet(_k = A.getInstance(), _A_field, __classPrivateFieldGet(_k, _A_field, "f") & 11, "f"); + __classPrivateFieldSet(_l = A.getInstance(), _A_field, __classPrivateFieldGet(_l, _A_field, "f") | 12, "f"); + __classPrivateFieldSet(_m = A.getInstance(), _A_field, __classPrivateFieldGet(_m, _A_field, "f") ^ 13, "f"); } static getInstance() { return new A(); diff --git a/tests/baselines/reference/privateNameFieldCallExpression.js b/tests/baselines/reference/privateNameFieldCallExpression.js index 956b43152a0d9..07eb4455d03d7 100644 --- a/tests/baselines/reference/privateNameFieldCallExpression.js +++ b/tests/baselines/reference/privateNameFieldCallExpression.js @@ -36,16 +36,16 @@ class A { test() { var _a; var _b; - __classPrivateFieldGet(this, _A_fieldFunc).call(this); - (_a = __classPrivateFieldGet(this, _A_fieldFunc)) === null || _a === void 0 ? void 0 : _a.call(this); - const func = __classPrivateFieldGet(this, _A_fieldFunc); + __classPrivateFieldGet(this, _A_fieldFunc, "f").call(this); + (_a = __classPrivateFieldGet(this, _A_fieldFunc, "f")) === null || _a === void 0 ? void 0 : _a.call(this); + const func = __classPrivateFieldGet(this, _A_fieldFunc, "f"); func(); - new (__classPrivateFieldGet(this, _A_fieldFunc))(); + new (__classPrivateFieldGet(this, _A_fieldFunc, "f"))(); const arr = [1, 2]; - __classPrivateFieldGet(this, _A_fieldFunc2).call(this, 0, ...arr, 3); - const b = new (__classPrivateFieldGet(this, _A_fieldFunc2))(0, ...arr, 3); - const str = __classPrivateFieldGet(this, _A_fieldFunc2).bind(this) `head${1}middle${2}tail`; - __classPrivateFieldGet((_b = this.getInstance()), _A_fieldFunc2).bind(_b) `test${1}and${2}`; + __classPrivateFieldGet(this, _A_fieldFunc2, "f").call(this, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(this, _A_fieldFunc2, "f"))(0, ...arr, 3); + const str = __classPrivateFieldGet(this, _A_fieldFunc2, "f").bind(this) `head${1}middle${2}tail`; + __classPrivateFieldGet((_b = this.getInstance()), _A_fieldFunc2, "f").bind(_b) `test${1}and${2}`; } getInstance() { return new A(); } } diff --git a/tests/baselines/reference/privateNameFieldDerivedClasses.js b/tests/baselines/reference/privateNameFieldDerivedClasses.js index 5b7d8adb9287b..a469e47df30b1 100644 --- a/tests/baselines/reference/privateNameFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameFieldDerivedClasses.js @@ -25,7 +25,7 @@ class Base { _Base_prop.set(this, 123); } static method(x) { - console.log(__classPrivateFieldGet(x, _Base_prop)); + console.log(__classPrivateFieldGet(x, _Base_prop, "f")); } } _Base_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js index d7ae4ace24f10..e81cf2550e0a0 100644 --- a/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameFieldDestructuredBinding(target=es2015).js @@ -38,13 +38,13 @@ class A { _A_field.set(this, 1); this.otherObject = new A(); let y; - (_b = this, { x: ({ set value(_m) { __classPrivateFieldSet(_b, _A_field, _m); } }).value, y } = this.testObject()); - (_c = this, [({ set value(_m) { __classPrivateFieldSet(_c, _A_field, _m); } }).value, y] = this.testArray()); - (_d = this, _e = this, { a: ({ set value(_m) { __classPrivateFieldSet(_d, _A_field, _m); } }).value, b: [({ set value(_m) { __classPrivateFieldSet(_e, _A_field, _m); } }).value] } = { a: 1, b: [2] }); - _f = this, _g = this, [({ set value(_m) { __classPrivateFieldSet(_f, _A_field, _m); } }).value, [({ set value(_m) { __classPrivateFieldSet(_g, _A_field, _m); } }).value]] = [1, [2]]; - (_h = this, _j = this, { a: ({ set value(_m) { __classPrivateFieldSet(_h, _A_field, _m); } }).value = 1, b: [({ set value(_m) { __classPrivateFieldSet(_j, _A_field, _m); } }).value = 1] } = { b: [] }); - _k = this, [({ set value(_m) { __classPrivateFieldSet(_k, _A_field, _m); } }).value = 2] = []; - _l = this.otherObject, [({ set value(_m) { __classPrivateFieldSet(_l, _A_field, _m); } }).value = 2] = []; + (_b = this, { x: ({ set value(_m) { __classPrivateFieldSet(_b, _A_field, _m, "f"); } }).value, y } = this.testObject()); + (_c = this, [({ set value(_m) { __classPrivateFieldSet(_c, _A_field, _m, "f"); } }).value, y] = this.testArray()); + (_d = this, _e = this, { a: ({ set value(_m) { __classPrivateFieldSet(_d, _A_field, _m, "f"); } }).value, b: [({ set value(_m) { __classPrivateFieldSet(_e, _A_field, _m, "f"); } }).value] } = { a: 1, b: [2] }); + _f = this, _g = this, [({ set value(_m) { __classPrivateFieldSet(_f, _A_field, _m, "f"); } }).value, [({ set value(_m) { __classPrivateFieldSet(_g, _A_field, _m, "f"); } }).value]] = [1, [2]]; + (_h = this, _j = this, { a: ({ set value(_m) { __classPrivateFieldSet(_h, _A_field, _m, "f"); } }).value = 1, b: [({ set value(_m) { __classPrivateFieldSet(_j, _A_field, _m, "f"); } }).value = 1] } = { b: [] }); + _k = this, [({ set value(_m) { __classPrivateFieldSet(_k, _A_field, _m, "f"); } }).value = 2] = []; + _l = this.otherObject, [({ set value(_m) { __classPrivateFieldSet(_l, _A_field, _m, "f"); } }).value = 2] = []; } testObject() { return { x: 10, y: 6 }; @@ -53,7 +53,7 @@ class A { return [10, 11]; } static test(_a) { - [({ set value(_b) { __classPrivateFieldSet(_a, _A_field, _b); } }).value] = [2]; + [({ set value(_b) { __classPrivateFieldSet(_a, _A_field, _b, "f"); } }).value] = [2]; } } _A_field = new WeakMap(); diff --git a/tests/baselines/reference/privateNameFieldUnaryMutation.js b/tests/baselines/reference/privateNameFieldUnaryMutation.js index 0ea369296adac..5ff58fdd5d68a 100644 --- a/tests/baselines/reference/privateNameFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameFieldUnaryMutation.js @@ -46,29 +46,29 @@ class C { constructor() { var _a, _b; _C_test.set(this, 24); - __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); - __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); - __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); - __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); - const a = (__classPrivateFieldSet(this, _C_test, (_a = +__classPrivateFieldGet(this, _C_test)) + 1), _a); - const b = (__classPrivateFieldSet(this, _C_test, (_b = +__classPrivateFieldGet(this, _C_test)) - 1), _b); - const c = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1); - const d = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) - 1); - for (__classPrivateFieldSet(this, _C_test, 0); __classPrivateFieldGet(this, _C_test) < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1)) { } - for (__classPrivateFieldSet(this, _C_test, 0); __classPrivateFieldGet(this, _C_test) < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test) + 1)) { } + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") + 1, "f"); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") - 1, "f"); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") + 1, "f"); + __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") - 1, "f"); + const a = (__classPrivateFieldSet(this, _C_test, (_a = +__classPrivateFieldGet(this, _C_test, "f")) + 1, "f"), _a); + const b = (__classPrivateFieldSet(this, _C_test, (_b = +__classPrivateFieldGet(this, _C_test, "f")) - 1, "f"), _b); + const c = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") + 1, "f"); + const d = __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") - 1, "f"); + for (__classPrivateFieldSet(this, _C_test, 0, "f"); __classPrivateFieldGet(this, _C_test, "f") < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") + 1, "f")) { } + for (__classPrivateFieldSet(this, _C_test, 0, "f"); __classPrivateFieldGet(this, _C_test, "f") < 10; __classPrivateFieldSet(this, _C_test, +__classPrivateFieldGet(this, _C_test, "f") + 1, "f")) { } } test() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; - __classPrivateFieldSet(_a = this.getInstance(), _C_test, +__classPrivateFieldGet(_a, _C_test) + 1); - __classPrivateFieldSet(_b = this.getInstance(), _C_test, +__classPrivateFieldGet(_b, _C_test) - 1); - __classPrivateFieldSet(_c = this.getInstance(), _C_test, +__classPrivateFieldGet(_c, _C_test) + 1); - __classPrivateFieldSet(_d = this.getInstance(), _C_test, +__classPrivateFieldGet(_d, _C_test) - 1); - const a = (__classPrivateFieldSet(_e = this.getInstance(), _C_test, (_f = +__classPrivateFieldGet(_e, _C_test)) + 1), _f); - const b = (__classPrivateFieldSet(_g = this.getInstance(), _C_test, (_h = +__classPrivateFieldGet(_g, _C_test)) - 1), _h); - const c = __classPrivateFieldSet(_j = this.getInstance(), _C_test, +__classPrivateFieldGet(_j, _C_test) + 1); - const d = __classPrivateFieldSet(_k = this.getInstance(), _C_test, +__classPrivateFieldGet(_k, _C_test) - 1); - for (__classPrivateFieldSet(this.getInstance(), _C_test, 0); __classPrivateFieldGet(this.getInstance(), _C_test) < 10; __classPrivateFieldSet(_l = this.getInstance(), _C_test, +__classPrivateFieldGet(_l, _C_test) + 1)) { } - for (__classPrivateFieldSet(this.getInstance(), _C_test, 0); __classPrivateFieldGet(this.getInstance(), _C_test) < 10; __classPrivateFieldSet(_m = this.getInstance(), _C_test, +__classPrivateFieldGet(_m, _C_test) + 1)) { } + __classPrivateFieldSet(_a = this.getInstance(), _C_test, +__classPrivateFieldGet(_a, _C_test, "f") + 1, "f"); + __classPrivateFieldSet(_b = this.getInstance(), _C_test, +__classPrivateFieldGet(_b, _C_test, "f") - 1, "f"); + __classPrivateFieldSet(_c = this.getInstance(), _C_test, +__classPrivateFieldGet(_c, _C_test, "f") + 1, "f"); + __classPrivateFieldSet(_d = this.getInstance(), _C_test, +__classPrivateFieldGet(_d, _C_test, "f") - 1, "f"); + const a = (__classPrivateFieldSet(_e = this.getInstance(), _C_test, (_f = +__classPrivateFieldGet(_e, _C_test, "f")) + 1, "f"), _f); + const b = (__classPrivateFieldSet(_g = this.getInstance(), _C_test, (_h = +__classPrivateFieldGet(_g, _C_test, "f")) - 1, "f"), _h); + const c = __classPrivateFieldSet(_j = this.getInstance(), _C_test, +__classPrivateFieldGet(_j, _C_test, "f") + 1, "f"); + const d = __classPrivateFieldSet(_k = this.getInstance(), _C_test, +__classPrivateFieldGet(_k, _C_test, "f") - 1, "f"); + for (__classPrivateFieldSet(this.getInstance(), _C_test, 0, "f"); __classPrivateFieldGet(this.getInstance(), _C_test, "f") < 10; __classPrivateFieldSet(_l = this.getInstance(), _C_test, +__classPrivateFieldGet(_l, _C_test, "f") + 1, "f")) { } + for (__classPrivateFieldSet(this.getInstance(), _C_test, 0, "f"); __classPrivateFieldGet(this.getInstance(), _C_test, "f") < 10; __classPrivateFieldSet(_m = this.getInstance(), _C_test, +__classPrivateFieldGet(_m, _C_test, "f") + 1, "f")) { } } getInstance() { return new C(); } } diff --git a/tests/baselines/reference/privateNameInLhsReceiverExpression.js b/tests/baselines/reference/privateNameInLhsReceiverExpression.js index f335acb32c029..91dc82f992e8c 100644 --- a/tests/baselines/reference/privateNameInLhsReceiverExpression.js +++ b/tests/baselines/reference/privateNameInLhsReceiverExpression.js @@ -35,7 +35,7 @@ class Test { } }, _x = new WeakMap(), - _a)).s], _Test_y, 1); + _a)).s], _Test_y, 1, "f"); __classPrivateFieldSet(_c = obj[(new (_b = class { constructor() { _x_1.set(this, 1); @@ -43,7 +43,7 @@ class Test { } }, _x_1 = new WeakMap(), - _b)).s], _Test_y, __classPrivateFieldGet(_c, _Test_y) + 1); + _b)).s], _Test_y, __classPrivateFieldGet(_c, _Test_y, "f") + 1, "f"); } } _Test_y = new WeakMap(); diff --git a/tests/baselines/reference/privateNameMethodClassExpression.js b/tests/baselines/reference/privateNameMethodClassExpression.js index 08bee9225835e..85523a2af7e2d 100644 --- a/tests/baselines/reference/privateNameMethodClassExpression.js +++ b/tests/baselines/reference/privateNameMethodClassExpression.js @@ -25,7 +25,7 @@ const C = (_a = class { _C_field.set(this, __classPrivateFieldGet(this, _C_instances, "m", _C_method).call(this)); } static getInstance() { return new C(); } - getField() { return __classPrivateFieldGet(this, _C_field); } + getField() { return __classPrivateFieldGet(this, _C_field, "f"); } ; }, _C_field = new WeakMap(), diff --git a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js index 598acfb16a403..f717f1d1801cc 100644 --- a/tests/baselines/reference/privateNameNestedClassFieldShadowing.js +++ b/tests/baselines/reference/privateNameNestedClassFieldShadowing.js @@ -31,10 +31,10 @@ class Base { _Derived_x.set(this, void 0); } testBase(x) { - console.log(__classPrivateFieldGet(x, _Derived_x)); + console.log(__classPrivateFieldGet(x, _Derived_x, "f")); } testDerived(x) { - console.log(__classPrivateFieldGet(x, _Derived_x)); + console.log(__classPrivateFieldGet(x, _Derived_x, "f")); } } _Derived_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.js b/tests/baselines/reference/privateNameNestedMethodAccess.js index e80fc49be6e90..2bdd57e019e76 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.js +++ b/tests/baselines/reference/privateNameNestedMethodAccess.js @@ -41,13 +41,13 @@ class C { return _a = class D { constructor() { _D_instances.add(this); - __classPrivateFieldGet(new C(), _C_foo); + __classPrivateFieldGet(new C(), _C_foo, "f"); __classPrivateFieldGet(new C(), _D_instances, "m", _D_bar); // Error __classPrivateFieldGet(new C(), _C_instances, "a", _C_baz_get); __classPrivateFieldGet(new D(), _D_instances, "m", _D_bar); } n(x) { - __classPrivateFieldGet(x, _C_foo); + __classPrivateFieldGet(x, _C_foo, "f"); __classPrivateFieldGet(x, _D_instances, "m", _D_bar); x.; // Error } diff --git a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js index 13a9847b775d4..b0f5eee7579e5 100644 --- a/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js +++ b/tests/baselines/reference/privateNameStaticAccessorsCallExpression.js @@ -46,5 +46,5 @@ class A { } static getClass() { return A; } } -_a = A, _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classPrivateFieldSet(A, _a, 10, void 0, _A_x); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; +_a = A, _A_fieldFunc_get = function _A_fieldFunc_get() { return function () { __classPrivateFieldSet(A, _a, 10, "f", _A_x); }; }, _A_fieldFunc2_get = function _A_fieldFunc2_get() { return function (a, ...b) { }; }; _A_x = { value: 1 }; diff --git a/tests/baselines/reference/privateNameStaticFieldAccess.js b/tests/baselines/reference/privateNameStaticFieldAccess.js index 7c9accb92a4e9..9c6e297cea9a8 100644 --- a/tests/baselines/reference/privateNameStaticFieldAccess.js +++ b/tests/baselines/reference/privateNameStaticFieldAccess.js @@ -17,8 +17,8 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _a, _A_myField; class A { constructor() { - console.log(__classPrivateFieldGet(A, _a, void 0, _A_myField)); //Ok - console.log(__classPrivateFieldGet(this, _a, void 0, _A_myField)); //Error + console.log(__classPrivateFieldGet(A, _a, "f", _A_myField)); //Ok + console.log(__classPrivateFieldGet(this, _a, "f", _A_myField)); //Error } } _a = A; diff --git a/tests/baselines/reference/privateNameStaticFieldAssignment.js b/tests/baselines/reference/privateNameStaticFieldAssignment.js index 5561dc1ce8492..9cb2ddab90a58 100644 --- a/tests/baselines/reference/privateNameStaticFieldAssignment.js +++ b/tests/baselines/reference/privateNameStaticFieldAssignment.js @@ -51,32 +51,32 @@ var _a, _A_field; class A { constructor() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0; - __classPrivateFieldSet(A, _a, 1, void 0, _A_field); - __classPrivateFieldSet(_b = A, _a, __classPrivateFieldGet(_b, _a, void 0, _A_field) + 2, void 0, _A_field); - __classPrivateFieldSet(_c = A, _a, __classPrivateFieldGet(_c, _a, void 0, _A_field) - 3, void 0, _A_field); - __classPrivateFieldSet(_d = A, _a, __classPrivateFieldGet(_d, _a, void 0, _A_field) / 4, void 0, _A_field); - __classPrivateFieldSet(_e = A, _a, __classPrivateFieldGet(_e, _a, void 0, _A_field) * 5, void 0, _A_field); - __classPrivateFieldSet(_f = A, _a, Math.pow(__classPrivateFieldGet(_f, _a, void 0, _A_field), 6), void 0, _A_field); - __classPrivateFieldSet(_g = A, _a, __classPrivateFieldGet(_g, _a, void 0, _A_field) % 7, void 0, _A_field); - __classPrivateFieldSet(_h = A, _a, __classPrivateFieldGet(_h, _a, void 0, _A_field) << 8, void 0, _A_field); - __classPrivateFieldSet(_j = A, _a, __classPrivateFieldGet(_j, _a, void 0, _A_field) >> 9, void 0, _A_field); - __classPrivateFieldSet(_k = A, _a, __classPrivateFieldGet(_k, _a, void 0, _A_field) >>> 10, void 0, _A_field); - __classPrivateFieldSet(_l = A, _a, __classPrivateFieldGet(_l, _a, void 0, _A_field) & 11, void 0, _A_field); - __classPrivateFieldSet(_m = A, _a, __classPrivateFieldGet(_m, _a, void 0, _A_field) | 12, void 0, _A_field); - __classPrivateFieldSet(_o = A, _a, __classPrivateFieldGet(_o, _a, void 0, _A_field) ^ 13, void 0, _A_field); - __classPrivateFieldSet(A.getClass(), _a, 1, void 0, _A_field); - __classPrivateFieldSet(_p = A.getClass(), _a, __classPrivateFieldGet(_p, _a, void 0, _A_field) + 2, void 0, _A_field); - __classPrivateFieldSet(_q = A.getClass(), _a, __classPrivateFieldGet(_q, _a, void 0, _A_field) - 3, void 0, _A_field); - __classPrivateFieldSet(_r = A.getClass(), _a, __classPrivateFieldGet(_r, _a, void 0, _A_field) / 4, void 0, _A_field); - __classPrivateFieldSet(_s = A.getClass(), _a, __classPrivateFieldGet(_s, _a, void 0, _A_field) * 5, void 0, _A_field); - __classPrivateFieldSet(_t = A.getClass(), _a, Math.pow(__classPrivateFieldGet(_t, _a, void 0, _A_field), 6), void 0, _A_field); - __classPrivateFieldSet(_u = A.getClass(), _a, __classPrivateFieldGet(_u, _a, void 0, _A_field) % 7, void 0, _A_field); - __classPrivateFieldSet(_v = A.getClass(), _a, __classPrivateFieldGet(_v, _a, void 0, _A_field) << 8, void 0, _A_field); - __classPrivateFieldSet(_w = A.getClass(), _a, __classPrivateFieldGet(_w, _a, void 0, _A_field) >> 9, void 0, _A_field); - __classPrivateFieldSet(_x = A.getClass(), _a, __classPrivateFieldGet(_x, _a, void 0, _A_field) >>> 10, void 0, _A_field); - __classPrivateFieldSet(_y = A.getClass(), _a, __classPrivateFieldGet(_y, _a, void 0, _A_field) & 11, void 0, _A_field); - __classPrivateFieldSet(_z = A.getClass(), _a, __classPrivateFieldGet(_z, _a, void 0, _A_field) | 12, void 0, _A_field); - __classPrivateFieldSet(_0 = A.getClass(), _a, __classPrivateFieldGet(_0, _a, void 0, _A_field) ^ 13, void 0, _A_field); + __classPrivateFieldSet(A, _a, 1, "f", _A_field); + __classPrivateFieldSet(_b = A, _a, __classPrivateFieldGet(_b, _a, "f", _A_field) + 2, "f", _A_field); + __classPrivateFieldSet(_c = A, _a, __classPrivateFieldGet(_c, _a, "f", _A_field) - 3, "f", _A_field); + __classPrivateFieldSet(_d = A, _a, __classPrivateFieldGet(_d, _a, "f", _A_field) / 4, "f", _A_field); + __classPrivateFieldSet(_e = A, _a, __classPrivateFieldGet(_e, _a, "f", _A_field) * 5, "f", _A_field); + __classPrivateFieldSet(_f = A, _a, Math.pow(__classPrivateFieldGet(_f, _a, "f", _A_field), 6), "f", _A_field); + __classPrivateFieldSet(_g = A, _a, __classPrivateFieldGet(_g, _a, "f", _A_field) % 7, "f", _A_field); + __classPrivateFieldSet(_h = A, _a, __classPrivateFieldGet(_h, _a, "f", _A_field) << 8, "f", _A_field); + __classPrivateFieldSet(_j = A, _a, __classPrivateFieldGet(_j, _a, "f", _A_field) >> 9, "f", _A_field); + __classPrivateFieldSet(_k = A, _a, __classPrivateFieldGet(_k, _a, "f", _A_field) >>> 10, "f", _A_field); + __classPrivateFieldSet(_l = A, _a, __classPrivateFieldGet(_l, _a, "f", _A_field) & 11, "f", _A_field); + __classPrivateFieldSet(_m = A, _a, __classPrivateFieldGet(_m, _a, "f", _A_field) | 12, "f", _A_field); + __classPrivateFieldSet(_o = A, _a, __classPrivateFieldGet(_o, _a, "f", _A_field) ^ 13, "f", _A_field); + __classPrivateFieldSet(A.getClass(), _a, 1, "f", _A_field); + __classPrivateFieldSet(_p = A.getClass(), _a, __classPrivateFieldGet(_p, _a, "f", _A_field) + 2, "f", _A_field); + __classPrivateFieldSet(_q = A.getClass(), _a, __classPrivateFieldGet(_q, _a, "f", _A_field) - 3, "f", _A_field); + __classPrivateFieldSet(_r = A.getClass(), _a, __classPrivateFieldGet(_r, _a, "f", _A_field) / 4, "f", _A_field); + __classPrivateFieldSet(_s = A.getClass(), _a, __classPrivateFieldGet(_s, _a, "f", _A_field) * 5, "f", _A_field); + __classPrivateFieldSet(_t = A.getClass(), _a, Math.pow(__classPrivateFieldGet(_t, _a, "f", _A_field), 6), "f", _A_field); + __classPrivateFieldSet(_u = A.getClass(), _a, __classPrivateFieldGet(_u, _a, "f", _A_field) % 7, "f", _A_field); + __classPrivateFieldSet(_v = A.getClass(), _a, __classPrivateFieldGet(_v, _a, "f", _A_field) << 8, "f", _A_field); + __classPrivateFieldSet(_w = A.getClass(), _a, __classPrivateFieldGet(_w, _a, "f", _A_field) >> 9, "f", _A_field); + __classPrivateFieldSet(_x = A.getClass(), _a, __classPrivateFieldGet(_x, _a, "f", _A_field) >>> 10, "f", _A_field); + __classPrivateFieldSet(_y = A.getClass(), _a, __classPrivateFieldGet(_y, _a, "f", _A_field) & 11, "f", _A_field); + __classPrivateFieldSet(_z = A.getClass(), _a, __classPrivateFieldGet(_z, _a, "f", _A_field) | 12, "f", _A_field); + __classPrivateFieldSet(_0 = A.getClass(), _a, __classPrivateFieldGet(_0, _a, "f", _A_field) ^ 13, "f", _A_field); } static getClass() { return A; diff --git a/tests/baselines/reference/privateNameStaticFieldCallExpression.js b/tests/baselines/reference/privateNameStaticFieldCallExpression.js index ca6f4817de647..e2c00c8905510 100644 --- a/tests/baselines/reference/privateNameStaticFieldCallExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldCallExpression.js @@ -34,16 +34,16 @@ class A { test() { var _b; var _c; - __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc).call(A); - (_b = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc)) === null || _b === void 0 ? void 0 : _b.call(A); - const func = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc); + __classPrivateFieldGet(A, _a, "f", _A_fieldFunc).call(A); + (_b = __classPrivateFieldGet(A, _a, "f", _A_fieldFunc)) === null || _b === void 0 ? void 0 : _b.call(A); + const func = __classPrivateFieldGet(A, _a, "f", _A_fieldFunc); func(); - new (__classPrivateFieldGet(A, _a, void 0, _A_fieldFunc))(); + new (__classPrivateFieldGet(A, _a, "f", _A_fieldFunc))(); const arr = [1, 2]; - __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2).call(A, 0, ...arr, 3); - const b = new (__classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2))(0, ...arr, 3); - const str = __classPrivateFieldGet(A, _a, void 0, _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; - __classPrivateFieldGet((_c = this.getClass()), _a, void 0, _A_fieldFunc2).bind(_c) `test${1}and${2}`; + __classPrivateFieldGet(A, _a, "f", _A_fieldFunc2).call(A, 0, ...arr, 3); + const b = new (__classPrivateFieldGet(A, _a, "f", _A_fieldFunc2))(0, ...arr, 3); + const str = __classPrivateFieldGet(A, _a, "f", _A_fieldFunc2).bind(A) `head${1}middle${2}tail`; + __classPrivateFieldGet((_c = this.getClass()), _a, "f", _A_fieldFunc2).bind(_c) `test${1}and${2}`; } getClass() { return A; } } diff --git a/tests/baselines/reference/privateNameStaticFieldClassExpression.js b/tests/baselines/reference/privateNameStaticFieldClassExpression.js index f7029035947ff..7b159cdaebed2 100644 --- a/tests/baselines/reference/privateNameStaticFieldClassExpression.js +++ b/tests/baselines/reference/privateNameStaticFieldClassExpression.js @@ -31,9 +31,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _a, _B_foo, _B_foo2, _b, _c; class B { m() { - console.log(__classPrivateFieldGet(B, _a, void 0, _B_foo).test); - __classPrivateFieldGet(B, _a, void 0, _B_foo).test = 10; - new (__classPrivateFieldGet(B, _a, void 0, _B_foo))().field; + console.log(__classPrivateFieldGet(B, _a, "f", _B_foo).test); + __classPrivateFieldGet(B, _a, "f", _B_foo).test = 10; + new (__classPrivateFieldGet(B, _a, "f", _B_foo))().field; } } _a = B; @@ -41,7 +41,7 @@ _B_foo = { value: (_b = class { constructor() { this.field = 10; console.log("hello"); - new (__classPrivateFieldGet(B, _a, void 0, _B_foo2))(); + new (__classPrivateFieldGet(B, _a, "f", _B_foo2))(); } }, _b.test = 123, diff --git a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js index 69c22f9523292..8b9a8f45bbced 100644 --- a/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js +++ b/tests/baselines/reference/privateNameStaticFieldDerivedClasses.js @@ -33,14 +33,14 @@ class Base { static method(x) { Derived.; // error __classPrivateFieldSet(// error - Base, _a, 10, void 0, _Base_prop); + Base, _a, 10, "f", _Base_prop); } } _a = Base; _Base_prop = { value: 123 }; class Derived extends Base { static method(x) { - __classPrivateFieldGet(Derived, _b, void 0, _Derived_derivedProp); + __classPrivateFieldGet(Derived, _b, "f", _Derived_derivedProp); Base. = 10; // error } } diff --git a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js index d8295ab570489..f5ddbe3a7856a 100644 --- a/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js +++ b/tests/baselines/reference/privateNameStaticFieldDestructuredBinding(target=es2015).js @@ -37,13 +37,13 @@ class A { var _c; this.otherClass = A; let y; - ({ x: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, y } = this.testObject()); - ([({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, y] = this.testArray()); - ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value] } = { a: 1, b: [2] }); - [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value, [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value]] = [1, [2]]; - ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 1, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 1] } = { b: [] }); - [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, void 0, _A_field); } }).value = 2] = []; - _c = this.otherClass, [({ set value(_b) { __classPrivateFieldSet(_c, _b, _b, void 0, _A_field); } }).value = 2] = []; + ({ x: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value, y } = this.testObject()); + ([({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value, y] = this.testArray()); + ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value] } = { a: 1, b: [2] }); + [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value, [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value]] = [1, [2]]; + ({ a: ({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value = 1, b: [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value = 1] } = { b: [] }); + [({ set value(_b) { __classPrivateFieldSet(A, _b, _b, "f", _A_field); } }).value = 2] = []; + _c = this.otherClass, [({ set value(_b) { __classPrivateFieldSet(_c, _b, _b, "f", _A_field); } }).value = 2] = []; } testObject() { return { x: 10, y: 6 }; @@ -52,7 +52,7 @@ class A { return [10, 11]; } static test(_a) { - [({ set value(_c) { __classPrivateFieldSet(_a, _b, _c, void 0, _A_field); } }).value] = [2]; + [({ set value(_c) { __classPrivateFieldSet(_a, _b, _c, "f", _A_field); } }).value] = [2]; } } _b = A; diff --git a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js index da157d2d83a2b..810c3df10b50c 100644 --- a/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js +++ b/tests/baselines/reference/privateNameStaticFieldUnaryMutation.js @@ -45,29 +45,29 @@ var _a, _C_test; class C { constructor() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - __classPrivateFieldSet(_b = C, _a, +__classPrivateFieldGet(_b, _a, void 0, _C_test) + 1, void 0, _C_test); - __classPrivateFieldSet(_c = C, _a, +__classPrivateFieldGet(_c, _a, void 0, _C_test) - 1, void 0, _C_test); - __classPrivateFieldSet(_d = C, _a, +__classPrivateFieldGet(_d, _a, void 0, _C_test) + 1, void 0, _C_test); - __classPrivateFieldSet(_e = C, _a, +__classPrivateFieldGet(_e, _a, void 0, _C_test) - 1, void 0, _C_test); - const a = (__classPrivateFieldSet(_f = C, _a, (_g = +__classPrivateFieldGet(_f, _a, void 0, _C_test)) + 1, void 0, _C_test), _g); - const b = (__classPrivateFieldSet(_h = C, _a, (_j = +__classPrivateFieldGet(_h, _a, void 0, _C_test)) - 1, void 0, _C_test), _j); - const c = __classPrivateFieldSet(_k = C, _a, +__classPrivateFieldGet(_k, _a, void 0, _C_test) + 1, void 0, _C_test); - const d = __classPrivateFieldSet(_l = C, _a, +__classPrivateFieldGet(_l, _a, void 0, _C_test) - 1, void 0, _C_test); - for (__classPrivateFieldSet(C, _a, 0, void 0, _C_test); __classPrivateFieldGet(C, _a, void 0, _C_test) < 10; __classPrivateFieldSet(_m = C, _a, +__classPrivateFieldGet(_m, _a, void 0, _C_test) + 1, void 0, _C_test)) { } - for (__classPrivateFieldSet(C, _a, 0, void 0, _C_test); __classPrivateFieldGet(C, _a, void 0, _C_test) < 10; __classPrivateFieldSet(_o = C, _a, +__classPrivateFieldGet(_o, _a, void 0, _C_test) + 1, void 0, _C_test)) { } + __classPrivateFieldSet(_b = C, _a, +__classPrivateFieldGet(_b, _a, "f", _C_test) + 1, "f", _C_test); + __classPrivateFieldSet(_c = C, _a, +__classPrivateFieldGet(_c, _a, "f", _C_test) - 1, "f", _C_test); + __classPrivateFieldSet(_d = C, _a, +__classPrivateFieldGet(_d, _a, "f", _C_test) + 1, "f", _C_test); + __classPrivateFieldSet(_e = C, _a, +__classPrivateFieldGet(_e, _a, "f", _C_test) - 1, "f", _C_test); + const a = (__classPrivateFieldSet(_f = C, _a, (_g = +__classPrivateFieldGet(_f, _a, "f", _C_test)) + 1, "f", _C_test), _g); + const b = (__classPrivateFieldSet(_h = C, _a, (_j = +__classPrivateFieldGet(_h, _a, "f", _C_test)) - 1, "f", _C_test), _j); + const c = __classPrivateFieldSet(_k = C, _a, +__classPrivateFieldGet(_k, _a, "f", _C_test) + 1, "f", _C_test); + const d = __classPrivateFieldSet(_l = C, _a, +__classPrivateFieldGet(_l, _a, "f", _C_test) - 1, "f", _C_test); + for (__classPrivateFieldSet(C, _a, 0, "f", _C_test); __classPrivateFieldGet(C, _a, "f", _C_test) < 10; __classPrivateFieldSet(_m = C, _a, +__classPrivateFieldGet(_m, _a, "f", _C_test) + 1, "f", _C_test)) { } + for (__classPrivateFieldSet(C, _a, 0, "f", _C_test); __classPrivateFieldGet(C, _a, "f", _C_test) < 10; __classPrivateFieldSet(_o = C, _a, +__classPrivateFieldGet(_o, _a, "f", _C_test) + 1, "f", _C_test)) { } } test() { var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; - __classPrivateFieldSet(_b = this.getClass(), _a, +__classPrivateFieldGet(_b, _a, void 0, _C_test) + 1, void 0, _C_test); - __classPrivateFieldSet(_c = this.getClass(), _a, +__classPrivateFieldGet(_c, _a, void 0, _C_test) - 1, void 0, _C_test); - __classPrivateFieldSet(_d = this.getClass(), _a, +__classPrivateFieldGet(_d, _a, void 0, _C_test) + 1, void 0, _C_test); - __classPrivateFieldSet(_e = this.getClass(), _a, +__classPrivateFieldGet(_e, _a, void 0, _C_test) - 1, void 0, _C_test); - const a = (__classPrivateFieldSet(_f = this.getClass(), _a, (_g = +__classPrivateFieldGet(_f, _a, void 0, _C_test)) + 1, void 0, _C_test), _g); - const b = (__classPrivateFieldSet(_h = this.getClass(), _a, (_j = +__classPrivateFieldGet(_h, _a, void 0, _C_test)) - 1, void 0, _C_test), _j); - const c = __classPrivateFieldSet(_k = this.getClass(), _a, +__classPrivateFieldGet(_k, _a, void 0, _C_test) + 1, void 0, _C_test); - const d = __classPrivateFieldSet(_l = this.getClass(), _a, +__classPrivateFieldGet(_l, _a, void 0, _C_test) - 1, void 0, _C_test); - for (__classPrivateFieldSet(this.getClass(), _a, 0, void 0, _C_test); __classPrivateFieldGet(this.getClass(), _a, void 0, _C_test) < 10; __classPrivateFieldSet(_m = this.getClass(), _a, +__classPrivateFieldGet(_m, _a, void 0, _C_test) + 1, void 0, _C_test)) { } - for (__classPrivateFieldSet(this.getClass(), _a, 0, void 0, _C_test); __classPrivateFieldGet(this.getClass(), _a, void 0, _C_test) < 10; __classPrivateFieldSet(_o = this.getClass(), _a, +__classPrivateFieldGet(_o, _a, void 0, _C_test) + 1, void 0, _C_test)) { } + __classPrivateFieldSet(_b = this.getClass(), _a, +__classPrivateFieldGet(_b, _a, "f", _C_test) + 1, "f", _C_test); + __classPrivateFieldSet(_c = this.getClass(), _a, +__classPrivateFieldGet(_c, _a, "f", _C_test) - 1, "f", _C_test); + __classPrivateFieldSet(_d = this.getClass(), _a, +__classPrivateFieldGet(_d, _a, "f", _C_test) + 1, "f", _C_test); + __classPrivateFieldSet(_e = this.getClass(), _a, +__classPrivateFieldGet(_e, _a, "f", _C_test) - 1, "f", _C_test); + const a = (__classPrivateFieldSet(_f = this.getClass(), _a, (_g = +__classPrivateFieldGet(_f, _a, "f", _C_test)) + 1, "f", _C_test), _g); + const b = (__classPrivateFieldSet(_h = this.getClass(), _a, (_j = +__classPrivateFieldGet(_h, _a, "f", _C_test)) - 1, "f", _C_test), _j); + const c = __classPrivateFieldSet(_k = this.getClass(), _a, +__classPrivateFieldGet(_k, _a, "f", _C_test) + 1, "f", _C_test); + const d = __classPrivateFieldSet(_l = this.getClass(), _a, +__classPrivateFieldGet(_l, _a, "f", _C_test) - 1, "f", _C_test); + for (__classPrivateFieldSet(this.getClass(), _a, 0, "f", _C_test); __classPrivateFieldGet(this.getClass(), _a, "f", _C_test) < 10; __classPrivateFieldSet(_m = this.getClass(), _a, +__classPrivateFieldGet(_m, _a, "f", _C_test) + 1, "f", _C_test)) { } + for (__classPrivateFieldSet(this.getClass(), _a, 0, "f", _C_test); __classPrivateFieldGet(this.getClass(), _a, "f", _C_test) < 10; __classPrivateFieldSet(_o = this.getClass(), _a, +__classPrivateFieldGet(_o, _a, "f", _C_test) + 1, "f", _C_test)) { } } getClass() { return C; } } diff --git a/tests/baselines/reference/privateNameStaticMethodClassExpression.js b/tests/baselines/reference/privateNameStaticMethodClassExpression.js index bd873a33fcdd4..cca04691e0928 100644 --- a/tests/baselines/reference/privateNameStaticMethodClassExpression.js +++ b/tests/baselines/reference/privateNameStaticMethodClassExpression.js @@ -21,7 +21,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _a, _D_field, _D_method; const C = (_a = class D { static getClass() { return D; } - static getField() { return __classPrivateFieldGet(C, _a, void 0, _D_field); } + static getField() { return __classPrivateFieldGet(C, _a, "f", _D_field); } ; }, _D_method = function _D_method() { return 42; }, diff --git a/tests/baselines/reference/privateNamesAndFields.js b/tests/baselines/reference/privateNamesAndFields.js index 519a63909a276..69beae57f5d64 100644 --- a/tests/baselines/reference/privateNamesAndFields.js +++ b/tests/baselines/reference/privateNamesAndFields.js @@ -27,7 +27,7 @@ var _A_foo, _B_foo; class A { constructor() { _A_foo.set(this, void 0); - __classPrivateFieldSet(this, _A_foo, 3); + __classPrivateFieldSet(this, _A_foo, 3, "f"); } } _A_foo = new WeakMap(); @@ -35,7 +35,7 @@ class B extends A { constructor() { super(); _B_foo.set(this, void 0); - __classPrivateFieldSet(this, _B_foo, "some string"); + __classPrivateFieldSet(this, _B_foo, "some string", "f"); } } _B_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesAndGenericClasses-2.js b/tests/baselines/reference/privateNamesAndGenericClasses-2.js index 66a4fdac2208c..8e0d5c27c5619 100644 --- a/tests/baselines/reference/privateNamesAndGenericClasses-2.js +++ b/tests/baselines/reference/privateNamesAndGenericClasses-2.js @@ -45,18 +45,18 @@ class C { constructor(t) { _C_instances.add(this); _C_foo.set(this, void 0); - __classPrivateFieldSet(this, _C_foo, t); + __classPrivateFieldSet(this, _C_foo, t, "f"); t = __classPrivateFieldGet(this, _C_instances, "m", _C_bar).call(this); } set baz(t) { - __classPrivateFieldSet(this, _C_foo, t); + __classPrivateFieldSet(this, _C_foo, t, "f"); } get baz() { - return __classPrivateFieldGet(this, _C_foo); + return __classPrivateFieldGet(this, _C_foo, "f"); } } _C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_bar = function _C_bar() { - return __classPrivateFieldGet(this, _C_foo); + return __classPrivateFieldGet(this, _C_foo, "f"); }; let a = new C(3); let b = new C("hello"); diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index f182735068847..a9bba00f8e17a 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -38,9 +38,9 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _a, _A_foo, _A_bar, _b, _B_foo; class A { constructor() { - __classPrivateFieldSet(A, _a, 3, void 0, _A_foo); - __classPrivateFieldGet(B, _a, void 0, _A_foo); // Error - __classPrivateFieldGet(B, _a, void 0, _A_bar); // Error + __classPrivateFieldSet(A, _a, 3, "f", _A_foo); + __classPrivateFieldGet(B, _a, "f", _A_foo); // Error + __classPrivateFieldGet(B, _a, "f", _A_bar); // Error } } _a = A; @@ -49,7 +49,7 @@ _A_bar = { value: void 0 }; class B extends A { constructor() { super(); - __classPrivateFieldSet(B, _b, "some string", void 0, _B_foo); + __classPrivateFieldSet(B, _b, "some string", "f", _B_foo); } } _b = B; diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index 958df88562dff..cb4c1076945af 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -26,8 +26,8 @@ class Parent { _Parent_foo.set(this, 3); } accessChildProps() { - __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _a, void 0, _Parent_bar); // Error: not found + __classPrivateFieldGet(new Child(), _Parent_foo, "f"); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) + __classPrivateFieldGet(Child, _a, "f", _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index 3970efe16f821..80e569c8ab7bc 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -28,8 +28,8 @@ class Parent { _Parent_foo.set(this, 3); } accessChildProps() { - __classPrivateFieldGet(new Child(), _Parent_foo); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _a, void 0, _Parent_bar); // Error: not found + __classPrivateFieldGet(new Child(), _Parent_foo, "f"); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) + __classPrivateFieldGet(Child, _a, "f", _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesInGenericClasses.js b/tests/baselines/reference/privateNamesInGenericClasses.js index 718ceefe54797..6817e938884e5 100644 --- a/tests/baselines/reference/privateNamesInGenericClasses.js +++ b/tests/baselines/reference/privateNamesInGenericClasses.js @@ -46,17 +46,17 @@ class C { _C_instances.add(this); _C_foo.set(this, void 0); } - bar(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + bar(x) { return __classPrivateFieldGet(x, _C_foo, "f"); } // OK bar2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method).call(x); } // OK bar3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK - baz(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + baz(x) { return __classPrivateFieldGet(x, _C_foo, "f"); } // OK baz2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method); } // OK baz3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK - quux(x) { return __classPrivateFieldGet(x, _C_foo); } // OK + quux(x) { return __classPrivateFieldGet(x, _C_foo, "f"); } // OK quux2(x) { return __classPrivateFieldGet(x, _C_instances, "m", _C_method); } // OK quux3(x) { return __classPrivateFieldGet(x, _C_instances, "a", _C_prop_get); } // OK } -_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_get = function _C_prop_get() { return __classPrivateFieldGet(this, _C_foo); }, _C_prop_set = function _C_prop_set(value) { __classPrivateFieldSet(this, _C_foo, value); }; +_C_foo = new WeakMap(), _C_instances = new WeakSet(), _C_method = function _C_method() { return __classPrivateFieldGet(this, _C_foo, "f"); }, _C_prop_get = function _C_prop_get() { return __classPrivateFieldGet(this, _C_foo, "f"); }, _C_prop_set = function _C_prop_set(value) { __classPrivateFieldSet(this, _C_foo, value, "f"); }; a.; // Error a.; // Error a.; // Error diff --git a/tests/baselines/reference/privateNamesInNestedClasses-1.js b/tests/baselines/reference/privateNamesInNestedClasses-1.js index 3554cd45da4bc..a40651375293d 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-1.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-1.js @@ -46,13 +46,13 @@ class A { _B_foo.set(this, "B's #foo"); } bar(a) { - __classPrivateFieldGet(a, _B_foo); // OK, no compile-time error, don't know what `a` is + __classPrivateFieldGet(a, _B_foo, "f"); // OK, no compile-time error, don't know what `a` is } baz(a) { - __classPrivateFieldGet(a, _B_foo); // compile-time error, shadowed + __classPrivateFieldGet(a, _B_foo, "f"); // compile-time error, shadowed } quux(b) { - __classPrivateFieldGet(b, _B_foo); // OK + __classPrivateFieldGet(b, _B_foo, "f"); // OK } } _B_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesInNestedClasses-2.js b/tests/baselines/reference/privateNamesInNestedClasses-2.js index 70b07da3dcced..6b879f0c55cd1 100644 --- a/tests/baselines/reference/privateNamesInNestedClasses-2.js +++ b/tests/baselines/reference/privateNamesInNestedClasses-2.js @@ -32,7 +32,7 @@ class A { _B_x.set(this, 5); class C { constructor() { - __classPrivateFieldGet(A, _B_x); // error + __classPrivateFieldGet(A, _B_x, "f"); // error } } } diff --git a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js index 1784f7de35d04..d43aaaa1b27b9 100644 --- a/tests/baselines/reference/privateNamesInterfaceExtendingClass.js +++ b/tests/baselines/reference/privateNamesInterfaceExtendingClass.js @@ -26,7 +26,7 @@ class C { _C_prop.set(this, void 0); } func(x) { - __classPrivateFieldSet(x, _C_prop, 123); + __classPrivateFieldSet(x, _C_prop, 123, "f"); } } _C_prop = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesNoDelete.js b/tests/baselines/reference/privateNamesNoDelete.js index 0828a447b9d9c..dc60d87edec5b 100644 --- a/tests/baselines/reference/privateNamesNoDelete.js +++ b/tests/baselines/reference/privateNamesNoDelete.js @@ -18,7 +18,7 @@ var _A_v; class A { constructor() { _A_v.set(this, 1); - delete __classPrivateFieldGet(this, _A_v); // Error: The operand of a delete operator cannot be a private name. + delete __classPrivateFieldGet(this, _A_v, "f"); // Error: The operand of a delete operator cannot be a private name. } } _A_v = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesUnique-2.js b/tests/baselines/reference/privateNamesUnique-2.js index 380159d4fe5a6..563007f6b8083 100644 --- a/tests/baselines/reference/privateNamesUnique-2.js +++ b/tests/baselines/reference/privateNamesUnique-2.js @@ -42,7 +42,7 @@ export class Foo { _Foo_x.set(this, void 0); } copy(other) { - __classPrivateFieldGet(other, _Foo_x); // error + __classPrivateFieldGet(other, _Foo_x, "f"); // error } } _Foo_x = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesUnique-3.js b/tests/baselines/reference/privateNamesUnique-3.js index c12ac22c347d9..0447e3cf6f852 100644 --- a/tests/baselines/reference/privateNamesUnique-3.js +++ b/tests/baselines/reference/privateNamesUnique-3.js @@ -33,7 +33,7 @@ _a = A, _A_foo = new WeakMap(); _A_foo_1 = { value: true }; // error (duplicate) class B { test(x) { - __classPrivateFieldGet(x, _b, void 0, _B_foo); // error (#foo is a static property on B, not an instance property) + __classPrivateFieldGet(x, _b, "f", _B_foo); // error (#foo is a static property on B, not an instance property) } } _b = B; diff --git a/tests/baselines/reference/privateNamesUseBeforeDef.js b/tests/baselines/reference/privateNamesUseBeforeDef.js index c250d4cc2c50a..3521d28206b07 100644 --- a/tests/baselines/reference/privateNamesUseBeforeDef.js +++ b/tests/baselines/reference/privateNamesUseBeforeDef.js @@ -29,7 +29,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var _A_foo, _A_bar, _A2_instances, _A2_foo, _A2_bar, _A3_instances, _A3_foo, _A3_bar_get, _B_foo, _B_bar; class A { constructor() { - _A_foo.set(this, __classPrivateFieldGet(this, _A_bar)); // Error + _A_foo.set(this, __classPrivateFieldGet(this, _A_bar, "f")); // Error _A_bar.set(this, 3); } } @@ -52,8 +52,8 @@ class A3 { _A3_foo = new WeakMap(), _A3_instances = new WeakSet(), _A3_bar_get = function _A3_bar_get() { return 3; }; class B { constructor() { - _B_foo.set(this, __classPrivateFieldGet(this, _B_bar)); // Error - _B_bar.set(this, __classPrivateFieldGet(this, _B_foo)); + _B_foo.set(this, __classPrivateFieldGet(this, _B_bar, "f")); // Error + _B_bar.set(this, __classPrivateFieldGet(this, _B_foo, "f")); } } _B_foo = new WeakMap(), _B_bar = new WeakMap(); diff --git a/tests/baselines/reference/strictPropertyInitialization.js b/tests/baselines/reference/strictPropertyInitialization.js index 0d74861983dec..30867a3773de1 100644 --- a/tests/baselines/reference/strictPropertyInitialization.js +++ b/tests/baselines/reference/strictPropertyInitialization.js @@ -178,7 +178,7 @@ class C5 { constructor() { _C5_b.set(this, void 0); this.a = 0; - __classPrivateFieldSet(this, _C5_b, 0); + __classPrivateFieldSet(this, _C5_b, 0, "f"); } } _C5_b = new WeakMap(); @@ -190,7 +190,7 @@ class C6 { return; } this.a = 0; - __classPrivateFieldSet(this, _C6_b, 0); + __classPrivateFieldSet(this, _C6_b, 0, "f"); } } _C6_b = new WeakMap(); @@ -199,11 +199,11 @@ class C7 { _C7_b.set(this, void 0); if (cond) { this.a = 1; - __classPrivateFieldSet(this, _C7_b, 1); + __classPrivateFieldSet(this, _C7_b, 1, "f"); return; } this.a = 0; - __classPrivateFieldSet(this, _C7_b, 1); + __classPrivateFieldSet(this, _C7_b, 1, "f"); } } _C7_b = new WeakMap(); @@ -220,9 +220,9 @@ class C10 { _C10_d.set(this, void 0); let x = this.a; // Error this.a = this.b; // Error - this.b = __classPrivateFieldGet(this, _C10_d); //Error + this.b = __classPrivateFieldGet(this, _C10_d, "f"); //Error this.b = x; - __classPrivateFieldSet(this, _C10_d, x); + __classPrivateFieldSet(this, _C10_d, x, "f"); let y = this.c; } } @@ -231,7 +231,7 @@ class C11 { constructor() { _C11_b.set(this, void 0); this.a = someValue(); - __classPrivateFieldSet(this, _C11_b, someValue()); + __classPrivateFieldSet(this, _C11_b, someValue(), "f"); } } _C11_b = new WeakMap(); From 55a70975475532a666a964b48b7a3a7a8d2c22ff Mon Sep 17 00:00:00 2001 From: Kubilay Kahveci Date: Thu, 18 Mar 2021 15:24:22 +0000 Subject: [PATCH 62/68] do not clone the receiver (#57) --- src/compiler/transformers/classFields.ts | 4 +--- tests/baselines/reference/privateNameAndAny.js | 6 ++++-- tests/baselines/reference/privateNameMethod.js | 3 ++- tests/baselines/reference/privateNameNestedMethodAccess.js | 3 ++- tests/baselines/reference/privateNameStaticMethod.js | 3 ++- tests/baselines/reference/privateNamesAndStaticFields.js | 3 ++- tests/baselines/reference/privateNamesConstructorChain-1.js | 3 ++- tests/baselines/reference/privateNamesConstructorChain-2.js | 3 ++- tests/baselines/reference/privateStaticNameShadowing.js | 3 ++- 9 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 23544963ccde5..84a1f32c6f943 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -326,9 +326,7 @@ namespace ts { } function createPrivateIdentifierAccess(info: PrivateIdentifierInfo, receiver: Expression): Expression { - receiver = visitNode(receiver, visitor, isExpression); - const synthesizedReceiver = nodeIsSynthesized(receiver) ? receiver : factory.cloneNode(receiver); - return createPrivateIdentifierAccessHelper(info, synthesizedReceiver); + return createPrivateIdentifierAccessHelper(info, visitNode(receiver, visitor, isExpression)); } function createPrivateIdentifierAccessHelper(info: PrivateIdentifierInfo, receiver: Expression): Expression { diff --git a/tests/baselines/reference/privateNameAndAny.js b/tests/baselines/reference/privateNameAndAny.js index 210f8cceb9478..805039736409c 100644 --- a/tests/baselines/reference/privateNameAndAny.js +++ b/tests/baselines/reference/privateNameAndAny.js @@ -41,11 +41,13 @@ class A { } method(thing) { __classPrivateFieldGet(thing, _A_foo, "f"); // OK - __classPrivateFieldGet(thing, _a, "m", _A_m).call(// OK + __classPrivateFieldGet(// OK + thing, _a, "m", _A_m).call(// OK thing); __classPrivateFieldGet(thing, _a, "f", _A_baz); thing.; // Error - __classPrivateFieldGet(thing, _A_foo, "f").call(// Error + __classPrivateFieldGet(// Error + thing, _A_foo, "f").call(// Error thing); } methodU(thing) { diff --git a/tests/baselines/reference/privateNameMethod.js b/tests/baselines/reference/privateNameMethod.js index 5f2ec20469a81..11915e5eaea28 100644 --- a/tests/baselines/reference/privateNameMethod.js +++ b/tests/baselines/reference/privateNameMethod.js @@ -25,7 +25,8 @@ class A1 { _A1_instances.add(this); __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(this, ""); __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(this, 1); // Error - __classPrivateFieldGet(this, _A1_instances, "m", _A1_method).call(// Error + __classPrivateFieldGet(// Error + this, _A1_instances, "m", _A1_method).call(// Error this); // Error } } diff --git a/tests/baselines/reference/privateNameNestedMethodAccess.js b/tests/baselines/reference/privateNameNestedMethodAccess.js index 2bdd57e019e76..aa22d016ad0fd 100644 --- a/tests/baselines/reference/privateNameNestedMethodAccess.js +++ b/tests/baselines/reference/privateNameNestedMethodAccess.js @@ -43,7 +43,8 @@ class C { _D_instances.add(this); __classPrivateFieldGet(new C(), _C_foo, "f"); __classPrivateFieldGet(new C(), _D_instances, "m", _D_bar); // Error - __classPrivateFieldGet(new C(), _C_instances, "a", _C_baz_get); + __classPrivateFieldGet(// Error + new C(), _C_instances, "a", _C_baz_get); __classPrivateFieldGet(new D(), _D_instances, "m", _D_bar); } n(x) { diff --git a/tests/baselines/reference/privateNameStaticMethod.js b/tests/baselines/reference/privateNameStaticMethod.js index 38bc0e54b0b7a..0274884d235e8 100644 --- a/tests/baselines/reference/privateNameStaticMethod.js +++ b/tests/baselines/reference/privateNameStaticMethod.js @@ -24,7 +24,8 @@ class A1 { constructor() { __classPrivateFieldGet(A1, _a, "m", _A1_method).call(A1, ""); __classPrivateFieldGet(A1, _a, "m", _A1_method).call(A1, 1); // Error - __classPrivateFieldGet(A1, _a, "m", _A1_method).call(// Error + __classPrivateFieldGet(// Error + A1, _a, "m", _A1_method).call(// Error A1); // Error } } diff --git a/tests/baselines/reference/privateNamesAndStaticFields.js b/tests/baselines/reference/privateNamesAndStaticFields.js index a9bba00f8e17a..0ba4bd832d501 100644 --- a/tests/baselines/reference/privateNamesAndStaticFields.js +++ b/tests/baselines/reference/privateNamesAndStaticFields.js @@ -40,7 +40,8 @@ class A { constructor() { __classPrivateFieldSet(A, _a, 3, "f", _A_foo); __classPrivateFieldGet(B, _a, "f", _A_foo); // Error - __classPrivateFieldGet(B, _a, "f", _A_bar); // Error + __classPrivateFieldGet(// Error + B, _a, "f", _A_bar); // Error } } _a = A; diff --git a/tests/baselines/reference/privateNamesConstructorChain-1.js b/tests/baselines/reference/privateNamesConstructorChain-1.js index cb4c1076945af..abde705d8bbb2 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-1.js +++ b/tests/baselines/reference/privateNamesConstructorChain-1.js @@ -27,7 +27,8 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo, "f"); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _a, "f", _Parent_bar); // Error: not found + __classPrivateFieldGet(// OK (`#foo` was added when `Parent`'s constructor was called on `child`) + Child, _a, "f", _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateNamesConstructorChain-2.js b/tests/baselines/reference/privateNamesConstructorChain-2.js index 80e569c8ab7bc..9f1341b8fb382 100644 --- a/tests/baselines/reference/privateNamesConstructorChain-2.js +++ b/tests/baselines/reference/privateNamesConstructorChain-2.js @@ -29,7 +29,8 @@ class Parent { } accessChildProps() { __classPrivateFieldGet(new Child(), _Parent_foo, "f"); // OK (`#foo` was added when `Parent`'s constructor was called on `child`) - __classPrivateFieldGet(Child, _a, "f", _Parent_bar); // Error: not found + __classPrivateFieldGet(// OK (`#foo` was added when `Parent`'s constructor was called on `child`) + Child, _a, "f", _Parent_bar); // Error: not found } } _a = Parent, _Parent_foo = new WeakMap(); diff --git a/tests/baselines/reference/privateStaticNameShadowing.js b/tests/baselines/reference/privateStaticNameShadowing.js index 4959e2fec893b..fd61fae53faeb 100644 --- a/tests/baselines/reference/privateStaticNameShadowing.js +++ b/tests/baselines/reference/privateStaticNameShadowing.js @@ -28,7 +28,8 @@ class X { _b = X, _X_m = function _X_m() { const X = {}; // shadow the class const _a = {}; // shadow the first generated var - __classPrivateFieldGet(X, _b, "m", _X_m).call(// shadow the first generated var + __classPrivateFieldGet(// shadow the first generated var + X, _b, "m", _X_m).call(// shadow the first generated var X); // Should check with X as the receiver with _b as the class constructor return 1; }; From 7463517ce22cd28f76bf564f425a984fb0a52af0 Mon Sep 17 00:00:00 2001 From: Wenlu Wang Date: Fri, 19 Mar 2021 14:26:54 +0800 Subject: [PATCH 63/68] Class static block (#9) * Add types factory and parser * Add some case * Make class static block as a container * Update cases * Add visitor * Add emitter and more compile target * Check boundary of break and continue --- src/compiler/binder.ts | 4 +- src/compiler/checker.ts | 4 +- src/compiler/emitter.ts | 13 +++ src/compiler/factory/nodeFactory.ts | 32 ++++++++ src/compiler/parser.ts | 32 ++++++++ src/compiler/transformers/ts.ts | 1 + src/compiler/types.ts | 9 +++ src/compiler/utilities.ts | 1 + src/compiler/utilitiesPublic.ts | 9 +++ src/compiler/visitorPublic.ts | 8 ++ .../classStaticBlock1(target=es2015).js | 16 ++++ .../classStaticBlock1(target=es2015).symbols | 16 ++++ .../classStaticBlock1(target=es2015).types | 18 +++++ .../classStaticBlock1(target=es5).js | 19 +++++ .../classStaticBlock1(target=es5).symbols | 16 ++++ .../classStaticBlock1(target=es5).types | 18 +++++ .../classStaticBlock1(target=esnext).js | 20 +++++ .../classStaticBlock1(target=esnext).symbols | 16 ++++ .../classStaticBlock1(target=esnext).types | 18 +++++ .../baselines/reference/classStaticBlock1.js | 19 +++++ .../reference/classStaticBlock1.symbols | 16 ++++ .../reference/classStaticBlock1.types | 18 +++++ .../classStaticBlock10(target=es2015).js | 42 ++++++++++ .../classStaticBlock10(target=es2015).symbols | 58 ++++++++++++++ .../classStaticBlock10(target=es2015).types | 72 +++++++++++++++++ .../classStaticBlock10(target=es5).js | 48 +++++++++++ .../classStaticBlock10(target=es5).symbols | 58 ++++++++++++++ .../classStaticBlock10(target=es5).types | 72 +++++++++++++++++ .../classStaticBlock10(target=esnext).js | 54 +++++++++++++ .../classStaticBlock10(target=esnext).symbols | 58 ++++++++++++++ .../classStaticBlock10(target=esnext).types | 72 +++++++++++++++++ .../baselines/reference/classStaticBlock10.js | 48 +++++++++++ .../reference/classStaticBlock10.symbols | 58 ++++++++++++++ .../reference/classStaticBlock10.types | 72 +++++++++++++++++ .../classStaticBlock2(target=es2015).js | 26 ++++++ .../classStaticBlock2(target=es2015).symbols | 33 ++++++++ .../classStaticBlock2(target=es2015).types | 37 +++++++++ .../classStaticBlock2(target=es5).js | 29 +++++++ .../classStaticBlock2(target=es5).symbols | 33 ++++++++ .../classStaticBlock2(target=es5).types | 37 +++++++++ .../classStaticBlock2(target=esnext).js | 36 +++++++++ .../classStaticBlock2(target=esnext).symbols | 33 ++++++++ .../classStaticBlock2(target=esnext).types | 37 +++++++++ .../baselines/reference/classStaticBlock2.js | 29 +++++++ .../reference/classStaticBlock2.symbols | 33 ++++++++ .../reference/classStaticBlock2.types | 37 +++++++++ .../classStaticBlock3(target=es2015).js | 27 +++++++ .../classStaticBlock3(target=es2015).symbols | 49 ++++++++++++ .../classStaticBlock3(target=es2015).types | 55 +++++++++++++ .../classStaticBlock3(target=es5).js | 30 +++++++ .../classStaticBlock3(target=es5).symbols | 49 ++++++++++++ .../classStaticBlock3(target=es5).types | 55 +++++++++++++ .../classStaticBlock3(target=esnext).js | 33 ++++++++ .../classStaticBlock3(target=esnext).symbols | 49 ++++++++++++ .../classStaticBlock3(target=esnext).types | 55 +++++++++++++ .../baselines/reference/classStaticBlock3.js | 30 +++++++ .../reference/classStaticBlock3.symbols | 49 ++++++++++++ .../reference/classStaticBlock3.types | 55 +++++++++++++ ...lassStaticBlock4(target=es2015).errors.txt | 27 +++++++ .../classStaticBlock4(target=es2015).js | 23 ++++++ .../classStaticBlock4(target=es2015).symbols | 35 ++++++++ .../classStaticBlock4(target=es2015).types | 41 ++++++++++ .../classStaticBlock4(target=es5).errors.txt | 27 +++++++ .../classStaticBlock4(target=es5).js | 26 ++++++ .../classStaticBlock4(target=es5).symbols | 35 ++++++++ .../classStaticBlock4(target=es5).types | 41 ++++++++++ ...lassStaticBlock4(target=esnext).errors.txt | 27 +++++++ .../classStaticBlock4(target=esnext).js | 29 +++++++ .../classStaticBlock4(target=esnext).symbols | 35 ++++++++ .../classStaticBlock4(target=esnext).types | 41 ++++++++++ .../reference/classStaticBlock4.errors.txt | 27 +++++++ .../baselines/reference/classStaticBlock4.js | 26 ++++++ .../reference/classStaticBlock4.symbols | 35 ++++++++ .../reference/classStaticBlock4.types | 41 ++++++++++ ...lassStaticBlock5(target=es2015).errors.txt | 31 +++++++ .../classStaticBlock5(target=es2015).js | 27 +++++++ .../classStaticBlock5(target=es2015).symbols | 30 +++++++ .../classStaticBlock5(target=es2015).types | 45 +++++++++++ .../classStaticBlock5(target=es5).errors.txt | 31 +++++++ .../classStaticBlock5(target=es5).js | 50 ++++++++++++ .../classStaticBlock5(target=es5).symbols | 30 +++++++ .../classStaticBlock5(target=es5).types | 45 +++++++++++ ...lassStaticBlock5(target=esnext).errors.txt | 31 +++++++ .../classStaticBlock5(target=esnext).js | 32 ++++++++ .../classStaticBlock5(target=esnext).symbols | 30 +++++++ .../classStaticBlock5(target=esnext).types | 45 +++++++++++ .../reference/classStaticBlock5.errors.txt | 31 +++++++ .../baselines/reference/classStaticBlock5.js | 50 ++++++++++++ .../reference/classStaticBlock5.symbols | 30 +++++++ .../reference/classStaticBlock5.types | 45 +++++++++++ .../reference/classStaticBlock6.errors.txt | 33 ++++++++ .../baselines/reference/classStaticBlock6.js | 52 ++++++++++++ .../reference/classStaticBlock6.symbols | 37 +++++++++ .../reference/classStaticBlock6.types | 45 +++++++++++ .../reference/classStaticBlock7.errors.txt | 20 +++++ .../baselines/reference/classStaticBlock7.js | 16 ++++ .../reference/classStaticBlock7.symbols | 11 +++ .../reference/classStaticBlock7.types | 18 +++++ .../reference/classStaticBlock8.errors.txt | 56 +++++++++++++ .../baselines/reference/classStaticBlock8.js | 59 ++++++++++++++ .../reference/classStaticBlock8.symbols | 59 ++++++++++++++ .../reference/classStaticBlock8.types | 80 +++++++++++++++++++ ...lassStaticBlock9(target=es2015).errors.txt | 15 ++++ .../classStaticBlock9(target=es2015).js | 15 ++++ .../classStaticBlock9(target=es2015).symbols | 20 +++++ .../classStaticBlock9(target=es2015).types | 25 ++++++ .../classStaticBlock9(target=es5).errors.txt | 15 ++++ .../classStaticBlock9(target=es5).js | 18 +++++ .../classStaticBlock9(target=es5).symbols | 20 +++++ .../classStaticBlock9(target=es5).types | 25 ++++++ ...lassStaticBlock9(target=esnext).errors.txt | 15 ++++ .../classStaticBlock9(target=esnext).js | 18 +++++ .../classStaticBlock9(target=esnext).symbols | 20 +++++ .../classStaticBlock9(target=esnext).types | 25 ++++++ .../reference/classStaticBlock9.errors.txt | 15 ++++ .../baselines/reference/classStaticBlock9.js | 18 +++++ .../reference/classStaticBlock9.symbols | 20 +++++ .../reference/classStaticBlock9.types | 25 ++++++ .../classStaticBlock/classStaticBlock1.ts | 10 +++ .../classStaticBlock/classStaticBlock10.ts | 28 +++++++ .../classStaticBlock/classStaticBlock2.ts | 20 +++++ .../classStaticBlock/classStaticBlock3.ts | 19 +++++ .../classStaticBlock/classStaticBlock4.ts | 16 ++++ .../classStaticBlock/classStaticBlock5.ts | 17 ++++ .../classStaticBlock/classStaticBlock6.ts | 20 +++++ .../classStaticBlock/classStaticBlock7.ts | 7 ++ .../classStaticBlock/classStaticBlock8.ts | 33 ++++++++ .../classStaticBlock/classStaticBlock9.ts | 8 ++ 128 files changed, 4041 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/classStaticBlock1(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock1(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock1(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock1(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock1(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock1(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock1(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock1(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock1(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock1.js create mode 100644 tests/baselines/reference/classStaticBlock1.symbols create mode 100644 tests/baselines/reference/classStaticBlock1.types create mode 100644 tests/baselines/reference/classStaticBlock10(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock10(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock10(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock10(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock10(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock10(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock10(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock10(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock10(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock10.js create mode 100644 tests/baselines/reference/classStaticBlock10.symbols create mode 100644 tests/baselines/reference/classStaticBlock10.types create mode 100644 tests/baselines/reference/classStaticBlock2(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock2(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock2(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock2(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock2(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock2(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock2(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock2(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock2(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock2.js create mode 100644 tests/baselines/reference/classStaticBlock2.symbols create mode 100644 tests/baselines/reference/classStaticBlock2.types create mode 100644 tests/baselines/reference/classStaticBlock3(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock3(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock3(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock3(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock3(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock3(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock3(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock3(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock3(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock3.js create mode 100644 tests/baselines/reference/classStaticBlock3.symbols create mode 100644 tests/baselines/reference/classStaticBlock3.types create mode 100644 tests/baselines/reference/classStaticBlock4(target=es2015).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock4(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock4(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock4(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock4(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock4(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock4(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock4(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock4(target=esnext).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock4(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock4(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock4(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock4.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock4.js create mode 100644 tests/baselines/reference/classStaticBlock4.symbols create mode 100644 tests/baselines/reference/classStaticBlock4.types create mode 100644 tests/baselines/reference/classStaticBlock5(target=es2015).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock5(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock5(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock5(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock5(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock5(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock5(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock5(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock5(target=esnext).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock5(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock5(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock5(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock5.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock5.js create mode 100644 tests/baselines/reference/classStaticBlock5.symbols create mode 100644 tests/baselines/reference/classStaticBlock5.types create mode 100644 tests/baselines/reference/classStaticBlock6.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock6.js create mode 100644 tests/baselines/reference/classStaticBlock6.symbols create mode 100644 tests/baselines/reference/classStaticBlock6.types create mode 100644 tests/baselines/reference/classStaticBlock7.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock7.js create mode 100644 tests/baselines/reference/classStaticBlock7.symbols create mode 100644 tests/baselines/reference/classStaticBlock7.types create mode 100644 tests/baselines/reference/classStaticBlock8.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock8.js create mode 100644 tests/baselines/reference/classStaticBlock8.symbols create mode 100644 tests/baselines/reference/classStaticBlock8.types create mode 100644 tests/baselines/reference/classStaticBlock9(target=es2015).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock9(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock9(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock9(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock9(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock9(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock9(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock9(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock9(target=esnext).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock9(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock9(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock9(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock9.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock9.js create mode 100644 tests/baselines/reference/classStaticBlock9.symbols create mode 100644 tests/baselines/reference/classStaticBlock9.types create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index c6a2b14afdf97..cc30d7cf0a720 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1829,6 +1829,7 @@ namespace ts { case SyntaxKind.ConstructSignature: case SyntaxKind.IndexSignature: case SyntaxKind.ConstructorType: + case SyntaxKind.ClassStaticBlockDeclaration: return ContainerFlags.IsContainer | ContainerFlags.IsControlFlowContainer | ContainerFlags.HasLocals | ContainerFlags.IsFunctionLike; case SyntaxKind.FunctionExpression: @@ -1864,7 +1865,7 @@ namespace ts { // By not creating a new block-scoped-container here, we ensure that both 'var x' // and 'let x' go into the Function-container's locals, and we do get a collision // conflict. - return isFunctionLike(node.parent) ? ContainerFlags.None : ContainerFlags.IsBlockScopedContainer; + return isFunctionLike(node.parent) || isClassStaticBlockDeclaration(node.parent) ? ContainerFlags.None : ContainerFlags.IsBlockScopedContainer; } return ContainerFlags.None; @@ -1926,6 +1927,7 @@ namespace ts { case SyntaxKind.JSDocFunctionType: case SyntaxKind.JSDocTypedefTag: case SyntaxKind.JSDocCallbackTag: + case SyntaxKind.ClassStaticBlockDeclaration: case SyntaxKind.TypeAliasDeclaration: case SyntaxKind.MappedType: // All the children of these container types are never visible through another diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7d15340fa8bb3..8def51fd3b32a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -37928,6 +37928,8 @@ namespace ts { return checkMappedType(node); case SyntaxKind.FunctionDeclaration: return checkFunctionDeclaration(node); + case SyntaxKind.ClassStaticBlockDeclaration: + return forEachChild(node, checkSourceElement); case SyntaxKind.Block: case SyntaxKind.ModuleBlock: return checkBlock(node); @@ -40948,7 +40950,7 @@ namespace ts { function checkGrammarBreakOrContinueStatement(node: BreakOrContinueStatement): boolean { let current: Node = node; while (current) { - if (isFunctionLike(current)) { + if (isFunctionLikeOrClassStaticBlockDeclaration(current)) { return grammarErrorOnNode(node, Diagnostics.Jump_target_cannot_cross_function_boundary); } diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 8c3cbc96c1105..7f86f623253e6 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -1341,6 +1341,8 @@ namespace ts { return emitMethodSignature(node); case SyntaxKind.MethodDeclaration: return emitMethodDeclaration(node); + case SyntaxKind.ClassStaticBlockDeclaration: + return emitClassStaticBlockDeclaration(node); case SyntaxKind.Constructor: return emitConstructor(node); case SyntaxKind.GetAccessor: @@ -2008,6 +2010,11 @@ namespace ts { emitSignatureAndBody(node, emitSignatureHead); } + function emitClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration) { + emit(node.staticToken); + emitBlockFunctionBody(node.body); + } + function emitConstructor(node: ConstructorDeclaration) { emitModifiers(node, node.modifiers); writeKeyword("constructor"); @@ -5770,6 +5777,12 @@ namespace ts { visitTypeNode(node.type), visitFunctionBody(node.body)); + case SyntaxKind.ClassStaticBlockDeclaration: + Debug.type(node); + return factory.updateClassStaticBlockDeclaration(node, + visit(node.staticToken, isStaticModifier), + visitFunctionBody(node.body)); + case SyntaxKind.Constructor: Debug.type(node); return factory.updateConstructorDeclaration(node, diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index 01e19545edcb1..2c1b1c7fb309f 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -94,6 +94,8 @@ namespace ts { updateConstructSignature, createIndexSignature, updateIndexSignature, + createClassStaticBlockDeclaration, + updateClassStaticBlockDeclaration, createTemplateLiteralTypeSpan, updateTemplateLiteralTypeSpan, createKeywordTypeNode, @@ -1610,6 +1612,36 @@ namespace ts { : node; } + // @api + function createClassStaticBlockDeclaration( + staticToken: Token, + body: Block + ): ClassStaticBlockDeclaration { + const node = createBaseGenericNamedDeclaration( + SyntaxKind.ClassStaticBlockDeclaration, + /*decorators*/ undefined, + /*modifiers*/ undefined, + /*name*/ undefined, + /*typeParameters*/ undefined + ); + node.staticToken = staticToken; + node.body = body; + node.transformFlags = TransformFlags.ContainsESNext; + return node; + } + + // @api + function updateClassStaticBlockDeclaration( + node: ClassStaticBlockDeclaration, + staticToken: Token, + body: Block + ): ClassStaticBlockDeclaration { + return node.staticToken !== staticToken + || node.body !== body + ? update(createClassStaticBlockDeclaration(staticToken, body), node) + : node; + } + // @api function createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail) { const node = createBaseNode(SyntaxKind.TemplateLiteralTypeSpan); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index f423ca046492f..620722d5552a0 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -168,6 +168,9 @@ namespace ts { visitNode(cbNode, (node).type) || visitNode(cbNode, (node).equalsGreaterThanToken) || visitNode(cbNode, (node).body); + case SyntaxKind.ClassStaticBlockDeclaration: + return visitNode(cbNode, (node).staticToken) || + visitNode(cbNode, (node).body); case SyntaxKind.TypeReference: return visitNode(cbNode, (node).typeName) || visitNodes(cbNode, cbNodes, (node).typeArguments); @@ -6561,6 +6564,28 @@ namespace ts { return false; } + function parseClassStaticBlockDeclaration(): ClassStaticBlockDeclaration { + const pos = getNodePos(); + const staticKeyworkd = parseExpectedToken(SyntaxKind.StaticKeyword); + const body = parseClassStaticBlockBodyBlock(); + return finishNode(factory.createClassStaticBlockDeclaration(staticKeyworkd, body), pos); + } + + function parseClassStaticBlockBodyBlock() { + const savedYieldContext = inYieldContext(); + setYieldContext(false); + + const savedAwaitContext = inAwaitContext(); + setAwaitContext(false); + + const block = parseBlock(/*ignoreMissingOpenBrace*/ false); + + setAwaitContext(savedAwaitContext); + setYieldContext(savedYieldContext); + + return block; + } + function parseDecoratorExpression() { if (inAwaitContext() && token() === SyntaxKind.AwaitKeyword) { // `@await` is is disallowed in an [Await] context, but can cause parsing to go off the rails @@ -6645,6 +6670,9 @@ namespace ts { nextToken(); return finishNode(factory.createSemicolonClassElement(), pos); } + if (token() === SyntaxKind.StaticKeyword && lookAhead(nextTokenIsOpenBrace)) { + return parseClassStaticBlockDeclaration(); + } const hasJSDoc = hasPrecedingJSDocComment(); const decorators = parseDecorators(); @@ -6910,6 +6938,10 @@ namespace ts { return nextToken() === SyntaxKind.OpenParenToken; } + function nextTokenIsOpenBrace() { + return nextToken() === SyntaxKind.OpenBraceToken; + } + function nextTokenIsSlash() { return nextToken() === SyntaxKind.SlashToken; } diff --git a/src/compiler/transformers/ts.ts b/src/compiler/transformers/ts.ts index 0d24f332c15bd..2a7457b8e0954 100644 --- a/src/compiler/transformers/ts.ts +++ b/src/compiler/transformers/ts.ts @@ -324,6 +324,7 @@ namespace ts { case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: case SyntaxKind.MethodDeclaration: + case SyntaxKind.ClassStaticBlockDeclaration: // Fallback to the default visit behavior. return visitorWorker(node); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 11f4c6d3ea7e1..fe131f343cb50 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -208,6 +208,7 @@ namespace ts { SetAccessor, CallSignature, ConstructSignature, + ClassStaticBlockDeclaration, IndexSignature, // Type TypePredicate, @@ -1502,6 +1503,12 @@ namespace ts { readonly type: TypeNode; } + export interface ClassStaticBlockDeclaration extends ClassElement { + readonly kind: SyntaxKind.ClassStaticBlockDeclaration; + readonly staticToken: Token; + readonly body: Block; + } + export interface TypeNode extends Node { _typeNodeBrand: any; } @@ -6929,6 +6936,8 @@ namespace ts { updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration; createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; + createClassStaticBlockDeclaration(staticToken: Token, body: Block): ClassStaticBlockDeclaration; + updateClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, staticToken: Token, body: Block): ClassStaticBlockDeclaration; // // Types diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 1c459c83e64eb..0a320436acae3 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1601,6 +1601,7 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: case SyntaxKind.ModuleDeclaration: + case SyntaxKind.ClassStaticBlockDeclaration: case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: case SyntaxKind.MethodDeclaration: diff --git a/src/compiler/utilitiesPublic.ts b/src/compiler/utilitiesPublic.ts index f50ad3ddd4b44..fa4d782439f5f 100644 --- a/src/compiler/utilitiesPublic.ts +++ b/src/compiler/utilitiesPublic.ts @@ -1219,6 +1219,14 @@ namespace ts { return !!node && isFunctionLikeKind(node.kind); } + export function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration { + return node.kind === SyntaxKind.ClassStaticBlockDeclaration; + } + + export function isFunctionLikeOrClassStaticBlockDeclaration(node: Node | undefined): node is (SignatureDeclaration | ClassStaticBlockDeclaration) { + return !!node && (isFunctionLikeKind(node.kind) || isClassStaticBlockDeclaration(node)); + } + /* @internal */ export function isFunctionLikeDeclaration(node: Node): node is FunctionLikeDeclaration { return node && isFunctionLikeDeclarationKind(node.kind); @@ -1270,6 +1278,7 @@ namespace ts { || kind === SyntaxKind.GetAccessor || kind === SyntaxKind.SetAccessor || kind === SyntaxKind.IndexSignature + || kind === SyntaxKind.ClassStaticBlockDeclaration || kind === SyntaxKind.SemicolonClassElement; } diff --git a/src/compiler/visitorPublic.ts b/src/compiler/visitorPublic.ts index 960cd16f8479b..3ccfdde23bde0 100644 --- a/src/compiler/visitorPublic.ts +++ b/src/compiler/visitorPublic.ts @@ -475,6 +475,14 @@ namespace ts { visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body!, visitor, context, nodeVisitor)); + case SyntaxKind.ClassStaticBlockDeclaration: + Debug.type(node); + context.startLexicalEnvironment(); + context.suspendLexicalEnvironment(); + return factory.updateClassStaticBlockDeclaration(node, + nodeVisitor(node.staticToken, visitor, isStaticModifier), + visitFunctionBody(node.body, visitor, context, nodeVisitor)); + case SyntaxKind.CallSignature: Debug.type(node); return factory.updateCallSignature(node, diff --git a/tests/baselines/reference/classStaticBlock1(target=es2015).js b/tests/baselines/reference/classStaticBlock1(target=es2015).js new file mode 100644 index 0000000000000..c852add6ad402 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es2015).js @@ -0,0 +1,16 @@ +//// [classStaticBlock1.ts] +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} + + +//// [classStaticBlock1.js] +const a = 2; +class C { +} diff --git a/tests/baselines/reference/classStaticBlock1(target=es2015).symbols b/tests/baselines/reference/classStaticBlock1(target=es2015).symbols new file mode 100644 index 0000000000000..e4aa99e0d68d5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es2015).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : Symbol(a, Decl(classStaticBlock1.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock1.ts, 0, 12)) + + static { + const a = 1; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock1(target=es2015).types b/tests/baselines/reference/classStaticBlock1(target=es2015).types new file mode 100644 index 0000000000000..a0fd3b4d6480a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es2015).types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 1; +>a : 1 +>1 : 1 + + a; +>a : 1 + } +} + diff --git a/tests/baselines/reference/classStaticBlock1(target=es5).js b/tests/baselines/reference/classStaticBlock1(target=es5).js new file mode 100644 index 0000000000000..58eccef93a8a5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es5).js @@ -0,0 +1,19 @@ +//// [classStaticBlock1.ts] +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} + + +//// [classStaticBlock1.js] +var a = 2; +var C = /** @class */ (function () { + function C() { + } + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock1(target=es5).symbols b/tests/baselines/reference/classStaticBlock1(target=es5).symbols new file mode 100644 index 0000000000000..e4aa99e0d68d5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es5).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : Symbol(a, Decl(classStaticBlock1.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock1.ts, 0, 12)) + + static { + const a = 1; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock1(target=es5).types b/tests/baselines/reference/classStaticBlock1(target=es5).types new file mode 100644 index 0000000000000..a0fd3b4d6480a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=es5).types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 1; +>a : 1 +>1 : 1 + + a; +>a : 1 + } +} + diff --git a/tests/baselines/reference/classStaticBlock1(target=esnext).js b/tests/baselines/reference/classStaticBlock1(target=esnext).js new file mode 100644 index 0000000000000..c7180cdabd6f8 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=esnext).js @@ -0,0 +1,20 @@ +//// [classStaticBlock1.ts] +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} + + +//// [classStaticBlock1.js] +const a = 2; +class C { + static { + const a = 1; + a; + } +} diff --git a/tests/baselines/reference/classStaticBlock1(target=esnext).symbols b/tests/baselines/reference/classStaticBlock1(target=esnext).symbols new file mode 100644 index 0000000000000..e4aa99e0d68d5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=esnext).symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : Symbol(a, Decl(classStaticBlock1.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock1.ts, 0, 12)) + + static { + const a = 1; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock1(target=esnext).types b/tests/baselines/reference/classStaticBlock1(target=esnext).types new file mode 100644 index 0000000000000..a0fd3b4d6480a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1(target=esnext).types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 1; +>a : 1 +>1 : 1 + + a; +>a : 1 + } +} + diff --git a/tests/baselines/reference/classStaticBlock1.js b/tests/baselines/reference/classStaticBlock1.js new file mode 100644 index 0000000000000..58eccef93a8a5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1.js @@ -0,0 +1,19 @@ +//// [classStaticBlock1.ts] +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} + + +//// [classStaticBlock1.js] +var a = 2; +var C = /** @class */ (function () { + function C() { + } + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock1.symbols b/tests/baselines/reference/classStaticBlock1.symbols new file mode 100644 index 0000000000000..e4aa99e0d68d5 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1.symbols @@ -0,0 +1,16 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : Symbol(a, Decl(classStaticBlock1.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock1.ts, 0, 12)) + + static { + const a = 1; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock1.ts, 4, 13)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock1.types b/tests/baselines/reference/classStaticBlock1.types new file mode 100644 index 0000000000000..a0fd3b4d6480a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock1.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts === +const a = 2; +>a : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 1; +>a : 1 +>1 : 1 + + a; +>a : 1 + } +} + diff --git a/tests/baselines/reference/classStaticBlock10(target=es2015).js b/tests/baselines/reference/classStaticBlock10(target=es2015).js new file mode 100644 index 0000000000000..6e1685db40c3a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es2015).js @@ -0,0 +1,42 @@ +//// [classStaticBlock10.ts] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} + +//// [classStaticBlock10.js] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; +function f() { + var a1 = 11; + const b1 = 22; + class C1 { + } +} +class C2 { +} diff --git a/tests/baselines/reference/classStaticBlock10(target=es2015).symbols b/tests/baselines/reference/classStaticBlock10(target=es2015).symbols new file mode 100644 index 0000000000000..12d2d16b0784c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es2015).symbols @@ -0,0 +1,58 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 0, 3)) + +var a2 = 1; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 1, 3)) + +const b1 = 2; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 2, 5)) + +const b2 = 2; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 3, 5)) + +function f () { +>f : Symbol(f, Decl(classStaticBlock10.ts, 3, 13)) + + var a1 = 11; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 6, 7)) + + const b1 = 22; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 7, 9)) + + class C1 { +>C1 : Symbol(C1, Decl(classStaticBlock10.ts, 7, 18)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 11, 15)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 12, 15)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 13, 17)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 14, 17)) + } + } +} + +class C2 { +>C2 : Symbol(C2, Decl(classStaticBlock10.ts, 17, 1)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 21, 11)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 22, 11)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 23, 13)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 24, 13)) + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=es2015).types b/tests/baselines/reference/classStaticBlock10(target=es2015).types new file mode 100644 index 0000000000000..dbbf3ebd6b0a4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es2015).types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : number +>1 : 1 + +var a2 = 1; +>a2 : number +>1 : 1 + +const b1 = 2; +>b1 : 2 +>2 : 2 + +const b2 = 2; +>b2 : 2 +>2 : 2 + +function f () { +>f : () => void + + var a1 = 11; +>a1 : number +>11 : 11 + + const b1 = 22; +>b1 : 22 +>22 : 22 + + class C1 { +>C1 : C1 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } + } +} + +class C2 { +>C2 : C2 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=es5).js b/tests/baselines/reference/classStaticBlock10(target=es5).js new file mode 100644 index 0000000000000..faa79b8dae154 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es5).js @@ -0,0 +1,48 @@ +//// [classStaticBlock10.ts] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} + +//// [classStaticBlock10.js] +var a1 = 1; +var a2 = 1; +var b1 = 2; +var b2 = 2; +function f() { + var a1 = 11; + var b1 = 22; + var C1 = /** @class */ (function () { + function C1() { + } + return C1; + }()); +} +var C2 = /** @class */ (function () { + function C2() { + } + return C2; +}()); diff --git a/tests/baselines/reference/classStaticBlock10(target=es5).symbols b/tests/baselines/reference/classStaticBlock10(target=es5).symbols new file mode 100644 index 0000000000000..12d2d16b0784c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es5).symbols @@ -0,0 +1,58 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 0, 3)) + +var a2 = 1; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 1, 3)) + +const b1 = 2; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 2, 5)) + +const b2 = 2; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 3, 5)) + +function f () { +>f : Symbol(f, Decl(classStaticBlock10.ts, 3, 13)) + + var a1 = 11; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 6, 7)) + + const b1 = 22; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 7, 9)) + + class C1 { +>C1 : Symbol(C1, Decl(classStaticBlock10.ts, 7, 18)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 11, 15)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 12, 15)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 13, 17)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 14, 17)) + } + } +} + +class C2 { +>C2 : Symbol(C2, Decl(classStaticBlock10.ts, 17, 1)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 21, 11)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 22, 11)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 23, 13)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 24, 13)) + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=es5).types b/tests/baselines/reference/classStaticBlock10(target=es5).types new file mode 100644 index 0000000000000..dbbf3ebd6b0a4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=es5).types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : number +>1 : 1 + +var a2 = 1; +>a2 : number +>1 : 1 + +const b1 = 2; +>b1 : 2 +>2 : 2 + +const b2 = 2; +>b2 : 2 +>2 : 2 + +function f () { +>f : () => void + + var a1 = 11; +>a1 : number +>11 : 11 + + const b1 = 22; +>b1 : 22 +>22 : 22 + + class C1 { +>C1 : C1 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } + } +} + +class C2 { +>C2 : C2 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=esnext).js b/tests/baselines/reference/classStaticBlock10(target=esnext).js new file mode 100644 index 0000000000000..6593ae74ffed9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=esnext).js @@ -0,0 +1,54 @@ +//// [classStaticBlock10.ts] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} + +//// [classStaticBlock10.js] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; +function f() { + var a1 = 11; + const b1 = 22; + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=esnext).symbols b/tests/baselines/reference/classStaticBlock10(target=esnext).symbols new file mode 100644 index 0000000000000..12d2d16b0784c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=esnext).symbols @@ -0,0 +1,58 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 0, 3)) + +var a2 = 1; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 1, 3)) + +const b1 = 2; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 2, 5)) + +const b2 = 2; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 3, 5)) + +function f () { +>f : Symbol(f, Decl(classStaticBlock10.ts, 3, 13)) + + var a1 = 11; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 6, 7)) + + const b1 = 22; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 7, 9)) + + class C1 { +>C1 : Symbol(C1, Decl(classStaticBlock10.ts, 7, 18)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 11, 15)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 12, 15)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 13, 17)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 14, 17)) + } + } +} + +class C2 { +>C2 : Symbol(C2, Decl(classStaticBlock10.ts, 17, 1)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 21, 11)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 22, 11)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 23, 13)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 24, 13)) + } +} diff --git a/tests/baselines/reference/classStaticBlock10(target=esnext).types b/tests/baselines/reference/classStaticBlock10(target=esnext).types new file mode 100644 index 0000000000000..dbbf3ebd6b0a4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10(target=esnext).types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : number +>1 : 1 + +var a2 = 1; +>a2 : number +>1 : 1 + +const b1 = 2; +>b1 : 2 +>2 : 2 + +const b2 = 2; +>b2 : 2 +>2 : 2 + +function f () { +>f : () => void + + var a1 = 11; +>a1 : number +>11 : 11 + + const b1 = 22; +>b1 : 22 +>22 : 22 + + class C1 { +>C1 : C1 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } + } +} + +class C2 { +>C2 : C2 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } +} diff --git a/tests/baselines/reference/classStaticBlock10.js b/tests/baselines/reference/classStaticBlock10.js new file mode 100644 index 0000000000000..faa79b8dae154 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10.js @@ -0,0 +1,48 @@ +//// [classStaticBlock10.ts] +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} + +//// [classStaticBlock10.js] +var a1 = 1; +var a2 = 1; +var b1 = 2; +var b2 = 2; +function f() { + var a1 = 11; + var b1 = 22; + var C1 = /** @class */ (function () { + function C1() { + } + return C1; + }()); +} +var C2 = /** @class */ (function () { + function C2() { + } + return C2; +}()); diff --git a/tests/baselines/reference/classStaticBlock10.symbols b/tests/baselines/reference/classStaticBlock10.symbols new file mode 100644 index 0000000000000..12d2d16b0784c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10.symbols @@ -0,0 +1,58 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 0, 3)) + +var a2 = 1; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 1, 3)) + +const b1 = 2; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 2, 5)) + +const b2 = 2; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 3, 5)) + +function f () { +>f : Symbol(f, Decl(classStaticBlock10.ts, 3, 13)) + + var a1 = 11; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 6, 7)) + + const b1 = 22; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 7, 9)) + + class C1 { +>C1 : Symbol(C1, Decl(classStaticBlock10.ts, 7, 18)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 11, 15)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 12, 15)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 13, 17)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 14, 17)) + } + } +} + +class C2 { +>C2 : Symbol(C2, Decl(classStaticBlock10.ts, 17, 1)) + + static { + var a1 = 111; +>a1 : Symbol(a1, Decl(classStaticBlock10.ts, 21, 11)) + + var a2 = 111; +>a2 : Symbol(a2, Decl(classStaticBlock10.ts, 22, 11)) + + const b1 = 222; +>b1 : Symbol(b1, Decl(classStaticBlock10.ts, 23, 13)) + + const b2 = 222; +>b2 : Symbol(b2, Decl(classStaticBlock10.ts, 24, 13)) + } +} diff --git a/tests/baselines/reference/classStaticBlock10.types b/tests/baselines/reference/classStaticBlock10.types new file mode 100644 index 0000000000000..dbbf3ebd6b0a4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock10.types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts === +var a1 = 1; +>a1 : number +>1 : 1 + +var a2 = 1; +>a2 : number +>1 : 1 + +const b1 = 2; +>b1 : 2 +>2 : 2 + +const b2 = 2; +>b2 : 2 +>2 : 2 + +function f () { +>f : () => void + + var a1 = 11; +>a1 : number +>11 : 11 + + const b1 = 22; +>b1 : 22 +>22 : 22 + + class C1 { +>C1 : C1 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } + } +} + +class C2 { +>C2 : C2 + + static { + var a1 = 111; +>a1 : number +>111 : 111 + + var a2 = 111; +>a2 : number +>111 : 111 + + const b1 = 222; +>b1 : 222 +>222 : 222 + + const b2 = 222; +>b2 : 222 +>222 : 222 + } +} diff --git a/tests/baselines/reference/classStaticBlock2(target=es2015).js b/tests/baselines/reference/classStaticBlock2(target=es2015).js new file mode 100644 index 0000000000000..d9477576ca879 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es2015).js @@ -0,0 +1,26 @@ +//// [classStaticBlock2.ts] +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} + + +//// [classStaticBlock2.js] +const a = 1; +const b = 2; +class C { +} diff --git a/tests/baselines/reference/classStaticBlock2(target=es2015).symbols b/tests/baselines/reference/classStaticBlock2(target=es2015).symbols new file mode 100644 index 0000000000000..93bfa964aaeb6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es2015).symbols @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock2.ts, 0, 5)) + +const b = 2; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock2.ts, 1, 12)) + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock2(target=es2015).types b/tests/baselines/reference/classStaticBlock2(target=es2015).types new file mode 100644 index 0000000000000..2e22833b22ddf --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es2015).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : 1 +>1 : 1 + +const b = 2; +>b : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } +} + diff --git a/tests/baselines/reference/classStaticBlock2(target=es5).js b/tests/baselines/reference/classStaticBlock2(target=es5).js new file mode 100644 index 0000000000000..e535663fcdeaa --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es5).js @@ -0,0 +1,29 @@ +//// [classStaticBlock2.ts] +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} + + +//// [classStaticBlock2.js] +var a = 1; +var b = 2; +var C = /** @class */ (function () { + function C() { + } + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock2(target=es5).symbols b/tests/baselines/reference/classStaticBlock2(target=es5).symbols new file mode 100644 index 0000000000000..93bfa964aaeb6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es5).symbols @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock2.ts, 0, 5)) + +const b = 2; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock2.ts, 1, 12)) + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock2(target=es5).types b/tests/baselines/reference/classStaticBlock2(target=es5).types new file mode 100644 index 0000000000000..2e22833b22ddf --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=es5).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : 1 +>1 : 1 + +const b = 2; +>b : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } +} + diff --git a/tests/baselines/reference/classStaticBlock2(target=esnext).js b/tests/baselines/reference/classStaticBlock2(target=esnext).js new file mode 100644 index 0000000000000..ccff801b61335 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=esnext).js @@ -0,0 +1,36 @@ +//// [classStaticBlock2.ts] +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} + + +//// [classStaticBlock2.js] +const a = 1; +const b = 2; +class C { + static { + const a = 11; + a; + b; + } + static { + const a = 11; + a; + b; + } +} diff --git a/tests/baselines/reference/classStaticBlock2(target=esnext).symbols b/tests/baselines/reference/classStaticBlock2(target=esnext).symbols new file mode 100644 index 0000000000000..93bfa964aaeb6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=esnext).symbols @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock2.ts, 0, 5)) + +const b = 2; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock2.ts, 1, 12)) + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock2(target=esnext).types b/tests/baselines/reference/classStaticBlock2(target=esnext).types new file mode 100644 index 0000000000000..2e22833b22ddf --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2(target=esnext).types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : 1 +>1 : 1 + +const b = 2; +>b : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } +} + diff --git a/tests/baselines/reference/classStaticBlock2.js b/tests/baselines/reference/classStaticBlock2.js new file mode 100644 index 0000000000000..e535663fcdeaa --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2.js @@ -0,0 +1,29 @@ +//// [classStaticBlock2.ts] +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} + + +//// [classStaticBlock2.js] +var a = 1; +var b = 2; +var C = /** @class */ (function () { + function C() { + } + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock2.symbols b/tests/baselines/reference/classStaticBlock2.symbols new file mode 100644 index 0000000000000..93bfa964aaeb6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2.symbols @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock2.ts, 0, 5)) + +const b = 2; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock2.ts, 1, 12)) + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 5, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } + + static { + const a = 11; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + a; +>a : Symbol(a, Decl(classStaticBlock2.ts, 12, 13)) + + b; +>b : Symbol(b, Decl(classStaticBlock2.ts, 1, 5)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock2.types b/tests/baselines/reference/classStaticBlock2.types new file mode 100644 index 0000000000000..2e22833b22ddf --- /dev/null +++ b/tests/baselines/reference/classStaticBlock2.types @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts === +const a = 1; +>a : 1 +>1 : 1 + +const b = 2; +>b : 2 +>2 : 2 + +class C { +>C : C + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } + + static { + const a = 11; +>a : 11 +>11 : 11 + + a; +>a : 11 + + b; +>b : 2 + } +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=es2015).js b/tests/baselines/reference/classStaticBlock3(target=es2015).js new file mode 100644 index 0000000000000..9d352771472d1 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es2015).js @@ -0,0 +1,27 @@ +//// [classStaticBlock3.ts] +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} + + +//// [classStaticBlock3.js] +const a = 1; +class C { +} +C.f1 = 1; +C.f2 = 2; +C.f3 = 3; diff --git a/tests/baselines/reference/classStaticBlock3(target=es2015).symbols b/tests/baselines/reference/classStaticBlock3(target=es2015).symbols new file mode 100644 index 0000000000000..758fa0790609a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es2015).symbols @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock3.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) + + static f1 = 1; +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f2 = 2; +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f3 = 3; +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=es2015).types b/tests/baselines/reference/classStaticBlock3(target=es2015).types new file mode 100644 index 0000000000000..d5705a72e8775 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es2015).types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : 1 +>1 : 1 + +class C { +>C : C + + static f1 = 1; +>f1 : number +>1 : 1 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f2 = 2; +>f2 : number +>2 : 2 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f3 = 3; +>f3 : number +>3 : 3 +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=es5).js b/tests/baselines/reference/classStaticBlock3(target=es5).js new file mode 100644 index 0000000000000..5dfb77ff34ba9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es5).js @@ -0,0 +1,30 @@ +//// [classStaticBlock3.ts] +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} + + +//// [classStaticBlock3.js] +var a = 1; +var C = /** @class */ (function () { + function C() { + } + C.f1 = 1; + C.f2 = 2; + C.f3 = 3; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock3(target=es5).symbols b/tests/baselines/reference/classStaticBlock3(target=es5).symbols new file mode 100644 index 0000000000000..758fa0790609a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es5).symbols @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock3.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) + + static f1 = 1; +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f2 = 2; +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f3 = 3; +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=es5).types b/tests/baselines/reference/classStaticBlock3(target=es5).types new file mode 100644 index 0000000000000..d5705a72e8775 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=es5).types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : 1 +>1 : 1 + +class C { +>C : C + + static f1 = 1; +>f1 : number +>1 : 1 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f2 = 2; +>f2 : number +>2 : 2 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f3 = 3; +>f3 : number +>3 : 3 +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=esnext).js b/tests/baselines/reference/classStaticBlock3(target=esnext).js new file mode 100644 index 0000000000000..548d2aaa16f27 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=esnext).js @@ -0,0 +1,33 @@ +//// [classStaticBlock3.ts] +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} + + +//// [classStaticBlock3.js] +const a = 1; +class C { + static { + console.log(C.f1, C.f2, C.f3); + } + static { + console.log(C.f1, C.f2, C.f3); + } +} +C.f1 = 1; +C.f2 = 2; +C.f3 = 3; diff --git a/tests/baselines/reference/classStaticBlock3(target=esnext).symbols b/tests/baselines/reference/classStaticBlock3(target=esnext).symbols new file mode 100644 index 0000000000000..758fa0790609a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=esnext).symbols @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock3.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) + + static f1 = 1; +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f2 = 2; +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f3 = 3; +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock3(target=esnext).types b/tests/baselines/reference/classStaticBlock3(target=esnext).types new file mode 100644 index 0000000000000..d5705a72e8775 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3(target=esnext).types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : 1 +>1 : 1 + +class C { +>C : C + + static f1 = 1; +>f1 : number +>1 : 1 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f2 = 2; +>f2 : number +>2 : 2 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f3 = 3; +>f3 : number +>3 : 3 +} + diff --git a/tests/baselines/reference/classStaticBlock3.js b/tests/baselines/reference/classStaticBlock3.js new file mode 100644 index 0000000000000..5dfb77ff34ba9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3.js @@ -0,0 +1,30 @@ +//// [classStaticBlock3.ts] +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} + + +//// [classStaticBlock3.js] +var a = 1; +var C = /** @class */ (function () { + function C() { + } + C.f1 = 1; + C.f2 = 2; + C.f3 = 3; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock3.symbols b/tests/baselines/reference/classStaticBlock3.symbols new file mode 100644 index 0000000000000..758fa0790609a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3.symbols @@ -0,0 +1,49 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : Symbol(a, Decl(classStaticBlock3.ts, 0, 5)) + +class C { +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) + + static f1 = 1; +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f2 = 2; +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) + + static { + console.log(C.f1, C.f2, C.f3) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f1 : Symbol(C.f1, Decl(classStaticBlock3.ts, 2, 9)) +>C.f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f2 : Symbol(C.f2, Decl(classStaticBlock3.ts, 7, 5)) +>C.f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +>C : Symbol(C, Decl(classStaticBlock3.ts, 0, 12)) +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) + } + + static f3 = 3; +>f3 : Symbol(C.f3, Decl(classStaticBlock3.ts, 13, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock3.types b/tests/baselines/reference/classStaticBlock3.types new file mode 100644 index 0000000000000..d5705a72e8775 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock3.types @@ -0,0 +1,55 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts === +const a = 1; +>a : 1 +>1 : 1 + +class C { +>C : C + + static f1 = 1; +>f1 : number +>1 : 1 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f2 = 2; +>f2 : number +>2 : 2 + + static { + console.log(C.f1, C.f2, C.f3) +>console.log(C.f1, C.f2, C.f3) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.f1 : number +>C : typeof C +>f1 : number +>C.f2 : number +>C : typeof C +>f2 : number +>C.f3 : number +>C : typeof C +>f3 : number + } + + static f3 = 3; +>f3 : number +>3 : 3 +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).errors.txt b/tests/baselines/reference/classStaticBlock4(target=es2015).errors.txt new file mode 100644 index 0000000000000..87e988d8b1c6e --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).errors.txt @@ -0,0 +1,27 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(5,14): error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(8,14): error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(13,18): error TS2334: 'this' cannot be referenced in a static property initializer. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts (3 errors) ==== + class C { + static s1 = 1; + + static { + this.s1; + ~~ +!!! error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? + C.s1; + + this.s2; + ~~ +!!! error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; + ~~~~ +!!! error TS2334: 'this' cannot be referenced in a static property initializer. + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).js b/tests/baselines/reference/classStaticBlock4(target=es2015).js new file mode 100644 index 0000000000000..05889c7f02fa9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).js @@ -0,0 +1,23 @@ +//// [classStaticBlock4.ts] +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} + + +//// [classStaticBlock4.js] +class C { +} +C.s1 = 1; +C.s2 = 2; +C.ss2 = this.s1; diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).symbols b/tests/baselines/reference/classStaticBlock4(target=es2015).symbols new file mode 100644 index 0000000000000..5b812c63d7121 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).symbols @@ -0,0 +1,35 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + static s1 = 1; +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + static { + this.s1; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s1; +>C.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + this.s2; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s2; +>C.s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + } + + static s2 = 2; +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + + static ss2 = this.s1; +>ss2 : Symbol(C.ss2, Decl(classStaticBlock4.ts, 11, 18)) +>this.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).types b/tests/baselines/reference/classStaticBlock4(target=es2015).types new file mode 100644 index 0000000000000..91d7ba0613136 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : C + + static s1 = 1; +>s1 : number +>1 : 1 + + static { + this.s1; +>this.s1 : any +>this : this +>s1 : any + + C.s1; +>C.s1 : number +>C : typeof C +>s1 : number + + this.s2; +>this.s2 : any +>this : this +>s2 : any + + C.s2; +>C.s2 : number +>C : typeof C +>s2 : number + } + + static s2 = 2; +>s2 : number +>2 : 2 + + static ss2 = this.s1; +>ss2 : number +>this.s1 : number +>this : typeof C +>s1 : number +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock4(target=es5).errors.txt new file mode 100644 index 0000000000000..87e988d8b1c6e --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es5).errors.txt @@ -0,0 +1,27 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(5,14): error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(8,14): error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(13,18): error TS2334: 'this' cannot be referenced in a static property initializer. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts (3 errors) ==== + class C { + static s1 = 1; + + static { + this.s1; + ~~ +!!! error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? + C.s1; + + this.s2; + ~~ +!!! error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; + ~~~~ +!!! error TS2334: 'this' cannot be referenced in a static property initializer. + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).js b/tests/baselines/reference/classStaticBlock4(target=es5).js new file mode 100644 index 0000000000000..adba8791e76e7 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es5).js @@ -0,0 +1,26 @@ +//// [classStaticBlock4.ts] +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} + + +//// [classStaticBlock4.js] +var C = /** @class */ (function () { + function C() { + } + C.s1 = 1; + C.s2 = 2; + C.ss2 = this.s1; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).symbols b/tests/baselines/reference/classStaticBlock4(target=es5).symbols new file mode 100644 index 0000000000000..5b812c63d7121 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es5).symbols @@ -0,0 +1,35 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + static s1 = 1; +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + static { + this.s1; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s1; +>C.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + this.s2; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s2; +>C.s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + } + + static s2 = 2; +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + + static ss2 = this.s1; +>ss2 : Symbol(C.ss2, Decl(classStaticBlock4.ts, 11, 18)) +>this.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).types b/tests/baselines/reference/classStaticBlock4(target=es5).types new file mode 100644 index 0000000000000..91d7ba0613136 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=es5).types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : C + + static s1 = 1; +>s1 : number +>1 : 1 + + static { + this.s1; +>this.s1 : any +>this : this +>s1 : any + + C.s1; +>C.s1 : number +>C : typeof C +>s1 : number + + this.s2; +>this.s2 : any +>this : this +>s2 : any + + C.s2; +>C.s2 : number +>C : typeof C +>s2 : number + } + + static s2 = 2; +>s2 : number +>2 : 2 + + static ss2 = this.s1; +>ss2 : number +>this.s1 : number +>this : typeof C +>s1 : number +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=esnext).errors.txt b/tests/baselines/reference/classStaticBlock4(target=esnext).errors.txt new file mode 100644 index 0000000000000..87e988d8b1c6e --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=esnext).errors.txt @@ -0,0 +1,27 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(5,14): error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(8,14): error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(13,18): error TS2334: 'this' cannot be referenced in a static property initializer. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts (3 errors) ==== + class C { + static s1 = 1; + + static { + this.s1; + ~~ +!!! error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? + C.s1; + + this.s2; + ~~ +!!! error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; + ~~~~ +!!! error TS2334: 'this' cannot be referenced in a static property initializer. + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock4(target=esnext).js b/tests/baselines/reference/classStaticBlock4(target=esnext).js new file mode 100644 index 0000000000000..9bc8a29c8ac43 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=esnext).js @@ -0,0 +1,29 @@ +//// [classStaticBlock4.ts] +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} + + +//// [classStaticBlock4.js] +class C { + static { + this.s1; + C.s1; + this.s2; + C.s2; + } +} +C.s1 = 1; +C.s2 = 2; +C.ss2 = this.s1; diff --git a/tests/baselines/reference/classStaticBlock4(target=esnext).symbols b/tests/baselines/reference/classStaticBlock4(target=esnext).symbols new file mode 100644 index 0000000000000..5b812c63d7121 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=esnext).symbols @@ -0,0 +1,35 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + static s1 = 1; +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + static { + this.s1; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s1; +>C.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + this.s2; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s2; +>C.s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + } + + static s2 = 2; +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + + static ss2 = this.s1; +>ss2 : Symbol(C.ss2, Decl(classStaticBlock4.ts, 11, 18)) +>this.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +} + diff --git a/tests/baselines/reference/classStaticBlock4(target=esnext).types b/tests/baselines/reference/classStaticBlock4(target=esnext).types new file mode 100644 index 0000000000000..91d7ba0613136 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4(target=esnext).types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : C + + static s1 = 1; +>s1 : number +>1 : 1 + + static { + this.s1; +>this.s1 : any +>this : this +>s1 : any + + C.s1; +>C.s1 : number +>C : typeof C +>s1 : number + + this.s2; +>this.s2 : any +>this : this +>s2 : any + + C.s2; +>C.s2 : number +>C : typeof C +>s2 : number + } + + static s2 = 2; +>s2 : number +>2 : 2 + + static ss2 = this.s1; +>ss2 : number +>this.s1 : number +>this : typeof C +>s1 : number +} + diff --git a/tests/baselines/reference/classStaticBlock4.errors.txt b/tests/baselines/reference/classStaticBlock4.errors.txt new file mode 100644 index 0000000000000..87e988d8b1c6e --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4.errors.txt @@ -0,0 +1,27 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(5,14): error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(8,14): error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts(13,18): error TS2334: 'this' cannot be referenced in a static property initializer. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts (3 errors) ==== + class C { + static s1 = 1; + + static { + this.s1; + ~~ +!!! error TS2576: Property 's1' does not exist on type 'C'. Did you mean to access the static member 'C.s1' instead? + C.s1; + + this.s2; + ~~ +!!! error TS2576: Property 's2' does not exist on type 'C'. Did you mean to access the static member 'C.s2' instead? + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; + ~~~~ +!!! error TS2334: 'this' cannot be referenced in a static property initializer. + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock4.js b/tests/baselines/reference/classStaticBlock4.js new file mode 100644 index 0000000000000..adba8791e76e7 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4.js @@ -0,0 +1,26 @@ +//// [classStaticBlock4.ts] +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} + + +//// [classStaticBlock4.js] +var C = /** @class */ (function () { + function C() { + } + C.s1 = 1; + C.s2 = 2; + C.ss2 = this.s1; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock4.symbols b/tests/baselines/reference/classStaticBlock4.symbols new file mode 100644 index 0000000000000..5b812c63d7121 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4.symbols @@ -0,0 +1,35 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + static s1 = 1; +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + static { + this.s1; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s1; +>C.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) + + this.s2; +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) + + C.s2; +>C.s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) +>C : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + } + + static s2 = 2; +>s2 : Symbol(C.s2, Decl(classStaticBlock4.ts, 9, 5)) + + static ss2 = this.s1; +>ss2 : Symbol(C.ss2, Decl(classStaticBlock4.ts, 11, 18)) +>this.s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +>this : Symbol(C, Decl(classStaticBlock4.ts, 0, 0)) +>s1 : Symbol(C.s1, Decl(classStaticBlock4.ts, 0, 9)) +} + diff --git a/tests/baselines/reference/classStaticBlock4.types b/tests/baselines/reference/classStaticBlock4.types new file mode 100644 index 0000000000000..91d7ba0613136 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock4.types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts === +class C { +>C : C + + static s1 = 1; +>s1 : number +>1 : 1 + + static { + this.s1; +>this.s1 : any +>this : this +>s1 : any + + C.s1; +>C.s1 : number +>C : typeof C +>s1 : number + + this.s2; +>this.s2 : any +>this : this +>s2 : any + + C.s2; +>C.s2 : number +>C : typeof C +>s2 : number + } + + static s2 = 2; +>s2 : number +>2 : 2 + + static ss2 = this.s1; +>ss2 : number +>this.s1 : number +>this : typeof C +>s1 : number +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).errors.txt b/tests/baselines/reference/classStaticBlock5(target=es2015).errors.txt new file mode 100644 index 0000000000000..eeabc4440f902 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(8,16): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(11,14): error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(12,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(13,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts (4 errors) ==== + class B { + static a = 1; + static b = 2; + } + + class C extends B { + static b = 3; + static c = super.a + ~~~~~ +!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. + + static { + this.b; + ~ +!!! error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? + super.b; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + super.a; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).js b/tests/baselines/reference/classStaticBlock5(target=es2015).js new file mode 100644 index 0000000000000..b23360c01866e --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).js @@ -0,0 +1,27 @@ +//// [classStaticBlock5.ts] +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} + + +//// [classStaticBlock5.js] +class B { +} +B.a = 1; +B.b = 2; +class C extends B { +} +C.b = 3; +C.c = super.a; diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).symbols b/tests/baselines/reference/classStaticBlock5(target=es2015).symbols new file mode 100644 index 0000000000000..2e0175423fafb --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static a = 1; +>a : Symbol(B.a, Decl(classStaticBlock5.ts, 0, 9)) + + static b = 2; +>b : Symbol(B.b, Decl(classStaticBlock5.ts, 1, 17)) +} + +class C extends B { +>C : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static b = 3; +>b : Symbol(C.b, Decl(classStaticBlock5.ts, 5, 19)) + + static c = super.a +>c : Symbol(C.c, Decl(classStaticBlock5.ts, 6, 17)) + + static { + this.b; +>this : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) + + super.b; + super.a; + } +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).types b/tests/baselines/reference/classStaticBlock5(target=es2015).types new file mode 100644 index 0000000000000..9e0dfa94d3fee --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : B + + static a = 1; +>a : number +>1 : 1 + + static b = 2; +>b : number +>2 : 2 +} + +class C extends B { +>C : C +>B : B + + static b = 3; +>b : number +>3 : 3 + + static c = super.a +>c : any +>super.a : any +>super : any +>a : any + + static { + this.b; +>this.b : any +>this : this +>b : any + + super.b; +>super.b : any +>super : any +>b : any + + super.a; +>super.a : any +>super : any +>a : any + } +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock5(target=es5).errors.txt new file mode 100644 index 0000000000000..eeabc4440f902 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es5).errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(8,16): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(11,14): error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(12,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(13,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts (4 errors) ==== + class B { + static a = 1; + static b = 2; + } + + class C extends B { + static b = 3; + static c = super.a + ~~~~~ +!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. + + static { + this.b; + ~ +!!! error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? + super.b; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + super.a; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).js b/tests/baselines/reference/classStaticBlock5(target=es5).js new file mode 100644 index 0000000000000..5f5d79c670049 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es5).js @@ -0,0 +1,50 @@ +//// [classStaticBlock5.ts] +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} + + +//// [classStaticBlock5.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var B = /** @class */ (function () { + function B() { + } + B.a = 1; + B.b = 2; + return B; +}()); +var C = /** @class */ (function (_super) { + __extends(C, _super); + function C() { + return _super !== null && _super.apply(this, arguments) || this; + } + C.b = 3; + C.c = _super.a; + return C; +}(B)); diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).symbols b/tests/baselines/reference/classStaticBlock5(target=es5).symbols new file mode 100644 index 0000000000000..2e0175423fafb --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es5).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static a = 1; +>a : Symbol(B.a, Decl(classStaticBlock5.ts, 0, 9)) + + static b = 2; +>b : Symbol(B.b, Decl(classStaticBlock5.ts, 1, 17)) +} + +class C extends B { +>C : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static b = 3; +>b : Symbol(C.b, Decl(classStaticBlock5.ts, 5, 19)) + + static c = super.a +>c : Symbol(C.c, Decl(classStaticBlock5.ts, 6, 17)) + + static { + this.b; +>this : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) + + super.b; + super.a; + } +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).types b/tests/baselines/reference/classStaticBlock5(target=es5).types new file mode 100644 index 0000000000000..9e0dfa94d3fee --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=es5).types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : B + + static a = 1; +>a : number +>1 : 1 + + static b = 2; +>b : number +>2 : 2 +} + +class C extends B { +>C : C +>B : B + + static b = 3; +>b : number +>3 : 3 + + static c = super.a +>c : any +>super.a : any +>super : any +>a : any + + static { + this.b; +>this.b : any +>this : this +>b : any + + super.b; +>super.b : any +>super : any +>b : any + + super.a; +>super.a : any +>super : any +>a : any + } +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=esnext).errors.txt b/tests/baselines/reference/classStaticBlock5(target=esnext).errors.txt new file mode 100644 index 0000000000000..eeabc4440f902 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=esnext).errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(8,16): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(11,14): error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(12,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(13,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts (4 errors) ==== + class B { + static a = 1; + static b = 2; + } + + class C extends B { + static b = 3; + static c = super.a + ~~~~~ +!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. + + static { + this.b; + ~ +!!! error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? + super.b; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + super.a; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock5(target=esnext).js b/tests/baselines/reference/classStaticBlock5(target=esnext).js new file mode 100644 index 0000000000000..8132aada6b28d --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=esnext).js @@ -0,0 +1,32 @@ +//// [classStaticBlock5.ts] +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} + + +//// [classStaticBlock5.js] +class B { +} +B.a = 1; +B.b = 2; +class C extends B { + static { + this.b; + super.b; + super.a; + } +} +C.b = 3; +C.c = super.a; diff --git a/tests/baselines/reference/classStaticBlock5(target=esnext).symbols b/tests/baselines/reference/classStaticBlock5(target=esnext).symbols new file mode 100644 index 0000000000000..2e0175423fafb --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=esnext).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static a = 1; +>a : Symbol(B.a, Decl(classStaticBlock5.ts, 0, 9)) + + static b = 2; +>b : Symbol(B.b, Decl(classStaticBlock5.ts, 1, 17)) +} + +class C extends B { +>C : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static b = 3; +>b : Symbol(C.b, Decl(classStaticBlock5.ts, 5, 19)) + + static c = super.a +>c : Symbol(C.c, Decl(classStaticBlock5.ts, 6, 17)) + + static { + this.b; +>this : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) + + super.b; + super.a; + } +} + diff --git a/tests/baselines/reference/classStaticBlock5(target=esnext).types b/tests/baselines/reference/classStaticBlock5(target=esnext).types new file mode 100644 index 0000000000000..9e0dfa94d3fee --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5(target=esnext).types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : B + + static a = 1; +>a : number +>1 : 1 + + static b = 2; +>b : number +>2 : 2 +} + +class C extends B { +>C : C +>B : B + + static b = 3; +>b : number +>3 : 3 + + static c = super.a +>c : any +>super.a : any +>super : any +>a : any + + static { + this.b; +>this.b : any +>this : this +>b : any + + super.b; +>super.b : any +>super : any +>b : any + + super.a; +>super.a : any +>super : any +>a : any + } +} + diff --git a/tests/baselines/reference/classStaticBlock5.errors.txt b/tests/baselines/reference/classStaticBlock5.errors.txt new file mode 100644 index 0000000000000..eeabc4440f902 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5.errors.txt @@ -0,0 +1,31 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(8,16): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(11,14): error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(12,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts(13,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts (4 errors) ==== + class B { + static a = 1; + static b = 2; + } + + class C extends B { + static b = 3; + static c = super.a + ~~~~~ +!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. + + static { + this.b; + ~ +!!! error TS2576: Property 'b' does not exist on type 'C'. Did you mean to access the static member 'C.b' instead? + super.b; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + super.a; + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock5.js b/tests/baselines/reference/classStaticBlock5.js new file mode 100644 index 0000000000000..5f5d79c670049 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5.js @@ -0,0 +1,50 @@ +//// [classStaticBlock5.ts] +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} + + +//// [classStaticBlock5.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var B = /** @class */ (function () { + function B() { + } + B.a = 1; + B.b = 2; + return B; +}()); +var C = /** @class */ (function (_super) { + __extends(C, _super); + function C() { + return _super !== null && _super.apply(this, arguments) || this; + } + C.b = 3; + C.c = _super.a; + return C; +}(B)); diff --git a/tests/baselines/reference/classStaticBlock5.symbols b/tests/baselines/reference/classStaticBlock5.symbols new file mode 100644 index 0000000000000..2e0175423fafb --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5.symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static a = 1; +>a : Symbol(B.a, Decl(classStaticBlock5.ts, 0, 9)) + + static b = 2; +>b : Symbol(B.b, Decl(classStaticBlock5.ts, 1, 17)) +} + +class C extends B { +>C : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) +>B : Symbol(B, Decl(classStaticBlock5.ts, 0, 0)) + + static b = 3; +>b : Symbol(C.b, Decl(classStaticBlock5.ts, 5, 19)) + + static c = super.a +>c : Symbol(C.c, Decl(classStaticBlock5.ts, 6, 17)) + + static { + this.b; +>this : Symbol(C, Decl(classStaticBlock5.ts, 3, 1)) + + super.b; + super.a; + } +} + diff --git a/tests/baselines/reference/classStaticBlock5.types b/tests/baselines/reference/classStaticBlock5.types new file mode 100644 index 0000000000000..9e0dfa94d3fee --- /dev/null +++ b/tests/baselines/reference/classStaticBlock5.types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts === +class B { +>B : B + + static a = 1; +>a : number +>1 : 1 + + static b = 2; +>b : number +>2 : 2 +} + +class C extends B { +>C : C +>B : B + + static b = 3; +>b : number +>3 : 3 + + static c = super.a +>c : any +>super.a : any +>super : any +>a : any + + static { + this.b; +>this.b : any +>this : this +>b : any + + super.b; +>super.b : any +>super : any +>b : any + + super.a; +>super.a : any +>super : any +>a : any + } +} + diff --git a/tests/baselines/reference/classStaticBlock6.errors.txt b/tests/baselines/reference/classStaticBlock6.errors.txt new file mode 100644 index 0000000000000..6b18acbb48a3b --- /dev/null +++ b/tests/baselines/reference/classStaticBlock6.errors.txt @@ -0,0 +1,33 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts(8,13): error TS1210: Invalid use of 'arguments'. Class definitions are automatically in strict mode. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts(9,13): error TS1210: Invalid use of 'eval'. Class definitions are automatically in strict mode. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts(18,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts (3 errors) ==== + class B { + static a = 1; + } + + class C extends B { + static { + var await = 1; + var arguments = 1; + ~~~~~~~~~ +!!! error TS1210: Invalid use of 'arguments'. Class definitions are automatically in strict mode. + var eval = 1; + ~~~~ +!!! error TS1210: Invalid use of 'eval'. Class definitions are automatically in strict mode. + + + await: if (true) { + + } + + arguments; + await; + super(); + ~~~~~ +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock6.js b/tests/baselines/reference/classStaticBlock6.js new file mode 100644 index 0000000000000..a2e3c0082ffd4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock6.js @@ -0,0 +1,52 @@ +//// [classStaticBlock6.ts] +class B { + static a = 1; +} + +class C extends B { + static { + var await = 1; + var arguments = 1; + var eval = 1; + + + await: if (true) { + + } + + arguments; + await; + super(); + } +} + + +//// [classStaticBlock6.js] +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var B = /** @class */ (function () { + function B() { + } + B.a = 1; + return B; +}()); +var C = /** @class */ (function (_super) { + __extends(C, _super); + function C() { + return _super !== null && _super.apply(this, arguments) || this; + } + return C; +}(B)); diff --git a/tests/baselines/reference/classStaticBlock6.symbols b/tests/baselines/reference/classStaticBlock6.symbols new file mode 100644 index 0000000000000..9d604e9bcabc3 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock6.symbols @@ -0,0 +1,37 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts === +class B { +>B : Symbol(B, Decl(classStaticBlock6.ts, 0, 0)) + + static a = 1; +>a : Symbol(B.a, Decl(classStaticBlock6.ts, 0, 9)) +} + +class C extends B { +>C : Symbol(C, Decl(classStaticBlock6.ts, 2, 1)) +>B : Symbol(B, Decl(classStaticBlock6.ts, 0, 0)) + + static { + var await = 1; +>await : Symbol(await, Decl(classStaticBlock6.ts, 6, 11)) + + var arguments = 1; +>arguments : Symbol(arguments, Decl(classStaticBlock6.ts, 7, 11)) + + var eval = 1; +>eval : Symbol(eval, Decl(classStaticBlock6.ts, 8, 11)) + + + await: if (true) { + + } + + arguments; +>arguments : Symbol(arguments, Decl(classStaticBlock6.ts, 7, 11)) + + await; +>await : Symbol(await, Decl(classStaticBlock6.ts, 6, 11)) + + super(); + } +} + diff --git a/tests/baselines/reference/classStaticBlock6.types b/tests/baselines/reference/classStaticBlock6.types new file mode 100644 index 0000000000000..11e2f3753bc6d --- /dev/null +++ b/tests/baselines/reference/classStaticBlock6.types @@ -0,0 +1,45 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts === +class B { +>B : B + + static a = 1; +>a : number +>1 : 1 +} + +class C extends B { +>C : C +>B : B + + static { + var await = 1; +>await : number +>1 : 1 + + var arguments = 1; +>arguments : number +>1 : 1 + + var eval = 1; +>eval : number +>1 : 1 + + + await: if (true) { +>await : any +>true : true + + } + + arguments; +>arguments : number + + await; +>await : number + + super(); +>super() : void +>super : any + } +} + diff --git a/tests/baselines/reference/classStaticBlock7.errors.txt b/tests/baselines/reference/classStaticBlock7.errors.txt new file mode 100644 index 0000000000000..891d67478e9d3 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock7.errors.txt @@ -0,0 +1,20 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts(3,9): error TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts(4,9): error TS1163: A 'yield' expression is only allowed in a generator body. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts(5,9): error TS1108: A 'return' statement can only be used within a function body. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts (3 errors) ==== + class C { + static { + await 1; + ~~~~~ +!!! error TS1308: 'await' expressions are only allowed within async functions and at the top levels of modules. + yield 1; + ~~~~~ +!!! error TS1163: A 'yield' expression is only allowed in a generator body. + return 1; + ~~~~~~ +!!! error TS1108: A 'return' statement can only be used within a function body. + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock7.js b/tests/baselines/reference/classStaticBlock7.js new file mode 100644 index 0000000000000..de4d361871310 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock7.js @@ -0,0 +1,16 @@ +//// [classStaticBlock7.ts] +class C { + static { + await 1; + yield 1; + return 1; + } +} + + +//// [classStaticBlock7.js] +var C = /** @class */ (function () { + function C() { + } + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock7.symbols b/tests/baselines/reference/classStaticBlock7.symbols new file mode 100644 index 0000000000000..ab40a1f74e18c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock7.symbols @@ -0,0 +1,11 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock7.ts, 0, 0)) + + static { + await 1; + yield 1; + return 1; + } +} + diff --git a/tests/baselines/reference/classStaticBlock7.types b/tests/baselines/reference/classStaticBlock7.types new file mode 100644 index 0000000000000..d1e8ba48866f6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock7.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts === +class C { +>C : C + + static { + await 1; +>await 1 : 1 +>1 : 1 + + yield 1; +>yield 1 : any +>1 : 1 + + return 1; +>1 : 1 + } +} + diff --git a/tests/baselines/reference/classStaticBlock8.errors.txt b/tests/baselines/reference/classStaticBlock8.errors.txt new file mode 100644 index 0000000000000..a605f7f309ea0 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock8.errors.txt @@ -0,0 +1,56 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(9,21): error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(12,21): error TS1107: Jump target cannot cross function boundary. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(15,21): error TS1107: Jump target cannot cross function boundary. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(25,13): error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(28,13): error TS1107: Jump target cannot cross function boundary. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(31,13): error TS1107: Jump target cannot cross function boundary. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts (6 errors) ==== + function foo (v: number) { + label: if (v) { + class C { + static { + if (v === 1) { + break label; + } + if (v === 2) { + continue label; + ~~~~~~~~~~~~~~~ +!!! error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. + } + if (v === 3) { + break + ~~~~~ +!!! error TS1107: Jump target cannot cross function boundary. + } + if (v === 4) { + continue + ~~~~~~~~ +!!! error TS1107: Jump target cannot cross function boundary. + } + + } + } + + if (v === 5) { + break label; + } + if (v === 6) { + continue label; + ~~~~~~~~~~~~~~~ +!!! error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. + } + if (v === 7) { + break; + ~~~~~~ +!!! error TS1107: Jump target cannot cross function boundary. + } + if (v === 8) { + continue; + ~~~~~~~~~ +!!! error TS1107: Jump target cannot cross function boundary. + } + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock8.js b/tests/baselines/reference/classStaticBlock8.js new file mode 100644 index 0000000000000..7b3bfe4f29978 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock8.js @@ -0,0 +1,59 @@ +//// [classStaticBlock8.ts] +function foo (v: number) { + label: if (v) { + class C { + static { + if (v === 1) { + break label; + } + if (v === 2) { + continue label; + } + if (v === 3) { + break + } + if (v === 4) { + continue + } + + } + } + + if (v === 5) { + break label; + } + if (v === 6) { + continue label; + } + if (v === 7) { + break; + } + if (v === 8) { + continue; + } + } +} + + +//// [classStaticBlock8.js] +function foo(v) { + label: if (v) { + var C = /** @class */ (function () { + function C() { + } + return C; + }()); + if (v === 5) { + break label; + } + if (v === 6) { + continue label; + } + if (v === 7) { + break; + } + if (v === 8) { + continue; + } + } +} diff --git a/tests/baselines/reference/classStaticBlock8.symbols b/tests/baselines/reference/classStaticBlock8.symbols new file mode 100644 index 0000000000000..ed735ce743148 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock8.symbols @@ -0,0 +1,59 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts === +function foo (v: number) { +>foo : Symbol(foo, Decl(classStaticBlock8.ts, 0, 0)) +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + label: if (v) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + class C { +>C : Symbol(C, Decl(classStaticBlock8.ts, 1, 19)) + + static { + if (v === 1) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + break label; + } + if (v === 2) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + continue label; + } + if (v === 3) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + break + } + if (v === 4) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + continue + } + + } + } + + if (v === 5) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + break label; + } + if (v === 6) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + continue label; + } + if (v === 7) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + break; + } + if (v === 8) { +>v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) + + continue; + } + } +} + diff --git a/tests/baselines/reference/classStaticBlock8.types b/tests/baselines/reference/classStaticBlock8.types new file mode 100644 index 0000000000000..485b067e289d6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock8.types @@ -0,0 +1,80 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts === +function foo (v: number) { +>foo : (v: number) => void +>v : number + + label: if (v) { +>label : any +>v : number + + class C { +>C : C + + static { + if (v === 1) { +>v === 1 : boolean +>v : number +>1 : 1 + + break label; +>label : any + } + if (v === 2) { +>v === 2 : boolean +>v : number +>2 : 2 + + continue label; +>label : any + } + if (v === 3) { +>v === 3 : boolean +>v : number +>3 : 3 + + break + } + if (v === 4) { +>v === 4 : boolean +>v : number +>4 : 4 + + continue + } + + } + } + + if (v === 5) { +>v === 5 : boolean +>v : number +>5 : 5 + + break label; +>label : any + } + if (v === 6) { +>v === 6 : boolean +>v : number +>6 : 6 + + continue label; +>label : any + } + if (v === 7) { +>v === 7 : boolean +>v : number +>7 : 7 + + break; + } + if (v === 8) { +>v === 8 : boolean +>v : number +>8 : 8 + + continue; + } + } +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).errors.txt b/tests/baselines/reference/classStaticBlock9(target=es2015).errors.txt new file mode 100644 index 0000000000000..32788846e768a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts(2,20): error TS2729: Property 'foo' is used before its initialization. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts (1 errors) ==== + class A { + static bar = A.foo + 1 + ~~~ +!!! error TS2729: Property 'foo' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts:6:12: 'foo' is declared here. + static { + A.foo + 2; + } + static foo = 1; + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).js b/tests/baselines/reference/classStaticBlock9(target=es2015).js new file mode 100644 index 0000000000000..6d77595ffba36 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).js @@ -0,0 +1,15 @@ +//// [classStaticBlock9.ts] +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} + + +//// [classStaticBlock9.js] +class A { +} +A.bar = A.foo + 1; +A.foo = 1; diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).symbols b/tests/baselines/reference/classStaticBlock9(target=es2015).symbols new file mode 100644 index 0000000000000..2cb44695c8328 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) + + static bar = A.foo + 1 +>bar : Symbol(A.bar, Decl(classStaticBlock9.ts, 0, 9)) +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + + static { + A.foo + 2; +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + } + static foo = 1; +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).types b/tests/baselines/reference/classStaticBlock9(target=es2015).types new file mode 100644 index 0000000000000..9ac192ac54bed --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : A + + static bar = A.foo + 1 +>bar : number +>A.foo + 1 : number +>A.foo : number +>A : typeof A +>foo : number +>1 : 1 + + static { + A.foo + 2; +>A.foo + 2 : number +>A.foo : number +>A : typeof A +>foo : number +>2 : 2 + } + static foo = 1; +>foo : number +>1 : 1 +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock9(target=es5).errors.txt new file mode 100644 index 0000000000000..32788846e768a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es5).errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts(2,20): error TS2729: Property 'foo' is used before its initialization. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts (1 errors) ==== + class A { + static bar = A.foo + 1 + ~~~ +!!! error TS2729: Property 'foo' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts:6:12: 'foo' is declared here. + static { + A.foo + 2; + } + static foo = 1; + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).js b/tests/baselines/reference/classStaticBlock9(target=es5).js new file mode 100644 index 0000000000000..1eb6145d9b62f --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es5).js @@ -0,0 +1,18 @@ +//// [classStaticBlock9.ts] +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} + + +//// [classStaticBlock9.js] +var A = /** @class */ (function () { + function A() { + } + A.bar = A.foo + 1; + A.foo = 1; + return A; +}()); diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).symbols b/tests/baselines/reference/classStaticBlock9(target=es5).symbols new file mode 100644 index 0000000000000..2cb44695c8328 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es5).symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) + + static bar = A.foo + 1 +>bar : Symbol(A.bar, Decl(classStaticBlock9.ts, 0, 9)) +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + + static { + A.foo + 2; +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + } + static foo = 1; +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).types b/tests/baselines/reference/classStaticBlock9(target=es5).types new file mode 100644 index 0000000000000..9ac192ac54bed --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=es5).types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : A + + static bar = A.foo + 1 +>bar : number +>A.foo + 1 : number +>A.foo : number +>A : typeof A +>foo : number +>1 : 1 + + static { + A.foo + 2; +>A.foo + 2 : number +>A.foo : number +>A : typeof A +>foo : number +>2 : 2 + } + static foo = 1; +>foo : number +>1 : 1 +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=esnext).errors.txt b/tests/baselines/reference/classStaticBlock9(target=esnext).errors.txt new file mode 100644 index 0000000000000..32788846e768a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=esnext).errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts(2,20): error TS2729: Property 'foo' is used before its initialization. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts (1 errors) ==== + class A { + static bar = A.foo + 1 + ~~~ +!!! error TS2729: Property 'foo' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts:6:12: 'foo' is declared here. + static { + A.foo + 2; + } + static foo = 1; + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock9(target=esnext).js b/tests/baselines/reference/classStaticBlock9(target=esnext).js new file mode 100644 index 0000000000000..e680483660562 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=esnext).js @@ -0,0 +1,18 @@ +//// [classStaticBlock9.ts] +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} + + +//// [classStaticBlock9.js] +class A { + static { + A.foo + 2; + } +} +A.bar = A.foo + 1; +A.foo = 1; diff --git a/tests/baselines/reference/classStaticBlock9(target=esnext).symbols b/tests/baselines/reference/classStaticBlock9(target=esnext).symbols new file mode 100644 index 0000000000000..2cb44695c8328 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=esnext).symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) + + static bar = A.foo + 1 +>bar : Symbol(A.bar, Decl(classStaticBlock9.ts, 0, 9)) +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + + static { + A.foo + 2; +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + } + static foo = 1; +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock9(target=esnext).types b/tests/baselines/reference/classStaticBlock9(target=esnext).types new file mode 100644 index 0000000000000..9ac192ac54bed --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9(target=esnext).types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : A + + static bar = A.foo + 1 +>bar : number +>A.foo + 1 : number +>A.foo : number +>A : typeof A +>foo : number +>1 : 1 + + static { + A.foo + 2; +>A.foo + 2 : number +>A.foo : number +>A : typeof A +>foo : number +>2 : 2 + } + static foo = 1; +>foo : number +>1 : 1 +} + diff --git a/tests/baselines/reference/classStaticBlock9.errors.txt b/tests/baselines/reference/classStaticBlock9.errors.txt new file mode 100644 index 0000000000000..32788846e768a --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts(2,20): error TS2729: Property 'foo' is used before its initialization. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts (1 errors) ==== + class A { + static bar = A.foo + 1 + ~~~ +!!! error TS2729: Property 'foo' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts:6:12: 'foo' is declared here. + static { + A.foo + 2; + } + static foo = 1; + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock9.js b/tests/baselines/reference/classStaticBlock9.js new file mode 100644 index 0000000000000..1eb6145d9b62f --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9.js @@ -0,0 +1,18 @@ +//// [classStaticBlock9.ts] +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} + + +//// [classStaticBlock9.js] +var A = /** @class */ (function () { + function A() { + } + A.bar = A.foo + 1; + A.foo = 1; + return A; +}()); diff --git a/tests/baselines/reference/classStaticBlock9.symbols b/tests/baselines/reference/classStaticBlock9.symbols new file mode 100644 index 0000000000000..2cb44695c8328 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9.symbols @@ -0,0 +1,20 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) + + static bar = A.foo + 1 +>bar : Symbol(A.bar, Decl(classStaticBlock9.ts, 0, 9)) +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + + static { + A.foo + 2; +>A.foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +>A : Symbol(A, Decl(classStaticBlock9.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) + } + static foo = 1; +>foo : Symbol(A.foo, Decl(classStaticBlock9.ts, 4, 5)) +} + diff --git a/tests/baselines/reference/classStaticBlock9.types b/tests/baselines/reference/classStaticBlock9.types new file mode 100644 index 0000000000000..9ac192ac54bed --- /dev/null +++ b/tests/baselines/reference/classStaticBlock9.types @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts === +class A { +>A : A + + static bar = A.foo + 1 +>bar : number +>A.foo + 1 : number +>A.foo : number +>A : typeof A +>foo : number +>1 : 1 + + static { + A.foo + 2; +>A.foo + 2 : number +>A.foo : number +>A : typeof A +>foo : number +>2 : 2 + } + static foo = 1; +>foo : number +>1 : 1 +} + diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts new file mode 100644 index 0000000000000..8a0edbfedbe1a --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock1.ts @@ -0,0 +1,10 @@ +// @target: esnext, es2015, es5 +const a = 2; + +class C { + static { + const a = 1; + + a; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts new file mode 100644 index 0000000000000..c6e1fc2244d99 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock10.ts @@ -0,0 +1,28 @@ +// @target: esnext, es2015, es5 +var a1 = 1; +var a2 = 1; +const b1 = 2; +const b2 = 2; + +function f () { + var a1 = 11; + const b1 = 22; + + class C1 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } + } +} + +class C2 { + static { + var a1 = 111; + var a2 = 111; + const b1 = 222; + const b2 = 222; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts new file mode 100644 index 0000000000000..292d7181bba5d --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock2.ts @@ -0,0 +1,20 @@ +// @target: esnext, es2015, es5 + +const a = 1; +const b = 2; + +class C { + static { + const a = 11; + + a; + b; + } + + static { + const a = 11; + + a; + b; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts new file mode 100644 index 0000000000000..f34912cb5b650 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock3.ts @@ -0,0 +1,19 @@ +// @target: esnext, es2015, es5 + +const a = 1; + +class C { + static f1 = 1; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f2 = 2; + + static { + console.log(C.f1, C.f2, C.f3) + } + + static f3 = 3; +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts new file mode 100644 index 0000000000000..2b8696fe08d5d --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock4.ts @@ -0,0 +1,16 @@ +// @target: esnext, es2015, es5 + +class C { + static s1 = 1; + + static { + this.s1; + C.s1; + + this.s2; + C.s2; + } + + static s2 = 2; + static ss2 = this.s1; +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts new file mode 100644 index 0000000000000..cd0f7276c1b5f --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock5.ts @@ -0,0 +1,17 @@ +// @target: esnext, es2015, es5 + +class B { + static a = 1; + static b = 2; +} + +class C extends B { + static b = 3; + static c = super.a + + static { + this.b; + super.b; + super.a; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts new file mode 100644 index 0000000000000..24eef812abc38 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock6.ts @@ -0,0 +1,20 @@ +class B { + static a = 1; +} + +class C extends B { + static { + var await = 1; + var arguments = 1; + var eval = 1; + + + await: if (true) { + + } + + arguments; + await; + super(); + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts new file mode 100644 index 0000000000000..d3daa8bd21cdb --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock7.ts @@ -0,0 +1,7 @@ +class C { + static { + await 1; + yield 1; + return 1; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts new file mode 100644 index 0000000000000..c1eb8ef10f16a --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts @@ -0,0 +1,33 @@ +function foo (v: number) { + label: while (v) { + class C { + static { + if (v === 1) { + break label; + } + if (v === 2) { + continue label; + } + if (v === 3) { + break + } + if (v === 4) { + continue + } + } + } + + if (v === 5) { + break label; + } + if (v === 6) { + continue label; + } + if (v === 7) { + break; + } + if (v === 8) { + continue; + } + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts new file mode 100644 index 0000000000000..d99157b190983 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock9.ts @@ -0,0 +1,8 @@ +// @target: esnext, es2015, es5 +class A { + static bar = A.foo + 1 + static { + A.foo + 2; + } + static foo = 1; +} From 820b1d2cf0ae018c06ab151e42876b968d74087f Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 19 Mar 2021 15:43:55 +0800 Subject: [PATCH 64/68] Add basic transformer --- src/compiler/factory/nodeFactory.ts | 2 +- src/compiler/transformers/classFields.ts | 27 +++++++++++++++++-- src/compiler/transformers/es2015.ts | 1 + src/compiler/transformers/utilities.ts | 2 +- .../classStaticBlock3(target=es2015).js | 12 +++++++++ .../classStaticBlock3(target=es5).js | 12 +++++++++ .../classStaticBlock4(target=es2015).js | 12 +++++++++ .../classStaticBlock4(target=es5).js | 13 +++++++++ .../classStaticBlock5(target=es2015).js | 11 ++++++++ .../classStaticBlock5(target=es5).js | 12 +++++++++ .../reference/classStaticBlock8.errors.txt | 21 +++++---------- .../baselines/reference/classStaticBlock8.js | 5 ++-- .../reference/classStaticBlock8.symbols | 5 ++-- .../reference/classStaticBlock8.types | 3 +-- .../classStaticBlock9(target=es2015).js | 9 +++++++ .../classStaticBlock9(target=es5).js | 9 +++++++ 16 files changed, 130 insertions(+), 26 deletions(-) diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index 2c1b1c7fb309f..3262f2bc94c42 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -1626,7 +1626,7 @@ namespace ts { ); node.staticToken = staticToken; node.body = body; - node.transformFlags = TransformFlags.ContainsESNext; + node.transformFlags = TransformFlags.ContainsClassFields; return node; } diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index 84a1f32c6f943..eccb3d4c29589 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -170,10 +170,19 @@ namespace ts { return visitForStatement(node as ForStatement); case SyntaxKind.TaggedTemplateExpression: return visitTaggedTemplateExpression(node as TaggedTemplateExpression); + case SyntaxKind.ClassStaticBlockDeclaration: + return visitClassStaticBlockDeclaration(node as ClassStaticBlockDeclaration); } return visitEachChild(node, visitor, context); } + function visitClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration) { + if (!shouldTransformPrivateElements) { + return visitEachChild(node, classElementVisitor, context); + } + return undefined; + } + function visitorDestructuringTarget(node: Node): VisitResult { switch (node.kind) { case SyntaxKind.ObjectLiteralExpression: @@ -503,6 +512,20 @@ namespace ts { return visitEachChild(node, visitor, context); } + function transformClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, receiver: LeftHandSideExpression) { + if (shouldTransformPrivateElements) { + receiver = visitNode(receiver, visitor, isExpression); + const right = factory.createImmediatelyInvokedArrowFunction(visitNodes(node.body.statements, visitor, isBlock)); + return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( + receiver, + factory.createUniqueName("_"), + right, + PrivateIdentifierKind.Field, + /*f*/ undefined + ); + } + } + function visitBinaryExpression(node: BinaryExpression) { if (shouldTransformPrivateElements) { if (isDestructuringAssignment(node)) { @@ -923,9 +946,9 @@ namespace ts { * @param properties An array of property declarations to transform. * @param receiver The receiver on which each property should be assigned. */ - function addPropertyStatements(statements: Statement[], properties: readonly PropertyDeclaration[], receiver: LeftHandSideExpression) { + function addPropertyStatements(statements: Statement[], properties: readonly (PropertyDeclaration | ClassStaticBlockDeclaration)[], receiver: LeftHandSideExpression) { for (const property of properties) { - const expression = transformProperty(property, receiver); + const expression = isClassStaticBlockDeclaration(property) ? transformClassStaticBlockDeclaration(property, receiver) : transformProperty(property, receiver); if (!expression) { continue; } diff --git a/src/compiler/transformers/es2015.ts b/src/compiler/transformers/es2015.ts index 6f28a651190e7..288a09a63f4b6 100644 --- a/src/compiler/transformers/es2015.ts +++ b/src/compiler/transformers/es2015.ts @@ -1595,6 +1595,7 @@ namespace ts { break; case SyntaxKind.Constructor: + case SyntaxKind.ClassStaticBlockDeclaration: // Constructors are handled in visitClassExpression/visitClassDeclaration break; diff --git a/src/compiler/transformers/utilities.ts b/src/compiler/transformers/utilities.ts index e1c3b0b957d6d..0bc1c3edcef2d 100644 --- a/src/compiler/transformers/utilities.ts +++ b/src/compiler/transformers/utilities.ts @@ -339,7 +339,7 @@ namespace ts { export function getProperties(node: ClassExpression | ClassDeclaration, requireInitializer: true, isStatic: boolean): readonly InitializedPropertyDeclaration[]; export function getProperties(node: ClassExpression | ClassDeclaration, requireInitializer: boolean, isStatic: boolean): readonly PropertyDeclaration[]; export function getProperties(node: ClassExpression | ClassDeclaration, requireInitializer: boolean, isStatic: boolean): readonly PropertyDeclaration[] { - return filter(node.members, m => isInitializedOrStaticProperty(m, requireInitializer, isStatic)) as PropertyDeclaration[]; + return filter(node.members, m => isInitializedOrStaticProperty(m, requireInitializer, isStatic) || isStatic && isClassStaticBlockDeclaration(m)) as PropertyDeclaration[]; } /** diff --git a/tests/baselines/reference/classStaticBlock3(target=es2015).js b/tests/baselines/reference/classStaticBlock3(target=es2015).js index 9d352771472d1..f188c5f0d4bef 100644 --- a/tests/baselines/reference/classStaticBlock3(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock3(target=es2015).js @@ -19,9 +19,21 @@ class C { //// [classStaticBlock3.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; const a = 1; class C { } C.f1 = 1; +__classPrivateFieldSet(C, _1, (() => { + console.log(C.f1, C.f2, C.f3); +})(), "f"); C.f2 = 2; +__classPrivateFieldSet(C, _2, (() => { + console.log(C.f1, C.f2, C.f3); +})(), "f"); C.f3 = 3; diff --git a/tests/baselines/reference/classStaticBlock3(target=es5).js b/tests/baselines/reference/classStaticBlock3(target=es5).js index 5dfb77ff34ba9..77151586b9810 100644 --- a/tests/baselines/reference/classStaticBlock3(target=es5).js +++ b/tests/baselines/reference/classStaticBlock3(target=es5).js @@ -19,12 +19,24 @@ class C { //// [classStaticBlock3.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; var a = 1; var C = /** @class */ (function () { function C() { } C.f1 = 1; + __classPrivateFieldSet(C, _1, (function () { + console.log(C.f1, C.f2, C.f3); + })(), "f"); C.f2 = 2; + __classPrivateFieldSet(C, _2, (function () { + console.log(C.f1, C.f2, C.f3); + })(), "f"); C.f3 = 3; return C; }()); diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).js b/tests/baselines/reference/classStaticBlock4(target=es2015).js index 05889c7f02fa9..faa662beb8d0a 100644 --- a/tests/baselines/reference/classStaticBlock4(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).js @@ -16,8 +16,20 @@ class C { //// [classStaticBlock4.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; class C { } C.s1 = 1; +__classPrivateFieldSet(C, _1, (() => { + this.s1; + C.s1; + this.s2; + C.s2; +})(), "f"); C.s2 = 2; C.ss2 = this.s1; diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).js b/tests/baselines/reference/classStaticBlock4(target=es5).js index adba8791e76e7..1e70d121bba3f 100644 --- a/tests/baselines/reference/classStaticBlock4(target=es5).js +++ b/tests/baselines/reference/classStaticBlock4(target=es5).js @@ -16,10 +16,23 @@ class C { //// [classStaticBlock4.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _this = this; var C = /** @class */ (function () { function C() { } C.s1 = 1; + __classPrivateFieldSet(C, _1, (function () { + _this.s1; + C.s1; + _this.s2; + C.s2; + })(), "f"); C.s2 = 2; C.ss2 = this.s1; return C; diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).js b/tests/baselines/reference/classStaticBlock5(target=es2015).js index b23360c01866e..18515f7dddb0c 100644 --- a/tests/baselines/reference/classStaticBlock5(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).js @@ -17,6 +17,12 @@ class C extends B { //// [classStaticBlock5.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; class B { } B.a = 1; @@ -25,3 +31,8 @@ class C extends B { } C.b = 3; C.c = super.a; +__classPrivateFieldSet(C, _1, (() => { + this.b; + super.b; + super.a; +})(), "f"); diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).js b/tests/baselines/reference/classStaticBlock5(target=es5).js index 5f5d79c670049..cb5588cf934a3 100644 --- a/tests/baselines/reference/classStaticBlock5(target=es5).js +++ b/tests/baselines/reference/classStaticBlock5(target=es5).js @@ -32,6 +32,13 @@ var __extends = (this && this.__extends) || (function () { d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _this = this; var B = /** @class */ (function () { function B() { } @@ -46,5 +53,10 @@ var C = /** @class */ (function (_super) { } C.b = 3; C.c = _super.a; + __classPrivateFieldSet(C, _1, (function () { + _this.b; + _super.b; + _super.a; + })(), "f"); return C; }(B)); diff --git a/tests/baselines/reference/classStaticBlock8.errors.txt b/tests/baselines/reference/classStaticBlock8.errors.txt index a605f7f309ea0..ec20040143e3c 100644 --- a/tests/baselines/reference/classStaticBlock8.errors.txt +++ b/tests/baselines/reference/classStaticBlock8.errors.txt @@ -1,23 +1,23 @@ -tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(9,21): error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(6,21): error TS1107: Jump target cannot cross function boundary. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(9,21): error TS1107: Jump target cannot cross function boundary. tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(12,21): error TS1107: Jump target cannot cross function boundary. tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(15,21): error TS1107: Jump target cannot cross function boundary. -tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(25,13): error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. -tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(28,13): error TS1107: Jump target cannot cross function boundary. -tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(31,13): error TS1107: Jump target cannot cross function boundary. -==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts (6 errors) ==== +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts (4 errors) ==== function foo (v: number) { - label: if (v) { + label: while (v) { class C { static { if (v === 1) { break label; + ~~~~~~~~~~~~ +!!! error TS1107: Jump target cannot cross function boundary. } if (v === 2) { continue label; ~~~~~~~~~~~~~~~ -!!! error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. +!!! error TS1107: Jump target cannot cross function boundary. } if (v === 3) { break @@ -29,7 +29,6 @@ tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(31,13): er ~~~~~~~~ !!! error TS1107: Jump target cannot cross function boundary. } - } } @@ -38,18 +37,12 @@ tests/cases/conformance/classes/classStaticBlock/classStaticBlock8.ts(31,13): er } if (v === 6) { continue label; - ~~~~~~~~~~~~~~~ -!!! error TS1115: A 'continue' statement can only jump to a label of an enclosing iteration statement. } if (v === 7) { break; - ~~~~~~ -!!! error TS1107: Jump target cannot cross function boundary. } if (v === 8) { continue; - ~~~~~~~~~ -!!! error TS1107: Jump target cannot cross function boundary. } } } diff --git a/tests/baselines/reference/classStaticBlock8.js b/tests/baselines/reference/classStaticBlock8.js index 7b3bfe4f29978..a8667ac2a80bb 100644 --- a/tests/baselines/reference/classStaticBlock8.js +++ b/tests/baselines/reference/classStaticBlock8.js @@ -1,6 +1,6 @@ //// [classStaticBlock8.ts] function foo (v: number) { - label: if (v) { + label: while (v) { class C { static { if (v === 1) { @@ -15,7 +15,6 @@ function foo (v: number) { if (v === 4) { continue } - } } @@ -37,7 +36,7 @@ function foo (v: number) { //// [classStaticBlock8.js] function foo(v) { - label: if (v) { + label: while (v) { var C = /** @class */ (function () { function C() { } diff --git a/tests/baselines/reference/classStaticBlock8.symbols b/tests/baselines/reference/classStaticBlock8.symbols index ed735ce743148..0d0c47c2aa459 100644 --- a/tests/baselines/reference/classStaticBlock8.symbols +++ b/tests/baselines/reference/classStaticBlock8.symbols @@ -3,11 +3,11 @@ function foo (v: number) { >foo : Symbol(foo, Decl(classStaticBlock8.ts, 0, 0)) >v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) - label: if (v) { + label: while (v) { >v : Symbol(v, Decl(classStaticBlock8.ts, 0, 14)) class C { ->C : Symbol(C, Decl(classStaticBlock8.ts, 1, 19)) +>C : Symbol(C, Decl(classStaticBlock8.ts, 1, 22)) static { if (v === 1) { @@ -30,7 +30,6 @@ function foo (v: number) { continue } - } } diff --git a/tests/baselines/reference/classStaticBlock8.types b/tests/baselines/reference/classStaticBlock8.types index 485b067e289d6..3c360846b9b1c 100644 --- a/tests/baselines/reference/classStaticBlock8.types +++ b/tests/baselines/reference/classStaticBlock8.types @@ -3,7 +3,7 @@ function foo (v: number) { >foo : (v: number) => void >v : number - label: if (v) { + label: while (v) { >label : any >v : number @@ -41,7 +41,6 @@ function foo (v: number) { continue } - } } diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).js b/tests/baselines/reference/classStaticBlock9(target=es2015).js index 6d77595ffba36..65435050082bf 100644 --- a/tests/baselines/reference/classStaticBlock9(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).js @@ -9,7 +9,16 @@ class A { //// [classStaticBlock9.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; class A { } A.bar = A.foo + 1; +__classPrivateFieldSet(A, _1, (() => { + A.foo + 2; +})(), "f"); A.foo = 1; diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).js b/tests/baselines/reference/classStaticBlock9(target=es5).js index 1eb6145d9b62f..85d97efacbe6a 100644 --- a/tests/baselines/reference/classStaticBlock9(target=es5).js +++ b/tests/baselines/reference/classStaticBlock9(target=es5).js @@ -9,10 +9,19 @@ class A { //// [classStaticBlock9.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; var A = /** @class */ (function () { function A() { } A.bar = A.foo + 1; + __classPrivateFieldSet(A, _1, (function () { + A.foo + 2; + })(), "f"); A.foo = 1; return A; }()); From 4654f6470c7c87cbc636cec8c96e61bbf88ce648 Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 19 Mar 2021 16:51:00 +0800 Subject: [PATCH 65/68] Fix emit behavior --- src/compiler/factory/nodeFactory.ts | 2 +- src/compiler/transformers/classFields.ts | 14 +++---- .../classStaticBlock11(target=es2015).js | 40 ++++++++++++++++++ .../classStaticBlock11(target=es2015).symbols | 30 ++++++++++++++ .../classStaticBlock11(target=es2015).types | 33 +++++++++++++++ .../classStaticBlock11(target=es5).errors.txt | 19 +++++++++ .../classStaticBlock11(target=es5).js | 41 +++++++++++++++++++ .../classStaticBlock11(target=es5).symbols | 30 ++++++++++++++ .../classStaticBlock11(target=es5).types | 33 +++++++++++++++ .../classStaticBlock11(target=esnext).js | 28 +++++++++++++ .../classStaticBlock11(target=esnext).symbols | 30 ++++++++++++++ .../classStaticBlock11(target=esnext).types | 33 +++++++++++++++ .../reference/classStaticBlock12.errors.txt | 14 +++++++ .../baselines/reference/classStaticBlock12.js | 27 ++++++++++++ .../reference/classStaticBlock12.symbols | 14 +++++++ .../reference/classStaticBlock12.types | 15 +++++++ .../classStaticBlock13(target=es2015).js | 31 ++++++++++++++ .../classStaticBlock13(target=es2015).symbols | 25 +++++++++++ .../classStaticBlock13(target=es2015).types | 27 ++++++++++++ .../classStaticBlock13(target=es5).errors.txt | 18 ++++++++ .../classStaticBlock13(target=es5).js | 39 ++++++++++++++++++ .../classStaticBlock13(target=es5).symbols | 25 +++++++++++ .../classStaticBlock13(target=es5).types | 27 ++++++++++++ .../classStaticBlock13(target=esnext).js | 24 +++++++++++ .../classStaticBlock13(target=esnext).symbols | 25 +++++++++++ .../classStaticBlock13(target=esnext).types | 27 ++++++++++++ .../reference/classStaticBlock14.errors.txt | 25 +++++++++++ .../baselines/reference/classStaticBlock14.js | 38 +++++++++++++++++ .../reference/classStaticBlock14.symbols | 21 ++++++++++ .../reference/classStaticBlock14.types | 24 +++++++++++ ...assStaticBlock15(target=es2015).errors.txt | 21 ++++++++++ .../classStaticBlock15(target=es2015).js | 38 +++++++++++++++++ .../classStaticBlock15(target=es2015).symbols | 26 ++++++++++++ .../classStaticBlock15(target=es2015).types | 31 ++++++++++++++ .../classStaticBlock15(target=es5).errors.txt | 30 ++++++++++++++ .../classStaticBlock15(target=es5).js | 41 +++++++++++++++++++ .../classStaticBlock15(target=es5).symbols | 26 ++++++++++++ .../classStaticBlock15(target=es5).types | 31 ++++++++++++++ ...assStaticBlock15(target=esnext).errors.txt | 21 ++++++++++ .../classStaticBlock15(target=esnext).js | 30 ++++++++++++++ .../classStaticBlock15(target=esnext).symbols | 26 ++++++++++++ .../classStaticBlock15(target=esnext).types | 31 ++++++++++++++ .../classStaticBlock3(target=es2015).js | 19 ++++----- .../classStaticBlock3(target=es5).js | 19 ++++----- .../classStaticBlock4(target=es2015).js | 19 ++++----- .../classStaticBlock4(target=es5).js | 19 ++++----- .../classStaticBlock5(target=es2015).js | 17 +++----- .../classStaticBlock5(target=es5).js | 17 +++----- .../classStaticBlock9(target=es2015).js | 13 ++---- .../classStaticBlock9(target=es5).js | 13 ++---- .../classStaticBlock/classStaticBlock11.ts | 14 +++++++ .../classStaticBlock/classStaticBlock12.ts | 9 ++++ .../classStaticBlock/classStaticBlock13.ts | 14 +++++++ .../classStaticBlock/classStaticBlock14.ts | 14 +++++++ .../classStaticBlock/classStaticBlock15.ts | 17 ++++++++ 55 files changed, 1238 insertions(+), 97 deletions(-) create mode 100644 tests/baselines/reference/classStaticBlock11(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock11(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock11(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock11(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock11(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock11(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock11(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock11(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock11(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock11(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock12.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock12.js create mode 100644 tests/baselines/reference/classStaticBlock12.symbols create mode 100644 tests/baselines/reference/classStaticBlock12.types create mode 100644 tests/baselines/reference/classStaticBlock13(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock13(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock13(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock13(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock13(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock13(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock13(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock13(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock13(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock13(target=esnext).types create mode 100644 tests/baselines/reference/classStaticBlock14.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock14.js create mode 100644 tests/baselines/reference/classStaticBlock14.symbols create mode 100644 tests/baselines/reference/classStaticBlock14.types create mode 100644 tests/baselines/reference/classStaticBlock15(target=es2015).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock15(target=es2015).js create mode 100644 tests/baselines/reference/classStaticBlock15(target=es2015).symbols create mode 100644 tests/baselines/reference/classStaticBlock15(target=es2015).types create mode 100644 tests/baselines/reference/classStaticBlock15(target=es5).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock15(target=es5).js create mode 100644 tests/baselines/reference/classStaticBlock15(target=es5).symbols create mode 100644 tests/baselines/reference/classStaticBlock15(target=es5).types create mode 100644 tests/baselines/reference/classStaticBlock15(target=esnext).errors.txt create mode 100644 tests/baselines/reference/classStaticBlock15(target=esnext).js create mode 100644 tests/baselines/reference/classStaticBlock15(target=esnext).symbols create mode 100644 tests/baselines/reference/classStaticBlock15(target=esnext).types create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts diff --git a/src/compiler/factory/nodeFactory.ts b/src/compiler/factory/nodeFactory.ts index 3262f2bc94c42..4e14bb1b907db 100644 --- a/src/compiler/factory/nodeFactory.ts +++ b/src/compiler/factory/nodeFactory.ts @@ -1626,7 +1626,7 @@ namespace ts { ); node.staticToken = staticToken; node.body = body; - node.transformFlags = TransformFlags.ContainsClassFields; + node.transformFlags = propagateChildFlags(body) | TransformFlags.ContainsClassFields; return node; } diff --git a/src/compiler/transformers/classFields.ts b/src/compiler/transformers/classFields.ts index eccb3d4c29589..f0090aa0173e1 100644 --- a/src/compiler/transformers/classFields.ts +++ b/src/compiler/transformers/classFields.ts @@ -515,13 +515,11 @@ namespace ts { function transformClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, receiver: LeftHandSideExpression) { if (shouldTransformPrivateElements) { receiver = visitNode(receiver, visitor, isExpression); - const right = factory.createImmediatelyInvokedArrowFunction(visitNodes(node.body.statements, visitor, isBlock)); - return context.getEmitHelperFactory().createClassPrivateFieldSetHelper( - receiver, - factory.createUniqueName("_"), - right, - PrivateIdentifierKind.Field, - /*f*/ undefined + const right = factory.createImmediatelyInvokedArrowFunction(visitNode(node.body, visitor, isBlock).statements); + const name = createHoistedVariableForClass("_", node); + return createPrivateStaticFieldInitializer( + name, + right ); } } @@ -1313,7 +1311,7 @@ namespace ts { getPendingExpressions().push(...assignmentExpressions); } - function createHoistedVariableForClass(name: string, node: PrivateIdentifier): Identifier { + function createHoistedVariableForClass(name: string, node: PrivateIdentifier | ClassStaticBlockDeclaration): Identifier { const { className } = getPrivateIdentifierEnvironment(); const prefix = className ? `_${className}` : ""; const identifier = factory.createUniqueName(`${prefix}_${name}`, GeneratedIdentifierFlags.Optimistic); diff --git a/tests/baselines/reference/classStaticBlock11(target=es2015).js b/tests/baselines/reference/classStaticBlock11(target=es2015).js new file mode 100644 index 0000000000000..b218d2f8a4a5f --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es2015).js @@ -0,0 +1,40 @@ +//// [classStaticBlock11.ts] +let getX; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } +} + + +//// [classStaticBlock11.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _C_x, _C__; +let getX; +class C { + constructor(x) { + _C_x.set(this, 1); + __classPrivateFieldSet(this, _C_x, x, "f"); + } +} +_C_x = new WeakMap(); +_C__ = { value: (() => { + // getX has privileged access to #x + getX = (obj) => __classPrivateFieldGet(obj, _C_x, "f"); + })() }; diff --git a/tests/baselines/reference/classStaticBlock11(target=es2015).symbols b/tests/baselines/reference/classStaticBlock11(target=es2015).symbols new file mode 100644 index 0000000000000..d61ff7c9e16f9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es2015).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) + +class C { +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) + + #x = 1 +>#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) + + constructor(x: number) { +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + + this.#x = x; +>this.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>this : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>obj.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock11(target=es2015).types b/tests/baselines/reference/classStaticBlock11(target=es2015).types new file mode 100644 index 0000000000000..c295e7b93df36 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es2015).types @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : any + +class C { +>C : C + + #x = 1 +>#x : number +>1 : 1 + + constructor(x: number) { +>x : number + + this.#x = x; +>this.#x = x : number +>this.#x : number +>this : this +>x : number + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX = (obj: C) => obj.#x : (obj: C) => number +>getX : any +>(obj: C) => obj.#x : (obj: C) => number +>obj : C +>obj.#x : number +>obj : C + } +} + diff --git a/tests/baselines/reference/classStaticBlock11(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock11(target=es5).errors.txt new file mode 100644 index 0000000000000..e84ce1a7415b6 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es5).errors.txt @@ -0,0 +1,19 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts(3,3): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts (1 errors) ==== + let getX; + class C { + #x = 1 + ~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock11(target=es5).js b/tests/baselines/reference/classStaticBlock11(target=es5).js new file mode 100644 index 0000000000000..fcf8c8f1196fd --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es5).js @@ -0,0 +1,41 @@ +//// [classStaticBlock11.ts] +let getX; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } +} + + +//// [classStaticBlock11.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _C_x, _C__; +var getX; +var C = /** @class */ (function () { + function C(x) { + _C_x.set(this, 1); + __classPrivateFieldSet(this, _C_x, x, "f"); + } + return C; +}()); +_C_x = new WeakMap(); +_C__ = { value: (function () { + // getX has privileged access to #x + getX = function (obj) { return __classPrivateFieldGet(obj, _C_x, "f"); }; + })() }; diff --git a/tests/baselines/reference/classStaticBlock11(target=es5).symbols b/tests/baselines/reference/classStaticBlock11(target=es5).symbols new file mode 100644 index 0000000000000..d61ff7c9e16f9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es5).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) + +class C { +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) + + #x = 1 +>#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) + + constructor(x: number) { +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + + this.#x = x; +>this.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>this : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>obj.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock11(target=es5).types b/tests/baselines/reference/classStaticBlock11(target=es5).types new file mode 100644 index 0000000000000..c295e7b93df36 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=es5).types @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : any + +class C { +>C : C + + #x = 1 +>#x : number +>1 : 1 + + constructor(x: number) { +>x : number + + this.#x = x; +>this.#x = x : number +>this.#x : number +>this : this +>x : number + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX = (obj: C) => obj.#x : (obj: C) => number +>getX : any +>(obj: C) => obj.#x : (obj: C) => number +>obj : C +>obj.#x : number +>obj : C + } +} + diff --git a/tests/baselines/reference/classStaticBlock11(target=esnext).js b/tests/baselines/reference/classStaticBlock11(target=esnext).js new file mode 100644 index 0000000000000..af7697baf6644 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=esnext).js @@ -0,0 +1,28 @@ +//// [classStaticBlock11.ts] +let getX; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } +} + + +//// [classStaticBlock11.js] +let getX; +class C { + constructor(x) { + this.#x = 1; + this.#x = x; + } + #x; + static { + // getX has privileged access to #x + getX = (obj) => obj.#x; + } +} diff --git a/tests/baselines/reference/classStaticBlock11(target=esnext).symbols b/tests/baselines/reference/classStaticBlock11(target=esnext).symbols new file mode 100644 index 0000000000000..d61ff7c9e16f9 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=esnext).symbols @@ -0,0 +1,30 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) + +class C { +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) + + #x = 1 +>#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) + + constructor(x: number) { +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + + this.#x = x; +>this.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>this : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>x : Symbol(x, Decl(classStaticBlock11.ts, 3, 14)) + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX : Symbol(getX, Decl(classStaticBlock11.ts, 0, 3)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) +>C : Symbol(C, Decl(classStaticBlock11.ts, 0, 9)) +>obj.#x : Symbol(C.#x, Decl(classStaticBlock11.ts, 1, 9)) +>obj : Symbol(obj, Decl(classStaticBlock11.ts, 9, 12)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock11(target=esnext).types b/tests/baselines/reference/classStaticBlock11(target=esnext).types new file mode 100644 index 0000000000000..c295e7b93df36 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock11(target=esnext).types @@ -0,0 +1,33 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts === +let getX; +>getX : any + +class C { +>C : C + + #x = 1 +>#x : number +>1 : 1 + + constructor(x: number) { +>x : number + + this.#x = x; +>this.#x = x : number +>this.#x : number +>this : this +>x : number + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX = (obj: C) => obj.#x : (obj: C) => number +>getX : any +>(obj: C) => obj.#x : (obj: C) => number +>obj : C +>obj.#x : number +>obj : C + } +} + diff --git a/tests/baselines/reference/classStaticBlock12.errors.txt b/tests/baselines/reference/classStaticBlock12.errors.txt new file mode 100644 index 0000000000000..d4535ca1542bd --- /dev/null +++ b/tests/baselines/reference/classStaticBlock12.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts(2,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts (1 errors) ==== + class C { + static #x = 1; + ~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + static { + C.#x; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock12.js b/tests/baselines/reference/classStaticBlock12.js new file mode 100644 index 0000000000000..fd85eadf08087 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock12.js @@ -0,0 +1,27 @@ +//// [classStaticBlock12.ts] +class C { + static #x = 1; + + static { + C.#x; + } +} + + +//// [classStaticBlock12.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var C = /** @class */ (function () { + function C() { + } + var _a, _C_x, _C__; + _a = C; + _C_x = { value: 1 }; + _C__ = { value: (function () { + __classPrivateFieldGet(C, _a, "f", _C_x); + })() }; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock12.symbols b/tests/baselines/reference/classStaticBlock12.symbols new file mode 100644 index 0000000000000..3d11bc442fb76 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock12.symbols @@ -0,0 +1,14 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock12.ts, 0, 0)) + + static #x = 1; +>#x : Symbol(C.#x, Decl(classStaticBlock12.ts, 0, 9)) + + static { + C.#x; +>C.#x : Symbol(C.#x, Decl(classStaticBlock12.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock12.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock12.types b/tests/baselines/reference/classStaticBlock12.types new file mode 100644 index 0000000000000..4e441c1829ece --- /dev/null +++ b/tests/baselines/reference/classStaticBlock12.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts === +class C { +>C : C + + static #x = 1; +>#x : number +>1 : 1 + + static { + C.#x; +>C.#x : number +>C : typeof C + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=es2015).js b/tests/baselines/reference/classStaticBlock13(target=es2015).js new file mode 100644 index 0000000000000..521c946a38113 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es2015).js @@ -0,0 +1,31 @@ +//// [classStaticBlock13.ts] +class C { + static #x = 123; + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } +} + + +//// [classStaticBlock13.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _a, _C_x, _C__; +class C { + foo() { + return __classPrivateFieldGet(C, _a, "f", _C_x); + } +} +_a = C; +_C_x = { value: 123 }; +_C__ = { value: (() => { + console.log(__classPrivateFieldGet(C, _a, "f", _C_x)); + })() }; diff --git a/tests/baselines/reference/classStaticBlock13(target=es2015).symbols b/tests/baselines/reference/classStaticBlock13(target=es2015).symbols new file mode 100644 index 0000000000000..7f94ddadbe167 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es2015).symbols @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + + static #x = 123; +>#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) + + static { + console.log(C.#x) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } + + foo () { +>foo : Symbol(C.foo, Decl(classStaticBlock13.ts, 5, 3)) + + return C.#x; +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=es2015).types b/tests/baselines/reference/classStaticBlock13(target=es2015).types new file mode 100644 index 0000000000000..735409daa5c44 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es2015).types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : C + + static #x = 123; +>#x : number +>123 : 123 + + static { + console.log(C.#x) +>console.log(C.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.#x : number +>C : typeof C + } + + foo () { +>foo : () => number + + return C.#x; +>C.#x : number +>C : typeof C + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock13(target=es5).errors.txt new file mode 100644 index 0000000000000..e0f90aaa81975 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es5).errors.txt @@ -0,0 +1,18 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts(2,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts (1 errors) ==== + class C { + static #x = 123; + ~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock13(target=es5).js b/tests/baselines/reference/classStaticBlock13(target=es5).js new file mode 100644 index 0000000000000..25fc0311041a4 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es5).js @@ -0,0 +1,39 @@ +//// [classStaticBlock13.ts] +class C { + static #x = 123; + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } +} + + +//// [classStaticBlock13.js] +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var C = /** @class */ (function () { + function C() { + } + Object.defineProperty(C.prototype, "foo", { + enumerable: false, + configurable: true, + writable: true, + value: function () { + return __classPrivateFieldGet(C, _a, "f", _C_x); + } + }); + var _a, _C_x, _C__; + _a = C; + _C_x = { value: 123 }; + _C__ = { value: (function () { + console.log(__classPrivateFieldGet(C, _a, "f", _C_x)); + })() }; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock13(target=es5).symbols b/tests/baselines/reference/classStaticBlock13(target=es5).symbols new file mode 100644 index 0000000000000..7f94ddadbe167 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es5).symbols @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + + static #x = 123; +>#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) + + static { + console.log(C.#x) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } + + foo () { +>foo : Symbol(C.foo, Decl(classStaticBlock13.ts, 5, 3)) + + return C.#x; +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=es5).types b/tests/baselines/reference/classStaticBlock13(target=es5).types new file mode 100644 index 0000000000000..735409daa5c44 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=es5).types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : C + + static #x = 123; +>#x : number +>123 : 123 + + static { + console.log(C.#x) +>console.log(C.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.#x : number +>C : typeof C + } + + foo () { +>foo : () => number + + return C.#x; +>C.#x : number +>C : typeof C + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=esnext).js b/tests/baselines/reference/classStaticBlock13(target=esnext).js new file mode 100644 index 0000000000000..5821962aee033 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=esnext).js @@ -0,0 +1,24 @@ +//// [classStaticBlock13.ts] +class C { + static #x = 123; + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } +} + + +//// [classStaticBlock13.js] +class C { + static #x = 123; + static { + console.log(C.#x); + } + foo() { + return C.#x; + } +} diff --git a/tests/baselines/reference/classStaticBlock13(target=esnext).symbols b/tests/baselines/reference/classStaticBlock13(target=esnext).symbols new file mode 100644 index 0000000000000..7f94ddadbe167 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=esnext).symbols @@ -0,0 +1,25 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + + static #x = 123; +>#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) + + static { + console.log(C.#x) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } + + foo () { +>foo : Symbol(C.foo, Decl(classStaticBlock13.ts, 5, 3)) + + return C.#x; +>C.#x : Symbol(C.#x, Decl(classStaticBlock13.ts, 0, 9)) +>C : Symbol(C, Decl(classStaticBlock13.ts, 0, 0)) + } +} + diff --git a/tests/baselines/reference/classStaticBlock13(target=esnext).types b/tests/baselines/reference/classStaticBlock13(target=esnext).types new file mode 100644 index 0000000000000..735409daa5c44 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock13(target=esnext).types @@ -0,0 +1,27 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts === +class C { +>C : C + + static #x = 123; +>#x : number +>123 : 123 + + static { + console.log(C.#x) +>console.log(C.#x) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>C.#x : number +>C : typeof C + } + + foo () { +>foo : () => number + + return C.#x; +>C.#x : number +>C : typeof C + } +} + diff --git a/tests/baselines/reference/classStaticBlock14.errors.txt b/tests/baselines/reference/classStaticBlock14.errors.txt new file mode 100644 index 0000000000000..e88e1244dd6df --- /dev/null +++ b/tests/baselines/reference/classStaticBlock14.errors.txt @@ -0,0 +1,25 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts(2,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts(3,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts(4,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts (3 errors) ==== + class C { + static #_1 = 1; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + static #_3 = 1; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + static #_5 = 1; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + static {} + static {} + static {} + static {} + static {} + static {} + } + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock14.js b/tests/baselines/reference/classStaticBlock14.js new file mode 100644 index 0000000000000..4420febdac50f --- /dev/null +++ b/tests/baselines/reference/classStaticBlock14.js @@ -0,0 +1,38 @@ +//// [classStaticBlock14.ts] +class C { + static #_1 = 1; + static #_3 = 1; + static #_5 = 1; + + static {} + static {} + static {} + static {} + static {} + static {} +} + + +//// [classStaticBlock14.js] +var C = /** @class */ (function () { + function C() { + } + var _a, _C__1, _C__3, _C__5, _C__, _C__2, _C__4, _C__6, _C__7, _C__8; + _a = C; + _C__1 = { value: 1 }; + _C__3 = { value: 1 }; + _C__5 = { value: 1 }; + _C__ = { value: (function () { + })() }; + _C__2 = { value: (function () { + })() }; + _C__4 = { value: (function () { + })() }; + _C__6 = { value: (function () { + })() }; + _C__7 = { value: (function () { + })() }; + _C__8 = { value: (function () { + })() }; + return C; +}()); diff --git a/tests/baselines/reference/classStaticBlock14.symbols b/tests/baselines/reference/classStaticBlock14.symbols new file mode 100644 index 0000000000000..5e52a5b088420 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock14.symbols @@ -0,0 +1,21 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock14.ts, 0, 0)) + + static #_1 = 1; +>#_1 : Symbol(C.#_1, Decl(classStaticBlock14.ts, 0, 9)) + + static #_3 = 1; +>#_3 : Symbol(C.#_3, Decl(classStaticBlock14.ts, 1, 17)) + + static #_5 = 1; +>#_5 : Symbol(C.#_5, Decl(classStaticBlock14.ts, 2, 17)) + + static {} + static {} + static {} + static {} + static {} + static {} +} + diff --git a/tests/baselines/reference/classStaticBlock14.types b/tests/baselines/reference/classStaticBlock14.types new file mode 100644 index 0000000000000..08de67a56e183 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock14.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts === +class C { +>C : C + + static #_1 = 1; +>#_1 : number +>1 : 1 + + static #_3 = 1; +>#_3 : number +>1 : 1 + + static #_5 = 1; +>#_5 : number +>1 : 1 + + static {} + static {} + static {} + static {} + static {} + static {} +} + diff --git a/tests/baselines/reference/classStaticBlock15(target=es2015).errors.txt b/tests/baselines/reference/classStaticBlock15(target=es2015).errors.txt new file mode 100644 index 0000000000000..b922214e105b0 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es2015).errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(14,13): error TS2304: Cannot find name '_C__1'. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts (1 errors) ==== + class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} + } + + console.log(_C__1) + ~~~~~ +!!! error TS2304: Cannot find name '_C__1'. + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock15(target=es2015).js b/tests/baselines/reference/classStaticBlock15(target=es2015).js new file mode 100644 index 0000000000000..739e96ae04142 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es2015).js @@ -0,0 +1,38 @@ +//// [classStaticBlock15.ts] +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) + + +//// [classStaticBlock15.js] +var _a, _C__1_1, _C__3, _C__5, _C__, _C__2, _C__4, _C__6, _C__7, _C__8; +class C { +} +_a = C; +_C__1_1 = { value: 1 }; +_C__3 = { value: 3 }; +_C__5 = { value: 5 }; +_C__ = { value: (() => { + })() }; +_C__2 = { value: (() => { + })() }; +_C__4 = { value: (() => { + })() }; +_C__6 = { value: (() => { + })() }; +_C__7 = { value: (() => { + })() }; +_C__8 = { value: (() => { + })() }; +console.log(_C__1); diff --git a/tests/baselines/reference/classStaticBlock15(target=es2015).symbols b/tests/baselines/reference/classStaticBlock15(target=es2015).symbols new file mode 100644 index 0000000000000..4d236f95d2e27 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es2015).symbols @@ -0,0 +1,26 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock15.ts, 0, 0)) + + static #_1 = 1; +>#_1 : Symbol(C.#_1, Decl(classStaticBlock15.ts, 0, 9)) + + static #_3 = 3; +>#_3 : Symbol(C.#_3, Decl(classStaticBlock15.ts, 1, 17)) + + static #_5 = 5; +>#_5 : Symbol(C.#_5, Decl(classStaticBlock15.ts, 2, 17)) + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + diff --git a/tests/baselines/reference/classStaticBlock15(target=es2015).types b/tests/baselines/reference/classStaticBlock15(target=es2015).types new file mode 100644 index 0000000000000..8b10940745a8b --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es2015).types @@ -0,0 +1,31 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : C + + static #_1 = 1; +>#_1 : number +>1 : 1 + + static #_3 = 3; +>#_3 : number +>3 : 3 + + static #_5 = 5; +>#_5 : number +>5 : 5 + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log(_C__1) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>_C__1 : any + diff --git a/tests/baselines/reference/classStaticBlock15(target=es5).errors.txt b/tests/baselines/reference/classStaticBlock15(target=es5).errors.txt new file mode 100644 index 0000000000000..1a1e72d9199b3 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es5).errors.txt @@ -0,0 +1,30 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(2,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(3,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(4,10): error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(14,13): error TS2304: Cannot find name '_C__1'. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts (4 errors) ==== + class C { + static #_1 = 1; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + static #_3 = 3; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + static #_5 = 5; + ~~~ +!!! error TS18028: Private identifiers are only available when targeting ECMAScript 2015 and higher. + + static {} + static {} + static {} + static {} + static {} + static {} + } + + console.log(_C__1) + ~~~~~ +!!! error TS2304: Cannot find name '_C__1'. + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock15(target=es5).js b/tests/baselines/reference/classStaticBlock15(target=es5).js new file mode 100644 index 0000000000000..561cb55c53d1b --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es5).js @@ -0,0 +1,41 @@ +//// [classStaticBlock15.ts] +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) + + +//// [classStaticBlock15.js] +var C = /** @class */ (function () { + function C() { + } + var _a, _C__1_1, _C__3, _C__5, _C__, _C__2, _C__4, _C__6, _C__7, _C__8; + _a = C; + _C__1_1 = { value: 1 }; + _C__3 = { value: 3 }; + _C__5 = { value: 5 }; + _C__ = { value: (function () { + })() }; + _C__2 = { value: (function () { + })() }; + _C__4 = { value: (function () { + })() }; + _C__6 = { value: (function () { + })() }; + _C__7 = { value: (function () { + })() }; + _C__8 = { value: (function () { + })() }; + return C; +}()); +console.log(_C__1); diff --git a/tests/baselines/reference/classStaticBlock15(target=es5).symbols b/tests/baselines/reference/classStaticBlock15(target=es5).symbols new file mode 100644 index 0000000000000..4d236f95d2e27 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es5).symbols @@ -0,0 +1,26 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock15.ts, 0, 0)) + + static #_1 = 1; +>#_1 : Symbol(C.#_1, Decl(classStaticBlock15.ts, 0, 9)) + + static #_3 = 3; +>#_3 : Symbol(C.#_3, Decl(classStaticBlock15.ts, 1, 17)) + + static #_5 = 5; +>#_5 : Symbol(C.#_5, Decl(classStaticBlock15.ts, 2, 17)) + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + diff --git a/tests/baselines/reference/classStaticBlock15(target=es5).types b/tests/baselines/reference/classStaticBlock15(target=es5).types new file mode 100644 index 0000000000000..8b10940745a8b --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=es5).types @@ -0,0 +1,31 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : C + + static #_1 = 1; +>#_1 : number +>1 : 1 + + static #_3 = 3; +>#_3 : number +>3 : 3 + + static #_5 = 5; +>#_5 : number +>5 : 5 + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log(_C__1) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>_C__1 : any + diff --git a/tests/baselines/reference/classStaticBlock15(target=esnext).errors.txt b/tests/baselines/reference/classStaticBlock15(target=esnext).errors.txt new file mode 100644 index 0000000000000..b922214e105b0 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=esnext).errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts(14,13): error TS2304: Cannot find name '_C__1'. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts (1 errors) ==== + class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} + } + + console.log(_C__1) + ~~~~~ +!!! error TS2304: Cannot find name '_C__1'. + \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock15(target=esnext).js b/tests/baselines/reference/classStaticBlock15(target=esnext).js new file mode 100644 index 0000000000000..43af3a33b22e7 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=esnext).js @@ -0,0 +1,30 @@ +//// [classStaticBlock15.ts] +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) + + +//// [classStaticBlock15.js] +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + static { } + static { } + static { } + static { } + static { } + static { } +} +console.log(_C__1); diff --git a/tests/baselines/reference/classStaticBlock15(target=esnext).symbols b/tests/baselines/reference/classStaticBlock15(target=esnext).symbols new file mode 100644 index 0000000000000..4d236f95d2e27 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=esnext).symbols @@ -0,0 +1,26 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : Symbol(C, Decl(classStaticBlock15.ts, 0, 0)) + + static #_1 = 1; +>#_1 : Symbol(C.#_1, Decl(classStaticBlock15.ts, 0, 9)) + + static #_3 = 3; +>#_3 : Symbol(C.#_3, Decl(classStaticBlock15.ts, 1, 17)) + + static #_5 = 5; +>#_5 : Symbol(C.#_5, Decl(classStaticBlock15.ts, 2, 17)) + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) +>console : Symbol(console, Decl(lib.dom.d.ts, --, --)) +>log : Symbol(Console.log, Decl(lib.dom.d.ts, --, --)) + diff --git a/tests/baselines/reference/classStaticBlock15(target=esnext).types b/tests/baselines/reference/classStaticBlock15(target=esnext).types new file mode 100644 index 0000000000000..8b10940745a8b --- /dev/null +++ b/tests/baselines/reference/classStaticBlock15(target=esnext).types @@ -0,0 +1,31 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts === +class C { +>C : C + + static #_1 = 1; +>#_1 : number +>1 : 1 + + static #_3 = 3; +>#_3 : number +>3 : 3 + + static #_5 = 5; +>#_5 : number +>5 : 5 + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) +>console.log(_C__1) : void +>console.log : (...data: any[]) => void +>console : Console +>log : (...data: any[]) => void +>_C__1 : any + diff --git a/tests/baselines/reference/classStaticBlock3(target=es2015).js b/tests/baselines/reference/classStaticBlock3(target=es2015).js index f188c5f0d4bef..722aa49d56081 100644 --- a/tests/baselines/reference/classStaticBlock3(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock3(target=es2015).js @@ -19,21 +19,16 @@ class C { //// [classStaticBlock3.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; +var _C__, _C__1; const a = 1; class C { } C.f1 = 1; -__classPrivateFieldSet(C, _1, (() => { - console.log(C.f1, C.f2, C.f3); -})(), "f"); +_C__ = { value: (() => { + console.log(C.f1, C.f2, C.f3); + })() }; C.f2 = 2; -__classPrivateFieldSet(C, _2, (() => { - console.log(C.f1, C.f2, C.f3); -})(), "f"); +_C__1 = { value: (() => { + console.log(C.f1, C.f2, C.f3); + })() }; C.f3 = 3; diff --git a/tests/baselines/reference/classStaticBlock3(target=es5).js b/tests/baselines/reference/classStaticBlock3(target=es5).js index 77151586b9810..7c7d46731880d 100644 --- a/tests/baselines/reference/classStaticBlock3(target=es5).js +++ b/tests/baselines/reference/classStaticBlock3(target=es5).js @@ -19,24 +19,19 @@ class C { //// [classStaticBlock3.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; var a = 1; var C = /** @class */ (function () { function C() { } + var _C__, _C__1; C.f1 = 1; - __classPrivateFieldSet(C, _1, (function () { - console.log(C.f1, C.f2, C.f3); - })(), "f"); + _C__ = { value: (function () { + console.log(C.f1, C.f2, C.f3); + })() }; C.f2 = 2; - __classPrivateFieldSet(C, _2, (function () { - console.log(C.f1, C.f2, C.f3); - })(), "f"); + _C__1 = { value: (function () { + console.log(C.f1, C.f2, C.f3); + })() }; C.f3 = 3; return C; }()); diff --git a/tests/baselines/reference/classStaticBlock4(target=es2015).js b/tests/baselines/reference/classStaticBlock4(target=es2015).js index faa662beb8d0a..6a49dac60142a 100644 --- a/tests/baselines/reference/classStaticBlock4(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock4(target=es2015).js @@ -16,20 +16,15 @@ class C { //// [classStaticBlock4.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; +var _C__; class C { } C.s1 = 1; -__classPrivateFieldSet(C, _1, (() => { - this.s1; - C.s1; - this.s2; - C.s2; -})(), "f"); +_C__ = { value: (() => { + this.s1; + C.s1; + this.s2; + C.s2; + })() }; C.s2 = 2; C.ss2 = this.s1; diff --git a/tests/baselines/reference/classStaticBlock4(target=es5).js b/tests/baselines/reference/classStaticBlock4(target=es5).js index 1e70d121bba3f..1c11c48e32729 100644 --- a/tests/baselines/reference/classStaticBlock4(target=es5).js +++ b/tests/baselines/reference/classStaticBlock4(target=es5).js @@ -16,23 +16,18 @@ class C { //// [classStaticBlock4.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; var _this = this; var C = /** @class */ (function () { function C() { } + var _C__; C.s1 = 1; - __classPrivateFieldSet(C, _1, (function () { - _this.s1; - C.s1; - _this.s2; - C.s2; - })(), "f"); + _C__ = { value: (function () { + _this.s1; + C.s1; + _this.s2; + C.s2; + })() }; C.s2 = 2; C.ss2 = this.s1; return C; diff --git a/tests/baselines/reference/classStaticBlock5(target=es2015).js b/tests/baselines/reference/classStaticBlock5(target=es2015).js index 18515f7dddb0c..e69ce1e902168 100644 --- a/tests/baselines/reference/classStaticBlock5(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock5(target=es2015).js @@ -17,12 +17,7 @@ class C extends B { //// [classStaticBlock5.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; +var _C__; class B { } B.a = 1; @@ -31,8 +26,8 @@ class C extends B { } C.b = 3; C.c = super.a; -__classPrivateFieldSet(C, _1, (() => { - this.b; - super.b; - super.a; -})(), "f"); +_C__ = { value: (() => { + this.b; + super.b; + super.a; + })() }; diff --git a/tests/baselines/reference/classStaticBlock5(target=es5).js b/tests/baselines/reference/classStaticBlock5(target=es5).js index cb5588cf934a3..7aee91846eea4 100644 --- a/tests/baselines/reference/classStaticBlock5(target=es5).js +++ b/tests/baselines/reference/classStaticBlock5(target=es5).js @@ -32,12 +32,6 @@ var __extends = (this && this.__extends) || (function () { d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; var _this = this; var B = /** @class */ (function () { function B() { @@ -51,12 +45,13 @@ var C = /** @class */ (function (_super) { function C() { return _super !== null && _super.apply(this, arguments) || this; } + var _C__; C.b = 3; C.c = _super.a; - __classPrivateFieldSet(C, _1, (function () { - _this.b; - _super.b; - _super.a; - })(), "f"); + _C__ = { value: (function () { + _this.b; + _super.b; + _super.a; + })() }; return C; }(B)); diff --git a/tests/baselines/reference/classStaticBlock9(target=es2015).js b/tests/baselines/reference/classStaticBlock9(target=es2015).js index 65435050082bf..d7a213f4b59d9 100644 --- a/tests/baselines/reference/classStaticBlock9(target=es2015).js +++ b/tests/baselines/reference/classStaticBlock9(target=es2015).js @@ -9,16 +9,11 @@ class A { //// [classStaticBlock9.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; +var _A__; class A { } A.bar = A.foo + 1; -__classPrivateFieldSet(A, _1, (() => { - A.foo + 2; -})(), "f"); +_A__ = { value: (() => { + A.foo + 2; + })() }; A.foo = 1; diff --git a/tests/baselines/reference/classStaticBlock9(target=es5).js b/tests/baselines/reference/classStaticBlock9(target=es5).js index 85d97efacbe6a..23e4ba3e909fa 100644 --- a/tests/baselines/reference/classStaticBlock9(target=es5).js +++ b/tests/baselines/reference/classStaticBlock9(target=es5).js @@ -9,19 +9,14 @@ class A { //// [classStaticBlock9.js] -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; var A = /** @class */ (function () { function A() { } + var _A__; A.bar = A.foo + 1; - __classPrivateFieldSet(A, _1, (function () { - A.foo + 2; - })(), "f"); + _A__ = { value: (function () { + A.foo + 2; + })() }; A.foo = 1; return A; }()); diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts new file mode 100644 index 0000000000000..73786b4e0d29d --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock11.ts @@ -0,0 +1,14 @@ +// @target: esnext, es2015, es5 + +let getX; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts new file mode 100644 index 0000000000000..2071f21c5d92b --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock12.ts @@ -0,0 +1,9 @@ +// @useDefineForClassFields: false + +class C { + static #x = 1; + + static { + C.#x; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts new file mode 100644 index 0000000000000..6b05c3e0df50d --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock13.ts @@ -0,0 +1,14 @@ +// @target: esnext, es2015, es5 +// @useDefineForClassFields: true + +class C { + static #x = 123; + + static { + console.log(C.#x) + } + + foo () { + return C.#x; + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts new file mode 100644 index 0000000000000..c5e4f30e02dd9 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock14.ts @@ -0,0 +1,14 @@ +// @useDefineForClassFields: false + +class C { + static #_1 = 1; + static #_3 = 1; + static #_5 = 1; + + static {} + static {} + static {} + static {} + static {} + static {} +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts new file mode 100644 index 0000000000000..c7d5c2da04ffa --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock15.ts @@ -0,0 +1,17 @@ +// @target: esnext, es2015, es5 +// @useDefineForClassFields: true + +class C { + static #_1 = 1; + static #_3 = 3; + static #_5 = 5; + + static {} + static {} + static {} + static {} + static {} + static {} +} + +console.log(_C__1) From 220b7e904443091a9be8b138e584e71fea6a1f42 Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 19 Mar 2021 16:55:06 +0800 Subject: [PATCH 66/68] Add more tests --- .../reference/classStaticBlock16.errors.txt | 37 ++++++++++ .../baselines/reference/classStaticBlock16.js | 64 +++++++++++++++++ .../reference/classStaticBlock16.symbols | 65 +++++++++++++++++ .../reference/classStaticBlock16.types | 72 +++++++++++++++++++ .../classStaticBlock/classStaticBlock16.ts | 26 +++++++ 5 files changed, 264 insertions(+) create mode 100644 tests/baselines/reference/classStaticBlock16.errors.txt create mode 100644 tests/baselines/reference/classStaticBlock16.js create mode 100644 tests/baselines/reference/classStaticBlock16.symbols create mode 100644 tests/baselines/reference/classStaticBlock16.types create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts diff --git a/tests/baselines/reference/classStaticBlock16.errors.txt b/tests/baselines/reference/classStaticBlock16.errors.txt new file mode 100644 index 0000000000000..2e3218799ec3f --- /dev/null +++ b/tests/baselines/reference/classStaticBlock16.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts(11,5): error TS2448: Block-scoped variable 'getY' used before its declaration. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts(11,28): error TS18013: Property '#y' is not accessible outside class 'D' because it has a private identifier. +tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts(21,28): error TS18013: Property '#x' is not accessible outside class 'C' because it has a private identifier. + + +==== tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts (3 errors) ==== + let getX: (c: C) => number; + class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + ~~~~ +!!! error TS2448: Block-scoped variable 'getY' used before its declaration. +!!! related TS2728 tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts:15:5: 'getY' is declared here. + ~~ +!!! error TS18013: Property '#y' is not accessible outside class 'D' because it has a private identifier. + } + } + + let getY: (c: D) => number; + class D { + #y = 1 + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; + ~~ +!!! error TS18013: Property '#x' is not accessible outside class 'C' because it has a private identifier. + getY = (obj: D) => obj.#y; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/classStaticBlock16.js b/tests/baselines/reference/classStaticBlock16.js new file mode 100644 index 0000000000000..7c282010398f1 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock16.js @@ -0,0 +1,64 @@ +//// [classStaticBlock16.ts] +let getX: (c: C) => number; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} + +let getY: (c: D) => number; +class D { + #y = 1 + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} + +//// [classStaticBlock16.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _C_x, _C__, _D_y, _D__; +let getX; +class C { + constructor(x) { + _C_x.set(this, 1); + __classPrivateFieldSet(this, _C_x, x, "f"); + } +} +_C_x = new WeakMap(); +_C__ = { value: (() => { + // getX has privileged access to #x + getX = (obj) => __classPrivateFieldGet(obj, _C_x, "f"); + getY = (obj) => obj.; + })() }; +let getY; +class D { + constructor() { + _D_y.set(this, 1); + } +} +_D_y = new WeakMap(); +_D__ = { value: (() => { + // getY has privileged access to y + getX = (obj) => obj.; + getY = (obj) => __classPrivateFieldGet(obj, _D_y, "f"); + })() }; diff --git a/tests/baselines/reference/classStaticBlock16.symbols b/tests/baselines/reference/classStaticBlock16.symbols new file mode 100644 index 0000000000000..14e8b724c1287 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock16.symbols @@ -0,0 +1,65 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts === +let getX: (c: C) => number; +>getX : Symbol(getX, Decl(classStaticBlock16.ts, 0, 3)) +>c : Symbol(c, Decl(classStaticBlock16.ts, 0, 11)) +>C : Symbol(C, Decl(classStaticBlock16.ts, 0, 27)) + +class C { +>C : Symbol(C, Decl(classStaticBlock16.ts, 0, 27)) + + #x = 1 +>#x : Symbol(C.#x, Decl(classStaticBlock16.ts, 1, 9)) + + constructor(x: number) { +>x : Symbol(x, Decl(classStaticBlock16.ts, 3, 14)) + + this.#x = x; +>this.#x : Symbol(C.#x, Decl(classStaticBlock16.ts, 1, 9)) +>this : Symbol(C, Decl(classStaticBlock16.ts, 0, 27)) +>x : Symbol(x, Decl(classStaticBlock16.ts, 3, 14)) + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX : Symbol(getX, Decl(classStaticBlock16.ts, 0, 3)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 9, 12)) +>C : Symbol(C, Decl(classStaticBlock16.ts, 0, 27)) +>obj.#x : Symbol(C.#x, Decl(classStaticBlock16.ts, 1, 9)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 9, 12)) + + getY = (obj: D) => obj.#y; +>getY : Symbol(getY, Decl(classStaticBlock16.ts, 14, 3)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 10, 12)) +>D : Symbol(D, Decl(classStaticBlock16.ts, 14, 27)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 10, 12)) + } +} + +let getY: (c: D) => number; +>getY : Symbol(getY, Decl(classStaticBlock16.ts, 14, 3)) +>c : Symbol(c, Decl(classStaticBlock16.ts, 14, 11)) +>D : Symbol(D, Decl(classStaticBlock16.ts, 14, 27)) + +class D { +>D : Symbol(D, Decl(classStaticBlock16.ts, 14, 27)) + + #y = 1 +>#y : Symbol(D.#y, Decl(classStaticBlock16.ts, 15, 9)) + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; +>getX : Symbol(getX, Decl(classStaticBlock16.ts, 0, 3)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 20, 12)) +>C : Symbol(C, Decl(classStaticBlock16.ts, 0, 27)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 20, 12)) + + getY = (obj: D) => obj.#y; +>getY : Symbol(getY, Decl(classStaticBlock16.ts, 14, 3)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 21, 12)) +>D : Symbol(D, Decl(classStaticBlock16.ts, 14, 27)) +>obj.#y : Symbol(D.#y, Decl(classStaticBlock16.ts, 15, 9)) +>obj : Symbol(obj, Decl(classStaticBlock16.ts, 21, 12)) + } +} diff --git a/tests/baselines/reference/classStaticBlock16.types b/tests/baselines/reference/classStaticBlock16.types new file mode 100644 index 0000000000000..b5e9626a9408c --- /dev/null +++ b/tests/baselines/reference/classStaticBlock16.types @@ -0,0 +1,72 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts === +let getX: (c: C) => number; +>getX : (c: C) => number +>c : C + +class C { +>C : C + + #x = 1 +>#x : number +>1 : 1 + + constructor(x: number) { +>x : number + + this.#x = x; +>this.#x = x : number +>this.#x : number +>this : this +>x : number + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; +>getX = (obj: C) => obj.#x : (obj: C) => number +>getX : (c: C) => number +>(obj: C) => obj.#x : (obj: C) => number +>obj : C +>obj.#x : number +>obj : C + + getY = (obj: D) => obj.#y; +>getY = (obj: D) => obj.#y : (obj: D) => any +>getY : (c: D) => number +>(obj: D) => obj.#y : (obj: D) => any +>obj : D +>obj.#y : any +>obj : D + } +} + +let getY: (c: D) => number; +>getY : (c: D) => number +>c : D + +class D { +>D : D + + #y = 1 +>#y : number +>1 : 1 + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; +>getX = (obj: C) => obj.#x : (obj: C) => any +>getX : (c: C) => number +>(obj: C) => obj.#x : (obj: C) => any +>obj : C +>obj.#x : any +>obj : C + + getY = (obj: D) => obj.#y; +>getY = (obj: D) => obj.#y : (obj: D) => number +>getY : (c: D) => number +>(obj: D) => obj.#y : (obj: D) => number +>obj : D +>obj.#y : number +>obj : D + } +} diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts new file mode 100644 index 0000000000000..bc15e5f1ab398 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock16.ts @@ -0,0 +1,26 @@ +// @target: es2015 + +let getX: (c: C) => number; +class C { + #x = 1 + constructor(x: number) { + this.#x = x; + } + + static { + // getX has privileged access to #x + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} + +let getY: (c: D) => number; +class D { + #y = 1 + + static { + // getY has privileged access to y + getX = (obj: C) => obj.#x; + getY = (obj: D) => obj.#y; + } +} \ No newline at end of file From 9ed7c2ba6a9764d8d2107343ff20260446775663 Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 19 Mar 2021 17:09:24 +0800 Subject: [PATCH 67/68] Add friend tests --- .../baselines/reference/classStaticBlock17.js | 74 +++++++++++++ .../reference/classStaticBlock17.symbols | 93 ++++++++++++++++ .../reference/classStaticBlock17.types | 102 ++++++++++++++++++ .../classStaticBlock/classStaticBlock17.ts | 33 ++++++ 4 files changed, 302 insertions(+) create mode 100644 tests/baselines/reference/classStaticBlock17.js create mode 100644 tests/baselines/reference/classStaticBlock17.symbols create mode 100644 tests/baselines/reference/classStaticBlock17.types create mode 100644 tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts diff --git a/tests/baselines/reference/classStaticBlock17.js b/tests/baselines/reference/classStaticBlock17.js new file mode 100644 index 0000000000000..b079e496807fb --- /dev/null +++ b/tests/baselines/reference/classStaticBlock17.js @@ -0,0 +1,74 @@ +//// [classStaticBlock17.ts] +let friendA: { getX(o: A): number, setX(o: A, v: number): void }; + +class A { + #x: number; + + constructor (v: number) { + this.#x = v; + } + + getX () { + return this.#x; + } + + static { + friendA = { + getX(obj) { return obj.#x }, + setX(obj, value) { obj.#x = value } + }; + } +}; + +class B { + constructor(a: A) { + const x = friendA.getX(a); // ok + friendA.setX(a, x + 1); // ok + } +}; + +const a = new A(41); +const b = new B(a); +a.getX(); + +//// [classStaticBlock17.js] +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _A_x, _A__; +let friendA; +class A { + constructor(v) { + _A_x.set(this, void 0); + __classPrivateFieldSet(this, _A_x, v, "f"); + } + getX() { + return __classPrivateFieldGet(this, _A_x, "f"); + } +} +_A_x = new WeakMap(); +_A__ = { value: (() => { + friendA = { + getX(obj) { return __classPrivateFieldGet(obj, _A_x, "f"); }, + setX(obj, value) { __classPrivateFieldSet(obj, _A_x, value, "f"); } + }; + })() }; +; +class B { + constructor(a) { + const x = friendA.getX(a); // ok + friendA.setX(a, x + 1); // ok + } +} +; +const a = new A(41); +const b = new B(a); +a.getX(); diff --git a/tests/baselines/reference/classStaticBlock17.symbols b/tests/baselines/reference/classStaticBlock17.symbols new file mode 100644 index 0000000000000..6038b5c8ef899 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock17.symbols @@ -0,0 +1,93 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts === +let friendA: { getX(o: A): number, setX(o: A, v: number): void }; +>friendA : Symbol(friendA, Decl(classStaticBlock17.ts, 0, 3)) +>getX : Symbol(getX, Decl(classStaticBlock17.ts, 0, 14)) +>o : Symbol(o, Decl(classStaticBlock17.ts, 0, 20)) +>A : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) +>setX : Symbol(setX, Decl(classStaticBlock17.ts, 0, 34)) +>o : Symbol(o, Decl(classStaticBlock17.ts, 0, 40)) +>A : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) +>v : Symbol(v, Decl(classStaticBlock17.ts, 0, 45)) + +class A { +>A : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) + + #x: number; +>#x : Symbol(A.#x, Decl(classStaticBlock17.ts, 2, 9)) + + constructor (v: number) { +>v : Symbol(v, Decl(classStaticBlock17.ts, 5, 15)) + + this.#x = v; +>this.#x : Symbol(A.#x, Decl(classStaticBlock17.ts, 2, 9)) +>this : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) +>v : Symbol(v, Decl(classStaticBlock17.ts, 5, 15)) + } + + getX () { +>getX : Symbol(A.getX, Decl(classStaticBlock17.ts, 7, 3)) + + return this.#x; +>this.#x : Symbol(A.#x, Decl(classStaticBlock17.ts, 2, 9)) +>this : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) + } + + static { + friendA = { +>friendA : Symbol(friendA, Decl(classStaticBlock17.ts, 0, 3)) + + getX(obj) { return obj.#x }, +>getX : Symbol(getX, Decl(classStaticBlock17.ts, 14, 15)) +>obj : Symbol(obj, Decl(classStaticBlock17.ts, 15, 11)) +>obj.#x : Symbol(A.#x, Decl(classStaticBlock17.ts, 2, 9)) +>obj : Symbol(obj, Decl(classStaticBlock17.ts, 15, 11)) + + setX(obj, value) { obj.#x = value } +>setX : Symbol(setX, Decl(classStaticBlock17.ts, 15, 34)) +>obj : Symbol(obj, Decl(classStaticBlock17.ts, 16, 11)) +>value : Symbol(value, Decl(classStaticBlock17.ts, 16, 15)) +>obj.#x : Symbol(A.#x, Decl(classStaticBlock17.ts, 2, 9)) +>obj : Symbol(obj, Decl(classStaticBlock17.ts, 16, 11)) +>value : Symbol(value, Decl(classStaticBlock17.ts, 16, 15)) + + }; + } +}; + +class B { +>B : Symbol(B, Decl(classStaticBlock17.ts, 19, 2)) + + constructor(a: A) { +>a : Symbol(a, Decl(classStaticBlock17.ts, 22, 14)) +>A : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) + + const x = friendA.getX(a); // ok +>x : Symbol(x, Decl(classStaticBlock17.ts, 23, 9)) +>friendA.getX : Symbol(getX, Decl(classStaticBlock17.ts, 0, 14)) +>friendA : Symbol(friendA, Decl(classStaticBlock17.ts, 0, 3)) +>getX : Symbol(getX, Decl(classStaticBlock17.ts, 0, 14)) +>a : Symbol(a, Decl(classStaticBlock17.ts, 22, 14)) + + friendA.setX(a, x + 1); // ok +>friendA.setX : Symbol(setX, Decl(classStaticBlock17.ts, 0, 34)) +>friendA : Symbol(friendA, Decl(classStaticBlock17.ts, 0, 3)) +>setX : Symbol(setX, Decl(classStaticBlock17.ts, 0, 34)) +>a : Symbol(a, Decl(classStaticBlock17.ts, 22, 14)) +>x : Symbol(x, Decl(classStaticBlock17.ts, 23, 9)) + } +}; + +const a = new A(41); +>a : Symbol(a, Decl(classStaticBlock17.ts, 28, 5)) +>A : Symbol(A, Decl(classStaticBlock17.ts, 0, 65)) + +const b = new B(a); +>b : Symbol(b, Decl(classStaticBlock17.ts, 29, 5)) +>B : Symbol(B, Decl(classStaticBlock17.ts, 19, 2)) +>a : Symbol(a, Decl(classStaticBlock17.ts, 28, 5)) + +a.getX(); +>a.getX : Symbol(A.getX, Decl(classStaticBlock17.ts, 7, 3)) +>a : Symbol(a, Decl(classStaticBlock17.ts, 28, 5)) +>getX : Symbol(A.getX, Decl(classStaticBlock17.ts, 7, 3)) + diff --git a/tests/baselines/reference/classStaticBlock17.types b/tests/baselines/reference/classStaticBlock17.types new file mode 100644 index 0000000000000..ae27524b4bc96 --- /dev/null +++ b/tests/baselines/reference/classStaticBlock17.types @@ -0,0 +1,102 @@ +=== tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts === +let friendA: { getX(o: A): number, setX(o: A, v: number): void }; +>friendA : { getX(o: A): number; setX(o: A, v: number): void; } +>getX : (o: A) => number +>o : A +>setX : (o: A, v: number) => void +>o : A +>v : number + +class A { +>A : A + + #x: number; +>#x : number + + constructor (v: number) { +>v : number + + this.#x = v; +>this.#x = v : number +>this.#x : number +>this : this +>v : number + } + + getX () { +>getX : () => number + + return this.#x; +>this.#x : number +>this : this + } + + static { + friendA = { +>friendA = { getX(obj) { return obj.#x }, setX(obj, value) { obj.#x = value } } : { getX(obj: A): number; setX(obj: A, value: number): void; } +>friendA : { getX(o: A): number; setX(o: A, v: number): void; } +>{ getX(obj) { return obj.#x }, setX(obj, value) { obj.#x = value } } : { getX(obj: A): number; setX(obj: A, value: number): void; } + + getX(obj) { return obj.#x }, +>getX : (obj: A) => number +>obj : A +>obj.#x : number +>obj : A + + setX(obj, value) { obj.#x = value } +>setX : (obj: A, value: number) => void +>obj : A +>value : number +>obj.#x = value : number +>obj.#x : number +>obj : A +>value : number + + }; + } +}; + +class B { +>B : B + + constructor(a: A) { +>a : A + + const x = friendA.getX(a); // ok +>x : number +>friendA.getX(a) : number +>friendA.getX : (o: A) => number +>friendA : { getX(o: A): number; setX(o: A, v: number): void; } +>getX : (o: A) => number +>a : A + + friendA.setX(a, x + 1); // ok +>friendA.setX(a, x + 1) : void +>friendA.setX : (o: A, v: number) => void +>friendA : { getX(o: A): number; setX(o: A, v: number): void; } +>setX : (o: A, v: number) => void +>a : A +>x + 1 : number +>x : number +>1 : 1 + } +}; + +const a = new A(41); +>a : A +>new A(41) : A +>A : typeof A +>41 : 41 + +const b = new B(a); +>b : B +>new B(a) : B +>B : typeof B +>a : A + +a.getX(); +>a.getX() : number +>a.getX : () => number +>a : A +>getX : () => number + diff --git a/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts new file mode 100644 index 0000000000000..8d26cb4a08261 --- /dev/null +++ b/tests/cases/conformance/classes/classStaticBlock/classStaticBlock17.ts @@ -0,0 +1,33 @@ +// @target: es2015 + +let friendA: { getX(o: A): number, setX(o: A, v: number): void }; + +class A { + #x: number; + + constructor (v: number) { + this.#x = v; + } + + getX () { + return this.#x; + } + + static { + friendA = { + getX(obj) { return obj.#x }, + setX(obj, value) { obj.#x = value } + }; + } +}; + +class B { + constructor(a: A) { + const x = friendA.getX(a); // ok + friendA.setX(a, x + 1); // ok + } +}; + +const a = new A(41); +const b = new B(a); +a.getX(); \ No newline at end of file From 11a29344033341132cbb3cef5ce7faaa4f7281a8 Mon Sep 17 00:00:00 2001 From: kingwl Date: Fri, 19 Mar 2021 17:16:31 +0800 Subject: [PATCH 68/68] Update baseline --- .../reference/api/tsserverlibrary.d.ts | 372 +++++++++--------- tests/baselines/reference/api/typescript.d.ts | 372 +++++++++--------- 2 files changed, 382 insertions(+), 362 deletions(-) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 7fb3cc161c54c..bf9c00bad44a2 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -275,179 +275,180 @@ declare namespace ts { SetAccessor = 168, CallSignature = 169, ConstructSignature = 170, - IndexSignature = 171, - TypePredicate = 172, - TypeReference = 173, - FunctionType = 174, - ConstructorType = 175, - TypeQuery = 176, - TypeLiteral = 177, - ArrayType = 178, - TupleType = 179, - OptionalType = 180, - RestType = 181, - UnionType = 182, - IntersectionType = 183, - ConditionalType = 184, - InferType = 185, - ParenthesizedType = 186, - ThisType = 187, - TypeOperator = 188, - IndexedAccessType = 189, - MappedType = 190, - LiteralType = 191, - NamedTupleMember = 192, - TemplateLiteralType = 193, - TemplateLiteralTypeSpan = 194, - ImportType = 195, - ObjectBindingPattern = 196, - ArrayBindingPattern = 197, - BindingElement = 198, - ArrayLiteralExpression = 199, - ObjectLiteralExpression = 200, - PropertyAccessExpression = 201, - ElementAccessExpression = 202, - CallExpression = 203, - NewExpression = 204, - TaggedTemplateExpression = 205, - TypeAssertionExpression = 206, - ParenthesizedExpression = 207, - FunctionExpression = 208, - ArrowFunction = 209, - DeleteExpression = 210, - TypeOfExpression = 211, - VoidExpression = 212, - AwaitExpression = 213, - PrefixUnaryExpression = 214, - PostfixUnaryExpression = 215, - BinaryExpression = 216, - ConditionalExpression = 217, - TemplateExpression = 218, - YieldExpression = 219, - SpreadElement = 220, - ClassExpression = 221, - OmittedExpression = 222, - ExpressionWithTypeArguments = 223, - AsExpression = 224, - NonNullExpression = 225, - MetaProperty = 226, - SyntheticExpression = 227, - TemplateSpan = 228, - SemicolonClassElement = 229, - Block = 230, - EmptyStatement = 231, - VariableStatement = 232, - ExpressionStatement = 233, - IfStatement = 234, - DoStatement = 235, - WhileStatement = 236, - ForStatement = 237, - ForInStatement = 238, - ForOfStatement = 239, - ContinueStatement = 240, - BreakStatement = 241, - ReturnStatement = 242, - WithStatement = 243, - SwitchStatement = 244, - LabeledStatement = 245, - ThrowStatement = 246, - TryStatement = 247, - DebuggerStatement = 248, - VariableDeclaration = 249, - VariableDeclarationList = 250, - FunctionDeclaration = 251, - ClassDeclaration = 252, - InterfaceDeclaration = 253, - TypeAliasDeclaration = 254, - EnumDeclaration = 255, - ModuleDeclaration = 256, - ModuleBlock = 257, - CaseBlock = 258, - NamespaceExportDeclaration = 259, - ImportEqualsDeclaration = 260, - ImportDeclaration = 261, - ImportClause = 262, - NamespaceImport = 263, - NamedImports = 264, - ImportSpecifier = 265, - ExportAssignment = 266, - ExportDeclaration = 267, - NamedExports = 268, - NamespaceExport = 269, - ExportSpecifier = 270, - MissingDeclaration = 271, - ExternalModuleReference = 272, - JsxElement = 273, - JsxSelfClosingElement = 274, - JsxOpeningElement = 275, - JsxClosingElement = 276, - JsxFragment = 277, - JsxOpeningFragment = 278, - JsxClosingFragment = 279, - JsxAttribute = 280, - JsxAttributes = 281, - JsxSpreadAttribute = 282, - JsxExpression = 283, - CaseClause = 284, - DefaultClause = 285, - HeritageClause = 286, - CatchClause = 287, - PropertyAssignment = 288, - ShorthandPropertyAssignment = 289, - SpreadAssignment = 290, - EnumMember = 291, - UnparsedPrologue = 292, - UnparsedPrepend = 293, - UnparsedText = 294, - UnparsedInternalText = 295, - UnparsedSyntheticReference = 296, - SourceFile = 297, - Bundle = 298, - UnparsedSource = 299, - InputFiles = 300, - JSDocTypeExpression = 301, - JSDocNameReference = 302, - JSDocAllType = 303, - JSDocUnknownType = 304, - JSDocNullableType = 305, - JSDocNonNullableType = 306, - JSDocOptionalType = 307, - JSDocFunctionType = 308, - JSDocVariadicType = 309, - JSDocNamepathType = 310, - JSDocComment = 311, - JSDocText = 312, - JSDocTypeLiteral = 313, - JSDocSignature = 314, - JSDocLink = 315, - JSDocTag = 316, - JSDocAugmentsTag = 317, - JSDocImplementsTag = 318, - JSDocAuthorTag = 319, - JSDocDeprecatedTag = 320, - JSDocClassTag = 321, - JSDocPublicTag = 322, - JSDocPrivateTag = 323, - JSDocProtectedTag = 324, - JSDocReadonlyTag = 325, - JSDocCallbackTag = 326, - JSDocEnumTag = 327, - JSDocParameterTag = 328, - JSDocReturnTag = 329, - JSDocThisTag = 330, - JSDocTypeTag = 331, - JSDocTemplateTag = 332, - JSDocTypedefTag = 333, - JSDocSeeTag = 334, - JSDocPropertyTag = 335, - SyntaxList = 336, - NotEmittedStatement = 337, - PartiallyEmittedExpression = 338, - CommaListExpression = 339, - MergeDeclarationMarker = 340, - EndOfDeclarationMarker = 341, - SyntheticReferenceExpression = 342, - Count = 343, + ClassStaticBlockDeclaration = 171, + IndexSignature = 172, + TypePredicate = 173, + TypeReference = 174, + FunctionType = 175, + ConstructorType = 176, + TypeQuery = 177, + TypeLiteral = 178, + ArrayType = 179, + TupleType = 180, + OptionalType = 181, + RestType = 182, + UnionType = 183, + IntersectionType = 184, + ConditionalType = 185, + InferType = 186, + ParenthesizedType = 187, + ThisType = 188, + TypeOperator = 189, + IndexedAccessType = 190, + MappedType = 191, + LiteralType = 192, + NamedTupleMember = 193, + TemplateLiteralType = 194, + TemplateLiteralTypeSpan = 195, + ImportType = 196, + ObjectBindingPattern = 197, + ArrayBindingPattern = 198, + BindingElement = 199, + ArrayLiteralExpression = 200, + ObjectLiteralExpression = 201, + PropertyAccessExpression = 202, + ElementAccessExpression = 203, + CallExpression = 204, + NewExpression = 205, + TaggedTemplateExpression = 206, + TypeAssertionExpression = 207, + ParenthesizedExpression = 208, + FunctionExpression = 209, + ArrowFunction = 210, + DeleteExpression = 211, + TypeOfExpression = 212, + VoidExpression = 213, + AwaitExpression = 214, + PrefixUnaryExpression = 215, + PostfixUnaryExpression = 216, + BinaryExpression = 217, + ConditionalExpression = 218, + TemplateExpression = 219, + YieldExpression = 220, + SpreadElement = 221, + ClassExpression = 222, + OmittedExpression = 223, + ExpressionWithTypeArguments = 224, + AsExpression = 225, + NonNullExpression = 226, + MetaProperty = 227, + SyntheticExpression = 228, + TemplateSpan = 229, + SemicolonClassElement = 230, + Block = 231, + EmptyStatement = 232, + VariableStatement = 233, + ExpressionStatement = 234, + IfStatement = 235, + DoStatement = 236, + WhileStatement = 237, + ForStatement = 238, + ForInStatement = 239, + ForOfStatement = 240, + ContinueStatement = 241, + BreakStatement = 242, + ReturnStatement = 243, + WithStatement = 244, + SwitchStatement = 245, + LabeledStatement = 246, + ThrowStatement = 247, + TryStatement = 248, + DebuggerStatement = 249, + VariableDeclaration = 250, + VariableDeclarationList = 251, + FunctionDeclaration = 252, + ClassDeclaration = 253, + InterfaceDeclaration = 254, + TypeAliasDeclaration = 255, + EnumDeclaration = 256, + ModuleDeclaration = 257, + ModuleBlock = 258, + CaseBlock = 259, + NamespaceExportDeclaration = 260, + ImportEqualsDeclaration = 261, + ImportDeclaration = 262, + ImportClause = 263, + NamespaceImport = 264, + NamedImports = 265, + ImportSpecifier = 266, + ExportAssignment = 267, + ExportDeclaration = 268, + NamedExports = 269, + NamespaceExport = 270, + ExportSpecifier = 271, + MissingDeclaration = 272, + ExternalModuleReference = 273, + JsxElement = 274, + JsxSelfClosingElement = 275, + JsxOpeningElement = 276, + JsxClosingElement = 277, + JsxFragment = 278, + JsxOpeningFragment = 279, + JsxClosingFragment = 280, + JsxAttribute = 281, + JsxAttributes = 282, + JsxSpreadAttribute = 283, + JsxExpression = 284, + CaseClause = 285, + DefaultClause = 286, + HeritageClause = 287, + CatchClause = 288, + PropertyAssignment = 289, + ShorthandPropertyAssignment = 290, + SpreadAssignment = 291, + EnumMember = 292, + UnparsedPrologue = 293, + UnparsedPrepend = 294, + UnparsedText = 295, + UnparsedInternalText = 296, + UnparsedSyntheticReference = 297, + SourceFile = 298, + Bundle = 299, + UnparsedSource = 300, + InputFiles = 301, + JSDocTypeExpression = 302, + JSDocNameReference = 303, + JSDocAllType = 304, + JSDocUnknownType = 305, + JSDocNullableType = 306, + JSDocNonNullableType = 307, + JSDocOptionalType = 308, + JSDocFunctionType = 309, + JSDocVariadicType = 310, + JSDocNamepathType = 311, + JSDocComment = 312, + JSDocText = 313, + JSDocTypeLiteral = 314, + JSDocSignature = 315, + JSDocLink = 316, + JSDocTag = 317, + JSDocAugmentsTag = 318, + JSDocImplementsTag = 319, + JSDocAuthorTag = 320, + JSDocDeprecatedTag = 321, + JSDocClassTag = 322, + JSDocPublicTag = 323, + JSDocPrivateTag = 324, + JSDocProtectedTag = 325, + JSDocReadonlyTag = 326, + JSDocCallbackTag = 327, + JSDocEnumTag = 328, + JSDocParameterTag = 329, + JSDocReturnTag = 330, + JSDocThisTag = 331, + JSDocTypeTag = 332, + JSDocTemplateTag = 333, + JSDocTypedefTag = 334, + JSDocSeeTag = 335, + JSDocPropertyTag = 336, + SyntaxList = 337, + NotEmittedStatement = 338, + PartiallyEmittedExpression = 339, + CommaListExpression = 340, + MergeDeclarationMarker = 341, + EndOfDeclarationMarker = 342, + SyntheticReferenceExpression = 343, + Count = 344, FirstAssignment = 62, LastAssignment = 77, FirstCompoundAssignment = 63, @@ -458,8 +459,8 @@ declare namespace ts { LastKeyword = 156, FirstFutureReservedWord = 116, LastFutureReservedWord = 124, - FirstTypeNode = 172, - LastTypeNode = 195, + FirstTypeNode = 173, + LastTypeNode = 196, FirstPunctuation = 18, LastPunctuation = 77, FirstToken = 0, @@ -472,13 +473,13 @@ declare namespace ts { LastTemplateToken = 17, FirstBinaryOperator = 29, LastBinaryOperator = 77, - FirstStatement = 232, - LastStatement = 248, + FirstStatement = 233, + LastStatement = 249, FirstNode = 157, - FirstJSDocNode = 301, - LastJSDocNode = 335, - FirstJSDocTagNode = 316, - LastJSDocTagNode = 335, + FirstJSDocNode = 302, + LastJSDocNode = 336, + FirstJSDocTagNode = 317, + LastJSDocTagNode = 336, } export type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia; export type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral; @@ -841,6 +842,11 @@ declare namespace ts { readonly parent: ObjectTypeDeclaration; readonly type: TypeNode; } + export interface ClassStaticBlockDeclaration extends ClassElement { + readonly kind: SyntaxKind.ClassStaticBlockDeclaration; + readonly staticToken: Token; + readonly body: Block; + } export interface TypeNode extends Node { _typeNodeBrand: any; } @@ -3259,6 +3265,8 @@ declare namespace ts { updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration; createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; + createClassStaticBlockDeclaration(staticToken: Token, body: Block): ClassStaticBlockDeclaration; + updateClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, staticToken: Token, body: Block): ClassStaticBlockDeclaration; createKeywordTypeNode(kind: TKind): KeywordTypeNode; createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode; updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode; @@ -4268,6 +4276,8 @@ declare namespace ts { function isPropertyName(node: Node): node is PropertyName; function isBindingName(node: Node): node is BindingName; function isFunctionLike(node: Node | undefined): node is SignatureDeclaration; + function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration; + function isFunctionLikeOrClassStaticBlockDeclaration(node: Node | undefined): node is (SignatureDeclaration | ClassStaticBlockDeclaration); function isClassElement(node: Node): node is ClassElement; function isClassLike(node: Node): node is ClassLikeDeclaration; function isAccessor(node: Node): node is AccessorDeclaration; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index 992a333c9d26c..575602ee5a6c2 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -275,179 +275,180 @@ declare namespace ts { SetAccessor = 168, CallSignature = 169, ConstructSignature = 170, - IndexSignature = 171, - TypePredicate = 172, - TypeReference = 173, - FunctionType = 174, - ConstructorType = 175, - TypeQuery = 176, - TypeLiteral = 177, - ArrayType = 178, - TupleType = 179, - OptionalType = 180, - RestType = 181, - UnionType = 182, - IntersectionType = 183, - ConditionalType = 184, - InferType = 185, - ParenthesizedType = 186, - ThisType = 187, - TypeOperator = 188, - IndexedAccessType = 189, - MappedType = 190, - LiteralType = 191, - NamedTupleMember = 192, - TemplateLiteralType = 193, - TemplateLiteralTypeSpan = 194, - ImportType = 195, - ObjectBindingPattern = 196, - ArrayBindingPattern = 197, - BindingElement = 198, - ArrayLiteralExpression = 199, - ObjectLiteralExpression = 200, - PropertyAccessExpression = 201, - ElementAccessExpression = 202, - CallExpression = 203, - NewExpression = 204, - TaggedTemplateExpression = 205, - TypeAssertionExpression = 206, - ParenthesizedExpression = 207, - FunctionExpression = 208, - ArrowFunction = 209, - DeleteExpression = 210, - TypeOfExpression = 211, - VoidExpression = 212, - AwaitExpression = 213, - PrefixUnaryExpression = 214, - PostfixUnaryExpression = 215, - BinaryExpression = 216, - ConditionalExpression = 217, - TemplateExpression = 218, - YieldExpression = 219, - SpreadElement = 220, - ClassExpression = 221, - OmittedExpression = 222, - ExpressionWithTypeArguments = 223, - AsExpression = 224, - NonNullExpression = 225, - MetaProperty = 226, - SyntheticExpression = 227, - TemplateSpan = 228, - SemicolonClassElement = 229, - Block = 230, - EmptyStatement = 231, - VariableStatement = 232, - ExpressionStatement = 233, - IfStatement = 234, - DoStatement = 235, - WhileStatement = 236, - ForStatement = 237, - ForInStatement = 238, - ForOfStatement = 239, - ContinueStatement = 240, - BreakStatement = 241, - ReturnStatement = 242, - WithStatement = 243, - SwitchStatement = 244, - LabeledStatement = 245, - ThrowStatement = 246, - TryStatement = 247, - DebuggerStatement = 248, - VariableDeclaration = 249, - VariableDeclarationList = 250, - FunctionDeclaration = 251, - ClassDeclaration = 252, - InterfaceDeclaration = 253, - TypeAliasDeclaration = 254, - EnumDeclaration = 255, - ModuleDeclaration = 256, - ModuleBlock = 257, - CaseBlock = 258, - NamespaceExportDeclaration = 259, - ImportEqualsDeclaration = 260, - ImportDeclaration = 261, - ImportClause = 262, - NamespaceImport = 263, - NamedImports = 264, - ImportSpecifier = 265, - ExportAssignment = 266, - ExportDeclaration = 267, - NamedExports = 268, - NamespaceExport = 269, - ExportSpecifier = 270, - MissingDeclaration = 271, - ExternalModuleReference = 272, - JsxElement = 273, - JsxSelfClosingElement = 274, - JsxOpeningElement = 275, - JsxClosingElement = 276, - JsxFragment = 277, - JsxOpeningFragment = 278, - JsxClosingFragment = 279, - JsxAttribute = 280, - JsxAttributes = 281, - JsxSpreadAttribute = 282, - JsxExpression = 283, - CaseClause = 284, - DefaultClause = 285, - HeritageClause = 286, - CatchClause = 287, - PropertyAssignment = 288, - ShorthandPropertyAssignment = 289, - SpreadAssignment = 290, - EnumMember = 291, - UnparsedPrologue = 292, - UnparsedPrepend = 293, - UnparsedText = 294, - UnparsedInternalText = 295, - UnparsedSyntheticReference = 296, - SourceFile = 297, - Bundle = 298, - UnparsedSource = 299, - InputFiles = 300, - JSDocTypeExpression = 301, - JSDocNameReference = 302, - JSDocAllType = 303, - JSDocUnknownType = 304, - JSDocNullableType = 305, - JSDocNonNullableType = 306, - JSDocOptionalType = 307, - JSDocFunctionType = 308, - JSDocVariadicType = 309, - JSDocNamepathType = 310, - JSDocComment = 311, - JSDocText = 312, - JSDocTypeLiteral = 313, - JSDocSignature = 314, - JSDocLink = 315, - JSDocTag = 316, - JSDocAugmentsTag = 317, - JSDocImplementsTag = 318, - JSDocAuthorTag = 319, - JSDocDeprecatedTag = 320, - JSDocClassTag = 321, - JSDocPublicTag = 322, - JSDocPrivateTag = 323, - JSDocProtectedTag = 324, - JSDocReadonlyTag = 325, - JSDocCallbackTag = 326, - JSDocEnumTag = 327, - JSDocParameterTag = 328, - JSDocReturnTag = 329, - JSDocThisTag = 330, - JSDocTypeTag = 331, - JSDocTemplateTag = 332, - JSDocTypedefTag = 333, - JSDocSeeTag = 334, - JSDocPropertyTag = 335, - SyntaxList = 336, - NotEmittedStatement = 337, - PartiallyEmittedExpression = 338, - CommaListExpression = 339, - MergeDeclarationMarker = 340, - EndOfDeclarationMarker = 341, - SyntheticReferenceExpression = 342, - Count = 343, + ClassStaticBlockDeclaration = 171, + IndexSignature = 172, + TypePredicate = 173, + TypeReference = 174, + FunctionType = 175, + ConstructorType = 176, + TypeQuery = 177, + TypeLiteral = 178, + ArrayType = 179, + TupleType = 180, + OptionalType = 181, + RestType = 182, + UnionType = 183, + IntersectionType = 184, + ConditionalType = 185, + InferType = 186, + ParenthesizedType = 187, + ThisType = 188, + TypeOperator = 189, + IndexedAccessType = 190, + MappedType = 191, + LiteralType = 192, + NamedTupleMember = 193, + TemplateLiteralType = 194, + TemplateLiteralTypeSpan = 195, + ImportType = 196, + ObjectBindingPattern = 197, + ArrayBindingPattern = 198, + BindingElement = 199, + ArrayLiteralExpression = 200, + ObjectLiteralExpression = 201, + PropertyAccessExpression = 202, + ElementAccessExpression = 203, + CallExpression = 204, + NewExpression = 205, + TaggedTemplateExpression = 206, + TypeAssertionExpression = 207, + ParenthesizedExpression = 208, + FunctionExpression = 209, + ArrowFunction = 210, + DeleteExpression = 211, + TypeOfExpression = 212, + VoidExpression = 213, + AwaitExpression = 214, + PrefixUnaryExpression = 215, + PostfixUnaryExpression = 216, + BinaryExpression = 217, + ConditionalExpression = 218, + TemplateExpression = 219, + YieldExpression = 220, + SpreadElement = 221, + ClassExpression = 222, + OmittedExpression = 223, + ExpressionWithTypeArguments = 224, + AsExpression = 225, + NonNullExpression = 226, + MetaProperty = 227, + SyntheticExpression = 228, + TemplateSpan = 229, + SemicolonClassElement = 230, + Block = 231, + EmptyStatement = 232, + VariableStatement = 233, + ExpressionStatement = 234, + IfStatement = 235, + DoStatement = 236, + WhileStatement = 237, + ForStatement = 238, + ForInStatement = 239, + ForOfStatement = 240, + ContinueStatement = 241, + BreakStatement = 242, + ReturnStatement = 243, + WithStatement = 244, + SwitchStatement = 245, + LabeledStatement = 246, + ThrowStatement = 247, + TryStatement = 248, + DebuggerStatement = 249, + VariableDeclaration = 250, + VariableDeclarationList = 251, + FunctionDeclaration = 252, + ClassDeclaration = 253, + InterfaceDeclaration = 254, + TypeAliasDeclaration = 255, + EnumDeclaration = 256, + ModuleDeclaration = 257, + ModuleBlock = 258, + CaseBlock = 259, + NamespaceExportDeclaration = 260, + ImportEqualsDeclaration = 261, + ImportDeclaration = 262, + ImportClause = 263, + NamespaceImport = 264, + NamedImports = 265, + ImportSpecifier = 266, + ExportAssignment = 267, + ExportDeclaration = 268, + NamedExports = 269, + NamespaceExport = 270, + ExportSpecifier = 271, + MissingDeclaration = 272, + ExternalModuleReference = 273, + JsxElement = 274, + JsxSelfClosingElement = 275, + JsxOpeningElement = 276, + JsxClosingElement = 277, + JsxFragment = 278, + JsxOpeningFragment = 279, + JsxClosingFragment = 280, + JsxAttribute = 281, + JsxAttributes = 282, + JsxSpreadAttribute = 283, + JsxExpression = 284, + CaseClause = 285, + DefaultClause = 286, + HeritageClause = 287, + CatchClause = 288, + PropertyAssignment = 289, + ShorthandPropertyAssignment = 290, + SpreadAssignment = 291, + EnumMember = 292, + UnparsedPrologue = 293, + UnparsedPrepend = 294, + UnparsedText = 295, + UnparsedInternalText = 296, + UnparsedSyntheticReference = 297, + SourceFile = 298, + Bundle = 299, + UnparsedSource = 300, + InputFiles = 301, + JSDocTypeExpression = 302, + JSDocNameReference = 303, + JSDocAllType = 304, + JSDocUnknownType = 305, + JSDocNullableType = 306, + JSDocNonNullableType = 307, + JSDocOptionalType = 308, + JSDocFunctionType = 309, + JSDocVariadicType = 310, + JSDocNamepathType = 311, + JSDocComment = 312, + JSDocText = 313, + JSDocTypeLiteral = 314, + JSDocSignature = 315, + JSDocLink = 316, + JSDocTag = 317, + JSDocAugmentsTag = 318, + JSDocImplementsTag = 319, + JSDocAuthorTag = 320, + JSDocDeprecatedTag = 321, + JSDocClassTag = 322, + JSDocPublicTag = 323, + JSDocPrivateTag = 324, + JSDocProtectedTag = 325, + JSDocReadonlyTag = 326, + JSDocCallbackTag = 327, + JSDocEnumTag = 328, + JSDocParameterTag = 329, + JSDocReturnTag = 330, + JSDocThisTag = 331, + JSDocTypeTag = 332, + JSDocTemplateTag = 333, + JSDocTypedefTag = 334, + JSDocSeeTag = 335, + JSDocPropertyTag = 336, + SyntaxList = 337, + NotEmittedStatement = 338, + PartiallyEmittedExpression = 339, + CommaListExpression = 340, + MergeDeclarationMarker = 341, + EndOfDeclarationMarker = 342, + SyntheticReferenceExpression = 343, + Count = 344, FirstAssignment = 62, LastAssignment = 77, FirstCompoundAssignment = 63, @@ -458,8 +459,8 @@ declare namespace ts { LastKeyword = 156, FirstFutureReservedWord = 116, LastFutureReservedWord = 124, - FirstTypeNode = 172, - LastTypeNode = 195, + FirstTypeNode = 173, + LastTypeNode = 196, FirstPunctuation = 18, LastPunctuation = 77, FirstToken = 0, @@ -472,13 +473,13 @@ declare namespace ts { LastTemplateToken = 17, FirstBinaryOperator = 29, LastBinaryOperator = 77, - FirstStatement = 232, - LastStatement = 248, + FirstStatement = 233, + LastStatement = 249, FirstNode = 157, - FirstJSDocNode = 301, - LastJSDocNode = 335, - FirstJSDocTagNode = 316, - LastJSDocTagNode = 335, + FirstJSDocNode = 302, + LastJSDocNode = 336, + FirstJSDocTagNode = 317, + LastJSDocTagNode = 336, } export type TriviaSyntaxKind = SyntaxKind.SingleLineCommentTrivia | SyntaxKind.MultiLineCommentTrivia | SyntaxKind.NewLineTrivia | SyntaxKind.WhitespaceTrivia | SyntaxKind.ShebangTrivia | SyntaxKind.ConflictMarkerTrivia; export type LiteralSyntaxKind = SyntaxKind.NumericLiteral | SyntaxKind.BigIntLiteral | SyntaxKind.StringLiteral | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.RegularExpressionLiteral | SyntaxKind.NoSubstitutionTemplateLiteral; @@ -841,6 +842,11 @@ declare namespace ts { readonly parent: ObjectTypeDeclaration; readonly type: TypeNode; } + export interface ClassStaticBlockDeclaration extends ClassElement { + readonly kind: SyntaxKind.ClassStaticBlockDeclaration; + readonly staticToken: Token; + readonly body: Block; + } export interface TypeNode extends Node { _typeNodeBrand: any; } @@ -3259,6 +3265,8 @@ declare namespace ts { updateIndexSignature(node: IndexSignatureDeclaration, decorators: readonly Decorator[] | undefined, modifiers: readonly Modifier[] | undefined, parameters: readonly ParameterDeclaration[], type: TypeNode): IndexSignatureDeclaration; createTemplateLiteralTypeSpan(type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; updateTemplateLiteralTypeSpan(node: TemplateLiteralTypeSpan, type: TypeNode, literal: TemplateMiddle | TemplateTail): TemplateLiteralTypeSpan; + createClassStaticBlockDeclaration(staticToken: Token, body: Block): ClassStaticBlockDeclaration; + updateClassStaticBlockDeclaration(node: ClassStaticBlockDeclaration, staticToken: Token, body: Block): ClassStaticBlockDeclaration; createKeywordTypeNode(kind: TKind): KeywordTypeNode; createTypePredicateNode(assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode | string, type: TypeNode | undefined): TypePredicateNode; updateTypePredicateNode(node: TypePredicateNode, assertsModifier: AssertsKeyword | undefined, parameterName: Identifier | ThisTypeNode, type: TypeNode | undefined): TypePredicateNode; @@ -4268,6 +4276,8 @@ declare namespace ts { function isPropertyName(node: Node): node is PropertyName; function isBindingName(node: Node): node is BindingName; function isFunctionLike(node: Node | undefined): node is SignatureDeclaration; + function isClassStaticBlockDeclaration(node: Node): node is ClassStaticBlockDeclaration; + function isFunctionLikeOrClassStaticBlockDeclaration(node: Node | undefined): node is (SignatureDeclaration | ClassStaticBlockDeclaration); function isClassElement(node: Node): node is ClassElement; function isClassLike(node: Node): node is ClassLikeDeclaration; function isAccessor(node: Node): node is AccessorDeclaration;