use unique_ptr for ast::Type