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

Unified Diff: pkg/analyzer/lib/src/summary/summarize_const_expr.dart

Issue 2779993002: Store literal values and invocations arguments only for constants and untyped literals. (Closed)
Patch Set: Update IDL documentation. Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/summary/summarize_const_expr.dart
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index def774ad9858df6a56aa379d34b20335f9587f7d..6212f5d5d76e1f505e2872f71143f16807e545e7 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -69,6 +69,16 @@ UnlinkedConstructorInitializer serializeConstructorInitializer(
*/
abstract class AbstractConstExprSerializer {
/**
+ * Whether an expression that should be a constant is being serialized.
+ *
+ * For constants we need to store more than we need just for type inference,
+ * because we need to be able to restore these AST to evaluate actual values
+ * of constants. So, we need to store constructor arguments, elements for
+ * list and map literals even if these literals are typed.
+ */
+ final bool forConst;
+
+ /**
* See [UnlinkedExprBuilder.isValidConst].
*/
bool isValidConst = true;
@@ -109,6 +119,8 @@ abstract class AbstractConstExprSerializer {
*/
final List<EntityRefBuilder> references = <EntityRefBuilder>[];
+ AbstractConstExprSerializer(this.forConst);
+
/**
* Return `true` if the given [name] is a parameter reference.
*/
@@ -413,21 +425,26 @@ abstract class AbstractConstExprSerializer {
}
void _serializeArguments(ArgumentList argumentList) {
- List<Expression> arguments = argumentList.arguments;
- // Serialize the arguments.
- List<String> argumentNames = <String>[];
- arguments.forEach((arg) {
- if (arg is NamedExpression) {
- argumentNames.add(arg.name.label.name);
- _serialize(arg.expression);
- } else {
- _serialize(arg);
- }
- });
- // Add numbers of named and positional arguments, and the op-code.
- ints.add(argumentNames.length);
- strings.addAll(argumentNames);
- ints.add(arguments.length - argumentNames.length);
+ if (forConst) {
+ List<Expression> arguments = argumentList.arguments;
+ // Serialize the arguments.
+ List<String> argumentNames = <String>[];
+ arguments.forEach((arg) {
+ if (arg is NamedExpression) {
+ argumentNames.add(arg.name.label.name);
+ _serialize(arg.expression);
+ } else {
+ _serialize(arg);
+ }
+ });
+ // Add numbers of named and positional arguments, and the op-code.
+ ints.add(argumentNames.length);
+ strings.addAll(argumentNames);
+ ints.add(arguments.length - argumentNames.length);
+ } else {
+ ints.add(0);
+ ints.add(0);
+ }
}
void _serializeAssignment(AssignmentExpression expr) {
@@ -521,9 +538,13 @@ abstract class AbstractConstExprSerializer {
}
void _serializeListLiteral(ListLiteral expr) {
- List<Expression> elements = expr.elements;
- elements.forEach(_serialize);
- ints.add(elements.length);
+ if (forConst || expr.typeArguments == null) {
+ List<Expression> elements = expr.elements;
+ elements.forEach(_serialize);
+ ints.add(elements.length);
+ } else {
+ ints.add(0);
+ }
if (expr.typeArguments != null &&
expr.typeArguments.arguments.length == 1) {
references.add(serializeTypeName(expr.typeArguments.arguments[0]));
@@ -534,11 +555,15 @@ abstract class AbstractConstExprSerializer {
}
void _serializeMapLiteral(MapLiteral expr) {
- for (MapLiteralEntry entry in expr.entries) {
- _serialize(entry.key);
- _serialize(entry.value);
+ if (forConst || expr.typeArguments == null) {
+ for (MapLiteralEntry entry in expr.entries) {
+ _serialize(entry.key);
+ _serialize(entry.value);
+ }
+ ints.add(expr.entries.length);
+ } else {
+ ints.add(0);
}
- ints.add(expr.entries.length);
if (expr.typeArguments != null &&
expr.typeArguments.arguments.length == 2) {
references.add(serializeTypeName(expr.typeArguments.arguments[0]));

Powered by Google App Engine
This is Rietveld 408576698