library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "package:expect/expect.dart" as exp;

import "package:expect/expect.dart";

static const field core::int var1 = #C1;
static const field core::int var2 = #C2;
static const field core::int var3 = #C3;
static const field core::int var4 = #C2;
static const field core::int var5 = #C4;
static const field core::int var6 = #C4;
static const field core::int var7 = #C4;
static const field core::int var8 = #C4;
static const field core::int var9 = #C4;
static const field core::int var10 = #C1;
static const field core::int var11 = #C1;
static const field core::String var12 = #C5;
static const field core::int var13 = #C2;
static method fn(dynamic error) → core::int {
  try {
    throw error;
  }
  on core::String catch(no-exception-var) {
    return 0;
  }
  on core::Object catch(final core::Object e) {
    return 1;
  }
}
static method fn1(dynamic error) → core::int {
  try {
    throw error;
  }
  on core::int catch(final core::int e) {
    return e;
  }
  on core::Object catch(final core::Object e) {
    return 1;
  }
}
static method finallyReturn(dynamic error) → core::int {
  try
    try {
      if(!error.{core::Object::==}(1))
        throw error;
    }
    on core::int catch(final core::int e) {
      return e;
    }
    on core::Object catch(final core::Object e) {
      return 1;
    }
  finally {
    return 100;
  }
}
static method finallyReturn1(core::int x) → core::int {
  try {
    if(x.{core::num::==}(1)) {
      throw x;
    }
    else {
      return 0;
    }
  }
  finally {
    return 100;
  }
}
static method finallyMutate() → core::int {
  core::int x = 0;
  try {
    return x;
  }
  finally {
    x = x.{core::num::+}(1);
  }
}
static method subtypeFn() → core::int {
  try {
    throw 2.5;
  }
  on core::num catch(final core::num e) {
    return 0;
  }
}
static method orderFn() → core::String {
  core::String x = "st";
  try
    try {
      x = x.{core::String::+}("ri");
      throw 2;
    }
    on core::Object catch(final core::Object e) {
      x = x.{core::String::+}("n");
    }
  finally {
    return x.{core::String::+}("g");
  }
}
static method notThrowStatement() → core::int {
  core::int count = 0;
  try {
    for (core::int i = 0; i.{core::num::<}(1); throw "a") {
      count = count.{core::num::+}(i);
    }
  }
  on core::Object catch(final core::Object e) {
    return 1;
  }
  return 0;
}
static method main() → void {
  exp::Expect::equals(#C1, 0);
  exp::Expect::equals(#C2, 1);
  exp::Expect::equals(#C3, 10);
  exp::Expect::equals(#C2, 1);
  exp::Expect::equals(#C4, 100);
  exp::Expect::equals(#C4, 100);
  exp::Expect::equals(#C4, 100);
  exp::Expect::equals(#C4, 100);
  exp::Expect::equals(#C4, 100);
  exp::Expect::equals(#C1, 0);
  exp::Expect::equals(#C1, 0);
  exp::Expect::equals(#C5, "string");
  exp::Expect::equals(#C2, 1);
}

constants  {
  #C1 = 0
  #C2 = 1
  #C3 = 10
  #C4 = 100
  #C5 = "string"
}
