plum

#treesitter#compiler#wasm

git clone https://git.pyrossh.dev/plum

A statically typed, imperative programming language inspired by rust, python


plum-tooling/tree-sitter-plum/test/corpus/safe_attribute.txt
43e5250 1
================================================================================
43e5250 2
safe navigation operator - field access on an Option/Result value
43e5250 3
================================================================================
43e5250 4
43e5250 5
fun greet(person: Option[Person]) -> Option[Str] =
43e5250 6
  person?.name
43e5250 7
43e5250 8
--------------------------------------------------------------------------------
43e5250 9
43e5250 10
(source
43e5250 11
  (fn
43e5250 12
    name: (fn_identifier)
43e5250 13
    params: (param
43e5250 14
      name: (var_identifier)
43e5250 15
      type: (type
43e5250 16
        (type_identifier)
43e5250 17
        generics: (type
43e5250 18
          (type_identifier))))
43e5250 19
    returns: (type
43e5250 20
      (type_identifier)
43e5250 21
      generics: (type
43e5250 22
        (type_identifier)))
43e5250 23
    body: (body
43e5250 24
      (expression
43e5250 25
        (primary_expression
43e5250 26
          (safe_attribute
43e5250 27
            object: (primary_expression
43e5250 28
              (var_identifier))
43e5250 29
            member: (fn_identifier)))))))
43e5250 30
43e5250 31
================================================================================
43e5250 32
safe navigation operator - method call on an Option/Result value
43e5250 33
================================================================================
43e5250 34
43e5250 35
fun greetCall(person: Option[Person]) -> Option[Str] =
43e5250 36
  person?.greeting("hi")
43e5250 37
43e5250 38
--------------------------------------------------------------------------------
43e5250 39
43e5250 40
(source
43e5250 41
  (fn
43e5250 42
    name: (fn_identifier)
43e5250 43
    params: (param
43e5250 44
      name: (var_identifier)
43e5250 45
      type: (type
43e5250 46
        (type_identifier)
43e5250 47
        generics: (type
43e5250 48
          (type_identifier))))
43e5250 49
    returns: (type
43e5250 50
      (type_identifier)
43e5250 51
      generics: (type
43e5250 52
        (type_identifier)))
43e5250 53
    body: (body
43e5250 54
      (expression
43e5250 55
        (primary_expression
43e5250 56
          (safe_attribute
43e5250 57
            object: (primary_expression
43e5250 58
              (var_identifier))
43e5250 59
            member: (fn_identifier)
43e5250 60
            arguments: (fn_argument_list
43e5250 61
              (expression
43e5250 62
                (primary_expression
43e5250 63
                  (string
43e5250 64
                    (string_start)
43e5250 65
                    (string_content)
43e5250 66
                    (string_end)))))))))))
43e5250 67
43e5250 68
================================================================================
43e5250 69
safe navigation operator - coexists with ternary, elvis, and try, all sharing `?`-prefixed tokens
43e5250 70
================================================================================
43e5250 71
43e5250 72
fun classify(n: Int) -> Int =
43e5250 73
  a = n > 0 ? n : 0
43e5250 74
  b = n ?: 0
43e5250 75
  c = n?
43e5250 76
  d = opt?.field
43e5250 77
  a + b + c
43e5250 78
43e5250 79
--------------------------------------------------------------------------------
43e5250 80
43e5250 81
(source
43e5250 82
  (fn
43e5250 83
    name: (fn_identifier)
43e5250 84
    params: (param
43e5250 85
      name: (var_identifier)
43e5250 86
      type: (type
43e5250 87
        (type_identifier)))
43e5250 88
    returns: (type
43e5250 89
      (type_identifier))
43e5250 90
    body: (body
43e5250 91
      (assign
43e5250 92
        (var_identifier)
43e5250 93
        (expression
43e5250 94
          (ternary_expression
43e5250 95
            (expression
43e5250 96
              (comparison_operator
43e5250 97
                (primary_expression
43e5250 98
                  (var_identifier))
43e5250 99
                (primary_expression
43e5250 100
                  (integer))))
43e5250 101
            (expression
43e5250 102
              (primary_expression
43e5250 103
                (var_identifier)))
43e5250 104
            (expression
43e5250 105
              (primary_expression
43e5250 106
                (integer))))))
43e5250 107
      (assign
43e5250 108
        (var_identifier)
43e5250 109
        (expression
43e5250 110
          (elvis_expression
43e5250 111
            (expression
43e5250 112
              (primary_expression
43e5250 113
                (var_identifier)))
43e5250 114
            (expression
43e5250 115
              (primary_expression
43e5250 116
                (integer))))))
43e5250 117
      (assign
43e5250 118
        (var_identifier)
43e5250 119
        (expression
43e5250 120
          (primary_expression
43e5250 121
            (try_expression
43e5250 122
              value: (primary_expression
43e5250 123
                (var_identifier))))))
43e5250 124
      (assign
43e5250 125
        (var_identifier)
43e5250 126
        (expression
43e5250 127
          (primary_expression
43e5250 128
            (safe_attribute
43e5250 129
              object: (primary_expression
43e5250 130
                (var_identifier))
43e5250 131
              member: (fn_identifier)))))
43e5250 132
      (expression
43e5250 133
        (primary_expression
43e5250 134
          (binary_operator
43e5250 135
            left: (primary_expression
43e5250 136
              (binary_operator
43e5250 137
                left: (primary_expression
43e5250 138
                  (var_identifier))
43e5250 139
                right: (primary_expression
43e5250 140
                  (var_identifier))))
43e5250 141
            right: (primary_expression
43e5250 142
              (var_identifier))))))))