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'; |
(...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 {bool addSupertypeProposals: false, | 479 {bool addSupertypeProposals: false, |
480 String groupName, | 480 String groupName, |
481 ExecutableElement methodBeingCopied, | 481 ExecutableElement methodBeingCopied, |
482 bool required: false}) { | 482 bool required: false}) { |
483 if (type != null && !type.isDynamic) { | 483 if (type != null && !type.isDynamic) { |
484 _EnclosingElementFinder finder = new _EnclosingElementFinder(); | 484 _EnclosingElementFinder finder = new _EnclosingElementFinder(); |
485 finder.find(dartFileEditBuilder.unit, offset); | 485 finder.find(dartFileEditBuilder.unit, offset); |
486 String typeSource = _getTypeSource( | 486 String typeSource = _getTypeSource( |
487 type, finder.enclosingClass, finder.enclosingExecutable, | 487 type, finder.enclosingClass, finder.enclosingExecutable, |
488 methodBeingCopied: methodBeingCopied); | 488 methodBeingCopied: methodBeingCopied); |
489 if (typeSource != 'dynamic') { | 489 if (typeSource.isNotEmpty && typeSource != 'dynamic') { |
490 if (groupName != null) { | 490 if (groupName != null) { |
491 addLinkedEdit(groupName, (LinkedEditBuilder builder) { | 491 addLinkedEdit(groupName, (LinkedEditBuilder builder) { |
492 write(typeSource); | 492 write(typeSource); |
493 if (addSupertypeProposals) { | 493 if (addSupertypeProposals) { |
494 _addSuperTypeProposals(builder, type, new Set<DartType>()); | 494 _addSuperTypeProposals(builder, type, new Set<DartType>()); |
495 } | 495 } |
496 }); | 496 }); |
497 } else { | 497 } else { |
498 write(typeSource); | 498 write(typeSource); |
499 } | 499 } |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
950 if (type is TypeParameterType) { | 950 if (type is TypeParameterType) { |
951 TypeParameterElement parameterElement = type.element; | 951 TypeParameterElement parameterElement = type.element; |
952 Element parameterParent = parameterElement.enclosingElement; | 952 Element parameterParent = parameterElement.enclosingElement; |
953 // TODO(brianwilkerson) This needs to compare the parameterParent with | 953 // TODO(brianwilkerson) This needs to compare the parameterParent with |
954 // each of the parents of the enclosingElement. (That means that we only | 954 // each of the parents of the enclosingElement. (That means that we only |
955 // need the most closely enclosing element.) | 955 // need the most closely enclosing element.) |
956 return parameterParent == enclosingExecutable || | 956 return parameterParent == enclosingExecutable || |
957 parameterParent == enclosingClass || | 957 parameterParent == enclosingClass || |
958 parameterParent == methodBeingCopied; | 958 parameterParent == methodBeingCopied; |
959 } | 959 } |
| 960 Element element = type.element; |
| 961 if (element == null) { |
| 962 return true; |
| 963 } |
| 964 LibraryElement definingLibrary = element.library; |
| 965 LibraryElement importingLibrary = dartFileEditBuilder.unit.element.library; |
| 966 if (definingLibrary != null && definingLibrary != importingLibrary) { |
| 967 if (element.isPrivate) { |
| 968 return false; |
| 969 } |
| 970 } |
960 return true; | 971 return true; |
961 } | 972 } |
962 } | 973 } |
963 | 974 |
964 /** | 975 /** |
965 * A [FileEditBuilder] used to build edits for Dart files. | 976 * A [FileEditBuilder] used to build edits for Dart files. |
966 */ | 977 */ |
967 class DartFileEditBuilderImpl extends FileEditBuilderImpl | 978 class DartFileEditBuilderImpl extends FileEditBuilderImpl |
968 implements DartFileEditBuilder { | 979 implements DartFileEditBuilder { |
969 /** | 980 /** |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1008 _replaceReturnTypeWithFuture(body, typeProvider); | 1019 _replaceReturnTypeWithFuture(body, typeProvider); |
1009 } | 1020 } |
1010 | 1021 |
1011 @override | 1022 @override |
1012 DartEditBuilderImpl createEditBuilder(int offset, int length) { | 1023 DartEditBuilderImpl createEditBuilder(int offset, int length) { |
1013 return new DartEditBuilderImpl(this, offset, length); | 1024 return new DartEditBuilderImpl(this, offset, length); |
1014 } | 1025 } |
1015 | 1026 |
1016 @override | 1027 @override |
1017 void finalize() { | 1028 void finalize() { |
1018 _addLibraryImports( | 1029 CompilationUnitElement unitElement = unit.element; |
1019 changeBuilder.sourceChange, unit.element.library, librariesToImport); | 1030 LibraryElement libraryElement = unitElement.library; |
| 1031 CompilationUnitElement definingUnitElement = |
| 1032 libraryElement.definingCompilationUnit; |
| 1033 if (definingUnitElement == unitElement) { |
| 1034 _addLibraryImports(libraryElement, librariesToImport); |
| 1035 } else { |
| 1036 (changeBuilder as DartChangeBuilder).addFileEdit( |
| 1037 definingUnitElement.source.fullName, (DartFileEditBuilder builder) { |
| 1038 (builder as DartFileEditBuilderImpl) |
| 1039 ._addLibraryImports(libraryElement, librariesToImport); |
| 1040 }); |
| 1041 } |
1020 } | 1042 } |
1021 | 1043 |
1022 @override | 1044 @override |
1023 void importLibraries(Iterable<Source> libraries) { | 1045 void importLibraries(Iterable<Source> libraries) { |
1024 librariesToImport.addAll(libraries); | 1046 librariesToImport.addAll(libraries); |
1025 } | 1047 } |
1026 | 1048 |
1027 @override | 1049 @override |
1028 void replaceTypeWithFuture( | 1050 void replaceTypeWithFuture( |
1029 TypeAnnotation typeAnnotation, TypeProvider typeProvider) { | 1051 TypeAnnotation typeAnnotation, TypeProvider typeProvider) { |
(...skipping 14 matching lines...) Expand all Loading... |
1044 } | 1066 } |
1045 // prepare code for the types | 1067 // prepare code for the types |
1046 addReplacement(range.node(typeAnnotation), (EditBuilder builder) { | 1068 addReplacement(range.node(typeAnnotation), (EditBuilder builder) { |
1047 if (!(builder as DartEditBuilder).writeType(futureType)) { | 1069 if (!(builder as DartEditBuilder).writeType(futureType)) { |
1048 builder.write('void'); | 1070 builder.write('void'); |
1049 } | 1071 } |
1050 }); | 1072 }); |
1051 } | 1073 } |
1052 | 1074 |
1053 /** | 1075 /** |
1054 * Adds edits to the given [change] that ensure that all the [libraries] are | 1076 * Adds edits ensure that all the [libraries] are imported into the given |
1055 * imported into the given [targetLibrary]. | 1077 * [targetLibrary]. |
1056 */ | 1078 */ |
1057 void _addLibraryImports(SourceChange change, LibraryElement targetLibrary, | 1079 void _addLibraryImports(LibraryElement targetLibrary, Set<Source> libraries) { |
1058 Set<Source> libraries) { | |
1059 // Prepare information about existing imports. | 1080 // Prepare information about existing imports. |
1060 LibraryDirective libraryDirective; | 1081 LibraryDirective libraryDirective; |
1061 List<ImportDirective> importDirectives = <ImportDirective>[]; | 1082 List<ImportDirective> importDirectives = <ImportDirective>[]; |
1062 for (Directive directive in unit.directives) { | 1083 for (Directive directive in unit.directives) { |
1063 if (directive is LibraryDirective) { | 1084 if (directive is LibraryDirective) { |
1064 libraryDirective = directive; | 1085 libraryDirective = directive; |
1065 } else if (directive is ImportDirective) { | 1086 } else if (directive is ImportDirective) { |
1066 importDirectives.add(directive); | 1087 importDirectives.add(directive); |
1067 } | 1088 } |
1068 } | 1089 } |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1366 } | 1387 } |
1367 } | 1388 } |
1368 | 1389 |
1369 class _InsertionDescription { | 1390 class _InsertionDescription { |
1370 final int offset; | 1391 final int offset; |
1371 final bool insertEmptyLineBefore; | 1392 final bool insertEmptyLineBefore; |
1372 final bool insertEmptyLineAfter; | 1393 final bool insertEmptyLineAfter; |
1373 _InsertionDescription( | 1394 _InsertionDescription( |
1374 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter); | 1395 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter); |
1375 } | 1396 } |
OLD | NEW |