use mago_docblock::document::TagKind;
use crate::php_type::PhpType;
use super::parser::{DocblockInfo, collapse_newlines, parse_docblock_for_tags};
pub fn extract_conditional_return_type(docblock: &str) -> Option<PhpType> {
extract_conditional_return_type_from_info(&parse_docblock_for_tags(docblock)?)
}
pub fn extract_conditional_return_type_from_info(info: &DocblockInfo) -> Option<PhpType> {
let raw = extract_raw_return_content_from_info(info)?;
let trimmed = raw.trim();
if !trimmed.starts_with('(') {
return None;
}
let parsed = PhpType::parse(trimmed);
if matches!(parsed, PhpType::Conditional { .. }) {
Some(parsed)
} else {
None
}
}
fn extract_raw_return_content_from_info(info: &DocblockInfo) -> Option<String> {
let tag = info
.first_tag_by_kind(TagKind::PhpstanReturn)
.or_else(|| info.first_tag_by_kind(TagKind::PsalmReturn))
.or_else(|| info.first_tag_by_kind(TagKind::Return))?;
let desc = tag.description.trim();
if desc.is_empty() {
return None;
}
Some(collapse_newlines(desc))
}