// Optional braces syntax
class C:
// ^keyword
//    ^type

  def test(aaaa: A): Int =
  //^keyword.function
  //  ^method
    // no curly braces, but this is still in test method
    val bbb = 1
    //^keyword
    //  ^variable
    val ccc = 2
    //^keyword
    //  ^variable
    1

object O1:
//^keyword
//     ^type

  def test: Unit = ()
  //^keyword.function
  //  ^method

object O2:
  type Elem[A] = A match
  //^keyword
  //   ^type.definition
    case String   => Char
    //^keyword
    //   ^type       ^type
    case Array[a] => a
    //   ^type       ^type

// SIP-44
class C:
// ^keyword
  //  ^type
  fooooo.map: x =>
  //     ^method.call
    x + 1

  xs.map:
    param1 =>
      param1 + 1

  foooo:
  // ^function.call
    println("")

  foooo `++`:
  //    ^operator
    val x = 1
    List(x)

  // This is an ascription
  val y = x: Int
  //         ^type

  // This is SIP-44
  val y = x:
    Int
    //^type

// Ascription expression
class C:
  foooo: Int
  //     ^type

enum Simple:
//^keyword
//   ^type
  case A, B, C
//     ^type
enum Test(a: Int) derives Codec:
// ^keyword   
//    ^type
//            ^type
//                   ^keyword
//                          ^type
//    ^type
//        ^parameter
  case Test(b: String)
  // ^keyword     
  //               ^type
  //      ^type
  //        ^parameter
  case Hello, Bla
  //      ^type
  //          ^type
  case Bla extends Test(256)
  //          ^keyword

opaque type Blow <: Int = 25
// ^type.qualifier
//      ^keyword     
//                   ^type     
//            ^type.definition

inline given Test = new Test {
// ^ storageclass
  inline def hello(inline x: Boolean) = 
// ^ storageclass
//                   ^ storageclass
    inline if x then "hi" else "bye" 
    // ^storageclass
    //            ^conditional
    inline x match 
    // ^storageclass
      case true => 25 
      case false => 26 
}

object A:
// ^ keyword
//     ^type

  ::(123)
//^operator
//   ^number

object bla:
  open class Hello(A: Int)
// ^ type.qualifier
  transparent trait Hello
//   ^ type.qualifier
  infix def hello = 25
//  ^ keyword

extension (s: String)
//  ^keyword
  def test = 25
  def test2 = 25

val extension = "hello"
//     ^variable - to test "soft" keywords

given Test with
// ^keyword
//     ^type
//          ^keyword
   def test = 1
//  ^keyword.function
   val a = "hello"


class Copier:
  private val printUnit = new Printer { type PrinterType = InkJet }
  private val scanUnit = new Scanner

  export scanUnit.scan
  // ^ include
  //        ^variable
  export printUnit.{status as _, *}
  // ^ include
  //        ^variable

  def status: List[String] = printUnit.status ++ scanUnit.status
