diff --git a/src/Analysis/Ast/Impl/Linting/UndefinedVariables/ExpressionWalker.cs b/src/Analysis/Ast/Impl/Linting/UndefinedVariables/ExpressionWalker.cs index 011fe16f2..acbc8e35f 100644 --- a/src/Analysis/Ast/Impl/Linting/UndefinedVariables/ExpressionWalker.cs +++ b/src/Analysis/Ast/Impl/Linting/UndefinedVariables/ExpressionWalker.cs @@ -17,7 +17,6 @@ using System.Linq; using Microsoft.Python.Analysis.Analyzer; using Microsoft.Python.Analysis.Types; -using Microsoft.Python.Core; using Microsoft.Python.Core.Text; using Microsoft.Python.Parsing.Ast; using Microsoft.Python.Parsing.Extensions; diff --git a/src/Analysis/Ast/Impl/Linting/UndefinedVariables/UndefinedVariablesWalker.cs b/src/Analysis/Ast/Impl/Linting/UndefinedVariables/UndefinedVariablesWalker.cs index 42ac73bf0..b35fc280c 100644 --- a/src/Analysis/Ast/Impl/Linting/UndefinedVariables/UndefinedVariablesWalker.cs +++ b/src/Analysis/Ast/Impl/Linting/UndefinedVariables/UndefinedVariablesWalker.cs @@ -53,9 +53,13 @@ public override bool Walk(SuiteStatement node) { augs.Right?.Walk(new ExpressionWalker(this)); break; case AssignmentStatement asst: + var lhs = asst.Left.MaybeEnumerate().ToArray(); + if (lhs.Length > 0) { + lhs[0]?.Walk(new ExpressionWalker(this)); + } _suppressDiagnostics = true; - foreach (var lhs in asst.Left ?? Enumerable.Empty()) { - lhs?.Walk(new ExpressionWalker(this)); + foreach (var l in lhs.Skip(1)) { + l?.Walk(new ExpressionWalker(this)); } _suppressDiagnostics = false; asst.Right?.Walk(new ExpressionWalker(this)); @@ -73,7 +77,7 @@ public void ReportUndefinedVariable(NameExpression node) { ReportUndefinedVariable(node.Name, eval.GetLocation(node).Span); } - public void ReportUndefinedVariable(string name, SourceSpan span) { + private void ReportUndefinedVariable(string name, SourceSpan span) { if (!_suppressDiagnostics) { _diagnostics.Add(new DiagnosticsEntry( Resources.UndefinedVariable.FormatInvariant(name), diff --git a/src/Analysis/Ast/Test/LintNoSelfArgumentTests.cs b/src/Analysis/Ast/Test/LintNoSelfArgumentTests.cs index af7297e43..f3cd45970 100644 --- a/src/Analysis/Ast/Test/LintNoSelfArgumentTests.cs +++ b/src/Analysis/Ast/Test/LintNoSelfArgumentTests.cs @@ -19,7 +19,6 @@ using Microsoft.Python.Analysis.Diagnostics; using Microsoft.Python.Analysis.Tests.FluentAssertions; using Microsoft.Python.Core; -using Microsoft.Python.Parsing.Tests; using Microsoft.VisualStudio.TestTools.UnitTesting; using TestUtilities; diff --git a/src/Analysis/Ast/Test/LintReturnInInitTests.cs b/src/Analysis/Ast/Test/LintReturnInInitTests.cs index 4ae7626a2..8e7bee0ee 100644 --- a/src/Analysis/Ast/Test/LintReturnInInitTests.cs +++ b/src/Analysis/Ast/Test/LintReturnInInitTests.cs @@ -18,7 +18,6 @@ using FluentAssertions; using Microsoft.Python.Analysis.Tests.FluentAssertions; using Microsoft.Python.Parsing; -using Microsoft.Python.Parsing.Tests; using Microsoft.VisualStudio.TestTools.UnitTesting; using TestUtilities; diff --git a/src/Analysis/Ast/Test/LintUndefinedVarsTests.cs b/src/Analysis/Ast/Test/LintUndefinedVarsTests.cs index dec8c849a..a53ff5abb 100644 --- a/src/Analysis/Ast/Test/LintUndefinedVarsTests.cs +++ b/src/Analysis/Ast/Test/LintUndefinedVarsTests.cs @@ -832,6 +832,30 @@ public async Task AugmentedAssignToUndefined() { d[0].SourceSpan.Should().Be(2, 1, 2, 2); } + [TestMethod, Priority(0)] + public async Task UndefinedInInit() { + const string code = @" +class TestIt(): + def __init__(self): + slf.y = 6 +"; + var d = await LintAsync(code); + d.Should().HaveCount(1); + d[0].ErrorCode.Should().Be(ErrorCodes.UndefinedVariable); + d[0].SourceSpan.Should().Be(4, 9, 4, 12); + } + + [TestMethod, Priority(0)] + public async Task UndefinedIndex() { + const string code = @" +x = [1, 2] +x[y] = 1 +"; + var d = await LintAsync(code); + d.Should().HaveCount(1); + d[0].ErrorCode.Should().Be(ErrorCodes.UndefinedVariable); + d[0].SourceSpan.Should().Be(3, 3, 3, 4); + } private async Task> LintAsync(string code, InterpreterConfiguration configuration = null) { var analysis = await GetAnalysisAsync(code, configuration ?? PythonVersions.LatestAvailable3X);