Skip to content

Commit 3b5038d

Browse files
committed
Fix #96 SCSS parser failure (S2260): parser does not support identifiers starting with '-#'
1 parent 8f4f498 commit 3b5038d

File tree

6 files changed

+19
-1
lines changed

6 files changed

+19
-1
lines changed

css-frontend/src/main/java/org/sonar/css/parser/LexicalGrammar.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,8 @@ public enum LexicalGrammar implements GrammarRuleKey {
299299
SCSS_MULTILINE_STRING,
300300
SCSS_MULTILINE_STRING_LITERAL,
301301

302+
SCSS_IDENT,
303+
302304
/* Less */
303305
LESS_VARIABLE_DECLARATION,
304306
LESS_VARIABLE_DECLARATION_AS_PARAMETER,
@@ -623,10 +625,17 @@ private static void scss(LexerlessGrammarBuilder b) {
623625
b.rule(SCSS_AT_ROOT_WITH).is(SPACING, b.token(GenericTokenType.LITERAL, "with"));
624626
b.rule(SCSS_AT_ROOT_WITHOUT).is(SPACING, b.token(GenericTokenType.LITERAL, "without"));
625627

628+
b.rule(SCSS_IDENT).is(
629+
b.firstOf(
630+
b.regexp("(?i)(progid:DXImageTransform\\.Microsoft\\.[a-z]+)"),
631+
b.sequence(_NMSTART, b.zeroOrMore(_NMCHAR)),
632+
b.oneOrMore(_NMCHAR)))
633+
.skip();
634+
626635
b.rule(SCSS_IDENT_INTERPOLATED_IDENTIFIER_NO_WS).is(
627636
b.token(GenericTokenType.LITERAL,
628637
b.sequence(
629-
b.optional(IDENT_IDENTIFIER_NO_WS),
638+
b.optional(SCSS_IDENT),
630639
b.regexp("#\\{[^\\n\\r\\f\\}]*\\}"),
631640
b.zeroOrMore(
632641
b.firstOf(

css-frontend/src/test/java/org/sonar/css/parser/scss/ClassSelectorTreeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public void classSelector() {
4141
checkParsed(".abc#{$class}", "abc#{$class}", true);
4242
checkParsed(".abc#{$class}#{$class1}def", "abc#{$class}#{$class1}def", true);
4343
checkParsed(".abc#{$class}e#{$class1}def", "abc#{$class}e#{$class1}def", true);
44+
checkParsed(".-abc#{$class}e#{$class1}def", "-abc#{$class}e#{$class1}def", true);
45+
checkParsed(".--abc#{$class}e#{$class1}def", "--abc#{$class}e#{$class1}def", true);
4446
}
4547

4648
@Test

css-frontend/src/test/java/org/sonar/css/parser/scss/IdSelectorTreeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ public IdSelectorTreeTest() {
3535
public void idSelector() {
3636
checkParsed("#id", "id", false);
3737
checkParsed("#id#{$abc}-def", "id#{$abc}-def", true);
38+
checkParsed("#-id#{$abc}-def", "-id#{$abc}-def", true);
39+
checkParsed("#--id#{$abc}-def", "--id#{$abc}-def", true);
3840
}
3941

4042
@Test

css-frontend/src/test/java/org/sonar/css/parser/scss/ScssInterpolatedIdentifierNoWSTreeTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public void scssInterpolatedIdentifierNoWS() {
4040
checkParsed("abc#{$class}");
4141
checkParsed("abc#{$class}#{$class1}def");
4242
checkParsed("-moz-abc#{$class}e#{$class1}def");
43+
checkParsed("--abc#{$class}e#{$class1}def");
4344
}
4445

4546
@Test

css-frontend/src/test/java/org/sonar/css/parser/scss/ScssInterpolatedIdentifierTreeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public void scssInterpolatedIdentifier() {
3838
checkParsed(" -moz-abc#{ $abc * 2 + 3}e#{$class1}def", "-moz-abc#{ $abc * 2 + 3}e#{$class1}def");
3939
checkParsed("#{ 2 * 3 + 5 + $abc}", "#{ 2 * 3 + 5 + $abc}");
4040
checkParsed("abc#{ 2 * 3 + 5 + $abc}def", "abc#{ 2 * 3 + 5 + $abc}def");
41+
checkParsed("-abc#{ 2 * 3 + 5 + $abc}def", "-abc#{ 2 * 3 + 5 + $abc}def");
42+
checkParsed("--abc#{ 2 * 3 + 5 + $abc}def", "--abc#{ 2 * 3 + 5 + $abc}def");
4143
}
4244

4345
@Test

css-frontend/src/test/java/org/sonar/css/parser/scss/ScssMixinTreeTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ public void scssMixin() {
9595
assertThat(tree.block().propertyDeclarations()).hasSize(2);
9696
assertThat(tree.block().rulesets()).hasSize(2);
9797
assertThat(tree.block().scssMixinIncludes()).hasSize(2);
98+
99+
checkParsed("@mixin view-mixin($key) { &-#{$key}-view { color: red; } }");
98100
}
99101

100102
@Test

0 commit comments

Comments
 (0)