@@ -477,6 +477,7 @@ import {
477477 isClassDeclaration,
478478 isClassElement,
479479 isClassExpression,
480+ isClassFieldAndNotAutoAccessor,
480481 isClassLike,
481482 isClassStaticBlockDeclaration,
482483 isCommaSequence,
@@ -4959,7 +4960,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
49594960 (isLiteralImportTypeNode(location) ? location : undefined)?.argument.literal;
49604961 const mode = contextSpecifier && isStringLiteralLike(contextSpecifier) ? getModeForUsageLocation(currentSourceFile, contextSpecifier) : currentSourceFile.impliedNodeFormat;
49614962 const moduleResolutionKind = getEmitModuleResolutionKind(compilerOptions);
4962- const resolvedModule = host.resolvedModules?.get (currentSourceFile.path)?.get( moduleReference, mode)?.resolvedModule;
4963+ const resolvedModule = host.getResolvedModule (currentSourceFile, moduleReference, mode)?.resolvedModule;
49634964 const resolutionDiagnostic = resolvedModule && getResolutionDiagnostic(compilerOptions, resolvedModule, currentSourceFile);
49644965 const sourceFile = resolvedModule
49654966 && (!resolutionDiagnostic || resolutionDiagnostic === Diagnostics.Module_0_was_resolved_to_1_but_jsx_is_not_set)
@@ -31843,6 +31844,14 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3184331844 }
3184431845 return false;
3184531846 }
31847+ // A class field cannot be accessed via super.* from a derived class.
31848+ // This is true for both [[Set]] (old) and [[Define]] (ES spec) semantics.
31849+ if (!(flags & ModifierFlags.Static) && prop.declarations?.some(isClassFieldAndNotAutoAccessor)) {
31850+ if (errorNode) {
31851+ error(errorNode, Diagnostics.Class_field_0_defined_by_the_parent_class_is_not_accessible_in_the_child_class_via_super, symbolToString(prop));
31852+ }
31853+ return false;
31854+ }
3184631855 }
3184731856
3184831857 // Referencing abstract properties within their own constructors is not allowed
@@ -32329,9 +32338,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3232932338 if (file) {
3233032339 if (compilerOptions.checkJs === undefined && file.checkJsDirective === undefined && (file.scriptKind === ScriptKind.JS || file.scriptKind === ScriptKind.JSX)) {
3233132340 const declarationFile = forEach(suggestion?.declarations, getSourceFileOfNode);
32341+ const suggestionHasNoExtendsOrDecorators = !suggestion?.valueDeclaration
32342+ || !isClassLike(suggestion.valueDeclaration)
32343+ || suggestion.valueDeclaration.heritageClauses?.length
32344+ || classOrConstructorParameterIsDecorated(/*useLegacyDecorators*/ false, suggestion.valueDeclaration);
3233232345 return !(file !== declarationFile && !!declarationFile && isGlobalSourceFile(declarationFile))
32333- && !(excludeClasses && suggestion && suggestion.flags & SymbolFlags.Class)
32334- && !(!!node && excludeClasses && isPropertyAccessExpression(node) && node.expression.kind === SyntaxKind.ThisKeyword);
32346+ && !(excludeClasses && suggestion && suggestion.flags & SymbolFlags.Class && suggestionHasNoExtendsOrDecorators )
32347+ && !(!!node && excludeClasses && isPropertyAccessExpression(node) && node.expression.kind === SyntaxKind.ThisKeyword && suggestionHasNoExtendsOrDecorators );
3233532348 }
3233632349 }
3233732350 return false;
0 commit comments