00b2e580a3
Bug: https://github.com/dart-lang/sdk/issues/40045 Change-Id: I597259b38684de87016f1e136723d24f4ac05420 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/132440 Reviewed-by: Ben Konyi <bkonyi@google.com> Commit-Queue: Ryan Macnak <rmacnak@google.com>
127 lines
2.8 KiB
Dart
127 lines
2.8 KiB
Dart
// 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.
|
|
|
|
// SharedOptions=--enable-experiment=extension-methods
|
|
|
|
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);
|
|
}
|