Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions unified/extractor/ast_types.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ supertypes:
- or_pattern
- conditional_pattern
- bulk_importing_pattern
- ignore_pattern
- generic_type_expr
- inferred_type_expr
# An element of an `unresolved_operator_sequence`: either an operand (`expr`)
Expand Down Expand Up @@ -411,6 +412,9 @@ named:
bulk_importing_pattern:
modifier*: modifier

# A pattern that accepts any incoming value, usually written as an `_`.
ignore_pattern:

# A simple unqualified name token
identifier:

Expand Down
7 changes: 3 additions & 4 deletions unified/extractor/src/languages/swift/swift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,8 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
// referenced identifier / operator symbol.
rule!((declReferenceExpr baseName: @name) => (identifier #{name})),
// A discard `_` used as an expression — e.g. the target of a discarding
// assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`;
// the target AST represents it as a `name_node` over the `_` token.
rule!((discardAssignmentExpr wildcard: @@w) => (identifier #{w})),
// assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`.
rule!((discardAssignmentExpr wildcard: @@w) => (ignore_pattern #{w})),

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. This is already fixed in #22657 since it removes the nested rule, so I'll wait for that to merge first.

// A generic specialization in expression position (`C<Foo>`,
// `Array<Int>`) is represented by swift-syntax as a
// `genericSpecializationExpr`. When used as a call target
Expand Down Expand Up @@ -560,7 +559,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
// A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax
// models this as a `wildcardPattern`, distinct from the `_` match form
// handled by the context-aware `discardAssignmentExpr` rule.
rule!((wildcardPattern) @@wildcard => (identifier #{wildcard})),
rule!((wildcardPattern) @@wildcard => (ignore_pattern #{wildcard})),
// An expression pattern only establishes pattern context; its child
// determines the concrete pattern shape.
rule!((expressionPattern expression: @@e) => expr {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ top_level source="⟨body⟩"
argument:
argument source="⟨name_node⟩: ⟨value⟩"
name_node: identifier "threadRowId" source="threadRowId"
value: identifier "_" source="_"
value: ignore_pattern "_" source="_"
argument source="⟨value⟩"
value:
expr_pattern source="⟨modifier⟩ ⟨expr⟩"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ top_level source="⟨body⟩"
block source="{\n ⟨stmt⟩\n ⟨stmt⟩\n }"
stmt:
binary_expr source="⟨left⟩ ⟨operator⟩ ⟨right⟩"
left: identifier "_" source="_"
left: ignore_pattern "_" source="_"
operator: infix_operator "=" source="="
right:
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ top_level source="⟨body⟩"
stmt:
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
element:
identifier "_" source="_"
ignore_pattern "_" source="_"
infix_operator "=" source="="
identifier "a" source="a"
infix_operator "as" source="as"
Expand All @@ -118,7 +118,7 @@ top_level source="⟨body⟩"
identifier "b" source="b"
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
element:
identifier "_" source="_"
ignore_pattern "_" source="_"
infix_operator "=" source="="
identifier "a" source="a"
infix_operator "is" source="is"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ top_level source="⟨body⟩"
stmt:
unresolved_operator_sequence source="⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩ ⟨element⟩"
element:
identifier "_" source="_"
ignore_pattern "_" source="_"
infix_operator "=" source="="
identifier "a" source="a"
infix_operator ".&" source=".&"
Expand Down
8 changes: 8 additions & 0 deletions unified/ql/lib/codeql/unified/internal/Ast.qll
Original file line number Diff line number Diff line change
Expand Up @@ -836,6 +836,12 @@ module Unified {
}
}

/** A class representing `ignore_pattern` tokens. */
class IgnorePattern extends @unified_token_ignore_pattern, F::Expr, F::Token {
/** Gets the name of the primary QL class for this element. */
final override string getAPrimaryQlClass() { result = "IgnorePattern" }
}

/** A class representing `import_declaration` nodes. */
class ImportDeclaration extends @unified_import_declaration, F::Stmt {
/** Gets the name of the primary QL class for this element. */
Expand Down Expand Up @@ -1894,6 +1900,8 @@ module UnifiedFinal {

final class IfExpr = F::IfExpr;

final class IgnorePattern = F::IgnorePattern;

final class ImportDeclaration = F::ImportDeclaration;

final class InferredTypeExpr = F::InferredTypeExpr;
Expand Down
23 changes: 12 additions & 11 deletions unified/ql/lib/unified.dbscheme
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ unified_equality_type_constraint_def(
int right: @unified_expr ref
);

@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
@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

@unified_expr_or_operator = @unified_expr | @unified_token_infix_operator

Expand Down Expand Up @@ -980,16 +980,17 @@ case @unified_token.kind of
| 5 = @unified_token_fixity
| 6 = @unified_token_float_literal
| 7 = @unified_token_identifier
| 8 = @unified_token_inferred_type_expr
| 9 = @unified_token_infix_operator
| 10 = @unified_token_int_literal
| 11 = @unified_token_modifier
| 12 = @unified_token_postfix_operator
| 13 = @unified_token_prefix_operator
| 14 = @unified_token_regex_literal
| 15 = @unified_token_string_literal
| 16 = @unified_token_super_expr
| 17 = @unified_token_unsupported_node
| 8 = @unified_token_ignore_pattern
| 9 = @unified_token_inferred_type_expr
| 10 = @unified_token_infix_operator
| 11 = @unified_token_int_literal
| 12 = @unified_token_modifier
| 13 = @unified_token_postfix_operator
| 14 = @unified_token_prefix_operator
| 15 = @unified_token_regex_literal
| 16 = @unified_token_string_literal
| 17 = @unified_token_super_expr
| 18 = @unified_token_unsupported_node
;


Expand Down
Loading