Skip to content

Commit a5101d0

Browse files
David ReynoldsDavid Reynolds
authored andcommitted
Updated AvoidGlobalAliases rule to use StaticParameterBinder
1 parent da1190b commit a5101d0

File tree

1 file changed

+11
-123
lines changed

1 file changed

+11
-123
lines changed

Rules/AvoidGlobalAliases.cs

Lines changed: 11 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -49,55 +49,23 @@ public IEnumerable<DiagnosticRecord> AnalyzeScript(Ast ast, string fileName)
4949
/// <returns>AstVisitAction to continue to analyze the ast's children</returns>
5050
public override AstVisitAction VisitCommand(CommandAst commandAst)
5151
{
52-
if (!IsNewAliasCmdlet(commandAst))
52+
if (IsNewAliasCmdlet(commandAst))
5353
{
54-
return AstVisitAction.SkipChildren;
55-
}
56-
57-
return AstVisitAction.Continue;
58-
}
59-
60-
/// <summary>
61-
/// Analyzes a CommandParameterAst for the global scope.
62-
/// </summary>
63-
/// <param name="commandParameterAst">The CommandParameterAst to be analyzed</param>
64-
/// <returns>AstVisitAction to skip child ast processing after creating any diagnostic records</returns>
65-
public override AstVisitAction VisitCommandParameter(CommandParameterAst commandParameterAst)
66-
{
67-
if (IsScopeParameterForNewAliasCmdlet(commandParameterAst))
68-
{
69-
// Check the commandParameterAst Argument property if it exist. This covers the case
70-
// of the cmdlet looking like "New-Alias -Scope:Global"
54+
// check the parameters of the New-Alias cmdlet for scope
55+
var parameterBindings = StaticParameterBinder.BindCommand(commandAst);
7156

72-
if ((commandParameterAst.Argument != null)
73-
&& (commandParameterAst.Argument.ToString().Equals("Global", StringComparison.OrdinalIgnoreCase)))
57+
if (parameterBindings.BoundParameters.ContainsKey("Scope"))
7458
{
75-
records.Add(new DiagnosticRecord(
76-
string.Format(CultureInfo.CurrentCulture, Strings.AvoidGlobalAliasesError),
77-
commandParameterAst.Extent,
78-
GetName(),
79-
DiagnosticSeverity.Warning,
80-
fileName,
81-
commandParameterAst.ParameterName));
82-
}
83-
else
84-
{
85-
// If the commandParameterAst Argument property is null the next ast in the tree
86-
// can still be a string const. This covers the case of the cmdlet looking like
87-
// "New-Alias -Scope Global"
59+
var scopeValue = parameterBindings.BoundParameters["Scope"].ConstantValue;
8860

89-
var nextAst = FindNextAst(commandParameterAst) as StringConstantExpressionAst;
90-
91-
if ((nextAst != null)
92-
&& ((nextAst).Value.ToString().Equals("Global", StringComparison.OrdinalIgnoreCase)))
61+
if ((scopeValue != null) && (scopeValue.ToString().Equals("Global", StringComparison.OrdinalIgnoreCase)))
9362
{
9463
records.Add(new DiagnosticRecord(
95-
string.Format(CultureInfo.CurrentCulture, Strings.AvoidGlobalAliasesError),
96-
(nextAst).Extent,
97-
GetName(),
98-
DiagnosticSeverity.Warning,
99-
fileName,
100-
(nextAst).Value));
64+
string.Format(CultureInfo.CurrentCulture, Strings.AvoidGlobalAliasesError),
65+
commandAst.Extent,
66+
GetName(),
67+
DiagnosticSeverity.Warning,
68+
fileName));
10169
}
10270
}
10371
}
@@ -106,86 +74,6 @@ public override AstVisitAction VisitCommandParameter(CommandParameterAst command
10674
}
10775
#endregion
10876

109-
/// <summary>
110-
/// Returns the next ast of the same level in the ast tree.
111-
/// </summary>
112-
/// <param name="ast">Ast used as a base</param>
113-
/// <returns>Next ast of the same level in the ast tree</returns>
114-
private Ast FindNextAst(Ast ast)
115-
{
116-
IEnumerable<Ast> matchingLevelAsts = ast.Parent.FindAll(item => item is Ast, true);
117-
118-
Ast currentClosest = null;
119-
foreach (var matchingLevelAst in matchingLevelAsts)
120-
{
121-
if (currentClosest == null)
122-
{
123-
if (IsAstAfter(ast, matchingLevelAst))
124-
{
125-
currentClosest = matchingLevelAst;
126-
}
127-
}
128-
else
129-
{
130-
if ((IsAstAfter(ast, matchingLevelAst)) && (IsAstAfter(matchingLevelAst, currentClosest)))
131-
{
132-
currentClosest = matchingLevelAst;
133-
}
134-
}
135-
}
136-
137-
return currentClosest;
138-
}
139-
140-
/// <summary>
141-
/// Determines if ast1 is after ast2 in the ast tree.
142-
/// </summary>
143-
/// <param name="ast1">First ast</param>
144-
/// <param name="ast2">Second ast</param>
145-
/// <returns>True if ast2 is after ast1 in the ast tree</returns>
146-
private bool IsAstAfter(Ast ast1, Ast ast2)
147-
{
148-
if (ast1.Extent.EndLineNumber > ast2.Extent.StartLineNumber) // ast1 ends on a line after ast2 starts
149-
{
150-
return false;
151-
}
152-
else if (ast1.Extent.EndLineNumber == ast2.Extent.StartLineNumber)
153-
{
154-
if (ast2.Extent.StartColumnNumber > ast1.Extent.EndColumnNumber)
155-
{
156-
return true;
157-
}
158-
else
159-
{
160-
return false;
161-
}
162-
}
163-
else // ast2 starts on a line after ast 1 ends
164-
{
165-
return true;
166-
}
167-
}
168-
169-
/// <summary>
170-
/// Determines if CommandParameterAst is for the "Scope" parameter.
171-
/// </summary>
172-
/// <param name="commandParameterAst">CommandParameterAst to validate</param>
173-
/// <returns>True if the CommandParameterAst is for the Scope parameter</returns>
174-
private bool IsScopeParameterForNewAliasCmdlet(CommandParameterAst commandParameterAst)
175-
{
176-
if (commandParameterAst == null || commandParameterAst.ParameterName == null)
177-
{
178-
return false;
179-
}
180-
181-
if (commandParameterAst.ParameterName.Equals("Scope", StringComparison.OrdinalIgnoreCase))
182-
{
183-
return true;
184-
}
185-
186-
return false;
187-
}
188-
18977
/// <summary>
19078
/// Determines if CommandAst is for the "New-Alias" command, checking aliases.
19179
/// </summary>

0 commit comments

Comments
 (0)