Skip to content

Commit f476e84

Browse files
Separate our usages of utilities that expect variables initialized to require(...) and require(...).foo.
1 parent d954948 commit f476e84

File tree

7 files changed

+27
-9
lines changed

7 files changed

+27
-9
lines changed

src/compiler/binder.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,15 +3274,15 @@ namespace ts {
32743274
return isEnumConst(node)
32753275
? bindBlockScopedDeclaration(node, SymbolFlags.ConstEnum, SymbolFlags.ConstEnumExcludes)
32763276
: bindBlockScopedDeclaration(node, SymbolFlags.RegularEnum, SymbolFlags.RegularEnumExcludes);
3277-
}
3277+
}
32783278

32793279
function bindVariableDeclarationOrBindingElement(node: VariableDeclaration | BindingElement) {
32803280
if (inStrictMode) {
32813281
checkStrictModeEvalOrArguments(node, node.name);
32823282
}
32833283

32843284
if (!isBindingPattern(node.name)) {
3285-
if (isInJSFile(node) && isRequireVariableDeclaration(node) && !getJSDocTypeTag(node)) {
3285+
if (isInJSFile(node) && isAccessedOrBareRequireVariableDeclaration(node) && !getJSDocTypeTag(node)) {
32863286
declareSymbolAndAddToSymbolTable(node as Declaration, SymbolFlags.Alias, SymbolFlags.AliasExcludes);
32873287
}
32883288
else if (isBlockOrCatchScoped(node)) {

src/compiler/checker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2596,7 +2596,7 @@ namespace ts {
25962596
&& isAliasableOrJsExpression(node.parent.right)
25972597
|| node.kind === SyntaxKind.ShorthandPropertyAssignment
25982598
|| node.kind === SyntaxKind.PropertyAssignment && isAliasableOrJsExpression((node as PropertyAssignment).initializer)
2599-
|| isRequireVariableDeclaration(node);
2599+
|| isAccessedOrBareRequireVariableDeclaration(node);
26002600
}
26012601

26022602
function isAliasableOrJsExpression(e: Expression) {
@@ -36984,7 +36984,7 @@ namespace ts {
3698436984
}
3698536985
// For a commonjs `const x = require`, validate the alias and exit
3698636986
const symbol = getSymbolOfNode(node);
36987-
if (symbol.flags & SymbolFlags.Alias && isRequireVariableDeclaration(node)) {
36987+
if (symbol.flags & SymbolFlags.Alias && isAccessedOrBareRequireVariableDeclaration(node)) {
3698836988
checkAliasSymbol(node);
3698936989
return;
3699036990
}

src/compiler/types.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4668,6 +4668,11 @@ namespace ts {
46684668
readonly initializer: RequireOrImportCall;
46694669
}
46704670

4671+
/* @internal */
4672+
export interface AccessedOrBareRequireVariableDeclaration extends VariableDeclaration {
4673+
readonly initializer: RequireOrImportCall | AccessExpression;
4674+
}
4675+
46714676
/* @internal */
46724677
export interface RequireVariableStatement extends VariableStatement {
46734678
readonly declarationList: RequireVariableDeclarationList;

src/compiler/utilities.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2046,7 +2046,7 @@ namespace ts {
20462046
}
20472047

20482048
export function getExternalModuleRequireArgument(node: Node) {
2049-
return isRequireVariableDeclaration(node) && (getLeftmostAccessExpression(node.initializer) as CallExpression).arguments[0] as StringLiteral;
2049+
return isAccessedOrBareRequireVariableDeclaration(node) && (getLeftmostAccessExpression(node.initializer) as CallExpression).arguments[0] as StringLiteral;
20502050
}
20512051

20522052
export function isInternalModuleImportEqualsDeclaration(node: Node): node is ImportEqualsDeclaration {
@@ -2114,10 +2114,23 @@ namespace ts {
21142114
* This function does not test if the node is in a JavaScript file or not.
21152115
*/
21162116
export function isRequireVariableDeclaration(node: Node): node is RequireVariableDeclaration {
2117+
return isVariableDeclarationInitializedWithRequireHelper(node, /*allowAccessedRequire*/ false);
2118+
}
2119+
2120+
/**
2121+
* Like `isRequireVariableDeclaration` but allows things like `require("...").foo.bar` or `require("...")["baz"]`.
2122+
*/
2123+
export function isAccessedOrBareRequireVariableDeclaration(node: Node): node is AccessedOrBareRequireVariableDeclaration {
2124+
return isVariableDeclarationInitializedWithRequireHelper(node, /*allowAccessedRequire*/ true);
2125+
}
2126+
2127+
function isVariableDeclarationInitializedWithRequireHelper(node: Node, allowAccessedRequire: boolean) {
21172128
if (node.kind === SyntaxKind.BindingElement) {
21182129
node = node.parent.parent;
21192130
}
2120-
return isVariableDeclaration(node) && !!node.initializer && isRequireCall(getLeftmostAccessExpression(node.initializer), /*requireStringLiteralLikeArgument*/ true);
2131+
return isVariableDeclaration(node) &&
2132+
!!node.initializer &&
2133+
isRequireCall(allowAccessedRequire ? getLeftmostAccessExpression(node.initializer) : node.initializer, /*requireStringLiteralLikeArgument*/ true);
21212134
}
21222135

21232136
export function isRequireVariableStatement(node: Node): node is RequireVariableStatement {

src/services/findAllReferences.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ namespace ts.FindAllReferences {
15311531
// Use the parent symbol if the location is commonjs require syntax on javascript files only.
15321532
if (isInJSFile(referenceLocation)
15331533
&& referenceLocation.parent.kind === SyntaxKind.BindingElement
1534-
&& isRequireVariableDeclaration(referenceLocation.parent)) {
1534+
&& isAccessedOrBareRequireVariableDeclaration(referenceLocation.parent)) {
15351535
referenceSymbol = referenceLocation.parent.symbol;
15361536
// The parent will not have a symbol if it's an ObjectBindingPattern (when destructuring is used). In
15371537
// this case, just skip it, since the bound identifiers are not an alias of the import.

src/services/goToDefinition.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ namespace ts.GoToDefinition {
290290
return declaration.parent.kind === SyntaxKind.NamedImports;
291291
case SyntaxKind.BindingElement:
292292
case SyntaxKind.VariableDeclaration:
293-
return isInJSFile(declaration) && isRequireVariableDeclaration(declaration);
293+
return isInJSFile(declaration) && isAccessedOrBareRequireVariableDeclaration(declaration);
294294
default:
295295
return false;
296296
}

src/services/importTracker.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ namespace ts.FindAllReferences {
621621
Debug.assert((parent as ImportClause | NamespaceImport).name === node);
622622
return true;
623623
case SyntaxKind.BindingElement:
624-
return isInJSFile(node) && isRequireVariableDeclaration(parent);
624+
return isInJSFile(node) && isAccessedOrBareRequireVariableDeclaration(parent);
625625
default:
626626
return false;
627627
}

0 commit comments

Comments
 (0)