Skip to content

Commit a4e2608

Browse files
author
Mikhail Arkhipov
committed
Improve linting of LHS expressions
1 parent e330f2e commit a4e2608

File tree

5 files changed

+17
-13
lines changed

5 files changed

+17
-13
lines changed

src/Analysis/Ast/Impl/Linting/UndefinedVariables/ExpressionWalker.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
using System.Linq;
1818
using Microsoft.Python.Analysis.Analyzer;
1919
using Microsoft.Python.Analysis.Types;
20-
using Microsoft.Python.Core;
2120
using Microsoft.Python.Core.Text;
2221
using Microsoft.Python.Parsing.Ast;
2322
using Microsoft.Python.Parsing.Extensions;

src/Analysis/Ast/Impl/Linting/UndefinedVariables/UndefinedVariablesWalker.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
namespace Microsoft.Python.Analysis.Linting.UndefinedVariables {
2727
internal sealed class UndefinedVariablesWalker : LinterWalker {
2828
private readonly List<DiagnosticsEntry> _diagnostics = new List<DiagnosticsEntry>();
29-
private bool _suppressDiagnostics;
3029

3130
public UndefinedVariablesWalker(IDocumentAnalysis analysis, IServiceContainer services)
3231
: base(analysis, services) { }
@@ -53,11 +52,9 @@ public override bool Walk(SuiteStatement node) {
5352
augs.Right?.Walk(new ExpressionWalker(this));
5453
break;
5554
case AssignmentStatement asst:
56-
_suppressDiagnostics = true;
57-
foreach (var lhs in asst.Left ?? Enumerable.Empty<Expression>()) {
55+
foreach (var lhs in asst.Left.MaybeEnumerate().Where(x => !(x is NameExpression))) {
5856
lhs?.Walk(new ExpressionWalker(this));
5957
}
60-
_suppressDiagnostics = false;
6158
asst.Right?.Walk(new ExpressionWalker(this));
6259
break;
6360
default:
@@ -73,12 +70,10 @@ public void ReportUndefinedVariable(NameExpression node) {
7370
ReportUndefinedVariable(node.Name, eval.GetLocation(node).Span);
7471
}
7572

76-
public void ReportUndefinedVariable(string name, SourceSpan span) {
77-
if (!_suppressDiagnostics) {
78-
_diagnostics.Add(new DiagnosticsEntry(
79-
Resources.UndefinedVariable.FormatInvariant(name),
80-
span, ErrorCodes.UndefinedVariable, Severity.Warning, DiagnosticSource.Linter));
81-
}
73+
private void ReportUndefinedVariable(string name, SourceSpan span) {
74+
_diagnostics.Add(new DiagnosticsEntry(
75+
Resources.UndefinedVariable.FormatInvariant(name),
76+
span, ErrorCodes.UndefinedVariable, Severity.Warning, DiagnosticSource.Linter));
8277
}
8378

8479
private void HandleGlobal(GlobalStatement node) {

src/Analysis/Ast/Test/LintNoSelfArgumentTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
using Microsoft.Python.Analysis.Diagnostics;
2020
using Microsoft.Python.Analysis.Tests.FluentAssertions;
2121
using Microsoft.Python.Core;
22-
using Microsoft.Python.Parsing.Tests;
2322
using Microsoft.VisualStudio.TestTools.UnitTesting;
2423
using TestUtilities;
2524

src/Analysis/Ast/Test/LintReturnInInitTests.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
using FluentAssertions;
1919
using Microsoft.Python.Analysis.Tests.FluentAssertions;
2020
using Microsoft.Python.Parsing;
21-
using Microsoft.Python.Parsing.Tests;
2221
using Microsoft.VisualStudio.TestTools.UnitTesting;
2322
using TestUtilities;
2423

src/Analysis/Ast/Test/LintUndefinedVarsTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,18 @@ public async Task AugmentedAssignToUndefined() {
832832
d[0].SourceSpan.Should().Be(2, 1, 2, 2);
833833
}
834834

835+
[TestMethod, Priority(0)]
836+
public async Task UndefinedInInit() {
837+
const string code = @"
838+
class TestIt():
839+
def __init__(self):
840+
slf.y = 6
841+
";
842+
var d = await LintAsync(code);
843+
d.Should().HaveCount(1);
844+
d[0].ErrorCode.Should().Be(ErrorCodes.UndefinedVariable);
845+
d[0].SourceSpan.Should().Be(4, 9, 4, 12);
846+
}
835847

836848
private async Task<IReadOnlyList<DiagnosticsEntry>> LintAsync(string code, InterpreterConfiguration configuration = null) {
837849
var analysis = await GetAnalysisAsync(code, configuration ?? PythonVersions.LatestAvailable3X);

0 commit comments

Comments
 (0)