Skip to content

Commit

Permalink
[red-knot] Use Unknown rather than Unbound for unresolved imports
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexWaygood committed Aug 16, 2024
1 parent a87b27c commit 1ccb31f
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 8 deletions.
6 changes: 5 additions & 1 deletion crates/red_knot_python_semantic/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ pub enum Type<'db> {
Any,
/// the empty set of values
Never,
/// unknown type (no annotation)
/// unknown type (either no annotation, or some kind of type error)
/// equivalent to Any, or possibly to object in strict mode
Unknown,
/// name does not exist or is not bound to any value (this represents an error, but with some
Expand Down Expand Up @@ -145,6 +145,10 @@ impl<'db> Type<'db> {
matches!(self, Type::Unbound)
}

pub const fn is_unknown(&self) -> bool {
matches!(self, Type::Unknown)
}

pub const fn is_never(&self) -> bool {
matches!(self, Type::Never)
}
Expand Down
10 changes: 5 additions & 5 deletions crates/red_knot_python_semantic/src/types/infer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -949,7 +949,7 @@ impl<'db> TypeInferenceBuilder<'db> {
fn module_ty_from_name(&self, module_name: Option<ModuleName>) -> Type<'db> {
module_name
.and_then(|module_name| resolve_module(self.db, module_name))
.map_or(Type::Unbound, |module| Type::Module(module.file()))
.map_or(Type::Unknown, |module| Type::Module(module.file()))
}

fn infer_decorator(&mut self, decorator: &ast::Decorator) -> Type<'db> {
Expand Down Expand Up @@ -1783,7 +1783,7 @@ mod tests {
("src/package/bar.py", "from .foo import X"),
])?;

assert_public_ty(&db, "src/package/bar.py", "X", "Unbound");
assert_public_ty(&db, "src/package/bar.py", "X", "Unknown");

Ok(())
}
Expand Down Expand Up @@ -1821,7 +1821,7 @@ mod tests {
fn follow_nonexistent_relative_import_bare_to_package() -> anyhow::Result<()> {
let mut db = setup_db();
db.write_files([("src/package/bar.py", "from . import X")])?;
assert_public_ty(&db, "src/package/bar.py", "X", "Unbound");
assert_public_ty(&db, "src/package/bar.py", "X", "Unknown");
Ok(())
}

Expand Down Expand Up @@ -1851,7 +1851,7 @@ mod tests {
("src/package/bar.py", "from . import foo"),
])?;

assert_public_ty(&db, "src/package/bar.py", "foo", "Unbound");
assert_public_ty(&db, "src/package/bar.py", "foo", "Unknown");

Ok(())
}
Expand All @@ -1874,7 +1874,7 @@ mod tests {
fn follow_nonexistent_relative_import_from_dunder_init() -> anyhow::Result<()> {
let mut db = setup_db();
db.write_files([("src/package/__init__.py", "from .foo import X")])?;
assert_public_ty(&db, "src/package/__init__.py", "X", "Unbound");
assert_public_ty(&db, "src/package/__init__.py", "X", "Unknown");
Ok(())
}

Expand Down
4 changes: 2 additions & 2 deletions crates/red_knot_workspace/src/lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ fn lint_unresolved_imports(context: &SemanticLintContext, import: AnyImportRef)
for alias in &import.names {
let ty = alias.ty(&context.semantic);

if ty.is_unbound() {
if ty.is_unknown() {
context.push_diagnostic(format_diagnostic(
context,
&format!("Unresolved import '{}'", &alias.name),
Expand All @@ -142,7 +142,7 @@ fn lint_unresolved_imports(context: &SemanticLintContext, import: AnyImportRef)
for alias in &import.names {
let ty = alias.ty(&context.semantic);

if ty.is_unbound() {
if ty.is_unknown() {
context.push_diagnostic(format_diagnostic(
context,
&format!("Unresolved import '{}'", &alias.name),
Expand Down

0 comments on commit 1ccb31f

Please sign in to comment.