Skip to content

Commit a7db2a7

Browse files
authored
Merge pull request #22664 from asgerf/unified/wildcard_pattern
Unified: Fix translation of wildcard patterns
2 parents 9e935d8 + f41f246 commit a7db2a7

8 files changed

Lines changed: 32 additions & 20 deletions

File tree

‎unified/extractor/ast_types.yml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ supertypes:
3737
- or_pattern
3838
- conditional_pattern
3939
- bulk_importing_pattern
40+
- ignore_pattern
4041
- generic_type_expr
4142
- inferred_type_expr
4243
# An element of an `unresolved_operator_sequence`: either an operand (`expr`)
@@ -411,6 +412,9 @@ named:
411412
bulk_importing_pattern:
412413
modifier*: modifier
413414

415+
# A pattern that accepts any incoming value, usually written as an `_`.
416+
ignore_pattern:
417+
414418
# A simple unqualified name token
415419
identifier:
416420

‎unified/extractor/src/languages/swift/swift.rs‎

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,8 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
206206
// referenced identifier / operator symbol.
207207
rule!((declReferenceExpr baseName: @name) => (identifier #{name})),
208208
// A discard `_` used as an expression — e.g. the target of a discarding
209-
// assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`;
210-
// the target AST represents it as a `name_node` over the `_` token.
211-
rule!((discardAssignmentExpr wildcard: @@w) => (identifier #{w})),
209+
// assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`.
210+
rule!((discardAssignmentExpr wildcard: @@w) => (ignore_pattern #{w})),
212211
// A generic specialization in expression position (`C<Foo>`,
213212
// `Array<Int>`) is represented by swift-syntax as a
214213
// `genericSpecializationExpr`. When used as a call target
@@ -560,7 +559,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
560559
// A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax
561560
// models this as a `wildcardPattern`, distinct from the `_` match form
562561
// handled by the context-aware `discardAssignmentExpr` rule.
563-
rule!((wildcardPattern) @@wildcard => (identifier #{wildcard})),
562+
rule!((wildcardPattern) @@wildcard => (ignore_pattern #{wildcard})),
564563
// An expression pattern only establishes pattern context; its child
565564
// determines the concrete pattern shape.
566565
rule!((expressionPattern expression: @@e) => expr {

‎unified/extractor/tests/corpus/swift/control-flow/switch-with-labeled-case-pattern-arguments.output‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ top_level source="⟨body⟩"
159159
argument:
160160
argument source="⟨name_node⟩: ⟨value⟩"
161161
name_node: identifier "threadRowId" source="threadRowId"
162-
value: identifier "_" source="_"
162+
value: ignore_pattern "_" source="_"
163163
argument source="⟨value⟩"
164164
value:
165165
expr_pattern source="⟨modifier⟩ ⟨expr⟩"

‎unified/extractor/tests/corpus/swift/expressions/super-expression.output‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ top_level source="⟨body⟩"
171171
block source="{\n ⟨stmt⟩\n ⟨stmt⟩\n }"
172172
stmt:
173173
binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩"
174-
left: identifier "_" source="_"
174+
left: ignore_pattern "_" source="_"
175175
operator: infix_operator "=" source="="
176176
right:
177177
member_access_expr source="⟨base⟩.⟨member_name_node⟩"

‎unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence-with-casts.output‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ top_level source="⟨body⟩"
109109
stmt:
110110
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
111111
element:
112-
identifier "_" source="_"
112+
ignore_pattern "_" source="_"
113113
infix_operator "=" source="="
114114
identifier "a" source="a"
115115
infix_operator "as" source="as"
@@ -118,7 +118,7 @@ top_level source="⟨body⟩"
118118
identifier "b" source="b"
119119
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
120120
element:
121-
identifier "_" source="_"
121+
ignore_pattern "_" source="_"
122122
infix_operator "=" source="="
123123
identifier "a" source="a"
124124
infix_operator "is" source="is"

‎unified/extractor/tests/corpus/swift/operators/unresolved-operator-sequence.output‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ top_level source="⟨body⟩"
8282
stmt:
8383
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
8484
element:
85-
identifier "_" source="_"
85+
ignore_pattern "_" source="_"
8686
infix_operator "=" source="="
8787
identifier "a" source="a"
8888
infix_operator ".&" source=".&"

‎unified/ql/lib/codeql/unified/internal/Ast.qll‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,12 @@ module Unified {
836836
}
837837
}
838838

839+
/** A class representing `ignore_pattern` tokens. */
840+
class IgnorePattern extends @unified_token_ignore_pattern, F::Expr, F::Token {
841+
/** Gets the name of the primary QL class for this element. */
842+
final override string getAPrimaryQlClass() { result = "IgnorePattern" }
843+
}
844+
839845
/** A class representing `import_declaration` nodes. */
840846
class ImportDeclaration extends @unified_import_declaration, F::Stmt {
841847
/** Gets the name of the primary QL class for this element. */
@@ -1894,6 +1900,8 @@ module UnifiedFinal {
18941900

18951901
final class IfExpr = F::IfExpr;
18961902

1903+
final class IgnorePattern = F::IgnorePattern;
1904+
18971905
final class ImportDeclaration = F::ImportDeclaration;
18981906

18991907
final class InferredTypeExpr = F::InferredTypeExpr;

‎unified/ql/lib/unified.dbscheme‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ unified_equality_type_constraint_def(
435435
int right: @unified_expr ref
436436
);
437437

438-
@unified_expr = @unified_array_literal | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence
438+
@unified_expr = @unified_array_literal | @unified_binary_expr | @unified_block | @unified_break_expr | @unified_bulk_importing_pattern | @unified_call_expr | @unified_conditional_pattern | @unified_continue_expr | @unified_expr_pattern | @unified_function_expr | @unified_generic_type_expr | @unified_if_expr | @unified_key_value_pair | @unified_map_literal | @unified_member_access_expr | @unified_named_pattern | @unified_or_pattern | @unified_pattern_guard_expr | @unified_return_expr | @unified_string_interpolation_expr | @unified_switch_expr | @unified_throw_expr | @unified_token_boolean_literal | @unified_token_builtin_expr | @unified_token_empty_expr | @unified_token_float_literal | @unified_token_identifier | @unified_token_ignore_pattern | @unified_token_inferred_type_expr | @unified_token_int_literal | @unified_token_regex_literal | @unified_token_string_literal | @unified_token_super_expr | @unified_token_unsupported_node | @unified_try_expr | @unified_tuple_expr | @unified_type_cast_expr | @unified_type_test_expr | @unified_unary_expr | @unified_unresolved_operator_sequence
439439

440440
@unified_expr_or_operator = @unified_expr | @unified_token_infix_operator
441441

@@ -980,16 +980,17 @@ case @unified_token.kind of
980980
| 5 = @unified_token_fixity
981981
| 6 = @unified_token_float_literal
982982
| 7 = @unified_token_identifier
983-
| 8 = @unified_token_inferred_type_expr
984-
| 9 = @unified_token_infix_operator
985-
| 10 = @unified_token_int_literal
986-
| 11 = @unified_token_modifier
987-
| 12 = @unified_token_postfix_operator
988-
| 13 = @unified_token_prefix_operator
989-
| 14 = @unified_token_regex_literal
990-
| 15 = @unified_token_string_literal
991-
| 16 = @unified_token_super_expr
992-
| 17 = @unified_token_unsupported_node
983+
| 8 = @unified_token_ignore_pattern
984+
| 9 = @unified_token_inferred_type_expr
985+
| 10 = @unified_token_infix_operator
986+
| 11 = @unified_token_int_literal
987+
| 12 = @unified_token_modifier
988+
| 13 = @unified_token_postfix_operator
989+
| 14 = @unified_token_prefix_operator
990+
| 15 = @unified_token_regex_literal
991+
| 16 = @unified_token_string_literal
992+
| 17 = @unified_token_super_expr
993+
| 18 = @unified_token_unsupported_node
993994
;
994995

995996

0 commit comments

Comments
 (0)