mirror of
https://github.com/warpdotdev/warp.git
synced 2026-05-06 23:32:51 +08:00
85 lines
3.9 KiB
PowerShell
85 lines
3.9 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Use PS5-safe escape codes instead of `e and `u
|
|
.DESCRIPTION
|
|
`e and `u were added in PS 6, so they will not work in PS5 strings
|
|
.EXAMPLE
|
|
.INPUTS
|
|
.OUTPUTS
|
|
.NOTES
|
|
#>
|
|
function Test-StringEscapeCode {
|
|
[CmdletBinding()]
|
|
[OutputType([Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.DiagnosticRecord[]])]
|
|
Param
|
|
(
|
|
[Parameter(Mandatory = $true)]
|
|
[ValidateNotNullOrEmpty()]
|
|
[System.Management.Automation.Language.ScriptBlockAst]
|
|
$ScriptBlockAst
|
|
)
|
|
|
|
Process {
|
|
[Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.DiagnosticRecord[]]$results = @()
|
|
|
|
try {
|
|
$expressions = $ScriptBlockAst.FindAll({
|
|
param ([System.Management.Automation.Language.Ast]$Ast)
|
|
|
|
($Ast.GetType().Name -Match 'StringConstantExpression|ExpandableStringExpression') -and ($Ast.StringConstantType -eq 'DoubleQuoted')
|
|
}, $false)
|
|
|
|
foreach ($expr in $expressions) {
|
|
$extent = $expr.Extent
|
|
if ($extent.Text -Match '([^`]|^)`e' ) {
|
|
$correction = $expr.Extent.Text -Replace '(?<lead>[^`]|^)`e', '${lead}$([char]0x1b)'
|
|
$objParams = @{
|
|
TypeName = 'Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.CorrectionExtent'
|
|
ArgumentList = $extent.StartLineNumber, $extent.EndLineNumber, $extent.StartColumnNumber,
|
|
$extent.EndColumnNumber, $correction, $MyInvocation.MyCommand.Definition
|
|
}
|
|
$correctionExtent = New-Object @objParams
|
|
$suggestedCorrections = New-Object System.Collections.ObjectModel.Collection[$($objParams.TypeName)]
|
|
$suggestedCorrections.add($correctionExtent) | Out-Null
|
|
|
|
$result = [Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.DiagnosticRecord]@{
|
|
'Message' = 'The escape sequence "`e" is not supported in powershell 5'
|
|
'Extent' = $extent
|
|
'RuleName' = $PSCmdlet.MyInvocation.InvocationName
|
|
'Severity' = 'Warning'
|
|
'SuggestedCorrections' = $suggestedCorrections
|
|
}
|
|
$results += $result
|
|
|
|
} elseif ($extent.Text -Match '([^`]|^)`u{(?<sequence>[A-Za-z0-9]+)}') {
|
|
$sequence = $Matches.sequence
|
|
|
|
$correction = -Replace '(?<lead>[^`]|^)`u\{(?<code>[A-Za-z0-9]+)}', '${lead}$([char]0x${code})'
|
|
$objParams = @{
|
|
TypeName = 'Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.CorrectionExtent'
|
|
ArgumentList = $extent.StartLineNumber, $extent.EndLineNumber, $extent.StartColumnNumber,
|
|
$extent.EndColumnNumber, $correction, $MyInvocation.MyCommand.Definition
|
|
}
|
|
$correctionExtent = New-Object @objParams
|
|
$suggestedCorrections = New-Object System.Collections.ObjectModel.Collection[$($objParams.TypeName)]
|
|
$suggestedCorrections.add($correctionExtent) | Out-Null
|
|
|
|
$result = [Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.DiagnosticRecord]@{
|
|
'Message' = "The escape sequence `"``u{$sequence}`" is not supported in powershell 5"
|
|
'Extent' = $assignmentAst.Extent
|
|
'RuleName' = $PSCmdlet.MyInvocation.InvocationName
|
|
'Severity' = 'Warning'
|
|
'SuggestedCorrections' = $suggestedCorrections
|
|
}
|
|
$results += $result
|
|
}
|
|
}
|
|
return $results
|
|
} catch {
|
|
$PSCmdlet.ThrowTerminatingError($PSItem)
|
|
}
|
|
}
|
|
}
|
|
|
|
Export-ModuleMember -Function Test-StringEscapeCode
|