Skip to content

Commit 3b45b16

Browse files
committed
Improving Formatter::format
1 parent f2c83a5 commit 3b45b16

File tree

1 file changed

+134
-73
lines changed

1 file changed

+134
-73
lines changed

src/Formatter.php

+134-73
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,7 @@ public function format($sql)
8484

8585
foreach ($tokens as $i => $token) {
8686
$queryValue = $token[Tokenizer::TOKEN_VALUE];
87-
88-
$this->indentation
89-
->increaseSpecialIndent()
90-
->increaseBlockIndent();
91-
87+
$this->indentation->increaseSpecialIndent()->increaseBlockIndent();
9288
$addedNewline = $this->newLine->addNewLineBreak($tab);
9389

9490
if ($this->comment->stringHasCommentToken($token)) {
@@ -105,82 +101,40 @@ public function format($sql)
105101
$this->inlineCount += strlen($token[Tokenizer::TOKEN_VALUE]);
106102
}
107103

108-
if ($this->parentheses->stringIsOpeningParentheses($token)) {
109-
$length = 0;
110-
for ($j = 1; $j <= 250; $j++) {
111-
if (isset($tokens[$i + $j])) {
112-
$next = $tokens[$i + $j];
113-
if ($this->parentheses->stringIsClosingParentheses($next)) {
114-
$this->parentheses->writeNewInlineParentheses();
115-
break;
116-
}
117-
118-
if ($this->parentheses->invalidParenthesesTokenValue($next)
119-
|| $this->parentheses->invalidParenthesesTokenType($next)
120-
) {
121-
break;
122-
}
123-
124-
$length += strlen($next[Tokenizer::TOKEN_VALUE]);
125-
}
126-
}
127-
$this->newLine->writeNewLineForLongInlineValues($length);
104+
switch ($token) {
105+
case $this->parentheses->stringIsOpeningParentheses($token):
106+
$tokens = $this->formatOpeningParenthesis($token, $i, $tokens, $originalTokens);
107+
break;
128108

129-
if (WhiteSpace::isPrecedingCurrentTokenOfTokenTypeWhiteSpace($originalTokens, $token)) {
130-
$this->formattedSql = rtrim($this->formattedSql, ' ');
131-
}
109+
case $this->parentheses->stringIsClosingParentheses($token):
110+
$this->indentation->decreaseIndentLevelUntilIndentTypeIsSpecial($this);
111+
$this->newLine->addNewLineBeforeToken($addedNewline, $tab);
112+
break;
132113

133-
$this->newLine->addNewLineAfterOpeningParentheses();
134-
} elseif ($this->parentheses->stringIsClosingParentheses($token)) {
135-
$this->indentation->decreaseIndentLevelUntilIndentTypeIsSpecial($this);
136-
$this->newLine->addNewLineBeforeToken($addedNewline, $tab);
137-
} elseif (Token::isTokenTypeReservedTopLevel($token)) {
138-
$this->indentation
139-
->setIncreaseSpecialIndent(true)
140-
->decreaseSpecialIndentIfCurrentIndentTypeIsSpecial();
141-
142-
$this->newLine->writeNewLineBecauseOfTopLevelReservedWord($addedNewline, $tab);
143-
144-
if (WhiteSpace::tokenHasExtraWhiteSpaces($token)) {
145-
$queryValue = preg_replace('/\s+/', ' ', $queryValue);
146-
}
147-
Token::tokenHasLimitClause($token, $this->parentheses, $this);
148-
} elseif ($this->stringIsEndOfLimitClause($token)) {
149-
$this->clauseLimit = false;
150-
} elseif (
151-
$token[Tokenizer::TOKEN_VALUE] === ','
152-
&& false === $this->parentheses->getInlineParentheses()
153-
) {
154-
$this->newLine->writeNewLineBecauseOfComma();
155-
} elseif ($this->newLine->isTokenTypeReservedNewLine($token)) {
156-
$this->newLine->addNewLineBeforeToken($addedNewline, $tab);
157-
158-
if (WhiteSpace::tokenHasExtraWhiteSpaces($token)) {
159-
$queryValue = preg_replace('/\s+/', ' ', $queryValue);
160-
}
161-
}
114+
case $this->stringIsEndOfLimitClause($token):
115+
$this->clauseLimit = false;
116+
break;
162117

163-
if (Token::tokenHasMultipleBoundaryCharactersTogether($token, $tokens, $i, $originalTokens)) {
164-
$this->formattedSql = rtrim($this->formattedSql, ' ');
165-
}
118+
case $token[Tokenizer::TOKEN_VALUE] === ',' && false === $this->parentheses->getInlineParentheses():
119+
$this->newLine->writeNewLineBecauseOfComma();
120+
break;
166121

167-
if (WhiteSpace::tokenHasExtraWhiteSpaceLeft($token)) {
168-
$this->formattedSql = rtrim($this->formattedSql, ' ');
169-
}
122+
case Token::isTokenTypeReservedTopLevel($token):
123+
$queryValue = $this->formatTokenTypeReservedTopLevel($addedNewline, $tab, $token, $queryValue);
124+
break;
170125

171-
$this->formattedSql .= $queryValue . ' ';
126+
case $this->newLine->isTokenTypeReservedNewLine($token):
127+
$this->newLine->addNewLineBeforeToken($addedNewline, $tab);
172128

173-
if (WhiteSpace::tokenHasExtraWhiteSpaceRight($token)) {
174-
$this->formattedSql = rtrim($this->formattedSql, ' ');
129+
if (WhiteSpace::tokenHasExtraWhiteSpaces($token)) {
130+
$queryValue = preg_replace('/\s+/', ' ', $queryValue);
131+
}
132+
break;
175133
}
176134

177-
if (Token::tokenIsMinusSign($token, $tokens, $i)) {
178-
$previousTokenType = $tokens[$i - 1][Tokenizer::TOKEN_TYPE];
179-
180-
if (WhiteSpace::tokenIsNumberAndHasExtraWhiteSpaceRight($previousTokenType)) {
181-
$this->formattedSql = rtrim($this->formattedSql, ' ');
182-
}
183-
}
135+
$this->formatBoundaryCharacterToken($token, $i, $tokens, $originalTokens);
136+
$this->formatWhiteSpaceToken($token, $queryValue);
137+
$this->formatDashToken($token, $i, $tokens);
184138
}
185139

186140
return trim(str_replace(["\t", " \n"], [$this->tab, "\n"], $this->formattedSql)) . "\n";
@@ -200,6 +154,44 @@ public function reset()
200154
$this->formattedSql = '';
201155
}
202156

157+
/**
158+
* @param $token
159+
* @param $i
160+
* @param array $tokens
161+
* @param array $originalTokens
162+
*
163+
* @return array
164+
*/
165+
protected function formatOpeningParenthesis($token, $i, array &$tokens, array &$originalTokens)
166+
{
167+
$length = 0;
168+
for ($j = 1; $j <= 250; $j++) {
169+
if (isset($tokens[$i + $j])) {
170+
$next = $tokens[$i + $j];
171+
if ($this->parentheses->stringIsClosingParentheses($next)) {
172+
$this->parentheses->writeNewInlineParentheses();
173+
break;
174+
}
175+
176+
if ($this->parentheses->invalidParenthesesTokenValue($next)
177+
|| $this->parentheses->invalidParenthesesTokenType($next)
178+
) {
179+
break;
180+
}
181+
182+
$length += strlen($next[Tokenizer::TOKEN_VALUE]);
183+
}
184+
}
185+
$this->newLine->writeNewLineForLongInlineValues($length);
186+
187+
if (WhiteSpace::isPrecedingCurrentTokenOfTokenTypeWhiteSpace($originalTokens, $token)) {
188+
$this->formattedSql = rtrim($this->formattedSql, ' ');
189+
}
190+
191+
$this->newLine->addNewLineAfterOpeningParentheses();
192+
193+
return $tokens;
194+
}
203195

204196
/**
205197
* @param $token
@@ -214,6 +206,75 @@ protected function stringIsEndOfLimitClause($token)
214206
&& $token[Tokenizer::TOKEN_TYPE] !== Tokenizer::TOKEN_TYPE_WHITESPACE;
215207
}
216208

209+
/**
210+
* @param $addedNewline
211+
* @param $tab
212+
* @param $token
213+
* @param $queryValue
214+
*
215+
* @return mixed
216+
*/
217+
protected function formatTokenTypeReservedTopLevel($addedNewline, $tab, $token, $queryValue)
218+
{
219+
$this->indentation
220+
->setIncreaseSpecialIndent(true)
221+
->decreaseSpecialIndentIfCurrentIndentTypeIsSpecial();
222+
223+
$this->newLine->writeNewLineBecauseOfTopLevelReservedWord($addedNewline, $tab);
224+
225+
if (WhiteSpace::tokenHasExtraWhiteSpaces($token)) {
226+
$queryValue = preg_replace('/\s+/', ' ', $queryValue);
227+
}
228+
Token::tokenHasLimitClause($token, $this->parentheses, $this);
229+
return $queryValue;
230+
}
231+
232+
/**
233+
* @param $token
234+
* @param $i
235+
* @param array $tokens
236+
* @param array $originalTokens
237+
*/
238+
protected function formatBoundaryCharacterToken($token, $i, array &$tokens, array &$originalTokens)
239+
{
240+
if (Token::tokenHasMultipleBoundaryCharactersTogether($token, $tokens, $i, $originalTokens)) {
241+
$this->formattedSql = rtrim($this->formattedSql, ' ');
242+
}
243+
}
244+
245+
/**
246+
* @param $token
247+
* @param $queryValue
248+
*/
249+
protected function formatWhiteSpaceToken($token, $queryValue)
250+
{
251+
if (WhiteSpace::tokenHasExtraWhiteSpaceLeft($token)) {
252+
$this->formattedSql = rtrim($this->formattedSql, ' ');
253+
}
254+
255+
$this->formattedSql .= $queryValue . ' ';
256+
257+
if (WhiteSpace::tokenHasExtraWhiteSpaceRight($token)) {
258+
$this->formattedSql = rtrim($this->formattedSql, ' ');
259+
}
260+
}
261+
262+
/**
263+
* @param $token
264+
* @param $i
265+
* @param array $tokens
266+
*/
267+
protected function formatDashToken($token, $i, array &$tokens)
268+
{
269+
if (Token::tokenIsMinusSign($token, $tokens, $i)) {
270+
$previousTokenType = $tokens[$i - 1][Tokenizer::TOKEN_TYPE];
271+
272+
if (WhiteSpace::tokenIsNumberAndHasExtraWhiteSpaceRight($previousTokenType)) {
273+
$this->formattedSql = rtrim($this->formattedSql, ' ');
274+
}
275+
}
276+
}
277+
217278
/**
218279
* @return string
219280
*/

0 commit comments

Comments
 (0)