mirror of
https://github.com/dart-lang/sdk
synced 2024-09-19 15:11:35 +00:00
83376bf1ee
Fixes #11617. Bug: http://dartbug.com/11617 Change-Id: Id06fb5b3914bee24713427edbd3b9b7e86f86449 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/73360 Commit-Queue: Lasse R.H. Nielsen <lrn@google.com> Reviewed-by: Nate Bosch <nbosch@google.com> Reviewed-by: Stephen Adams <sra@google.com>
365 lines
18 KiB
Dart
365 lines
18 KiB
Dart
// Copyright (c) 2013, 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 test.declarations_test;
|
|
|
|
import 'dart:mirrors';
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'stringify.dart';
|
|
import 'declarations_model.dart' as declarations_model;
|
|
|
|
/// Collects all declarations of [cm] and its super-classes except `Object`.
|
|
///
|
|
/// Includes static declarations of super-classes.
|
|
///
|
|
/// The `Object` class is omitted because this test should be stable against
|
|
/// changes to the platform libraries, as long as the declaration model code
|
|
/// doesn't change.
|
|
Set<DeclarationMirror> transitiveDeclarations(ClassMirror cm) {
|
|
var decls = new Set<DeclarationMirror>();
|
|
while (cm != reflectClass(Object)) {
|
|
decls.addAll(cm.declarations.values);
|
|
cm = cm.superclass;
|
|
}
|
|
return decls;
|
|
}
|
|
|
|
main() {
|
|
ClassMirror cm = reflectClass(declarations_model.Class);
|
|
|
|
Expect.setEquals([
|
|
'Variable(s(_instanceVariable) in s(Class), private)',
|
|
'Variable(s(_staticVariable) in s(Class), private, static)',
|
|
'Variable(s(instanceVariable) in s(Class))',
|
|
'Variable(s(staticVariable) in s(Class), static)'
|
|
], cm.declarations.values.where((dm) => dm is VariableMirror).map(stringify),
|
|
'variables');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(_instanceGetter) in s(Class), private, getter)',
|
|
'Method(s(_staticGetter) in s(Class), private, static, getter)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(staticGetter) in s(Class), static, getter)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => dm is MethodMirror && dm.isGetter)
|
|
.map(stringify),
|
|
'getters');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(_instanceSetter=) in s(Class), private, setter)',
|
|
'Method(s(_staticSetter=) in s(Class), private, static, setter)',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => dm is MethodMirror && dm.isSetter)
|
|
.map(stringify),
|
|
'setters');
|
|
|
|
// dart2js stops testing here.
|
|
return; //# 01: ok
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(+) in s(Class))',
|
|
'Method(s(_instanceMethod) in s(Class), private)',
|
|
'Method(s(_staticMethod) in s(Class), private, static)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(staticMethod) in s(Class), static)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => dm is MethodMirror && dm.isRegularMethod)
|
|
.map(stringify),
|
|
'regular methods');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(Class._generativeConstructor) in s(Class), private, constructor)',
|
|
'Method(s(Class._normalFactory) in s(Class), private, static, constructor)',
|
|
'Method(s(Class._redirectingConstructor)'
|
|
' in s(Class), private, constructor)',
|
|
'Method(s(Class._redirectingFactory)'
|
|
' in s(Class), private, static, constructor)',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => dm is MethodMirror && dm.isConstructor)
|
|
.map(stringify),
|
|
'constructors and factories');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(Class._normalFactory) in s(Class), private, static, constructor)',
|
|
'Method(s(Class._redirectingFactory)'
|
|
' in s(Class), private, static, constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)',
|
|
'Method(s(_staticGetter) in s(Class), private, static, getter)',
|
|
'Method(s(_staticMethod) in s(Class), private, static)',
|
|
'Method(s(_staticSetter=) in s(Class), private, static, setter)',
|
|
'Variable(s(_staticVariable) in s(Class), private, static)',
|
|
'Method(s(staticGetter) in s(Class), static, getter)',
|
|
'Method(s(staticMethod) in s(Class), static)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)',
|
|
'Variable(s(staticVariable) in s(Class), static)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => (dm as dynamic).isStatic)
|
|
.map(stringify),
|
|
'statics');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(+) in s(Class))',
|
|
'TypeVariable(s(C) in s(Class),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Class._generativeConstructor) in s(Class), private, constructor)',
|
|
'Method(s(Class._redirectingConstructor)'
|
|
' in s(Class), private, constructor)',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(_instanceGetter) in s(Class), private, getter)',
|
|
'Method(s(_instanceMethod) in s(Class), private)',
|
|
'Method(s(_instanceSetter=) in s(Class), private, setter)',
|
|
'Variable(s(_instanceVariable) in s(Class), private)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Variable(s(instanceVariable) in s(Class))'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => !(dm as dynamic).isStatic)
|
|
.map(stringify),
|
|
'non-statics');
|
|
|
|
Expect.setEquals(
|
|
[
|
|
'Method(s(+) in s(Class))',
|
|
'TypeVariable(s(C) in s(Class),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Variable(s(instanceVariable) in s(Class))',
|
|
'Method(s(staticGetter) in s(Class), static, getter)',
|
|
'Method(s(staticMethod) in s(Class), static)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)',
|
|
'Variable(s(staticVariable) in s(Class), static)'
|
|
],
|
|
cm.declarations.values
|
|
.where((dm) => !(dm as dynamic).isPrivate)
|
|
.map(stringify),
|
|
'public');
|
|
|
|
Expect.setEquals([
|
|
'Method(s(*) in s(Mixin))',
|
|
'Method(s(+) in s(Class))',
|
|
'Method(s(-) in s(Superclass))',
|
|
'TypeVariable(s(C) in s(Class),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)',
|
|
'TypeVariable(s(S) in s(Superclass),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Superclass.inheritedGenerativeConstructor)'
|
|
' in s(Superclass), constructor)',
|
|
'Method(s(Superclass.inheritedNormalFactory)'
|
|
' in s(Superclass), static, constructor)',
|
|
'Method(s(Superclass.inheritedRedirectingConstructor)'
|
|
' in s(Superclass), constructor)',
|
|
'Method(s(Superclass.inheritedRedirectingFactory)'
|
|
' in s(Superclass), static, constructor)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(inheritedInstanceGetter) in s(Superclass), getter)',
|
|
'Method(s(inheritedInstanceMethod) in s(Superclass))',
|
|
'Method(s(inheritedInstanceSetter=) in s(Superclass), setter)',
|
|
'Variable(s(inheritedInstanceVariable) in s(Superclass))',
|
|
'Method(s(inheritedStaticGetter) in s(Superclass), static, getter)',
|
|
'Method(s(inheritedStaticMethod) in s(Superclass), static)',
|
|
'Method(s(inheritedStaticSetter=) in s(Superclass), static, setter)',
|
|
'Variable(s(inheritedStaticVariable) in s(Superclass), static)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Variable(s(instanceVariable) in s(Class))',
|
|
'Method(s(mixinInstanceGetter) in s(Mixin), getter)',
|
|
'Method(s(mixinInstanceMethod) in s(Mixin))',
|
|
'Method(s(mixinInstanceSetter=) in s(Mixin), setter)',
|
|
'Variable(s(mixinInstanceVariable) in s(Mixin))',
|
|
'Method(s(staticGetter) in s(Class), static, getter)',
|
|
'Method(s(staticMethod) in s(Class), static)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)',
|
|
'Variable(s(staticVariable) in s(Class), static)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin.inheritedGenerativeConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), constructor)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin.inheritedRedirectingConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), constructor)',
|
|
'Variable(s(mixinStaticVariable) in s(Mixin), static)',
|
|
'Method(s(mixinStaticGetter) in s(Mixin), static, getter)',
|
|
'Method(s(mixinStaticSetter=) in s(Mixin), static, setter)',
|
|
'Method(s(mixinStaticMethod) in s(Mixin), static)'
|
|
], transitiveDeclarations(cm).where((dm) => !dm.isPrivate).map(stringify),
|
|
'transitive public');
|
|
// The public members of Object should be the same in all implementations, so
|
|
// we don't exclude Object here.
|
|
|
|
Expect.setEquals([
|
|
'Method(s(+) in s(Class))',
|
|
'TypeVariable(s(C) in s(Class),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Class._generativeConstructor) in s(Class), private, constructor)',
|
|
'Method(s(Class._normalFactory) in s(Class), private, static, constructor)',
|
|
'Method(s(Class._redirectingConstructor)'
|
|
' in s(Class), private, constructor)',
|
|
'Method(s(Class._redirectingFactory)'
|
|
' in s(Class), private, static, constructor)',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)',
|
|
'Method(s(_instanceGetter) in s(Class), private, getter)',
|
|
'Method(s(_instanceMethod) in s(Class), private)',
|
|
'Method(s(_instanceSetter=) in s(Class), private, setter)',
|
|
'Variable(s(_instanceVariable) in s(Class), private)',
|
|
'Method(s(_staticGetter) in s(Class), private, static, getter)',
|
|
'Method(s(_staticMethod) in s(Class), private, static)',
|
|
'Method(s(_staticSetter=) in s(Class), private, static, setter)',
|
|
'Variable(s(_staticVariable) in s(Class), private, static)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Variable(s(instanceVariable) in s(Class))',
|
|
'Method(s(staticGetter) in s(Class), static, getter)',
|
|
'Method(s(staticMethod) in s(Class), static)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)',
|
|
'Variable(s(staticVariable) in s(Class), static)'
|
|
], cm.declarations.values.map(stringify), 'declarations');
|
|
|
|
Expect.setEquals([
|
|
'Method(s(*) in s(Mixin))',
|
|
'Method(s(+) in s(Class))',
|
|
'Method(s(-) in s(Superclass))',
|
|
'TypeVariable(s(C) in s(Class),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Class._generativeConstructor) in s(Class), private, constructor)',
|
|
'Method(s(Class._normalFactory) in s(Class), private, static, constructor)',
|
|
'Method(s(Class._redirectingConstructor)'
|
|
' in s(Class), private, constructor)',
|
|
'Method(s(Class._redirectingFactory)'
|
|
' in s(Class), private, static, constructor)',
|
|
'Method(s(Class.generativeConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.normalFactory) in s(Class), static, constructor)',
|
|
'Method(s(Class.redirectingConstructor) in s(Class), constructor)',
|
|
'Method(s(Class.redirectingFactory) in s(Class), static, constructor)',
|
|
'TypeVariable(s(S) in s(Superclass),'
|
|
' upperBound = Class(s(Object) in s(dart.core), top-level))',
|
|
'Method(s(Superclass._inheritedGenerativeConstructor)'
|
|
' in s(Superclass), private, constructor)',
|
|
'Method(s(Superclass._inheritedNormalFactory)'
|
|
' in s(Superclass), private, static, constructor)',
|
|
'Method(s(Superclass._inheritedRedirectingConstructor)'
|
|
' in s(Superclass), private, constructor)',
|
|
'Method(s(Superclass._inheritedRedirectingFactory)'
|
|
' in s(Superclass), private, static, constructor)',
|
|
'Method(s(Superclass.inheritedGenerativeConstructor)'
|
|
' in s(Superclass), constructor)',
|
|
'Method(s(Superclass.inheritedNormalFactory)'
|
|
' in s(Superclass), static, constructor)',
|
|
'Method(s(Superclass.inheritedRedirectingConstructor)'
|
|
' in s(Superclass), constructor)',
|
|
'Method(s(Superclass.inheritedRedirectingFactory)'
|
|
' in s(Superclass), static, constructor)',
|
|
'Method(s(_inheritedInstanceGetter) in s(Superclass), private, getter)',
|
|
'Method(s(_inheritedInstanceMethod) in s(Superclass), private)',
|
|
'Method(s(_inheritedInstanceSetter=) in s(Superclass), private, setter)',
|
|
'Variable(s(_inheritedInstanceVariable) in s(Superclass), private)',
|
|
'Method(s(_inheritedStaticGetter)'
|
|
' in s(Superclass), private, static, getter)',
|
|
'Method(s(_inheritedStaticMethod) in s(Superclass), private, static)',
|
|
'Method(s(_inheritedStaticSetter=)'
|
|
' in s(Superclass), private, static, setter)',
|
|
'Variable(s(_inheritedStaticVariable) in s(Superclass), private, static)',
|
|
'Method(s(_instanceGetter) in s(Class), private, getter)',
|
|
'Method(s(_instanceMethod) in s(Class), private)',
|
|
'Method(s(_instanceSetter=) in s(Class), private, setter)',
|
|
'Variable(s(_instanceVariable) in s(Class), private)',
|
|
'Method(s(_mixinInstanceGetter) in s(Mixin), private, getter)',
|
|
'Method(s(_mixinInstanceMethod) in s(Mixin), private)',
|
|
'Method(s(_mixinInstanceSetter=) in s(Mixin), private, setter)',
|
|
'Variable(s(_mixinInstanceVariable) in s(Mixin), private)',
|
|
'Method(s(_staticGetter) in s(Class), private, static, getter)',
|
|
'Method(s(_staticMethod) in s(Class), private, static)',
|
|
'Method(s(_staticSetter=) in s(Class), private, static, setter)',
|
|
'Variable(s(_staticVariable) in s(Class), private, static)',
|
|
'Method(s(abstractMethod) in s(Class), abstract)',
|
|
'Method(s(inheritedInstanceGetter) in s(Superclass), getter)',
|
|
'Method(s(inheritedInstanceMethod) in s(Superclass))',
|
|
'Method(s(inheritedInstanceSetter=) in s(Superclass), setter)',
|
|
'Variable(s(inheritedInstanceVariable) in s(Superclass))',
|
|
'Method(s(inheritedStaticGetter) in s(Superclass), static, getter)',
|
|
'Method(s(inheritedStaticMethod) in s(Superclass), static)',
|
|
'Method(s(inheritedStaticSetter=) in s(Superclass), static, setter)',
|
|
'Variable(s(inheritedStaticVariable) in s(Superclass), static)',
|
|
'Method(s(instanceGetter) in s(Class), getter)',
|
|
'Method(s(instanceMethod) in s(Class))',
|
|
'Method(s(instanceSetter=) in s(Class), setter)',
|
|
'Variable(s(instanceVariable) in s(Class))',
|
|
'Method(s(mixinInstanceGetter) in s(Mixin), getter)',
|
|
'Method(s(mixinInstanceMethod) in s(Mixin))',
|
|
'Method(s(mixinInstanceSetter=) in s(Mixin), setter)',
|
|
'Variable(s(mixinInstanceVariable) in s(Mixin))',
|
|
'Method(s(staticGetter) in s(Class), static, getter)',
|
|
'Method(s(staticMethod) in s(Class), static)',
|
|
'Method(s(staticSetter=) in s(Class), static, setter)',
|
|
'Variable(s(staticVariable) in s(Class), static)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin._inheritedGenerativeConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), private, constructor)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin._inheritedRedirectingConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), private, constructor)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin.inheritedGenerativeConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), constructor)',
|
|
'Method(s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin.inheritedRedirectingConstructor)'
|
|
' in s(test.declarations_model.Superclass'
|
|
' with test.declarations_model.Mixin), constructor)',
|
|
'Variable(s(mixinStaticVariable) in s(Mixin), static)',
|
|
'Variable(s(_mixinStaticVariable) in s(Mixin), private, static)',
|
|
'Method(s(mixinStaticGetter) in s(Mixin), static, getter)',
|
|
'Method(s(mixinStaticSetter=) in s(Mixin), static, setter)',
|
|
'Method(s(mixinStaticMethod) in s(Mixin), static)',
|
|
'Method(s(_mixinStaticGetter) in s(Mixin), private, static, getter)',
|
|
'Method(s(_mixinStaticSetter=) in s(Mixin), private, static, setter)',
|
|
'Method(s(_mixinStaticMethod) in s(Mixin), private, static)'
|
|
], transitiveDeclarations(cm).map(stringify), 'transitive all');
|
|
}
|