| 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 // This code was auto-generated, is not intended to be edited, and is subject to | 5 // This code was auto-generated, is not intended to be edited, and is subject to |
| 6 // significant change. Please see the README file for more information. | 6 // significant change. Please see the README file for more information. |
| 7 | 7 |
| 8 library services.src.correction.util; | 8 library services.src.correction.util; |
| 9 | 9 |
| 10 import 'package:analysis_services/src/correction/source_range.dart'; | 10 import 'package:analysis_services/src/correction/source_range.dart'; |
| 11 import 'package:analysis_services/src/correction/strings.dart'; | 11 import 'package:analysis_services/src/correction/strings.dart'; |
| 12 import 'package:analyzer/src/generated/ast.dart'; | 12 import 'package:analyzer/src/generated/ast.dart'; |
| 13 import 'package:analyzer/src/generated/element.dart'; | 13 import 'package:analyzer/src/generated/element.dart'; |
| 14 import 'package:analyzer/src/generated/engine.dart'; |
| 14 import 'package:analyzer/src/generated/resolver.dart'; | 15 import 'package:analyzer/src/generated/resolver.dart'; |
| 15 import 'package:analyzer/src/generated/source.dart'; | 16 import 'package:analyzer/src/generated/source.dart'; |
| 16 | 17 |
| 17 | 18 |
| 18 String getDefaultValueCode(DartType type) { | 19 String getDefaultValueCode(DartType type) { |
| 19 if (type != null) { | 20 if (type != null) { |
| 20 String typeName = type.displayName; | 21 String typeName = type.displayName; |
| 21 if (typeName == "bool") { | 22 if (typeName == "bool") { |
| 22 return "false"; | 23 return "false"; |
| 23 } | 24 } |
| 24 if (typeName == "int") { | 25 if (typeName == "int") { |
| 25 return "0"; | 26 return "0"; |
| 26 } | 27 } |
| 27 if (typeName == "double") { | 28 if (typeName == "double") { |
| 28 return "0.0"; | 29 return "0.0"; |
| 29 } | 30 } |
| 30 if (typeName == "String") { | 31 if (typeName == "String") { |
| 31 return "''"; | 32 return "''"; |
| 32 } | 33 } |
| 33 } | 34 } |
| 34 // no better guess | 35 // no better guess |
| 35 return "null"; | 36 return "null"; |
| 36 } | 37 } |
| 37 | 38 |
| 38 | 39 |
| 39 /** | 40 /** |
| 41 * @return the [ExecutableElement] of the enclosing executable [AstNode]. |
| 42 */ |
| 43 ExecutableElement getEnclosingExecutableElement(AstNode node) { |
| 44 while (node != null) { |
| 45 if (node is FunctionDeclaration) { |
| 46 return node.element; |
| 47 } |
| 48 if (node is ConstructorDeclaration) { |
| 49 return node.element; |
| 50 } |
| 51 if (node is MethodDeclaration) { |
| 52 return node.element; |
| 53 } |
| 54 node = node.parent; |
| 55 } |
| 56 return null; |
| 57 } |
| 58 |
| 59 |
| 60 /** |
| 40 * Returns [getExpressionPrecedence] for the parent of [node], | 61 * Returns [getExpressionPrecedence] for the parent of [node], |
| 41 * or `0` if the parent node is [ParenthesizedExpression]. | 62 * or `0` if the parent node is [ParenthesizedExpression]. |
| 42 * | 63 * |
| 43 * The reason is that `(expr)` is always executed after `expr`. | 64 * The reason is that `(expr)` is always executed after `expr`. |
| 44 */ | 65 */ |
| 45 int getExpressionParentPrecedence(AstNode node) { | 66 int getExpressionParentPrecedence(AstNode node) { |
| 46 AstNode parent = node.parent; | 67 AstNode parent = node.parent; |
| 47 if (parent is ParenthesizedExpression) { | 68 if (parent is ParenthesizedExpression) { |
| 48 return 0; | 69 return 0; |
| 49 } | 70 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 64 | 85 |
| 65 /** | 86 /** |
| 66 * Returns the namespace of the given [ImportElement]. | 87 * Returns the namespace of the given [ImportElement]. |
| 67 */ | 88 */ |
| 68 Map<String, Element> getImportNamespace(ImportElement imp) { | 89 Map<String, Element> getImportNamespace(ImportElement imp) { |
| 69 NamespaceBuilder builder = new NamespaceBuilder(); | 90 NamespaceBuilder builder = new NamespaceBuilder(); |
| 70 Namespace namespace = builder.createImportNamespaceForDirective(imp); | 91 Namespace namespace = builder.createImportNamespaceForDirective(imp); |
| 71 return namespace.definedNames; | 92 return namespace.definedNames; |
| 72 } | 93 } |
| 73 | 94 |
| 95 /** |
| 96 * If given [AstNode] is name of qualified property extraction, returns target f
rom which |
| 97 * this property is extracted. Otherwise `null`. |
| 98 */ |
| 99 Expression getQualifiedPropertyTarget(AstNode node) { |
| 100 AstNode parent = node.parent; |
| 101 if (parent is PrefixedIdentifier) { |
| 102 PrefixedIdentifier prefixed = parent; |
| 103 if (identical(prefixed.identifier, node)) { |
| 104 return parent.prefix; |
| 105 } |
| 106 } |
| 107 if (parent is PropertyAccess) { |
| 108 PropertyAccess access = parent; |
| 109 if (identical(access.propertyName, node)) { |
| 110 return access.realTarget; |
| 111 } |
| 112 } |
| 113 return null; |
| 114 } |
| 115 |
| 116 |
| 117 /** |
| 118 * Returns the [String] content of the given [Source]. |
| 119 */ |
| 120 String getSourceContent(AnalysisContext context, Source source) { |
| 121 return context.getContents(source).data; |
| 122 } |
| 74 | 123 |
| 75 class CorrectionUtils { | 124 class CorrectionUtils { |
| 76 final CompilationUnit unit; | 125 final CompilationUnit unit; |
| 77 | 126 |
| 78 LibraryElement _library; | 127 LibraryElement _library; |
| 79 String _buffer; | 128 String _buffer; |
| 80 String _endOfLine; | 129 String _endOfLine; |
| 81 | 130 |
| 82 CorrectionUtils(this.unit) { | 131 CorrectionUtils(this.unit) { |
| 83 CompilationUnitElement unitElement = unit.element; | 132 CompilationUnitElement unitElement = unit.element; |
| 84 this._library = unitElement.library; | 133 this._library = unitElement.library; |
| 85 this._buffer = unitElement.context.getContents(unitElement.source).data; | 134 this._buffer = unitElement.context.getContents(unitElement.source).data; |
| 86 } | 135 } |
| 87 | 136 |
| 88 /** | 137 /** |
| 89 * Returns the EOL to use for this [CompilationUnit]. | 138 * Returns the EOL to use for this [CompilationUnit]. |
| 90 */ | 139 */ |
| 91 String get endOfLine { | 140 String get endOfLine { |
| 92 if (_endOfLine == null) { | 141 if (_endOfLine == null) { |
| 93 if (_buffer.contains("\r\n")) { | 142 if (_buffer.contains("\r\n")) { |
| 94 _endOfLine = "\r\n"; | 143 _endOfLine = "\r\n"; |
| 95 } else { | 144 } else { |
| 96 _endOfLine = "\n"; | 145 _endOfLine = "\n"; |
| 97 } | 146 } |
| 98 } | 147 } |
| 99 return _endOfLine; | 148 return _endOfLine; |
| 100 } | 149 } |
| 101 | 150 |
| 102 /** | 151 /** |
| 152 * Returns the actual type source of the given [Expression], may be `null` |
| 153 * if can not be resolved, should be treated as the `dynamic` type. |
| 154 */ |
| 155 String getExpressionTypeSource(Expression expression) { |
| 156 if (expression == null) { |
| 157 return null; |
| 158 } |
| 159 DartType type = expression.bestType; |
| 160 if (type.isDynamic) { |
| 161 return null; |
| 162 } |
| 163 return getTypeSource(type); |
| 164 } |
| 165 |
| 166 /** |
| 167 * Returns the indentation with the given level. |
| 168 */ |
| 169 String getIndent(int level) => repeat(' ', level); |
| 170 |
| 171 /** |
| 103 * Skips whitespace characters and single EOL on the right from [index]. | 172 * Skips whitespace characters and single EOL on the right from [index]. |
| 104 * | 173 * |
| 105 * If [index] the end of a statement or method, then in the most cases it is | 174 * If [index] the end of a statement or method, then in the most cases it is |
| 106 * a start of the next line. | 175 * a start of the next line. |
| 107 */ | 176 */ |
| 108 int getLineContentEnd(int index) { | 177 int getLineContentEnd(int index) { |
| 109 int length = _buffer.length; | 178 int length = _buffer.length; |
| 110 // skip whitespace characters | 179 // skip whitespace characters |
| 111 while (index < length) { | 180 while (index < length) { |
| 112 int c = _buffer.codeUnitAt(index); | 181 int c = _buffer.codeUnitAt(index); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 138 int c = _buffer.codeUnitAt(index - 1); | 207 int c = _buffer.codeUnitAt(index - 1); |
| 139 if (!isSpace(c)) { | 208 if (!isSpace(c)) { |
| 140 break; | 209 break; |
| 141 } | 210 } |
| 142 index--; | 211 index--; |
| 143 } | 212 } |
| 144 return index; | 213 return index; |
| 145 } | 214 } |
| 146 | 215 |
| 147 /** | 216 /** |
| 217 * Returns the whitespace prefix of the line which contains given offset. |
| 218 */ |
| 219 String getLinePrefix(int index) { |
| 220 int lineStart = getLineThis(index); |
| 221 int length = _buffer.length; |
| 222 int lineNonWhitespace = lineStart; |
| 223 while (lineNonWhitespace < length) { |
| 224 int c = _buffer.codeUnitAt(lineNonWhitespace); |
| 225 if (c == 0xD || c == 0xA) { |
| 226 break; |
| 227 } |
| 228 if (!isWhitespace(c)) { |
| 229 break; |
| 230 } |
| 231 lineNonWhitespace++; |
| 232 } |
| 233 return getText2(lineStart, lineNonWhitespace - lineStart); |
| 234 } |
| 235 |
| 236 /** |
| 237 * Returns the start index of the line which contains given index. |
| 238 */ |
| 239 int getLineThis(int index) { |
| 240 while (index > 0) { |
| 241 int c = _buffer.codeUnitAt(index - 1); |
| 242 if (c == 0xD || c == 0xA) { |
| 243 break; |
| 244 } |
| 245 index--; |
| 246 } |
| 247 return index; |
| 248 } |
| 249 |
| 250 /** |
| 148 * Returns a [SourceRange] that covers [range] and extends (if possible) to | 251 * Returns a [SourceRange] that covers [range] and extends (if possible) to |
| 149 * cover whole lines. | 252 * cover whole lines. |
| 150 */ | 253 */ |
| 151 SourceRange getLinesRange(SourceRange range) { | 254 SourceRange getLinesRange(SourceRange range) { |
| 152 // start | 255 // start |
| 153 int startOffset = range.offset; | 256 int startOffset = range.offset; |
| 154 int startLineOffset = getLineContentStart(startOffset); | 257 int startLineOffset = getLineContentStart(startOffset); |
| 155 // end | 258 // end |
| 156 int endOffset = range.end; | 259 int endOffset = range.end; |
| 157 int afterEndLineOffset = getLineContentEnd(endOffset); | 260 int afterEndLineOffset = getLineContentEnd(endOffset); |
| 158 // range | 261 // range |
| 159 return rangeStartEnd(startLineOffset, afterEndLineOffset); | 262 return rangeStartEnd(startLineOffset, afterEndLineOffset); |
| 160 } | 263 } |
| 161 | 264 |
| 162 /** | 265 /** |
| 266 * Returns the line prefix consisting of spaces and tabs on the left from the
given |
| 267 * [AstNode]. |
| 268 */ |
| 269 String getNodePrefix(AstNode node) { |
| 270 int offset = node.offset; |
| 271 // function literal is special, it uses offset of enclosing line |
| 272 if (node is FunctionExpression) { |
| 273 return getLinePrefix(offset); |
| 274 } |
| 275 // use just prefix directly before node |
| 276 return getPrefix(offset); |
| 277 } |
| 278 |
| 279 /** |
| 163 * @return the source for the parameter with the given type and name. | 280 * @return the source for the parameter with the given type and name. |
| 164 */ | 281 */ |
| 165 String getParameterSource(DartType type, String name) { | 282 String getParameterSource(DartType type, String name) { |
| 166 // no type | 283 // no type |
| 167 if (type == null || type.isDynamic) { | 284 if (type == null || type.isDynamic) { |
| 168 return name; | 285 return name; |
| 169 } | 286 } |
| 170 // function type | 287 // function type |
| 171 if (type is FunctionType) { | 288 if (type is FunctionType) { |
| 172 FunctionType functionType = type; | 289 FunctionType functionType = type; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 191 } | 308 } |
| 192 sb.write(')'); | 309 sb.write(')'); |
| 193 // done | 310 // done |
| 194 return sb.toString(); | 311 return sb.toString(); |
| 195 } | 312 } |
| 196 // simple type | 313 // simple type |
| 197 return "${getTypeSource(type)} ${name}"; | 314 return "${getTypeSource(type)} ${name}"; |
| 198 } | 315 } |
| 199 | 316 |
| 200 /** | 317 /** |
| 201 * Returns the actual type source of the given [Expression], may be `null` | 318 * Returns the line prefix consisting of spaces and tabs on the left from the |
| 202 * if can not be resolved, should be treated as the `dynamic` type. | 319 * given offset. |
| 203 */ | 320 */ |
| 204 String getExpressionTypeSource(Expression expression) { | 321 String getPrefix(int endIndex) { |
| 205 if (expression == null) { | 322 int startIndex = getLineContentStart(endIndex); |
| 206 return null; | 323 return _buffer.substring(startIndex, endIndex); |
| 207 } | |
| 208 DartType type = expression.bestType; | |
| 209 String typeSource = getTypeSource(type); | |
| 210 if ("dynamic" == typeSource) { | |
| 211 return null; | |
| 212 } | |
| 213 return typeSource; | |
| 214 } | 324 } |
| 215 | 325 |
| 216 /** | 326 /** |
| 327 * Returns the text of the given [AstNode] in the unit. |
| 328 */ |
| 329 String getText(AstNode node) => getText2(node.offset, node.length); |
| 330 |
| 331 /** |
| 332 * Returns the text of the given range in the unit. |
| 333 */ |
| 334 String getText2(int offset, int length) => |
| 335 _buffer.substring(offset, offset + length); |
| 336 |
| 337 /** |
| 217 * Returns the source to reference [type] in this [CompilationUnit]. | 338 * Returns the source to reference [type] in this [CompilationUnit]. |
| 218 */ | 339 */ |
| 219 String getTypeSource(DartType type) { | 340 String getTypeSource(DartType type) { |
| 220 StringBuffer sb = new StringBuffer(); | 341 StringBuffer sb = new StringBuffer(); |
| 221 // prepare element | 342 // prepare element |
| 222 Element element = type.element; | 343 Element element = type.element; |
| 223 if (element == null) { | 344 if (element == null) { |
| 224 String source = type.toString(); | 345 String source = type.toString(); |
| 225 source = source.replaceAll('<dynamic>', ''); | 346 source = source.replaceAll('<dynamic>', ''); |
| 226 source = source.replaceAll('<dynamic, dynamic>', ''); | 347 source = source.replaceAll('<dynamic, dynamic>', ''); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 273 ImportElement _getImportElement(Element element) { | 394 ImportElement _getImportElement(Element element) { |
| 274 for (ImportElement imp in _library.imports) { | 395 for (ImportElement imp in _library.imports) { |
| 275 Map<String, Element> definedNames = getImportNamespace(imp); | 396 Map<String, Element> definedNames = getImportNamespace(imp); |
| 276 if (definedNames.containsValue(element)) { | 397 if (definedNames.containsValue(element)) { |
| 277 return imp; | 398 return imp; |
| 278 } | 399 } |
| 279 } | 400 } |
| 280 return null; | 401 return null; |
| 281 } | 402 } |
| 282 } | 403 } |
| OLD | NEW |