mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:17:14 +00:00
Macro. De-duplicate walking augmentations.
Change-Id: I09f209b2d52ca31e9486d1701690285888d04cbd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/350181 Reviewed-by: Phil Quitslund <pquitslund@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
parent
a10b584b68
commit
6723dad825
|
@ -21,6 +21,7 @@ import 'package:analyzer/src/generated/utilities_dart.dart';
|
|||
import 'package:analyzer/src/summary2/macro_type_location.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/collection.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/element.dart';
|
||||
import 'package:analyzer/src/utilities/extensions/object.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
|
||||
class ClassDeclarationImpl extends macro.ClassDeclarationImpl
|
||||
|
@ -1026,19 +1027,13 @@ class DeclarationBuilderFromNode {
|
|||
|
||||
final interfaceNodes = <ast.NamedType>[];
|
||||
final mixinNodes = <ast.NamedType>[];
|
||||
for (var current = node;;) {
|
||||
for (var current in node.withAugmentations(declarationBuilder)) {
|
||||
if (current.implementsClause case final clause?) {
|
||||
interfaceNodes.addAll(clause.interfaces);
|
||||
}
|
||||
if (current.withClause case final clause?) {
|
||||
mixinNodes.addAll(clause.mixinTypes);
|
||||
}
|
||||
final nextElement = current.declaredElement?.augmentation;
|
||||
final nextNode = declarationBuilder.nodeOfElement(nextElement);
|
||||
if (nextNode is! ast.ClassDeclarationImpl) {
|
||||
break;
|
||||
}
|
||||
current = nextNode;
|
||||
}
|
||||
|
||||
var classTypeLocation = ElementTypeLocation(element);
|
||||
|
@ -1081,17 +1076,11 @@ class DeclarationBuilderFromNode {
|
|||
|
||||
final interfaceNodes = <ast.NamedType>[];
|
||||
final mixinNodes = <ast.NamedType>[];
|
||||
for (var current = node;;) {
|
||||
for (var current in node.withAugmentations(declarationBuilder)) {
|
||||
if (current.implementsClause case final clause?) {
|
||||
interfaceNodes.addAll(clause.interfaces);
|
||||
}
|
||||
mixinNodes.addAll(current.withClause.mixinTypes);
|
||||
final nextElement = current.declaredElement?.augmentation;
|
||||
final nextNode = declarationBuilder.nodeOfElement(nextElement);
|
||||
if (nextNode is! ast.ClassTypeAliasImpl) {
|
||||
break;
|
||||
}
|
||||
current = nextNode;
|
||||
}
|
||||
|
||||
var classTypeLocation = ElementTypeLocation(element);
|
||||
|
@ -1189,22 +1178,15 @@ class DeclarationBuilderFromNode {
|
|||
) {
|
||||
final element = node.declaredElement!;
|
||||
|
||||
// TODO(scheglov): this is duplicate
|
||||
final interfaceNodes = <ast.NamedType>[];
|
||||
final mixinNodes = <ast.NamedType>[];
|
||||
for (var current = node;;) {
|
||||
for (var current in node.withAugmentations(declarationBuilder)) {
|
||||
if (current.implementsClause case final clause?) {
|
||||
interfaceNodes.addAll(clause.interfaces);
|
||||
}
|
||||
if (current.withClause case final clause?) {
|
||||
mixinNodes.addAll(clause.mixinTypes);
|
||||
}
|
||||
final nextElement = current.declaredElement?.augmentation;
|
||||
final nextNode = declarationBuilder.nodeOfElement(nextElement);
|
||||
if (nextNode is! ast.EnumDeclarationImpl) {
|
||||
break;
|
||||
}
|
||||
current = nextNode;
|
||||
}
|
||||
|
||||
var enumTypeLocation = ElementTypeLocation(element);
|
||||
|
@ -1332,22 +1314,15 @@ class DeclarationBuilderFromNode {
|
|||
) {
|
||||
final element = node.declaredElement!;
|
||||
|
||||
// TODO(scheglov): this is duplicate (partial)
|
||||
final onNodes = <ast.NamedType>[];
|
||||
final interfaceNodes = <ast.NamedType>[];
|
||||
for (var current = node;;) {
|
||||
for (var current in node.withAugmentations(declarationBuilder)) {
|
||||
if (current.onClause case final clause?) {
|
||||
onNodes.addAll(clause.superclassConstraints);
|
||||
}
|
||||
if (current.implementsClause case final clause?) {
|
||||
interfaceNodes.addAll(clause.interfaces);
|
||||
}
|
||||
final nextElement = current.declaredElement?.augmentation;
|
||||
final nextNode = declarationBuilder.nodeOfElement(nextElement);
|
||||
if (nextNode is! ast.MixinDeclarationImpl) {
|
||||
break;
|
||||
}
|
||||
current = nextNode;
|
||||
}
|
||||
|
||||
var mixinTypeLocation = ElementTypeLocation(element);
|
||||
|
@ -2248,3 +2223,21 @@ extension on Element {
|
|||
return enclosing.augmented!.declaration;
|
||||
}
|
||||
}
|
||||
|
||||
extension<T extends ast.DeclarationImpl> on T {
|
||||
List<T> withAugmentations(DeclarationBuilder builder) {
|
||||
var result = <T>[];
|
||||
for (var current = this;;) {
|
||||
result.add(current);
|
||||
var nextElement = current.declaredElement
|
||||
.ifTypeOrNull<AugmentableElement>()
|
||||
?.augmentation;
|
||||
var nextNode = builder.nodeOfElement(nextElement);
|
||||
if (nextNode is! T) {
|
||||
break;
|
||||
}
|
||||
current = nextNode;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue