Skip to content

Commit

Permalink
Move visibility module into ast crate (#3367)
Browse files Browse the repository at this point in the history
  • Loading branch information
charliermarsh committed Mar 6, 2023
1 parent e1ebd91 commit 694d418
Show file tree
Hide file tree
Showing 16 changed files with 59 additions and 61 deletions.
2 changes: 1 addition & 1 deletion crates/ruff/src/ast/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ use ruff_python_stdlib::typing::TYPING_EXTENSIONS;

use crate::ast::helpers::{collect_call_path, from_relative_import, Exceptions};
use crate::ast::types::{Binding, BindingKind, CallPath, ExecutionContext, RefEquality, Scope};
use crate::ast::visibility::{module_visibility, Modifier, VisibleScope};
use crate::resolver::is_interface_definition_path;
use crate::visibility::{module_visibility, Modifier, VisibleScope};

#[allow(clippy::struct_excessive_bools)]
pub struct Context<'a> {
Expand Down
1 change: 1 addition & 0 deletions crates/ruff/src/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ pub mod relocate;
pub mod strings;
pub mod types;
pub mod typing;
pub mod visibility;
pub mod visitor;
pub mod whitespace;
Original file line number Diff line number Diff line change
@@ -1,14 +1,10 @@
//! Abstractions for tracking public and private visibility across modules,
//! classes, and functions.

use std::path::Path;

use rustpython_parser::ast::{Expr, Stmt, StmtKind};

use crate::ast::context::Context;
use crate::ast::helpers::{collect_call_path, map_callable};
use crate::ast::types::CallPath;
use crate::docstrings::definition::Documentable;

#[derive(Debug, Clone)]
pub enum Modifier {
Expand Down Expand Up @@ -159,7 +155,7 @@ pub fn module_visibility(path: &Path) -> Visibility {
Visibility::Public
}

fn function_visibility(stmt: &Stmt) -> Visibility {
pub fn function_visibility(stmt: &Stmt) -> Visibility {
match &stmt.node {
StmtKind::FunctionDef { name, .. } | StmtKind::AsyncFunctionDef { name, .. } => {
if name.starts_with('_') {
Expand All @@ -172,7 +168,7 @@ fn function_visibility(stmt: &Stmt) -> Visibility {
}
}

fn method_visibility(stmt: &Stmt) -> Visibility {
pub fn method_visibility(stmt: &Stmt) -> Visibility {
match &stmt.node {
StmtKind::FunctionDef {
name,
Expand Down Expand Up @@ -209,7 +205,7 @@ fn method_visibility(stmt: &Stmt) -> Visibility {
}
}

fn class_visibility(stmt: &Stmt) -> Visibility {
pub fn class_visibility(stmt: &Stmt) -> Visibility {
match &stmt.node {
StmtKind::ClassDef { name, .. } => {
if name.starts_with('_') {
Expand All @@ -221,40 +217,3 @@ fn class_visibility(stmt: &Stmt) -> Visibility {
_ => panic!("Found non-ClassDef in function_visibility"),
}
}

/// Transition a `VisibleScope` based on a new `Documentable` definition.
///
/// `scope` is the current `VisibleScope`, while `Documentable` and `Stmt`
/// describe the current node used to modify visibility.
pub fn transition_scope(scope: &VisibleScope, stmt: &Stmt, kind: &Documentable) -> VisibleScope {
match kind {
Documentable::Function => VisibleScope {
modifier: Modifier::Function,
visibility: match scope {
VisibleScope {
modifier: Modifier::Module,
visibility: Visibility::Public,
} => function_visibility(stmt),
VisibleScope {
modifier: Modifier::Class,
visibility: Visibility::Public,
} => method_visibility(stmt),
_ => Visibility::Private,
},
},
Documentable::Class => VisibleScope {
modifier: Modifier::Class,
visibility: match scope {
VisibleScope {
modifier: Modifier::Module,
visibility: Visibility::Public,
} => class_visibility(stmt),
VisibleScope {
modifier: Modifier::Class,
visibility: Visibility::Public,
} => class_visibility(stmt),
_ => Visibility::Private,
},
},
}
}
2 changes: 1 addition & 1 deletion crates/ruff/src/checkers/ast/deferred.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use rustpython_parser::ast::{Expr, Stmt};

use crate::ast::types::RefEquality;
use crate::ast::visibility::{Visibility, VisibleScope};
use crate::checkers::ast::AnnotationContext;
use crate::docstrings::definition::Definition;
use crate::visibility::{Visibility, VisibleScope};
use crate::Range;

type Context<'a> = (Vec<usize>, Vec<RefEquality<'a, Stmt>>);
Expand Down
9 changes: 5 additions & 4 deletions crates/ruff/src/checkers/ast/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ use crate::ast::types::{
};
use crate::ast::typing::{match_annotated_subscript, Callable, SubscriptKind};
use crate::ast::visitor::{walk_excepthandler, walk_pattern, Visitor};
use crate::ast::{branch_detection, cast, helpers, operations, typing, visitor};
use crate::ast::{branch_detection, cast, helpers, operations, typing, visibility, visitor};
use crate::checkers::ast::deferred::Deferred;
use crate::docstrings::definition::{Definition, DefinitionKind, Docstring, Documentable};
use crate::docstrings::definition::{
transition_scope, Definition, DefinitionKind, Docstring, Documentable,
};
use crate::registry::{Diagnostic, Rule};
use crate::resolver::is_interface_definition_path;
use crate::rules::{
Expand All @@ -42,8 +44,7 @@ use crate::rules::{
use crate::settings::types::PythonVersion;
use crate::settings::{flags, Settings};
use crate::source_code::{Indexer, Locator, Stylist};
use crate::visibility::transition_scope;
use crate::{ast, autofix, docstrings, noqa, visibility};
use crate::{ast, autofix, docstrings, noqa};

mod deferred;

Expand Down
36 changes: 36 additions & 0 deletions crates/ruff/src/docstrings/definition.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
use crate::ast::visibility::{
class_visibility, function_visibility, method_visibility, Modifier, Visibility, VisibleScope,
};
use rustpython_parser::ast::{Expr, Stmt};

#[derive(Debug, Clone)]
Expand Down Expand Up @@ -30,3 +33,36 @@ pub enum Documentable {
Class,
Function,
}

pub fn transition_scope(scope: &VisibleScope, stmt: &Stmt, kind: &Documentable) -> VisibleScope {
match kind {
Documentable::Function => VisibleScope {
modifier: Modifier::Function,
visibility: match scope {
VisibleScope {
modifier: Modifier::Module,
visibility: Visibility::Public,
} => function_visibility(stmt),
VisibleScope {
modifier: Modifier::Class,
visibility: Visibility::Public,
} => method_visibility(stmt),
_ => Visibility::Private,
},
},
Documentable::Class => VisibleScope {
modifier: Modifier::Class,
visibility: match scope {
VisibleScope {
modifier: Modifier::Module,
visibility: Visibility::Public,
} => class_visibility(stmt),
VisibleScope {
modifier: Modifier::Class,
visibility: Visibility::Public,
} => class_visibility(stmt),
_ => Visibility::Private,
},
},
}
}
2 changes: 1 addition & 1 deletion crates/ruff/src/docstrings/extraction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

use rustpython_parser::ast::{Constant, Expr, ExprKind, Stmt, StmtKind};

use crate::ast::visibility::{Modifier, VisibleScope};
use crate::docstrings::definition::{Definition, DefinitionKind, Documentable};
use crate::visibility::{Modifier, VisibleScope};

/// Extract a docstring from a function or class body.
pub fn docstring_from(suite: &[Stmt]) -> Option<&Expr> {
Expand Down
1 change: 0 additions & 1 deletion crates/ruff/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ mod rules;
pub mod settings;
pub mod source_code;
mod violation;
mod visibility;

cfg_if! {
if #[cfg(target_family = "wasm")] {
Expand Down
2 changes: 1 addition & 1 deletion crates/ruff/src/rules/flake8_annotations/helpers.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
use rustpython_parser::ast::{Arguments, Expr, Stmt, StmtKind};

use crate::ast::cast;
use crate::ast::visibility;
use crate::checkers::ast::Checker;
use crate::docstrings::definition::{Definition, DefinitionKind};
use crate::visibility;

pub(super) fn match_function_def(
stmt: &Stmt,
Expand Down
4 changes: 2 additions & 2 deletions crates/ruff/src/rules/flake8_annotations/rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ use super::fixes;
use super::helpers::match_function_def;
use crate::ast::helpers::ReturnStatementVisitor;
use crate::ast::types::Range;
use crate::ast::visibility;
use crate::ast::visibility::Visibility;
use crate::ast::visitor::Visitor;
use crate::ast::{cast, helpers};
use crate::checkers::ast::Checker;
use crate::docstrings::definition::{Definition, DefinitionKind};
use crate::registry::{Diagnostic, Rule};
use crate::violation::{AlwaysAutofixableViolation, Violation};
use crate::visibility;
use crate::visibility::Visibility;

/// ## What it does
/// Checks that function arguments have type annotations.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@ use ruff_macros::{derive_message_formats, violation};
use rustpython_parser::ast::{Constant, Expr, ExprKind, Keyword, Stmt, StmtKind};

use crate::ast::types::Range;
use crate::ast::visibility::{is_abstract, is_overload};
use crate::checkers::ast::Checker;
use crate::registry::{Diagnostic, Rule};
use crate::violation::Violation;
use crate::visibility::{is_abstract, is_overload};

#[violation]
pub struct AbstractBaseClassWithoutAbstractMethod {
Expand Down
2 changes: 1 addition & 1 deletion crates/ruff/src/rules/flake8_unused_arguments/rules.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ use super::types::Argumentable;
use crate::ast::function_type;
use crate::ast::function_type::FunctionType;
use crate::ast::types::{Binding, FunctionDef, Lambda, Scope, ScopeKind};
use crate::ast::visibility;
use crate::checkers::ast::Checker;
use crate::registry::Diagnostic;
use crate::violation::Violation;
use crate::visibility;

#[violation]
pub struct UnusedFunctionArgument {
Expand Down
2 changes: 1 addition & 1 deletion crates/ruff/src/rules/pydocstyle/rules/if_needed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ use ruff_macros::{derive_message_formats, violation};

use crate::ast::cast;
use crate::ast::helpers::identifier_range;
use crate::ast::visibility::is_overload;
use crate::checkers::ast::Checker;
use crate::docstrings::definition::{DefinitionKind, Docstring};
use crate::registry::Diagnostic;
use crate::violation::Violation;
use crate::visibility::is_overload;

#[violation]
pub struct OverloadWithDocstring;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ use ruff_macros::{derive_message_formats, violation};
use crate::ast::cast;
use crate::ast::helpers::to_call_path;
use crate::ast::types::{CallPath, Range};
use crate::ast::visibility::{is_property, is_test};
use crate::checkers::ast::Checker;
use crate::docstrings::definition::{DefinitionKind, Docstring};
use crate::registry::Diagnostic;
use crate::rules::pydocstyle::helpers::normalize_word;
use crate::violation::Violation;
use crate::visibility::{is_property, is_test};

static MOOD: Lazy<Mood> = Lazy::new(Mood::new);

Expand Down
4 changes: 3 additions & 1 deletion crates/ruff/src/rules/pydocstyle/rules/not_missing.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ use ruff_macros::{derive_message_formats, violation};
use crate::ast::cast;
use crate::ast::helpers::identifier_range;
use crate::ast::types::Range;
use crate::ast::visibility::{
is_call, is_init, is_magic, is_new, is_overload, is_override, Visibility,
};
use crate::checkers::ast::Checker;
use crate::docstrings::definition::{Definition, DefinitionKind};
use crate::message::Location;
use crate::registry::{Diagnostic, Rule};
use crate::violation::Violation;
use crate::visibility::{is_call, is_init, is_magic, is_new, is_overload, is_override, Visibility};

#[violation]
pub struct PublicModule;
Expand Down
2 changes: 1 addition & 1 deletion crates/ruff/src/rules/pydocstyle/rules/sections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use ruff_macros::{derive_message_formats, violation};

use crate::ast::helpers::identifier_range;
use crate::ast::types::Range;
use crate::ast::visibility::is_staticmethod;
use crate::ast::whitespace::LinesWithTrailingNewline;
use crate::ast::{cast, whitespace};
use crate::checkers::ast::Checker;
Expand All @@ -19,7 +20,6 @@ use crate::message::Location;
use crate::registry::{Diagnostic, Rule};
use crate::rules::pydocstyle::settings::Convention;
use crate::violation::{AlwaysAutofixableViolation, Violation};
use crate::visibility::is_staticmethod;

#[violation]
pub struct SectionNotOverIndented {
Expand Down

0 comments on commit 694d418

Please sign in to comment.