現在、PowerShell 3.0 で導入された AST 機能を使用して ScriptBlock を変更しようとしています。私の要件は、ScriptBlock のパラメーター ブロック内のすべてのパラメーターが[Parameter(Mandatory)]
属性を取得することです。
基本的に、コードはこれを変更する必要があります。
Param([string]$x)
Write-Host $x
これに:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
ただし、その新しい属性を追加するときに問題が発生しましIScriptExtent
たIScriptExtent
。
新しいスクリプト エクステントを作成するにはどうすればよいですか? 位置にはどのような値を使用できますか? 後続のすべてのエクステントの位置を変更する必要がありますか?
変更している各パラメーターの範囲を再利用しようとしましたが、残念ながら、これは必要な結果をもたらさないようです (たとえば、変更されたパラメーターを呼び出しToString
ている場合、変更ScriptBlock
は表示されません)。
ICustomAstVisitor
これまでの私の実装は、見つかった hereに基づいています。
最も重要な方法は次のようになります。
public object VisitParameter(ParameterAst parameterAst)
{
var newName = VisitElement(parameterAst.Name);
var extent = // What to do here?
var mandatoryArg = new AttributeAst(extent, new ReflectionTypeName(typeof (ParameterAttribute)),
new ExpressionAst[0],
new[] {new NamedAttributeArgumentAst(extent, "Mandatory", new ConstantExpressionAst(extent, true), true)});
var newAttributes = new[] {mandatoryArg}.Concat(VisitElements(parameterAst.Attributes));
var newDefaultValue = VisitElement(parameterAst.DefaultValue);
return new ParameterAst(parameterAst.Extent, newName, newAttributes, newDefaultValue);
}