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

Side by Side Diff: pkg/analyzer/test/src/summary/summary_common.dart

Issue 2288223003: Don't perform final fields and top-level variables type propagation. (Closed)
Patch Set: Rewrite 'reuse' tests using 'inferredTypeSlot'. Created 4 years, 3 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library analyzer.test.src.summary.summary_common; 5 library analyzer.test.src.summary.summary_common;
6 6
7 import 'package:analyzer/analyzer.dart'; 7 import 'package:analyzer/analyzer.dart';
8 import 'package:analyzer/dart/ast/ast.dart'; 8 import 'package:analyzer/dart/ast/ast.dart';
9 import 'package:analyzer/dart/element/element.dart'; 9 import 'package:analyzer/dart/element/element.dart';
10 import 'package:analyzer/src/dart/scanner/reader.dart'; 10 import 'package:analyzer/src/dart/scanner/reader.dart';
(...skipping 7715 matching lines...) Expand 10 before | Expand all | Expand 10 after
7726 serializeClassText('class C { static var v = 0; }').fields[0]; 7726 serializeClassText('class C { static var v = 0; }').fields[0];
7727 checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int'); 7727 checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int');
7728 } 7728 }
7729 7729
7730 test_field_inferred_type_static_implicit_uninitialized() { 7730 test_field_inferred_type_static_implicit_uninitialized() {
7731 UnlinkedVariable v = 7731 UnlinkedVariable v =
7732 serializeClassText('class C { static var v; }').fields[0]; 7732 serializeClassText('class C { static var v; }').fields[0];
7733 expect(v.inferredTypeSlot, 0); 7733 expect(v.inferredTypeSlot, 0);
7734 } 7734 }
7735 7735
7736 test_field_propagated_type_final_immediate() {
7737 UnlinkedVariable v =
7738 serializeClassText('class C { final v = 0; }').fields[0];
7739 checkLinkedTypeSlot(v.propagatedTypeSlot, 'dart:core', 'dart:core', 'int');
7740 }
7741
7742 test_field_static() { 7736 test_field_static() {
7743 UnlinkedVariable variable = 7737 UnlinkedVariable variable =
7744 serializeClassText('class C { static int i; }').fields[0]; 7738 serializeClassText('class C { static int i; }').fields[0];
7745 expect(variable.isStatic, isTrue); 7739 expect(variable.isStatic, isTrue);
7746 expect(variable.initializer, isNull); 7740 expect(variable.initializer, isNull);
7747 expect(unlinkedUnits[0].publicNamespace.names, hasLength(1)); 7741 expect(unlinkedUnits[0].publicNamespace.names, hasLength(1));
7748 expect(unlinkedUnits[0].publicNamespace.names[0].name, 'C'); 7742 expect(unlinkedUnits[0].publicNamespace.names[0].name, 'C');
7749 expect(unlinkedUnits[0].publicNamespace.names[0].members, hasLength(1)); 7743 expect(unlinkedUnits[0].publicNamespace.names[0].members, hasLength(1));
7750 expect(unlinkedUnits[0].publicNamespace.names[0].members[0].name, 'i'); 7744 expect(unlinkedUnits[0].publicNamespace.names[0].members[0].name, 'i');
7751 expect(unlinkedUnits[0].publicNamespace.names[0].members[0].kind, 7745 expect(unlinkedUnits[0].publicNamespace.names[0].members[0].kind,
(...skipping 29 matching lines...) Expand all
7781 // The element model doesn't contain the initializer expressions needed 7775 // The element model doesn't contain the initializer expressions needed
7782 // for type inference. TODO(paulberry): fix. 7776 // for type inference. TODO(paulberry): fix.
7783 return; 7777 return;
7784 } 7778 }
7785 UnlinkedVariable variable = 7779 UnlinkedVariable variable =
7786 serializeClassText('class C { var x = 0; }').fields[0]; 7780 serializeClassText('class C { var x = 0; }').fields[0];
7787 expect(variable.initializer.bodyExpr, isNotNull); 7781 expect(variable.initializer.bodyExpr, isNotNull);
7788 } 7782 }
7789 7783
7790 test_fully_linked_references_follow_other_references() { 7784 test_fully_linked_references_follow_other_references() {
7791 if (skipFullyLinkedData) { 7785 if (!strongMode || skipFullyLinkedData) {
7792 return; 7786 return;
7793 } 7787 }
7794 serializeLibraryText('final x = 0; String y;'); 7788 serializeLibraryText('final x = 0; String y;');
7795 checkLinkedTypeSlot(unlinkedUnits[0].variables[0].propagatedTypeSlot, 7789 checkLinkedTypeSlot(unlinkedUnits[0].variables[0].inferredTypeSlot,
7796 'dart:core', 'dart:core', 'int'); 7790 'dart:core', 'dart:core', 'int');
7797 checkTypeRef( 7791 checkTypeRef(
7798 unlinkedUnits[0].variables[1].type, 'dart:core', 'dart:core', 'String'); 7792 unlinkedUnits[0].variables[1].type, 'dart:core', 'dart:core', 'String');
7799 // Even though the definition of y follows the definition of x, the linked 7793 // Even though the definition of y follows the definition of x, the linked
7800 // type reference for x should use a higher numbered reference than the 7794 // type reference for x should use a higher numbered reference than the
7801 // unlinked type reference for y. 7795 // unlinked type reference for y.
7802 EntityRef propagatedType = 7796 EntityRef propagatedType =
7803 getTypeRefForSlot(unlinkedUnits[0].variables[0].propagatedTypeSlot); 7797 getTypeRefForSlot(unlinkedUnits[0].variables[0].inferredTypeSlot);
7804 expect(unlinkedUnits[0].variables[1].type.reference, 7798 expect(unlinkedUnits[0].variables[1].type.reference,
7805 lessThan(propagatedType.reference)); 7799 lessThan(propagatedType.reference));
7806 } 7800 }
7807 7801
7808 test_function_documented() { 7802 test_function_documented() {
7809 String text = ''' 7803 String text = '''
7810 // Extra comment so doc comment offset != 0 7804 // Extra comment so doc comment offset != 0
7811 /** 7805 /**
7812 * Docs 7806 * Docs
7813 */ 7807 */
(...skipping 891 matching lines...) Expand 10 before | Expand all | Expand 10 after
8705 int foo; 8699 int foo;
8706 class Test {} 8700 class Test {}
8707 8701
8708 int bar;''' 8702 int bar;'''
8709 .replaceAll('\r\n', '\n'); 8703 .replaceAll('\r\n', '\n');
8710 serializeLibraryText(text); 8704 serializeLibraryText(text);
8711 expect(unlinkedUnits[0].lineStarts, [0, 9, 23, 24]); 8705 expect(unlinkedUnits[0].lineStarts, [0, 9, 23, 24]);
8712 } 8706 }
8713 8707
8714 test_linked_reference_reuse() { 8708 test_linked_reference_reuse() {
8715 if (skipFullyLinkedData) { 8709 if (!strongMode || skipFullyLinkedData) {
8716 return; 8710 return;
8717 } 8711 }
8718 // When the reference for a linked type is the same as an explicitly 8712 // When the reference for a linked type is the same as an explicitly
8719 // referenced type, the explicit reference should be re-used. 8713 // referenced type, the explicit reference should be re-used.
8720 addNamedSource('/a.dart', 'class C {}'); 8714 addNamedSource('/a.dart', 'class C {}');
8721 addNamedSource('/b.dart', 'import "a.dart"; C f() => null;'); 8715 addNamedSource('/b.dart', 'import "a.dart"; C f() => null;');
8722 serializeLibraryText( 8716 serializeLibraryText(
8723 'import "a.dart"; import "b.dart"; C c1; final c2 = f();'); 8717 'import "a.dart"; import "b.dart"; C c1; final c2 = f();');
8724 int explicitReference = findVariable('c1').type.reference; 8718 int explicitReference = findVariable('c1').type.reference;
8725 expect(getTypeRefForSlot(findVariable('c2').propagatedTypeSlot).reference, 8719 expect(getTypeRefForSlot(findVariable('c2').inferredTypeSlot).reference,
8726 explicitReference); 8720 explicitReference);
8727 } 8721 }
8728 8722
8729 test_linked_type_dependency_reuse() { 8723 test_linked_type_dependency_reuse() {
8730 if (skipFullyLinkedData) { 8724 if (!strongMode || skipFullyLinkedData) {
8731 return; 8725 return;
8732 } 8726 }
8733 // When the dependency for a linked type is the same as an explicit 8727 // When the dependency for a linked type is the same as an explicit
8734 // dependency, the explicit dependency should be re-used. 8728 // dependency, the explicit dependency should be re-used.
8735 addNamedSource('/a.dart', 'class C {} class D {}'); 8729 addNamedSource('/a.dart', 'class C {} class D {}');
8736 addNamedSource('/b.dart', 'import "a.dart"; D f() => null;'); 8730 addNamedSource('/b.dart', 'import "a.dart"; D f() => null;');
8737 serializeLibraryText( 8731 serializeLibraryText(
8738 'import "a.dart"; import "b.dart"; C c; final d = f();'); 8732 'import "a.dart"; import "b.dart"; C c; final d = f();');
8739 int cReference = findVariable('c').type.reference; 8733 int cReference = findVariable('c').type.reference;
8740 int explicitDependency = linked.units[0].references[cReference].dependency; 8734 int explicitDependency = linked.units[0].references[cReference].dependency;
8741 int dReference = 8735 int dReference =
8742 getTypeRefForSlot(findVariable('d').propagatedTypeSlot).reference; 8736 getTypeRefForSlot(findVariable('d').inferredTypeSlot).reference;
8743 expect( 8737 expect(
8744 linked.units[0].references[dReference].dependency, explicitDependency); 8738 linked.units[0].references[dReference].dependency, explicitDependency);
8745 } 8739 }
8746 8740
8747 test_local_names_take_precedence_over_imported_names() { 8741 test_local_names_take_precedence_over_imported_names() {
8748 addNamedSource('/a.dart', 'class C {} class D {}'); 8742 addNamedSource('/a.dart', 'class C {} class D {}');
8749 serializeLibraryText(''' 8743 serializeLibraryText('''
8750 import 'a.dart'; 8744 import 'a.dart';
8751 class C {} 8745 class C {}
8752 C c; 8746 C c;
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
9493 UnlinkedExecutable f = 9487 UnlinkedExecutable f =
9494 serializeExecutableText('set f(int value) {}', executableName: 'f='); 9488 serializeExecutableText('set f(int value) {}', executableName: 'f=');
9495 expect(f.inferredReturnTypeSlot, 0); 9489 expect(f.inferredReturnTypeSlot, 0);
9496 } 9490 }
9497 9491
9498 test_slot_reuse() { 9492 test_slot_reuse() {
9499 // Different compilation units have independent notions of slot id, so slot 9493 // Different compilation units have independent notions of slot id, so slot
9500 // ids should be reused. 9494 // ids should be reused.
9501 addNamedSource('/a.dart', 'part of foo; final v = 0;'); 9495 addNamedSource('/a.dart', 'part of foo; final v = 0;');
9502 serializeLibraryText('library foo; part "a.dart"; final w = 0;'); 9496 serializeLibraryText('library foo; part "a.dart"; final w = 0;');
9503 expect(unlinkedUnits[1].variables[0].propagatedTypeSlot, 9497 expect(unlinkedUnits[1].variables[0].inferredTypeSlot,
9504 unlinkedUnits[0].variables[0].propagatedTypeSlot); 9498 unlinkedUnits[0].variables[0].inferredTypeSlot);
9505 } 9499 }
9506 9500
9507 test_syntheticFunctionType_genericClosure() { 9501 test_syntheticFunctionType_genericClosure() {
9508 if (skipFullyLinkedData) { 9502 if (skipFullyLinkedData) {
9509 return; 9503 return;
9510 } 9504 }
9511 if (!strongMode) { 9505 if (!strongMode) {
9512 // The test below uses generic comment syntax because proper generic 9506 // The test below uses generic comment syntax because proper generic
9513 // method syntax doesn't support generic closures. So it can only run in 9507 // method syntax doesn't support generic closures. So it can only run in
9514 // strong mode. 9508 // strong mode.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
9585 } 9579 }
9586 ''').localVariables[0]; 9580 ''').localVariables[0];
9587 EntityRef inferredType = 9581 EntityRef inferredType =
9588 getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot); 9582 getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
9589 checkLinkedTypeRef( 9583 checkLinkedTypeRef(
9590 inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int'); 9584 inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
9591 checkParamTypeRef(inferredType.syntheticParams[0].type, 2); 9585 checkParamTypeRef(inferredType.syntheticParams[0].type, 2);
9592 checkParamTypeRef(inferredType.syntheticParams[1].type, 1); 9586 checkParamTypeRef(inferredType.syntheticParams[1].type, 1);
9593 } 9587 }
9594 9588
9595 test_syntheticFunctionType_noArguments() {
9596 if (skipFullyLinkedData) {
9597 return;
9598 }
9599 UnlinkedVariable variable = serializeVariableText('''
9600 final v = f() ? () => 0 : () => 1;
9601 bool f() => true;
9602 ''');
9603 EntityRef propagatedType = getTypeRefForSlot(variable.propagatedTypeSlot);
9604 checkLinkedTypeRef(
9605 propagatedType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
9606 expect(propagatedType.syntheticParams, isEmpty);
9607 }
9608
9609 test_syntheticFunctionType_withArguments() {
9610 if (skipFullyLinkedData) {
9611 return;
9612 }
9613 UnlinkedVariable variable = serializeVariableText('''
9614 final v = f() ? (int x, String y) => 0 : (int x, String y) => 1;
9615 bool f() => true;
9616 ''');
9617 EntityRef propagatedType = getTypeRefForSlot(variable.propagatedTypeSlot);
9618 checkTypeRef(
9619 propagatedType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
9620 expect(propagatedType.syntheticParams, hasLength(2));
9621 checkTypeRef(propagatedType.syntheticParams[0].type, 'dart:core',
9622 'dart:core', 'int');
9623 checkTypeRef(propagatedType.syntheticParams[1].type, 'dart:core',
9624 'dart:core', 'String');
9625 }
9626
9627 test_type_arguments_explicit() { 9589 test_type_arguments_explicit() {
9628 EntityRef typeRef = serializeTypeText('List<int>'); 9590 EntityRef typeRef = serializeTypeText('List<int>');
9629 checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List', 9591 checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List',
9630 numTypeParameters: 1, numTypeArguments: 1); 9592 numTypeParameters: 1, numTypeArguments: 1);
9631 checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'int'); 9593 checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'int');
9632 } 9594 }
9633 9595
9634 test_type_arguments_explicit_dynamic() { 9596 test_type_arguments_explicit_dynamic() {
9635 EntityRef typeRef = serializeTypeText('List<dynamic>'); 9597 EntityRef typeRef = serializeTypeText('List<dynamic>');
9636 checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List', 9598 checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List',
(...skipping 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
10328 UnlinkedVariable variable = 10290 UnlinkedVariable variable =
10329 serializeVariableText('int i;', variableName: 'i'); 10291 serializeVariableText('int i;', variableName: 'i');
10330 expect(variable.isStatic, isFalse); 10292 expect(variable.isStatic, isFalse);
10331 } 10293 }
10332 10294
10333 test_variable_private() { 10295 test_variable_private() {
10334 serializeVariableText('int _i;', variableName: '_i'); 10296 serializeVariableText('int _i;', variableName: '_i');
10335 expect(unlinkedUnits[0].publicNamespace.names, isEmpty); 10297 expect(unlinkedUnits[0].publicNamespace.names, isEmpty);
10336 } 10298 }
10337 10299
10338 test_variable_propagated_type_final_immediate() {
10339 UnlinkedVariable v = serializeVariableText('final v = 0;');
10340 checkLinkedTypeSlot(v.propagatedTypeSlot, 'dart:core', 'dart:core', 'int');
10341 }
10342
10343 test_variable_propagated_type_new_reference() {
10344 if (skipFullyLinkedData) {
10345 return;
10346 }
10347 UnlinkedVariable v = serializeVariableText('final v = 0;');
10348 // Since the propagated type of `v` is `int`, and there are no references
10349 // to `int` elsewhere in the source file, a new linked reference should
10350 // have been created for it, with no associated unlinked reference.
10351 expect(v.propagatedTypeSlot, isNot(0));
10352 EntityRef type = getTypeRefForSlot(v.propagatedTypeSlot);
10353 expect(type, isNotNull);
10354 expect(type.reference,
10355 greaterThanOrEqualTo(unlinkedUnits[0].references.length));
10356 }
10357
10358 test_variable_propagated_type_omit_dynamic() {
10359 if (skipFullyLinkedData) {
10360 return;
10361 }
10362 UnlinkedVariable v = serializeVariableText('final v = <int, dynamic>{};');
10363 EntityRef type = getTypeRefForSlot(v.propagatedTypeSlot);
10364 checkLinkedTypeRef(type, 'dart:core', 'dart:core', 'Map',
10365 numTypeParameters: 2, numTypeArguments: 2);
10366 checkLinkedTypeRef(type.typeArguments[0], 'dart:core', 'dart:core', 'int');
10367 checkLinkedDynamicTypeRef(type.typeArguments[1]);
10368 }
10369
10370 test_variable_propagatedTypeSlot_const() {
10371 // Const variables are propagable so they have a nonzero
10372 // propagatedTypeSlot.
10373 UnlinkedVariable variable = serializeVariableText('const v = 0;');
10374 expect(variable.propagatedTypeSlot, isNot(0));
10375 }
10376
10377 test_variable_propagatedTypeSlot_final() {
10378 // Final variables are propagable so they have a nonzero
10379 // propagatedTypeSlot.
10380 UnlinkedVariable variable = serializeVariableText('final v = 0;');
10381 expect(variable.propagatedTypeSlot, isNot(0));
10382 }
10383
10384 test_variable_propagatedTypeSlot_non_propagable() {
10385 // Non-final non-const variables aren't propagable so they don't have a
10386 // propagatedTypeSlot.
10387 UnlinkedVariable variable = serializeVariableText('var v;');
10388 expect(variable.propagatedTypeSlot, 0);
10389 }
10390
10391 test_variable_static() { 10300 test_variable_static() {
10392 UnlinkedVariable variable = 10301 UnlinkedVariable variable =
10393 serializeClassText('class C { static int i; }').fields[0]; 10302 serializeClassText('class C { static int i; }').fields[0];
10394 expect(variable.isStatic, isTrue); 10303 expect(variable.isStatic, isTrue);
10395 } 10304 }
10396 10305
10397 test_variable_type() { 10306 test_variable_type() {
10398 UnlinkedVariable variable = 10307 UnlinkedVariable variable =
10399 serializeVariableText('int i;', variableName: 'i'); 10308 serializeVariableText('int i;', variableName: 'i');
10400 checkTypeRef(variable.type, 'dart:core', 'dart:core', 'int'); 10309 checkTypeRef(variable.type, 'dart:core', 'dart:core', 'int');
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
10578 class _PrefixExpectation { 10487 class _PrefixExpectation {
10579 final ReferenceKind kind; 10488 final ReferenceKind kind;
10580 final String name; 10489 final String name;
10581 final String absoluteUri; 10490 final String absoluteUri;
10582 final String relativeUri; 10491 final String relativeUri;
10583 final int numTypeParameters; 10492 final int numTypeParameters;
10584 10493
10585 _PrefixExpectation(this.kind, this.name, 10494 _PrefixExpectation(this.kind, this.name,
10586 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0}); 10495 {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0});
10587 } 10496 }
OLDNEW
« no previous file with comments | « pkg/analyzer/test/src/summary/summarize_ast_test.dart ('k') | pkg/analyzer/test/src/task/dart_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698