blob: 11b73b261571f575fb2ee7ec6f71b2ea71785d84 [file] [log] [blame]
// 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.
library type_variable_occurrence_test;
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/elements.dart' show ClassElement;
import 'package:compiler/src/elements/resolution_types.dart';
import 'package:compiler/src/elements/types.dart';
import 'package:expect/expect.dart';
import 'type_test_helper.dart';
void main() {
testTypeVariableOccurrence();
}
testTypeVariableOccurrence() {
asyncTest(() => TypeEnvironment.create(r"""
typedef S Typedef1<S>();
typedef void Typedef2<S>(S s);
typedef void Typedef3<S>(A<S> a);
class A<T> {
int field1;
T field2;
A<int> field3;
A<T> field4;
A<A<int>> field5;
A<A<T>> field6;
Typedef1 field7;
Typedef1<int> field8;
Typedef1<T> field9;
Typedef1<Typedef1<T>> field10;
Typedef2 field11;
Typedef2<int> field12;
Typedef2<T> field13;
Typedef2<Typedef1<T>> field14;
Typedef3 field15;
Typedef3<int> field16;
Typedef3<T> field17;
Typedef3<Typedef1<T>> field18;
void method1() {}
T method2() => null;
A<T> method3() => null;
void method4(T t) {}
void method5(A<T> t) {}
void method6(void foo(T t)) {}
void method7([T t]) {}
void method8({T t}) {}
}
""").then((env) {
ClassElement A = env.getElement('A');
expect(bool expectResult, String memberName) {
ResolutionDartType memberType = env.getMemberType(A, memberName);
ResolutionTypeVariableType typeVariable =
memberType.typeVariableOccurrence;
if (expectResult) {
Expect.isNotNull(typeVariable);
Expect.equals(A, DartTypes.getClassContext(memberType));
} else {
Expect.isNull(typeVariable);
Expect.isNull(DartTypes.getClassContext(memberType));
}
}
// int field1;
expect(false, 'field1');
// T field2;
expect(true, 'field2');
// A<int> field3;
expect(false, 'field3');
// A<T> field4;
expect(true, 'field4');
// A<A<int>> field5;
expect(false, 'field5');
// A<A<T>> field6;
expect(true, 'field6');
// Typedef1 field7;
expect(false, 'field7');
// Typedef1<int> field8;
expect(false, 'field8');
// Typedef1<T> field9;
expect(true, 'field9');
// Typedef1<Typedef1<T>> field10;
expect(true, 'field10');
// Typedef2 field11;
expect(false, 'field11');
// Typedef2<int> field12;
expect(false, 'field12');
// Typedef2<T> field13;
expect(true, 'field13');
// Typedef2<Typedef1<T>> field14;
expect(true, 'field14');
// Typedef3 field15;
expect(false, 'field15');
// Typedef3<int> field16;
expect(false, 'field16');
// Typedef3<T> field17;
expect(true, 'field17');
// Typedef3<Typedef1<T>> field18;
expect(true, 'field18');
// void method1() {}
expect(false, 'method1');
// T method2() => null;
expect(true, 'method2');
// A<T> method3() => null;
expect(true, 'method3');
// void method4(T t) {}
expect(true, 'method4');
// void method5(A<T> t) {}
expect(true, 'method5');
// void method6(void foo(T t)) {}
expect(true, 'method6');
// void method7([T t]);
expect(true, 'method7');
// void method8({T t});
expect(true, 'method8');
}));
}