Skip to content

Commit e6a4535

Browse files
committed
Split Generator into smaller methods
1 parent f2eea21 commit e6a4535

File tree

2 files changed

+121
-65
lines changed

2 files changed

+121
-65
lines changed

src/Carbon/Types/Generator.php

Lines changed: 118 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,119 @@ protected function getMethods($boots)
4141
return $macros->getValue();
4242
}
4343

44+
/**
45+
* @param $closure
46+
* @param string $source
47+
* @param int $sourceLength
48+
*
49+
* @return array|bool
50+
*/
51+
protected function getClosureData($closure, string $source, int $sourceLength)
52+
{
53+
try {
54+
$function = new \ReflectionFunction($closure);
55+
} catch (\ReflectionException $e) {
56+
return false;
57+
}
58+
59+
$file = $function->getFileName();
60+
61+
if (!isset($files[$file])) {
62+
$files[$file] = file($file);
63+
}
64+
65+
$lines = $files[$file];
66+
$file = str_replace('\\', '/', $file);
67+
68+
return substr($file, 0, $sourceLength + 1) === "$source/"
69+
? [$function, $file, $lines]
70+
: false;
71+
}
72+
73+
/**
74+
* @param array $files
75+
* @param string $methodDocBlock
76+
* @param array $code
77+
* @param string $name
78+
* @param string $className
79+
* @param array $defaultClasses
80+
* @param int $length
81+
*
82+
* @return string
83+
*/
84+
protected function getMethodDocBlock(array &$files, string $methodDocBlock, array $code, string $name, string $className, array $defaultClasses, int $length): string
85+
{
86+
for ($i = $length - 1; $i >= 0; $i--) {
87+
if (preg_match('/^\s*(public|protected)\s+function\s+(\S+)\(.*\)(\s*\{)?$/', $code[$i], $match)) {
88+
if ($name !== $match[2]) {
89+
try {
90+
$method = new \ReflectionMethod($className, $name);
91+
} catch (\ReflectionException $e) {
92+
foreach ($defaultClasses as $defaultClass) {
93+
try {
94+
$method = new \ReflectionMethod($defaultClass, $name);
95+
96+
break;
97+
} catch (\ReflectionException $e) {
98+
}
99+
}
100+
}
101+
102+
$methodFile = $method->getFileName();
103+
104+
if (!isset($files[$methodFile])) {
105+
$files[$methodFile] = file($methodFile);
106+
}
107+
108+
$length = $method->getEndLine() - 1;
109+
$lines = $files[$methodFile];
110+
$code = array_slice($lines, 0, $length);
111+
112+
for ($i = $length - 1; $i >= 0; $i--) {
113+
if (preg_match('/^\s*(public|protected)\s+function\s+(\S+)\(.*\)(\s*\{)?$/', $code[$i], $match)) {
114+
break;
115+
}
116+
}
117+
118+
$code = implode('', array_slice($code, $i));
119+
120+
if (preg_match('/(\/\*\*[\s\S]+\*\/)\s+return\s/U', $code, $match)) {
121+
$methodDocBlock = $match[1];
122+
}
123+
}
124+
125+
break;
126+
}
127+
}
128+
129+
return (string) preg_replace('/^ +\*/m', ' *', $methodDocBlock);
130+
}
131+
132+
/**
133+
* @param string $methods
134+
* @param string $methodDocBlock
135+
* @param string $className
136+
* @param string $name
137+
* @param string $parameters
138+
* @param string $file
139+
*/
140+
protected function writeMethodsDoc(string &$methods, string $methodDocBlock, string $className, string $name, string $parameters, string $file): void
141+
{
142+
if ($methods !== '') {
143+
$methods .= "\n";
144+
}
145+
146+
if ($methodDocBlock !== '') {
147+
$methodDocBlock = str_replace('/**', "/**\n * @see $className::$name\n *", $methodDocBlock);
148+
$methods .= " $methodDocBlock\n";
149+
}
150+
151+
$methods .= " public static function $name($parameters)\n".
152+
" {\n".
153+
" // Content, see src/$file\n".
154+
" }\n";
155+
}
156+
44157
/**
45158
* @param string $source
46159
* @param string[] $defaultClasses
@@ -57,84 +170,24 @@ protected function getMethodsDefinitions($source, $defaultClasses)
57170
$files = array();
58171

59172
foreach ($this->getMethods($defaultClasses) as $name => $closure) {
60-
try {
61-
$function = new \ReflectionFunction($closure);
62-
} catch (\ReflectionException $e) {
63-
continue;
64-
}
173+
$closureData = $this->getClosureData($closure, $source, $sourceLength);
65174

66-
$file = $function->getFileName();
67-
68-
if (!isset($files[$file])) {
69-
$files[$file] = file($file);
70-
}
71-
72-
$lines = $files[$file];
73-
$file = str_replace('\\', '/', $file);
74-
75-
if (substr($file, 0, $sourceLength + 1) !== "$source/") {
175+
if ($closureData === false) {
76176
continue;
77177
}
78178

179+
[$function, $file, $lines] = $closureData;
79180
$file = substr($file, $sourceLength + 1);
80181
$parameters = implode(', ', array_map(array($this, 'dumpParameter'), $function->getParameters()));
81182
$methodDocBlock = trim($function->getDocComment() ?: '');
82183
$length = $function->getStartLine() - 1;
83184
$code = array_slice($lines, 0, $length);
84185
$className = '\\'.str_replace('/', '\\', substr($file, 0, -4));
85186

86-
for ($i = $length - 1; $i >= 0; $i--) {
87-
if (preg_match('/^\s*(public|protected)\s+function\s+(\S+)\(.*\)(\s*\{)?$/', $code[$i], $match)) {
88-
if ($name !== $match[2]) {
89-
try {
90-
$method = new \ReflectionMethod($className, $name);
91-
} catch (\ReflectionException $e) {
92-
$method = new \ReflectionMethod($defaultClass, $name);
93-
}
94-
95-
$methodFile = $method->getFileName();
96-
97-
if (!isset($files[$methodFile])) {
98-
$files[$methodFile] = file($methodFile);
99-
}
100-
101-
$length = $method->getEndLine() - 1;
102-
$lines = $files[$methodFile];
103-
$code = array_slice($lines, 0, $length);
104-
105-
for ($i = $length - 1; $i >= 0; $i--) {
106-
if (preg_match('/^\s*(public|protected)\s+function\s+(\S+)\(.*\)(\s*\{)?$/', $code[$i], $match)) {
107-
break;
108-
}
109-
}
110-
111-
$code = implode('', array_slice($code, $i));
112-
113-
if (preg_match('/(\/\*\*[\s\S]+\*\/)\s+return\s/U', $code, $match)) {
114-
$methodDocBlock = $match[1];
115-
}
116-
}
117-
118-
break;
119-
}
120-
}
121-
122-
$methodDocBlock = preg_replace('/^ +\*/m', ' *', $methodDocBlock);
187+
$methodDocBlock = $this->getMethodDocBlock($files, $methodDocBlock, $code, $name, $className, $defaultClasses, $length);
123188
$file .= ':'.$function->getStartLine();
124189

125-
if ($methods !== '') {
126-
$methods .= "\n";
127-
}
128-
129-
if ($methodDocBlock !== '') {
130-
$methodDocBlock = str_replace('/**', "/**\n * @see $className::$name\n *", $methodDocBlock);
131-
$methods .= " $methodDocBlock\n";
132-
}
133-
134-
$methods .= " public static function $name($parameters)\n".
135-
" {\n".
136-
" // Content, see src/$file\n".
137-
" }\n";
190+
$this->writeMethodsDoc($methods, $methodDocBlock, $className, $name, $parameters, $file);
138191
}
139192

140193
return $methods;

tests/Carbon/Command/MacroTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public function testRun()
4949

5050
/**
5151
* @covers ::run
52+
* @covers \Carbon\Types\Generator::getClosureData
53+
* @covers \Carbon\Types\Generator::getMethodDocBlock
54+
* @covers \Carbon\Types\Generator::writeMethodsDoc
5255
* @covers \Carbon\Types\Generator::getMethods
5356
* @covers \Carbon\Types\Generator::getMethodsDefinitions
5457
* @covers \Carbon\Types\Generator::dumpParameter

0 commit comments

Comments
 (0)