// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

// @dart = 2.9

library lib;

import "dart:mirrors";

import "package:expect/expect.dart";

class C<T> {
  static int tracefunc() {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
    return 10;
  }
}

extension ext<T> on C<T> {
  func() {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  get prop {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  set prop(value) {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  operator +(val) {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  operator -(val) {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  static int sfld = C.tracefunc();
  static sfunc() {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  static get sprop {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }

  static set sprop(value) {
    try {
      throw "producing a stack trace";
    } catch (e, s) {
      print(s);
    }
  }
}

checkExtensionKind(closure, kind, name) {
  var closureMirror = reflect(closure) as ClosureMirror;
  var methodMirror = closureMirror.function;
  Expect.isTrue(methodMirror.simpleName.toString().contains(name));
  Expect.equals(kind, methodMirror.isExtensionMember, "isExtension");
}

void testExtension(sym, mirror) {
  if (mirror is MethodMirror) {
    var methodMirror = mirror as MethodMirror;
    if (MirrorSystem.getName(sym).startsWith('ext', 0)) {
      Expect.equals(true, methodMirror.isExtensionMember, "isExtension");
      Expect.isTrue(methodMirror.simpleName.toString().contains('ext.'));
    } else {
      Expect.equals(false, methodMirror.isExtensionMember, "isExtension");
    }
  } else if (mirror is VariableMirror) {
    var variableMirror = mirror as VariableMirror;
    if (MirrorSystem.getName(sym).startsWith('ext', 0)) {
      Expect.equals(true, variableMirror.isExtensionMember, "isExtension");
    } else {
      Expect.equals(false, variableMirror.isExtensionMember, "isExtension");
    }
  }
}

main() {
  checkExtensionKind(C.tracefunc, false, 'tracefunc');

  C c = new C();
  checkExtensionKind(c.func, true, 'ext.func');
  checkExtensionKind(ext.sfunc, true, 'ext.sfunc');

  var libraryMirror = reflectClass(C).owner as LibraryMirror;
  libraryMirror.declarations.forEach(testExtension);
}
