| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 import 'dart:convert'; | 6 import 'dart:convert'; |
| 7 import 'dart:io'; | 7 import 'dart:io'; |
| 8 | 8 |
| 9 import 'package:analyzer/dart/ast/ast.dart'; | 9 import 'package:analyzer/dart/ast/ast.dart'; |
| 10 import 'package:analyzer/dart/ast/token.dart'; | 10 import 'package:analyzer/dart/ast/token.dart'; |
| 11 import 'package:analyzer/dart/ast/visitor.dart'; | 11 import 'package:analyzer/dart/ast/visitor.dart'; |
| 12 import 'package:analyzer/dart/element/element.dart'; | 12 import 'package:analyzer/dart/element/element.dart'; |
| 13 import 'package:analyzer/dart/element/type.dart'; | 13 import 'package:analyzer/dart/element/type.dart'; |
| 14 import 'package:analyzer/src/dart/analysis/driver.dart'; | 14 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 15 import 'package:analyzer/src/generated/parser.dart'; | 15 import 'package:analyzer/src/generated/parser.dart'; |
| 16 import 'package:analyzer/src/generated/scanner.dart'; | 16 import 'package:analyzer/src/generated/scanner.dart'; |
| 17 import 'package:analyzer/src/generated/source.dart'; | 17 import 'package:analyzer/src/generated/source.dart'; |
| 18 import 'package:analyzer/src/generated/utilities_dart.dart'; | 18 import 'package:analyzer/src/generated/utilities_dart.dart'; |
| 19 import 'package:front_end/src/base/instrumentation.dart' as fasta; | 19 import 'package:front_end/src/base/instrumentation.dart' as fasta; |
| 20 import 'package:front_end/src/fasta/compiler_command_line.dart' as fasta; |
| 20 import 'package:front_end/src/fasta/compiler_context.dart' as fasta; | 21 import 'package:front_end/src/fasta/compiler_context.dart' as fasta; |
| 21 import 'package:front_end/src/fasta/compiler_command_line.dart' as fasta; | |
| 22 import 'package:front_end/src/fasta/testing/validating_instrumentation.dart' | 22 import 'package:front_end/src/fasta/testing/validating_instrumentation.dart' |
| 23 as fasta; | 23 as fasta; |
| 24 import 'package:front_end/src/fasta/util/relativize.dart' show relativizeUri; | 24 import 'package:front_end/src/fasta/util/relativize.dart' show relativizeUri; |
| 25 import 'package:kernel/kernel.dart' as fasta; | 25 import 'package:kernel/kernel.dart' as fasta; |
| 26 import 'package:path/path.dart' as pathos; | 26 import 'package:path/path.dart' as pathos; |
| 27 import 'package:test/test.dart'; | 27 import 'package:test/test.dart'; |
| 28 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 28 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 29 | 29 |
| 30 import '../../dart/analysis/base.dart'; | 30 import '../../dart/analysis/base.dart'; |
| 31 | 31 |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 visitDeclaredIdentifier(DeclaredIdentifier node) { | 382 visitDeclaredIdentifier(DeclaredIdentifier node) { |
| 383 super.visitDeclaredIdentifier(node); | 383 super.visitDeclaredIdentifier(node); |
| 384 if (node.type == null) { | 384 if (node.type == null) { |
| 385 _recordType(node.identifier.offset, node.element.type); | 385 _recordType(node.identifier.offset, node.element.type); |
| 386 } | 386 } |
| 387 } | 387 } |
| 388 | 388 |
| 389 @override | 389 @override |
| 390 visitFunctionDeclaration(FunctionDeclaration node) { | 390 visitFunctionDeclaration(FunctionDeclaration node) { |
| 391 super.visitFunctionDeclaration(node); | 391 super.visitFunctionDeclaration(node); |
| 392 if (node.element is LocalElement && | 392 |
| 393 node.element.enclosingElement is! CompilationUnitElement) { | 393 bool isSetter = node.element.kind == ElementKind.SETTER; |
| 394 bool isLocalFunction = node.element is LocalElement && |
| 395 node.element.enclosingElement is! CompilationUnitElement; |
| 396 |
| 397 if (isSetter || isLocalFunction) { |
| 394 if (node.returnType == null) { | 398 if (node.returnType == null) { |
| 395 _instrumentation.record( | 399 _instrumentation.record( |
| 396 uri, | 400 uri, |
| 397 node.name.offset, | 401 node.name.offset, |
| 398 'returnType', | 402 isSetter ? 'topType' : 'returnType', |
| 399 new _InstrumentationValueForType( | 403 new _InstrumentationValueForType( |
| 400 node.element.returnType, elementNamer)); | 404 node.element.returnType, elementNamer)); |
| 401 } | 405 } |
| 402 var parameters = node.functionExpression.parameters; | 406 var parameters = node.functionExpression.parameters; |
| 403 for (var parameter in parameters.parameters) { | 407 for (var parameter in parameters.parameters) { |
| 404 // Note: it's tempting to check `parameter.type == null`, but that | 408 // Note: it's tempting to check `parameter.type == null`, but that |
| 405 // doesn't work because of function-typed formal parameter syntax. | 409 // doesn't work because of function-typed formal parameter syntax. |
| 406 if (parameter.element.hasImplicitType) { | 410 if (parameter.element.hasImplicitType) { |
| 407 _recordType(parameter.identifier.offset, parameter.element.type); | 411 _recordType(parameter.identifier.offset, parameter.element.type); |
| 408 } | 412 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 DartType type = node.staticType; | 493 DartType type = node.staticType; |
| 490 if (type is InterfaceType) { | 494 if (type is InterfaceType) { |
| 491 _recordTypeArguments(node.offset, type.typeArguments); | 495 _recordTypeArguments(node.offset, type.typeArguments); |
| 492 } | 496 } |
| 493 } | 497 } |
| 494 } | 498 } |
| 495 | 499 |
| 496 @override | 500 @override |
| 497 visitMethodDeclaration(MethodDeclaration node) { | 501 visitMethodDeclaration(MethodDeclaration node) { |
| 498 super.visitMethodDeclaration(node); | 502 super.visitMethodDeclaration(node); |
| 503 if (node.returnType == null) { |
| 504 _recordTopType(node.name.offset, node.element.returnType); |
| 505 } |
| 499 if (node.element.enclosingElement is ClassElement && !node.isStatic) { | 506 if (node.element.enclosingElement is ClassElement && !node.isStatic) { |
| 500 if (node.returnType == null) { | |
| 501 _recordTopType(node.name.offset, node.element.returnType); | |
| 502 } | |
| 503 if (node.parameters != null) { | 507 if (node.parameters != null) { |
| 504 for (var parameter in node.parameters.parameters) { | 508 for (var parameter in node.parameters.parameters) { |
| 505 // Note: it's tempting to check `parameter.type == null`, but that | 509 // Note: it's tempting to check `parameter.type == null`, but that |
| 506 // doesn't work because of function-typed formal parameter syntax. | 510 // doesn't work because of function-typed formal parameter syntax. |
| 507 if (parameter.element.hasImplicitType) { | 511 if (parameter.element.hasImplicitType) { |
| 508 _recordTopType(parameter.identifier.offset, parameter.element.type); | 512 _recordTopType(parameter.identifier.offset, parameter.element.type); |
| 509 } | 513 } |
| 510 } | 514 } |
| 511 } | 515 } |
| 512 } | 516 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 637 | 641 |
| 638 /// Based on DDC code generator's `_recoverTypeArguments` | 642 /// Based on DDC code generator's `_recoverTypeArguments` |
| 639 Iterable<DartType> _recoverTypeArguments(FunctionType g, FunctionType f) { | 643 Iterable<DartType> _recoverTypeArguments(FunctionType g, FunctionType f) { |
| 640 assert(identical(g.element, f.element)); | 644 assert(identical(g.element, f.element)); |
| 641 assert(g.typeFormals.isNotEmpty && f.typeFormals.isEmpty); | 645 assert(g.typeFormals.isNotEmpty && f.typeFormals.isEmpty); |
| 642 assert(g.typeFormals.length + g.typeArguments.length == | 646 assert(g.typeFormals.length + g.typeArguments.length == |
| 643 f.typeArguments.length); | 647 f.typeArguments.length); |
| 644 return f.typeArguments.skip(g.typeArguments.length); | 648 return f.typeArguments.skip(g.typeArguments.length); |
| 645 } | 649 } |
| 646 } | 650 } |
| OLD | NEW |