@@ -288,6 +288,18 @@ class _Element2Writer extends _AbstractElementWriter {
288288 expect (element.nonSynthetic2, same (element));
289289 }
290290
291+ void _writeConstantInitializerExpression (String name, Expression expression) {
292+ if (_idMap.existingExpressionId (expression) case var id? ) {
293+ _sink.writelnWithIndent ('$name : $id ' );
294+ } else {
295+ var id = _idMap[expression];
296+ _sink.writelnWithIndent ('$name : $id ' );
297+ _sink.withIndent (() {
298+ _writeNode (expression);
299+ });
300+ }
301+ }
302+
291303 void _writeConstructorElement (ConstructorElement2 e) {
292304 // Check that the reference exists, and filled with the element.
293305 // var reference = e.reference;
@@ -510,6 +522,7 @@ class _Element2Writer extends _AbstractElementWriter {
510522 }
511523
512524 void _writeFieldElement (FieldElement2 e) {
525+ e as FieldElement2OrMember ;
513526 DartType type = e.type;
514527 expect (type, isNotNull);
515528
@@ -565,7 +578,7 @@ class _Element2Writer extends _AbstractElementWriter {
565578 // _writeTypeInferenceError(e);
566579 _writeType ('type' , e.type);
567580 // _writeShouldUseTypeForInitializerInference(e);
568- // _writeConstantInitializer (e);
581+ _writeVariableElementConstantInitializer (e);
569582 // _writeNonSyntheticElement(e);
570583 // writeLinking();
571584 _writeElementReference ('getter' , e.getter2);
@@ -623,7 +636,7 @@ class _Element2Writer extends _AbstractElementWriter {
623636 // _writeTypeInferenceError(f);
624637 // _writeType('type', f.type);
625638 // _writeShouldUseTypeForInitializerInference(f);
626- // _writeConstantInitializer (f);
639+ _writeVariableFragmentConstantInitializer (f);
627640 // _writeNonSyntheticElement(f);
628641 // writeLinking();
629642 _writeFragmentReference ('previousFragment' , f.previousFragment);
@@ -634,6 +647,7 @@ class _Element2Writer extends _AbstractElementWriter {
634647 }
635648
636649 void _writeFormalParameterElement (FormalParameterElement e) {
650+ e as FormalParameterElementMixin ;
637651 // if (e.isNamed && e.enclosingElement2 is ExecutableElement) {
638652 // expect(e.reference, isNotNull);
639653 // } else {
@@ -688,7 +702,7 @@ class _Element2Writer extends _AbstractElementWriter {
688702 e.formalParameters,
689703 _writeFormalParameterElement,
690704 );
691- // _writeConstantInitializer (e);
705+ _writeVariableElementConstantInitializer (e);
692706 // _writeNonSyntheticElement(e);
693707 // _writeFieldFormalParameterField(e);
694708 // _writeSuperConstructorParameter(e);
@@ -739,7 +753,7 @@ class _Element2Writer extends _AbstractElementWriter {
739753 // _writeCodeRange(f);
740754 // _writeTypeParameterElements(e.typeParameters);
741755 // _writeFragmentList('parameters', f, f.parameters2, _writeFormalParameterFragments);
742- // _writeConstantInitializer(e );
756+ _writeVariableFragmentConstantInitializer (f );
743757 // _writeNonSyntheticElement(e);
744758 // _writeFieldFormalParameterField(e);
745759 // _writeSuperConstructorParameter(e);
@@ -1626,7 +1640,7 @@ class _Element2Writer extends _AbstractElementWriter {
16261640 // _writeTypeInferenceError(e);
16271641 _writeType ('type' , e.type);
16281642 // _writeShouldUseTypeForInitializerInference(e);
1629- // _writeConstantInitializer (e);
1643+ _writeVariableElementConstantInitializer (e);
16301644 // _writeNonSyntheticElement(e);
16311645 // writeLinking();
16321646 _writeElementReference ('getter' , e.getter2);
@@ -1682,7 +1696,7 @@ class _Element2Writer extends _AbstractElementWriter {
16821696 // _writeTypeInferenceError(f);
16831697 // _writeType('type', f.type);
16841698 // _writeShouldUseTypeForInitializerInference(f);
1685- // _writeConstantInitializer (f);
1699+ _writeVariableFragmentConstantInitializer (f);
16861700 // _writeNonSyntheticElement(f);
16871701 // writeLinking();
16881702 _writeFragmentReference ('previousFragment' , f.previousFragment);
@@ -1828,6 +1842,25 @@ class _Element2Writer extends _AbstractElementWriter {
18281842
18291843 // _assertNonSyntheticElementSelf(f);
18301844 }
1845+
1846+ void _writeVariableElementConstantInitializer (VariableElement2OrMember e) {
1847+ if (e.constantInitializer2 case var initializer? ) {
1848+ _sink.writelnWithIndent ('constantInitializer' );
1849+ _sink.withIndent (() {
1850+ _writeFragmentReference ('fragment' , initializer.fragment);
1851+ _writeConstantInitializerExpression (
1852+ 'expression' ,
1853+ initializer.expression,
1854+ );
1855+ });
1856+ }
1857+ }
1858+
1859+ void _writeVariableFragmentConstantInitializer (VariableFragment f) {
1860+ if (f.constantInitializer2 case var initializer? ) {
1861+ _writeConstantInitializerExpression ('constantInitializer' , initializer);
1862+ }
1863+ }
18311864}
18321865
18331866/// Writes the canonical text presentation of elements.
@@ -2943,24 +2976,31 @@ class _ElementWriter extends _AbstractElementWriter {
29432976}
29442977
29452978class _IdMap {
2979+ final Map <Expression , String > expressionMap = Map .identity ();
29462980 final Map <Element , String > fieldMap = Map .identity ();
29472981 final Map <Element , String > getterMap = Map .identity ();
29482982 final Map <Element , String > partMap = Map .identity ();
29492983 final Map <Element , String > setterMap = Map .identity ();
29502984
2951- String operator [](Element element) {
2952- if (element is FieldElement ) {
2953- return fieldMap[element] ?? = 'field_${fieldMap .length }' ;
2954- } else if (element is TopLevelVariableElement ) {
2955- return fieldMap[element] ?? = 'variable_${fieldMap .length }' ;
2956- } else if (element is PropertyAccessorElement && element.isGetter) {
2957- return getterMap[element] ?? = 'getter_${getterMap .length }' ;
2958- } else if (element is PartElementImpl ) {
2959- return partMap[element] ?? = 'part_${partMap .length }' ;
2960- } else if (element is PropertyAccessorElement && element.isSetter) {
2961- return setterMap[element] ?? = 'setter_${setterMap .length }' ;
2985+ String operator [](Object object) {
2986+ if (object is Expression ) {
2987+ return expressionMap[object] ?? = 'expression_${expressionMap .length }' ;
2988+ } else if (object is FieldElement ) {
2989+ return fieldMap[object] ?? = 'field_${fieldMap .length }' ;
2990+ } else if (object is TopLevelVariableElement ) {
2991+ return fieldMap[object] ?? = 'variable_${fieldMap .length }' ;
2992+ } else if (object is PropertyAccessorElement && object.isGetter) {
2993+ return getterMap[object] ?? = 'getter_${getterMap .length }' ;
2994+ } else if (object is PartElementImpl ) {
2995+ return partMap[object] ?? = 'part_${partMap .length }' ;
2996+ } else if (object is PropertyAccessorElement && object.isSetter) {
2997+ return setterMap[object] ?? = 'setter_${setterMap .length }' ;
29622998 } else {
29632999 return '???' ;
29643000 }
29653001 }
3002+
3003+ String ? existingExpressionId (Expression object) {
3004+ return expressionMap[object];
3005+ }
29663006}
0 commit comments