Skip to content

Commit 98fe765

Browse files
committed
feat(1534): add sealed keyword
1 parent 4cd3bb8 commit 98fe765

Some content is hidden

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

57 files changed

+1098
-520
lines changed

src/compiler/checker.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -11969,6 +11969,7 @@ namespace ts {
1196911969
checkFlags |= (!(modifiers & ModifierFlags.NonPublicAccessibilityModifier) ? CheckFlags.ContainsPublic : 0) |
1197011970
(modifiers & ModifierFlags.Protected ? CheckFlags.ContainsProtected : 0) |
1197111971
(modifiers & ModifierFlags.Private ? CheckFlags.ContainsPrivate : 0) |
11972+
(modifiers & ModifierFlags.Sealed ? CheckFlags.ContainsSealed : 0) |
1197211973
(modifiers & ModifierFlags.Static ? CheckFlags.ContainsStatic : 0);
1197311974
if (!isPrototypeProperty(prop)) {
1197411975
syntheticFlag = CheckFlags.SyntheticProperty;
@@ -19430,6 +19431,13 @@ namespace ts {
1943019431
return Ternary.False;
1943119432
}
1943219433
}
19434+
else if (targetPropFlags & ModifierFlags.Sealed) {
19435+
if (reportErrors) {
19436+
reportError(Diagnostics.Property_0_is_sealed_in_type_1_that_cannot_be_overridden_in_type_2, symbolToString(targetProp),
19437+
typeToString(target), typeToString(source));
19438+
}
19439+
return Ternary.False;
19440+
}
1943319441
else if (targetPropFlags & ModifierFlags.Protected) {
1943419442
if (!isValidOverrideOf(sourceProp, targetProp)) {
1943519443
if (reportErrors) {
@@ -41977,7 +41985,7 @@ namespace ts {
4197741985
return quickResult;
4197841986
}
4197941987

41980-
let lastStatic: Node | undefined, lastDeclare: Node | undefined, lastAsync: Node | undefined, lastReadonly: Node | undefined, lastOverride: Node | undefined;
41988+
let lastStatic: Node | undefined, lastDeclare: Node | undefined, lastAsync: Node | undefined, lastReadonly: Node | undefined, lastOverride: Node | undefined, lastSealed: Node | undefined;
4198141989
let flags = ModifierFlags.None;
4198241990
for (const modifier of node.modifiers!) {
4198341991
if (modifier.kind !== SyntaxKind.ReadonlyKeyword) {
@@ -42119,6 +42127,19 @@ namespace ts {
4211942127

4212042128
flags |= ModifierFlags.Default;
4212142129
break;
42130+
case SyntaxKind.SealedKeyword:
42131+
if (flags & ModifierFlags.Sealed) {
42132+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "sealed");
42133+
}
42134+
if (flags & ModifierFlags.Private) {
42135+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "sealed", "private");
42136+
}
42137+
if (flags & ModifierFlags.Abstract) {
42138+
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_cannot_be_used_with_1_modifier, "sealed", "abstract");
42139+
}
42140+
flags |= ModifierFlags.Sealed;
42141+
lastSealed = modifier;
42142+
break;
4212242143
case SyntaxKind.DeclareKeyword:
4212342144
if (flags & ModifierFlags.Ambient) {
4212442145
return grammarErrorOnNode(modifier, Diagnostics._0_modifier_already_seen, "declare");
@@ -42215,6 +42236,9 @@ namespace ts {
4221542236
else if (flags & ModifierFlags.Readonly) {
4221642237
return grammarErrorOnNode(lastReadonly!, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "readonly");
4221742238
}
42239+
if (flags & ModifierFlags.Sealed) {
42240+
return grammarErrorOnNode(lastSealed!, Diagnostics._0_modifier_cannot_appear_on_a_constructor_declaration, "sealed");
42241+
}
4221842242
return false;
4221942243
}
4222042244
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
@@ -3337,6 +3337,10 @@
33373337
"category": "Error",
33383338
"code": 2822
33393339
},
3340+
"Property '{0}' is sealed in type '{1}' that cannot be overridden in type '{2}'.": {
3341+
"category": "Error",
3342+
"code": 2823
3343+
},
33403344

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

src/compiler/factory/nodeFactory.ts

+2
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,7 @@ namespace ts {
987987
case SyntaxKind.PublicKeyword:
988988
case SyntaxKind.PrivateKeyword:
989989
case SyntaxKind.ProtectedKeyword:
990+
case SyntaxKind.SealedKeyword:
990991
case SyntaxKind.ReadonlyKeyword:
991992
case SyntaxKind.AbstractKeyword:
992993
case SyntaxKind.DeclareKeyword:
@@ -1070,6 +1071,7 @@ namespace ts {
10701071
if (flags & ModifierFlags.Public) result.push(createModifier(SyntaxKind.PublicKeyword));
10711072
if (flags & ModifierFlags.Private) result.push(createModifier(SyntaxKind.PrivateKeyword));
10721073
if (flags & ModifierFlags.Protected) result.push(createModifier(SyntaxKind.ProtectedKeyword));
1074+
if (flags & ModifierFlags.Sealed) result.push(createModifier(SyntaxKind.SealedKeyword));
10731075
if (flags & ModifierFlags.Abstract) result.push(createModifier(SyntaxKind.AbstractKeyword));
10741076
if (flags & ModifierFlags.Static) result.push(createModifier(SyntaxKind.StaticKeyword));
10751077
if (flags & ModifierFlags.Override) result.push(createModifier(SyntaxKind.OverrideKeyword));

src/compiler/program.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,7 @@ namespace ts {
22472247
case SyntaxKind.PublicKeyword:
22482248
case SyntaxKind.PrivateKeyword:
22492249
case SyntaxKind.ProtectedKeyword:
2250+
case SyntaxKind.SealedKeyword:
22502251
case SyntaxKind.ReadonlyKeyword:
22512252
case SyntaxKind.DeclareKeyword:
22522253
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
readonly: SyntaxKind.ReadonlyKeyword,
135136
require: SyntaxKind.RequireKeyword,

src/compiler/transformers/ts.ts

+1
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,7 @@ namespace ts {
368368
case SyntaxKind.PublicKeyword:
369369
case SyntaxKind.PrivateKeyword:
370370
case SyntaxKind.ProtectedKeyword:
371+
case SyntaxKind.SealedKeyword:
371372
case SyntaxKind.AbstractKeyword:
372373
case SyntaxKind.OverrideKeyword:
373374
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,
@@ -598,6 +599,7 @@ namespace ts {
598599
| SyntaxKind.PrivateKeyword
599600
| SyntaxKind.ProtectedKeyword
600601
| SyntaxKind.PublicKeyword
602+
| SyntaxKind.SealedKeyword
601603
| SyntaxKind.ReadonlyKeyword
602604
| SyntaxKind.OverrideKeyword
603605
| SyntaxKind.RequireKeyword
@@ -634,6 +636,7 @@ namespace ts {
634636
| SyntaxKind.PrivateKeyword
635637
| SyntaxKind.ProtectedKeyword
636638
| SyntaxKind.PublicKeyword
639+
| SyntaxKind.SealedKeyword
637640
| SyntaxKind.ReadonlyKeyword
638641
| SyntaxKind.OverrideKeyword
639642
| SyntaxKind.StaticKeyword
@@ -806,9 +809,10 @@ namespace ts {
806809
Protected = 1 << 4, // Property/Method
807810
Static = 1 << 5, // Property/Method
808811
Readonly = 1 << 6, // Property/Method
809-
Abstract = 1 << 7, // Class/Method/ConstructSignature
810-
Async = 1 << 8, // Property/Method/Function
811-
Default = 1 << 9, // Function/Class (export default declaration)
812+
Sealed = 1 << 7, // Property/Method
813+
Abstract = 1 << 8, // Class/Method/ConstructSignature
814+
Async = 1 << 9, // Property/Method/Function
815+
Default = 1 << 10, // Function/Class (export default declaration)
812816
Const = 1 << 11, // Const enum
813817
HasComputedJSDocModifiers = 1 << 12, // Indicates the computed modifier flags include modifiers from JSDoc.
814818

@@ -821,9 +825,9 @@ namespace ts {
821825
ParameterPropertyModifier = AccessibilityModifier | Readonly | Override,
822826
NonPublicAccessibilityModifier = Private | Protected,
823827

824-
TypeScriptModifier = Ambient | Public | Private | Protected | Readonly | Abstract | Const | Override,
828+
TypeScriptModifier = Ambient | Public | Private | Protected | Sealed | Readonly | Abstract | Const | Override,
825829
ExportDefault = Export | Default,
826-
All = Export | Ambient | Public | Private | Protected | Static | Readonly | Abstract | Async | Default | Const | Deprecated | Override
830+
All = Export | Ambient | Public | Private | Protected | Sealed | Static | Readonly | Abstract | Async | Default | Const | Deprecated | Override
827831
}
828832

829833
export const enum JsxFlags {
@@ -1064,6 +1068,7 @@ namespace ts {
10641068
export type PrivateKeyword = ModifierToken<SyntaxKind.PrivateKeyword>;
10651069
export type ProtectedKeyword = ModifierToken<SyntaxKind.ProtectedKeyword>;
10661070
export type PublicKeyword = ModifierToken<SyntaxKind.PublicKeyword>;
1071+
export type SealedKeyword = ModifierToken<SyntaxKind.SealedKeyword>;
10671072
export type ReadonlyKeyword = ModifierToken<SyntaxKind.ReadonlyKeyword>;
10681073
export type OverrideKeyword = ModifierToken<SyntaxKind.OverrideKeyword>;
10691074
export type StaticKeyword = ModifierToken<SyntaxKind.StaticKeyword>;
@@ -1081,6 +1086,7 @@ namespace ts {
10811086
| PrivateKeyword
10821087
| ProtectedKeyword
10831088
| PublicKeyword
1089+
| SealedKeyword
10841090
| OverrideKeyword
10851091
| ReadonlyKeyword
10861092
| StaticKeyword
@@ -4967,15 +4973,17 @@ namespace ts {
49674973
ContainsProtected = 1 << 9, // Synthetic property with protected constituent(s)
49684974
ContainsPrivate = 1 << 10, // Synthetic property with private constituent(s)
49694975
ContainsStatic = 1 << 11, // Synthetic property with static constituent(s)
4970-
Late = 1 << 12, // Late-bound symbol for a computed property with a dynamic name
4971-
ReverseMapped = 1 << 13, // Property of reverse-inferred homomorphic mapped type
4972-
OptionalParameter = 1 << 14, // Optional parameter
4973-
RestParameter = 1 << 15, // Rest parameter
4974-
DeferredType = 1 << 16, // Calculation of the type of this symbol is deferred due to processing costs, should be fetched with `getTypeOfSymbolWithDeferredType`
4975-
HasNeverType = 1 << 17, // Synthetic property with at least one never type in constituents
4976-
Mapped = 1 << 18, // Property of mapped type
4977-
StripOptional = 1 << 19, // Strip optionality in mapped property
4978-
Unresolved = 1 << 20, // Unresolved type alias symbol
4976+
ContainsSealed = 1 << 12,
4977+
4978+
Late = 1 << 13, // Late-bound symbol for a computed property with a dynamic name
4979+
ReverseMapped = 1 << 14, // Property of reverse-inferred homomorphic mapped type
4980+
OptionalParameter = 1 << 15, // Optional parameter
4981+
RestParameter = 1 << 16, // Rest parameter
4982+
DeferredType = 1 << 17, // Calculation of the type of this symbol is deferred due to processing costs, should be fetched with `getTypeOfSymbolWithDeferredType`
4983+
HasNeverType = 1 << 18, // Synthetic property with at least one never type in constituents
4984+
Mapped = 1 << 19, // Property of mapped type
4985+
StripOptional = 1 << 20, // Strip optionality in mapped property
4986+
Unresolved = 1 << 21, // Unresolved type alias symbol
49794987
Synthetic = SyntheticProperty | SyntheticMethod,
49804988
Discriminant = HasNonUniformType | HasLiteralType,
49814989
Partial = ReadPartial | WritePartial

src/compiler/utilities.ts

+2
Original file line numberDiff line numberDiff line change
@@ -4914,6 +4914,7 @@ namespace ts {
49144914
case SyntaxKind.PublicKeyword: return ModifierFlags.Public;
49154915
case SyntaxKind.ProtectedKeyword: return ModifierFlags.Protected;
49164916
case SyntaxKind.PrivateKeyword: return ModifierFlags.Private;
4917+
case SyntaxKind.SealedKeyword: return ModifierFlags.Sealed;
49174918
case SyntaxKind.AbstractKeyword: return ModifierFlags.Abstract;
49184919
case SyntaxKind.ExportKeyword: return ModifierFlags.Export;
49194920
case SyntaxKind.DeclareKeyword: return ModifierFlags.Ambient;
@@ -5452,6 +5453,7 @@ namespace ts {
54525453
const checkFlags = (s as TransientSymbol).checkFlags;
54535454
const accessModifier = checkFlags & CheckFlags.ContainsPrivate ? ModifierFlags.Private :
54545455
checkFlags & CheckFlags.ContainsPublic ? ModifierFlags.Public :
5456+
checkFlags & CheckFlags.ContainsSealed ? ModifierFlags.Sealed :
54555457
ModifierFlags.Protected;
54565458
const staticModifier = checkFlags & CheckFlags.ContainsStatic ? ModifierFlags.Static : 0;
54575459
return accessModifier | staticModifier;

src/compiler/utilitiesPublic.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1181,6 +1181,7 @@ namespace ts {
11811181
case SyntaxKind.PublicKeyword:
11821182
case SyntaxKind.PrivateKeyword:
11831183
case SyntaxKind.ProtectedKeyword:
1184+
case SyntaxKind.SealedKeyword:
11841185
case SyntaxKind.ReadonlyKeyword:
11851186
case SyntaxKind.StaticKeyword:
11861187
case SyntaxKind.OverrideKeyword:
@@ -1196,7 +1197,7 @@ namespace ts {
11961197

11971198
/* @internal */
11981199
export function isClassMemberModifier(idToken: SyntaxKind): boolean {
1199-
return isParameterPropertyModifier(idToken) || idToken === SyntaxKind.StaticKeyword || idToken === SyntaxKind.OverrideKeyword;
1200+
return isParameterPropertyModifier(idToken) || idToken === SyntaxKind.SealedKeyword || idToken === SyntaxKind.StaticKeyword || idToken === SyntaxKind.OverrideKeyword;
12001201
}
12011202

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

src/harness/fourslashInterfaceImpl.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1160,6 +1160,7 @@ namespace FourSlashInterface {
11601160
case "private":
11611161
case "protected":
11621162
case "public":
1163+
case "sealed":
11631164
case "abstract":
11641165
case "any":
11651166
case "boolean":
@@ -1189,7 +1190,7 @@ namespace FourSlashInterface {
11891190
}
11901191

11911192
export const classElementKeywords: readonly ExpectedCompletionEntryObject[] =
1192-
["private", "protected", "public", "static", "abstract", "async", "constructor", "declare", "get", "readonly", "set", "override"].map(keywordEntry);
1193+
["private", "protected", "public", "static", "sealed", "abstract", "async", "constructor", "declare", "get", "readonly", "set", "override"].map(keywordEntry);
11931194

11941195
export const classElementInJsKeywords = getInJsKeywords(classElementKeywords);
11951196

src/services/completions.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -2199,6 +2199,7 @@ namespace ts.Completions {
21992199
case SyntaxKind.TemplateMiddle:
22002200
return containingNodeKind === SyntaxKind.TemplateSpan; // `aa ${10} dd ${|
22012201

2202+
case SyntaxKind.SealedKeyword:
22022203
case SyntaxKind.PublicKeyword:
22032204
case SyntaxKind.PrivateKeyword:
22042205
case SyntaxKind.ProtectedKeyword:
@@ -2437,6 +2438,9 @@ namespace ts.Completions {
24372438
case "private":
24382439
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Private;
24392440
break;
2441+
case "sealed":
2442+
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Sealed;
2443+
break;
24402444
case "static":
24412445
classElementModifierFlags = classElementModifierFlags | ModifierFlags.Static;
24422446
break;
@@ -2450,7 +2454,7 @@ namespace ts.Completions {
24502454
}
24512455

24522456
// No member list for private methods
2453-
if (!(classElementModifierFlags & ModifierFlags.Private)) {
2457+
if (!(classElementModifierFlags & (ModifierFlags.Private | ModifierFlags.Sealed))) {
24542458
// List of property symbols of base type that are not private and already implemented
24552459
const baseTypeNodes = isClassLike(decl) && classElementModifierFlags & ModifierFlags.Override ? singleElementArray(getEffectiveBaseTypeNode(decl)) : getAllSuperTypeNodes(decl);
24562460
const baseSymbols = flatMap(baseTypeNodes, baseTypeNode => {
@@ -2725,6 +2729,7 @@ namespace ts.Completions {
27252729
case SyntaxKind.InterfaceKeyword:
27262730
case SyntaxKind.LetKeyword:
27272731
case SyntaxKind.PrivateKeyword:
2732+
case SyntaxKind.SealedKeyword:
27282733
case SyntaxKind.ProtectedKeyword:
27292734
case SyntaxKind.PublicKeyword:
27302735
case SyntaxKind.StaticKeyword:
@@ -3128,6 +3133,7 @@ namespace ts.Completions {
31283133
case SyntaxKind.PrivateKeyword:
31293134
case SyntaxKind.ProtectedKeyword:
31303135
case SyntaxKind.PublicKeyword:
3136+
case SyntaxKind.SealedKeyword:
31313137
case SyntaxKind.ReadonlyKeyword:
31323138
case SyntaxKind.StringKeyword:
31333139
case SyntaxKind.SymbolKeyword:

0 commit comments

Comments
 (0)