@@ -87,6 +87,9 @@ export default {
87
87
] ,
88
88
} ,
89
89
90
+ /**
91
+ * Note that the comma after a member is *not* included in `member.loc`, therefore the comma position is irrelevant
92
+ */
90
93
create ( context ) {
91
94
const [
92
95
directionShort ,
@@ -98,11 +101,38 @@ export default {
98
101
const sensitivity = caseSensitive ? "sensitive" : "insensitive" ;
99
102
const isValidOrder = comparators [ direction ] [ sortName ] [ sensitivity ] ;
100
103
101
- const commentLines = new Set ( ) ;
104
+ // Note that @humanwhocodes /momoa doesn't include comments in the object.members tree, so we can't just see if a member is preceded by a comment
105
+ const commentLineNums = new Set ( ) ;
106
+ // TODO: Only invoke this if the language supports comments
102
107
for ( const comment of context . sourceCode . comments ) {
103
- commentLines . add (
104
- `${ comment . loc . start . line } :${ comment . loc . end . line } ` ,
105
- ) ;
108
+ for (
109
+ let lineNum = comment . loc . start . line ;
110
+ lineNum <= comment . loc . end . line ;
111
+ lineNum += 1
112
+ ) {
113
+ commentLineNums . add ( lineNum ) ;
114
+ }
115
+ }
116
+
117
+ // Note that there can be comments *inside* members, e.g. `{"foo: /* comment *\/ "bar"}`, but these are ignored when calculating line-separated groups
118
+ function isLineSeparated ( prevMember , member ) {
119
+ const prevLine = prevMember . loc . end . line ;
120
+ const thisLine = member . loc . start . line ;
121
+
122
+ if ( thisLine - prevLine < 2 ) {
123
+ return false ;
124
+ }
125
+
126
+ let lineNum = prevLine + 1 ;
127
+ while ( lineNum < thisLine ) {
128
+ if ( commentLineNums . has ( lineNum ) === false ) {
129
+ return true ;
130
+ }
131
+
132
+ lineNum += 1 ;
133
+ }
134
+
135
+ return false ;
106
136
}
107
137
108
138
return {
@@ -117,35 +147,24 @@ export default {
117
147
for ( const member of node . members ) {
118
148
const thisName = getKey ( member ) ;
119
149
120
- if ( prevMember ) {
121
- const prevLine = prevMember . loc . end . line ;
122
- const thisLine = member . loc . start . line ;
123
-
124
- const membersAreAdjacent =
125
- thisLine - prevLine < 2 ||
126
- commentLines . has ( `${ prevLine } :${ thisLine } ` ) ||
127
- commentLines . has ( `${ prevLine + 1 } :${ thisLine } ` ) ||
128
- commentLines . has ( `${ prevLine } :${ thisLine - 1 } ` ) ||
129
- commentLines . has ( `${ prevLine + 1 } :${ thisLine - 1 } ` ) ;
130
-
131
- if (
132
- ( membersAreAdjacent ||
133
- allowLineSeparatedGroups === false ) &&
134
- isValidOrder ( prevName , thisName ) === false
135
- ) {
136
- context . report ( {
137
- node,
138
- loc : member . name . loc ,
139
- messageId : "sortKeys" ,
140
- data : {
141
- thisName,
142
- prevName,
143
- direction,
144
- sensitivity,
145
- sortName,
146
- } ,
147
- } ) ;
148
- }
150
+ if (
151
+ prevMember &&
152
+ isValidOrder ( prevName , thisName ) === false &&
153
+ ( allowLineSeparatedGroups === false ||
154
+ isLineSeparated ( prevMember , member ) === false )
155
+ ) {
156
+ context . report ( {
157
+ node,
158
+ loc : member . name . loc ,
159
+ messageId : "sortKeys" ,
160
+ data : {
161
+ thisName,
162
+ prevName,
163
+ direction,
164
+ sensitivity,
165
+ sortName,
166
+ } ,
167
+ } ) ;
149
168
}
150
169
151
170
prevMember = member ;
0 commit comments