library;
import self as self;
import "dart:core" as core;

static method test2() → void {
  has-declared-initializer core::String* string = null;
  if(let final core::String* #t1 = string in #t1 == null ?{core::bool*} null : #t1.{core::String::isNotEmpty}{core::bool*})
    ;
}
static method main() → void {
  try {
    self::test2();
  }
  on dynamic catch(final dynamic e, final core::StackTrace* s) {
    self::checkFirstLineHasPosition(s);
  }
}
static method checkFirstLineHasPosition(core::StackTrace* stackTrace) → void {
  core::String* firstLine = "${stackTrace}".{core::String::split}("
"){(core::Pattern*) →* core::List<core::String*>*}.{core::Iterable::firstWhere}((core::String* line) → core::bool* => line.{core::String::startsWith}("#0"){(core::Pattern*, [core::int*]) →* core::bool*}){((core::String*) →* core::bool*, {orElse: () →* core::String*}) →* core::String*};
  core::int* lastParen = firstLine.{core::String::lastIndexOf}(")"){(core::Pattern*, [core::int*]) →* core::int*};
  if(!(lastParen =={core::num::==}{(core::Object*) →* core::bool*} 1.{core::int::unary-}(){() →* core::int*})) {
    core::int* secondColon = firstLine.{core::String::lastIndexOf}(":", lastParen.{core::num::-}(1){(core::num*) →* core::int*}){(core::Pattern*, [core::int*]) →* core::int*};
    if(!(secondColon =={core::num::==}{(core::Object*) →* core::bool*} 1.{core::int::unary-}(){() →* core::int*})) {
      core::int* firstColon = firstLine.{core::String::lastIndexOf}(":", secondColon.{core::num::-}(1){(core::num*) →* core::int*}){(core::Pattern*, [core::int*]) →* core::int*};
      core::String* lineText = firstLine.{core::String::substring}(firstColon.{core::num::+}(1){(core::num*) →* core::int*}, secondColon){(core::int*, [core::int*]) →* core::String*};
      core::String* posText = firstLine.{core::String::substring}(secondColon.{core::num::+}(1){(core::num*) →* core::int*}, lastParen){(core::int*, [core::int*]) →* core::String*};
      core::int* line = core::int::tryParse(lineText);
      core::int* pos = core::int::tryParse(posText);
      if(!(line == null) && !(pos == null)) {
        core::print("Found position ${line}:${pos}");
        return;
      }
    }
  }
  throw "No position found in \"${firstLine}\"";
}
