From 81397bed52ecb6b2cf00d8ce3ec9f49fb6e5e8aa Mon Sep 17 00:00:00 2001 From: Maksim Kurnikov Date: Mon, 5 Aug 2024 19:04:28 +0300 Subject: [PATCH 1/2] match parser support --- src/main/grammars/MoveLexer.flex | 1 + src/main/grammars/MoveParser.bnf | 37 +- .../org/move/lang/core/MoveParserUtil.kt | 29 +- .../kotlin/org/move/lang/core/MvTokenType.kt | 3 +- .../move/lang/parser/CompleteParsingTest.kt | 1 + .../org/move/lang/parser/complete/match.move | 101 ++ .../org/move/lang/parser/complete/match.txt | 1537 +++++++++++++++++ 7 files changed, 1699 insertions(+), 10 deletions(-) create mode 100644 src/test/resources/org/move/lang/parser/complete/match.move create mode 100644 src/test/resources/org/move/lang/parser/complete/match.txt diff --git a/src/main/grammars/MoveLexer.flex b/src/main/grammars/MoveLexer.flex index 81fc65f61..655123c5b 100644 --- a/src/main/grammars/MoveLexer.flex +++ b/src/main/grammars/MoveLexer.flex @@ -119,6 +119,7 @@ IDENTIFIER=[_a-zA-Z][_a-zA-Z0-9]* "|" { return OR; } "@" { return AT; } "#" { return HASH; } + "=>" { return FAT_ARROW; } // keywords "script" { return SCRIPT_KW; } diff --git a/src/main/grammars/MoveParser.bnf b/src/main/grammars/MoveParser.bnf index 4c9823bc0..ac6bafd53 100644 --- a/src/main/grammars/MoveParser.bnf +++ b/src/main/grammars/MoveParser.bnf @@ -96,6 +96,7 @@ EQ_EQ_GT = '==>' LT_EQ_EQ_GT = '<==>' DOT_DOT = '..' + FAT_ARROW = '=>' ADDRESS = 'address_kw' HAS = 'has_kw' @@ -115,6 +116,7 @@ CONST_KW = 'const_kw' SCHEMA_KW = 'schema_kw' ENUM_KW = 'enum_kw' + MATCH_KW = 'match_kw' LOCAL = 'local_kw' GLOBAL = 'global_kw' @@ -163,6 +165,8 @@ File ::= (NamedAddressDef | Script | AddressDef | Module | ModuleSpec)* QualPathCodeFragmentElement ::= PathImpl Attr ::= '#' '[' <> ']' { pin = 1 } +private Attr_first ::= '#' + AttrItem ::= IDENTIFIER (AttrItemList | AttrItemInitializer)? { implements = [ @@ -461,6 +465,7 @@ private FunctionSignatureInner_recover ::= !('{' | '}' | ';' | <> | Item_fi private friend ::= <> private enum ::= <> +private match ::= <> private package ::= <> private for ::= <> @@ -663,9 +668,12 @@ Pat ::= TuplePat | WildPat | BindingPat +MatchPat ::= Pat | EnumVariantPat +EnumVariantPat ::= PathImpl !('{') + WildPat ::= '_' -BindingPat ::= IDENTIFIER { +BindingPat ::= IDENTIFIER !'::' { implements = [ "org.move.lang.core.psi.MvMandatoryNameIdentifierOwner" ] @@ -695,6 +703,8 @@ StructPatField ::= (BindingPat !':') | (IDENTIFIER StructPatFieldBinding) } StructPatFieldBinding ::= ':' Pat +private Pat_first ::= '_' | '(' | Path_first | AnyLitToken_first + /////////////////////////////////////////////////////////////////////////////////////////////////// // Stmts /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -820,7 +830,7 @@ private MulExpr_items ::= DivBinExpr | MulBinExpr | ModBinExpr private AddExpr_items ::= PlusBinExpr | MinusBinExpr private LogicalEqExpr_items ::= EqualsBinExpr | NotEqualsBinExpr | LessEqualsBinExpr | LessBinExpr | GreaterEqualsBinExpr | GreaterBinExpr -private ControlFlowExpr_items ::= IfExpr | LoopExpr | WhileExpr | ForExpr +private ControlFlowExpr_items ::= IfExpr | LoopExpr | MatchExpr | WhileExpr | ForExpr private UnaryExpr ::= CopyExpr | MoveExpr | DerefExpr | BangExpr | ReturnExpr | ContinueExpr | BreakExpr | AbortExpr private AtomExpr ::= @@ -1001,6 +1011,28 @@ ValueArgument ::= !')' Expr &(',' | ')') { } private ValueArgument_recover ::= !(<> | Expr_first | ')' | '}' | ';' | ',') +MatchExpr ::= Attr* <> +{ + implements = [ "org.move.lang.core.psi.ext.MvDocAndAttributeOwner" ] +} +// argument is fake, provided just to satisfy usage checker +//private MatchExprImpl ::= <> +//private MatchExprImplInner ::= match '(' Expr ')' MatchBody +MatchArgument ::= '(' Expr ')' + +MatchBody ::= '{' MatchArm_with_recover* '}' { pin = 1 } +MatchArm ::= Attr* MatchPat '=>' Expr ','? +{ + pin = 2 + implements = [ "org.move.lang.core.psi.ext.MvDocAndAttributeOwner" ] +} +private MatchArm_with_recover ::= !'}' MatchArm +{ + pin = 1 + recoverWhile = MatchArm_recover +} +private MatchArm_recover ::= !(Pat_first | Attr_first | '}') + IfExpr ::= if Condition AnyBlock ElseBlock? { pin = 1 } Condition ::= '(' ConditionBody ')' { pin = 1 } @@ -1086,6 +1118,7 @@ fake Path ::= (Path '::')? (PathIdent | PathAddress) TypeArgumentList? } private PathImpl ::= PathStart PathSegment* +private Path_first ::= PATH_MODE_IDENTIFIER | DIEM_ADDRESS | INTEGER_LITERAL PathStart ::= ((PathAddress &'::') | PathIdent) TypeArgumentList? { diff --git a/src/main/kotlin/org/move/lang/core/MoveParserUtil.kt b/src/main/kotlin/org/move/lang/core/MoveParserUtil.kt index 789c748a4..4d8ab8efc 100644 --- a/src/main/kotlin/org/move/lang/core/MoveParserUtil.kt +++ b/src/main/kotlin/org/move/lang/core/MoveParserUtil.kt @@ -97,17 +97,12 @@ object MoveParserUtil: GeneratedParserUtilBase() { return true } - enum class PathParsingMode { - VALUE, WILDCARD; - } + enum class PathParsingMode { VALUE, WILDCARD } @JvmStatic fun isPathMode(b: PsiBuilder, level: Int, mode: PathParsingMode): Boolean = mode == getPathMod(b.flags) - private val PATH_MODE_VALUE: Int = makeBitMask(2) - private val PATH_MODE_WILDCARD: Int = makeBitMask(3) - private fun setPathMod(flags: Int, mode: PathParsingMode): Int { val flag = when (mode) { PathParsingMode.VALUE -> PATH_MODE_VALUE @@ -317,6 +312,15 @@ object MoveParserUtil: GeneratedParserUtilBase() { return true } + @JvmStatic + fun remapContextualKwOnRollback(b: PsiBuilder, level: Int, p: Parser): Boolean { + val result = p.parse(b, level) + if (!result && b.tokenType in CONTEXTUAL_KEYWORDS) { + b.remapCurrentToken(IDENTIFIER) + } + return result + } + @Suppress("FunctionName") @JvmStatic fun VECTOR_IDENTIFIER(b: PsiBuilder, level: Int): Boolean { @@ -355,6 +359,9 @@ object MoveParserUtil: GeneratedParserUtilBase() { @JvmStatic fun enumKeyword(b: PsiBuilder, level: Int): Boolean = contextualKeyword(b, "enum", ENUM_KW) + @JvmStatic + fun matchKeyword(b: PsiBuilder, level: Int): Boolean = contextualKeyword(b, "match", MATCH_KW) + @JvmStatic fun packageKeyword(b: PsiBuilder, level: Int): Boolean = contextualKeyword(b, "package", PACKAGE) @@ -455,7 +462,7 @@ object MoveParserUtil: GeneratedParserUtilBase() { private val FLAGS: Key = Key("MoveParserUtil.FLAGS") private var PsiBuilder.flags: Int - get() = getUserData(FLAGS) ?: TOP_LEVEL + get() = getUserData(FLAGS) ?: DEFAULT_FLAGS set(value) = putUserData(FLAGS, value) private fun Int.setFlag(flag: Int, mode: Boolean): Int = @@ -465,6 +472,14 @@ object MoveParserUtil: GeneratedParserUtilBase() { private val TOP_LEVEL: Int = makeBitMask(0) private val INCLUDE_STMT_MODE: Int = makeBitMask(1) + private val PATH_MODE_VALUE: Int = makeBitMask(2) + private val PATH_MODE_WILDCARD: Int = makeBitMask(3) + +// private val STRUCT_ALLOWED: Int = makeBitMask(4) + + private val DEFAULT_FLAGS: Int = TOP_LEVEL +// private val DEFAULT_FLAGS: Int = TOP_LEVEL or STRUCT_ALLOWED + // msl private val MSL_LEVEL: Key = Key("MoveParserUtil.MSL_LEVEL") private var PsiBuilder.mslLevel: Int diff --git a/src/main/kotlin/org/move/lang/core/MvTokenType.kt b/src/main/kotlin/org/move/lang/core/MvTokenType.kt index e3304b206..391f76497 100644 --- a/src/main/kotlin/org/move/lang/core/MvTokenType.kt +++ b/src/main/kotlin/org/move/lang/core/MvTokenType.kt @@ -19,8 +19,9 @@ val MOVE_KEYWORDS = tokenSetOf( ASSUME, ASSERT, REQUIRES, ENSURES, INVARIANT, MODIFIES, PRAGMA, INCLUDE, ABORTS_IF, WITH, UPDATE, DECREASES, SPEC, SCHEMA_KW, GLOBAL, LOCAL, EMITS, APPLY, TO, EXCEPT, INTERNAL, - FORALL, EXISTS, IN, WHERE, + FORALL, EXISTS, IN, WHERE, MATCH_KW, ) +val CONTEXTUAL_KEYWORDS = tokenSetOf(MATCH_KW) val TYPES = tokenSetOf(PATH_TYPE, REF_TYPE, TUPLE_TYPE) diff --git a/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt b/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt index a80514bf2..1c0d291e7 100644 --- a/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt +++ b/src/test/kotlin/org/move/lang/parser/CompleteParsingTest.kt @@ -50,6 +50,7 @@ class CompleteParsingTest: MvParsingTestCase("complete") { fun `test index expr`() = doTest() fun `test public package`() = doTest() fun `test enums`() = doTest() + fun `test match`() = doTest() // feature declaration is required here, as it's a parser-level feature @CompilerV2Features(RESOURCE_CONTROL) diff --git a/src/test/resources/org/move/lang/parser/complete/match.move b/src/test/resources/org/move/lang/parser/complete/match.move new file mode 100644 index 000000000..c44577520 --- /dev/null +++ b/src/test/resources/org/move/lang/parser/complete/match.move @@ -0,0 +1,101 @@ +module 0x1::match { + + fun t1(self: Color): bool { + match (self) { + Color::Red => true, + Color::Blue => false, + Color::RGB{red, green, blue} => red + green + blue > 0, + } + } + + fun t1_field_named(self: Color): bool { + match (self) { + Color::Red => true, + Color::Blue => false, + Color::RGB{red: r, green: g, blue} => r + g + blue > 0, + } + } + + fun t1_uses_block(self: Color): bool { + match (self) { + Color::RGB{red, green, blue} => { red + green + blue > 0 }, + Color::Red => true, + Color::Blue => false, + } + } + + fun t1_uses_block_no_comma(self: Color): bool { + match (self) { + Color::RGB{red, green, blue} => { red + green + blue > 0 } + Color::Red => true, + Color::Blue => false, + } + } + + fun t1_module_qualified(self: m::Color): bool { + match (self) { + m::Color::RGB{red, green, blue} => red + green + blue > 0, + m::Color::Red => true, + m::Color::Blue => false, + } + } + + fun t1_address_qualified(self: m::Color): bool { + match (self) { + 0x815::m::Color::RGB{red, green, blue} => red + green + blue > 0, + 0x815::m::Color::Red => true, + Color::Blue => false, + } + } + + fun t2(self: Color): bool { + match (self) { + Color::RGB{red, green, blue} => red + green + blue > 0, + _ => true, + } + } + + fun t3(self: Color): bool { + match (&self) { + Color::RGB{red, green, blue} => *red + *green + *blue > 0, + _ => true, + } + } + + fun t4(self: Color): Color { + match (&mut self) { + Color::RGB{red, green: _, blue: _} => *red = 2, + _ => {}, + }; + self + } + + fun t5_freeze(self: Color): u64 { + let x = 1; + let r = match (&mut self) { + Color::Red => &x, + Color::Blue => &mut x, + _ => &mut x, + }; + *r + } + + fun t6_construct(self: Color): Color { + match (self) { + Color::RGB{red, green, blue} => Color::RGB{red: red + 1, green: green - 1, blue}, + _ => self + } + } + + fun t8_unqualified_variant(self: Color): bool { + match (self) { + RGB{red, green, blue} => red != green && green != blue, + Red => true, + Blue => false, + } + } + + fun match_as_function() { + match(1); + } +} diff --git a/src/test/resources/org/move/lang/parser/complete/match.txt b/src/test/resources/org/move/lang/parser/complete/match.txt new file mode 100644 index 000000000..1655f0ecb --- /dev/null +++ b/src/test/resources/org/move/lang/parser/complete/match.txt @@ -0,0 +1,1537 @@ +FILE + MvModuleImpl(MODULE) + PsiElement(module)('module') + PsiWhiteSpace(' ') + MvAddressRefImpl(ADDRESS_REF) + PsiElement(DIEM_ADDRESS)('0x1') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('match') + PsiWhiteSpace(' ') + MvModuleBlockImpl(MODULE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1_field_named') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('red') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('r') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('green') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('g') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('r') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('g') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1_uses_block') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvCodeBlockExprImpl(CODE_BLOCK_EXPR) + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1_uses_block_no_comma') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvCodeBlockExprImpl(CODE_BLOCK_EXPR) + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiWhiteSpace(' ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1_module_qualified') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t1_address_qualified') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathAddressImpl(PATH_ADDRESS) + PsiElement(DIEM_ADDRESS)('0x815') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathImpl(PATH) + MvPathAddressImpl(PATH_ADDRESS) + PsiElement(DIEM_ADDRESS)('0x815') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t2') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t3') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[>]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvBinaryExprImpl(BINARY_EXPR[+]) + MvDerefExprImpl(DEREF_EXPR) + PsiElement(*)('*') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvDerefExprImpl(DEREF_EXPR) + PsiElement(*)('*') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvDerefExprImpl(DEREF_EXPR) + PsiElement(*)('*') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(>)('>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('0') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t4') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvExprStmtImpl(EXPR_STMT) + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + PsiElement(mut)('mut') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('green') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('blue') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvAssignmentExprImpl(ASSIGNMENT_EXPR) + MvDerefExprImpl(DEREF_EXPR) + PsiElement(*)('*') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvInitializerImpl(INITIALIZER) + PsiElement(=)('=') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('2') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvCodeBlockExprImpl(CODE_BLOCK_EXPR) + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(;)(';') + PsiWhiteSpace('\n ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t5_freeze') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('u64') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvLetStmtImpl(LET_STMT) + PsiElement(let)('let') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('x') + PsiWhiteSpace(' ') + MvInitializerImpl(INITIALIZER) + PsiElement(=)('=') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('1') + PsiElement(;)(';') + PsiWhiteSpace('\n ') + MvLetStmtImpl(LET_STMT) + PsiElement(let)('let') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('r') + PsiWhiteSpace(' ') + MvInitializerImpl(INITIALIZER) + PsiElement(=)('=') + PsiWhiteSpace(' ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + PsiElement(mut)('mut') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('x') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + PsiElement(mut)('mut') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('x') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBorrowExprImpl(BORROW_EXPR) + PsiElement(&)('&') + PsiElement(mut)('mut') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('x') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiElement(;)(';') + PsiWhiteSpace('\n ') + MvDerefExprImpl(DEREF_EXPR) + PsiElement(*)('*') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('r') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t6_construct') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvStructLitExprImpl(STRUCT_LIT_EXPR) + MvPathImpl(PATH) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructLitFieldsBlockImpl(STRUCT_LIT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructLitFieldImpl(STRUCT_LIT_FIELD) + PsiElement(IDENTIFIER)('red') + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[+]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(+)('+') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('1') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructLitFieldImpl(STRUCT_LIT_FIELD) + PsiElement(IDENTIFIER)('green') + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[-]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(-)('-') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('1') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructLitFieldImpl(STRUCT_LIT_FIELD) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('t8_unqualified_variant') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + MvFunctionParameterImpl(FUNCTION_PARAMETER) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('self') + MvTypeAnnotationImpl(TYPE_ANNOTATION) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement())(')') + MvReturnTypeImpl(RETURN_TYPE) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvPathTypeImpl(PATH_TYPE) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('bool') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchExprImpl(MATCH_EXPR) + PsiElement(match_kw)('match') + PsiWhiteSpace(' ') + MvMatchArgumentImpl(MATCH_ARGUMENT) + PsiElement(()('(') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('self') + PsiElement())(')') + PsiWhiteSpace(' ') + MvMatchBodyImpl(MATCH_BODY) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[&&]) + MvBinaryExprImpl(BINARY_EXPR[!=]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('red') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(!=)('!=') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(&&)('&&') + PsiWhiteSpace(' ') + MvBinaryExprImpl(BINARY_EXPR[!=]) + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('green') + PsiWhiteSpace(' ') + MvBinaryOpImpl(BINARY_OP) + PsiElement(!=)('!=') + PsiWhiteSpace(' ') + MvRefExprImpl(REF_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('blue') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('Red') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('true') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + MvMatchArmImpl(MATCH_ARM) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('Blue') + PsiWhiteSpace(' ') + PsiElement(=>)('=>') + PsiWhiteSpace(' ') + MvLitExprImpl(LIT_EXPR) + PsiElement(BOOL_LITERAL)('false') + PsiElement(,)(',') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n\n ') + MvFunctionImpl(FUNCTION) + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('match_as_function') + MvFunctionParameterListImpl(FUNCTION_PARAMETER_LIST) + PsiElement(()('(') + PsiElement())(')') + PsiWhiteSpace(' ') + MvCodeBlockImpl(CODE_BLOCK) + PsiElement({)('{') + PsiWhiteSpace('\n ') + MvExprStmtImpl(EXPR_STMT) + MvCallExprImpl(CALL_EXPR) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('match') + MvValueArgumentListImpl(VALUE_ARGUMENT_LIST) + PsiElement(()('(') + MvValueArgumentImpl(VALUE_ARGUMENT) + MvLitExprImpl(LIT_EXPR) + PsiElement(INTEGER_LITERAL)('1') + PsiElement())(')') + PsiElement(;)(';') + PsiWhiteSpace('\n ') + PsiElement(})('}') + PsiWhiteSpace('\n') + PsiElement(})('}') \ No newline at end of file From be5b918db1e9d1b356721b77a7a1a19cff696a96 Mon Sep 17 00:00:00 2001 From: Maksim Kurnikov Date: Mon, 5 Aug 2024 21:41:47 +0300 Subject: [PATCH 2/2] enum and match fields name resolution --- src/main/grammars/MoveParser.bnf | 7 +- .../move/lang/core/psi/ext/MvFieldsOwner.kt | 31 + .../org/move/lang/core/psi/ext/MvPath.kt | 4 +- .../lang/core/psi/ext/MvStructLitField.kt | 14 +- .../core/resolve2/LexicalDeclarations2.kt | 6 +- .../move/lang/resolve/ResolveVariablesTest.kt | 233 ++++++ .../org/move/lang/parser/complete/match.txt | 706 +++++++++--------- 7 files changed, 655 insertions(+), 346 deletions(-) create mode 100644 src/main/kotlin/org/move/lang/core/psi/ext/MvFieldsOwner.kt diff --git a/src/main/grammars/MoveParser.bnf b/src/main/grammars/MoveParser.bnf index ac6bafd53..7c1872bd0 100644 --- a/src/main/grammars/MoveParser.bnf +++ b/src/main/grammars/MoveParser.bnf @@ -16,7 +16,8 @@ tokenTypeClass="org.move.lang.core.MvTokenType" extends(".*Expr")=Expr - extends(".*Pat")=Pat + extends("(Struct|Binding|Tuple|Wild|EnumVariant)Pat")=Pat +// extends(".*Pat")=Pat extends("(Lambda|Ref|Path|Tuple|Unit|Parens)Type")=Type elementType(".+BinExpr")=BinaryExpr @@ -365,6 +366,7 @@ fake Struct ::= Attr* native? STRUCT_KW IDENTIFIER? TypeParameterList? Abilities "org.move.lang.core.psi.MvQualNamedElement" "org.move.lang.core.psi.MvTypeParametersOwner" "org.move.lang.core.psi.ext.MvItemElement" + "org.move.lang.core.psi.ext.MvFieldsOwner" ] mixin = "org.move.lang.core.psi.ext.MvStructMixin" stubClass = "org.move.lang.core.stubs.MvStructStub" @@ -410,6 +412,7 @@ EnumVariant ::= Attr* IDENTIFIER BlockFields? implements = [ "org.move.lang.core.psi.MvNameIdentifierOwner" "org.move.lang.core.psi.ext.MvDocAndAttributeOwner" + "org.move.lang.core.psi.ext.MvFieldsOwner" ] mixin = "org.move.lang.core.psi.ext.MvEnumVariantMixin" stubClass = "org.move.lang.core.stubs.MvEnumVariantStub" @@ -683,7 +686,7 @@ BindingPat ::= IDENTIFIER !'::' { TuplePat ::= '(' <>? ')' StructPat ::= PathImpl StructPatFieldsBlock -StructPatFieldsBlock ::= '{' StructPatField_with_recover* '}' { pin = 1 } +StructPatFieldsBlock ::= '{' StructPatField_with_recover* '}' private StructPatField_with_recover ::= !'}' StructPatField (',' | &'}') { diff --git a/src/main/kotlin/org/move/lang/core/psi/ext/MvFieldsOwner.kt b/src/main/kotlin/org/move/lang/core/psi/ext/MvFieldsOwner.kt new file mode 100644 index 000000000..de6ea71f0 --- /dev/null +++ b/src/main/kotlin/org/move/lang/core/psi/ext/MvFieldsOwner.kt @@ -0,0 +1,31 @@ +package org.move.lang.core.psi.ext + +import org.move.lang.core.psi.MvBlockFields +import org.move.lang.core.psi.MvNameIdentifierOwner +import org.move.lang.core.psi.MvNamedFieldDecl + +interface MvFieldsOwner: MvNameIdentifierOwner { + val blockFields: MvBlockFields? +} + +val MvFieldsOwner.fields: List + get() = namedFields //+ positionalFields + +val MvFieldsOwner.namedFields: List + get() = blockFields?.namedFieldDeclList.orEmpty() + + +/** + * True for: + * ``` + * struct S; + * enum E { A } + * ``` + * but false for: + * ``` + * struct S {} + * struct S(); + * ``` + */ +val MvFieldsOwner.isFieldless: Boolean + get() = blockFields == null //&& tupleFields == null \ No newline at end of file diff --git a/src/main/kotlin/org/move/lang/core/psi/ext/MvPath.kt b/src/main/kotlin/org/move/lang/core/psi/ext/MvPath.kt index a77cdc9f8..33113ff13 100644 --- a/src/main/kotlin/org/move/lang/core/psi/ext/MvPath.kt +++ b/src/main/kotlin/org/move/lang/core/psi/ext/MvPath.kt @@ -90,7 +90,9 @@ fun MvPath.allowedNamespaces(): Set { parentElement is MvCallExpr -> EnumSet.of(FUNCTION) parentElement is MvRefExpr && this.hasAncestor() -> EnumSet.of(NAME, MODULE) parentElement is MvRefExpr -> EnumSet.of(NAME) - parentElement is MvStructLitExpr || parentElement is MvStructPat -> EnumSet.of(TYPE) + parentElement is MvStructLitExpr + || parentElement is MvStructPat + || parentElement is MvEnumVariantPat -> EnumSet.of(TYPE) parentElement is MvAccessSpecifier -> EnumSet.of(TYPE) parentElement is MvAddressSpecifierArg -> EnumSet.of(FUNCTION) parentElement is MvAddressSpecifierCallParam -> EnumSet.of(NAME) diff --git a/src/main/kotlin/org/move/lang/core/psi/ext/MvStructLitField.kt b/src/main/kotlin/org/move/lang/core/psi/ext/MvStructLitField.kt index bb0caa3fa..2e88923d7 100644 --- a/src/main/kotlin/org/move/lang/core/psi/ext/MvStructLitField.kt +++ b/src/main/kotlin/org/move/lang/core/psi/ext/MvStructLitField.kt @@ -53,18 +53,22 @@ fun processStructRefFieldResolveVariants( fieldRef: MvStructRefField, processor: RsResolveProcessor ): Boolean { - val structItem = fieldRef.maybeStruct ?: return false - return structItem.fields + val fieldsOwnerItem = fieldRef.fieldOwner ?: return false + return fieldsOwnerItem.fields .any { field -> processor.process(SimpleScopeEntry(field.name, field, setOf(Namespace.NAME))) } } -private val MvStructRefField.maybeStruct: MvStruct? +private val MvStructRefField.fieldOwner: MvFieldsOwner? get() { return when (this) { - is MvStructPatField -> this.structPat.structItem - is MvStructLitField -> this.structLitExpr.path.maybeStruct + is MvStructPatField -> { + this.structPat.path.reference?.resolveFollowingAliases() as? MvFieldsOwner + } + is MvStructLitField -> { + this.structLitExpr.path.reference?.resolveFollowingAliases() as? MvFieldsOwner + } else -> null } } diff --git a/src/main/kotlin/org/move/lang/core/resolve2/LexicalDeclarations2.kt b/src/main/kotlin/org/move/lang/core/resolve2/LexicalDeclarations2.kt index 996c884f6..ac6dd6c39 100644 --- a/src/main/kotlin/org/move/lang/core/resolve2/LexicalDeclarations2.kt +++ b/src/main/kotlin/org/move/lang/core/resolve2/LexicalDeclarations2.kt @@ -41,12 +41,16 @@ fun processItemsInScope( false } } + is MvMatchArm -> { + if (cameFrom is MvMatchPat) continue + // only use those bindings for the match arm rhs + processor.processAll(scope.matchPat.pat.bindings.toList()) + } is MvItemSpec -> { val item = scope.item when (item) { is MvFunction -> { processor.processAll( -// contextScopeInfo, item.valueParamsAsBindings, item.specResultParameters.map { it.bindingPat }, ) diff --git a/src/test/kotlin/org/move/lang/resolve/ResolveVariablesTest.kt b/src/test/kotlin/org/move/lang/resolve/ResolveVariablesTest.kt index bfe5f4b72..b7a9be67f 100644 --- a/src/test/kotlin/org/move/lang/resolve/ResolveVariablesTest.kt +++ b/src/test/kotlin/org/move/lang/resolve/ResolveVariablesTest.kt @@ -385,4 +385,237 @@ module 0x1::string_tests { } } """) + + fun `test resolve variable in match expr`() = checkByCode(""" + module 0x1::m { + fun main() { + let m = 1; + //X + match (m) { + //^ + } + } + } + """) + + fun `test resolve function with match name`() = checkByCode(""" + module 0x1::m { + fun match() {} + //X + fun main() { + match(); + //^ + } + } + """) + + + fun `test resolve type in match arm 1`() = checkByCode(""" + module 0x1::m { + enum S { One, Two } + //X + fun main() { + let m = 1; + match (m) { + S::One => true + //^ + S::Two => false + } + } + } + """) + + fun `test resolve type in match arm 2`() = checkByCode(""" + module 0x1::m { + enum S { One, Two } + //X + fun main() { + let m = 1; + match (m) { + S::One => true + //^ + S::Two => false + } + } + } + """) + + fun `test resolve type in match arm 3`() = checkByCode(""" + module 0x1::m { + enum S { One, Two } + //X + fun main() { + let m = 1; + match (m) { + S::One => true + S::Two => false + //^ + } + } + } + """) + + fun `test resolve item in match arm body`() = checkByCode(""" + module 0x1::m { + enum S { One, Two } + fun main() { + let m = 1; + //X + match (m) { + S::One => m + //^ + } + } + } + """) + + fun `test resolve fields for enum variant in match arm`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main() { + let m = 1; + match (m) { + S::One { field: f } => f + //^ + } + } + } + """) + + fun `test resolve shortcut field for enum variant in match arm`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main() { + let m = 1; + match (m) { + S::One { field } => field + //^ + } + } + } + """) + + fun `test resolve binding for field reassignment for enum variant`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + fun main() { + let m = 1; + match (m) { + S::One { field: myfield } + //X + => myfield + //^ + } + } + } + """) + + fun `test resolve binding for shortcut field for enum variant`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + fun main() { + let m = 1; + match (m) { + S::One { field } + //X + => field + //^ + } + } + } + """) + + fun `test resolve field for struct pat in enum`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let S::One { field } = s; + //^ + } + } + """) + + fun `test resolve field reassignment for struct pat in enum`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let S::One { field: f } = s; + //^ + } + } + """) + + fun `test resolve field reassignment for struct pat in enum binding`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + fun main(s: S::One) { + let S::One { field: f } = s; + //X + f; + //^ + } + } + """) + + fun `test resolve enum variant for struct lit`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let f = 1; + let s = S::One { field: f }; + //^ + } + } + """) + + fun `test resolve enum variant for struct pat`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let S::One { field } = s; + //^ + } + } + """) + + fun `test resolve enum variant for struct pat 2`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let S::One { field } = s; + //^ + } + } + """) + + fun `test resolve field reassignment for struct lit enum variant`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + //X + fun main(s: S::One) { + let f = 1; + let s = S::One { field: f }; + //^ + } + } + """) + + fun `test resolve field reassignment for struct lit enum variant binding`() = checkByCode(""" + module 0x1::m { + enum S { One { field: u8 }, Two } + fun main(s: S::One) { + let f = 1; + //X + let s = S::One { field: f }; + //^ + } + } + """) } diff --git a/src/test/resources/org/move/lang/parser/complete/match.txt b/src/test/resources/org/move/lang/parser/complete/match.txt index 1655f0ecb..5c981a74c 100644 --- a/src/test/resources/org/move/lang/parser/complete/match.txt +++ b/src/test/resources/org/move/lang/parser/complete/match.txt @@ -50,12 +50,13 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -64,12 +65,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -78,28 +80,29 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -175,12 +178,13 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -189,12 +193,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -203,36 +208,37 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - PsiElement(IDENTIFIER)('red') - MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) - PsiElement(:)(':') - PsiWhiteSpace(' ') - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('r') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - PsiElement(IDENTIFIER)('green') - MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) - PsiElement(:)(':') - PsiWhiteSpace(' ') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('red') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('r') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('green') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('g') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('g') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -308,28 +314,29 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -368,12 +375,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -382,12 +390,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -439,28 +448,29 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -498,12 +508,13 @@ FILE PsiElement(})('}') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -512,12 +523,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -572,31 +584,32 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('m') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') PsiElement(::)('::') - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -629,15 +642,16 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('m') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') PsiElement(::)('::') - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -646,15 +660,16 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('m') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('m') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Color') PsiElement(::)('::') - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -709,35 +724,36 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) MvPathImpl(PATH) MvPathImpl(PATH) - MvPathAddressImpl(PATH_ADDRESS) - PsiElement(DIEM_ADDRESS)('0x815') + MvPathImpl(PATH) + MvPathAddressImpl(PATH_ADDRESS) + PsiElement(DIEM_ADDRESS)('0x815') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('m') PsiElement(::)('::') - PsiElement(IDENTIFIER)('m') + PsiElement(IDENTIFIER)('Color') PsiElement(::)('::') - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -770,19 +786,20 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) MvPathImpl(PATH) MvPathImpl(PATH) - MvPathAddressImpl(PATH_ADDRESS) - PsiElement(DIEM_ADDRESS)('0x815') + MvPathImpl(PATH) + MvPathAddressImpl(PATH_ADDRESS) + PsiElement(DIEM_ADDRESS)('0x815') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('m') PsiElement(::)('::') - PsiElement(IDENTIFIER)('m') + PsiElement(IDENTIFIER)('Color') PsiElement(::)('::') - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -791,12 +808,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -848,28 +866,29 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -902,8 +921,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') + MvMatchPatImpl(MATCH_PAT) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -957,28 +977,29 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1017,8 +1038,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') + MvMatchPatImpl(MATCH_PAT) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1075,36 +1097,37 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - PsiElement(IDENTIFIER)('green') - MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) - PsiElement(:)(':') - PsiWhiteSpace(' ') - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - PsiElement(IDENTIFIER)('blue') - MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) - PsiElement(:)(':') - PsiWhiteSpace(' ') - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('green') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + PsiElement(IDENTIFIER)('blue') + MvStructPatFieldBindingImpl(STRUCT_PAT_FIELD_BINDING) + PsiElement(:)(':') + PsiWhiteSpace(' ') + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1123,8 +1146,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') + MvMatchPatImpl(MATCH_PAT) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1209,12 +1233,13 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Red') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1226,12 +1251,13 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvEnumVariantPatImpl(ENUM_VARIANT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvEnumVariantPatImpl(ENUM_VARIANT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('Blue') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1245,8 +1271,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') + MvMatchPatImpl(MATCH_PAT) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1310,28 +1337,29 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) MvPathImpl(PATH) - PsiElement(IDENTIFIER)('Color') - PsiElement(::)('::') - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('Color') + PsiElement(::)('::') + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1381,8 +1409,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvWildPatImpl(WILD_PAT) - PsiElement(IDENTIFIER)('_') + MvMatchPatImpl(MATCH_PAT) + MvWildPatImpl(WILD_PAT) + PsiElement(IDENTIFIER)('_') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1434,25 +1463,26 @@ FILE PsiElement({)('{') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvStructPatImpl(STRUCT_PAT) - MvPathImpl(PATH) - PsiElement(IDENTIFIER)('RGB') - MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) - PsiElement({)('{') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('red') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('green') - PsiElement(,)(',') - PsiWhiteSpace(' ') - MvStructPatFieldImpl(STRUCT_PAT_FIELD) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('blue') - PsiElement(})('}') + MvMatchPatImpl(MATCH_PAT) + MvStructPatImpl(STRUCT_PAT) + MvPathImpl(PATH) + PsiElement(IDENTIFIER)('RGB') + MvStructPatFieldsBlockImpl(STRUCT_PAT_FIELDS_BLOCK) + PsiElement({)('{') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('red') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('green') + PsiElement(,)(',') + PsiWhiteSpace(' ') + MvStructPatFieldImpl(STRUCT_PAT_FIELD) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('blue') + PsiElement(})('}') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1486,8 +1516,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('Red') + MvMatchPatImpl(MATCH_PAT) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('Red') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ') @@ -1496,8 +1527,9 @@ FILE PsiElement(,)(',') PsiWhiteSpace('\n ') MvMatchArmImpl(MATCH_ARM) - MvBindingPatImpl(BINDING_PAT) - PsiElement(IDENTIFIER)('Blue') + MvMatchPatImpl(MATCH_PAT) + MvBindingPatImpl(BINDING_PAT) + PsiElement(IDENTIFIER)('Blue') PsiWhiteSpace(' ') PsiElement(=>)('=>') PsiWhiteSpace(' ')