plum
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))))))))