Skip to content

Commit a08a5ed

Browse files
authored
Fix format words after "." as identifiers only (#142)
1 parent a9acb2c commit a08a5ed

File tree

7 files changed

+91
-11
lines changed

7 files changed

+91
-11
lines changed

src/SqlFormatter.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,12 @@ public function format(string $string, string $indentString = ' '): string
9999

100100
// Format token by token
101101
while ($token = $cursor->next(Token::TOKEN_TYPE_WHITESPACE)) {
102+
$prevNotWhitespaceToken = $cursor->subCursor()->previous(Token::TOKEN_TYPE_WHITESPACE);
103+
$tokenValueUpper = strtoupper($token->value());
104+
if ($prevNotWhitespaceToken !== null && $prevNotWhitespaceToken->value() === '.') {
105+
$tokenValueUpper = false;
106+
}
107+
102108
$highlighted = $this->highlighter->highlightToken(
103109
$token->type(),
104110
$token->value(),
@@ -122,7 +128,6 @@ public function format(string $string, string $indentString = ' '): string
122128
if ($newline) {
123129
$return = rtrim($return, ' ');
124130

125-
$prevNotWhitespaceToken = $cursor->subCursor()->previous(Token::TOKEN_TYPE_WHITESPACE);
126131
if ($prevNotWhitespaceToken !== null && $prevNotWhitespaceToken->value() === ';') {
127132
$return .= "\n";
128133
}
@@ -274,7 +279,7 @@ public function format(string $string, string $indentString = ' '): string
274279
}
275280

276281
// if SQL 'LIMIT' clause, start variable to reset newline
277-
if (strtoupper($token->value()) === 'LIMIT' && ! $inlineParentheses) {
282+
if ($tokenValueUpper === 'LIMIT' && ! $inlineParentheses) {
278283
$clauseLimit = true;
279284
}
280285
} elseif ($token->value() === ';') {
@@ -284,30 +289,28 @@ public function format(string $string, string $indentString = ' '): string
284289
}
285290

286291
$newline = true;
287-
} elseif (strtoupper($token->value()) === 'CASE') {
292+
} elseif ($tokenValueUpper === 'CASE') {
288293
$increaseBlockIndent = true;
289-
} elseif (strtoupper($token->value()) === 'BEGIN') {
294+
} elseif ($tokenValueUpper === 'BEGIN') {
290295
$newline = true;
291296
$increaseBlockIndent = true;
292-
} elseif (strtoupper($token->value()) === 'LOOP') {
297+
} elseif ($tokenValueUpper === 'LOOP') {
293298
// https://docs.oracle.com/en/database/oracle/oracle-database/19/lnpls/basic-LOOP-statement.html
294299

295-
$prevNotWhitespaceToken = $cursor->subCursor()->previous(Token::TOKEN_TYPE_WHITESPACE);
296300
if ($prevNotWhitespaceToken !== null && strtoupper($prevNotWhitespaceToken->value()) !== 'END') {
297301
$newline = true;
298302
$increaseBlockIndent = true;
299303
}
300-
} elseif (in_array(strtoupper($token->value()), ['WHEN', 'THEN', 'ELSE', 'END'], true)) {
301-
if (strtoupper($token->value()) !== 'THEN') {
304+
} elseif (in_array($tokenValueUpper, ['WHEN', 'THEN', 'ELSE', 'END'], true)) {
305+
if ($tokenValueUpper !== 'THEN') {
302306
$decreaseIndentationLevelFx();
303307

304-
$prevNotWhitespaceToken = $cursor->subCursor()->previous(Token::TOKEN_TYPE_WHITESPACE);
305308
if ($prevNotWhitespaceToken !== null && strtoupper($prevNotWhitespaceToken->value()) !== 'CASE') {
306309
$appendNewLineIfNotAddedFx();
307310
}
308311
}
309312

310-
if (strtoupper($token->value()) === 'THEN' || strtoupper($token->value()) === 'ELSE') {
313+
if ($tokenValueUpper === 'THEN' || $tokenValueUpper === 'ELSE') {
311314
$newline = true;
312315
$increaseBlockIndent = true;
313316
}
@@ -338,7 +341,6 @@ public function format(string $string, string $indentString = ' '): string
338341
}
339342
} elseif ($token->isOfType(Token::TOKEN_TYPE_BOUNDARY)) {
340343
// Multiple boundary characters in a row should not have spaces between them (not including parentheses)
341-
$prevNotWhitespaceToken = $cursor->subCursor()->previous(Token::TOKEN_TYPE_WHITESPACE);
342344
if ($prevNotWhitespaceToken !== null && $prevNotWhitespaceToken->isOfType(Token::TOKEN_TYPE_BOUNDARY)) {
343345
$prevToken = $cursor->subCursor()->previous();
344346
if ($prevToken !== null && ! $prevToken->isOfType(Token::TOKEN_TYPE_WHITESPACE)) {

tests/clihighlight.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,3 +1185,19 @@ MY_NON_TOP_LEVEL_KEYWORD_FX_3();
11851185
FROM
11861186
test
11871187
STRAIGHT_JOIN test2 ON test.id = test2.id
1188+
---
1189+
SELECT
1190+
t.id,
1191+
t.start,
1192+
t.end,
1193+
t.end AS e2,
1194+
t.limit,
1195+
t.begin,
1196+
t.case,
1197+
t.when,
1198+
t.then,
1199+
t.else
1200+
FROM
1201+
t
1202+
WHERE
1203+
t.start = t.end

tests/compress.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,5 @@ begin try insert into [t] ([name], [int], [float], [null]) values (N'Ewa', 1, 1.
107107
BEGIN FOR i IN 1..5 LOOP DBMS_OUTPUT.PUT_LINE(i); END LOOP; END;
108108
---
109109
SELECT a FROM test STRAIGHT_JOIN test2 ON test.id = test2.id
110+
---
111+
SELECT t.id, t.start, t.end, t.end AS e2, t.limit, t.begin, t.case, t.when, t.then, t.else FROM t WHERE t.start = t.end

tests/format-highlight.html

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,3 +1185,19 @@
11851185
<span style="font-weight:bold;">FROM</span>
11861186
<span style="color: #333;">test</span>
11871187
<span style="font-weight:bold;">STRAIGHT_JOIN</span> <span style="color: #333;">test2</span> <span style="font-weight:bold;">ON</span> <span style="color: #333;">test</span><span >.</span><span style="color: #333;">id</span> <span >=</span> <span style="color: #333;">test2</span><span >.</span><span style="color: #333;">id</span></pre>
1188+
---
1189+
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span>
1190+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">id</span><span >,</span>
1191+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">start</span><span >,</span>
1192+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span><span >,</span>
1193+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span> <span style="font-weight:bold;">AS</span> <span style="color: #333;">e2</span><span >,</span>
1194+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">limit</span><span >,</span>
1195+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">begin</span><span >,</span>
1196+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">case</span><span >,</span>
1197+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">when</span><span >,</span>
1198+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">then</span><span >,</span>
1199+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">else</span>
1200+
<span style="font-weight:bold;">FROM</span>
1201+
<span style="color: #333;">t</span>
1202+
<span style="font-weight:bold;">WHERE</span>
1203+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">start</span> <span >=</span> <span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span></pre>

tests/format.txt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,3 +1183,19 @@ SELECT
11831183
FROM
11841184
test
11851185
STRAIGHT_JOIN test2 ON test.id = test2.id
1186+
---
1187+
SELECT
1188+
t.id,
1189+
t.start,
1190+
t.end,
1191+
t.end AS e2,
1192+
t.limit,
1193+
t.begin,
1194+
t.case,
1195+
t.when,
1196+
t.then,
1197+
t.else
1198+
FROM
1199+
t
1200+
WHERE
1201+
t.start = t.end

tests/highlight.html

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,17 @@
409409
<span style="font-weight:bold;">END</span><span >;</span></pre>
410410
---
411411
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span> <span style="color: #333;">a</span> <span style="font-weight:bold;">FROM</span> <span style="color: #333;">test</span> <span style="font-weight:bold;">STRAIGHT_JOIN</span> <span style="color: #333;">test2</span> <span style="font-weight:bold;">ON</span> <span style="color: #333;">test</span><span >.</span><span style="color: #333;">id</span> <span >=</span> <span style="color: #333;">test2</span><span >.</span><span style="color: #333;">id</span></pre>
412+
---
413+
<pre style="color: black; background-color: white;"><span style="font-weight:bold;">SELECT</span>
414+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">id</span><span >,</span>
415+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">start</span><span >,</span>
416+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span><span >,</span>
417+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span> <span style="font-weight:bold;">AS</span> <span style="color: #333;">e2</span><span >,</span>
418+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">limit</span><span >,</span>
419+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">begin</span><span >,</span>
420+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">case</span><span >,</span>
421+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">when</span><span >,</span>
422+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">then</span><span >,</span>
423+
<span style="color: #333;">t</span><span >.</span><span style="color: #333;">else</span>
424+
<span style="font-weight:bold;">FROM</span> <span style="color: #333;">t</span>
425+
<span style="font-weight:bold;">WHERE</span> <span style="color: #333;">t</span><span >.</span><span style="color: #333;">start</span> <span >=</span> <span style="color: #333;">t</span><span >.</span><span style="color: #333;">end</span></pre>

tests/sql.sql

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,3 +409,17 @@ BEGIN
409409
END;
410410
---
411411
SELECT a FROM test STRAIGHT_JOIN test2 ON test.id = test2.id
412+
---
413+
SELECT
414+
t.id,
415+
t.start,
416+
t.end,
417+
t.end AS e2,
418+
t.limit,
419+
t.begin,
420+
t.case,
421+
t.when,
422+
t.then,
423+
t.else
424+
FROM t
425+
WHERE t.start = t.end

0 commit comments

Comments
 (0)