Skip to content
This repository was archived by the owner on Nov 4, 2024. It is now read-only.

Commit 247a8c3

Browse files
author
MikhailArkhipov
committed
Fix tests
1 parent 67fed10 commit 247a8c3

File tree

3 files changed

+56
-15
lines changed

3 files changed

+56
-15
lines changed

src/Analysis/Ast/Impl/Analyzer/Handlers/FromImportHandler.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,16 @@ public bool HandleFromImport(FromImportStatement node) {
4040
}
4141
}
4242

43-
FindModule(node.Root, null, node.ForceAbsolute, out var firstModule, out var lastModule, out _, out var imports);
44-
AssignVariables(node, imports, lastModule);
43+
if(node.Root is RelativeModuleName) {
44+
var imports = ModuleResolution.CurrentPathResolver.FindImports(Module.FilePath, node);
45+
if (HandleImportSearchResult(imports, null, null, node.Root, out var variableModule)) {
46+
AssignVariables(node, imports, variableModule);
47+
}
48+
} else {
49+
FindModuleByAbsoluteName(node.Root, null, node.ForceAbsolute, out _, out var module, out _, out var imports);
50+
AssignVariables(node, imports, module);
51+
}
52+
4553
return false;
4654
}
4755

src/Analysis/Ast/Impl/Analyzer/Handlers/ImportHandler.cs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,19 @@ public bool HandleImport(ImportStatement node) {
4949
return false;
5050
}
5151

52-
private void FindModule(ModuleName moduleImportExpression, NameExpression asNameExpression, bool forceAbsolute,
52+
private void HandleImport(ModuleName moduleImportExpression, NameExpression asNameExpression, bool forceAbsolute) {
53+
FindModuleByAbsoluteName(moduleImportExpression, asNameExpression, forceAbsolute, out var firstModule, out var lastModule, out var importNames, out _);
54+
// "import fob.oar.baz as baz" is handled as baz = import_module('fob.oar.baz')
55+
// "import fob.oar.baz" is handled as fob = import_module('fob')
56+
if (!string.IsNullOrEmpty(asNameExpression?.Name) && lastModule != default) {
57+
Eval.DeclareVariable(asNameExpression.Name, lastModule, VariableSource.Import, asNameExpression);
58+
} else if (firstModule != default && !string.IsNullOrEmpty(importNames[0])) {
59+
var firstName = moduleImportExpression.Names[0];
60+
Eval.DeclareVariable(importNames[0], firstModule, VariableSource.Import, firstName);
61+
}
62+
}
63+
64+
private void FindModuleByAbsoluteName(ModuleName moduleImportExpression, NameExpression asNameExpression, bool forceAbsolute,
5365
out PythonVariableModule firstModule, out PythonVariableModule lastModule, out ImmutableArray<string> importNames, out IImportSearchResult imports) {
5466
// "import fob.oar.baz" means
5567
// import_module('fob')
@@ -73,18 +85,6 @@ private void FindModule(ModuleName moduleImportExpression, NameExpression asName
7385
}
7486
}
7587

76-
private void HandleImport(ModuleName moduleImportExpression, NameExpression asNameExpression, bool forceAbsolute) {
77-
FindModule(moduleImportExpression, asNameExpression, forceAbsolute, out var firstModule, out var lastModule, out var importNames, out _);
78-
// "import fob.oar.baz as baz" is handled as baz = import_module('fob.oar.baz')
79-
// "import fob.oar.baz" is handled as fob = import_module('fob')
80-
if (!string.IsNullOrEmpty(asNameExpression?.Name) && lastModule != default) {
81-
Eval.DeclareVariable(asNameExpression.Name, lastModule, VariableSource.Import, asNameExpression);
82-
} else if (firstModule != default && !string.IsNullOrEmpty(importNames[0])) {
83-
var firstName = moduleImportExpression.Names[0];
84-
Eval.DeclareVariable(importNames[0], firstModule, VariableSource.Import, firstName);
85-
}
86-
}
87-
8888
private bool HandleImportSearchResult(in IImportSearchResult imports, in PythonVariableModule parent, in NameExpression asNameExpression, in Node location, out PythonVariableModule variableModule) {
8989
switch (imports) {
9090
case ModuleImport moduleImport when Module.ModuleType == ModuleType.Stub && moduleImport.FullName == Module.Name:
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright(c) Microsoft Corporation
2+
// All rights reserved.
3+
//
4+
// Licensed under the Apache License, Version 2.0 (the License); you may not use
5+
// this file except in compliance with the License. You may obtain a copy of the
6+
// License at http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS
9+
// OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY
10+
// IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
11+
// MERCHANTABILITY OR NON-INFRINGEMENT.
12+
//
13+
// See the Apache Version 2.0 License for specific language governing
14+
// permissions and limitations under the License.
15+
16+
using Microsoft.Python.Parsing.Ast;
17+
18+
namespace Microsoft.Python.Analysis.Core.DependencyResolution {
19+
public static class PathResolverExtensions {
20+
/// <summary>
21+
/// Given module file path and module name expression locates the module.
22+
/// Module name expression can be absolute or relative. <see cref="ModuleName"/>
23+
/// and <see cref="RelativeModuleName"/>.
24+
/// </summary>
25+
/// <returns></returns>
26+
public static IImportSearchResult FindImports(this PathResolverSnapshot pathResolver, string modulePath, ModuleName moduleImportExpression, bool forceAbsolute) {
27+
var rootNames = moduleImportExpression.Names.Select(n => n.Name);
28+
return moduleImportExpression is RelativeModuleName relativeName
29+
? pathResolver.GetImportsFromRelativePath(modulePath, relativeName.DotCount, rootNames)
30+
: pathResolver.GetImportsFromAbsoluteName(modulePath, rootNames, forceAbsolute);
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)