Skip to content

Commit 31e8d7d

Browse files
committed
fix comment lexing
1 parent 129666c commit 31e8d7d

File tree

10 files changed

+140
-17
lines changed

10 files changed

+140
-17
lines changed

src/main/java/net/seesharpsoft/intellij/plugins/csv/CsvLexer.flex

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ VALUE_SEPARATOR=[,:;|\t]
3939
RECORD_SEPARATOR=\n
4040
ESCAPED_QUOTE=\"\"|\\\"
4141
QUOTE=\"
42-
TEXT=[^ ,:;|\t\r\n\"\\]+
42+
TEXT=[^ ,:;|\t\r\n\"\\#]+
4343
BACKSLASH=\\+
44+
HASHTAG=#
4445
COMMENT=\#[^\n]*
4546

4647
%state UNQUOTED
@@ -91,6 +92,11 @@ COMMENT=\#[^\n]*
9192
return CsvTypes.TEXT;
9293
}
9394

95+
<UNQUOTED, QUOTED> {HASHTAG}
96+
{
97+
return CsvTypes.TEXT;
98+
}
99+
94100
<QUOTED> {TEXT}
95101
{
96102
return CsvTypes.TEXT;

src/test/java/net/seesharpsoft/intellij/plugins/csv/parser/CsvParsingTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ public void testCsvWithCommentsWithoutCommentSupport() {
8585
}
8686

8787
public void testCsvWithCommentsWithoutCommentSupportCustom() {
88-
setName("CsvWithCommentsWithoutCommentSupport");
8988
// enforce custom lexer
9089
CsvEditorSettings.getInstance().setDefaultValueSeparator(new CsvValueSeparator(","));
9190
CsvEditorSettings.getInstance().setCommentIndicator("");
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
header#1,header#2
22
# just a comment with whitespace at the start, "yes" - still a comment
33
"# not a comment",#and this also not
4-
#but here again:,| a comment
4+
#but here again:,| a comment
5+
#comment

src/test/resources/parser/CsvWithComments.txt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
CSV File(0,156)
1+
CSV File(0,165)
22
CsvRecordImpl(RECORD)(0,17)
33
CsvFieldImpl(FIELD)(0,8)
4-
PsiElement(CsvTokenType.TEXT)('header#1')(0,8)
4+
PsiElement(CsvTokenType.TEXT)('header')(0,6)
5+
PsiElement(CsvTokenType.TEXT)('#')(6,7)
6+
PsiElement(CsvTokenType.TEXT)('1')(7,8)
57
PsiElement(CsvTokenType.COMMA)(',')(8,9)
68
CsvFieldImpl(FIELD)(9,17)
7-
PsiElement(CsvTokenType.TEXT)('header#2')(9,17)
9+
PsiElement(CsvTokenType.TEXT)('header')(9,15)
10+
PsiElement(CsvTokenType.TEXT)('#')(15,16)
11+
PsiElement(CsvTokenType.TEXT)('2')(16,17)
812
PsiElement(CsvTokenType.CRLF)('\n')(17,18)
913
PsiWhiteSpace(' ')(18,20)
1014
CsvRecordImpl(RECORD)(20,90)
@@ -23,7 +27,8 @@ CSV File(0,156)
2327
PsiElement(CsvTokenType.QUOTE)('"')(107,108)
2428
PsiElement(CsvTokenType.COMMA)(',')(108,109)
2529
CsvFieldImpl(FIELD)(109,127)
26-
PsiElement(CsvTokenType.TEXT)('#and')(109,113)
30+
PsiElement(CsvTokenType.TEXT)('#')(109,110)
31+
PsiElement(CsvTokenType.TEXT)('and')(110,113)
2732
PsiWhiteSpace(' ')(113,114)
2833
PsiElement(CsvTokenType.TEXT)('this')(114,118)
2934
PsiWhiteSpace(' ')(118,119)
@@ -32,4 +37,7 @@ CSV File(0,156)
3237
PsiElement(CsvTokenType.TEXT)('not')(124,127)
3338
PsiElement(CsvTokenType.CRLF)('\n')(127,128)
3439
CsvRecordImpl(RECORD)(128,156)
35-
PsiElement(CsvTokenType.COMMENT)('#but here again:,|\ta comment')(128,156)
40+
PsiElement(CsvTokenType.COMMENT)('#but here again:,|\ta comment')(128,156)
41+
PsiElement(CsvTokenType.CRLF)('\n')(156,157)
42+
CsvRecordImpl(RECORD)(157,165)
43+
PsiElement(CsvTokenType.COMMENT)('#comment')(157,165)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
header#1,header#2
22
// just a comment with whitespace at the start, "yes" - still a comment
33
"# not a comment",#and this also not
4-
//but here again:,| a comment
4+
//but here again:,| a comment
5+
//comment

src/test/resources/parser/CsvWithCommentsCustom.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CSV File(0,158)
1+
CSV File(0,168)
22
CsvRecordImpl(RECORD)(0,17)
33
CsvFieldImpl(FIELD)(0,8)
44
PsiElement(CsvTokenType.TEXT)('header#1')(0,8)
@@ -32,4 +32,7 @@ CSV File(0,158)
3232
PsiElement(CsvTokenType.TEXT)('not')(125,128)
3333
PsiElement(CsvTokenType.CRLF)('\n')(128,129)
3434
CsvRecordImpl(RECORD)(129,158)
35-
PsiElement(CsvTokenType.COMMENT)('//but here again:,|\ta comment')(129,158)
35+
PsiElement(CsvTokenType.COMMENT)('//but here again:,|\ta comment')(129,158)
36+
PsiElement(CsvTokenType.CRLF)('\n')(158,159)
37+
CsvRecordImpl(RECORD)(159,168)
38+
PsiElement(CsvTokenType.COMMENT)('//comment')(159,168)
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
header#1,header#2
22
# this should not be recognized as a comment, this would be the second value
33
"# not a comment",#and this also not
4-
# and here again.,"no comment, just values"
4+
# and here again.,"no comment, just values"
5+
#comment

src/test/resources/parser/CsvWithCommentsWithoutCommentSupport.txt

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1-
CSV File(0,177)
1+
CSV File(0,186)
22
CsvRecordImpl(RECORD)(0,17)
33
CsvFieldImpl(FIELD)(0,8)
4-
PsiElement(CsvTokenType.TEXT)('header#1')(0,8)
4+
PsiElement(CsvTokenType.TEXT)('header')(0,6)
5+
PsiElement(CsvTokenType.TEXT)('#')(6,7)
6+
PsiElement(CsvTokenType.TEXT)('1')(7,8)
57
PsiElement(CsvTokenType.COMMA)(',')(8,9)
68
CsvFieldImpl(FIELD)(9,17)
7-
PsiElement(CsvTokenType.TEXT)('header#2')(9,17)
9+
PsiElement(CsvTokenType.TEXT)('header')(9,15)
10+
PsiElement(CsvTokenType.TEXT)('#')(15,16)
11+
PsiElement(CsvTokenType.TEXT)('2')(16,17)
812
PsiElement(CsvTokenType.CRLF)('\n')(17,18)
913
PsiWhiteSpace(' ')(18,20)
1014
CsvRecordImpl(RECORD)(20,96)
@@ -54,7 +58,8 @@ CSV File(0,177)
5458
PsiElement(CsvTokenType.QUOTE)('"')(113,114)
5559
PsiElement(CsvTokenType.COMMA)(',')(114,115)
5660
CsvFieldImpl(FIELD)(115,133)
57-
PsiElement(CsvTokenType.TEXT)('#and')(115,119)
61+
PsiElement(CsvTokenType.TEXT)('#')(115,116)
62+
PsiElement(CsvTokenType.TEXT)('and')(116,119)
5863
PsiWhiteSpace(' ')(119,120)
5964
PsiElement(CsvTokenType.TEXT)('this')(120,124)
6065
PsiWhiteSpace(' ')(124,125)
@@ -82,4 +87,9 @@ CSV File(0,177)
8287
PsiElement(CsvTokenType.TEXT)('just')(165,169)
8388
PsiWhiteSpace(' ')(169,170)
8489
PsiElement(CsvTokenType.TEXT)('values')(170,176)
85-
PsiElement(CsvTokenType.QUOTE)('"')(176,177)
90+
PsiElement(CsvTokenType.QUOTE)('"')(176,177)
91+
PsiElement(CsvTokenType.CRLF)('\n')(177,178)
92+
CsvRecordImpl(RECORD)(178,186)
93+
CsvFieldImpl(FIELD)(178,186)
94+
PsiElement(CsvTokenType.TEXT)('#')(178,179)
95+
PsiElement(CsvTokenType.TEXT)('comment')(179,186)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
header#1,header#2
2+
# this should not be recognized as a comment, this would be the second value
3+
"# not a comment",#and this also not
4+
# and here again.,"no comment, just values"
5+
#comment
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
CSV File(0,186)
2+
CsvRecordImpl(RECORD)(0,17)
3+
CsvFieldImpl(FIELD)(0,8)
4+
PsiElement(CsvTokenType.TEXT)('header#1')(0,8)
5+
PsiElement(CsvTokenType.COMMA)(',')(8,9)
6+
CsvFieldImpl(FIELD)(9,17)
7+
PsiElement(CsvTokenType.TEXT)('header#2')(9,17)
8+
PsiElement(CsvTokenType.CRLF)('\n')(17,18)
9+
PsiWhiteSpace(' ')(18,20)
10+
CsvRecordImpl(RECORD)(20,96)
11+
CsvFieldImpl(FIELD)(20,64)
12+
PsiElement(CsvTokenType.TEXT)('#')(20,21)
13+
PsiWhiteSpace(' ')(21,22)
14+
PsiElement(CsvTokenType.TEXT)('this')(22,26)
15+
PsiWhiteSpace(' ')(26,27)
16+
PsiElement(CsvTokenType.TEXT)('should')(27,33)
17+
PsiWhiteSpace(' ')(33,34)
18+
PsiElement(CsvTokenType.TEXT)('not')(34,37)
19+
PsiWhiteSpace(' ')(37,38)
20+
PsiElement(CsvTokenType.TEXT)('be')(38,40)
21+
PsiWhiteSpace(' ')(40,41)
22+
PsiElement(CsvTokenType.TEXT)('recognized')(41,51)
23+
PsiWhiteSpace(' ')(51,52)
24+
PsiElement(CsvTokenType.TEXT)('as')(52,54)
25+
PsiWhiteSpace(' ')(54,55)
26+
PsiElement(CsvTokenType.TEXT)('a')(55,56)
27+
PsiWhiteSpace(' ')(56,57)
28+
PsiElement(CsvTokenType.TEXT)('comment')(57,64)
29+
PsiElement(CsvTokenType.COMMA)(',')(64,65)
30+
PsiWhiteSpace(' ')(65,66)
31+
CsvFieldImpl(FIELD)(66,96)
32+
PsiElement(CsvTokenType.TEXT)('this')(66,70)
33+
PsiWhiteSpace(' ')(70,71)
34+
PsiElement(CsvTokenType.TEXT)('would')(71,76)
35+
PsiWhiteSpace(' ')(76,77)
36+
PsiElement(CsvTokenType.TEXT)('be')(77,79)
37+
PsiWhiteSpace(' ')(79,80)
38+
PsiElement(CsvTokenType.TEXT)('the')(80,83)
39+
PsiWhiteSpace(' ')(83,84)
40+
PsiElement(CsvTokenType.TEXT)('second')(84,90)
41+
PsiWhiteSpace(' ')(90,91)
42+
PsiElement(CsvTokenType.TEXT)('value')(91,96)
43+
PsiElement(CsvTokenType.CRLF)('\n')(96,97)
44+
CsvRecordImpl(RECORD)(97,133)
45+
CsvFieldImpl(FIELD)(97,114)
46+
PsiElement(CsvTokenType.QUOTE)('"')(97,98)
47+
PsiElement(CsvTokenType.TEXT)('#')(98,99)
48+
PsiWhiteSpace(' ')(99,100)
49+
PsiElement(CsvTokenType.TEXT)('not')(100,103)
50+
PsiWhiteSpace(' ')(103,104)
51+
PsiElement(CsvTokenType.TEXT)('a')(104,105)
52+
PsiWhiteSpace(' ')(105,106)
53+
PsiElement(CsvTokenType.TEXT)('comment')(106,113)
54+
PsiElement(CsvTokenType.QUOTE)('"')(113,114)
55+
PsiElement(CsvTokenType.COMMA)(',')(114,115)
56+
CsvFieldImpl(FIELD)(115,133)
57+
PsiElement(CsvTokenType.TEXT)('#and')(115,119)
58+
PsiWhiteSpace(' ')(119,120)
59+
PsiElement(CsvTokenType.TEXT)('this')(120,124)
60+
PsiWhiteSpace(' ')(124,125)
61+
PsiElement(CsvTokenType.TEXT)('also')(125,129)
62+
PsiWhiteSpace(' ')(129,130)
63+
PsiElement(CsvTokenType.TEXT)('not')(130,133)
64+
PsiElement(CsvTokenType.CRLF)('\n')(133,134)
65+
CsvRecordImpl(RECORD)(134,177)
66+
CsvFieldImpl(FIELD)(134,151)
67+
PsiElement(CsvTokenType.TEXT)('#')(134,135)
68+
PsiWhiteSpace(' ')(135,136)
69+
PsiElement(CsvTokenType.TEXT)('and')(136,139)
70+
PsiWhiteSpace(' ')(139,140)
71+
PsiElement(CsvTokenType.TEXT)('here')(140,144)
72+
PsiWhiteSpace(' ')(144,145)
73+
PsiElement(CsvTokenType.TEXT)('again.')(145,151)
74+
PsiElement(CsvTokenType.COMMA)(',')(151,152)
75+
CsvFieldImpl(FIELD)(152,177)
76+
PsiElement(CsvTokenType.QUOTE)('"')(152,153)
77+
PsiElement(CsvTokenType.TEXT)('no')(153,155)
78+
PsiWhiteSpace(' ')(155,156)
79+
PsiElement(CsvTokenType.TEXT)('comment')(156,163)
80+
PsiElement(CsvTokenType.ESCAPED_TEXT)(',')(163,164)
81+
PsiWhiteSpace(' ')(164,165)
82+
PsiElement(CsvTokenType.TEXT)('just')(165,169)
83+
PsiWhiteSpace(' ')(169,170)
84+
PsiElement(CsvTokenType.TEXT)('values')(170,176)
85+
PsiElement(CsvTokenType.QUOTE)('"')(176,177)
86+
PsiElement(CsvTokenType.CRLF)('\n')(177,178)
87+
CsvRecordImpl(RECORD)(178,186)
88+
CsvFieldImpl(FIELD)(178,186)
89+
PsiElement(CsvTokenType.TEXT)('#comment')(178,186)

0 commit comments

Comments
 (0)