Index: pkg/analyzer/lib/src/summary/format.dart |
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart |
index e5c4630303ee3ee0bc2db86ff0055caf9d09bb1b..98f53f17b0b5d9813a2b06d5ed48760b58313aea 100644 |
--- a/pkg/analyzer/lib/src/summary/format.dart |
+++ b/pkg/analyzer/lib/src/summary/format.dart |
@@ -1139,6 +1139,7 @@ class LinkedUnitBuilder extends Object with _LinkedUnitMixin implements idl.Link |
List<LinkedReferenceBuilder> _references; |
List<EntityRefBuilder> _types; |
+ List<int> _constCycles; |
@override |
List<LinkedReferenceBuilder> get references => _references ??= <LinkedReferenceBuilder>[]; |
@@ -1168,21 +1169,39 @@ class LinkedUnitBuilder extends Object with _LinkedUnitMixin implements idl.Link |
_types = _value; |
} |
- LinkedUnitBuilder({List<LinkedReferenceBuilder> references, List<EntityRefBuilder> types}) |
+ @override |
+ List<int> get constCycles => _constCycles ??= <int>[]; |
+ |
+ /** |
+ * List of slot ids (referring to [UnlinkedExecutable.constCycleSlot]) |
+ * corresponding to const constructors that are part of cycles. |
+ */ |
+ void set constCycles(List<int> _value) { |
+ assert(!_finished); |
+ assert(_value == null || _value.every((e) => e >= 0)); |
+ _constCycles = _value; |
+ } |
+ |
+ LinkedUnitBuilder({List<LinkedReferenceBuilder> references, List<EntityRefBuilder> types, List<int> constCycles}) |
: _references = references, |
- _types = types; |
+ _types = types, |
+ _constCycles = constCycles; |
fb.Offset finish(fb.Builder fbBuilder) { |
assert(!_finished); |
_finished = true; |
fb.Offset offset_references; |
fb.Offset offset_types; |
+ fb.Offset offset_constCycles; |
if (!(_references == null || _references.isEmpty)) { |
offset_references = fbBuilder.writeList(_references.map((b) => b.finish(fbBuilder)).toList()); |
} |
if (!(_types == null || _types.isEmpty)) { |
offset_types = fbBuilder.writeList(_types.map((b) => b.finish(fbBuilder)).toList()); |
} |
+ if (!(_constCycles == null || _constCycles.isEmpty)) { |
+ offset_constCycles = fbBuilder.writeListUint32(_constCycles); |
+ } |
fbBuilder.startTable(); |
if (offset_references != null) { |
fbBuilder.addOffset(0, offset_references); |
@@ -1190,6 +1209,9 @@ class LinkedUnitBuilder extends Object with _LinkedUnitMixin implements idl.Link |
if (offset_types != null) { |
fbBuilder.addOffset(1, offset_types); |
} |
+ if (offset_constCycles != null) { |
+ fbBuilder.addOffset(2, offset_constCycles); |
+ } |
return fbBuilder.endTable(); |
} |
} |
@@ -1208,6 +1230,7 @@ class _LinkedUnitImpl extends Object with _LinkedUnitMixin implements idl.Linked |
List<idl.LinkedReference> _references; |
List<idl.EntityRef> _types; |
+ List<int> _constCycles; |
@override |
List<idl.LinkedReference> get references { |
@@ -1220,6 +1243,12 @@ class _LinkedUnitImpl extends Object with _LinkedUnitMixin implements idl.Linked |
_types ??= const fb.ListReader<idl.EntityRef>(const _EntityRefReader()).vTableGet(_bp, 1, const <idl.EntityRef>[]); |
return _types; |
} |
+ |
+ @override |
+ List<int> get constCycles { |
+ _constCycles ??= const fb.Uint32ListReader().vTableGet(_bp, 2, const <int>[]); |
+ return _constCycles; |
+ } |
} |
abstract class _LinkedUnitMixin implements idl.LinkedUnit { |
@@ -1228,6 +1257,7 @@ abstract class _LinkedUnitMixin implements idl.LinkedUnit { |
Map<String, Object> _result = <String, Object>{}; |
if (references.isNotEmpty) _result["references"] = references.map((_value) => _value.toJson()).toList(); |
if (types.isNotEmpty) _result["types"] = types.map((_value) => _value.toJson()).toList(); |
+ if (constCycles.isNotEmpty) _result["constCycles"] = constCycles; |
return _result; |
} |
@@ -1235,6 +1265,7 @@ abstract class _LinkedUnitMixin implements idl.LinkedUnit { |
Map<String, Object> toMap() => { |
"references": references, |
"types": types, |
+ "constCycles": constCycles, |
}; |
@override |
@@ -3588,6 +3619,7 @@ class UnlinkedExecutableBuilder extends Object with _UnlinkedExecutableMixin imp |
List<UnlinkedTypeParamBuilder> _typeParameters; |
int _visibleLength; |
int _visibleOffset; |
+ int _constCycleSlot; |
@override |
List<UnlinkedConstBuilder> get annotations => _annotations ??= <UnlinkedConstBuilder>[]; |
@@ -3898,7 +3930,24 @@ class UnlinkedExecutableBuilder extends Object with _UnlinkedExecutableMixin imp |
_visibleOffset = _value; |
} |
- UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, List<UnlinkedConstructorInitializerBuilder> constantInitializers, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isConst, bool isExternal, bool isFactory, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset}) |
+ @override |
+ int get constCycleSlot => _constCycleSlot ??= 0; |
+ |
+ /** |
+ * If [kind] is [UnlinkedExecutableKind.constructor] and [isConst] is `true`, |
+ * a nonzero slot id which is unique within this compilation unit. If this id |
+ * is found in [LinkedUnit.constCycles], then this constructor is part of a |
+ * cycle. |
+ * |
+ * Otherwise, zero. |
+ */ |
+ void set constCycleSlot(int _value) { |
+ assert(!_finished); |
+ assert(_value == null || _value >= 0); |
+ _constCycleSlot = _value; |
+ } |
+ |
+ UnlinkedExecutableBuilder({List<UnlinkedConstBuilder> annotations, List<UnlinkedConstructorInitializerBuilder> constantInitializers, UnlinkedDocumentationCommentBuilder documentationComment, int inferredReturnTypeSlot, bool isAbstract, bool isConst, bool isExternal, bool isFactory, bool isRedirectedConstructor, bool isStatic, idl.UnlinkedExecutableKind kind, List<UnlinkedExecutableBuilder> localFunctions, List<UnlinkedLabelBuilder> localLabels, List<UnlinkedVariableBuilder> localVariables, String name, int nameEnd, int nameOffset, List<UnlinkedParamBuilder> parameters, int periodOffset, EntityRefBuilder redirectedConstructor, String redirectedConstructorName, EntityRefBuilder returnType, List<UnlinkedTypeParamBuilder> typeParameters, int visibleLength, int visibleOffset, int constCycleSlot}) |
: _annotations = annotations, |
_constantInitializers = constantInitializers, |
_documentationComment = documentationComment, |
@@ -3923,7 +3972,8 @@ class UnlinkedExecutableBuilder extends Object with _UnlinkedExecutableMixin imp |
_returnType = returnType, |
_typeParameters = typeParameters, |
_visibleLength = visibleLength, |
- _visibleOffset = visibleOffset; |
+ _visibleOffset = visibleOffset, |
+ _constCycleSlot = constCycleSlot; |
fb.Offset finish(fb.Builder fbBuilder) { |
assert(!_finished); |
@@ -4052,6 +4102,9 @@ class UnlinkedExecutableBuilder extends Object with _UnlinkedExecutableMixin imp |
if (_visibleOffset != null && _visibleOffset != 0) { |
fbBuilder.addUint32(21, _visibleOffset); |
} |
+ if (_constCycleSlot != null && _constCycleSlot != 0) { |
+ fbBuilder.addUint32(25, _constCycleSlot); |
+ } |
return fbBuilder.endTable(); |
} |
} |
@@ -4093,6 +4146,7 @@ class _UnlinkedExecutableImpl extends Object with _UnlinkedExecutableMixin imple |
List<idl.UnlinkedTypeParam> _typeParameters; |
int _visibleLength; |
int _visibleOffset; |
+ int _constCycleSlot; |
@override |
List<idl.UnlinkedConst> get annotations { |
@@ -4243,6 +4297,12 @@ class _UnlinkedExecutableImpl extends Object with _UnlinkedExecutableMixin imple |
_visibleOffset ??= const fb.Uint32Reader().vTableGet(_bp, 21, 0); |
return _visibleOffset; |
} |
+ |
+ @override |
+ int get constCycleSlot { |
+ _constCycleSlot ??= const fb.Uint32Reader().vTableGet(_bp, 25, 0); |
+ return _constCycleSlot; |
+ } |
} |
abstract class _UnlinkedExecutableMixin implements idl.UnlinkedExecutable { |
@@ -4274,6 +4334,7 @@ abstract class _UnlinkedExecutableMixin implements idl.UnlinkedExecutable { |
if (typeParameters.isNotEmpty) _result["typeParameters"] = typeParameters.map((_value) => _value.toJson()).toList(); |
if (visibleLength != 0) _result["visibleLength"] = visibleLength; |
if (visibleOffset != 0) _result["visibleOffset"] = visibleOffset; |
+ if (constCycleSlot != 0) _result["constCycleSlot"] = constCycleSlot; |
return _result; |
} |
@@ -4304,6 +4365,7 @@ abstract class _UnlinkedExecutableMixin implements idl.UnlinkedExecutable { |
"typeParameters": typeParameters, |
"visibleLength": visibleLength, |
"visibleOffset": visibleOffset, |
+ "constCycleSlot": constCycleSlot, |
}; |
@override |