Skip to content

Commit a90f5ab

Browse files
Simplify LiteralPattern interface (#993)
1 parent 95cd31b commit a90f5ab

File tree

5 files changed

+32
-63
lines changed

5 files changed

+32
-63
lines changed

python-frontend/src/main/java/org/sonar/plugins/python/api/tree/LiteralPattern.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,4 @@ public interface LiteralPattern extends Pattern {
3939

4040
String valueAsString();
4141

42-
LiteralKind literalKind();
43-
44-
enum LiteralKind {
45-
STRING,
46-
NUMBER,
47-
BOOLEAN,
48-
NONE
49-
}
5042
}

python-frontend/src/main/java/org/sonar/plugins/python/api/tree/Tree.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ enum Kind {
5656

5757
BREAK_STMT(BreakStatement.class),
5858

59+
BOOLEAN_LITERAL_PATTERN(LiteralPattern.class),
60+
5961
CALL_EXPR(CallExpression.class),
6062

6163
CAPTURE_PATTERN(CapturePattern.class),
@@ -122,8 +124,6 @@ enum Kind {
122124

123125
LIST_LITERAL(ListLiteral.class),
124126

125-
LITERAL_PATTERN(LiteralPattern.class),
126-
127127
MATCH_STMT(MatchStatement.class),
128128

129129
MAPPING_PATTERN(MappingPattern.class),
@@ -134,8 +134,12 @@ enum Kind {
134134

135135
NONE(NoneExpression.class),
136136

137+
NONE_LITERAL_PATTERN(LiteralPattern.class),
138+
137139
NUMERIC_LITERAL(NumericLiteral.class),
138140

141+
NUMERIC_LITERAL_PATTERN(LiteralPattern.class),
142+
139143
OR_PATTERN(OrPattern.class),
140144

141145
PASS_STMT(PassStatement.class),
@@ -160,6 +164,8 @@ enum Kind {
160164

161165
STRING_LITERAL(StringLiteral.class),
162166

167+
STRING_LITERAL_PATTERN(LiteralPattern.class),
168+
163169
STRING_ELEMENT(StringElement.class),
164170

165171
FORMATTED_EXPRESSION(FormattedExpression.class),

python-frontend/src/main/java/org/sonar/python/tree/LiteralPatternImpl.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,32 +31,27 @@
3131
// TODO: should we consider None as NoneExpression?
3232
public class LiteralPatternImpl extends PyTree implements LiteralPattern {
3333

34-
private final LiteralKind literalKind;
34+
private final Kind kind;
3535
private final List<Token> tokens;
3636

37-
public LiteralPatternImpl(List<Token> tokens, LiteralKind literalKind) {
38-
this.literalKind = literalKind;
37+
public LiteralPatternImpl(List<Token> tokens, Kind kind) {
3938
this.tokens = tokens;
39+
this.kind = kind;
4040
}
4141

4242
@Override
4343
public String valueAsString() {
4444
return tokens.stream().map(Token::value).collect(Collectors.joining());
4545
}
4646

47-
@Override
48-
public LiteralKind literalKind() {
49-
return literalKind;
50-
}
51-
5247
@Override
5348
public void accept(TreeVisitor visitor) {
5449
visitor.visitLiteralPattern(this);
5550
}
5651

5752
@Override
5853
public Kind getKind() {
59-
return Kind.LITERAL_PATTERN;
54+
return kind;
6055
}
6156

6257
@Override

python-frontend/src/main/java/org/sonar/python/tree/PythonTreeMaker.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,15 +1048,15 @@ private static MappingPattern mappingPattern(AstNode astNode) {
10481048
}
10491049

10501050
private static LiteralPattern literalPattern(AstNode literalPattern) {
1051-
LiteralPattern.LiteralKind literalKind;
1051+
Tree.Kind literalKind;
10521052
if (literalPattern.hasDirectChildren(PythonGrammar.COMPLEX_NUMBER, PythonGrammar.SIGNED_NUMBER)) {
1053-
literalKind = LiteralPattern.LiteralKind.NUMBER;
1053+
literalKind = Tree.Kind.NUMERIC_LITERAL_PATTERN;
10541054
} else if (literalPattern.hasDirectChildren(PythonTokenType.STRING)) {
1055-
literalKind = LiteralPattern.LiteralKind.STRING;
1055+
literalKind = Tree.Kind.STRING_LITERAL_PATTERN;
10561056
} else if (literalPattern.hasDirectChildren(PythonKeyword.NONE)) {
1057-
literalKind = LiteralPattern.LiteralKind.NONE;
1057+
literalKind = Tree.Kind.NONE_LITERAL_PATTERN;
10581058
} else {
1059-
literalKind = LiteralPattern.LiteralKind.BOOLEAN;
1059+
literalKind = Tree.Kind.BOOLEAN_LITERAL_PATTERN;
10601060
}
10611061
List<Token> tokens = literalPattern.getTokens().stream().map(PythonTreeMaker::toPyToken).collect(Collectors.toList());
10621062
return new LiteralPatternImpl(tokens, literalKind);

python-frontend/src/test/java/org/sonar/python/tree/PythonTreeMakerMatchStatementTest.java

Lines changed: 15 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,11 @@ public void match_statement() {
7474
assertThat(caseBlock.guard()).isNull();
7575
assertThat(caseBlock.body().statements()).extracting(Tree::getKind).containsExactly(Kind.EXPRESSION_STMT);
7676
assertThat(caseBlock.children()).extracting(Tree::getKind)
77-
.containsExactly(Kind.TOKEN, Kind.LITERAL_PATTERN, Kind.TOKEN, Kind.STATEMENT_LIST);
77+
.containsExactly(Kind.TOKEN, Kind.NUMERIC_LITERAL_PATTERN, Kind.TOKEN, Kind.STATEMENT_LIST);
7878

7979
Pattern pattern = caseBlock.pattern();
80-
assertThat(pattern.getKind()).isEqualTo(Kind.LITERAL_PATTERN);
80+
assertThat(pattern.getKind()).isEqualTo(Kind.NUMERIC_LITERAL_PATTERN);
8181
LiteralPattern literalPattern = (LiteralPattern) pattern;
82-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.NUMBER);
8382
assertThat(literalPattern.children()).extracting(Tree::getKind)
8483
.containsExactly(Kind.TOKEN);
8584
}
@@ -130,41 +129,13 @@ public void case_block_with_guard() {
130129

131130
@Test
132131
public void literal_patterns() {
133-
setRootRule(PythonGrammar.CASE_BLOCK);
134-
CaseBlock caseBlock = parse("case \"foo\": ...", treeMaker::caseBlock);
135-
LiteralPattern literalPattern = (LiteralPattern) caseBlock.pattern();
136-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.STRING);
137-
assertThat(literalPattern.valueAsString()).isEqualTo("\"foo\"");
138-
139-
caseBlock = parse("case \"foo\" \"bar\": ...", treeMaker::caseBlock);
140-
literalPattern = (LiteralPattern) caseBlock.pattern();
141-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.STRING);
142-
assertThat(literalPattern.valueAsString()).isEqualTo("\"foo\"\"bar\"");
143-
144-
caseBlock = parse("case -42: ...", treeMaker::caseBlock);
145-
literalPattern = (LiteralPattern) caseBlock.pattern();
146-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.NUMBER);
147-
assertThat(literalPattern.valueAsString()).isEqualTo("-42");
148-
149-
caseBlock = parse("case 3 + 5j: ...", treeMaker::caseBlock);
150-
literalPattern = (LiteralPattern) caseBlock.pattern();
151-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.NUMBER);
152-
assertThat(literalPattern.valueAsString()).isEqualTo("3+5j");
153-
154-
caseBlock = parse("case None: ...", treeMaker::caseBlock);
155-
literalPattern = (LiteralPattern) caseBlock.pattern();
156-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.NONE);
157-
assertThat(literalPattern.valueAsString()).isEqualTo("None");
158-
159-
caseBlock = parse("case True: ...", treeMaker::caseBlock);
160-
literalPattern = (LiteralPattern) caseBlock.pattern();
161-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.BOOLEAN);
162-
assertThat(literalPattern.valueAsString()).isEqualTo("True");
163-
164-
caseBlock = parse("case False: ...", treeMaker::caseBlock);
165-
literalPattern = (LiteralPattern) caseBlock.pattern();
166-
assertThat(literalPattern.literalKind()).isEqualTo(LiteralPattern.LiteralKind.BOOLEAN);
167-
assertThat(literalPattern.valueAsString()).isEqualTo("False");
132+
assertLiteralPattern(pattern("case \"foo\": ..."), Kind.STRING_LITERAL_PATTERN, "\"foo\"");
133+
assertLiteralPattern(pattern("case \"foo\" \"bar\": ..."), Kind.STRING_LITERAL_PATTERN, "\"foo\"\"bar\"");
134+
assertLiteralPattern(pattern("case -42: ..."), Kind.NUMERIC_LITERAL_PATTERN, "-42");
135+
assertLiteralPattern(pattern("case 3 + 5j: ..."), Kind.NUMERIC_LITERAL_PATTERN, "3+5j");
136+
assertLiteralPattern(pattern("case None: ..."), Kind.NONE_LITERAL_PATTERN, "None");
137+
assertLiteralPattern(pattern("case True: ..."), Kind.BOOLEAN_LITERAL_PATTERN, "True");
138+
assertLiteralPattern(pattern("case False: ..."), Kind.BOOLEAN_LITERAL_PATTERN, "False");
168139
}
169140

170141
@Test
@@ -184,7 +155,7 @@ public void as_pattern() {
184155
AsPattern asPattern = (AsPattern) caseBlock.pattern();
185156
assertThat(asPattern.pattern()).isInstanceOf(LiteralPattern.class);
186157
assertThat(asPattern.alias().name()).isEqualTo("x");
187-
assertThat(asPattern.children()).extracting(Tree::getKind).containsExactly(Tree.Kind.LITERAL_PATTERN, Tree.Kind.TOKEN, Tree.Kind.NAME);
158+
assertThat(asPattern.children()).extracting(Tree::getKind).containsExactly(Kind.STRING_LITERAL_PATTERN, Tree.Kind.TOKEN, Tree.Kind.NAME);
188159

189160
caseBlock = parse("case value as x: ...", treeMaker::caseBlock);
190161
asPattern = (AsPattern) caseBlock.pattern();
@@ -353,6 +324,11 @@ private void assertSequenceElements(SequencePattern sequencePattern, Kind... ele
353324
assertThat(sequencePattern.elements()).extracting(Tree::getKind).containsExactly(elements);
354325
}
355326

327+
private void assertLiteralPattern(LiteralPattern literalPattern, Kind literalKind, String valueAsString) {
328+
assertThat(literalPattern.getKind()).isEqualTo(literalKind);
329+
assertThat(literalPattern.valueAsString()).isEqualTo(valueAsString);
330+
}
331+
356332
@SuppressWarnings("unchecked")
357333
private <T extends Pattern> T pattern(String code) {
358334
setRootRule(PythonGrammar.CASE_BLOCK);

0 commit comments

Comments
 (0)