@@ -104,12 +104,35 @@ 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+ } else {
115+ foreach ($ this ->rules as $ rulesForAProperty ) {
116+ if (\in_array ($ sibling , $ rulesForAProperty , true )) {
117+ $ siblingIsInSet = true ;
118+ // Maintain ordering within `$this->rules[$propertyName]`
119+ // by inserting before first `Rule` with a same-or-later position than the sibling.
120+ foreach ($ this ->rules [$ propertyName ] as $ index => $ rule ) {
121+ if (
122+ $ rule ->getLineNumber () > $ siblingLineNumber ||
123+ $ rule ->getLineNumber () === $ siblingLineNumber &&
124+ $ rule ->getColumnNumber () >= $ siblingColumnNumber
125+ ) {
126+ $ position = $ index ;
127+ break ;
128+ }
129+ }
130+ break ;
131+ }
132+ }
133+ }
134+ if ($ siblingIsInSet ) {
110135 // Increment column number of all existing rules on same line, starting at sibling
111- $ siblingLineNumber = $ sibling ->getLineNumber ();
112- $ siblingColumnNumber = $ sibling ->getColumnNumber ();
113136 foreach ($ this ->rules as $ rulesForAProperty ) {
114137 foreach ($ rulesForAProperty as $ rule ) {
115138 if (
@@ -123,6 +146,7 @@ public function addRule(Rule $ruleToAdd, ?Rule $sibling = null): void
123146 $ ruleToAdd ->setPosition ($ siblingLineNumber , $ siblingColumnNumber );
124147 }
125148 }
149+
126150 if ($ ruleToAdd ->getLineNumber () === null ) {
127151 //this node is added manually, give it the next best line
128152 $ columnNumber = $ ruleToAdd ->getColumnNumber () ?? 0 ;
0 commit comments