aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-09-21 23:38:29 -0500
committerGitHub <noreply@github.com>2017-09-21 23:38:29 -0500
commita8a25dac5226a12916c8fe17155d1dbb3b6cb565 (patch)
tree09e8d8c037f9eee79ded15481850dfc6d77b7171
parentbe9c8ec07a0ca745adf1b412d32b3b32adec122c (diff)
parentc9dafda03a4a143f4626726df7562077a7cdd64f (diff)
downloadservo-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.rs4
-rw-r--r--components/layout/persistent_list.rs2
-rw-r--r--components/script_plugins/unrooted_must_root.rs2
-rw-r--r--python/tidy/servo_tidy/tidy.py29
-rw-r--r--python/tidy/servo_tidy_tests/multiline_string.rs28
-rw-r--r--python/tidy/servo_tidy_tests/test_tidy.py5
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