@@ -104,12 +104,29 @@ public function addRule(Rule $ruleToAdd, ?Rule $sibling = null): void
104
104
$ position = \count ($ this ->rules [$ propertyName ]);
105
105
106
106
if ($ sibling !== null ) {
107
+ $ siblingLineNumber = $ sibling ->getLineNumber ();
108
+ $ siblingColumnNumber = $ sibling ->getColumnNumber ();
109
+ $ siblingIsInSet = false ;
107
110
$ siblingPosition = \array_search ($ sibling , $ this ->rules [$ propertyName ], true );
108
111
if ($ siblingPosition !== false ) {
112
+ $ siblingIsInSet = true ;
109
113
$ position = $ siblingPosition ;
114
+ } elseif ($ siblingIsInSet = $ this ->hasRule ($ sibling )) {
115
+ // Maintain ordering within `$this->rules[$propertyName]`
116
+ // by inserting before first `Rule` with a same-or-later position than the sibling.
117
+ foreach ($ this ->rules [$ propertyName ] as $ index => $ rule ) {
118
+ if (
119
+ $ rule ->getLineNumber () > $ siblingLineNumber ||
120
+ $ rule ->getLineNumber () === $ siblingLineNumber &&
121
+ $ rule ->getColumnNumber () >= $ siblingColumnNumber
122
+ ) {
123
+ $ position = $ index ;
124
+ break ;
125
+ }
126
+ }
127
+ }
128
+ if ($ siblingIsInSet ) {
110
129
// Increment column number of all existing rules on same line, starting at sibling
111
- $ siblingLineNumber = $ sibling ->getLineNumber ();
112
- $ siblingColumnNumber = $ sibling ->getColumnNumber ();
113
130
foreach ($ this ->rules as $ rulesForAProperty ) {
114
131
foreach ($ rulesForAProperty as $ rule ) {
115
132
if (
@@ -123,6 +140,7 @@ public function addRule(Rule $ruleToAdd, ?Rule $sibling = null): void
123
140
$ ruleToAdd ->setPosition ($ siblingLineNumber , $ siblingColumnNumber );
124
141
}
125
142
}
143
+
126
144
if ($ ruleToAdd ->getLineNumber () === null ) {
127
145
//this node is added manually, give it the next best line
128
146
$ columnNumber = $ ruleToAdd ->getColumnNumber () ?? 0 ;
@@ -305,4 +323,15 @@ private static function comparePositionable(Positionable $first, Positionable $s
305
323
}
306
324
return $ first ->getLineNo () - $ second ->getLineNo ();
307
325
}
326
+
327
+ private function hasRule (Rule $ rule ): bool
328
+ {
329
+ foreach ($ this ->rules as $ rulesForAProperty ) {
330
+ if (\in_array ($ rule , $ rulesForAProperty , true )) {
331
+ return true ;
332
+ }
333
+ }
334
+
335
+ return false ;
336
+ }
308
337
}
0 commit comments