Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9a9624b

Browse files
committed
Additional tests and language service fixes
1 parent 54024cf commit 9a9624b

17 files changed

+1522
-37
lines changed

package-lock.json

+15-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/compiler/checker.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -8922,7 +8922,7 @@ namespace ts {
89228922
return getTypeForBindingElement(declaration as BindingElement);
89238923
}
89248924

8925-
const isProperty = isPropertyDeclaration(declaration) || isPropertySignature(declaration);
8925+
const isProperty = isPropertyDeclaration(declaration) && !hasAccessorModifier(declaration) || isPropertySignature(declaration);
89268926
const isOptional = includeOptionality && (
89278927
isProperty && !!declaration.questionToken ||
89288928
isParameter(declaration) && (!!declaration.questionToken || isJSDocOptionalParameter(declaration)) ||
@@ -12774,7 +12774,7 @@ namespace ts {
1277412774
}
1277512775

1277612776
function isOptionalPropertyDeclaration(node: Declaration) {
12777-
return isPropertyDeclaration(node) && node.questionToken;
12777+
return isPropertyDeclaration(node) && !hasAccessorModifier(node) && node.questionToken;
1277812778
}
1277912779

1278012780
function isOptionalJSDocPropertyLikeTag(node: Node): node is JSDocPropertyLikeTag {
@@ -45152,9 +45152,12 @@ namespace ts {
4515245152
if (languageVersion < ScriptTarget.ES2015 && isPrivateIdentifier(node.name)) {
4515345153
return grammarErrorOnNode(node.name, Diagnostics.Private_identifiers_are_only_available_when_targeting_ECMAScript_2015_and_higher);
4515445154
}
45155-
if (languageVersion < ScriptTarget.ES2015 && hasAccessorModifier(node)) {
45155+
if (languageVersion < ScriptTarget.ES2015 && isAutoAccessorPropertyDeclaration(node)) {
4515645156
return grammarErrorOnNode(node.name, Diagnostics.Properties_with_the_accessor_modifier_are_only_available_when_targeting_ECMAScript_2015_and_higher);
4515745157
}
45158+
if (isAutoAccessorPropertyDeclaration(node) && checkGrammarForInvalidQuestionMark(node.questionToken, Diagnostics.An_accessor_property_cannot_be_declared_optional)) {
45159+
return true;
45160+
}
4515845161
}
4515945162
else if (node.parent.kind === SyntaxKind.InterfaceDeclaration) {
4516045163
if (checkGrammarForInvalidDynamicName(node.name, Diagnostics.A_computed_property_name_in_an_interface_must_refer_to_an_expression_whose_type_is_a_literal_type_or_a_unique_symbol_type)) {

src/compiler/diagnosticMessages.json

+4
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,10 @@
903903
"category": "Error",
904904
"code": 1275
905905
},
906+
"An 'accessor' property cannot be declared optional.": {
907+
"category": "Error",
908+
"code": 1276
909+
},
906910

907911
"'with' statements are not allowed in an async function block.": {
908912
"category": "Error",

src/compiler/factory/nodeFactory.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1100,10 +1100,10 @@ namespace ts {
11001100
if (flags & ModifierFlags.Private) result.push(createModifier(SyntaxKind.PrivateKeyword));
11011101
if (flags & ModifierFlags.Protected) result.push(createModifier(SyntaxKind.ProtectedKeyword));
11021102
if (flags & ModifierFlags.Abstract) result.push(createModifier(SyntaxKind.AbstractKeyword));
1103-
if (flags & ModifierFlags.Accessor) result.push(createModifier(SyntaxKind.AccessorKeyword));
11041103
if (flags & ModifierFlags.Static) result.push(createModifier(SyntaxKind.StaticKeyword));
11051104
if (flags & ModifierFlags.Override) result.push(createModifier(SyntaxKind.OverrideKeyword));
11061105
if (flags & ModifierFlags.Readonly) result.push(createModifier(SyntaxKind.ReadonlyKeyword));
1106+
if (flags & ModifierFlags.Accessor) result.push(createModifier(SyntaxKind.AccessorKeyword));
11071107
if (flags & ModifierFlags.Async) result.push(createModifier(SyntaxKind.AsyncKeyword));
11081108
if (flags & ModifierFlags.In) result.push(createModifier(SyntaxKind.InKeyword));
11091109
if (flags & ModifierFlags.Out) result.push(createModifier(SyntaxKind.OutKeyword));

src/services/codefixes/helpers.ts

+9-12
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,15 @@ namespace ts.codefix {
6767
const scriptTarget = getEmitScriptTarget(context.program.getCompilerOptions());
6868
const declaration = declarations[0];
6969
const name = getSynthesizedDeepClone(getNameOfDeclaration(declaration), /*includeTrivia*/ false) as PropertyName;
70-
const visibilityModifier = createVisibilityModifier(getEffectiveModifierFlags(declaration));
71-
const modifiers = visibilityModifier ? factory.createNodeArray([visibilityModifier]) : undefined;
70+
const effectiveModifierFlags = getEffectiveModifierFlags(declaration);
71+
let modifierFlags =
72+
effectiveModifierFlags & ModifierFlags.Public ? ModifierFlags.Public :
73+
effectiveModifierFlags & ModifierFlags.Protected ? ModifierFlags.Protected :
74+
ModifierFlags.None;
75+
if (isAutoAccessorPropertyDeclaration(declaration)) {
76+
modifierFlags |= ModifierFlags.Accessor;
77+
}
78+
const modifiers = modifierFlags ? factory.createNodeArray(factory.createModifiersFromModifierFlags(modifierFlags)) : undefined;
7279
const type = checker.getWidenedType(checker.getTypeOfSymbolAtLocation(symbol, enclosingDeclaration));
7380
const optional = !!(symbol.flags & SymbolFlags.Optional);
7481
const ambient = !!(enclosingDeclaration.flags & NodeFlags.Ambient) || isAmbient;
@@ -473,16 +480,6 @@ namespace ts.codefix {
473480
/*multiline*/ true);
474481
}
475482

476-
function createVisibilityModifier(flags: ModifierFlags): Modifier | undefined {
477-
if (flags & ModifierFlags.Public) {
478-
return factory.createToken(SyntaxKind.PublicKeyword);
479-
}
480-
else if (flags & ModifierFlags.Protected) {
481-
return factory.createToken(SyntaxKind.ProtectedKeyword);
482-
}
483-
return undefined;
484-
}
485-
486483
export function setJsonCompilerOptionValues(
487484
changeTracker: textChanges.ChangeTracker,
488485
configFile: TsConfigSourceFile,

src/services/symbolDisplay.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ namespace ts.SymbolDisplay {
158158
if (symbolKind !== ScriptElementKind.unknown || symbolFlags & SymbolFlags.Class || symbolFlags & SymbolFlags.Alias) {
159159
// If symbol is accessor, they are allowed only if location is at declaration identifier of the accessor
160160
if (symbolKind === ScriptElementKind.memberGetAccessorElement || symbolKind === ScriptElementKind.memberSetAccessorElement) {
161-
const declaration = find(symbol.declarations as ((GetAccessorDeclaration | SetAccessorDeclaration)[]), declaration => declaration.name === location);
161+
const declaration = find(symbol.declarations as ((GetAccessorDeclaration | SetAccessorDeclaration | PropertyDeclaration)[]), declaration => declaration.name === location);
162162
if (declaration) {
163163
switch(declaration.kind){
164164
case SyntaxKind.GetAccessor:
@@ -167,6 +167,9 @@ namespace ts.SymbolDisplay {
167167
case SyntaxKind.SetAccessor:
168168
symbolKind = ScriptElementKind.memberSetAccessorElement;
169169
break;
170+
case SyntaxKind.PropertyDeclaration:
171+
symbolKind = ScriptElementKind.memberAccessorVariableElement;
172+
break;
170173
default:
171174
Debug.assertNever(declaration);
172175
}
@@ -509,6 +512,7 @@ namespace ts.SymbolDisplay {
509512

510513
// For properties, variables and local vars: show the type
511514
if (symbolKind === ScriptElementKind.memberVariableElement ||
515+
symbolKind === ScriptElementKind.memberAccessorVariableElement ||
512516
symbolKind === ScriptElementKind.memberGetAccessorElement ||
513517
symbolKind === ScriptElementKind.memberSetAccessorElement ||
514518
symbolKind === ScriptElementKind.jsxAttribute ||

src/services/types.ts

+3
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,9 @@ namespace ts {
14611461
*/
14621462
memberVariableElement = "property",
14631463

1464+
/** class X { [public|private]* accessor foo: number; } */
1465+
memberAccessorVariableElement = "accessor",
1466+
14641467
/**
14651468
* class X { constructor() { } }
14661469
* class X { static { } }

tests/baselines/reference/accessorFieldAllowedModifiers.js

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ abstract class C1 {
1313
accessor "k": any;
1414
accessor 108: any;
1515
accessor ["m"]: any;
16+
accessor n!: number;
1617
}
1718

1819
class C2 extends C1 {
@@ -40,6 +41,7 @@ class C1 {
4041
accessor "k";
4142
accessor 108;
4243
accessor ["m"];
44+
accessor n;
4345
}
4446
class C2 extends C1 {
4547
accessor e;

tests/baselines/reference/accessorFieldDisallowedModifiers.errors.txt

+9-5
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallow
1010
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(11,5): error TS1275: 'accessor' modifier can only appear on a property declaration.
1111
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(12,5): error TS1275: 'accessor' modifier can only appear on a property declaration.
1212
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(13,5): error TS1275: 'accessor' modifier can only appear on a property declaration.
13-
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(17,14): error TS1029: 'override' modifier must precede 'accessor' modifier.
14-
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(21,5): error TS1070: 'accessor' modifier cannot appear on a type member.
15-
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(24,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
13+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(14,15): error TS1276: An 'accessor' property cannot be declared optional.
14+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(18,14): error TS1029: 'override' modifier must precede 'accessor' modifier.
15+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(22,5): error TS1070: 'accessor' modifier cannot appear on a type member.
1616
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(25,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
1717
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(26,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
1818
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(27,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
@@ -21,13 +21,14 @@ tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallow
2121
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(30,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
2222
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(31,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
2323
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(32,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
24-
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(32,25): error TS2792: Cannot find module 'x'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?
2524
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(33,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
25+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(33,25): error TS2792: Cannot find module 'x'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option?
2626
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(34,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
2727
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(35,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
28+
tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts(36,1): error TS1275: 'accessor' modifier can only appear on a property declaration.
2829

2930

30-
==== tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts (27 errors) ====
31+
==== tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallowedModifiers.ts (28 errors) ====
3132
abstract class C1 {
3233
accessor accessor a: any;
3334
~~~~~~~~
@@ -65,6 +66,9 @@ tests/cases/conformance/classes/propertyMemberDeclarations/accessorFieldDisallow
6566
accessor constructor() {}
6667
~~~~~~~~
6768
!!! error TS1275: 'accessor' modifier can only appear on a property declaration.
69+
accessor l?: any;
70+
~
71+
!!! error TS1276: An 'accessor' property cannot be declared optional.
6872
}
6973

7074
class C2 extends C1 {

tests/baselines/reference/accessorFieldDisallowedModifiers.js

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ abstract class C1 {
1212
accessor get j() { return false; }
1313
accessor set k(v: any) {}
1414
accessor constructor() {}
15+
accessor l?: any;
1516
}
1617

1718
class C2 extends C1 {
@@ -48,6 +49,7 @@ class C1 {
4849
accessor get j() { return false; }
4950
accessor set k(v) { }
5051
constructor() { }
52+
accessor l;
5153
}
5254
class C2 extends C1 {
5355
accessor g;

tests/baselines/reference/api/tsserverlibrary.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6729,6 +6729,8 @@ declare namespace ts {
67296729
* interface Y { foo:number; }
67306730
*/
67316731
memberVariableElement = "property",
6732+
/** class X { [public|private]* accessor foo: number; } */
6733+
memberAccessorVariableElement = "accessor",
67326734
/**
67336735
* class X { constructor() { } }
67346736
* class X { static { } }

tests/baselines/reference/api/typescript.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6729,6 +6729,8 @@ declare namespace ts {
67296729
* interface Y { foo:number; }
67306730
*/
67316731
memberVariableElement = "property",
6732+
/** class X { [public|private]* accessor foo: number; } */
6733+
memberAccessorVariableElement = "accessor",
67326734
/**
67336735
* class X { constructor() { } }
67346736
* class X { static { } }

0 commit comments

Comments
 (0)