Repository navigation
Expand file tree
/
Copy pathAbstractClassStandaloneTemplateResolver.php
More file actions
111 lines (97 loc) · 3.83 KB
/
Copy pathAbstractClassStandaloneTemplateResolver.php
File metadata and controls
111 lines (97 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
<?php
declare(strict_types=1);
namespace Efabrica\PHPStanLatte\LatteTemplateResolver;
use Efabrica\PHPStanLatte\LatteContext\LatteContext;
use Efabrica\PHPStanLatte\PhpDoc\LattePhpDocResolver;
use Efabrica\PHPStanLatte\Resolver\LayoutResolver\LayoutPathResolver;
use Efabrica\PHPStanLatte\Template\Template;
use Nette\Utils\Finder;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Rules\RuleErrorBuilder;
use SplFileInfo;
use function is_file;
use function preg_match;
use function str_contains;
abstract class AbstractClassStandaloneTemplateResolver extends AbstractClassTemplateResolver
{
private LayoutPathResolver $layoutPathResolver;
public function __construct(LattePhpDocResolver $lattePhpDocResolver, ReflectionProvider $reflectionProvider, LayoutPathResolver $layoutPathResolver)
{
parent::__construct($lattePhpDocResolver, $reflectionProvider);
$this->layoutPathResolver = $layoutPathResolver;
}
protected function getClassResult(ClassReflection $classReflection, LatteContext $latteContext): LatteTemplateResolverResult
{
$result = new LatteTemplateResolverResult();
$standaloneTemplateFiles = $this->findStandaloneTemplates($classReflection);
foreach ($standaloneTemplateFiles as $standaloneTemplateFile) {
$templateContext = $this->getClassGlobalTemplateContext($classReflection, $latteContext);
$result->addTemplate(new Template(
$standaloneTemplateFile,
$classReflection->getName(),
null,
$templateContext
));
$layoutFilePath = $this->layoutPathResolver->resolve($standaloneTemplateFile);
if ($layoutFilePath !== null) {
if (is_file($layoutFilePath)) {
$result->addTemplate(new Template($layoutFilePath, $classReflection->getName(), null, $templateContext));
} else {
$result->addErrorFromBuilder(RuleErrorBuilder::message('Layout template ' . $layoutFilePath . ' does not exist.')
->identifier('latte.notFound')
->file($standaloneTemplateFile));
}
}
}
return $result;
}
/**
* @return string[]
*/
protected function findStandaloneTemplates(ClassReflection $classReflection): array
{
$dir = $this->getClassDir($classReflection);
if ($dir === null) {
return [];
}
$dir = $this->adjustDir($dir);
$patterns = $this->getTemplatePathPatterns($classReflection, $dir);
$standaloneTemplates = [];
/** @var SplFileInfo $file */
foreach (Finder::findFiles('*.latte')->from($dir) as $file) {
$file = (string)$file;
if (str_contains($file, '@')) {
continue;
}
foreach ($patterns as $pattern) {
$matches = [];
if (preg_match("#$pattern#", $file, $matches)) {
if (!$this->isStandaloneTemplate($classReflection, $file, $matches)) {
continue;
}
$standaloneTemplates[] = $file;
}
}
}
return $standaloneTemplates;
}
protected function adjustDir(string $dir): string
{
return $dir;
}
/**
* @return string[]
*/
abstract protected function getTemplatePathPatterns(ClassReflection $classReflection, string $dir): array;
/**
* @param ClassReflection $classReflection
* @param string $templateFile
* @param array<string|string[]> $patternMatches
* @return bool
*/
protected function isStandaloneTemplate(ClassReflection $classReflection, string $templateFile, array $patternMatches): bool
{
return true;
}
}