public void RendererProduceSyntaxAndParameter() { MamlRenderer renderer = new MamlRenderer(); MamlCommand command = new MamlCommand() { Name = "Get-Foo", }; var param1 = new MamlParameter() { Type = "String", Name = "Param1", Position = "Named" }; var param2 = new MamlParameter() { Type = "System.Int32", Name = "Param2", Position = "Named" }; command.Parameters.Add(param1); command.Parameters.Add(param2); var syntax = new MamlSyntax(); syntax.Parameters.Add(param1); syntax.Parameters.Add(param2); command.Syntax.Add(syntax); string maml = renderer.MamlModelToString(new[] { command }); string[] syntaxItemName = EndToEndTests.GetXmlContent(maml, "/helpItems/command:command/command:syntax/command:syntaxItem/maml:name"); Assert.Equal(1, syntaxItemName.Length); Assert.Equal("Get-Foo", syntaxItemName[0]); string[] nameSyntax = EndToEndTests.GetXmlContent(maml, "/helpItems/command:command/command:syntax/command:syntaxItem/command:parameter/maml:name"); Assert.Equal(2, nameSyntax.Length); Assert.Equal("Param1", nameSyntax[0]); Assert.Equal("Param2", nameSyntax[1]); string[] nameParam = EndToEndTests.GetXmlContent(maml, "/helpItems/command:command/command:parameters/command:parameter/maml:name"); Assert.Equal(2, nameParam.Length); Assert.Equal("Param1", nameParam[0]); Assert.Equal("Param2", nameParam[1]); }
private void GatherParameterDetails(MamlCommand command) { const string parameterFormatString = @" {0} ${1}"; const string docFunctionFormatString = @" function Get-AttributeDocFunction {{ param( {0} ) }} $h = Get-Help Get-AttributeDocFunction $h.parameters.parameter "; // Create the Runspace on demand if (this.runspace == null) { this.runspace = RunspaceFactory.CreateRunspace(); this.runspace.Open(); } using (PowerShell powerShell = PowerShell.Create()) { var parameterBlocks = command .Parameters .Select(p => string.Format(parameterFormatString, p.AttributesText, ShiftName(p.Name))); var functionScript = string.Format( docFunctionFormatString, string.Join(",\r\n", parameterBlocks)); // TODO: There could be some security concerns with executing arbitrary // text here, need to investigate safer ways to do it. JEA? powerShell.Runspace = this.runspace; powerShell.AddScript(functionScript); var parameterDetailses = powerShell.Invoke<PSObject>(); if (powerShell.Streams.Error.Any()) { throw new HelpSchemaException(command.Extent, "Errors when processing command " + command.Name + ":\n" + string.Join(";\n", powerShell.Streams.Error)); } foreach (PSObject parameterDetailsPsObject in parameterDetailses) { var parameter = command.Parameters.FirstOrDefault( p => string.Equals(p.Name, UndoShiftName((string)parameterDetailsPsObject.Properties["name"].Value))); FillUpParameterFromPSObject(parameter, parameterDetailsPsObject); } powerShell.Commands.Clear(); powerShell.Commands.AddScript("$h.Syntax.syntaxItem"); var syntaxDetailses = powerShell.Invoke<PSObject>(); if (powerShell.Streams.Error.Any()) { throw new HelpSchemaException(command.Extent, "Errors when processing command " + command.Name + ":\n" + string.Join(";\n", powerShell.Streams.Error)); } var sortedSyntaxItems = syntaxDetailses.ToList(); sortedSyntaxItems.Sort((si1, si2) => String.CompareOrdinal(GetParameterSetNameFromSyntaxItem(si1), GetParameterSetNameFromSyntaxItem(si2))); foreach (var syntaxDetails in sortedSyntaxItems) { MamlSyntax syntax = new MamlSyntax(); var syntaxParams = (object[])syntaxDetails.Properties["parameter"].Value; foreach (PSObject syntaxParamPsObject in syntaxParams.OfType<PSObject>()) { string paramName = UndoShiftName((string) syntaxParamPsObject.Properties["name"].Value); MamlParameter parametersParameter = command.Parameters.FirstOrDefault(p => string.Equals(p.Name, paramName)); if (parametersParameter == null) { throw new HelpSchemaException(command.Extent, "Cannot find corresponding parameter for syntax item " + paramName); } MamlParameter syntaxParameter = new MamlParameter() { Name = parametersParameter.Name, Type = parametersParameter.Type }; FillUpParameterFromPSObject(syntaxParameter, syntaxParamPsObject); syntax.Parameters.Add(syntaxParameter); } command.Syntax.Add(syntax); } } }