| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 services.src.correction.util; | 5 library services.src.correction.util; |
| 6 | 6 |
| 7 import 'dart:math'; | 7 import 'dart:math'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/protocol/protocol.dart' | 9 import 'package:analysis_server/plugin/protocol/protocol.dart' |
| 10 show SourceChange, SourceEdit; | 10 show SourceChange, SourceEdit; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 import 'package:analyzer/src/dart/scanner/scanner.dart'; | 22 import 'package:analyzer/src/dart/scanner/scanner.dart'; |
| 23 import 'package:analyzer/src/generated/engine.dart'; | 23 import 'package:analyzer/src/generated/engine.dart'; |
| 24 import 'package:analyzer/src/generated/resolver.dart'; | 24 import 'package:analyzer/src/generated/resolver.dart'; |
| 25 import 'package:analyzer/src/generated/source.dart'; | 25 import 'package:analyzer/src/generated/source.dart'; |
| 26 import 'package:path/path.dart'; | 26 import 'package:path/path.dart'; |
| 27 | 27 |
| 28 /** | 28 /** |
| 29 * Adds edits to the given [change] that ensure that all the [libraries] are | 29 * Adds edits to the given [change] that ensure that all the [libraries] are |
| 30 * imported into the given [targetLibrary]. | 30 * imported into the given [targetLibrary]. |
| 31 */ | 31 */ |
| 32 void addLibraryImports(SourceChange change, LibraryElement targetLibrary, | 32 void addLibraryImports( |
| 33 Set<LibraryElement> libraries) { | 33 SourceChange change, LibraryElement targetLibrary, Set<Source> libraries) { |
| 34 CorrectionUtils libUtils; | 34 CorrectionUtils libUtils; |
| 35 try { | 35 try { |
| 36 CompilationUnitElement unitElement = targetLibrary.definingCompilationUnit; | 36 CompilationUnitElement unitElement = targetLibrary.definingCompilationUnit; |
| 37 CompilationUnit unitAst = getParsedUnit(unitElement); | 37 CompilationUnit unitAst = getParsedUnit(unitElement); |
| 38 libUtils = new CorrectionUtils(unitAst); | 38 libUtils = new CorrectionUtils(unitAst); |
| 39 } catch (e) { | 39 } catch (e) { |
| 40 throw new CancelCorrectionException(exception: e); | 40 throw new CancelCorrectionException(exception: e); |
| 41 } | 41 } |
| 42 String eol = libUtils.endOfLine; | 42 String eol = libUtils.endOfLine; |
| 43 // Prepare information about existing imports. | 43 // Prepare information about existing imports. |
| 44 LibraryDirective libraryDirective; | 44 LibraryDirective libraryDirective; |
| 45 List<_ImportDirectiveInfo> importDirectives = <_ImportDirectiveInfo>[]; | 45 List<_ImportDirectiveInfo> importDirectives = <_ImportDirectiveInfo>[]; |
| 46 for (Directive directive in libUtils.unit.directives) { | 46 for (Directive directive in libUtils.unit.directives) { |
| 47 if (directive is LibraryDirective) { | 47 if (directive is LibraryDirective) { |
| 48 libraryDirective = directive; | 48 libraryDirective = directive; |
| 49 } else if (directive is ImportDirective) { | 49 } else if (directive is ImportDirective) { |
| 50 importDirectives.add(new _ImportDirectiveInfo( | 50 importDirectives.add(new _ImportDirectiveInfo( |
| 51 directive.uriContent, directive.offset, directive.end)); | 51 directive.uriContent, directive.offset, directive.end)); |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 // Prepare all URIs to import. | 55 // Prepare all URIs to import. |
| 56 List<String> uriList = libraries | 56 List<String> uriList = libraries |
| 57 .map((library) => getLibrarySourceUri(targetLibrary, library.source)) | 57 .map((library) => getLibrarySourceUri(targetLibrary, library)) |
| 58 .toList(); | 58 .toList(); |
| 59 uriList.sort((a, b) => a.compareTo(b)); | 59 uriList.sort((a, b) => a.compareTo(b)); |
| 60 | 60 |
| 61 // Insert imports: between existing imports. | 61 // Insert imports: between existing imports. |
| 62 if (importDirectives.isNotEmpty) { | 62 if (importDirectives.isNotEmpty) { |
| 63 bool isFirstPackage = true; | 63 bool isFirstPackage = true; |
| 64 for (String importUri in uriList) { | 64 for (String importUri in uriList) { |
| 65 bool inserted = false; | 65 bool inserted = false; |
| 66 bool isPackage = importUri.startsWith('package:'); | 66 bool isPackage = importUri.startsWith('package:'); |
| 67 bool isAfterDart = false; | 67 bool isAfterDart = false; |
| (...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 Map<String, Element> getImportNamespace(ImportElement imp) { | 360 Map<String, Element> getImportNamespace(ImportElement imp) { |
| 361 NamespaceBuilder builder = new NamespaceBuilder(); | 361 NamespaceBuilder builder = new NamespaceBuilder(); |
| 362 Namespace namespace = builder.createImportNamespaceForDirective(imp); | 362 Namespace namespace = builder.createImportNamespaceForDirective(imp); |
| 363 return namespace.definedNames; | 363 return namespace.definedNames; |
| 364 } | 364 } |
| 365 | 365 |
| 366 /** | 366 /** |
| 367 * Computes the best URI to import [what] into [from]. | 367 * Computes the best URI to import [what] into [from]. |
| 368 */ | 368 */ |
| 369 String getLibrarySourceUri(LibraryElement from, Source what) { | 369 String getLibrarySourceUri(LibraryElement from, Source what) { |
| 370 String whatFile = what.fullName; | 370 String whatPath = what.fullName; |
| 371 // check if an absolute URI (such as 'dart:' or 'package:') | 371 // check if an absolute URI (such as 'dart:' or 'package:') |
| 372 Uri whatUri = what.uri; | 372 Uri whatUri = what.uri; |
| 373 String whatUriScheme = whatUri.scheme; | 373 String whatUriScheme = whatUri.scheme; |
| 374 if (whatUriScheme != '' && whatUriScheme != 'file') { | 374 if (whatUriScheme != '' && whatUriScheme != 'file') { |
| 375 return whatUri.toString(); | 375 return whatUri.toString(); |
| 376 } | 376 } |
| 377 // compute a relative URI | 377 // compute a relative URI |
| 378 String fromFolder = dirname(from.source.fullName); | 378 String fromFolder = dirname(from.source.fullName); |
| 379 String relativeFile = relative(whatFile, from: fromFolder); | 379 String relativeFile = relative(whatPath, from: fromFolder); |
| 380 return split(relativeFile).join('/'); | 380 return split(relativeFile).join('/'); |
| 381 } | 381 } |
| 382 | 382 |
| 383 /** | 383 /** |
| 384 * Returns the line prefix from the given source, i.e. basically just a | 384 * Returns the line prefix from the given source, i.e. basically just a |
| 385 * whitespace prefix of the given [String]. | 385 * whitespace prefix of the given [String]. |
| 386 */ | 386 */ |
| 387 String getLinePrefix(String line) { | 387 String getLinePrefix(String line) { |
| 388 int index = 0; | 388 int index = 0; |
| 389 while (index < line.length) { | 389 while (index < line.length) { |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 758 return visitor.names; | 758 return visitor.names; |
| 759 } | 759 } |
| 760 return conflicts; | 760 return conflicts; |
| 761 } | 761 } |
| 762 | 762 |
| 763 /** | 763 /** |
| 764 * Returns the actual type source of the given [Expression], may be `null` | 764 * Returns the actual type source of the given [Expression], may be `null` |
| 765 * if can not be resolved, should be treated as the `dynamic` type. | 765 * if can not be resolved, should be treated as the `dynamic` type. |
| 766 */ | 766 */ |
| 767 String getExpressionTypeSource( | 767 String getExpressionTypeSource( |
| 768 Expression expression, Set<LibraryElement> librariesToImport) { | 768 Expression expression, Set<Source> librariesToImport) { |
| 769 if (expression == null) { | 769 if (expression == null) { |
| 770 return null; | 770 return null; |
| 771 } | 771 } |
| 772 DartType type = expression.bestType; | 772 DartType type = expression.bestType; |
| 773 if (type.isDynamic) { | 773 if (type.isDynamic) { |
| 774 return null; | 774 return null; |
| 775 } | 775 } |
| 776 return getTypeSource(type, librariesToImport); | 776 return getTypeSource(type, librariesToImport); |
| 777 } | 777 } |
| 778 | 778 |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 * Returns the text of the given [AstNode] in the unit. | 1047 * Returns the text of the given [AstNode] in the unit. |
| 1048 */ | 1048 */ |
| 1049 String getNodeText(AstNode node) { | 1049 String getNodeText(AstNode node) { |
| 1050 return getText(node.offset, node.length); | 1050 return getText(node.offset, node.length); |
| 1051 } | 1051 } |
| 1052 | 1052 |
| 1053 /** | 1053 /** |
| 1054 * @return the source for the parameter with the given type and name. | 1054 * @return the source for the parameter with the given type and name. |
| 1055 */ | 1055 */ |
| 1056 String getParameterSource( | 1056 String getParameterSource( |
| 1057 DartType type, String name, Set<LibraryElement> librariesToImport) { | 1057 DartType type, String name, Set<Source> librariesToImport) { |
| 1058 // no type | 1058 // no type |
| 1059 if (type == null || type.isDynamic) { | 1059 if (type == null || type.isDynamic) { |
| 1060 return name; | 1060 return name; |
| 1061 } | 1061 } |
| 1062 // function type | 1062 // function type |
| 1063 if (type is FunctionType && type.element.isSynthetic) { | 1063 if (type is FunctionType && type.element.isSynthetic) { |
| 1064 FunctionType functionType = type; | 1064 FunctionType functionType = type; |
| 1065 StringBuffer sb = new StringBuffer(); | 1065 StringBuffer sb = new StringBuffer(); |
| 1066 // return type | 1066 // return type |
| 1067 DartType returnType = functionType.returnType; | 1067 DartType returnType = functionType.returnType; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1114 String getText(int offset, int length) { | 1114 String getText(int offset, int length) { |
| 1115 return _buffer.substring(offset, offset + length); | 1115 return _buffer.substring(offset, offset + length); |
| 1116 } | 1116 } |
| 1117 | 1117 |
| 1118 /** | 1118 /** |
| 1119 * Returns the source to reference [type] in this [CompilationUnit]. | 1119 * Returns the source to reference [type] in this [CompilationUnit]. |
| 1120 * | 1120 * |
| 1121 * Fills [librariesToImport] with [LibraryElement]s whose elements are | 1121 * Fills [librariesToImport] with [LibraryElement]s whose elements are |
| 1122 * used by the generated source, but not imported. | 1122 * used by the generated source, but not imported. |
| 1123 */ | 1123 */ |
| 1124 String getTypeSource(DartType type, Set<LibraryElement> librariesToImport, | 1124 String getTypeSource(DartType type, Set<Source> librariesToImport, |
| 1125 {StringBuffer parametersBuffer}) { | 1125 {StringBuffer parametersBuffer}) { |
| 1126 StringBuffer sb = new StringBuffer(); | 1126 StringBuffer sb = new StringBuffer(); |
| 1127 // type parameter | 1127 // type parameter |
| 1128 if (!_isTypeVisible(type)) { | 1128 if (!_isTypeVisible(type)) { |
| 1129 return 'dynamic'; | 1129 return 'dynamic'; |
| 1130 } | 1130 } |
| 1131 // just a Function, not FunctionTypeAliasElement | 1131 // just a Function, not FunctionTypeAliasElement |
| 1132 if (type is FunctionType && type.element is! FunctionTypeAliasElement) { | 1132 if (type is FunctionType && type.element is! FunctionTypeAliasElement) { |
| 1133 if (parametersBuffer == null) { | 1133 if (parametersBuffer == null) { |
| 1134 return "Function"; | 1134 return "Function"; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1166 return null; | 1166 return null; |
| 1167 } | 1167 } |
| 1168 // ensure import | 1168 // ensure import |
| 1169 ImportElement importElement = _getImportElement(element); | 1169 ImportElement importElement = _getImportElement(element); |
| 1170 if (importElement != null) { | 1170 if (importElement != null) { |
| 1171 if (importElement.prefix != null) { | 1171 if (importElement.prefix != null) { |
| 1172 sb.write(importElement.prefix.displayName); | 1172 sb.write(importElement.prefix.displayName); |
| 1173 sb.write("."); | 1173 sb.write("."); |
| 1174 } | 1174 } |
| 1175 } else { | 1175 } else { |
| 1176 librariesToImport.add(library); | 1176 librariesToImport.add(library.source); |
| 1177 } | 1177 } |
| 1178 } | 1178 } |
| 1179 // append simple name | 1179 // append simple name |
| 1180 String name = element.displayName; | 1180 String name = element.displayName; |
| 1181 sb.write(name); | 1181 sb.write(name); |
| 1182 // may be type arguments | 1182 // may be type arguments |
| 1183 if (type is ParameterizedType) { | 1183 if (type is ParameterizedType) { |
| 1184 List<DartType> arguments = type.typeArguments; | 1184 List<DartType> arguments = type.typeArguments; |
| 1185 // check if has arguments | 1185 // check if has arguments |
| 1186 bool hasArguments = false; | 1186 bool hasArguments = false; |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1661 _InvertedCondition expr, int newOperatorPrecedence) { | 1661 _InvertedCondition expr, int newOperatorPrecedence) { |
| 1662 if (expr._precedence < newOperatorPrecedence) { | 1662 if (expr._precedence < newOperatorPrecedence) { |
| 1663 return "(${expr._source})"; | 1663 return "(${expr._source})"; |
| 1664 } | 1664 } |
| 1665 return expr._source; | 1665 return expr._source; |
| 1666 } | 1666 } |
| 1667 | 1667 |
| 1668 static _InvertedCondition _simple(String source) => | 1668 static _InvertedCondition _simple(String source) => |
| 1669 new _InvertedCondition(2147483647, source); | 1669 new _InvertedCondition(2147483647, source); |
| 1670 } | 1670 } |
| OLD | NEW |