@@ -41,23 +41,27 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
41
41
const fieldInfo = getConvertibleFieldAtPosition ( context ) ;
42
42
if ( ! fieldInfo ) return undefined ;
43
43
44
- const isJS = isSourceFileJS ( file ) ;
45
44
const changeTracker = textChanges . ChangeTracker . fromContext ( context ) ;
46
45
const { isStatic, isReadonly, fieldName, accessorName, originalName, type, container, declaration, renameAccessor } = fieldInfo ;
47
46
48
47
suppressLeadingAndTrailingTrivia ( fieldName ) ;
49
48
suppressLeadingAndTrailingTrivia ( declaration ) ;
50
49
suppressLeadingAndTrailingTrivia ( container ) ;
51
50
52
- const isInClassLike = isClassLike ( container ) ;
53
- // avoid Readonly modifier because it will convert to get accessor
54
- const modifierFlags = getModifierFlags ( declaration ) & ~ ModifierFlags . Readonly ;
55
- const accessorModifiers = isInClassLike
56
- ? ! modifierFlags || modifierFlags & ModifierFlags . Private
57
- ? getModifiers ( isJS , isStatic , SyntaxKind . PublicKeyword )
58
- : createNodeArray ( createModifiersFromModifierFlags ( modifierFlags ) )
59
- : undefined ;
60
- const fieldModifiers = isInClassLike ? getModifiers ( isJS , isStatic , SyntaxKind . PrivateKeyword ) : undefined ;
51
+ let accessorModifiers : ModifiersArray | undefined ;
52
+ let fieldModifiers : ModifiersArray | undefined ;
53
+ if ( isClassLike ( container ) ) {
54
+ const modifierFlags = getModifierFlags ( declaration ) ;
55
+ if ( isSourceFileJS ( file ) ) {
56
+ const modifiers = createModifiers ( modifierFlags ) ;
57
+ accessorModifiers = modifiers ;
58
+ fieldModifiers = modifiers ;
59
+ }
60
+ else {
61
+ accessorModifiers = createModifiers ( prepareModifierFlagsForAccessor ( modifierFlags ) ) ;
62
+ fieldModifiers = createModifiers ( prepareModifierFlagsForField ( modifierFlags ) ) ;
63
+ }
64
+ }
61
65
62
66
updateFieldDeclaration ( changeTracker , file , declaration , fieldName , fieldModifiers ) ;
63
67
@@ -95,21 +99,47 @@ namespace ts.refactor.generateGetAccessorAndSetAccessor {
95
99
return isParameterPropertyDeclaration ( node , node . parent ) || isPropertyDeclaration ( node ) || isPropertyAssignment ( node ) ;
96
100
}
97
101
98
- function createPropertyName ( name : string , originalName : AcceptedNameType ) {
102
+ function createPropertyName ( name : string , originalName : AcceptedNameType ) {
99
103
return isIdentifier ( originalName ) ? createIdentifier ( name ) : createLiteral ( name ) ;
100
104
}
101
105
102
- function createAccessorAccessExpression ( fieldName : AcceptedNameType , isStatic : boolean , container : ContainerDeclaration ) {
106
+ function createAccessorAccessExpression ( fieldName : AcceptedNameType , isStatic : boolean , container : ContainerDeclaration ) {
103
107
const leftHead = isStatic ? ( < ClassLikeDeclaration > container ) . name ! : createThis ( ) ; // TODO: GH#18217
104
108
return isIdentifier ( fieldName ) ? createPropertyAccess ( leftHead , fieldName ) : createElementAccess ( leftHead , createLiteral ( fieldName ) ) ;
105
109
}
106
110
107
- function getModifiers ( isJS : boolean , isStatic : boolean , accessModifier : SyntaxKind . PublicKeyword | SyntaxKind . PrivateKeyword ) : NodeArray < Modifier > | undefined {
108
- const modifiers = append < Modifier > (
109
- ! isJS ? [ createToken ( accessModifier ) as Token < SyntaxKind . PublicKeyword > | Token < SyntaxKind . PrivateKeyword > ] : undefined ,
110
- isStatic ? createToken ( SyntaxKind . StaticKeyword ) : undefined
111
- ) ;
112
- return modifiers && createNodeArray ( modifiers ) ;
111
+ function createModifiers ( modifierFlags : ModifierFlags ) : ModifiersArray | undefined {
112
+ return modifierFlags ? createNodeArray ( createModifiersFromModifierFlags ( modifierFlags ) ) : undefined ;
113
+ }
114
+
115
+ function prepareModifierFlagsForAccessor ( modifierFlags : ModifierFlags ) : ModifierFlags {
116
+ // avoid Readonly modifier because it will convert to get accessor
117
+ if ( modifierFlags & ModifierFlags . Readonly ) {
118
+ modifierFlags &= ~ ModifierFlags . Readonly ;
119
+ }
120
+
121
+ if ( modifierFlags & ModifierFlags . Private ) {
122
+ modifierFlags &= ~ ModifierFlags . Private ;
123
+ }
124
+
125
+ if ( ! ( modifierFlags & ModifierFlags . Protected ) ) {
126
+ modifierFlags |= ModifierFlags . Public ;
127
+ }
128
+
129
+ return modifierFlags ;
130
+ }
131
+
132
+ function prepareModifierFlagsForField ( modifierFlags : ModifierFlags ) : ModifierFlags {
133
+ if ( modifierFlags & ModifierFlags . Public ) {
134
+ modifierFlags &= ~ ModifierFlags . Public ;
135
+ }
136
+
137
+ if ( modifierFlags & ModifierFlags . Protected ) {
138
+ modifierFlags &= ~ ModifierFlags . Protected ;
139
+ }
140
+
141
+ modifierFlags |= ModifierFlags . Private ;
142
+ return modifierFlags ;
113
143
}
114
144
115
145
function startsWithUnderscore ( name : string ) : boolean {
0 commit comments