Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: pkg/analysis_server/lib/src/services/refactoring/inline_method.dart

Issue 1629533003: Issue 25404. 'Inline Method' should update implicit 'this' and class references. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698