Skip to content

Commit 1079841

Browse files
committed
feat - add new pass AlignSuperEquals - #77
1 parent 6b56d56 commit 1079841

File tree

5 files changed

+269
-15
lines changed

5 files changed

+269
-15
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ PHPFmt provides a variety of commands accessible via the command palette (`Ctrl+
6767
* AlignDoubleArrow Vertically align T_DOUBLE_ARROW (=>).
6868
* AlignDoubleSlashComments Vertically align "//" comments.
6969
* AlignEquals Vertically align "=".
70+
* AlignSuperEquals Vertically align "=", ".=", "&=", ">>=", etc.
7071
* AlignGroupDoubleArrow Vertically align T_DOUBLE_ARROW (=>) by line groups.
7172
* AlignPHPCode Align PHP code within HTML block.
7273
* AlignTypehint Vertically align function type hints.

driade.sublime-settings

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"AlignConstVisibilityEquals",
1414
"AutoSemicolon",
1515
"ConvertOpenTagWithEcho",
16-
"AlignEquals",
16+
"AlignSuperEquals",
1717
"MergeNamespaceWithOpenTag",
1818
"RemoveSemicolonAfterCurly",
1919
"RestoreComments",

fmt.stub.php

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2638,6 +2638,7 @@ abstract class BaseCodeFormatter {
26382638
'AlignGroupDoubleArrow' => false,
26392639
'AlignDoubleArrow' => false,
26402640
'AlignEquals' => false,
2641+
'AlignSuperEquals' => false,
26412642
'AlignConstVisibilityEquals' => false,
26422643

26432644
'ReindentSwitchBlocks' => false,
@@ -7490,6 +7491,172 @@ public function getExample() {
74907491
}
74917492
}
74927493

7494+
class AlignSuperEquals extends AdditionalPass {
7495+
const ALIGNABLE_EQUAL = "\x2 EQUAL%d \x3";
7496+
const ALIGNABLE_EQUAL_SPACE = "\x2 EQUAL_SPACE \x3";
7497+
7498+
const OPEN_TAG = "<?php /*\x2 EQUAL OPEN TAG\x3*/";
7499+
7500+
public function candidate($source, $foundTokens) {
7501+
return true;
7502+
}
7503+
7504+
public function format($source) {
7505+
$this->tkns = token_get_all($source);
7506+
$this->code = '';
7507+
7508+
$blockCounter = 0;
7509+
$blockCountEquals = array(0 => 0);
7510+
7511+
while (list($index, $token) = $this->each($this->tkns)) {
7512+
list($id, $text) = $this->getToken($token);
7513+
$this->ptr = $index;
7514+
switch ($id) {
7515+
case T_WHITESPACE:
7516+
if ($this->hasLn($text) && substr_count($text, $this->newLine) >= 2) {
7517+
$blockCounter++;
7518+
$blockCountEquals[$blockCounter] = 0;
7519+
}
7520+
break;
7521+
case ST_EQUAL:
7522+
case T_PLUS_EQUAL:
7523+
case T_MINUS_EQUAL:
7524+
case T_MUL_EQUAL:
7525+
case T_POW_EQUAL:
7526+
case T_DIV_EQUAL:
7527+
case T_CONCAT_EQUAL:
7528+
case T_MOD_EQUAL:
7529+
case T_AND_EQUAL:
7530+
case T_OR_EQUAL:
7531+
case T_XOR_EQUAL:
7532+
case T_SL_EQUAL:
7533+
case T_SR_EQUAL:
7534+
case T_IS_EQUAL:
7535+
case T_IS_NOT_EQUAL:
7536+
case T_IS_IDENTICAL:
7537+
case T_IS_NOT_IDENTICAL:
7538+
case T_IS_SMALLER_OR_EQUAL:
7539+
case T_IS_GREATER_OR_EQUAL:
7540+
$len = strlen($text);
7541+
if ($len > $blockCountEquals[$blockCounter]) {
7542+
$blockCountEquals[$blockCounter] = $len;
7543+
}
7544+
break;
7545+
}
7546+
}
7547+
7548+
reset($this->tkns);
7549+
7550+
$parenCount = 0;
7551+
$bracketCount = 0;
7552+
$contextCounter = 0;
7553+
$blockCounter = 0;
7554+
7555+
while (list($index, $token) = $this->each($this->tkns)) {
7556+
list($id, $text) = $this->getToken($token);
7557+
$this->ptr = $index;
7558+
switch ($id) {
7559+
case T_WHITESPACE:
7560+
if ($this->hasLn($text) && substr_count($text, $this->newLine) >= 2) {
7561+
$blockCounter++;
7562+
}
7563+
$this->appendCode($text);
7564+
break;
7565+
case T_FUNCTION:
7566+
++$contextCounter;
7567+
$this->appendCode($text);
7568+
break;
7569+
7570+
case ST_CURLY_OPEN:
7571+
$this->appendCode($text);
7572+
$block = $this->walkAndAccumulateCurlyBlock($this->tkns);
7573+
$aligner = new self();
7574+
$this->appendCode(
7575+
str_replace(self::OPEN_TAG, '', $aligner->format(self::OPEN_TAG . $block))
7576+
);
7577+
break;
7578+
7579+
case ST_PARENTHESES_OPEN:
7580+
++$parenCount;
7581+
$this->appendCode($text);
7582+
break;
7583+
case ST_PARENTHESES_CLOSE:
7584+
--$parenCount;
7585+
$this->appendCode($text);
7586+
break;
7587+
case ST_BRACKET_OPEN:
7588+
++$bracketCount;
7589+
$this->appendCode($text);
7590+
break;
7591+
case ST_BRACKET_CLOSE:
7592+
--$bracketCount;
7593+
$this->appendCode($text);
7594+
break;
7595+
case ST_EQUAL:
7596+
case T_PLUS_EQUAL:
7597+
case T_MINUS_EQUAL:
7598+
case T_MUL_EQUAL:
7599+
case T_POW_EQUAL:
7600+
case T_DIV_EQUAL:
7601+
case T_CONCAT_EQUAL:
7602+
case T_MOD_EQUAL:
7603+
case T_AND_EQUAL:
7604+
case T_OR_EQUAL:
7605+
case T_XOR_EQUAL:
7606+
case T_SL_EQUAL:
7607+
case T_SR_EQUAL:
7608+
case T_IS_EQUAL:
7609+
case T_IS_NOT_EQUAL:
7610+
case T_IS_IDENTICAL:
7611+
case T_IS_NOT_IDENTICAL:
7612+
case T_IS_SMALLER_OR_EQUAL:
7613+
case T_IS_GREATER_OR_EQUAL:
7614+
if (!$parenCount && !$bracketCount) {
7615+
$this->appendCode(sprintf(self::ALIGNABLE_EQUAL, $contextCounter));
7616+
if ($blockCountEquals[$blockCounter] > 1) {
7617+
$extra_chars = $blockCountEquals[$blockCounter] - strlen($text);
7618+
if ($extra_chars > 0) {
7619+
$this->appendCode(str_repeat(self::ALIGNABLE_EQUAL_SPACE, $extra_chars));
7620+
}
7621+
}
7622+
}
7623+
$this->appendCode($text);
7624+
break;
7625+
default:
7626+
$this->appendCode($text);
7627+
break;
7628+
}
7629+
}
7630+
7631+
$this->alignPlaceholders(self::ALIGNABLE_EQUAL, $contextCounter);
7632+
7633+
$this->code = str_replace(self::ALIGNABLE_EQUAL_SPACE, $this->getSpace(), $this->code);
7634+
7635+
return $this->code;
7636+
}
7637+
7638+
public function getDescription() {
7639+
return 'Vertically align "=", ".=", "&=", ">>=", etc.';
7640+
}
7641+
7642+
public function getExample() {
7643+
return <<<'EOT'
7644+
<?php
7645+
$a .= 1;
7646+
$bb = 22;
7647+
$ccc &= 333;
7648+
$d <<= 1;
7649+
7650+
$a .= 1;
7651+
$bb = 22;
7652+
$ccc &= 333;
7653+
$d <<= 1;
7654+
7655+
?>
7656+
EOT;
7657+
}
7658+
}
7659+
74937660
final class AlignGroupDoubleArrow extends AlignDoubleArrow {
74947661
public function format($source) {
74957662
$this->tkns = token_get_all($source);

tests/Original/498-align-equals.in

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,51 @@
11
<?php
2-
//passes:AlignEquals
3-
$first = '1';
4-
$second = '0';
5-
$t = '0';
6-
$longer .= '2';
7-
$loner .= '23';
8-
$b = 1;
2+
//passes:AlignSuperEquals
3+
4+
function a() {
5+
$a = 1;
6+
$a = 1;
7+
}
8+
9+
function b() {
10+
$a = 1;
11+
$a .= 1;
12+
}
13+
14+
$ccc = 1;
15+
$bb = 1;
16+
$a = 1;
17+
18+
$a = 1;
19+
$a .= 1;
20+
$ab += 1;
21+
$abc -= 1;
22+
23+
$a .= 1;
24+
$a = 1;
25+
$ab += 1;
26+
$abc -= 1;
27+
28+
$a = 1;
29+
$a == $b;
30+
$ab .= $b;
31+
$abc += $b;
32+
$abcd -= $b;
33+
$abcde *= $b;
34+
$abcdef &= $b;
35+
$abcdefg |= $b;
36+
$abcdefgh >= $b;
37+
$abcdefghi != $b;
38+
$abcdefghij <= $b;
39+
$abcdefghijk <<= $b;
40+
$abcdefghijkl >>= $b;
41+
$abcdefghijklm ^= $b;
42+
$abcdefghijklmn %= $b;
43+
$abcdef <> $b;
44+
$abcdefg !== $b;
45+
$abcdefgh === $b;
46+
$abcdefghi == $b;
47+
48+
$a .= 1;
49+
$bb = 22;
50+
$ccc &= 333;
51+
$d <<= 1;
Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,51 @@
11
<?php
2-
//passes:AlignEquals
3-
$first = '1';
4-
$second = '0';
5-
$t = '0';
6-
$longer .= '2';
7-
$loner .= '23';
8-
$b = 1;
2+
//passes:AlignSuperEquals
3+
4+
function a() {
5+
$a = 1;
6+
$a = 1;
7+
}
8+
9+
function b() {
10+
$a = 1;
11+
$a .= 1;
12+
}
13+
14+
$ccc = 1;
15+
$bb = 1;
16+
$a = 1;
17+
18+
$a = 1;
19+
$a .= 1;
20+
$ab += 1;
21+
$abc -= 1;
22+
23+
$a .= 1;
24+
$a = 1;
25+
$ab += 1;
26+
$abc -= 1;
27+
28+
$a = 1;
29+
$a == $b;
30+
$ab .= $b;
31+
$abc += $b;
32+
$abcd -= $b;
33+
$abcde *= $b;
34+
$abcdef &= $b;
35+
$abcdefg |= $b;
36+
$abcdefgh >= $b;
37+
$abcdefghi != $b;
38+
$abcdefghij <= $b;
39+
$abcdefghijk <<= $b;
40+
$abcdefghijkl >>= $b;
41+
$abcdefghijklm ^= $b;
42+
$abcdefghijklmn %= $b;
43+
$abcdef != $b;
44+
$abcdefg !== $b;
45+
$abcdefgh === $b;
46+
$abcdefghi == $b;
47+
48+
$a .= 1;
49+
$bb = 22;
50+
$ccc &= 333;
51+
$d <<= 1;

0 commit comments

Comments
 (0)