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

Side by Side Diff: pkg/analysis_server/lib/src/services/correction/util.dart

Issue 2972463003: Use DartEditBuilder to write types and remove dead code (Closed)
Patch Set: Created 3 years, 5 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 import 'dart:math'; 5 import 'dart:math';
6 6
7 import 'package:analysis_server/src/protocol_server.dart' 7 import 'package:analysis_server/src/protocol_server.dart'
8 show doSourceChange_addElementEdit; 8 show doSourceChange_addElementEdit;
9 import 'package:analysis_server/src/services/correction/strings.dart'; 9 import 'package:analysis_server/src/services/correction/strings.dart';
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 692 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 if (_buffer.contains("\r\n")) { 703 if (_buffer.contains("\r\n")) {
704 _endOfLine = "\r\n"; 704 _endOfLine = "\r\n";
705 } else { 705 } else {
706 _endOfLine = "\n"; 706 _endOfLine = "\n";
707 } 707 }
708 } 708 }
709 return _endOfLine; 709 return _endOfLine;
710 } 710 }
711 711
712 /** 712 /**
713 * Returns an [Edit] that changes indentation of the source of the given
714 * [SourceRange] from [oldIndent] to [newIndent], keeping indentation of lines
715 * relative to each other.
716 */
717 SourceEdit createIndentEdit(
718 SourceRange range, String oldIndent, String newIndent) {
719 String newSource = replaceSourceRangeIndent(range, oldIndent, newIndent);
720 return new SourceEdit(range.offset, range.length, newSource);
721 }
722
723 /**
724 * Returns the [AstNode] that encloses the given offset. 713 * Returns the [AstNode] that encloses the given offset.
725 */ 714 */
726 AstNode findNode(int offset) => new NodeLocator(offset).searchWithin(unit); 715 AstNode findNode(int offset) => new NodeLocator(offset).searchWithin(unit);
727 716
728 /** 717 /**
729 * Returns names of elements that might conflict with a new local variable 718 * Returns names of elements that might conflict with a new local variable
730 * declared at [offset]. 719 * declared at [offset].
731 */ 720 */
732 Set<String> findPossibleLocalVariableConflicts(int offset) { 721 Set<String> findPossibleLocalVariableConflicts(int offset) {
733 Set<String> conflicts = new Set<String>(); 722 Set<String> conflicts = new Set<String>();
734 AstNode enclosingNode = findNode(offset); 723 AstNode enclosingNode = findNode(offset);
735 Block enclosingBlock = enclosingNode.getAncestor((node) => node is Block); 724 Block enclosingBlock = enclosingNode.getAncestor((node) => node is Block);
736 if (enclosingBlock != null) { 725 if (enclosingBlock != null) {
737 _CollectReferencedUnprefixedNames visitor = 726 _CollectReferencedUnprefixedNames visitor =
738 new _CollectReferencedUnprefixedNames(); 727 new _CollectReferencedUnprefixedNames();
739 enclosingBlock.accept(visitor); 728 enclosingBlock.accept(visitor);
740 return visitor.names; 729 return visitor.names;
741 } 730 }
742 return conflicts; 731 return conflicts;
743 } 732 }
744 733
745 /** 734 /**
746 * Returns the actual type source of the given [Expression], may be `null`
747 * if can not be resolved, should be treated as the `dynamic` type.
748 */
749 String getExpressionTypeSource(
750 Expression expression, Set<Source> librariesToImport) {
751 if (expression == null) {
752 return null;
753 }
754 DartType type = expression.bestType;
755 if (type.isDynamic) {
756 return null;
757 }
758 return getTypeSource(type, librariesToImport);
759 }
760
761 /**
762 * Returns the indentation with the given level. 735 * Returns the indentation with the given level.
763 */ 736 */
764 String getIndent(int level) => repeat(' ', level); 737 String getIndent(int level) => repeat(' ', level);
765 738
766 /** 739 /**
767 * Returns a [InsertDesc] describing where to insert a new library-related
768 * directive.
769 */
770 CorrectionUtils_InsertDesc getInsertDescImport() {
771 // analyze directives
772 Directive prevDirective = null;
773 for (Directive directive in unit.directives) {
774 if (directive is LibraryDirective ||
775 directive is ImportDirective ||
776 directive is ExportDirective) {
777 prevDirective = directive;
778 }
779 }
780 // insert after last library-related directive
781 if (prevDirective != null) {
782 CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
783 result.offset = prevDirective.end;
784 String eol = endOfLine;
785 if (prevDirective is LibraryDirective) {
786 result.prefix = "$eol$eol";
787 } else {
788 result.prefix = eol;
789 }
790 return result;
791 }
792 // no directives, use "top" location
793 return getInsertDescTop();
794 }
795
796 /**
797 * Returns a [InsertDesc] describing where to insert a new 'part' directive.
798 */
799 CorrectionUtils_InsertDesc getInsertDescPart() {
800 // analyze directives
801 Directive prevDirective = null;
802 for (Directive directive in unit.directives) {
803 prevDirective = directive;
804 }
805 // insert after last directive
806 if (prevDirective != null) {
807 CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
808 result.offset = prevDirective.end;
809 String eol = endOfLine;
810 if (prevDirective is PartDirective) {
811 result.prefix = eol;
812 } else {
813 result.prefix = "$eol$eol";
814 }
815 return result;
816 }
817 // no directives, use "top" location
818 return getInsertDescTop();
819 }
820
821 /**
822 * Returns a [InsertDesc] describing where to insert a new directive or a 740 * Returns a [InsertDesc] describing where to insert a new directive or a
823 * top-level declaration at the top of the file. 741 * top-level declaration at the top of the file.
824 */ 742 */
825 CorrectionUtils_InsertDesc getInsertDescTop() { 743 CorrectionUtils_InsertDesc getInsertDescTop() {
826 // skip leading line comments 744 // skip leading line comments
827 int offset = 0; 745 int offset = 0;
828 bool insertEmptyLineBefore = false; 746 bool insertEmptyLineBefore = false;
829 bool insertEmptyLineAfter = false; 747 bool insertEmptyLineAfter = false;
830 String source = _buffer; 748 String source = _buffer;
831 // skip hash-bang 749 // skip hash-bang
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 } 943 }
1026 944
1027 /** 945 /**
1028 * Returns the text of the given [AstNode] in the unit. 946 * Returns the text of the given [AstNode] in the unit.
1029 */ 947 */
1030 String getNodeText(AstNode node) { 948 String getNodeText(AstNode node) {
1031 return getText(node.offset, node.length); 949 return getText(node.offset, node.length);
1032 } 950 }
1033 951
1034 /** 952 /**
1035 * @return the source for the parameter with the given type and name.
1036 */
1037 String getParameterSource(
1038 DartType type, String name, Set<Source> librariesToImport) {
1039 // no type
1040 if (type == null || type.isDynamic) {
1041 return name;
1042 }
1043 // function type
1044 if (type is FunctionType && type.element.isSynthetic) {
1045 FunctionType functionType = type;
1046 StringBuffer sb = new StringBuffer();
1047 // return type
1048 DartType returnType = functionType.returnType;
1049 if (returnType != null && !returnType.isDynamic) {
1050 String returnTypeSource = getTypeSource(returnType, librariesToImport);
1051 sb.write(returnTypeSource);
1052 sb.write(' ');
1053 }
1054 // parameter name
1055 sb.write(name);
1056 // parameters
1057 sb.write('(');
1058 List<ParameterElement> fParameters = functionType.parameters;
1059 for (int i = 0; i < fParameters.length; i++) {
1060 ParameterElement fParameter = fParameters[i];
1061 if (i != 0) {
1062 sb.write(", ");
1063 }
1064 sb.write(getParameterSource(
1065 fParameter.type, fParameter.name, librariesToImport));
1066 }
1067 sb.write(')');
1068 // done
1069 return sb.toString();
1070 }
1071 // simple type
1072 String typeSource = getTypeSource(type, librariesToImport);
1073 return '$typeSource $name';
1074 }
1075
1076 /**
1077 * Returns the line prefix consisting of spaces and tabs on the left from the 953 * Returns the line prefix consisting of spaces and tabs on the left from the
1078 * given offset. 954 * given offset.
1079 */ 955 */
1080 String getPrefix(int endIndex) { 956 String getPrefix(int endIndex) {
1081 int startIndex = getLineContentStart(endIndex); 957 int startIndex = getLineContentStart(endIndex);
1082 return _buffer.substring(startIndex, endIndex); 958 return _buffer.substring(startIndex, endIndex);
1083 } 959 }
1084 960
1085 /** 961 /**
1086 * Returns the text of the given range in the unit. 962 * Returns the text of the given range in the unit.
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after
1646 _InvertedCondition expr, int newOperatorPrecedence) { 1522 _InvertedCondition expr, int newOperatorPrecedence) {
1647 if (expr._precedence < newOperatorPrecedence) { 1523 if (expr._precedence < newOperatorPrecedence) {
1648 return "(${expr._source})"; 1524 return "(${expr._source})";
1649 } 1525 }
1650 return expr._source; 1526 return expr._source;
1651 } 1527 }
1652 1528
1653 static _InvertedCondition _simple(String source) => 1529 static _InvertedCondition _simple(String source) =>
1654 new _InvertedCondition(2147483647, source); 1530 new _InvertedCondition(2147483647, source);
1655 } 1531 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698