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.refactoring.inline_method; | 5 library services.src.refactoring.inline_method; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 | 8 |
9 import 'package:analysis_server/src/protocol_server.dart' hide Element; | 9 import 'package:analysis_server/src/protocol_server.dart' hide Element; |
10 import 'package:analysis_server/src/services/correction/source_range.dart'; | 10 import 'package:analysis_server/src/services/correction/source_range.dart'; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 bool _isAccessor; | 209 bool _isAccessor; |
210 CompilationUnit _methodUnit; | 210 CompilationUnit _methodUnit; |
211 CorrectionUtils _methodUtils; | 211 CorrectionUtils _methodUtils; |
212 AstNode _methodNode; | 212 AstNode _methodNode; |
213 FormalParameterList _methodParameters; | 213 FormalParameterList _methodParameters; |
214 FunctionBody _methodBody; | 214 FunctionBody _methodBody; |
215 Expression _methodExpression; | 215 Expression _methodExpression; |
216 _SourcePart _methodExpressionPart; | 216 _SourcePart _methodExpressionPart; |
217 _SourcePart _methodStatementsPart; | 217 _SourcePart _methodStatementsPart; |
218 List<_ReferenceProcessor> _referenceProcessors = []; | 218 List<_ReferenceProcessor> _referenceProcessors = []; |
| 219 Set<FunctionBody> _alreadyMadeAsync = new Set<FunctionBody>(); |
219 | 220 |
220 InlineMethodRefactoringImpl(this.searchEngine, this.unit, this.offset) { | 221 InlineMethodRefactoringImpl(this.searchEngine, this.unit, this.offset) { |
221 utils = new CorrectionUtils(unit); | 222 utils = new CorrectionUtils(unit); |
222 } | 223 } |
223 | 224 |
224 @override | 225 @override |
225 String get className { | 226 String get className { |
226 if (_methodElement == null) { | 227 if (_methodElement == null) { |
227 return null; | 228 return null; |
228 } | 229 } |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 SourceEdit edit = newSourceEdit_range(range, source); | 554 SourceEdit edit = newSourceEdit_range(range, source); |
554 _addRefEdit(edit); | 555 _addRefEdit(edit); |
555 } | 556 } |
556 | 557 |
557 void _process(RefactoringStatus status) { | 558 void _process(RefactoringStatus status) { |
558 AstNode nodeParent = _node.parent; | 559 AstNode nodeParent = _node.parent; |
559 // may be only single place should be inlined | 560 // may be only single place should be inlined |
560 if (!_shouldProcess()) { | 561 if (!_shouldProcess()) { |
561 return; | 562 return; |
562 } | 563 } |
| 564 // If the element being inlined is async, ensure that the function |
| 565 // body that encloses the method is also async. |
| 566 if (ref._methodElement.isAsynchronous) { |
| 567 FunctionBody body = _node.getAncestor((n) => n is FunctionBody); |
| 568 if (!body.isAsynchronous && ref._alreadyMadeAsync.add(body)) { |
| 569 SourceRange bodyStart = rangeStartLength(body.offset, 0); |
| 570 _addRefEdit(newSourceEdit_range(bodyStart, 'async ')); |
| 571 } |
| 572 } |
563 // may be invocation of inline method | 573 // may be invocation of inline method |
564 if (nodeParent is MethodInvocation) { | 574 if (nodeParent is MethodInvocation) { |
565 MethodInvocation invocation = nodeParent; | 575 MethodInvocation invocation = nodeParent; |
566 Expression target = invocation.target; | 576 Expression target = invocation.target; |
567 List<Expression> arguments = invocation.argumentList.arguments; | 577 List<Expression> arguments = invocation.argumentList.arguments; |
568 _inlineMethodInvocation( | 578 _inlineMethodInvocation( |
569 status, invocation, invocation.isCascaded, target, arguments); | 579 status, invocation, invocation.isCascaded, target, arguments); |
570 } else { | 580 } else { |
571 // cannot inline reference to method: var v = new A().method; | 581 // cannot inline reference to method: var v = new A().method; |
572 if (ref._methodElement is MethodElement) { | 582 if (ref._methodElement is MethodElement) { |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 } | 835 } |
826 | 836 |
827 void _addVariable(SimpleIdentifier node) { | 837 void _addVariable(SimpleIdentifier node) { |
828 VariableElement variableElement = getLocalVariableElement(node); | 838 VariableElement variableElement = getLocalVariableElement(node); |
829 if (variableElement != null) { | 839 if (variableElement != null) { |
830 SourceRange nodeRange = rangeNode(node); | 840 SourceRange nodeRange = rangeNode(node); |
831 result.addVariable(variableElement, nodeRange); | 841 result.addVariable(variableElement, nodeRange); |
832 } | 842 } |
833 } | 843 } |
834 } | 844 } |
OLD | NEW |