Remove scope elements, such as type parameters, after using when writing summaries.

Bug: https://github.com/dart-lang/sdk/issues/46981
Change-Id: I2f7ad246e376bffc9e67f548d979c211894668a3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/211200
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Samuel Rawlins <srawlins@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2021-08-25 15:30:44 +00:00 committed by commit-bot@chromium.org
parent 2a5c85e7cf
commit 8d5c80ce83
2 changed files with 48 additions and 69 deletions

View file

@ -245,17 +245,16 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
void visitFieldFormalParameter(FieldFormalParameter node) {
_writeByte(Tag.FieldFormalParameter);
_pushScopeTypeParameters(node.typeParameters);
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.type);
_writeOptionalNode(node.parameters);
_storeNormalFormalParameter(
node,
node.keyword,
hasQuestion: node.question != null,
);
_sink.localElements.popScope();
_withTypeParameters(node.typeParameters, () {
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.type);
_writeOptionalNode(node.parameters);
_storeNormalFormalParameter(
node,
node.keyword,
hasQuestion: node.question != null,
);
});
}
@override
@ -325,13 +324,12 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
void visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
_writeByte(Tag.FunctionTypedFormalParameter);
_pushScopeTypeParameters(node.typeParameters);
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.returnType);
_writeNode(node.parameters);
_storeNormalFormalParameter(node, null);
_sink.localElements.popScope();
_withTypeParameters(node.typeParameters, () {
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.returnType);
_writeNode(node.parameters);
_storeNormalFormalParameter(node, null);
});
}
@override
@ -344,14 +342,12 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
),
);
_pushScopeTypeParameters(node.typeParameters);
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.returnType);
_writeNode(node.parameters);
_sink.writeType(node.type);
_sink.localElements.popScope();
_withTypeParameters(node.typeParameters, () {
_writeOptionalNode(node.typeParameters);
_writeOptionalNode(node.returnType);
_writeNode(node.parameters);
_sink.writeType(node.type);
});
}
@override
@ -776,18 +772,6 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
_storeAnnotatedNode(node);
}
void _pushScopeTypeParameters(TypeParameterList? node) {
_sink.localElements.pushScope();
if (node == null) {
return;
}
for (var typeParameter in node.typeParameters) {
_sink.localElements.declare(typeParameter.declaredElement!);
}
}
void _storeAnnotatedNode(AnnotatedNode node) {
_writeNodeList(node.metadata);
}
@ -850,6 +834,19 @@ class AstBinaryWriter extends ThrowingAstVisitor<void> {
_storeFormalParameter(node);
}
void _withTypeParameters(TypeParameterList? node, void Function() f) {
if (node == null) {
f();
} else {
var elements = node.typeParameters
.map((typeParameter) => typeParameter.declaredElement!)
.toList();
_sink.localElements.withElements(elements, () {
f();
});
}
}
void _writeActualType(ResolutionSink resolutionSink, DartType type) {
resolutionSink.writeType(type);
}

View file

@ -160,16 +160,12 @@ class BundleWriter {
ConstructorElementFlags.write(_sink, element);
_resolutionSink._writeAnnotationList(element.metadata);
_resolutionSink.localElements.pushScope();
_resolutionSink.localElements.declareAll(element.parameters);
try {
_resolutionSink.localElements.withElements(element.parameters, () {
_writeList(element.parameters, _writeParameterElement);
_writeMacro(element.macro);
_resolutionSink.writeElement(element.redirectedConstructor);
_resolutionSink._writeNodeList(element.constantInitializers);
} finally {
_resolutionSink.localElements.popScope();
}
});
}
void _writeEnumElement(ClassElement element) {
@ -430,14 +426,10 @@ class BundleWriter {
List<TypeParameterElement> typeParameters,
void Function() f,
) {
_resolutionSink.localElements.pushScope();
_resolutionSink.localElements.declareAll(typeParameters);
try {
_resolutionSink.localElements.withElements(typeParameters, () {
_sink.writeList(typeParameters, _writeTypeParameterElement);
f();
} finally {
_resolutionSink.localElements.popScope();
}
});
}
void _writeUnitElement(CompilationUnitElement unitElement) {
@ -745,9 +737,7 @@ class ResolutionSink extends _SummaryDataWriter {
void Function() f, {
required bool withAnnotations,
}) {
localElements.pushScope();
localElements.declareAll(typeParameters);
try {
localElements.withElements(typeParameters, () {
writeUInt30(typeParameters.length);
for (var typeParameter in typeParameters) {
_writeStringReference(typeParameter.name);
@ -759,9 +749,7 @@ class ResolutionSink extends _SummaryDataWriter {
}
}
f();
} finally {
localElements.popScope();
}
});
}
static List<DartType> _enclosingClassTypeArguments(
@ -942,7 +930,6 @@ class _Library {
class _LocalElementIndexer {
final Map<Element, int> _index = Map.identity();
final List<int> _scopes = [];
int _stackHeight = 0;
int operator [](Element element) {
@ -950,22 +937,17 @@ class _LocalElementIndexer {
(throw ArgumentError('Unexpectedly not indexed: $element'));
}
void declare(Element element) {
_index[element] = _stackHeight++;
}
void declareAll(List<Element> elements) {
void withElements(List<Element> elements, void Function() f) {
for (var element in elements) {
declare(element);
_index[element] = _stackHeight++;
}
}
void popScope() {
_stackHeight = _scopes.removeLast();
}
f();
void pushScope() {
_scopes.add(_stackHeight);
_stackHeight -= elements.length;
for (var element in elements) {
_index.remove(element);
}
}
}