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

Side by Side Diff: pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart

Issue 2990793002: Improve name generation for indexed expressions (Closed)
Patch Set: Created 3 years, 4 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
« no previous file with comments | « pkg/analysis_server/test/abstract_context.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, 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:async'; 5 import 'dart:async';
6 6
7 import 'package:analyzer/dart/analysis/results.dart'; 7 import 'package:analyzer/dart/analysis/results.dart';
8 import 'package:analyzer/dart/analysis/session.dart'; 8 import 'package:analyzer/dart/analysis/session.dart';
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/token.dart'; 10 import 'package:analyzer/dart/ast/token.dart';
(...skipping 594 matching lines...) Expand 10 before | Expand all | Expand 10 after
605 if (type is InterfaceType && alreadyAdded.add(type)) { 605 if (type is InterfaceType && alreadyAdded.add(type)) {
606 builder.addSuggestion(LinkedEditSuggestionKind.TYPE, type.displayName); 606 builder.addSuggestion(LinkedEditSuggestionKind.TYPE, type.displayName);
607 _addSuperTypeProposals(builder, type.superclass, alreadyAdded); 607 _addSuperTypeProposals(builder, type.superclass, alreadyAdded);
608 for (InterfaceType interfaceType in type.interfaces) { 608 for (InterfaceType interfaceType in type.interfaces) {
609 _addSuperTypeProposals(builder, interfaceType, alreadyAdded); 609 _addSuperTypeProposals(builder, interfaceType, alreadyAdded);
610 } 610 }
611 } 611 }
612 } 612 }
613 613
614 String _getBaseNameFromExpression(Expression expression) { 614 String _getBaseNameFromExpression(Expression expression) {
615 if (expression is AsExpression) {
616 return _getBaseNameFromExpression(expression.expression);
617 } else if (expression is ParenthesizedExpression) {
618 return _getBaseNameFromExpression(expression.expression);
619 }
620 return _getBaseNameFromUnwrappedExpression(expression);
621 }
622
623 String _getBaseNameFromLocationInParent(Expression expression) {
624 // value in named expression
625 if (expression.parent is NamedExpression) {
626 NamedExpression namedExpression = expression.parent as NamedExpression;
627 if (namedExpression.expression == expression) {
628 return namedExpression.name.label.name;
629 }
630 }
631 // positional argument
632 ParameterElement parameter = expression.propagatedParameterElement;
633 if (parameter == null) {
634 parameter = expression.staticParameterElement;
635 }
636 if (parameter != null) {
637 return parameter.displayName;
638 }
639
640 // unknown
641 return null;
642 }
643
644 String _getBaseNameFromUnwrappedExpression(Expression expression) {
615 String name = null; 645 String name = null;
616 // e as Type
617 if (expression is AsExpression) {
618 AsExpression asExpression = expression as AsExpression;
619 expression = asExpression.expression;
620 }
621 // analyze expressions 646 // analyze expressions
622 if (expression is SimpleIdentifier) { 647 if (expression is SimpleIdentifier) {
623 SimpleIdentifier node = expression; 648 return expression.name;
624 return node.name;
625 } else if (expression is PrefixedIdentifier) { 649 } else if (expression is PrefixedIdentifier) {
626 PrefixedIdentifier node = expression; 650 return expression.identifier.name;
627 return node.identifier.name;
628 } else if (expression is PropertyAccess) { 651 } else if (expression is PropertyAccess) {
629 PropertyAccess node = expression; 652 return expression.propertyName.name;
630 return node.propertyName.name;
631 } else if (expression is MethodInvocation) { 653 } else if (expression is MethodInvocation) {
632 name = expression.methodName.name; 654 name = expression.methodName.name;
633 } else if (expression is InstanceCreationExpression) { 655 } else if (expression is InstanceCreationExpression) {
634 InstanceCreationExpression creation = expression; 656 ConstructorName constructorName = expression.constructorName;
635 ConstructorName constructorName = creation.constructorName;
636 TypeName typeName = constructorName.type; 657 TypeName typeName = constructorName.type;
637 if (typeName != null) { 658 if (typeName != null) {
638 Identifier typeNameIdentifier = typeName.name; 659 Identifier typeNameIdentifier = typeName.name;
639 // new ClassName() 660 // new ClassName()
640 if (typeNameIdentifier is SimpleIdentifier) { 661 if (typeNameIdentifier is SimpleIdentifier) {
641 return typeNameIdentifier.name; 662 return typeNameIdentifier.name;
642 } 663 }
643 // new prefix.name(); 664 // new prefix.name();
644 if (typeNameIdentifier is PrefixedIdentifier) { 665 if (typeNameIdentifier is PrefixedIdentifier) {
645 PrefixedIdentifier prefixed = typeNameIdentifier; 666 PrefixedIdentifier prefixed = typeNameIdentifier;
646 // new prefix.ClassName() 667 // new prefix.ClassName()
647 if (prefixed.prefix.staticElement is PrefixElement) { 668 if (prefixed.prefix.staticElement is PrefixElement) {
648 return prefixed.identifier.name; 669 return prefixed.identifier.name;
649 } 670 }
650 // new ClassName.constructorName() 671 // new ClassName.constructorName()
651 return prefixed.prefix.name; 672 return prefixed.prefix.name;
652 } 673 }
653 } 674 }
675 } else if (expression is IndexExpression) {
676 name = _getBaseNameFromExpression(expression.realTarget);
677 if (name.endsWith('es')) {
678 name = name.substring(0, name.length - 2);
679 } else if (name.endsWith('s')) {
680 name = name.substring(0, name.length - 1);
681 }
654 } 682 }
655 // strip known prefixes 683 // strip known prefixes
656 if (name != null) { 684 if (name != null) {
657 for (int i = 0; i < _KNOWN_METHOD_NAME_PREFIXES.length; i++) { 685 for (int i = 0; i < _KNOWN_METHOD_NAME_PREFIXES.length; i++) {
658 String prefix = _KNOWN_METHOD_NAME_PREFIXES[i]; 686 String prefix = _KNOWN_METHOD_NAME_PREFIXES[i];
659 if (name.startsWith(prefix)) { 687 if (name.startsWith(prefix)) {
660 if (name == prefix) { 688 if (name == prefix) {
661 return null; 689 return null;
662 } else if (isUpperCase(name.codeUnitAt(prefix.length))) { 690 } else if (isUpperCase(name.codeUnitAt(prefix.length))) {
663 return name.substring(prefix.length); 691 return name.substring(prefix.length);
664 } 692 }
665 } 693 }
666 } 694 }
667 } 695 }
668 // done 696 // done
669 return name; 697 return name;
670 } 698 }
671 699
672 String _getBaseNameFromLocationInParent(Expression expression) {
673 // value in named expression
674 if (expression.parent is NamedExpression) {
675 NamedExpression namedExpression = expression.parent as NamedExpression;
676 if (namedExpression.expression == expression) {
677 return namedExpression.name.label.name;
678 }
679 }
680 // positional argument
681 ParameterElement parameter = expression.propagatedParameterElement;
682 if (parameter == null) {
683 parameter = expression.staticParameterElement;
684 }
685 if (parameter != null) {
686 return parameter.displayName;
687 }
688
689 // unknown
690 return null;
691 }
692
693 /** 700 /**
694 * Returns all variants of names by removing leading words one by one. 701 * Returns all variants of names by removing leading words one by one.
695 */ 702 */
696 List<String> _getCamelWordCombinations(String name) { 703 List<String> _getCamelWordCombinations(String name) {
697 List<String> result = []; 704 List<String> result = [];
698 List<String> parts = getCamelWords(name); 705 List<String> parts = getCamelWords(name);
699 for (int i = 0; i < parts.length; i++) { 706 for (int i = 0; i < parts.length; i++) {
700 String s1 = parts[i].toLowerCase(); 707 String s1 = parts[i].toLowerCase();
701 String s2 = parts.skip(i + 1).join(); 708 String s2 = parts.skip(i + 1).join();
702 String suggestion = '$s1$s2'; 709 String suggestion = '$s1$s2';
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 } 1400 }
1394 } 1401 }
1395 1402
1396 class _InsertionDescription { 1403 class _InsertionDescription {
1397 final int offset; 1404 final int offset;
1398 final bool insertEmptyLineBefore; 1405 final bool insertEmptyLineBefore;
1399 final bool insertEmptyLineAfter; 1406 final bool insertEmptyLineAfter;
1400 _InsertionDescription( 1407 _InsertionDescription(
1401 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter); 1408 this.offset, this.insertEmptyLineBefore, this.insertEmptyLineAfter);
1402 } 1409 }
OLDNEW
« no previous file with comments | « pkg/analysis_server/test/abstract_context.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698