@@ -16,7 +16,7 @@ import {getAngularDecorators} from '../../utils/ng_decorators';
1616import { closestNode } from '../../utils/typescript/nodes' ;
1717
1818import { convertNgModuleDeclarationToStandalone , extractDeclarationsFromModule , findTestObjectsToMigrate , migrateTestDeclarations } from './to-standalone' ;
19- import { ChangeTracker , createLanguageService , findClassDeclaration , findLiteralProperty , getNodeLookup , getRelativeImportPath , ImportRemapper , NamedClassDeclaration , NodeLookup , offsetsToNodes , UniqueItemTracker } from './util' ;
19+ import { ChangeTracker , findClassDeclaration , findLiteralProperty , getNodeLookup , getRelativeImportPath , ImportRemapper , NamedClassDeclaration , NodeLookup , offsetsToNodes , ReferenceResolver , UniqueItemTracker } from './util' ;
2020
2121/** Information extracted from a `bootstrapModule` call necessary to migrate it. */
2222interface BootstrapCallAnalysis {
@@ -34,11 +34,13 @@ interface BootstrapCallAnalysis {
3434
3535export function toStandaloneBootstrap (
3636 program : NgtscProgram , host : ts . CompilerHost , basePath : string , rootFileNames : string [ ] ,
37- sourceFiles : ts . SourceFile [ ] , printer : ts . Printer , importRemapper ?: ImportRemapper ) {
37+ sourceFiles : ts . SourceFile [ ] , printer : ts . Printer , importRemapper ?: ImportRemapper ,
38+ referenceLookupExcludedFiles ?: RegExp ) {
3839 const tracker = new ChangeTracker ( printer , importRemapper ) ;
3940 const typeChecker = program . getTsProgram ( ) . getTypeChecker ( ) ;
4041 const templateTypeChecker = program . compiler . getTemplateTypeChecker ( ) ;
41- const languageService = createLanguageService ( program , host , rootFileNames , basePath ) ;
42+ const referenceResolver =
43+ new ReferenceResolver ( program , host , rootFileNames , basePath , referenceLookupExcludedFiles ) ;
4244 const bootstrapCalls : BootstrapCallAnalysis [ ] = [ ] ;
4345 const testObjects : ts . ObjectLiteralExpression [ ] = [ ] ;
4446 const allDeclarations : Reference < ts . ClassDeclaration > [ ] = [ ] ;
@@ -62,7 +64,7 @@ export function toStandaloneBootstrap(
6264
6365 for ( const call of bootstrapCalls ) {
6466 allDeclarations . push ( ...call . declarations ) ;
65- migrateBootstrapCall ( call , tracker , languageService , typeChecker , printer ) ;
67+ migrateBootstrapCall ( call , tracker , referenceResolver , typeChecker , printer ) ;
6668 }
6769
6870 // The previous migrations explicitly skip over bootstrapped
@@ -133,12 +135,12 @@ function analyzeBootstrapCall(
133135 * Converts a `bootstrapModule` call to `bootstrapApplication`.
134136 * @param analysis Analysis result of the call.
135137 * @param tracker Tracker in which to register the changes.
136- * @param languageService
138+ * @param referenceResolver
137139 * @param typeChecker
138140 * @param printer
139141 */
140142function migrateBootstrapCall (
141- analysis : BootstrapCallAnalysis , tracker : ChangeTracker , languageService : ts . LanguageService ,
143+ analysis : BootstrapCallAnalysis , tracker : ChangeTracker , referenceResolver : ReferenceResolver ,
142144 typeChecker : ts . TypeChecker , printer : ts . Printer ) {
143145 const sourceFile = analysis . call . getSourceFile ( ) ;
144146 const moduleSourceFile = analysis . metadata . getSourceFile ( ) ;
@@ -168,14 +170,14 @@ function migrateBootstrapCall(
168170 providersInNewCall . push ( ts . factory . createSpreadElement ( providers . initializer ) ) ;
169171 }
170172
171- addNodesToCopy ( sourceFile , providers , nodeLookup , tracker , nodesToCopy , languageService ) ;
173+ addNodesToCopy ( sourceFile , providers , nodeLookup , tracker , nodesToCopy , referenceResolver ) ;
172174 }
173175
174176 if ( imports && ts . isPropertyAssignment ( imports ) ) {
175177 nodeLookup = nodeLookup || getNodeLookup ( moduleSourceFile ) ;
176178 migrateImportsForBootstrapCall (
177179 sourceFile , imports , nodeLookup , moduleImportsInNewCall , providersInNewCall , tracker ,
178- nodesToCopy , languageService , typeChecker ) ;
180+ nodesToCopy , referenceResolver , typeChecker ) ;
179181 }
180182
181183 if ( nodesToCopy . size > 0 ) {
@@ -253,13 +255,13 @@ function replaceBootstrapCallExpression(
253255 * @param providersInNewCall Array keeping track of the providers in the new call.
254256 * @param tracker Tracker in which changes to files are being stored.
255257 * @param nodesToCopy Nodes that should be copied to the new file.
256- * @param languageService
258+ * @param referenceResolver
257259 * @param typeChecker
258260 */
259261function migrateImportsForBootstrapCall (
260262 sourceFile : ts . SourceFile , imports : ts . PropertyAssignment , nodeLookup : NodeLookup ,
261263 importsForNewCall : ts . Expression [ ] , providersInNewCall : ts . Expression [ ] , tracker : ChangeTracker ,
262- nodesToCopy : Set < ts . Node > , languageService : ts . LanguageService ,
264+ nodesToCopy : Set < ts . Node > , referenceResolver : ReferenceResolver ,
263265 typeChecker : ts . TypeChecker ) : void {
264266 if ( ! ts . isArrayLiteralExpression ( imports . initializer ) ) {
265267 importsForNewCall . push ( imports . initializer ) ;
@@ -282,9 +284,9 @@ function migrateImportsForBootstrapCall(
282284 tracker . addImport ( sourceFile , 'provideRouter' , '@angular/router' ) , [ ] ,
283285 [ element . arguments [ 0 ] , ...features ] ) ) ;
284286 addNodesToCopy (
285- sourceFile , element . arguments [ 0 ] , nodeLookup , tracker , nodesToCopy , languageService ) ;
287+ sourceFile , element . arguments [ 0 ] , nodeLookup , tracker , nodesToCopy , referenceResolver ) ;
286288 if ( options ) {
287- addNodesToCopy ( sourceFile , options , nodeLookup , tracker , nodesToCopy , languageService ) ;
289+ addNodesToCopy ( sourceFile , options , nodeLookup , tracker , nodesToCopy , referenceResolver ) ;
288290 }
289291 continue ;
290292 }
@@ -326,7 +328,7 @@ function migrateImportsForBootstrapCall(
326328 decorators . every (
327329 ( { name} ) => name !== 'Directive' && name !== 'Component' && name !== 'Pipe' ) ) {
328330 importsForNewCall . push ( element ) ;
329- addNodesToCopy ( sourceFile , element , nodeLookup , tracker , nodesToCopy , languageService ) ;
331+ addNodesToCopy ( sourceFile , element , nodeLookup , tracker , nodesToCopy , referenceResolver ) ;
330332 }
331333 }
332334}
@@ -444,12 +446,12 @@ function getRouterModuleForRootFeatures(
444446 * @param nodeLookup Map used to look up nodes based on their positions in a file.
445447 * @param tracker Tracker in which changes to files are stored.
446448 * @param nodesToCopy Set that keeps track of the nodes being copied.
447- * @param languageService
449+ * @param referenceResolver
448450 */
449451function addNodesToCopy (
450452 targetFile : ts . SourceFile , rootNode : ts . Node , nodeLookup : NodeLookup , tracker : ChangeTracker ,
451- nodesToCopy : Set < ts . Node > , languageService : ts . LanguageService ) : void {
452- const refs = findAllSameFileReferences ( rootNode , nodeLookup , languageService ) ;
453+ nodesToCopy : Set < ts . Node > , referenceResolver : ReferenceResolver ) : void {
454+ const refs = findAllSameFileReferences ( rootNode , nodeLookup , referenceResolver ) ;
453455
454456 for ( const ref of refs ) {
455457 const importSpecifier = closestOrSelf ( ref , ts . isImportSpecifier ) ;
@@ -504,10 +506,10 @@ function addNodesToCopy(
504506 * Finds all the nodes referenced within the root node in the same file.
505507 * @param rootNode Node from which to start looking for references.
506508 * @param nodeLookup Map used to look up nodes based on their positions in a file.
507- * @param languageService
509+ * @param referenceResolver
508510 */
509511function findAllSameFileReferences (
510- rootNode : ts . Node , nodeLookup : NodeLookup , languageService : ts . LanguageService ) : Set < ts . Node > {
512+ rootNode : ts . Node , nodeLookup : NodeLookup , referenceResolver : ReferenceResolver ) : Set < ts . Node > {
511513 const results = new Set < ts . Node > ( ) ;
512514 const excludeStart = rootNode . getStart ( ) ;
513515 const excludeEnd = rootNode . getEnd ( ) ;
@@ -518,8 +520,8 @@ function findAllSameFileReferences(
518520 return ;
519521 }
520522
521- const refs =
522- referencesToNodeWithinSameFile ( node , nodeLookup , excludeStart , excludeEnd , languageService ) ;
523+ const refs = referencesToNodeWithinSameFile (
524+ node , nodeLookup , excludeStart , excludeEnd , referenceResolver ) ;
523525
524526 if ( refs === null ) {
525527 return ;
@@ -551,38 +553,20 @@ function findAllSameFileReferences(
551553 * @param nodeLookup Map used to look up nodes based on their positions in a file.
552554 * @param excludeStart Start of a range that should be excluded from the results.
553555 * @param excludeEnd End of a range that should be excluded from the results.
554- * @param languageService
556+ * @param referenceResolver
555557 */
556558function referencesToNodeWithinSameFile (
557559 node : ts . Identifier , nodeLookup : NodeLookup , excludeStart : number , excludeEnd : number ,
558- languageService : ts . LanguageService ) : Set < ts . Node > | null {
559- const sourceFile = node . getSourceFile ( ) ;
560- const fileName = sourceFile . fileName ;
561- const highlights = languageService . getDocumentHighlights ( fileName , node . getStart ( ) , [ fileName ] ) ;
562-
563- if ( highlights ) {
564- const offsets : [ start : number , end : number ] [ ] = [ ] ;
565-
566- for ( const file of highlights ) {
567- // We are pretty much guaranteed to only have one match from the current file since it is
568- // the only one being passed in `getDocumentHighlight`, but we check here just in case.
569- if ( file . fileName === fileName ) {
570- for ( const { textSpan : { start, length} , kind} of file . highlightSpans ) {
571- const end = start + length ;
572- if ( kind !== ts . HighlightSpanKind . none &&
573- isOutsideRange ( excludeStart , excludeEnd , start , end ) ) {
574- offsets . push ( [ start , end ] ) ;
575- }
576- }
577- }
578- }
560+ referenceResolver : ReferenceResolver ) : Set < ts . Node > | null {
561+ const offsets =
562+ referenceResolver . findSameFileReferences ( node , node . getSourceFile ( ) . fileName )
563+ . filter ( ( [ start , end ] ) => isOutsideRange ( excludeStart , excludeEnd , start , end ) ) ;
579564
580- if ( offsets . length > 0 ) {
581- const nodes = offsetsToNodes ( nodeLookup , offsets , new Set ( ) ) ;
565+ if ( offsets . length > 0 ) {
566+ const nodes = offsetsToNodes ( nodeLookup , offsets , new Set ( ) ) ;
582567
583- if ( nodes . size > 0 ) {
584- return nodes ;
585- }
568+ if ( nodes . size > 0 ) {
569+ return nodes ;
586570 }
587571 }
588572
0 commit comments