use crate::ast::{Item, ItemKind}; use crate::attr; use rustc_span::symbol::sym; pub enum EntryPointType { None, MainNamed, MainAttr, Start, OtherMain, // Not an entry point, but some other function named main } // Beware, this is duplicated in librustc/middle/entry.rs, make sure to keep // them in sync. pub fn entry_point_type(item: &Item, depth: usize) -> EntryPointType { match item.kind { ItemKind::Fn(..) => { if attr::contains_name(&item.attrs, sym::start) { EntryPointType::Start } else if attr::contains_name(&item.attrs, sym::main) { EntryPointType::MainAttr } else if item.ident.name == sym::main { if depth == 1 { // This is a top-level function so can be 'main' EntryPointType::MainNamed } else { EntryPointType::OtherMain } } else { EntryPointType::None } } _ => EntryPointType::None, } }