現在、PowerShell 3.0で導入されたAST機能を使用してScriptBlockを変更しようとしています。私の要件は、ScriptBlockのパラメータブロック内のすべてのパラメータが[Parameter(Mandatory)]
属性を取得することです。それはIScriptExtent
を期待するので、その新しい属性を追加するときPowerShell AST変更とエクステント
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
しかし、私は問題に走ったと私はないです。これに
Param([string]$x)
Write-Host $x
を:
基本的にコードは、これを変更する必要がありますどのように新しいIScriptExtent
を作成する必要がありますか?
新しいスクリプトエクステントを作成するにはどうすればよいですか?ポジションにはどのような値を使用できますか?次のすべてのエクステントの位置を変更する必要がありますか?
私は変更している各パラメータの範囲を再利用しようとしましたが、残念ながらこれは結果をもたらすようには見えません(例えばを変更したScriptBlock
に変更がありません)。
これまでの実装では、ICustomAstVisitor
が見つかったhereに基づいています。
最も重要な方法は、次のようになります。I
で始まる
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);
}
私はインターフェイスが何であるかを知って、私の質問は非常に新しいコードを作成するときに(人がコードを変更し、エクステントを再利用するたくさんの例があるエクステントは、PowerShellで働く方法を把握することができない私の周りを公転するが、私人々が新しいコードを作成した例は見つかりませんでした)。 – chrischu
@chrischu新しいIScriptExtentの作成方法を尋ねてきたので、インターフェイスに精通しているということはあなたの疑問からはっきりしないので、安全面で間違いを犯して説明するのが最善だと感じました。あなたの質問を見つける他の訪問者は、インターフェイスが何であるか知っていません。これまでに試したことをあなたの質問に含めることを検討することもできます。 – briantist