8000 Better error messages for XML errors (#25) · symfony-tools/code-block-checker@5ada786 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5ada786

Browse files
authored
Better error messages for XML errors (#25)
* Better error messages for XML errors * cs
1 parent 8bc3354 commit 5ada786

File tree

5 files changed

+37
-20
lines changed

5 files changed

+37
-20
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"php": ">=8.0",
77
"ext-ctype": "*",
88
"ext-iconv": "*",
9+
"ext-libxml": "*",
910
"doctrine/rst-parser": "^0.4",
1011
"symfony/console": "^5.2",
1112
"symfony/docs-builder": "^0.15.0",

src/Service/CodeValidator/JsonValidator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public function validate(CodeNode $node, IssueCollection $issues): void
1717
try {
1818
$data = json_decode($node->getValue(), true, 512, JSON_THROW_ON_ERROR);
1919
} catch (\JsonException $e) {
20-
$issues->addIssue(new Issue($node, $e->getMessage(), 'Invalid syntax', $node->getEnvironment()->getCurrentFileName(), 0));
20+
$issues->addIssue(new Issue($node, $e->getMessage(), 'JSON syntax', $node->getEnvironment()->getCurrentFileName(), 0));
2121
}
2222
}
2323
}

src/Service/CodeValidator/PhpValidator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function validate(CodeNode $node, IssueCollection $issues): void
3232
$text = str_replace($matches[0], '', $text);
3333
$line = ((int) $matches[1]) - 1; // we added "<?php"
3434
}
35-
$issues->addIssue(new Issue($node, $text, 'Invalid syntax', $node->getEnvironment()->getCurrentFileName(), $line));
35+
$issues->addIssue(new Issue($node, $text, 'PHP syntax', $node->getEnvironment()->getCurrentFileName(), $line));
3636
}
3737

3838
private function getContents(CodeNode $node, string $language): string

src/Service/CodeValidator/XmlValidator.php

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,42 @@ public function validate(CodeNode $node, IssueCollection $issues): void
1414
return;
1515
}
1616

17-
try {
18-
set_error_handler(static function ($errno, $errstr) {
19-
throw new \RuntimeException($errstr, $errno);
20-
});
21-
22-
try {
23-
// Remove first comment only. (No multiline)
24-
$xml = preg_replace('#^<!-- .* -->\n#', '', $node->getValue());
25-
if ('' !== $xml) {
26-
$xmlObject = new \SimpleXMLElement($xml);
27-
}
28-
} finally {
29-
restore_error_handler();
17+
$count = 0;
18+
$xml = trim(preg_replace('#^<!-- .* -->\n#', '', $node->getValue(), -1, $count));
19+
if ('' === $xml) {
20+
return;
21+
}
22+
23+
libxml_use_internal_errors(true);
24+
$doc = new \DOMDocument();
25+
$doc->loadXML($xml);
26+
27+
/** @var \LibXMLError[] $errors */
28+
$errors = libxml_get_errors();
29+
libxml_clear_errors();
30+
31+
if (!$errors) {
32+
return;
33+
}
34+
35+
$error = null;
36+
foreach ($errors as $candidate) {
37+
if (preg_match('#^Namespace prefix .+ is not defined$#', $candidate->message)) {
38+
// Ignore take namespace error
39+
continue;
3040
}
31-
} catch (\Throwable $e) {
32-
if ('SimpleXMLElement::__construct(): namespace error : Namespace prefix' === substr($e->getMessage(), 0, 67)) {
33-
return;
41+
42+
if (0 === strpos($candidate->message, 'Extra content at the end of the document')) {
43+
// This is because there is not element wrapping the content
44+
continue;
3445
}
3546

36-
$issues->addIssue(new Issue($node, $e->getMessage(), 'Invalid syntax', $node->getEnvironment()->getCurrentFileName(), 0));
47+
$error = $candidate;
48+
break;
49+
}
50+
51+
if (null !== $error) {
52+
$issues->addIssue(new Issue($node, $error->message, 'XML syntax', $node->getEnvironment()->getCurrentFileName(), $error->line + $count));
3753
}
3854
}
3955
}

src/Service/CodeValidator/YamlValidator.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function validate(CodeNode $node, IssueCollection $issues): void
2525
return;
2626
}
2727

28-
$issues->addIssue(new Issue($node, $e->getMessage(), 'Invalid syntax', $node->getEnvironment()->getCurrentFileName(), $e->getParsedLine()));
28+
$issues->addIssue(new Issue($node, $e->getMessage(), 'Yaml syntax', $node->getEnvironment()->getCurrentFileName(), $e->getParsedLine()));
2929
}
3030
}
3131
}

0 commit comments

Comments
 (0)
0