========================= Alternative patterns ========================= val x = y match { case 1 | a => b case "c" | "d" | "e" => f } --- (compilation_unit (val_definition (identifier) (match_expression (identifier) (case_block (case_clause (alternative_pattern (number) (identifier)) (identifier)) (case_clause (alternative_pattern (alternative_pattern (string) (string)) (string)) (identifier)))))) ========================= Typed patterns ========================= val x = y match { case 1 : Int => 2 case a : B with C => d case _: B | _: C => 3 } --- (compilation_unit (val_definition (identifier) (match_expression (identifier) (case_block (case_clause (typed_pattern (number) (type_identifier)) (number)) (case_clause (typed_pattern (identifier) (compound_type (type_identifier) (type_identifier))) (identifier)) (case_clause (alternative_pattern (typed_pattern (wildcard) (type_identifier)) (typed_pattern (wildcard) (type_identifier))) (number)))))) ============================ Tuple patterns ============================ val (a, b) = if (c) (d, e) else (f, g) val x = y match { case (A, B) => X } --- (compilation_unit (val_definition (tuple_pattern (identifier) (identifier)) (if_expression (parenthesized_expression (identifier)) (tuple_expression (identifier) (identifier)) (tuple_expression (identifier) (identifier)))) (val_definition (identifier) (match_expression (identifier) (case_block (case_clause (tuple_pattern (identifier) (identifier)) (identifier)))))) ============================ Case class patterns ============================ def showNotification(notification: Notification): String = { notification match { case Email(email, title, _) => s"You got an email from $email with title: $title" case SMS(number, message) => s"You got an SMS from $number! Message: $message" case VoiceRecording(name, link) => s"you received a Voice Recording from $name! Click the link to hear it: $link" } } --- (compilation_unit (function_definition (identifier) (parameters (parameter (identifier) (type_identifier))) (type_identifier) (block (match_expression (identifier) (case_block (case_clause (case_class_pattern (type_identifier) (identifier) (identifier) (wildcard)) (string_transform_expression (identifier) (string (interpolation (identifier)) (interpolation (identifier))))) (case_clause (case_class_pattern (type_identifier) (identifier) (identifier)) (string_transform_expression (identifier) (string (interpolation (identifier)) (interpolation (identifier))))) (case_clause (case_class_pattern (type_identifier) (identifier) (identifier)) (string_transform_expression (identifier) (string (interpolation (identifier)) (interpolation (identifier)))))))))) ============================ Infix patterns ============================ def first(x: Seq[Int]) = x match { case e :+ _ => Some(e) case _ => None } --- (compilation_unit (function_definition (identifier) (parameters (parameter (identifier) (generic_type (type_identifier) (type_arguments (type_identifier))))) (match_expression (identifier) (case_block (case_clause (infix_pattern (identifier) (operator_identifier) (wildcard)) (call_expression (identifier) (arguments (identifier)))) (case_clause (wildcard) (identifier)))))) ============================ Capture patterns ============================ val x = y match { case a @ B(1) => a case b @ C(d @ (e @ X, _: Y)) => e } --- (compilation_unit (val_definition (identifier) (match_expression (identifier) (case_block (case_clause (capture_pattern (identifier) (case_class_pattern (type_identifier) (number))) (identifier)) (case_clause (capture_pattern (identifier) (case_class_pattern (type_identifier) (capture_pattern (identifier) (tuple_pattern (capture_pattern (identifier) (identifier)) (typed_pattern (wildcard) (type_identifier)))))) (identifier))))))