| 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 | 6 |
| 7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
| 8 import 'package:analyzer/dart/ast/token.dart'; | 8 import 'package:analyzer/dart/ast/token.dart'; |
| 9 import 'package:analyzer/dart/element/element.dart'; | 9 import 'package:analyzer/dart/element/element.dart'; |
| 10 import 'package:analyzer/dart/element/type.dart'; | 10 import 'package:analyzer/dart/element/type.dart'; |
| 11 import 'package:analyzer/src/dart/analysis/driver.dart'; | 11 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 12 import 'package:analyzer/src/dart/ast/utilities.dart'; | 12 import 'package:analyzer/src/dart/ast/utilities.dart'; |
| 13 import 'package:analyzer/src/dart/element/type.dart'; |
| 13 import 'package:analyzer/src/generated/resolver.dart'; | 14 import 'package:analyzer/src/generated/resolver.dart'; |
| 14 import 'package:analyzer/src/generated/source.dart'; | 15 import 'package:analyzer/src/generated/source.dart'; |
| 15 import 'package:analyzer/src/generated/utilities_dart.dart'; | 16 import 'package:analyzer/src/generated/utilities_dart.dart'; |
| 16 import 'package:analyzer_plugin/protocol/protocol_common.dart' | 17 import 'package:analyzer_plugin/protocol/protocol_common.dart' |
| 17 hide Element, ElementKind; | 18 hide Element, ElementKind; |
| 18 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core
.dart'; | 19 import 'package:analyzer_plugin/src/utilities/change_builder/change_builder_core
.dart'; |
| 19 import 'package:analyzer_plugin/src/utilities/string_utilities.dart'; | 20 import 'package:analyzer_plugin/src/utilities/string_utilities.dart'; |
| 20 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dar
t'; | 21 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dar
t'; |
| 21 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dar
t'; | 22 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dar
t'; |
| 22 import 'package:analyzer_plugin/utilities/range_factory.dart'; | 23 import 'package:analyzer_plugin/utilities/range_factory.dart'; |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 write(prefix); | 366 write(prefix); |
| 366 writeln('}'); | 367 writeln('}'); |
| 367 } | 368 } |
| 368 } | 369 } |
| 369 | 370 |
| 370 @override | 371 @override |
| 371 void writeParameterMatchingArgument( | 372 void writeParameterMatchingArgument( |
| 372 Expression argument, int index, Set<String> usedNames) { | 373 Expression argument, int index, Set<String> usedNames) { |
| 373 // append type name | 374 // append type name |
| 374 DartType type = argument.bestType; | 375 DartType type = argument.bestType; |
| 376 if (type == null || type.isBottom || type.isDartCoreNull) { |
| 377 type = DynamicTypeImpl.instance; |
| 378 } |
| 375 if (writeType(type, addSupertypeProposals: true, groupName: 'TYPE$index')) { | 379 if (writeType(type, addSupertypeProposals: true, groupName: 'TYPE$index')) { |
| 376 write(' '); | 380 write(' '); |
| 377 } | 381 } |
| 378 // append parameter name | 382 // append parameter name |
| 379 if (argument is NamedExpression) { | 383 if (argument is NamedExpression) { |
| 380 write(argument.name.label.name); | 384 write(argument.name.label.name); |
| 381 } else { | 385 } else { |
| 382 List<String> suggestions = | 386 List<String> suggestions = |
| 383 _getParameterNameSuggestions(usedNames, type, argument, index); | 387 _getParameterNameSuggestions(usedNames, type, argument, index); |
| 384 String favorite = suggestions[0]; | 388 String favorite = suggestions[0]; |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 result.add(name); | 590 result.add(name); |
| 587 break; | 591 break; |
| 588 } | 592 } |
| 589 // next character | 593 // next character |
| 590 c = c + 1; | 594 c = c + 1; |
| 591 } | 595 } |
| 592 } | 596 } |
| 593 | 597 |
| 594 void _addSuperTypeProposals( | 598 void _addSuperTypeProposals( |
| 595 LinkedEditBuilder builder, DartType type, Set<DartType> alreadyAdded) { | 599 LinkedEditBuilder builder, DartType type, Set<DartType> alreadyAdded) { |
| 596 if (type != null && | 600 if (type is InterfaceType && alreadyAdded.add(type)) { |
| 597 type.element is ClassElement && | 601 builder.addSuggestion(LinkedEditSuggestionKind.TYPE, type.displayName); |
| 598 alreadyAdded.add(type)) { | 602 _addSuperTypeProposals(builder, type.superclass, alreadyAdded); |
| 599 ClassElement element = type.element as ClassElement; | 603 for (InterfaceType interfaceType in type.interfaces) { |
| 600 builder.addSuggestion(LinkedEditSuggestionKind.TYPE, element.name); | |
| 601 _addSuperTypeProposals(builder, element.supertype, alreadyAdded); | |
| 602 for (InterfaceType interfaceType in element.interfaces) { | |
| 603 _addSuperTypeProposals(builder, interfaceType, alreadyAdded); | 604 _addSuperTypeProposals(builder, interfaceType, alreadyAdded); |
| 604 } | 605 } |
| 605 } | 606 } |
| 606 } | 607 } |
| 607 | 608 |
| 608 String _getBaseNameFromExpression(Expression expression) { | 609 String _getBaseNameFromExpression(Expression expression) { |
| 609 String name = null; | 610 String name = null; |
| 610 // e as Type | 611 // e as Type |
| 611 if (expression is AsExpression) { | 612 if (expression is AsExpression) { |
| 612 AsExpression asExpression = expression as AsExpression; | 613 AsExpression asExpression = expression as AsExpression; |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 789 methodBeingCopied: methodBeingCopied); | 790 methodBeingCopied: methodBeingCopied); |
| 790 if (typeSource.isNotEmpty) { | 791 if (typeSource.isNotEmpty) { |
| 791 return '$typeSource $name'; | 792 return '$typeSource $name'; |
| 792 } | 793 } |
| 793 return name; | 794 return name; |
| 794 } | 795 } |
| 795 | 796 |
| 796 /** | 797 /** |
| 797 * Returns the source to reference [type] in this [CompilationUnit]. | 798 * Returns the source to reference [type] in this [CompilationUnit]. |
| 798 * | 799 * |
| 799 * Fills [librariesToImport] with [LibraryElement]s whose elements are | 800 * Causes any libraries whose elements are used by the generated source, to be |
| 800 * used by the generated source, but not imported. | 801 * imported. |
| 801 */ | 802 */ |
| 802 String _getTypeSource(DartType type, ClassElement enclosingClass, | 803 String _getTypeSource(DartType type, ClassElement enclosingClass, |
| 803 ExecutableElement enclosingExecutable, | 804 ExecutableElement enclosingExecutable, |
| 804 {ExecutableElement methodBeingCopied, StringBuffer parametersBuffer}) { | 805 {ExecutableElement methodBeingCopied, StringBuffer parametersBuffer}) { |
| 805 StringBuffer buffer = new StringBuffer(); | 806 StringBuffer buffer = new StringBuffer(); |
| 806 // type parameter | 807 // type parameter |
| 807 if (!_isTypeVisible(type, enclosingClass, enclosingExecutable, | 808 if (!_isTypeVisible(type, enclosingClass, enclosingExecutable, |
| 808 methodBeingCopied: methodBeingCopied)) { | 809 methodBeingCopied: methodBeingCopied)) { |
| 809 return 'dynamic'; | 810 return 'dynamic'; |
| 810 } | 811 } |
| (...skipping 530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1341 } | 1342 } |
| 1342 } | 1343 } |
| 1343 | 1344 |
| 1344 class _InsertionDescription { | 1345 class _InsertionDescription { |
| 1345 final int offset; | 1346 final int offset; |
| 1346 final bool insertEmptyLineBefore; | 1347 final bool insertEmptyLineBefore; |
| 1347 final bool insertEmptyLineAfter; | 1348 final bool insertEmptyLineAfter; |
| 1348 _InsertionDescription( | 1349 _InsertionDescription( |
| 1349 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter); | 1350 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter); |
| 1350 } | 1351 } |
| OLD | NEW |