Use lazy initialization for SourceCodeLocator (#472)

This commit is contained in:
Charlie Marsh 2022-10-26 11:27:48 -04:00 committed by GitHub
parent 2679db1d10
commit 4beea0484a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 112 additions and 94 deletions

View file

@ -161,12 +161,12 @@ pub fn blank_before_after_function(checker: &mut Checker, definition: &Definitio
..
} = &docstring.node
{
let (before, _, after) = checker.locator.partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
if checker.settings.enabled.contains(&CheckCode::D201) {
let (before, _, _) = checker.get_locator().partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
let blank_lines_before = before
.lines()
.rev()
@ -178,7 +178,7 @@ pub fn blank_before_after_function(checker: &mut Checker, definition: &Definitio
CheckKind::NoBlankLineBeforeFunction(blank_lines_before),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete the blank line before the docstring.
check.amend(Fix::deletion(
Location::new(docstring.location.row() - blank_lines_before, 1),
@ -190,6 +190,11 @@ pub fn blank_before_after_function(checker: &mut Checker, definition: &Definitio
}
if checker.settings.enabled.contains(&CheckCode::D202) {
let (_, _, after) = checker.get_locator().partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
let all_blank_after = after
.lines()
.skip(1)
@ -216,7 +221,7 @@ pub fn blank_before_after_function(checker: &mut Checker, definition: &Definitio
CheckKind::NoBlankLineAfterFunction(blank_lines_after),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete the blank line after the docstring.
check.amend(Fix::deletion(
Location::new(
@ -245,14 +250,14 @@ pub fn blank_before_after_class(checker: &mut Checker, definition: &Definition)
..
} = &docstring.node
{
let (before, _, after) = checker.locator.partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
if checker.settings.enabled.contains(&CheckCode::D203)
|| checker.settings.enabled.contains(&CheckCode::D211)
{
let (before, _, _) = checker.get_locator().partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
let blank_lines_before = before
.lines()
.rev()
@ -265,7 +270,7 @@ pub fn blank_before_after_class(checker: &mut Checker, definition: &Definition)
CheckKind::NoBlankLineBeforeClass(blank_lines_before),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete the blank line before the class.
check.amend(Fix::deletion(
Location::new(docstring.location.row() - blank_lines_before, 1),
@ -281,7 +286,7 @@ pub fn blank_before_after_class(checker: &mut Checker, definition: &Definition)
CheckKind::OneBlankLineBeforeClass(blank_lines_before),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Insert one blank line before the class.
check.amend(Fix::replacement(
"\n".to_string(),
@ -295,6 +300,11 @@ pub fn blank_before_after_class(checker: &mut Checker, definition: &Definition)
}
if checker.settings.enabled.contains(&CheckCode::D204) {
let (_, _, after) = checker.get_locator().partition_source_code_at(
&Range::from_located(parent),
&Range::from_located(docstring),
);
let all_blank_after = after
.lines()
.skip(1)
@ -313,7 +323,7 @@ pub fn blank_before_after_class(checker: &mut Checker, definition: &Definition)
CheckKind::OneBlankLineAfterClass(blank_lines_after),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Insert a blank line before the class (replacing any existing lines).
check.amend(Fix::replacement(
"\n".to_string(),
@ -355,7 +365,7 @@ pub fn blank_after_summary(checker: &mut Checker, definition: &Definition) {
CheckKind::BlankLineAfterSummary,
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Insert one blank line after the summary (replacing any existing lines).
check.amend(Fix::replacement(
"\n".to_string(),
@ -414,7 +424,7 @@ pub fn indent(checker: &mut Checker, definition: &Definition) {
end_location: Location::new(docstring.location.row() + i, 1),
},
);
if checker.autofix.enabled() {
if checker.patch() {
check.amend(Fix::replacement(
helpers::clean(&docstring_indent),
Location::new(docstring.location.row() + i, 1),
@ -463,7 +473,7 @@ pub fn indent(checker: &mut Checker, definition: &Definition) {
end_location: Location::new(docstring.location.row() + i, 1),
},
);
if checker.autofix.enabled() {
if checker.patch() {
check.amend(Fix::replacement(
helpers::clean(&docstring_indent),
Location::new(docstring.location.row() + i, 1),
@ -490,7 +500,7 @@ pub fn indent(checker: &mut Checker, definition: &Definition) {
end_location: Location::new(docstring.location.row() + i, 1),
},
);
if checker.autofix.enabled() {
if checker.patch() {
check.amend(Fix::replacement(
helpers::clean(&docstring_indent),
Location::new(docstring.location.row() + i, 1),
@ -520,7 +530,7 @@ pub fn newline_after_last_paragraph(checker: &mut Checker, definition: &Definiti
}
if line_count > 1 {
let content = checker
.locator
.get_locator()
.slice_source_code_range(&Range::from_located(docstring));
if let Some(last_line) = content.lines().last().map(|line| line.trim()) {
if last_line != "\"\"\"" && last_line != "'''" {
@ -528,7 +538,7 @@ pub fn newline_after_last_paragraph(checker: &mut Checker, definition: &Definiti
CheckKind::NewLineAfterLastParagraph,
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Insert a newline just before the end-quote(s).
let content = format!(
"\n{}",
@ -571,9 +581,9 @@ pub fn no_surrounding_whitespace(checker: &mut Checker, definition: &Definition)
CheckKind::NoSurroundingWhitespace,
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
if let Some(first_line) = checker
.locator
.get_locator()
.slice_source_code_range(&Range::from_located(docstring))
.lines()
.next()
@ -619,7 +629,7 @@ pub fn multi_line_summary_start(checker: &mut Checker, definition: &Definition)
{
if string.lines().nth(1).is_some() {
if let Some(first_line) = checker
.locator
.get_locator()
.slice_source_code_range(&Range::from_located(docstring))
.lines()
.next()
@ -655,7 +665,7 @@ pub fn triple_quotes(checker: &mut Checker, definition: &Definition) {
} = &docstring.node
{
if let Some(first_line) = checker
.locator
.get_locator()
.slice_source_code_range(&Range::from_located(docstring))
.lines()
.next()
@ -906,7 +916,7 @@ fn blanks_and_section_underline(
CheckKind::DashedUnderlineAfterSection(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Add a dashed line (of the appropriate length) under the section header.
let content = format!(
"{}{}\n",
@ -940,7 +950,7 @@ fn blanks_and_section_underline(
CheckKind::DashedUnderlineAfterSection(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Add a dashed line (of the appropriate length) under the section header.
let content = format!(
"{}{}\n",
@ -962,7 +972,7 @@ fn blanks_and_section_underline(
),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete any blank lines between the header and content.
check.amend(Fix::deletion(
Location::new(docstring.location.row() + context.original_index + 1, 1),
@ -985,7 +995,7 @@ fn blanks_and_section_underline(
CheckKind::SectionUnderlineAfterName(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete any blank lines between the header and the underline.
check.amend(Fix::deletion(
Location::new(docstring.location.row() + context.original_index + 1, 1),
@ -1016,7 +1026,7 @@ fn blanks_and_section_underline(
),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Replace the existing underline with a line of the appropriate length.
let content = format!(
"{}{}\n",
@ -1054,7 +1064,7 @@ fn blanks_and_section_underline(
CheckKind::SectionUnderlineNotOverIndented(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Replace the existing indentation with whitespace of the appropriate length.
check.amend(Fix::replacement(
helpers::clean(&indentation),
@ -1103,7 +1113,7 @@ fn blanks_and_section_underline(
),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete any blank lines between the header and content.
check.amend(Fix::deletion(
Location::new(
@ -1162,7 +1172,7 @@ fn common_section(
CheckKind::CapitalizeSectionName(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Replace the section title with the capitalized variant. This requires
// locating the start and end of the section name.
if let Some(index) = context.line.find(&context.section_name) {
@ -1195,7 +1205,7 @@ fn common_section(
CheckKind::SectionNotOverIndented(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Replace the existing indentation with whitespace of the appropriate length.
check.amend(Fix::replacement(
helpers::clean(&indentation),
@ -1222,7 +1232,7 @@ fn common_section(
CheckKind::BlankLineAfterLastSection(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Add a newline after the section.
check.amend(Fix::insertion(
"\n".to_string(),
@ -1243,7 +1253,7 @@ fn common_section(
CheckKind::BlankLineAfterSection(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Add a newline after the section.
check.amend(Fix::insertion(
"\n".to_string(),
@ -1267,7 +1277,7 @@ fn common_section(
CheckKind::BlankLineBeforeSection(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Add a blank line before the section.
check.amend(Fix::insertion(
"\n".to_string(),
@ -1427,7 +1437,7 @@ fn numpy_section(checker: &mut Checker, definition: &Definition, context: &Secti
CheckKind::NewLineAfterSectionName(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Delete the suffix. This requires locating the end of the section name.
if let Some(index) = context.line.find(&context.section_name) {
// Map from bytes to characters.
@ -1476,7 +1486,7 @@ fn google_section(checker: &mut Checker, definition: &Definition, context: &Sect
CheckKind::SectionNameEndsInColon(context.section_name.to_string()),
Range::from_located(docstring),
);
if checker.autofix.enabled() {
if checker.patch() {
// Replace the suffix. This requires locating the end of the section name.
if let Some(index) = context.line.find(&context.section_name) {
// Map from bytes to characters.