3.1. Advanced Types
TypeName = (* variant: *) ArrayTypeName
| (* variant: *) FunctionType
| (* variant: *) MappingType
| (* variant: *) ElementaryType
| (* variant: *) IdentifierPath;
(* Postfix unary operator *)
ArrayTypeName = (* operand: *) TypeName
(* open_bracket: *) OPEN_BRACKET
(* index: *) Expression?
(* close_bracket: *) CLOSE_BRACKET;
FunctionType = (* function_keyword: *) FUNCTION_KEYWORD
(* parameters: *) ParametersDeclaration
(* attributes: *) FunctionTypeAttributes
(* returns: *) ReturnsDeclaration?;
FunctionTypeAttributes = (* item: *) FunctionTypeAttribute*;
FunctionTypeAttribute = (* variant: *) INTERNAL_KEYWORD
| (* variant: *) EXTERNAL_KEYWORD
| (* variant: *) PRIVATE_KEYWORD
| (* variant: *) PUBLIC_KEYWORD
| (* variant: *) CONSTANT_KEYWORD (* Deprecated in 0.5.0 *)
| (* variant: *) PURE_KEYWORD (* Introduced in 0.4.16 *)
| (* variant: *) VIEW_KEYWORD (* Introduced in 0.4.16 *)
| (* variant: *) PAYABLE_KEYWORD;
MappingType = (* mapping_keyword: *) MAPPING_KEYWORD
(* open_paren: *) OPEN_PAREN
(* key_type: *) MappingKey
(* equal_greater_than: *) EQUAL_GREATER_THAN
(* value_type: *) MappingValue
(* close_paren: *) CLOSE_PAREN;
MappingKey = (* key_type: *) MappingKeyType
(* name: *) IDENTIFIER?; (* Introduced in 0.8.18 *)
MappingKeyType = (* variant: *) ElementaryType
| (* variant: *) IdentifierPath;
MappingValue = (* type_name: *) TypeName
(* name: *) IDENTIFIER?; (* Introduced in 0.8.18 *)