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
================================================================================
safe navigation operator - field access on an Option/Result value
================================================================================

fun greet(person: Option[Person]) -> Option[Str] =
  person?.name

--------------------------------------------------------------------------------

(source
  (fn
    name: (fn_identifier)
    params: (param
      name: (var_identifier)
      type: (type
        (type_identifier)
        generics: (type
          (type_identifier))))
    returns: (type
      (type_identifier)
      generics: (type
        (type_identifier)))
    body: (body
      (expression
        (primary_expression
          (safe_attribute
            object: (primary_expression
              (var_identifier))
            member: (fn_identifier)))))))

================================================================================
safe navigation operator - method call on an Option/Result value
================================================================================

fun greetCall(person: Option[Person]) -> Option[Str] =
  person?.greeting("hi")

--------------------------------------------------------------------------------

(source
  (fn
    name: (fn_identifier)
    params: (param
      name: (var_identifier)
      type: (type
        (type_identifier)
        generics: (type
          (type_identifier))))
    returns: (type
      (type_identifier)
      generics: (type
        (type_identifier)))
    body: (body
      (expression
        (primary_expression
          (safe_attribute
            object: (primary_expression
              (var_identifier))
            member: (fn_identifier)
            arguments: (fn_argument_list
              (expression
                (primary_expression
                  (string
                    (string_start)
                    (string_content)
                    (string_end)))))))))))

================================================================================
safe navigation operator - coexists with ternary, elvis, and try, all sharing `?`-prefixed tokens
================================================================================

fun classify(n: Int) -> Int =
  a = n > 0 ? n : 0
  b = n ?: 0
  c = n?
  d = opt?.field
  a + b + c

--------------------------------------------------------------------------------

(source
  (fn
    name: (fn_identifier)
    params: (param
      name: (var_identifier)
      type: (type
        (type_identifier)))
    returns: (type
      (type_identifier))
    body: (body
      (assign
        (var_identifier)
        (expression
          (ternary_expression
            (expression
              (comparison_operator
                (primary_expression
                  (var_identifier))
                (primary_expression
                  (integer))))
            (expression
              (primary_expression
                (var_identifier)))
            (expression
              (primary_expression
                (integer))))))
      (assign
        (var_identifier)
        (expression
          (elvis_expression
            (expression
              (primary_expression
                (var_identifier)))
            (expression
              (primary_expression
                (integer))))))
      (assign
        (var_identifier)
        (expression
          (primary_expression
            (try_expression
              value: (primary_expression
                (var_identifier))))))
      (assign
        (var_identifier)
        (expression
          (primary_expression
            (safe_attribute
              object: (primary_expression
                (var_identifier))
              member: (fn_identifier)))))
      (expression
        (primary_expression
          (binary_operator
            left: (primary_expression
              (binary_operator
                left: (primary_expression
                  (var_identifier))
                right: (primary_expression
                  (var_identifier))))
            right: (primary_expression
              (var_identifier))))))))