@@ -41,6 +41,119 @@ protected function getMethods($boots)
41
41
return $ macros ->getValue ();
42
42
}
43
43
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
+
44
157
/**
45
158
* @param string $source
46
159
* @param string[] $defaultClasses
@@ -57,84 +170,24 @@ protected function getMethodsDefinitions($source, $defaultClasses)
57
170
$ files = array ();
58
171
59
172
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 );
65
174
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 ) {
76
176
continue ;
77
177
}
78
178
179
+ [$ function , $ file , $ lines ] = $ closureData ;
79
180
$ file = substr ($ file , $ sourceLength + 1 );
80
181
$ parameters = implode (', ' , array_map (array ($ this , 'dumpParameter ' ), $ function ->getParameters ()));
81
182
$ methodDocBlock = trim ($ function ->getDocComment () ?: '' );
82
183
$ length = $ function ->getStartLine () - 1 ;
83
184
$ code = array_slice ($ lines , 0 , $ length );
84
185
$ className = '\\' .str_replace ('/ ' , '\\' , substr ($ file , 0 , -4 ));
85
186
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 );
123
188
$ file .= ': ' .$ function ->getStartLine ();
124
189
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 );
138
191
}
139
192
140
193
return $ methods ;
0 commit comments