mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Rewrite the ban-type lint in Python
Delete old rust ban lint and move tests to python tidy Fix ban lint regex and fix test
This commit is contained in:
parent
26de7c6bc4
commit
ebcb15d6f2
6 changed files with 18 additions and 56 deletions
|
@ -1,53 +0,0 @@
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
use rustc::lint::{EarlyContext, LintPass, LintArray, EarlyLintPass, LintContext};
|
|
||||||
use syntax::ast::Ty;
|
|
||||||
use utils::match_ty_unwrap;
|
|
||||||
|
|
||||||
declare_lint!(BANNED_TYPE, Deny,
|
|
||||||
"Ban various unsafe type combinations");
|
|
||||||
|
|
||||||
/// Lint for banning various unsafe types
|
|
||||||
///
|
|
||||||
/// Banned types:
|
|
||||||
///
|
|
||||||
/// - `Cell<JSVal>`
|
|
||||||
/// - `Cell<JS<T>>`
|
|
||||||
pub struct BanPass;
|
|
||||||
|
|
||||||
impl LintPass for BanPass {
|
|
||||||
fn get_lints(&self) -> LintArray {
|
|
||||||
lint_array!(BANNED_TYPE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EarlyLintPass for BanPass {
|
|
||||||
fn check_ty(&mut self, cx: &EarlyContext, ty: &Ty) {
|
|
||||||
if match_ty_unwrap(ty, &["std", "cell", "Cell"])
|
|
||||||
.and_then(|t| t.get(0))
|
|
||||||
.and_then(|t| match_ty_unwrap(&**t, &["dom", "bindings", "js", "JS"]))
|
|
||||||
.is_some() {
|
|
||||||
cx.span_lint(BANNED_TYPE, ty.span, "Banned type Cell<JS<T>> detected. Use MutJS<JS<T>> instead")
|
|
||||||
}
|
|
||||||
if match_ty_unwrap(ty, &["std", "cell", "Cell"])
|
|
||||||
.and_then(|t| t.get(0))
|
|
||||||
.and_then(|t| match_ty_unwrap(&**t, &["js", "jsval", "JSVal"]))
|
|
||||||
.is_some() {
|
|
||||||
cx.span_lint(BANNED_TYPE, ty.span, "Banned type Cell<JSVal> detected. Use MutJS<JSVal> instead")
|
|
||||||
}
|
|
||||||
if match_ty_unwrap(ty, &["dom", "bindings", "cell", "DOMRefCell"])
|
|
||||||
.and_then(|t| t.get(0))
|
|
||||||
.and_then(|t| match_ty_unwrap(&**t, &["dom", "bindings", "js", "JS"]))
|
|
||||||
.is_some() {
|
|
||||||
cx.span_lint(BANNED_TYPE, ty.span, "Banned type DOMRefCell<JS<T>> detected. Use MutJS<JS<T>> instead")
|
|
||||||
}
|
|
||||||
if match_ty_unwrap(ty, &["dom", "bindings", "cell", "DOMRefCell"])
|
|
||||||
.and_then(|t| t.get(0))
|
|
||||||
.and_then(|t| match_ty_unwrap(&**t, &["js", "jsapi", "Heap"]))
|
|
||||||
.is_some() {
|
|
||||||
cx.span_lint(BANNED_TYPE, ty.span, "Banned type DOMRefCell<Heap<T>> detected. Use Heap<T> directly instead")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -25,7 +25,6 @@ extern crate syntax;
|
||||||
use rustc_plugin::Registry;
|
use rustc_plugin::Registry;
|
||||||
use syntax::feature_gate::AttributeType::Whitelisted;
|
use syntax::feature_gate::AttributeType::Whitelisted;
|
||||||
|
|
||||||
mod ban;
|
|
||||||
mod unrooted_must_root;
|
mod unrooted_must_root;
|
||||||
/// Utilities for writing plugins
|
/// Utilities for writing plugins
|
||||||
mod utils;
|
mod utils;
|
||||||
|
@ -33,7 +32,6 @@ mod utils;
|
||||||
#[plugin_registrar]
|
#[plugin_registrar]
|
||||||
pub fn plugin_registrar(reg: &mut Registry) {
|
pub fn plugin_registrar(reg: &mut Registry) {
|
||||||
reg.register_late_lint_pass(box unrooted_must_root::UnrootedPass::new());
|
reg.register_late_lint_pass(box unrooted_must_root::UnrootedPass::new());
|
||||||
reg.register_early_lint_pass(box ban::BanPass);
|
|
||||||
reg.register_attribute("allow_unrooted_interior".to_string(), Whitelisted);
|
reg.register_attribute("allow_unrooted_interior".to_string(), Whitelisted);
|
||||||
reg.register_attribute("must_root".to_string(), Whitelisted);
|
reg.register_attribute("must_root".to_string(), Whitelisted);
|
||||||
}
|
}
|
||||||
|
|
|
@ -549,6 +549,12 @@ def check_rust(file_name, lines):
|
||||||
(r": &Vec<", "use &[T] instead of &Vec<T>", no_filter),
|
(r": &Vec<", "use &[T] instead of &Vec<T>", no_filter),
|
||||||
# No benefit over using &str
|
# No benefit over using &str
|
||||||
(r": &String", "use &str instead of &String", no_filter),
|
(r": &String", "use &str instead of &String", no_filter),
|
||||||
|
# There should be any use of banned types:
|
||||||
|
# Cell<JSVal>, Cell<JS<T>>, DOMRefCell<JS<T>>, DOMRefCell<HEAP<T>>
|
||||||
|
(r"(\s|:)+Cell<JSVal>", "Banned type Cell<JSVal> detected. Use MutJS<JSVal> instead", no_filter),
|
||||||
|
(r"(\s|:)+Cell<JS<.+>>", "Banned type Cell<JS<T>> detected. Use MutJS<JS<T>> instead", no_filter),
|
||||||
|
(r"DOMRefCell<JS<.+>>", "Banned type DOMRefCell<JS<T>> detected. Use MutJS<JS<T>> instead", no_filter),
|
||||||
|
(r"DOMRefCell<Heap<.+>>", "Banned type DOMRefCell<Heap<T>> detected. Use MutJS<JS<T>> instead", no_filter),
|
||||||
# No benefit to using &Root<T>
|
# No benefit to using &Root<T>
|
||||||
(r": &Root<", "use &T instead of &Root<T>", no_filter),
|
(r": &Root<", "use &T instead of &Root<T>", no_filter),
|
||||||
(r"^&&", "operators should go at the end of the first line", no_filter),
|
(r"^&&", "operators should go at the end of the first line", no_filter),
|
||||||
|
|
|
@ -9,10 +9,13 @@ extern crate js;
|
||||||
|
|
||||||
use js::jsval::JSVal;
|
use js::jsval::JSVal;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
use std::cell::UnsafeCell;
|
||||||
|
|
||||||
struct Foo {
|
struct Foo {
|
||||||
bar: Cell<JSVal>
|
bar: Cell<JSVal>,
|
||||||
//~^ ERROR Banned type Cell<JSVal> detected. Use MutJS<JSVal> instead
|
//~^ ERROR Banned type Cell<JSVal> detected. Use MutJS<JSVal> instead
|
||||||
|
foo: UnsafeCell<JSVal>
|
||||||
|
//~^ NOT AN ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
|
@ -140,6 +140,14 @@ class CheckTidiness(unittest.TestCase):
|
||||||
self.assertTrue('feature attribute is not in alphabetical order' in feature_errors.next()[2])
|
self.assertTrue('feature attribute is not in alphabetical order' in feature_errors.next()[2])
|
||||||
self.assertNoMoreErrors(feature_errors)
|
self.assertNoMoreErrors(feature_errors)
|
||||||
|
|
||||||
|
ban_errors = tidy.collect_errors_for_files(iterFile('ban.rs'), [], [tidy.check_rust], print_text=False)
|
||||||
|
self.assertEqual('Banned type Cell<JSVal> detected. Use MutJS<JSVal> instead', ban_errors.next()[2])
|
||||||
|
self.assertNoMoreErrors(ban_errors)
|
||||||
|
|
||||||
|
ban_errors = tidy.collect_errors_for_files(iterFile('ban-domrefcell.rs'), [], [tidy.check_rust], print_text=False)
|
||||||
|
self.assertEqual('Banned type DOMRefCell<JS<T>> detected. Use MutJS<JS<T>> instead', ban_errors.next()[2])
|
||||||
|
self.assertNoMoreErrors(ban_errors)
|
||||||
|
|
||||||
def test_spec_link(self):
|
def test_spec_link(self):
|
||||||
tidy.SPEC_BASE_PATH = base_path
|
tidy.SPEC_BASE_PATH = base_path
|
||||||
errors = tidy.collect_errors_for_files(iterFile('speclink.rs'), [], [tidy.check_spec], print_text=False)
|
errors = tidy.collect_errors_for_files(iterFile('speclink.rs'), [], [tidy.check_spec], print_text=False)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue