Skip to content

Commit 75033be

Browse files
committed
feat(1534): add sealed keyword
1 parent 488d0ee commit 75033be

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1134
-531
lines changed

src/compiler/checker.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -12529,6 +12529,7 @@ namespace ts {
1252912529
checkFlags |= (!(modifiers & ModifierFlags.NonPublicAccessibilityModifier) ? CheckFlags.ContainsPublic : 0) |
1253012530
(modifiers & ModifierFlags.Protected ? CheckFlags.ContainsProtected : 0) |
1253112531
(modifiers & ModifierFlags.Private ? CheckFlags.ContainsPrivate : 0) |
12532+
(modifiers & ModifierFlags.Sealed ? CheckFlags.ContainsSealed : 0) |
1253212533
(modifiers & ModifierFlags.Static ? CheckFlags.ContainsStatic : 0);
1253312534
if (!isPrototypeProperty(prop)) {
1253412535
syntheticFlag = CheckFlags.SyntheticProperty;
@@ -20256,6 +20257,13 @@ namespace ts {
2025620257
return Ternary.False;
2025720258
}
2025820259
}
20260+
else if (targetPropFlags & ModifierFlags.Sealed) {
20261+
if (reportErrors) {
20262+
reportError(Diagnostics.Property_0_is_sealed_in_type_1_that_cannot_be_overridden_in_type_2, symbolToString(targetProp),
20263+
typeToString(target), typeToString(source));
20264+
}
20265+
return Ternary.False;
20266+
}
2025920267
else if (targetPropFlags & ModifierFlags.Protected) {
2026020268
if (!isValidOverrideOf(sourceProp, targetProp)) {
2026120269
if (reportErrors) {
@@ -44129,7 +44137,7 @@ namespace ts {
4412944137
return quickResult;
4413044138
}
4413144139

44132-
let lastStatic: Node | undefined, lastDeclare: Node | undefined, lastAsync: Node | undefined, lastOverride: Node | undefined;
44140+
let lastStatic: Node | undefined, lastDeclare: Node | undefined, lastAsync: Node | undefined, lastOverride: Node | undefined, lastSealed: Node | undefined;
4413344141
let flags = ModifierFlags.None;
4413444142
for (const modifier of node.modifiers!) {
4413544143
if (isDecorator(modifier)) continue;
@@ -44276,6 +44284,19 @@ namespace ts {
4427644284

4427744285
flags |= ModifierFlags.Default;
4427844286
break;
44287+
case SyntaxKind.SealedKeyword:
44288+
if (flags & ModifierFlags.Sealed) {
44289+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "sealed");
44290+
}
44291+
if (flags & ModifierFlags.Private) {
44292+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "sealed", "private");
44293+
}
44294+
if (flags & ModifierFlags.Abstract) {
44295+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "sealed", "abstract");
44296+
}
44297+
flags |= ModifierFlags.Sealed;
44298+
lastSealed = modifier;
44299+
break;
4427944300
case SyntaxKind.DeclareKeyword:
4428044301
if (flags & ModifierFlags.Ambient) {
4428144302
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "declare");
@@ -44382,6 +44403,9 @@ namespace ts {
4438244403
if (flags & ModifierFlags.Async) {
4438344404
return grammarErrorOnNode(lastAsync!, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "async");
4438444405
}
44406+
if (flags & ModifierFlags.Sealed) {
44407+
return grammarErrorOnNode(lastSealed!, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "sealed");
44408+
}
4438544409
return false;
4438644410
}
4438744411
else if ((node.kind === SyntaxKind.ImportDeclaration || node.kind === SyntaxKind.ImportEqualsDeclaration) && flags & ModifierFlags.Ambient) {

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -3559,6 +3559,10 @@
35593559
"category": "Error",
35603560
"code": 2844
35613561
},
3562+
"Property '{0}' is sealed in type '{1}' that cannot be overridden in type '{2}'.": {
3563+
"category": "Error",
3564+
"code": 2845
3565+
},
35623566

35633567
"Import declaration '{0}' is using private name '{1}'.": {
35643568
"category": "Error",

src/compiler/factory/nodeFactory.ts

+2
Original file line numberDiff line numberDiff line change
@@ -972,6 +972,7 @@ namespace ts {
972972
case SyntaxKind.PublicKeyword:
973973
case SyntaxKind.PrivateKeyword:
974974
case SyntaxKind.ProtectedKeyword:
975+
case SyntaxKind.SealedKeyword:
975976
case SyntaxKind.ReadonlyKeyword:
976977
case SyntaxKind.AbstractKeyword:
977978
case SyntaxKind.DeclareKeyword:
@@ -1057,6 +1058,7 @@ namespace ts {
10571058
if (flags & ModifierFlags.Public) result.push(createModifier(SyntaxKind.PublicKeyword));
10581059
if (flags & ModifierFlags.Private) result.push(createModifier(SyntaxKind.PrivateKeyword));
10591060
if (flags & ModifierFlags.Protected) result.push(createModifier(SyntaxKind.ProtectedKeyword));
1061+
if (flags & ModifierFlags.Sealed) result.push(createModifier(SyntaxKind.SealedKeyword));
10601062
if (flags & ModifierFlags.Abstract) result.push(createModifier(SyntaxKind.AbstractKeyword));
10611063
if (flags & ModifierFlags.Static) result.push(createModifier(SyntaxKind.StaticKeyword));
10621064
if (flags & ModifierFlags.Override) result.push(createModifier(SyntaxKind.OverrideKeyword));

src/compiler/program.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,7 @@ namespace ts {
24542454
case SyntaxKind.PublicKeyword:
24552455
case SyntaxKind.PrivateKeyword:
24562456
case SyntaxKind.ProtectedKeyword:
2457+
case SyntaxKind.SealedKeyword:
24572458
case SyntaxKind.ReadonlyKeyword:
24582459
case SyntaxKind.DeclareKeyword:
24592460
case SyntaxKind.AbstractKeyword:

src/compiler/scanner.ts

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ namespace ts {
130130
private: SyntaxKind.PrivateKeyword,
131131
protected: SyntaxKind.ProtectedKeyword,
132132
public: SyntaxKind.PublicKeyword,
133+
sealed: SyntaxKind.SealedKeyword,
133134
override: SyntaxKind.OverrideKeyword,
134135
out: SyntaxKind.OutKeyword,
135136
readonly: SyntaxKind.ReadonlyKeyword,

src/compiler/transformers/ts.ts

+1
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,7 @@ namespace ts {
395395
case SyntaxKind.PublicKeyword:
396396
case SyntaxKind.PrivateKeyword:
397397
case SyntaxKind.ProtectedKeyword:
398+
case SyntaxKind.SealedKeyword:
398399
case SyntaxKind.AbstractKeyword:
399400
case SyntaxKind.OverrideKeyword:
400401
case SyntaxKind.ConstKeyword:

src/compiler/types.ts

+22-14
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ namespace ts {
156156
ProtectedKeyword,
157157
PublicKeyword,
158158
StaticKeyword,
159+
SealedKeyword,
159160
YieldKeyword,
160161
// Contextual keywords
161162
AbstractKeyword,
@@ -604,6 +605,7 @@ namespace ts {
604605
| SyntaxKind.PrivateKeyword
605606
| SyntaxKind.ProtectedKeyword
606607
| SyntaxKind.PublicKeyword
608+
| SyntaxKind.SealedKeyword
607609
| SyntaxKind.ReadonlyKeyword
608610
| SyntaxKind.OutKeyword
609611
| SyntaxKind.OverrideKeyword
@@ -643,6 +645,7 @@ namespace ts {
643645
| SyntaxKind.PrivateKeyword
644646
| SyntaxKind.ProtectedKeyword
645647
| SyntaxKind.PublicKeyword
648+
| SyntaxKind.SealedKeyword
646649
| SyntaxKind.ReadonlyKeyword
647650
| SyntaxKind.OutKeyword
648651
| SyntaxKind.OverrideKeyword
@@ -817,9 +820,10 @@ namespace ts {
817820
Protected = 1 << 4, // Property/Method
818821
Static = 1 << 5, // Property/Method
819822
Readonly = 1 << 6, // Property/Method
820-
Abstract = 1 << 7, // Class/Method/ConstructSignature
821-
Async = 1 << 8, // Property/Method/Function
822-
Default = 1 << 9, // Function/Class (export default declaration)
823+
Sealed = 1 << 7, // Property/Method
824+
Abstract = 1 << 8, // Class/Method/ConstructSignature
825+
Async = 1 << 9, // Property/Method/Function
826+
Default = 1 << 10, // Function/Class (export default declaration)
823827
Const = 1 << 11, // Const enum
824828
HasComputedJSDocModifiers = 1 << 12, // Indicates the computed modifier flags include modifiers from JSDoc.
825829

@@ -835,9 +839,9 @@ namespace ts {
835839
ParameterPropertyModifier = AccessibilityModifier | Readonly | Override,
836840
NonPublicAccessibilityModifier = Private | Protected,
837841

838-
TypeScriptModifier = Ambient | Public | Private | Protected | Readonly | Abstract | Const | Override | In | Out,
842+
TypeScriptModifier = Ambient | Public | Private | Protected | Sealed | Readonly | Abstract | Const | Override | In | Out,
839843
ExportDefault = Export | Default,
840-
All = Export | Ambient | Public | Private | Protected | Static | Readonly | Abstract | Async | Default | Const | Deprecated | Override | In | Out | Decorator,
844+
All = Export | Ambient | Public | Private | Protected | Sealed | Static | Readonly | Abstract | Async | Default | Const | Deprecated | Override | In | Out | Decorator,
841845
Modifier = All & ~Decorator
842846
}
843847

@@ -1341,6 +1345,7 @@ namespace ts {
13411345
export type PrivateKeyword = ModifierToken<SyntaxKind.PrivateKeyword>;
13421346
export type ProtectedKeyword = ModifierToken<SyntaxKind.ProtectedKeyword>;
13431347
export type PublicKeyword = ModifierToken<SyntaxKind.PublicKeyword>;
1348+
export type SealedKeyword = ModifierToken<SyntaxKind.SealedKeyword>;
13441349
export type ReadonlyKeyword = ModifierToken<SyntaxKind.ReadonlyKeyword>;
13451350
export type OutKeyword = ModifierToken<SyntaxKind.OutKeyword>;
13461351
export type OverrideKeyword = ModifierToken<SyntaxKind.OverrideKeyword>;
@@ -1361,6 +1366,7 @@ namespace ts {
13611366
| ProtectedKeyword
13621367
| PublicKeyword
13631368
| OutKeyword
1369+
| SealedKeyword
13641370
| OverrideKeyword
13651371
| ReadonlyKeyword
13661372
| StaticKeyword
@@ -5407,15 +5413,17 @@ namespace ts {
54075413
ContainsProtected = 1 << 9, // Synthetic property with protected constituent(s)
54085414
ContainsPrivate = 1 << 10, // Synthetic property with private constituent(s)
54095415
ContainsStatic = 1 << 11, // Synthetic property with static constituent(s)
5410-
Late = 1 << 12, // Late-bound symbol for a computed property with a dynamic name
5411-
ReverseMapped = 1 << 13, // Property of reverse-inferred homomorphic mapped type
5412-
OptionalParameter = 1 << 14, // Optional parameter
5413-
RestParameter = 1 << 15, // Rest parameter
5414-
DeferredType = 1 << 16, // Calculation of the type of this symbol is deferred due to processing costs, should be fetched with `getTypeOfSymbolWithDeferredType`
5415-
HasNeverType = 1 << 17, // Synthetic property with at least one never type in constituents
5416-
Mapped = 1 << 18, // Property of mapped type
5417-
StripOptional = 1 << 19, // Strip optionality in mapped property
5418-
Unresolved = 1 << 20, // Unresolved type alias symbol
5416+
ContainsSealed = 1 << 12,
5417+
5418+
Late = 1 << 13, // Late-bound symbol for a computed property with a dynamic name
5419+
ReverseMapped = 1 << 14, // Property of reverse-inferred homomorphic mapped type
5420+
OptionalParameter = 1 << 15, // Optional parameter
5421+
RestParameter = 1 << 16, // Rest parameter
5422+
DeferredType = 1 << 17, // Calculation of the type of this symbol is deferred due to processing costs, should be fetched with `getTypeOfSymbolWithDeferredType`
5423+
HasNeverType = 1 << 18, // Synthetic property with at least one never type in constituents
5424+
Mapped = 1 << 19, // Property of mapped type
5425+
StripOptional = 1 << 20, // Strip optionality in mapped property
5426+
Unresolved = 1 << 21, // Unresolved type alias symbol
54195427
Synthetic = SyntheticProperty | SyntheticMethod,
54205428
Discriminant = HasNonUniformType | HasLiteralType,
54215429
Partial = ReadPartial | WritePartial

src/compiler/utilities.ts

+2
Original file line numberDiff line numberDiff line change
@@ -5030,6 +5030,7 @@ namespace ts {
50305030
case SyntaxKind.PublicKeyword: return ModifierFlags.Public;
50315031
case SyntaxKind.ProtectedKeyword: return ModifierFlags.Protected;
50325032
case SyntaxKind.PrivateKeyword: return ModifierFlags.Private;
5033+
case SyntaxKind.SealedKeyword: return ModifierFlags.Sealed;
50335034
case SyntaxKind.AbstractKeyword: return ModifierFlags.Abstract;
50345035
case SyntaxKind.ExportKeyword: return ModifierFlags.Export;
50355036
case SyntaxKind.DeclareKeyword: return ModifierFlags.Ambient;
@@ -5575,6 +5576,7 @@ namespace ts {
55755576
const checkFlags = (s as TransientSymbol).checkFlags;
55765577
const accessModifier = checkFlags & CheckFlags.ContainsPrivate ? ModifierFlags.Private :
55775578
checkFlags & CheckFlags.ContainsPublic ? ModifierFlags.Public :
5579+
checkFlags & CheckFlags.ContainsSealed ? ModifierFlags.Sealed :
55785580
ModifierFlags.Protected;
55795581
const staticModifier = checkFlags & CheckFlags.ContainsStatic ? ModifierFlags.Static : 0;
55805582
return accessModifier | staticModifier;

src/compiler/utilitiesPublic.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,7 @@ namespace ts {
12251225
case SyntaxKind.PublicKeyword:
12261226
case SyntaxKind.PrivateKeyword:
12271227
case SyntaxKind.ProtectedKeyword:
1228+
case SyntaxKind.SealedKeyword:
12281229
case SyntaxKind.ReadonlyKeyword:
12291230
case SyntaxKind.StaticKeyword:
12301231
case SyntaxKind.OutKeyword:
@@ -1241,7 +1242,7 @@ namespace ts {
12411242

12421243
/* @internal */
12431244
export function isClassMemberModifier(idToken: SyntaxKind): boolean {
1244-
return isParameterPropertyModifier(idToken) || idToken === SyntaxKind.StaticKeyword || idToken === SyntaxKind.OverrideKeyword;
1245+
return isParameterPropertyModifier(idToken) || idToken === SyntaxKind.SealedKeyword || idToken === SyntaxKind.StaticKeyword || idToken === SyntaxKind.OverrideKeyword;
12451246
}
12461247

12471248
export function isModifier(node: Node): node is Modifier {

src/harness/fourslashInterfaceImpl.ts

+2
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,7 @@ namespace FourSlashInterface {
12411241
case "private":
12421242
case "protected":
12431243
case "public":
1244+
case "sealed":
12441245
case "abstract":
12451246
case "any":
12461247
case "boolean":
@@ -1280,6 +1281,7 @@ namespace FourSlashInterface {
12801281
"protected",
12811282
"public",
12821283
"readonly",
1284+
"sealed",
12831285
"set",
12841286
"static",
12851287
].map(keywordEntry);

src/services/completions.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3230,6 +3230,9 @@ namespace ts.Completions {
32303230
case "private":
32313231
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Private;
32323232
break;
3233+
case "sealed":
3234+
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Sealed;
3235+
break;
32333236
case "static":
32343237
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Static;
32353238
break;
@@ -3243,7 +3246,7 @@ namespace ts.Completions {
32433246
}
32443247

32453248
// No member list for private methods
3246-
if (!(classElementModifierFlags & ModifierFlags.Private)) {
3249+
if (!(classElementModifierFlags & (ModifierFlags.Private | ModifierFlags.Sealed))) {
32473250
// List of property symbols of base type that are not private and already implemented
32483251
const baseTypeNodes = isClassLike(decl) && classElementModifierFlags & ModifierFlags.Override ? singleElementArray(getEffectiveBaseTypeNode(decl)) : getAllSuperTypeNodes(decl);
32493252
const baseSymbols = flatMap(baseTypeNodes, baseTypeNode => {
@@ -3493,6 +3496,7 @@ namespace ts.Completions {
34933496
case SyntaxKind.InterfaceKeyword:
34943497
case SyntaxKind.LetKeyword:
34953498
case SyntaxKind.PrivateKeyword:
3499+
case SyntaxKind.SealedKeyword:
34963500
case SyntaxKind.ProtectedKeyword:
34973501
case SyntaxKind.PublicKeyword:
34983502
case SyntaxKind.StaticKeyword:
@@ -3930,6 +3934,7 @@ namespace ts.Completions {
39303934
case SyntaxKind.PrivateKeyword:
39313935
case SyntaxKind.ProtectedKeyword:
39323936
case SyntaxKind.PublicKeyword:
3937+
case SyntaxKind.SealedKeyword:
39333938
case SyntaxKind.ReadonlyKeyword:
39343939
case SyntaxKind.StringKeyword:
39353940
case SyntaxKind.SymbolKeyword:

0 commit comments

Comments
 (0)