|  | // 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. | 
|  |  | 
|  | 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); | 
|  | } |