diff --git a/Rules/AvoidAlias.cs b/DeprecatedRules/AvoidAlias.cs similarity index 97% rename from Rules/AvoidAlias.cs rename to DeprecatedRules/AvoidAlias.cs index ad35ec4fe..49533efc5 100644 --- a/Rules/AvoidAlias.cs +++ b/DeprecatedRules/AvoidAlias.cs @@ -1,267 +1,267 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Management.Automation.Language; -using Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic; -#if !CORECLR -using System.ComponentModel.Composition; -#endif -using System.Globalization; -using System.Linq; -using System.Management.Automation; - -namespace Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules -{ - /// - /// AvoidAlias: Check if cmdlet alias is used. - /// -#if !CORECLR - [Export(typeof(IScriptRule))] -#endif - public class AvoidAlias : IScriptRule - { - private readonly string whiteListArgName = "whitelist"; - private bool isPropertiesSet; - private List whiteList; - public List WhiteList - { - get { return whiteList; } - } - - public AvoidAlias() - { - isPropertiesSet = false; - } - - /// - /// Configure the rule. - /// - /// Sets the whitelist of this rule - /// - private void SetProperties() - { - whiteList = new List(); - isPropertiesSet = true; - Dictionary ruleArgs = Helper.Instance.GetRuleArguments(GetName()); - if (ruleArgs == null) - { - return; - } - object obj; - if (!ruleArgs.TryGetValue(whiteListArgName, out obj)) - { - return; - } - IEnumerable aliases = obj as IEnumerable; - if (aliases == null) - { - // try with enumerable objects - var enumerableObjs = obj as IEnumerable; - if (enumerableObjs == null) - { - return; - } - foreach (var x in enumerableObjs) - { - var y = x as string; - if (y == null) - { - return; - } - else - { - whiteList.Add(y); - } - } - } - else - { - whiteList.AddRange(aliases); - } - } - - /// - /// AnalyzeScript: Analyze the script to check if cmdlet alias is used. - /// - public IEnumerable AnalyzeScript(Ast ast, string fileName) - { - if (ast == null) throw new ArgumentNullException(Strings.NullAstErrorMessage); - if (!isPropertiesSet) - { - SetProperties(); - } - // Finds all CommandAsts. - IEnumerable foundAsts = ast.FindAll(testAst => testAst is CommandAst, true); - - // Iterates all CommandAsts and check the command name. - foreach (CommandAst cmdAst in foundAsts) - { - // Check if the command ast should be ignored - if (IgnoreCommandast(cmdAst)) - { - continue; - } - - string commandName = cmdAst.GetCommandName(); - - // Handles the exception caused by commands like, {& $PLINK $args 2> $TempErrorFile}. - // You can also review the remark section in following document, - // MSDN: CommandAst.GetCommandName Method - if (commandName == null - || whiteList.Contains(commandName, StringComparer.OrdinalIgnoreCase)) - { - continue; - } - - string cmdletNameIfCommandNameWasAlias = Helper.Instance.GetCmdletNameFromAlias(commandName); - if (!String.IsNullOrEmpty(cmdletNameIfCommandNameWasAlias)) - { - yield return new DiagnosticRecord( - string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesError, commandName, cmdletNameIfCommandNameWasAlias), - GetCommandExtent(cmdAst), - GetName(), - DiagnosticSeverity.Warning, - fileName, - commandName, - suggestedCorrections: GetCorrectionExtent(cmdAst, cmdletNameIfCommandNameWasAlias)); - } - - var isNativeCommand = Helper.Instance.GetCommandInfo(commandName, CommandTypes.Application | CommandTypes.ExternalScript) != null; - if (!isNativeCommand) - { - var commdNameWithGetPrefix = $"Get-{commandName}"; - var cmdletNameIfCommandWasMissingGetPrefix = Helper.Instance.GetCommandInfo($"Get-{commandName}"); - if (cmdletNameIfCommandWasMissingGetPrefix != null) - { - yield return new DiagnosticRecord( - string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesMissingGetPrefixError, commandName, commdNameWithGetPrefix), - GetCommandExtent(cmdAst), - GetName(), - DiagnosticSeverity.Warning, - fileName, - commandName, - suggestedCorrections: GetCorrectionExtent(cmdAst, commdNameWithGetPrefix)); - } - } - } - } - - /// - /// Checks commandast of the form "[commandElement0] = [CommandElement2]". This typically occurs in a DSC configuration. - /// - private bool IgnoreCommandast(CommandAst cmdAst) - { - if (cmdAst.CommandElements.Count == 3) - { - var element = cmdAst.CommandElements[1] as StringConstantExpressionAst; - if (element != null && element.Value.Equals("=")) - { - return true; - } - } - - return false; - } - - /// - /// For a command like "gci -path c:", returns the extent of "gci" in the command - /// - private IScriptExtent GetCommandExtent(CommandAst commandAst) - { - var cmdName = commandAst.GetCommandName(); - foreach (var cmdElement in commandAst.CommandElements) - { - var stringConstExpressinAst = cmdElement as StringConstantExpressionAst; - if (stringConstExpressinAst != null) - { - if (stringConstExpressinAst.Value.Equals(cmdName)) - { - return stringConstExpressinAst.Extent; - } - } - } - return commandAst.Extent; - } - - /// - /// Creates a list containing suggested correction - /// - /// Command AST of an alias - /// Full name of the alias - /// Retruns a list of suggested corrections - private List GetCorrectionExtent(CommandAst cmdAst, string cmdletName) - { - var corrections = new List(); - var alias = cmdAst.GetCommandName(); - var description = string.Format( - CultureInfo.CurrentCulture, - Strings.AvoidUsingCmdletAliasesCorrectionDescription, - alias, - cmdletName); - var cmdExtent = GetCommandExtent(cmdAst); - corrections.Add(new CorrectionExtent( - cmdExtent.StartLineNumber, - cmdExtent.EndLineNumber, - cmdExtent.StartColumnNumber, - cmdExtent.EndColumnNumber, - cmdletName, - cmdAst.Extent.File, - description)); - return corrections; - } - - /// - /// GetName: Retrieves the name of this rule. - /// - /// The name of this rule - public string GetName() - { - return string.Format(CultureInfo.CurrentCulture, Strings.NameSpaceFormat, GetSourceName(), Strings.AvoidUsingCmdletAliasesName); - } - - /// - /// GetCommonName: Retrieves the common name of this rule. - /// - /// The common name of this rule - public string GetCommonName() - { - return string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesCommonName); - } - - /// - /// GetDescription: Retrieves the description of this rule. - /// - /// The description of this rule - public string GetDescription() - { - return string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesDescription); - } - - /// - /// GetSourceType: Retrieves the type of the rule, Builtin, Managed or Module. - /// - public SourceType GetSourceType() - { - return SourceType.Builtin; - } - - /// - /// GetSeverity: Retrieves the severity of the rule: error, warning of information. - /// - /// - public RuleSeverity GetSeverity() - { - return RuleSeverity.Warning; - } - - /// - /// GetSourceName: Retrieves the name of the module/assembly the rule is from. - /// - public string GetSourceName() - { - return string.Format(CultureInfo.CurrentCulture, Strings.SourceName); - } - } +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Management.Automation.Language; +using Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic; +#if !CORECLR +using System.ComponentModel.Composition; +#endif +using System.Globalization; +using System.Linq; +using System.Management.Automation; + +namespace Microsoft.Windows.PowerShell.ScriptAnalyzer.BuiltinRules +{ + /// + /// AvoidAlias: Check if cmdlet alias is used. + /// +#if !CORECLR + [Export(typeof(IScriptRule))] +#endif + public class AvoidAlias : IScriptRule + { + private readonly string whiteListArgName = "whitelist"; + private bool isPropertiesSet; + private List whiteList; + public List WhiteList + { + get { return whiteList; } + } + + public AvoidAlias() + { + isPropertiesSet = false; + } + + /// + /// Configure the rule. + /// + /// Sets the whitelist of this rule + /// + private void SetProperties() + { + whiteList = new List(); + isPropertiesSet = true; + Dictionary ruleArgs = Helper.Instance.GetRuleArguments(GetName()); + if (ruleArgs == null) + { + return; + } + object obj; + if (!ruleArgs.TryGetValue(whiteListArgName, out obj)) + { + return; + } + IEnumerable aliases = obj as IEnumerable; + if (aliases == null) + { + // try with enumerable objects + var enumerableObjs = obj as IEnumerable; + if (enumerableObjs == null) + { + return; + } + foreach (var x in enumerableObjs) + { + var y = x as string; + if (y == null) + { + return; + } + else + { + whiteList.Add(y); + } + } + } + else + { + whiteList.AddRange(aliases); + } + } + + /// + /// AnalyzeScript: Analyze the script to check if cmdlet alias is used. + /// + public IEnumerable AnalyzeScript(Ast ast, string fileName) + { + if (ast == null) throw new ArgumentNullException(Strings.NullAstErrorMessage); + if (!isPropertiesSet) + { + SetProperties(); + } + // Finds all CommandAsts. + IEnumerable foundAsts = ast.FindAll(testAst => testAst is CommandAst, true); + + // Iterates all CommandAsts and check the command name. + foreach (CommandAst cmdAst in foundAsts) + { + // Check if the command ast should be ignored + if (IgnoreCommandast(cmdAst)) + { + continue; + } + + string commandName = cmdAst.GetCommandName(); + + // Handles the exception caused by commands like, {& $PLINK $args 2> $TempErrorFile}. + // You can also review the remark section in following document, + // MSDN: CommandAst.GetCommandName Method + if (commandName == null + || whiteList.Contains(commandName, StringComparer.OrdinalIgnoreCase)) + { + continue; + } + + string cmdletNameIfCommandNameWasAlias = Helper.Instance.GetCmdletNameFromAlias(commandName); + if (!String.IsNullOrEmpty(cmdletNameIfCommandNameWasAlias)) + { + yield return new DiagnosticRecord( + string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesError, commandName, cmdletNameIfCommandNameWasAlias), + GetCommandExtent(cmdAst), + GetName(), + DiagnosticSeverity.Warning, + fileName, + commandName, + suggestedCorrections: GetCorrectionExtent(cmdAst, cmdletNameIfCommandNameWasAlias)); + } + + var isNativeCommand = Helper.Instance.GetCommandInfo(commandName, CommandTypes.Application | CommandTypes.ExternalScript) != null; + if (!isNativeCommand) + { + var commdNameWithGetPrefix = $"Get-{commandName}"; + var cmdletNameIfCommandWasMissingGetPrefix = Helper.Instance.GetCommandInfo($"Get-{commandName}"); + if (cmdletNameIfCommandWasMissingGetPrefix != null) + { + yield return new DiagnosticRecord( + string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesMissingGetPrefixError, commandName, commdNameWithGetPrefix), + GetCommandExtent(cmdAst), + GetName(), + DiagnosticSeverity.Warning, + fileName, + commandName, + suggestedCorrections: GetCorrectionExtent(cmdAst, commdNameWithGetPrefix)); + } + } + } + } + + /// + /// Checks commandast of the form "[commandElement0] = [CommandElement2]". This typically occurs in a DSC configuration. + /// + private bool IgnoreCommandast(CommandAst cmdAst) + { + if (cmdAst.CommandElements.Count == 3) + { + var element = cmdAst.CommandElements[1] as StringConstantExpressionAst; + if (element != null && element.Value.Equals("=")) + { + return true; + } + } + + return false; + } + + /// + /// For a command like "gci -path c:", returns the extent of "gci" in the command + /// + private IScriptExtent GetCommandExtent(CommandAst commandAst) + { + var cmdName = commandAst.GetCommandName(); + foreach (var cmdElement in commandAst.CommandElements) + { + var stringConstExpressinAst = cmdElement as StringConstantExpressionAst; + if (stringConstExpressinAst != null) + { + if (stringConstExpressinAst.Value.Equals(cmdName)) + { + return stringConstExpressinAst.Extent; + } + } + } + return commandAst.Extent; + } + + /// + /// Creates a list containing suggested correction + /// + /// Command AST of an alias + /// Full name of the alias + /// Retruns a list of suggested corrections + private List GetCorrectionExtent(CommandAst cmdAst, string cmdletName) + { + var corrections = new List(); + var alias = cmdAst.GetCommandName(); + var description = string.Format( + CultureInfo.CurrentCulture, + Strings.AvoidUsingCmdletAliasesCorrectionDescription, + alias, + cmdletName); + var cmdExtent = GetCommandExtent(cmdAst); + corrections.Add(new CorrectionExtent( + cmdExtent.StartLineNumber, + cmdExtent.EndLineNumber, + cmdExtent.StartColumnNumber, + cmdExtent.EndColumnNumber, + cmdletName, + cmdAst.Extent.File, + description)); + return corrections; + } + + /// + /// GetName: Retrieves the name of this rule. + /// + /// The name of this rule + public string GetName() + { + return string.Format(CultureInfo.CurrentCulture, Strings.NameSpaceFormat, GetSourceName(), Strings.AvoidUsingCmdletAliasesName); + } + + /// + /// GetCommonName: Retrieves the common name of this rule. + /// + /// The common name of this rule + public string GetCommonName() + { + return string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesCommonName); + } + + /// + /// GetDescription: Retrieves the description of this rule. + /// + /// The description of this rule + public string GetDescription() + { + return string.Format(CultureInfo.CurrentCulture, Strings.AvoidUsingCmdletAliasesDescription); + } + + /// + /// GetSourceType: Retrieves the type of the rule, Builtin, Managed or Module. + /// + public SourceType GetSourceType() + { + return SourceType.Builtin; + } + + /// + /// GetSeverity: Retrieves the severity of the rule: error, warning of information. + /// + /// + public RuleSeverity GetSeverity() + { + return RuleSeverity.Warning; + } + + /// + /// GetSourceName: Retrieves the name of the module/assembly the rule is from. + /// + public string GetSourceName() + { + return string.Format(CultureInfo.CurrentCulture, Strings.SourceName); + } + } } \ No newline at end of file diff --git a/Tests/Rules/AvoidUsingAlias.ps1 b/Tests/DisabledRules/AvoidUsingAlias.ps1 similarity index 100% rename from Tests/Rules/AvoidUsingAlias.ps1 rename to Tests/DisabledRules/AvoidUsingAlias.ps1 diff --git a/Tests/Rules/AvoidUsingAlias.tests.ps1 b/Tests/DisabledRules/AvoidUsingAlias.tests.ps1 similarity index 100% rename from Tests/Rules/AvoidUsingAlias.tests.ps1 rename to Tests/DisabledRules/AvoidUsingAlias.tests.ps1