@@ -50,30 +50,55 @@ module.exports = {
50
50
return
51
51
}
52
52
53
- const commentRangesMap = new Map ( )
54
53
const comments = element . comments
55
54
if ( disallowComments && comments . length > 0 ) {
56
- for ( const comment of comments ) {
57
- const [ start , end ] = comment . range
58
- commentRangesMap . set ( `${ start } -${ end } ` , comment )
59
- }
55
+ const commentRanges = comments . map ( ( comment ) => comment . range )
56
+ const elementRanges = element . children
57
+ . filter ( ( child ) => child . type === 'VElement' )
58
+ . map ( ( child ) => child . range )
59
+
60
+ let commentIndex = 0
61
+ let elementIndex = 0
62
+
63
+ const needReportComments = elementRanges . length === 0 ? comments : [ ]
64
+ while (
65
+ commentIndex < commentRanges . length &&
66
+ elementRanges . length > 0
67
+ ) {
68
+ const [ commentStart , commentEnd ] = commentRanges [ commentIndex ]
69
+ const [ elementStart , elementEnd ] = elementRanges [ elementIndex ]
70
+ if ( commentStart > elementStart && commentEnd < elementEnd ) {
71
+ commentIndex += 1
72
+ continue
73
+ }
74
+
75
+ if ( commentEnd < elementStart ) {
76
+ needReportComments . push ( comments [ commentIndex ] )
77
+ commentIndex += 1
78
+ }
79
+
80
+ // the element array has no any element, but comment still has some elements
81
+ if (
82
+ elementIndex === elementRanges . length - 1 &&
83
+ commentStart > elementEnd
84
+ ) {
85
+ needReportComments . push ( comments [ commentIndex ] )
86
+ commentIndex += 1
87
+ }
60
88
61
- for ( const child of element . children ) {
62
- if ( child . type === 'VElement' ) {
63
- for ( const range of commentRangesMap . keys ( ) ) {
64
- const ranges = range . split ( '-' )
65
- if ( ranges [ 0 ] > child . range [ 0 ] && ranges [ 1 ] < child . range [ 1 ] ) {
66
- commentRangesMap . delete ( range )
67
- }
68
- }
89
+ if (
90
+ elementIndex < elementRanges . length - 1 &&
91
+ commentStart > elementEnd
92
+ ) {
93
+ elementIndex += 1
69
94
}
70
95
}
71
96
72
- if ( commentRangesMap . size > 0 ) {
73
- for ( const node of commentRangesMap . values ( ) ) {
97
+ if ( needReportComments . length > 0 ) {
98
+ for ( const comment of needReportComments ) {
74
99
context . report ( {
75
- node,
76
- loc : node . loc ,
100
+ node : comment ,
101
+ loc : comment . loc ,
77
102
messageId : 'commentRoot'
78
103
} )
79
104
}
0 commit comments