@@ -104,12 +104,29 @@ public function addRule(Rule $ruleToAdd, ?Rule $sibling = null): void
104104 $ position = \count ($ this ->rules [$ propertyName ]);
105105
106106 if ($ sibling !== null ) {
107+ $ siblingLineNumber = $ sibling ->getLineNumber ();
108+ $ siblingColumnNumber = $ sibling ->getColumnNumber ();
109+ $ siblingIsInSet = false ;
107110 $ siblingPosition = \array_search ($ sibling , $ this ->rules [$ propertyName ], true );
108111 if ($ siblingPosition !== false ) {
112+ $ siblingIsInSet = true ;
109113 $ 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 ) {
110129 // Increment column number of all existing rules on same line, starting at sibling
111- $ siblingLineNumber = $ sibling ->getLineNumber ();
112- $ siblingColumnNumber = $ sibling ->getColumnNumber ();
113130 foreach ($ this ->rules as $ rulesForAProperty ) {
114131 foreach ($ rulesForAProperty as $ rule ) {
115132 if (
@@ -123,6 +140,7 @@ public function addRule(Rule $ruleToAdd, ?Rule $sibling = null): void
123140 $ ruleToAdd ->setPosition ($ siblingLineNumber , $ siblingColumnNumber );
124141 }
125142 }
143+
126144 if ($ ruleToAdd ->getLineNumber () === null ) {
127145 //this node is added manually, give it the next best line
128146 $ columnNumber = $ ruleToAdd ->getColumnNumber () ?? 0 ;
@@ -299,4 +317,15 @@ protected function renderRules(OutputFormat $outputFormat): string
299317
300318 return $ formatter ->removeLastSemicolon ($ result );
301319 }
320+
321+ private function hasRule (Rule $ rule ): bool
322+ {
323+ foreach ($ this ->rules as $ rulesForAProperty ) {
324+ if (\in_array ($ rule , $ rulesForAProperty , true )) {
325+ return true ;
326+ }
327+ }
328+
329+ return false ;
330+ }
302331}
0 commit comments