from Child import Child
from Node import Node  # noqa: I201

AVAILABILITY_NODES = [
    # availability-spec-list -> availability-entry availability-spec-list?
    Node('AvailabilitySpecList', kind='SyntaxCollection', 
         element='AvailabilityArgument'),

    # Wrapper for all the different entries that may occur inside @available
    # availability-entry -> '*' ','? 
    #                     | identifier ','?
    #                     | availability-version-restriction ','?
    #                     | availability-versioned-argument ','?
    Node('AvailabilityArgument', kind='Syntax',
         description='''
         A single argument to an `@available` argument like `*`, `iOS 10.1`, \
         or `message: "This has been deprecated"`.
         ''',
         children=[
             Child('Entry', kind='Syntax',
                   description='The actual argument',
                   node_choices=[
                       Child('Star', kind='SpacedBinaryOperatorToken',
                             text_choices=['*']),
                       Child('IdentifierRestriction', 
                             kind='IdentifierToken'),
                       Child('AvailabilityVersionRestriction', 
                             kind='AvailabilityVersionRestriction'),
                       Child('AvailabilityLabeledArgument', 
                             kind='AvailabilityLabeledArgument'),
                   ]),
             Child('TrailingComma', kind='CommaToken', is_optional=True,
                   description='''
                   A trailing comma if the argument is followed by another \
                   argument
                   '''),
         ]),

    # Representation of 'deprecated: 2.3', 'message: "Hello world"' etc.
    # availability-versioned-argument -> identifier ':' version-tuple
    Node('AvailabilityLabeledArgument', kind='Syntax',
         description='''
         A argument to an `@available` attribute that consists of a label and \
         a value, e.g. `message: "This has been deprecated"`.
         ''',
         children=[
             Child('Label', kind='IdentifierToken', 
                   description='The label of the argument'),
             Child('Colon', kind='ColonToken', 
                   description='The colon separating label and value'),
             Child('Value', kind='Syntax',
                   node_choices=[
                       Child('String', 'StringLiteralToken'),
                       Child('Version', 'VersionTuple'),
                   ], description='The value of this labeled argument',),
         ]),

    # Representation for 'iOS 10', 'swift 3.4' etc.
    # availability-version-restriction -> identifier version-tuple
    Node('AvailabilityVersionRestriction', kind='Syntax',
         description='''
         An argument to `@available` that restricts the availability on a \
         certain platform to a version, e.g. `iOS 10` or `swift 3.4`.
         ''',
         children=[
             Child('Platform', kind='IdentifierToken', 
                   classification='Keyword',
                   description='''
                   The name of the OS on which the availability should be \
                   restricted or 'swift' if the availability should be \
                   restricted based on a Swift version.
                   '''),
             Child('Version', kind='VersionTuple'),
         ]),

    # version-tuple -> integer-literal 
    #                | float-literal 
    #                | float-literal '.' integer-literal
    Node('VersionTuple', kind='Syntax',
         description='''
         A version number of the form major.minor.patch in which the minor \
         and patch part may be ommited.
         ''',
         children=[
             Child('MajorMinor', kind='Syntax',
                   node_choices=[
                       Child('Major', kind='IntegerLiteralToken'),
                       Child('MajorMinor', kind='FloatingLiteralToken')
                   ], description='''
                   In case the version consists only of the major version, an \
                   integer literal that specifies the major version. In case \
                   the version consists of major and minor version number, a \
                   floating literal in which the decimal part is interpreted \
                   as the minor version.
                   '''),
             Child('PatchPeriod', kind='PeriodToken', is_optional=True,
                   description='''
                   If the version contains a patch number, the period \
                   separating the minor from the patch number.
                   '''),
             Child('PatchVersion', kind='IntegerLiteralToken', 
                   is_optional=True, description='''
                   The patch version if specified.
                   '''),
         ]),
]
