exprs as $expr) { $expr_type = $statements_source->getNodeTypeProvider()->getType($expr); if (!$expr_type || $expr_type->hasMixed()) { if (IssueBuffer::accepts( new ArgumentTypeCoercion( 'Echo requires an unescaped string, ' . $expr_type . ' provided', new CodeLocation($statements_source, $expr), 'echo' ), $statements_source->getSuppressedIssues() )) { // keep soldiering on } continue; } $types = $expr_type->getTypes(); foreach ($types as $type) { if ($type instanceof \Psalm\Type\Atomic\TString && !$type instanceof \Psalm\Type\Atomic\TLiteralString && !$type instanceof \Psalm\Type\Atomic\THtmlEscapedString ) { if (IssueBuffer::accepts( new ArgumentTypeCoercion( 'Echo requires an unescaped string, ' . $expr_type . ' provided', new CodeLocation($statements_source, $expr), 'echo' ), $statements_source->getSuppressedIssues() )) { // keep soldiering on } } } } } } }