diff --git a/src/Analysis/Engine/Impl/ModuleAnalysis.cs b/src/Analysis/Engine/Impl/ModuleAnalysis.cs index 0719bb350..fcce13caf 100644 --- a/src/Analysis/Engine/Impl/ModuleAnalysis.cs +++ b/src/Analysis/Engine/Impl/ModuleAnalysis.cs @@ -294,15 +294,23 @@ private VariablesResult GetVariablesFromNameExpression(Expression expr, Analysis mainDefinition = mainDefinition ?? definitions.FirstOrDefault(); if (mainDefinition != null) { // Drop definitions in outer scopes and convert those in inner scopes to references. + // Exception is when variable is an import as in + // abc = 1 + // import abc + var imports = definitions + .Where(d => d.Variable.Variable.Types.Any(t => t.TypeId == BuiltinTypeId.Module) && d.Location.DocumentUri != DocumentUri) + .ToArray(); + // Scope levels are numbered in reverse (X == main definition level, x+1 == one up). var defsToRefs = definitions + .Except(imports) .Where(d => d != mainDefinition && d.ScopeLevel <= mainDefinition.ScopeLevel) .Select(v => new VariableScopePair(new AnalysisVariable(v.Variable.Variable, VariableType.Reference, v.Location), v.ScopeLevel)); var others = variables .Where(v => (v.VariableType == VariableType.Reference || v.VariableType == VariableType.Value) && v.ScopeLevel <= mainDefinition.ScopeLevel); - variables = new[] { mainDefinition }.Concat(others.Concat(defsToRefs)); + variables = new[] { mainDefinition }.Concat(imports).Concat(others.Concat(defsToRefs)); } return new VariablesResult(variables.Select(v => v.Variable), unit.Tree); diff --git a/src/Analysis/Engine/Test/AnalysisTest.cs b/src/Analysis/Engine/Test/AnalysisTest.cs index 1cc5556ae..f147134bb 100644 --- a/src/Analysis/Engine/Test/AnalysisTest.cs +++ b/src/Analysis/Engine/Test/AnalysisTest.cs @@ -27,7 +27,6 @@ using Microsoft.Python.UnitTests.Core.MSTest; using Microsoft.PythonTools.Analysis; using Microsoft.PythonTools.Analysis.FluentAssertions; -using Microsoft.PythonTools.Analysis.Infrastructure; using Microsoft.PythonTools.Analysis.Values; using Microsoft.PythonTools.Interpreter; using Microsoft.PythonTools.Interpreter.Ast; @@ -2936,7 +2935,6 @@ print abc } [TestMethod, Priority(0)] - [Ignore("https://github.com/Microsoft/python-language-server/issues/40")] public async Task References_GrammarTest_Statements() { using (var server = await CreateServerAsync(PythonVersions.LatestAvailable2X)) { var uri = TestData.GetDefaultModuleUri(); @@ -2992,12 +2990,19 @@ print abc await server.SendDidOpenTextDocument(uri, text); var references = await server.SendFindReferences(uri, 3, 12); + + // External module 'abc', URI varies depending on install + var externalUri = references[1].uri; + externalUri.LocalPath.Should().EndWith("abc.py"); + references.Should().OnlyHaveReferences( (uri, (1, 6, 1, 9), ReferenceKind.Definition), + (externalUri, (0, 0, 0, 0), ReferenceKind.Definition), + (uri, (3, 11, 3, 14), ReferenceKind.Reference), - (uri, (6, 22, 6, 25), ReferenceKind.Definition), + (uri, (6, 22, 6, 25), ReferenceKind.Reference), - (uri, (8, 4, 8, 7), ReferenceKind.Definition), + (uri, (8, 4, 8, 7), ReferenceKind.Reference), (uri, (9, 4, 9, 7), ReferenceKind.Reference), (uri, (10, 4, 10, 7), ReferenceKind.Reference), (uri, (11, 4, 11, 7), ReferenceKind.Reference), diff --git a/src/Analysis/Engine/Test/AstAnalysisTests.cs b/src/Analysis/Engine/Test/AstAnalysisTests.cs index c1ce42743..2cb4d82c5 100644 --- a/src/Analysis/Engine/Test/AstAnalysisTests.cs +++ b/src/Analysis/Engine/Test/AstAnalysisTests.cs @@ -726,7 +726,6 @@ public async Task FullStdLibV37() { [TestMethod, TestCategory("60s"), Priority(0)] - [Ignore("https://github.com/Microsoft/python-language-server/issues/64")] public async Task FullStdLibV36() { var v = PythonVersions.Python36 ?? PythonVersions.Python36_x64; await FullStdLibTest(v);