OLD | NEW |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |