Macro. Move updating types for GenericFunctionType and TypeParameter to declarations.

This saves us about 120 ms out of 2000.

Change-Id: Ib352a78b39706b07fc2ee0d5b2c3e6e77d98119c
Bug:https://github.com/dart-lang/sdk/issues/55784
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/373000
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
This commit is contained in:
Konstantin Shcheglov 2024-06-24 22:41:39 +00:00 committed by Commit Queue
parent 452de7b098
commit 1b57d51908
2 changed files with 16 additions and 11 deletions

View file

@ -311,6 +311,7 @@ class ReferenceResolver extends ThrowingAstVisitor<void> {
var nullabilitySuffix = _getNullabilitySuffix(node.question != null);
var builder = FunctionTypeBuilder.of(nodeImpl, nullabilitySuffix);
nodeImpl.type = builder;
nodesToBuildType.addDeclaration(node);
nodesToBuildType.addTypeBuilder(builder);
scope = outerScope;
@ -514,6 +515,7 @@ class ReferenceResolver extends ThrowingAstVisitor<void> {
bound.accept(this);
var element = node.declaredElement as TypeParameterElementImpl;
element.bound = bound.type;
nodesToBuildType.addDeclaration(node);
}
}

View file

@ -87,17 +87,6 @@ class TypesBuilder {
builder.build();
}
// TODO(scheglov): generalize
_linker.elementNodes.forEach((element, node) {
if (element is GenericFunctionTypeElementImpl &&
node is GenericFunctionType) {
element.returnType = node.returnType?.type ?? _dynamicType;
}
if (element is TypeParameterElementImpl && node is TypeParameter) {
element.bound = node.bound?.type;
}
});
for (var declaration in nodes.declarations) {
_declaration(declaration);
}
@ -191,6 +180,8 @@ class TypesBuilder {
_functionTypeAlias(node);
} else if (node is FunctionTypedFormalParameter) {
_functionTypedFormalParameter(node);
} else if (node is GenericFunctionTypeImpl) {
_genericFunctionType(node);
} else if (node is GenericTypeAlias) {
_genericTypeAlias(node);
} else if (node is MethodDeclaration) {
@ -213,6 +204,8 @@ class TypesBuilder {
element.type = node.type?.type ?? _dynamicType;
} else if (node is SuperFormalParameter) {
_superFormalParameter(node);
} else if (node is TypeParameterImpl) {
_typeParameter(node);
} else if (node is VariableDeclarationList) {
var type = node.type?.type;
if (type != null) {
@ -289,6 +282,11 @@ class TypesBuilder {
element.type = type;
}
void _genericFunctionType(GenericFunctionTypeImpl node) {
var element = node.declaredElement!;
element.returnType = node.returnType?.type ?? _dynamicType;
}
void _genericTypeAlias(GenericTypeAlias node) {
var element = node.declaredElement as TypeAliasElementImpl;
var featureSet = element.library.featureSet;
@ -342,6 +340,11 @@ class TypesBuilder {
}
}
void _typeParameter(TypeParameterImpl node) {
var element = node.declaredElement!;
element.bound = node.bound?.type;
}
List<TypeParameterElement> _typeParameters(TypeParameterList? node) {
if (node == null) {
return const <TypeParameterElement>[];