Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: pkg/analyzer/test/generated/element_test.dart

Issue 1143003007: Fix handling of nested typedefs (for real this time). (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/test/generated/element_test.dart
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index e69c7ddfbdc7c225e2a8afb306009abadaccaac2..13d08e5b9ea4e85444f40ba14808b3558c2fa68a 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -1258,6 +1258,24 @@ class FunctionTypeImplTest extends EngineTestCase {
isNotNull);
}
+ void test_equality_recursive() {
+ FunctionTypeAliasElementImpl s =
+ ElementFactory.functionTypeAliasElement('s');
+ FunctionTypeAliasElementImpl t =
+ ElementFactory.functionTypeAliasElement('t');
+ FunctionTypeAliasElementImpl u =
+ ElementFactory.functionTypeAliasElement('u');
+ FunctionTypeAliasElementImpl v =
+ ElementFactory.functionTypeAliasElement('v');
+ s.returnType = t.type;
+ t.returnType = s.type;
+ u.returnType = v.type;
+ v.returnType = u.type;
+ // We don't care whether the types compare equal or not. We just need the
+ // computation to terminate.
+ expect(s.type == u.type, new isInstanceOf<bool>());
+ }
+
void test_getElement() {
FunctionElementImpl typeElement =
new FunctionElementImpl.forNode(AstFactory.identifier3("f"));
@@ -1307,6 +1325,18 @@ class FunctionTypeImplTest extends EngineTestCase {
type.hashCode;
}
+ void test_hashCode_recursive() {
+ FunctionTypeAliasElementImpl s =
+ ElementFactory.functionTypeAliasElement('s');
+ FunctionTypeAliasElementImpl t =
+ ElementFactory.functionTypeAliasElement('t');
+ s.returnType = t.type;
+ t.returnType = s.type;
+ // We don't care what the hash code is. We just need its computation to
+ // terminate.
+ expect(t.type.hashCode, new isInstanceOf<int>());
+ }
+
void test_isAssignableTo_normalAndPositionalArgs() {
// ([a]) -> void <: (a) -> void
ClassElement a = ElementFactory.classElement2("A");
@@ -1691,6 +1721,141 @@ class FunctionTypeImplTest extends EngineTestCase {
expect(s.isSubtypeOf(t), isFalse);
}
+ void test_namedParameterTypes_pruned_no_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.parameters = [ElementFactory.namedParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.namedParameterTypes['x'];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_namedParameterTypes_pruned_with_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.typeParameters = [ElementFactory.typeParameterElement('T')];
+ f.parameters = [ElementFactory.namedParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.namedParameterTypes['x'];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_newPrune_no_previous_prune() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeImpl type = f.type;
+ List<FunctionTypeAliasElement> pruneList = type.newPrune;
+ expect(pruneList, hasLength(1));
+ expect(pruneList[0], same(f));
+ }
+
+ void test_newPrune_non_typedef() {
+ // No pruning needs to be done for function types that aren't associated
+ // with typedefs because those types can't be directly referred to by the
+ // user (and hence can't participate in circularities).
+ FunctionElementImpl f = ElementFactory.functionElement('f');
+ FunctionTypeImpl type = f.type;
+ expect(type.newPrune, isNull);
+ }
+
+ void test_newPrune_synthetic_typedef() {
+ // No pruning needs to be done for function types that are associated with
+ // synthetic typedefs because those types are only created for
+ // function-typed formal parameters, which can't be directly referred to by
+ // the user (and hence can't participate in circularities).
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ f.synthetic = true;
+ FunctionTypeImpl type = f.type;
+ expect(type.newPrune, isNull);
+ }
+
+ void test_newPrune_with_previous_prune() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ FunctionTypeImpl type = f.type;
+ FunctionTypeImpl prunedType = type.pruned([g]);
+ List<FunctionTypeAliasElement> pruneList = prunedType.newPrune;
+ expect(pruneList, hasLength(2));
+ expect(pruneList, contains(f));
+ expect(pruneList, contains(g));
+ }
+
+ void test_normalParameterTypes_pruned_no_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.parameters = [ElementFactory.requiredParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.normalParameterTypes[0];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_normalParameterTypes_pruned_with_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.typeParameters = [ElementFactory.typeParameterElement('T')];
+ f.parameters = [ElementFactory.requiredParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.normalParameterTypes[0];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_optionalParameterTypes_pruned_no_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.parameters = [ElementFactory.positionalParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.optionalParameterTypes[0];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_optionalParameterTypes_pruned_with_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.typeParameters = [ElementFactory.typeParameterElement('T')];
+ f.parameters = [ElementFactory.positionalParameter2('x', g.type)];
+ FunctionTypeImpl paramType = f.type.optionalParameterTypes[0];
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_returnType_pruned_no_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.returnType = g.type;
+ FunctionTypeImpl paramType = f.type.returnType;
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
+ void test_returnType_pruned_with_type_arguments() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ FunctionTypeAliasElementImpl g =
+ ElementFactory.functionTypeAliasElement('g');
+ f.typeParameters = [ElementFactory.typeParameterElement('T')];
+ f.returnType = g.type;
+ FunctionTypeImpl paramType = f.type.returnType;
+ expect(paramType.prunedTypedefs, hasLength(1));
+ expect(paramType.prunedTypedefs[0], same(f));
+ }
+
void test_setTypeArguments() {
ClassElementImpl enclosingClass = ElementFactory.classElement2("C", ["E"]);
MethodElementImpl methodElement =
@@ -1773,12 +1938,22 @@ class FunctionTypeImplTest extends EngineTestCase {
}
void test_toString_recursive() {
- FunctionElementImpl t = ElementFactory.functionElement("t");
- FunctionElementImpl s = ElementFactory.functionElement("s");
+ FunctionTypeAliasElementImpl t =
+ ElementFactory.functionTypeAliasElement("t");
+ FunctionTypeAliasElementImpl s =
+ ElementFactory.functionTypeAliasElement("s");
t.returnType = s.type;
s.returnType = t.type;
expect(t.type.toString(), '() \u2192 () \u2192 ...');
}
+
+ void test_toString_recursive_via_interface_type() {
+ FunctionTypeAliasElementImpl f =
+ ElementFactory.functionTypeAliasElement('f');
+ ClassElementImpl c = ElementFactory.classElement2('C', ['T']);
+ f.returnType = c.type.substitute4([f.type]);
+ expect(f.type.toString(), '() \u2192 C<...>');
+ }
}
@reflectiveTest
« no previous file with comments | « pkg/analyzer/lib/src/generated/testing/element_factory.dart ('k') | pkg/analyzer/test/generated/non_error_resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698