diff --git a/Engine/TokenOperations.cs b/Engine/TokenOperations.cs index 4845ab8c4..335fb2722 100644 --- a/Engine/TokenOperations.cs +++ b/Engine/TokenOperations.cs @@ -73,7 +73,9 @@ public IEnumerable GetCloseBracesInCommandElements() public IEnumerable> GetBracePairs() { var openBraceStack = new Stack(); - IEnumerable hashtableAsts = ast.FindAll(oneAst => oneAst is HashtableAst, searchNestedScriptBlocks: true); + var hashtableEndOffsets = new HashSet( + ast.FindAll(oneAst => oneAst is HashtableAst, searchNestedScriptBlocks: true) + .Select(hashtableAst => hashtableAst.Extent.EndOffset)); foreach (var token in tokens) { if (token.Kind == TokenKind.LCurly) @@ -85,11 +87,7 @@ public IEnumerable> GetBracePairs() if (token.Kind == TokenKind.RCurly && openBraceStack.Count > 0) { - bool closeBraceBelongsToHashTable = hashtableAsts.Any(hashtableAst => - { - return hashtableAst.Extent.EndLineNumber == token.Extent.EndLineNumber - && hashtableAst.Extent.EndColumnNumber == token.Extent.EndColumnNumber; - }); + bool closeBraceBelongsToHashTable = hashtableEndOffsets.Contains(token.Extent.EndOffset); if (!closeBraceBelongsToHashTable) { diff --git a/Tests/Engine/TokenOperations.tests.ps1 b/Tests/Engine/TokenOperations.tests.ps1 index 1bb1d9298..e9a975e24 100644 --- a/Tests/Engine/TokenOperations.tests.ps1 +++ b/Tests/Engine/TokenOperations.tests.ps1 @@ -19,6 +19,26 @@ $h = @{ $hashTableAst.Extent.Text | Should -Be '@{ z = "hi" }' } + It "Should pair script block braces without matching hashtable braces" { + $scriptText = @' +$h = @{ key = 72 } +if ($true) { + 'value' +} +'@ + $tokens = $null + $parseErrors = $null + $scriptAst = [System.Management.Automation.Language.Parser]::ParseInput($scriptText, [ref] $tokens, [ref] $parseErrors) + $tokenOperations = [Microsoft.Windows.PowerShell.ScriptAnalyzer.TokenOperations]::new($tokens, $scriptAst) + $bracePairs = @($tokenOperations.GetBracePairs()) + + $bracePairs.Count | Should -Be 1 + $bracePairs[0].Item1.Extent.Text | Should -Be '{' + $bracePairs[0].Item2.Extent.Text | Should -Be '}' + $bracePairs[0].Item1.Extent.StartLineNumber | Should -Be 2 + $bracePairs[0].Item2.Extent.StartLineNumber | Should -Be 4 + } + Context 'Braced Member Access Ranges' { BeforeDiscovery {