PowerShell / PowerShell/PSScriptAnalyzer
PSUseOutputTypeCorrectly/[OutputType()] fires incorrectly, reporting that a fn should return string when the function actually return array of strings
還沒有人認領這個 Issue。
- 主要語言
- C#
- 星號
- 2.2k
- 分支
- 415
- 平均合併
- 13 小時 1 分鐘
- 30 天內合併 PR
- 2
描述
Before submitting a bug report:
- Make sure you are able to repro it on the latest released version
- Perform a quick search for existing issues to check if this bug has already been reported
Steps to reproduce
function Split-KeyValuePairFormatter {
[OutputType('System.String[]')]
[CmdletBinding()]
param (
[Parameter(Mandatory = $true)]
[string]
$Format,
[string]
$KeyConstituent,
[string]
$ValueConstituent,
[string]
$KeyPlaceHolder = "<%KEY%>",
[string]
$ValuePlaceHolder = "<%VALUE%>"
)
[string[]]$constituents = @();
# IMPLEMENTATION CODE OMITTED, but you can see that the return statement
# just returns the array declared as string[]
return $constituents;
}
Expected behavior
No warning expected
Actual behavior
Error:
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
PSUseOutputTypeCorrectly Information split-key- 152 The cmdlet 'Split-KeyValuePairFormatter' returns an
value-pair object of type 'System.String' but this type is not
-formatter declared in the OutputType attribute.
.ps1
If I change OutputType to: [OutputType('System.String')], which is clearly wrong as it doesn't reflect the behaviour of the actual code, then there is no error. This does not seem right. As a work around, I'm having to declare an incorrect return type, ie System.string in [OutputType()], and put in a comment to indicate as such. Luckily, there is no effect on the functinality, but I can't omit the OutputType without PSScriptAnalyzer reporting a warning.
Environment data
> $PSVersionTable
Name Value
---- -----
PSVersion 7.0.0
PSEdition Core
GitCommitId 7.0.0
OS Microsoft Windows 10.0.18362
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
> (Get-Module -ListAvailable PSScriptAnalyzer).Version | ForEach-Object { $_.ToString() }
1.19.0
1.18.3
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
首先,使用 Split-KeyValuePairFormatter 範例重現 PSUseOutputTypeCorrectly 警告,並檢查該規則如何處理 OutputType('System.String[]')。將其推斷出的回傳型別與宣告的陣列型別進行比較。當該規則接受字串陣列回傳值,而不要求錯誤地宣告為 System.String 時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- powershell
- 領域
- tooling
- Issue 類型
- 缺陷
- 難度
- 3/5
- 預估耗時
- 1-2 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 42/100