diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-09-21 23:38:29 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-21 23:38:29 -0500 |
commit | a8a25dac5226a12916c8fe17155d1dbb3b6cb565 (patch) | |
tree | 09e8d8c037f9eee79ded15481850dfc6d77b7171 | |
parent | be9c8ec07a0ca745adf1b412d32b3b32adec122c (diff) | |
parent | c9dafda03a4a143f4626726df7562077a7cdd64f (diff) | |
download | servo-a8a25dac5226a12916c8fe17155d1dbb3b6cb565.tar.gz servo-a8a25dac5226a12916c8fe17155d1dbb3b6cb565.zip |
Auto merge of #18553 - mdboom:tidy-support-multiline-strings, r=wafflespeanut
Make tidy aware of Rust multiline strings
<!-- Please describe your changes on the following line: -->
This makes the internal tidy script properly ignore the contents of Rust multiline strings.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #18551 (github issue number if applicable).
<!-- Either: -->
- [X] There are tests for these changes OR
- [ ] These changes do not require tests because _____
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18553)
<!-- Reviewable:end -->
-rw-r--r-- | components/layout/generated_content.rs | 4 | ||||
-rw-r--r-- | components/layout/persistent_list.rs | 2 | ||||
-rw-r--r-- | components/script_plugins/unrooted_must_root.rs | 2 | ||||
-rw-r--r-- | python/tidy/servo_tidy/tidy.py | 29 | ||||
-rw-r--r-- | python/tidy/servo_tidy_tests/multiline_string.rs | 28 | ||||
-rw-r--r-- | python/tidy/servo_tidy_tests/test_tidy.py | 5 |
6 files changed, 55 insertions, 15 deletions
diff --git a/components/layout/generated_content.rs b/components/layout/generated_content.rs index d9adfabb832..3f9d314fa19 100644 --- a/components/layout/generated_content.rs +++ b/components/layout/generated_content.rs @@ -137,7 +137,7 @@ impl<'a> InorderFlowTraversal for ResolveGeneratedContent<'a> { } /// The object that mutates the generated content fragments. -struct ResolveGeneratedContentFragmentMutator<'a,'b:'a> { +struct ResolveGeneratedContentFragmentMutator<'a, 'b: 'a> { /// The traversal. traversal: &'a mut ResolveGeneratedContent<'b>, /// The level we're at in the flow tree. @@ -148,7 +148,7 @@ struct ResolveGeneratedContentFragmentMutator<'a,'b:'a> { incremented: bool, } -impl<'a,'b> ResolveGeneratedContentFragmentMutator<'a,'b> { +impl<'a, 'b> ResolveGeneratedContentFragmentMutator<'a, 'b> { fn mutate_fragment(&mut self, fragment: &mut Fragment) { // We only reset and/or increment counters once per flow. This avoids double-incrementing // counters on list items (once for the main fragment and once for the marker). diff --git a/components/layout/persistent_list.rs b/components/layout/persistent_list.rs index 210606f1d5d..e331550be60 100644 --- a/components/layout/persistent_list.rs +++ b/components/layout/persistent_list.rs @@ -69,7 +69,7 @@ impl<T> Clone for PersistentList<T> where T: Send + Sync { } } -pub struct PersistentListIterator<'a,T> where T: 'a + Send + Sync { +pub struct PersistentListIterator<'a, T> where T: 'a + Send + Sync { entry: Option<&'a PersistentListEntry<T>>, } diff --git a/components/script_plugins/unrooted_must_root.rs b/components/script_plugins/unrooted_must_root.rs index f3f5e60ab62..b0b409862c5 100644 --- a/components/script_plugins/unrooted_must_root.rs +++ b/components/script_plugins/unrooted_must_root.rs @@ -163,7 +163,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnrootedPass { } } -struct FnDefVisitor<'a, 'b: 'a, 'tcx: 'a+'b> { +struct FnDefVisitor<'a, 'b: 'a, 'tcx: 'a + 'b> { cx: &'a LateContext<'b, 'tcx>, in_new_function: bool, } diff --git a/python/tidy/servo_tidy/tidy.py b/python/tidy/servo_tidy/tidy.py index c3c76edbb5f..e88f4dc1458 100644 --- a/python/tidy/servo_tidy/tidy.py +++ b/python/tidy/servo_tidy/tidy.py @@ -467,15 +467,6 @@ def check_rust(file_name, lines): prev_indent = indent indent = len(original_line) - len(line) - # Hack for components/selectors/build.rs - if multi_line_string: - if line.startswith('"#'): - multi_line_string = False - else: - continue - if line.endswith('r#"'): - multi_line_string = True - is_attribute = re.search(r"#\[.*\]", line) is_comment = re.search(r"^//|^/\*|^\*", line) @@ -494,6 +485,14 @@ def check_rust(file_name, lines): line = merged_lines + line merged_lines = '' + if multi_line_string: + line, count = re.subn( + r'^(\\.|[^"\\])*?"', '', line, count=1) + if count == 1: + multi_line_string = False + else: + continue + # Ignore attributes, comments, and imports # Keep track of whitespace to enable checking for a merged import block if import_block: @@ -504,9 +503,17 @@ def check_rust(file_name, lines): import_block = False # get rid of strings and chars because cases like regex expression, keep attributes - if not is_attribute: + if not is_attribute and not is_comment: line = re.sub(r'"(\\.|[^\\"])*?"', '""', line) - line = re.sub(r"'(\\.|[^\\'])*?'", "''", line) + line = re.sub( + r"'(\\.|[^\\']|(\\x[0-9a-fA-F]{2})|(\\u{[0-9a-fA-F]{1,6}}))'", + "''", line) + # If, after parsing all single-line strings, we still have + # an odd number of double quotes, this line starts a + # multiline string + if line.count('"') % 2 == 1: + line = re.sub(r'"(\\.|[^\\"])*?$', '""', line) + multi_line_string = True # get rid of comments line = re.sub('//.*?$|/\*.*?$|^\*.*?$', '//', line) diff --git a/python/tidy/servo_tidy_tests/multiline_string.rs b/python/tidy/servo_tidy_tests/multiline_string.rs new file mode 100644 index 00000000000..06f7fda7a96 --- /dev/null +++ b/python/tidy/servo_tidy_tests/multiline_string.rs @@ -0,0 +1,28 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// This puts a "multi-line string +// inside of a comment" and then subsequently has a hyphenated-phrase + + +const FOO: &'static str = "Do not confuse 'apostrophes', + They can be 'lifetimes' or 'characters'"; + + +fn main() { + assert!(foo("test + foo-bar")); + + assert!(foo("test + test2 \" + foo-bar")); + + assert!(foo("test + test2 \ + foo-bar")); + + println!("This is a multiline string with a URL, which kinda, \ + sorta looks like a comment https://github.com/servo/servo/"); +} diff --git a/python/tidy/servo_tidy_tests/test_tidy.py b/python/tidy/servo_tidy_tests/test_tidy.py index 73a37cd4612..4631d20ded7 100644 --- a/python/tidy/servo_tidy_tests/test_tidy.py +++ b/python/tidy/servo_tidy_tests/test_tidy.py @@ -266,6 +266,11 @@ class CheckTidiness(unittest.TestCase): lst = list(file_list) self.assertEqual([os.path.join(base_path, 'whee', 'test.rs')], lst) + def test_multiline_string(self): + errors = tidy.collect_errors_for_files(iterFile('multiline_string.rs'), [], [tidy.check_rust], print_text=True) + self.assertNoMoreErrors(errors) + + def do_tests(): suite = unittest.TestLoader().loadTestsFromTestCase(CheckTidiness) return 0 if unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful() else 1 |