Skip to content

Commit 12e1a90

Browse files
committed
Fix #102 Add parameter to 'experimental-not-less-function-usage' rules to flag some functions as non-experimental
1 parent 9aa2b12 commit 12e1a90

File tree

9 files changed

+91
-1
lines changed

9 files changed

+91
-1
lines changed

css-checks/src/main/java/org/sonar/css/checks/less/ExperimentalNotLessFunctionCheck.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,21 @@
1919
*/
2020
package org.sonar.css.checks.less;
2121

22+
import com.google.common.annotations.VisibleForTesting;
2223
import org.sonar.check.Priority;
2324
import org.sonar.check.Rule;
25+
import org.sonar.check.RuleProperty;
26+
import org.sonar.css.checks.CheckList;
27+
import org.sonar.css.checks.CheckUtils;
2428
import org.sonar.css.checks.Tags;
2529
import org.sonar.plugins.css.api.tree.css.FunctionTree;
2630
import org.sonar.plugins.css.api.visitors.DoubleDispatchVisitorCheck;
2731
import org.sonar.squidbridge.annotations.ActivatedByDefault;
2832
import org.sonar.squidbridge.annotations.SqaleConstantRemediation;
2933

34+
import java.util.regex.Pattern;
35+
import java.util.regex.PatternSyntaxException;
36+
3037
@Rule(
3138
key = "experimental-not-less-function-usage",
3239
name = "Experimental functions should not be used",
@@ -36,14 +43,45 @@
3643
@ActivatedByDefault
3744
public class ExperimentalNotLessFunctionCheck extends DoubleDispatchVisitorCheck {
3845

46+
private static final String DEFAULT_FUNCTIONS_TO_EXCLUDE = "";
47+
48+
@RuleProperty(
49+
key = "functionsToExclude",
50+
description = "A regular expression to exclude CSS functions from being considered as experimental. Example: \"conic-gradient|count.*\". See " + CheckUtils.LINK_TO_JAVA_REGEX_PATTERN_DOC + " for detailed regular expression syntax.",
51+
defaultValue = DEFAULT_FUNCTIONS_TO_EXCLUDE)
52+
private String functionsToExclude = DEFAULT_FUNCTIONS_TO_EXCLUDE;
53+
3954
@Override
4055
public void visitFunction(FunctionTree tree) {
41-
if (!tree.standardFunction().isLess() && (tree.isVendorPrefixed() || tree.standardFunction().isExperimental())) {
56+
if (!tree.standardFunction().isLess()
57+
&& !tree.standardFunction().getName().matches(functionsToExclude)
58+
&& (tree.isVendorPrefixed() || tree.standardFunction().isExperimental())) {
4259
addPreciseIssue(
4360
tree.function(),
4461
"Remove this usage of the experimental \"" + tree.standardFunction().getName() + "\" function.");
4562
}
4663
super.visitFunction(tree);
4764
}
4865

66+
@Override
67+
public void validateParameters() {
68+
try {
69+
Pattern.compile(functionsToExclude);
70+
} catch (PatternSyntaxException exception) {
71+
throw new IllegalStateException(paramsErrorMessage(), exception);
72+
}
73+
}
74+
75+
@VisibleForTesting
76+
void setFunctionsToExclude(String functionsToExclude) {
77+
this.functionsToExclude = functionsToExclude;
78+
}
79+
80+
private String paramsErrorMessage() {
81+
return CheckUtils.paramsErrorMessage(
82+
this.getClass(),
83+
CheckList.LESS_REPOSITORY_KEY,
84+
"functionsToExclude parameter \"" + functionsToExclude + "\" is not a valid regular expression.");
85+
}
86+
4987
}

css-checks/src/test/java/org/sonar/css/checks/less/ExperimentalNotLessFunctionCheckTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,35 @@
2121

2222
import org.junit.Test;
2323
import org.sonar.css.checks.CheckTestUtils;
24+
import org.sonar.css.checks.css.ExperimentalCssFunctionCheck;
2425
import org.sonar.css.checks.verifier.CssCheckVerifier;
2526

27+
import static org.fest.assertions.Assertions.assertThat;
28+
2629
public class ExperimentalNotLessFunctionCheckTest {
2730

2831
@Test
2932
public void test() {
3033
CssCheckVerifier.verifyLessFile(new ExperimentalNotLessFunctionCheck(), CheckTestUtils.getLessTestFile("experimentalFunctionUsage.less"));
3134
}
3235

36+
@Test
37+
public void test_exclude_functions() {
38+
ExperimentalNotLessFunctionCheck check = new ExperimentalNotLessFunctionCheck();
39+
check.setFunctionsToExclude("conic-gradient|count.*");
40+
CssCheckVerifier.verifyLessFile(check, CheckTestUtils.getLessTestFile("experimentalFunctionUsageExcludeFunctions.less"));
41+
}
42+
43+
@Test
44+
public void should_throw_an_illegal_state_exception_as_the_functionsToExclude_parameter_is_not_valid() {
45+
try {
46+
ExperimentalNotLessFunctionCheck check = new ExperimentalNotLessFunctionCheck();
47+
check.setFunctionsToExclude("(");
48+
CssCheckVerifier.issuesOnLessFile(check, CheckTestUtils.getLessTestFile("experimentalFunctionUsage.less")).noMore();
49+
} catch (IllegalStateException e) {
50+
assertThat(e.getMessage()).isEqualTo("Check less:experimental-not-less-function-usage (Experimental functions should not be used): "
51+
+ "functionsToExclude parameter \"(\" is not a valid regular expression.");
52+
}
53+
}
54+
3355
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.mybox {
2+
background: conic-gradient(#f06, rgba(0,0,0,.5));
3+
background-image: cross-fade(); /* Noncompliant */
4+
abc: supports(); /* Noncompliant */
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.mybox {
2+
background: conic-gradient(#f06, rgba(0,0,0,.5));
3+
background-image: cross-fade(); /* Noncompliant */
4+
abc: supports(); /* Noncompliant */
5+
}

its/ruling/tests/src/test/expected/less-alphabetize-declarations.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@
9999
'project:custom/less/experimentalFunctionUsage.less':[
100100
1,
101101
],
102+
'project:custom/less/experimentalFunctionUsageExcludeFunctions.less':[
103+
1,
104+
],
102105
'project:custom/less/unknownFunctions.less':[
103106
1,
104107
],

its/ruling/tests/src/test/expected/less-experimental-not-less-function-usage.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@
5050
14,
5151
18,
5252
],
53+
'project:custom/less/experimentalFunctionUsageExcludeFunctions.less':[
54+
2,
55+
3,
56+
4,
57+
],
5358
'project:custom/less/obsoleteFunctions.less':[
5459
2,
5560
3,

its/ruling/tests/src/test/expected/less-formatting.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@
262262
19,
263263
19,
264264
],
265+
'project:custom/less/experimentalFunctionUsageExcludeFunctions.less':[
266+
2,
267+
2,
268+
2,
269+
],
265270
'project:custom/less/obsoleteFunctions.less':[
266271
3,
267272
],

its/ruling/tests/src/test/expected/less-known-properties.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,4 +75,7 @@
7575
'project:custom/less/experimentalFunctionUsage.less':[
7676
7,
7777
],
78+
'project:custom/less/experimentalFunctionUsageExcludeFunctions.less':[
79+
4,
80+
],
7881
}

its/ruling/tests/src/test/expected/less-prefer-single-line-comments.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,6 +2123,10 @@
21232123
14,
21242124
18,
21252125
],
2126+
'project:custom/less/experimentalFunctionUsageExcludeFunctions.less':[
2127+
3,
2128+
4,
2129+
],
21262130
'project:custom/less/lessEscapingFunction.less':[
21272131
3,
21282132
4,

0 commit comments

Comments
 (0)