]> git.lizzy.rs Git - rust.git/blobdiff - clippy_lints/src/exit.rs
rustup https://github.com/rust-lang/rust/pull/67455
[rust.git] / clippy_lints / src / exit.rs
index 9952ef3ea6230c468b746e99cfc89ddd5c81a1c4..42139f1c7b898118892319d5c6f16dad243e2105 100644 (file)
@@ -1,8 +1,9 @@
-use crate::utils::{match_def_path, paths, qpath_res, span_lint};
+use crate::utils::{is_entrypoint_fn, match_def_path, paths, qpath_res, span_lint};
 use if_chain::if_chain;
+use rustc::declare_lint_pass;
 use rustc::hir::{Expr, ExprKind, Item, ItemKind, Node};
 use rustc::lint::{LateContext, LateLintPass, LintArray, LintPass};
-use rustc::{declare_lint_pass, declare_tool_lint};
+use rustc_session::declare_tool_lint;
 
 declare_clippy_lint! {
     /// **What it does:** `exit()`  terminates the program and doesn't provide a
@@ -32,31 +33,16 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, e: &'tcx Expr) {
             if let Some(def_id) = qpath_res(cx, path, path_expr.hir_id).opt_def_id();
             if match_def_path(cx, def_id, &paths::EXIT);
             then {
-                let mut parent = cx.tcx.hir().get_parent_item(e.hir_id);
-                // We have to traverse the parents upwards until we find a function
-                // otherwise a exit in a let or if in main would still trigger this
-                loop{
-                    match cx.tcx.hir().find(parent) {
-                        Some(Node::Item(Item{ident, kind: ItemKind::Fn(..), ..})) => {
-                            // If we found a function we check it's name if it is
-                            // `main` we emit a lint.
-                            if ident.name.as_str() != "main" {
-                                span_lint(cx, EXIT, e.span, "usage of `process::exit`");
-                            }
-                            // We found any kind of function and can end our loop
-                            break;
-                        }
-                        // If we found anything but a funciton we continue with the
-                        // loop and go one parent up
-                        Some(_) => {
-                            cx.tcx.hir().get_parent_item(parent);
-                        },
-                        // If we found nothing we break.
-                        None => break,
+                let parent = cx.tcx.hir().get_parent_item(e.hir_id);
+                if let Some(Node::Item(Item{kind: ItemKind::Fn(..), ..})) = cx.tcx.hir().find(parent) {
+                    // If the next item up is a function we check if it is an entry point
+                    // and only then emit a linter warning
+                    let def_id = cx.tcx.hir().local_def_id(parent);
+                    if !is_entrypoint_fn(cx, def_id) {
+                        span_lint(cx, EXIT, e.span, "usage of `process::exit`");
                     }
                 }
             }
-
         }
     }
 }