Skip to content

Commit 6e0328a

Browse files
TypeScript Botandrewbranch
TypeScript Bot
andauthored
Cherry-pick PR #49252 into release-4.7 (#49272)
Component commits: 94cf127 Fix `isVariableDeclarationInitializedToBareOrAccessedRequire` returning true on binding elements fae1bbe Undo auto format change Co-authored-by: Andrew Branch <[email protected]>
1 parent 697df6f commit 6e0328a

File tree

6 files changed

+21
-10
lines changed

6 files changed

+21
-10
lines changed

src/compiler/binder.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -3291,7 +3291,12 @@ namespace ts {
32913291
}
32923292

32933293
if (!isBindingPattern(node.name)) {
3294-
if (isInJSFile(node) && isVariableDeclarationInitializedToBareOrAccessedRequire(node) && !getJSDocTypeTag(node) && !(getCombinedModifierFlags(node) & ModifierFlags.Export)) {
3294+
const possibleVariableDecl = node.kind === SyntaxKind.VariableDeclaration ? node : node.parent.parent;
3295+
if (isInJSFile(node) &&
3296+
isVariableDeclarationInitializedToBareOrAccessedRequire(possibleVariableDecl) &&
3297+
!getJSDocTypeTag(node) &&
3298+
!(getCombinedModifierFlags(node) & ModifierFlags.Export)
3299+
) {
32953300
declareSymbolAndAddToSymbolTable(node as Declaration, SymbolFlags.Alias, SymbolFlags.AliasExcludes);
32963301
}
32973302
else if (isBlockOrCatchScoped(node)) {

src/compiler/checker.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -2641,7 +2641,8 @@ namespace ts {
26412641
&& isAliasableOrJsExpression(node.parent.right)
26422642
|| node.kind === SyntaxKind.ShorthandPropertyAssignment
26432643
|| node.kind === SyntaxKind.PropertyAssignment && isAliasableOrJsExpression((node as PropertyAssignment).initializer)
2644-
|| isVariableDeclarationInitializedToBareOrAccessedRequire(node);
2644+
|| node.kind === SyntaxKind.VariableDeclaration && isVariableDeclarationInitializedToBareOrAccessedRequire(node)
2645+
|| node.kind === SyntaxKind.BindingElement && isVariableDeclarationInitializedToBareOrAccessedRequire(node.parent.parent);
26452646
}
26462647

26472648
function isAliasableOrJsExpression(e: Expression) {
@@ -37725,8 +37726,8 @@ namespace ts {
3772537726
}
3772637727
// For a commonjs `const x = require`, validate the alias and exit
3772737728
const symbol = getSymbolOfNode(node);
37728-
if (symbol.flags & SymbolFlags.Alias && isVariableDeclarationInitializedToBareOrAccessedRequire(node)) {
37729-
checkAliasSymbol(node);
37729+
if (symbol.flags & SymbolFlags.Alias && isVariableDeclarationInitializedToBareOrAccessedRequire(node.kind === SyntaxKind.BindingElement ? node.parent.parent : node)) {
37730+
checkAliasSymbol(node as BindingElement | VariableDeclaration);
3773037731
return;
3773137732
}
3773237733

@@ -40590,7 +40591,7 @@ namespace ts {
4059040591
return true;
4059140592
}
4059240593

40593-
function checkAliasSymbol(node: ImportEqualsDeclaration | VariableDeclaration | ImportClause | NamespaceImport | ImportSpecifier | ExportSpecifier | NamespaceExport) {
40594+
function checkAliasSymbol(node: ImportEqualsDeclaration | VariableDeclaration | ImportClause | NamespaceImport | ImportSpecifier | ExportSpecifier | NamespaceExport | BindingElement) {
4059440595
let symbol = getSymbolOfNode(node);
4059540596
const target = resolveAlias(symbol);
4059640597

src/compiler/utilities.ts

-3
Original file line numberDiff line numberDiff line change
@@ -2197,9 +2197,6 @@ namespace ts {
21972197
}
21982198

21992199
function isVariableDeclarationInitializedWithRequireHelper(node: Node, allowAccessedRequire: boolean) {
2200-
if (node.kind === SyntaxKind.BindingElement) {
2201-
node = node.parent.parent;
2202-
}
22032200
return isVariableDeclaration(node) &&
22042201
!!node.initializer &&
22052202
isRequireCall(allowAccessedRequire ? getLeftmostAccessExpression(node.initializer) : node.initializer, /*requireStringLiteralLikeArgument*/ true);

src/services/findAllReferences.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,7 @@ namespace ts.FindAllReferences {
16011601
// Use the parent symbol if the location is commonjs require syntax on javascript files only.
16021602
if (isInJSFile(referenceLocation)
16031603
&& referenceLocation.parent.kind === SyntaxKind.BindingElement
1604-
&& isVariableDeclarationInitializedToBareOrAccessedRequire(referenceLocation.parent)) {
1604+
&& isVariableDeclarationInitializedToBareOrAccessedRequire(referenceLocation.parent.parent.parent)) {
16051605
referenceSymbol = referenceLocation.parent.symbol;
16061606
// The parent will not have a symbol if it's an ObjectBindingPattern (when destructuring is used). In
16071607
// this case, just skip it, since the bound identifiers are not an alias of the import.

src/services/importTracker.ts

+1-1
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) && isVariableDeclarationInitializedToBareOrAccessedRequire(parent);
624+
return isInJSFile(node) && isVariableDeclarationInitializedToBareOrAccessedRequire(parent.parent.parent);
625625
default:
626626
return false;
627627
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/// <reference path="../fourslash.ts" />
2+
3+
// @allowJs: true
4+
5+
// @Filename: /index.js
6+
//// const { blah/**/ } = require("unresolved");
7+
8+
verify.goToSourceDefinition("", []);

0 commit comments

Comments
 (0)