/// <summary> /// Visit function and checks that it has write verbose /// </summary> /// <param name="funcAst"></param> /// <returns></returns> public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst) { if (funcAst == null) { return(AstVisitAction.SkipChildren); } var commandAsts = funcAst.Body.FindAll(testAst => testAst is CommandAst, false); bool hasVerbose = false; if (commandAsts != null) { foreach (CommandAst commandAst in commandAsts) { hasVerbose |= String.Equals(commandAst.GetCommandName(), "Write-Verbose", StringComparison.OrdinalIgnoreCase); } } if (!hasVerbose) { DiagnosticRecords.Add(new DiagnosticRecord(string.Format(CultureInfo.CurrentCulture, Strings.ProvideVerboseMessageErrorFunction, funcAst.Name), funcAst.Extent, GetName(), DiagnosticSeverity.Information, fileName)); } return(AstVisitAction.Continue); }
/// <summary> /// Visit function and checks that it has write verbose /// </summary> /// <param name="funcAst"></param> /// <returns></returns> public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst) { if (funcAst == null) { return(AstVisitAction.SkipChildren); } //Write-Verbose is not required for non-advanced functions if (funcAst.Body == null || funcAst.Body.ParamBlock == null || funcAst.Body.ParamBlock.Attributes == null || funcAst.Body.ParamBlock.Parameters == null || !funcAst.Body.ParamBlock.Attributes.Any(attr => attr.TypeName.GetReflectionType() == typeof(CmdletBindingAttribute))) { return(AstVisitAction.Continue); } var commandAsts = funcAst.Body.FindAll(testAst => testAst is CommandAst, false); bool hasVerbose = false; if (commandAsts != null) { foreach (CommandAst commandAst in commandAsts) { hasVerbose |= String.Equals(commandAst.GetCommandName(), "Write-Verbose", StringComparison.OrdinalIgnoreCase); } } if (!hasVerbose) { DiagnosticRecords.Add(new DiagnosticRecord(string.Format(CultureInfo.CurrentCulture, Strings.ProvideVerboseMessageErrorFunction, funcAst.Name), funcAst.Extent, GetName(), DiagnosticSeverity.Information, fileName)); } return(AstVisitAction.Continue); }
/// <summary> /// Visit function and checks that it has comment help /// </summary> /// <param name="funcAst"></param> /// <returns></returns> public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst) { if (funcAst == null) { return(AstVisitAction.SkipChildren); } if (exportedFunctions.Contains(funcAst.Name)) { if (funcAst.GetHelpContent() == null) { DiagnosticRecords.Add( new DiagnosticRecord( string.Format(CultureInfo.CurrentCulture, Strings.ProvideCommentHelpError, funcAst.Name), funcAst.Extent, GetName(), DiagnosticSeverity.Information, fileName)); } } return(AstVisitAction.Continue); }
/// <summary> /// Visit function and checks that it is a cmdlet. If yes, then checks that any object returns must have a type declared /// in the output type (the only exception is if the type is object) /// </summary> /// <param name="funcAst"></param> /// <returns></returns> public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst funcAst) { if (funcAst == null || funcAst.Body == null || funcAst.Body.ParamBlock == null || funcAst.Body.ParamBlock.Attributes == null || funcAst.Body.ParamBlock.Attributes.Count == 0 || !funcAst.Body.ParamBlock.Attributes.Any(attr => attr.TypeName.GetReflectionType() == typeof(CmdletBindingAttribute))) { return(AstVisitAction.Continue); } HashSet <string> outputTypes = new HashSet <string>(); foreach (AttributeAst attrAst in funcAst.Body.ParamBlock.Attributes) { if (attrAst.TypeName != null && attrAst.TypeName.GetReflectionType() == typeof(OutputTypeAttribute) && attrAst.PositionalArguments != null) { foreach (ExpressionAst expAst in attrAst.PositionalArguments) { if (expAst is StringConstantExpressionAst) { Type type = Type.GetType((expAst as StringConstantExpressionAst).Value); if (type != null) { outputTypes.Add(type.FullName); } } else { TypeExpressionAst typeAst = expAst as TypeExpressionAst; if (typeAst != null && typeAst.TypeName != null) { if (typeAst.TypeName.GetReflectionType() != null) { outputTypes.Add(typeAst.TypeName.GetReflectionType().FullName); } else { outputTypes.Add(typeAst.TypeName.FullName); } } } } } } #if PSV3 List <Tuple <string, StatementAst> > returnTypes = FindPipelineOutput.OutputTypes(funcAst); #else List <Tuple <string, StatementAst> > returnTypes = FindPipelineOutput.OutputTypes(funcAst, _classes); #endif HashSet <string> specialTypes = new HashSet <string>(StringComparer.OrdinalIgnoreCase); specialTypes.Add(typeof(Unreached).FullName); specialTypes.Add(typeof(Undetermined).FullName); specialTypes.Add(typeof(object).FullName); specialTypes.Add(typeof(void).FullName); specialTypes.Add(typeof(PSCustomObject).FullName); specialTypes.Add(typeof(PSObject).FullName); foreach (Tuple <string, StatementAst> returnType in returnTypes) { string typeName = returnType.Item1; if (String.IsNullOrEmpty(typeName) || specialTypes.Contains(typeName) || outputTypes.Contains(typeName, StringComparer.OrdinalIgnoreCase)) { continue; } else { DiagnosticRecords.Add(new DiagnosticRecord(string.Format(CultureInfo.CurrentCulture, Strings.UseOutputTypeCorrectlyError, funcAst.Name, typeName), returnType.Item2.Extent, GetName(), DiagnosticSeverity.Information, fileName)); } } return(AstVisitAction.Continue); }