style(ngcc): post-merge review tidy up (#37461)
This commit tidies up a few of the code comments from a recent commit to help improve the clarity of the algorithm. PR Close #37461
This commit is contained in:
parent
d63ecf4c5f
commit
5e64c2b1df
|
@ -21,6 +21,22 @@ export class EsmDependencyHost extends DependencyHostBase {
|
||||||
return !hasImportOrReexportStatements(fileContents);
|
return !hasImportOrReexportStatements(fileContents);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract any import paths from imports found in the contents of this file.
|
||||||
|
*
|
||||||
|
* This implementation uses the TypeScript scanner, which tokenizes source code,
|
||||||
|
* to process the string. This is halfway between working with the string directly,
|
||||||
|
* which is too difficult due to corner cases, and parsing the string into a full
|
||||||
|
* TypeScript Abstract Syntax Tree (AST), which ends up doing more processing than
|
||||||
|
* is needed.
|
||||||
|
*
|
||||||
|
* The scanning is not trivial because we must hold state between each token since
|
||||||
|
* the context of the token affects how it should be scanned, and the scanner does
|
||||||
|
* not manage this for us.
|
||||||
|
*
|
||||||
|
* Specifically, backticked strings are particularly challenging since it is possible
|
||||||
|
* to recursively nest backticks and TypeScript expressions within each other.
|
||||||
|
*/
|
||||||
protected extractImports(file: AbsoluteFsPath, fileContents: string): Set<string> {
|
protected extractImports(file: AbsoluteFsPath, fileContents: string): Set<string> {
|
||||||
const imports = new Set<string>();
|
const imports = new Set<string>();
|
||||||
const templateStack: ts.SyntaxKind[] = [];
|
const templateStack: ts.SyntaxKind[] = [];
|
||||||
|
@ -32,22 +48,36 @@ export class EsmDependencyHost extends DependencyHostBase {
|
||||||
while ((currentToken = this.scanner.scan()) !== ts.SyntaxKind.EndOfFileToken) {
|
while ((currentToken = this.scanner.scan()) !== ts.SyntaxKind.EndOfFileToken) {
|
||||||
switch (currentToken) {
|
switch (currentToken) {
|
||||||
case ts.SyntaxKind.TemplateHead:
|
case ts.SyntaxKind.TemplateHead:
|
||||||
|
// TemplateHead indicates the beginning of a backticked string
|
||||||
|
// Capture this in the `templateStack` to indicate we are currently processing
|
||||||
|
// within the static text part of a backticked string.
|
||||||
templateStack.push(currentToken);
|
templateStack.push(currentToken);
|
||||||
break;
|
break;
|
||||||
case ts.SyntaxKind.OpenBraceToken:
|
case ts.SyntaxKind.OpenBraceToken:
|
||||||
if (templateStack.length > 0) {
|
if (templateStack.length > 0) {
|
||||||
|
// We are processing a backticked string. This indicates that we are either
|
||||||
|
// entering an interpolation expression or entering an object literal expression.
|
||||||
|
// We add it to the `templateStack` so we can track when we leave the interpolation or
|
||||||
|
// object literal.
|
||||||
templateStack.push(currentToken);
|
templateStack.push(currentToken);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ts.SyntaxKind.CloseBraceToken:
|
case ts.SyntaxKind.CloseBraceToken:
|
||||||
if (templateStack.length > 0) {
|
if (templateStack.length > 0) {
|
||||||
|
// We are processing a backticked string then this indicates that we are either
|
||||||
|
// leaving an interpolation expression or leaving an object literal expression.
|
||||||
const templateToken = templateStack[templateStack.length - 1];
|
const templateToken = templateStack[templateStack.length - 1];
|
||||||
if (templateToken === ts.SyntaxKind.TemplateHead) {
|
if (templateToken === ts.SyntaxKind.TemplateHead) {
|
||||||
|
// We have hit a nested backticked string so we need to rescan it in that context
|
||||||
currentToken = this.scanner.reScanTemplateToken(/* isTaggedTemplate */ false);
|
currentToken = this.scanner.reScanTemplateToken(/* isTaggedTemplate */ false);
|
||||||
if (currentToken === ts.SyntaxKind.TemplateTail) {
|
if (currentToken === ts.SyntaxKind.TemplateTail) {
|
||||||
|
// We got to the end of the backticked string so pop the token that started it off
|
||||||
|
// the stack.
|
||||||
templateStack.pop();
|
templateStack.pop();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// We hit the end of an object-literal expression so pop the open-brace that started
|
||||||
|
// it off the stack.
|
||||||
templateStack.pop();
|
templateStack.pop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,6 +85,8 @@ export class EsmDependencyHost extends DependencyHostBase {
|
||||||
case ts.SyntaxKind.SlashToken:
|
case ts.SyntaxKind.SlashToken:
|
||||||
case ts.SyntaxKind.SlashEqualsToken:
|
case ts.SyntaxKind.SlashEqualsToken:
|
||||||
if (canPrecedeARegex(lastToken)) {
|
if (canPrecedeARegex(lastToken)) {
|
||||||
|
// We have hit a slash (`/`) in a context where it could be the start of a regular
|
||||||
|
// expression so rescan it in that context
|
||||||
currentToken = this.scanner.reScanSlashToken();
|
currentToken = this.scanner.reScanSlashToken();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -74,7 +106,8 @@ export class EsmDependencyHost extends DependencyHostBase {
|
||||||
lastToken = currentToken;
|
lastToken = currentToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear the text from the scanner.
|
// Clear the text from the scanner to avoid holding on to potentially large strings of source
|
||||||
|
// content after the scanning has completed.
|
||||||
this.scanner.setText('');
|
this.scanner.setText('');
|
||||||
|
|
||||||
return imports;
|
return imports;
|
||||||
|
|
|
@ -24,7 +24,7 @@ import {getBasePaths} from './utils';
|
||||||
* This is faster than searching the entire file-system for all the entry-points,
|
* This is faster than searching the entire file-system for all the entry-points,
|
||||||
* and is used primarily by the CLI integration.
|
* and is used primarily by the CLI integration.
|
||||||
*
|
*
|
||||||
* There are two concrete implementation of this class.
|
* There are two concrete implementations of this class.
|
||||||
*
|
*
|
||||||
* * `TargetEntryPointFinder` - is given a single entry-point as the initial entry-point
|
* * `TargetEntryPointFinder` - is given a single entry-point as the initial entry-point
|
||||||
* * `ProgramBasedEntryPointFinder` - computes the initial entry-points from program files given by
|
* * `ProgramBasedEntryPointFinder` - computes the initial entry-points from program files given by
|
||||||
|
|
Loading…
Reference in New Issue