@@ -73,46 +73,58 @@ List<Document> load() throws IOException {
73
73
* @throws IOException on read error
74
74
*/
75
75
List <Document > load (boolean expandLists ) throws IOException {
76
- List <Document > result = new ArrayList <>();
76
+ List <Document > documents = new ArrayList <>();
77
77
Document document = new Document ();
78
+ StringBuilder buffer = new StringBuilder ();
78
79
try (CharacterReader reader = new CharacterReader (this .resource )) {
79
- StringBuilder buffer = new StringBuilder ();
80
80
while (reader .read ()) {
81
81
if (reader .isPoundCharacter ()) {
82
82
if (isNewDocument (reader )) {
83
83
if (!document .isEmpty ()) {
84
- result .add (document );
84
+ documents .add (document );
85
85
}
86
86
document = new Document ();
87
87
}
88
88
else {
89
- reader .skipComment ();
90
- }
91
- }
92
- String key = loadKey (buffer , reader ).trim ();
93
- if (expandLists && key .endsWith ("[]" )) {
94
- key = key .substring (0 , key .length () - 2 );
95
- int index = 0 ;
96
- do {
97
- OriginTrackedValue value = loadValue (buffer , reader , true );
98
- document .put (key + "[" + (index ++) + "]" , value );
99
- if (!reader .isEndOfLine ()) {
100
- reader .read ();
89
+ if (document .isEmpty () && !documents .isEmpty ()) {
90
+ document = documents .remove (documents .size () - 1 );
101
91
}
92
+ reader .setLastLineComment (true );
93
+ reader .skipComment ();
102
94
}
103
- while (!reader .isEndOfLine ());
104
95
}
105
96
else {
106
- OriginTrackedValue value = loadValue ( buffer , reader , false );
107
- document . put ( key , value );
97
+ reader . setLastLineComment ( false );
98
+ loadKeyAndValue ( expandLists , document , reader , buffer );
108
99
}
109
100
}
110
101
111
102
}
112
- if (!document .isEmpty () && !result .contains (document )) {
113
- result .add (document );
103
+ if (!document .isEmpty () && !documents .contains (document )) {
104
+ documents .add (document );
105
+ }
106
+ return documents ;
107
+ }
108
+
109
+ private void loadKeyAndValue (boolean expandLists , Document document , CharacterReader reader , StringBuilder buffer )
110
+ throws IOException {
111
+ String key = loadKey (buffer , reader ).trim ();
112
+ if (expandLists && key .endsWith ("[]" )) {
113
+ key = key .substring (0 , key .length () - 2 );
114
+ int index = 0 ;
115
+ do {
116
+ OriginTrackedValue value = loadValue (buffer , reader , true );
117
+ document .put (key + "[" + (index ++) + "]" , value );
118
+ if (!reader .isEndOfLine ()) {
119
+ reader .read ();
120
+ }
121
+ }
122
+ while (!reader .isEndOfLine ());
123
+ }
124
+ else {
125
+ OriginTrackedValue value = loadValue (buffer , reader , false );
126
+ document .put (key , value );
114
127
}
115
- return result ;
116
128
}
117
129
118
130
private String loadKey (StringBuilder buffer , CharacterReader reader ) throws IOException {
@@ -149,6 +161,9 @@ private OriginTrackedValue loadValue(StringBuilder buffer, CharacterReader reade
149
161
}
150
162
151
163
boolean isNewDocument (CharacterReader reader ) throws IOException {
164
+ if (reader .isLastLineComment ()) {
165
+ return false ;
166
+ }
152
167
boolean result = reader .getLocation ().getColumn () == 0 && reader .isPoundCharacter ();
153
168
result = result && readAndExpect (reader , reader ::isHyphenCharacter );
154
169
result = result && readAndExpect (reader , reader ::isHyphenCharacter );
@@ -179,6 +194,8 @@ private static class CharacterReader implements Closeable {
179
194
180
195
private int character ;
181
196
197
+ private boolean lastLineComment ;
198
+
182
199
CharacterReader (Resource resource ) throws IOException {
183
200
this .reader = new LineNumberReader (
184
201
new InputStreamReader (resource .getInputStream (), StandardCharsets .ISO_8859_1 ));
@@ -222,6 +239,14 @@ private void skipWhitespace() throws IOException {
222
239
}
223
240
}
224
241
242
+ private void setLastLineComment (boolean lastLineComment ) {
243
+ this .lastLineComment = lastLineComment ;
244
+ }
245
+
246
+ private boolean isLastLineComment () {
247
+ return this .lastLineComment ;
248
+ }
249
+
225
250
private void skipComment () throws IOException {
226
251
while (this .character != '\n' && this .character != -1 ) {
227
252
this .character = this .reader .read ();
0 commit comments