40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
|
/**
|
||
|
* @license
|
||
|
* Copyright Google LLC All Rights Reserved.
|
||
|
*
|
||
|
* Use of this source code is governed by an MIT-style license that can be
|
||
|
* found in the LICENSE file at https://angular.io/license
|
||
|
*/
|
||
|
|
||
|
import * as ts from 'typescript';
|
||
|
import {isNullCheck, isSafeAccess} from '../../utils/typescript/nodes';
|
||
|
import {hasOneOfTypes, isNullableType} from '../../utils/typescript/symbol';
|
||
|
|
||
|
/**
|
||
|
* Finds all the accesses of `ActivatedRouteSnapshot.fragment`
|
||
|
* that need to be migrated within a particular file.
|
||
|
*/
|
||
|
export function findFragmentAccesses(
|
||
|
typeChecker: ts.TypeChecker, sourceFile: ts.SourceFile): Set<ts.PropertyAccessExpression> {
|
||
|
const results = new Set<ts.PropertyAccessExpression>();
|
||
|
|
||
|
sourceFile.forEachChild(function walk(node: ts.Node) {
|
||
|
if (ts.isPropertyAccessExpression(node) && node.name.text === 'fragment' &&
|
||
|
!results.has(node) && !isNullCheck(node) && !isSafeAccess(node) &&
|
||
|
hasOneOfTypes(typeChecker, node.expression, ['ActivatedRouteSnapshot']) &&
|
||
|
isNullableType(typeChecker, node)) {
|
||
|
results.add(node);
|
||
|
}
|
||
|
|
||
|
node.forEachChild(walk);
|
||
|
});
|
||
|
|
||
|
return results;
|
||
|
}
|
||
|
|
||
|
/** Migrates an `ActivatedRouteSnapshot.fragment` access. */
|
||
|
export function migrateActivatedRouteSnapshotFragment(node: ts.PropertyAccessExpression): ts.Node {
|
||
|
// Turns `foo.fragment` into `foo.fragment!`.
|
||
|
return ts.createNonNullExpression(node);
|
||
|
}
|