@@ -87,6 +87,11 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
8787 return handleShorthandObjectBindingElement ( node ) ;
8888 }
8989
90+ // 'node' in obj
91+ if ( ts . isStringLiteral ( node ) && ts . isBinaryExpression ( node . parent ) && node . parent . operatorToken . kind === ts . SyntaxKind . InKeyword ) {
92+ return handleInKeyword ( node ) ;
93+ }
94+
9095 if ( ts . isIdentifier ( node ) && node . parent ) {
9196 // obj.node
9297 if ( ts . isPropertyAccessExpression ( node . parent ) && node . parent . name === node ) {
@@ -131,6 +136,21 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
131136 return node ;
132137 }
133138
139+ function handleInKeyword ( node : ts . StringLiteral ) : ts . StringLiteral {
140+ const parent = node . parent as ts . BinaryExpression ;
141+ const nodeType = typeChecker . getTypeAtLocation ( node ) ;
142+ if ( ! nodeType . isStringLiteral ( ) ) {
143+ throw new Error ( `Can't get type for left expression in ${ node . parent . getText ( ) } ` ) ;
144+ }
145+
146+ const propertyName = nodeType . value ;
147+ if ( isTypePropertyExternal ( typeChecker . getTypeAtLocation ( parent . right ) , propertyName ) ) {
148+ return node ;
149+ }
150+
151+ return createNewNode ( propertyName , VisibilityType . Internal , ts . createStringLiteral ) ;
152+ }
153+
134154 // obj.node
135155 function handlePropertyAccessIdentifier ( node : ts . Identifier ) : ts . Identifier {
136156 return createNewIdentifier ( node ) ;
@@ -143,7 +163,7 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
143163 return node ;
144164 }
145165
146- return createNewNode ( node , visibilityType , ts . createStringLiteral ) ;
166+ return createNewNodeFromProperty ( node , visibilityType , ts . createStringLiteral ) ;
147167 }
148168
149169 // private node
@@ -169,7 +189,7 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
169189 return node ;
170190 }
171191
172- return createNewNode ( node . name , visibilityType , ( newName : string ) => {
192+ return createNewNodeFromProperty ( node . name , visibilityType , ( newName : string ) => {
173193 return ts . createPropertyAssignment ( newName , node . name ) ;
174194 } ) ;
175195 }
@@ -185,7 +205,7 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
185205 return node ;
186206 }
187207
188- return createNewNode ( node . name , visibilityType , ( newName : string ) => {
208+ return createNewNodeFromProperty ( node . name , visibilityType , ( newName : string ) => {
189209 return ts . createBindingElement ( node . dotDotDotToken , newName , node . name , node . initializer ) ;
190210 } ) ;
191211 }
@@ -203,21 +223,23 @@ function createTransformerFactory(program: ts.Program, options?: Partial<RenameO
203223 return oldIdentifier ;
204224 }
205225
206- return createNewNode ( oldIdentifier , visibilityType , ts . createIdentifier ) ;
226+ return createNewNodeFromProperty ( oldIdentifier , visibilityType , ts . createIdentifier ) ;
207227 }
208228
209- function createNewNode < T extends ts . Node > ( oldProperty : ts . PropertyName , type : VisibilityType , createNode : ( newName : string ) => T ) : T {
229+ function createNewNodeFromProperty < T extends ts . Node > ( oldProperty : ts . PropertyName , type : VisibilityType , createNode : ( newName : string ) => T ) : T {
210230 const symbol = typeChecker . getSymbolAtLocation ( oldProperty ) ;
211231 if ( symbol === undefined ) {
212232 throw new Error ( `Cannot get symbol for node "${ oldProperty . getText ( ) } "` ) ;
213233 }
214234
215235 const oldPropertyName = symbol . escapedName as string ;
216236
217- const newPropertyName = getNewName ( oldPropertyName , type ) ;
218- const newProperty = createNode ( newPropertyName ) ;
237+ return createNewNode ( oldPropertyName , type , createNode ) ;
238+ }
219239
220- return newProperty ;
240+ function createNewNode < T extends ts . Node > ( oldPropertyName : string , type : VisibilityType , createNode : ( newName : string ) => T ) : T {
241+ const newPropertyName = getNewName ( oldPropertyName , type ) ;
242+ return createNode ( newPropertyName ) ;
221243 }
222244
223245 function getNewName ( originalName : string , type : VisibilityType ) : string {
0 commit comments