| 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 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 if (argumentPrecedence < occurrence.parentPrecedence) { | 95 if (argumentPrecedence < occurrence.parentPrecedence) { |
| 96 occurrenceArgumentSource = "($argumentSource)"; | 96 occurrenceArgumentSource = "($argumentSource)"; |
| 97 } else { | 97 } else { |
| 98 occurrenceArgumentSource = argumentSource; | 98 occurrenceArgumentSource = argumentSource; |
| 99 } | 99 } |
| 100 // do replace | 100 // do replace |
| 101 edits.add(newSourceEdit_range(range, occurrenceArgumentSource)); | 101 edits.add(newSourceEdit_range(range, occurrenceArgumentSource)); |
| 102 } | 102 } |
| 103 }); | 103 }); |
| 104 // replace static field "qualifier" with invocation target | 104 // replace static field "qualifier" with invocation target |
| 105 part._staticFieldOffsets.forEach((String className, List<int> offsets) { | 105 part._implicitClassNameOffsets.forEach((String className, List<int> offsets) { |
| 106 for (int offset in offsets) { | 106 for (int offset in offsets) { |
| 107 // edits.add(newSourceEdit_range(range, className + '.')); | 107 // edits.add(newSourceEdit_range(range, className + '.')); |
| 108 edits.add(new SourceEdit(offset, 0, className + '.')); | 108 edits.add(new SourceEdit(offset, 0, className + '.')); |
| 109 } | 109 } |
| 110 }); | 110 }); |
| 111 // replace "this" references with invocation target | 111 // replace "this" references with invocation target |
| 112 if (targetExpression != null) { | 112 if (targetExpression != null) { |
| 113 String targetSource = utils.getNodeText(targetExpression); | 113 String targetSource = utils.getNodeText(targetExpression); |
| 114 // explicit "this" references | 114 // explicit "this" references |
| 115 for (int offset in part._explicitThisOffsets) { | 115 for (int offset in part._explicitThisOffsets) { |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 * The offsets of explicit `this` expression references. | 675 * The offsets of explicit `this` expression references. |
| 676 */ | 676 */ |
| 677 final List<int> _explicitThisOffsets = []; | 677 final List<int> _explicitThisOffsets = []; |
| 678 | 678 |
| 679 /** | 679 /** |
| 680 * The offsets of implicit `this` expression references. | 680 * The offsets of implicit `this` expression references. |
| 681 */ | 681 */ |
| 682 final List<int> _implicitThisOffsets = []; | 682 final List<int> _implicitThisOffsets = []; |
| 683 | 683 |
| 684 /** | 684 /** |
| 685 * The offsets of the implicit class references in static field references. | 685 * The offsets of the implicit class references in static member references. |
| 686 */ | 686 */ |
| 687 final Map<String, List<int>> _staticFieldOffsets = {}; | 687 final Map<String, List<int>> _implicitClassNameOffsets = {}; |
| 688 | 688 |
| 689 _SourcePart(this._base, this._source, this._prefix); | 689 _SourcePart(this._base, this._source, this._prefix); |
| 690 | 690 |
| 691 void addExplicitThisOffset(int offset) { | 691 void addExplicitThisOffset(int offset) { |
| 692 _explicitThisOffsets.add(offset - _base); | 692 _explicitThisOffsets.add(offset - _base); |
| 693 } | 693 } |
| 694 | 694 |
| 695 void addImplicitClassNameOffset(String className, int offset) { |
| 696 List<int> offsets = _implicitClassNameOffsets[className]; |
| 697 if (offsets == null) { |
| 698 offsets = []; |
| 699 _implicitClassNameOffsets[className] = offsets; |
| 700 } |
| 701 offsets.add(offset - _base); |
| 702 } |
| 703 |
| 695 void addImplicitThisOffset(int offset) { | 704 void addImplicitThisOffset(int offset) { |
| 696 _implicitThisOffsets.add(offset - _base); | 705 _implicitThisOffsets.add(offset - _base); |
| 697 } | 706 } |
| 698 | 707 |
| 699 void addParameterOccurrence( | 708 void addParameterOccurrence( |
| 700 ParameterElement parameter, SourceRange range, int precedence) { | 709 ParameterElement parameter, SourceRange range, int precedence) { |
| 701 if (parameter != null) { | 710 if (parameter != null) { |
| 702 List<_ParameterOccurrence> occurrences = _parameters[parameter]; | 711 List<_ParameterOccurrence> occurrences = _parameters[parameter]; |
| 703 if (occurrences == null) { | 712 if (occurrences == null) { |
| 704 occurrences = []; | 713 occurrences = []; |
| 705 _parameters[parameter] = occurrences; | 714 _parameters[parameter] = occurrences; |
| 706 } | 715 } |
| 707 range = rangeFromBase(range, _base); | 716 range = rangeFromBase(range, _base); |
| 708 occurrences.add(new _ParameterOccurrence(precedence, range)); | 717 occurrences.add(new _ParameterOccurrence(precedence, range)); |
| 709 } | 718 } |
| 710 } | 719 } |
| 711 | 720 |
| 712 void addStaticFieldOffset(String className, int offset) { | |
| 713 List<int> offsets = _staticFieldOffsets[className]; | |
| 714 if (offsets == null) { | |
| 715 offsets = []; | |
| 716 _staticFieldOffsets[className] = offsets; | |
| 717 } | |
| 718 offsets.add(offset - _base); | |
| 719 } | |
| 720 | |
| 721 void addVariable(VariableElement element, SourceRange range) { | 721 void addVariable(VariableElement element, SourceRange range) { |
| 722 List<SourceRange> ranges = _variables[element]; | 722 List<SourceRange> ranges = _variables[element]; |
| 723 if (ranges == null) { | 723 if (ranges == null) { |
| 724 ranges = []; | 724 ranges = []; |
| 725 _variables[element] = ranges; | 725 _variables[element] = ranges; |
| 726 } | 726 } |
| 727 range = rangeFromBase(range, _base); | 727 range = rangeFromBase(range, _base); |
| 728 ranges.add(range); | 728 ranges.add(range); |
| 729 } | 729 } |
| 730 } | 730 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 758 if (!bodyRange.intersects(nodeRange)) { | 758 if (!bodyRange.intersects(nodeRange)) { |
| 759 return null; | 759 return null; |
| 760 } | 760 } |
| 761 super.visitNode(node); | 761 super.visitNode(node); |
| 762 } | 762 } |
| 763 | 763 |
| 764 @override | 764 @override |
| 765 visitSimpleIdentifier(SimpleIdentifier node) { | 765 visitSimpleIdentifier(SimpleIdentifier node) { |
| 766 SourceRange nodeRange = rangeNode(node); | 766 SourceRange nodeRange = rangeNode(node); |
| 767 if (bodyRange.covers(nodeRange)) { | 767 if (bodyRange.covers(nodeRange)) { |
| 768 _addInstanceFieldQualifier(node); | 768 _addMemberQualifier(node); |
| 769 _addParameter(node); | 769 _addParameter(node); |
| 770 _addVariable(node); | 770 _addVariable(node); |
| 771 } | 771 } |
| 772 } | 772 } |
| 773 | 773 |
| 774 @override | 774 @override |
| 775 visitThisExpression(ThisExpression node) { | 775 visitThisExpression(ThisExpression node) { |
| 776 int offset = node.offset; | 776 int offset = node.offset; |
| 777 if (bodyRange.contains(offset)) { | 777 if (bodyRange.contains(offset)) { |
| 778 result.addExplicitThisOffset(offset); | 778 result.addExplicitThisOffset(offset); |
| 779 } | 779 } |
| 780 } | 780 } |
| 781 | 781 |
| 782 void _addInstanceFieldQualifier(SimpleIdentifier node) { | 782 void _addMemberQualifier(SimpleIdentifier node) { |
| 783 PropertyAccessorElement accessor = getPropertyAccessorElement(node); | 783 // should be unqualified |
| 784 if (isFieldAccessorElement(accessor)) { | 784 AstNode qualifier = getNodeQualifier(node); |
| 785 AstNode qualifier = getNodeQualifier(node); | 785 if (qualifier != null) { |
| 786 if (qualifier == null) { | 786 return; |
| 787 int offset = node.offset; | 787 } |
| 788 if (accessor.isStatic) { | 788 // should be a method or field reference |
| 789 String className = accessor.enclosingElement.displayName; | 789 Element element = node.staticElement; |
| 790 result.addStaticFieldOffset(className, offset); | 790 if (!(element is MethodElement || element is PropertyAccessorElement)) { |
| 791 } else { | 791 return; |
| 792 result.addImplicitThisOffset(offset); | 792 } |
| 793 } | 793 if (element.enclosingElement is! ClassElement) { |
| 794 } | 794 return; |
| 795 } |
| 796 // record the implicit static or instance reference |
| 797 ExecutableElement member = element; |
| 798 int offset = node.offset; |
| 799 if (member.isStatic) { |
| 800 String className = member.enclosingElement.displayName; |
| 801 result.addImplicitClassNameOffset(className, offset); |
| 802 } else { |
| 803 result.addImplicitThisOffset(offset); |
| 795 } | 804 } |
| 796 } | 805 } |
| 797 | 806 |
| 798 void _addParameter(SimpleIdentifier node) { | 807 void _addParameter(SimpleIdentifier node) { |
| 799 ParameterElement parameterElement = getParameterElement(node); | 808 ParameterElement parameterElement = getParameterElement(node); |
| 800 // not a parameter | 809 // not a parameter |
| 801 if (parameterElement == null) { | 810 if (parameterElement == null) { |
| 802 return; | 811 return; |
| 803 } | 812 } |
| 804 // not a parameter of the function being inlined | 813 // not a parameter of the function being inlined |
| 805 if (!methodElement.parameters.contains(parameterElement)) { | 814 if (!methodElement.parameters.contains(parameterElement)) { |
| 806 return; | 815 return; |
| 807 } | 816 } |
| 808 // OK, add occurrence | 817 // OK, add occurrence |
| 809 SourceRange nodeRange = rangeNode(node); | 818 SourceRange nodeRange = rangeNode(node); |
| 810 int parentPrecedence = getExpressionParentPrecedence(node); | 819 int parentPrecedence = getExpressionParentPrecedence(node); |
| 811 result.addParameterOccurrence( | 820 result.addParameterOccurrence( |
| 812 parameterElement, nodeRange, parentPrecedence); | 821 parameterElement, nodeRange, parentPrecedence); |
| 813 } | 822 } |
| 814 | 823 |
| 815 void _addVariable(SimpleIdentifier node) { | 824 void _addVariable(SimpleIdentifier node) { |
| 816 VariableElement variableElement = getLocalVariableElement(node); | 825 VariableElement variableElement = getLocalVariableElement(node); |
| 817 if (variableElement != null) { | 826 if (variableElement != null) { |
| 818 SourceRange nodeRange = rangeNode(node); | 827 SourceRange nodeRange = rangeNode(node); |
| 819 result.addVariable(variableElement, nodeRange); | 828 result.addVariable(variableElement, nodeRange); |
| 820 } | 829 } |
| 821 } | 830 } |
| 822 } | 831 } |
| OLD | NEW |