Elements. Remove VariableFragmentImpl.type

Elements, not fragments, have types.

Change-Id: I2d1be6b03661f0a6bb76d61d3c00914d3c1253ee
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/440040
Reviewed-by: Samuel Rawlins <srawlins@google.com>
This commit is contained in:
Konstantin Shcheglov
2025-07-12 20:15:55 -07:00
parent 53985966cf
commit 9e76913938
15 changed files with 17 additions and 102 deletions
@@ -109,7 +109,7 @@ testFineAfterLibraryAnalyzerHook;
// TODO(scheglov): Clean up the list of implicitly analyzed files.
class AnalysisDriver {
/// The version of data format, should be incremented on every format change.
static const int DATA_VERSION = 499;
static const int DATA_VERSION = 502;
/// The number of exception contexts allowed to write. Once this field is
/// zero, we stop writing any new exception contexts in this process.
@@ -187,7 +187,7 @@ class ElementDisplayStringBuilder {
_writeTypeParameters(element.typeParameters);
_write('(');
_writeType(element.representation.type);
_writeType(element.representation.element.type);
_write(' ');
_write(element.representation.name ?? '<null-name}>');
_write(')');
@@ -431,7 +431,7 @@ class ElementDisplayStringBuilder {
}
void writeVariableElement(VariableFragmentImpl element) {
_writeType(element.type);
_writeType(element.element.type);
_write(' ');
_write(element.displayName);
}
@@ -497,9 +497,7 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
formalParameterFragment,
);
formalParameterElements.add(formalParameterElement);
formalParameterElement.type = superFormalParameter.type;
formalParameterFragment.type = superFormalParameter.type;
superInvocationArguments.add(
SimpleIdentifierImpl(
@@ -9026,7 +9024,6 @@ abstract class PropertyInducingElementImpl extends VariableElementImpl
var type = firstFragment.typeInference?.perform();
type ??= InvalidTypeImpl.instance;
_type = type;
firstFragment._type = type;
shouldUseTypeForInitializerInference = false;
// TODO(scheglov): We repeat this code.
@@ -9041,9 +9038,6 @@ abstract class PropertyInducingElementImpl extends VariableElementImpl
setterElement.firstFragment.returnType = VoidTypeImpl.instance;
(setterElement.formalParameters.single as FormalParameterElementImpl)
.type = type;
(setterElement.formalParameters.single as FormalParameterElementImpl)
.firstFragment
.type = type;
}
}
@@ -9132,12 +9126,6 @@ abstract class PropertyInducingFragmentImpl
@Deprecated('Use metadata instead')
@override
MetadataImpl get metadata2 => metadata;
@override
TypeImpl get type {
_ensureReadResolution();
return _type!;
}
}
/// Common base class for all analyzer-internal classes that implement
@@ -10537,9 +10525,6 @@ abstract class VariableElementImpl extends ElementImpl
abstract class VariableFragmentImpl extends FragmentImpl
implements AnnotatableFragmentImpl, VariableFragment {
/// The type of this variable.
TypeImpl? _type;
/// If this element represents a constant variable, and it has an initializer,
/// a copy of the initializer for the constant. Otherwise `null`.
///
@@ -10655,18 +10640,6 @@ abstract class VariableFragmentImpl extends FragmentImpl
throw StateError('($runtimeType) $this');
}
/// The declared type of this variable.
// TODO(scheglov): make it nullable and turn into field
TypeImpl get type => _type!;
set type(TypeImpl type) {
_type = type;
}
/// The declared type of this variable.
// TODO(scheglov): turn into field
TypeImpl? get type2 => _type;
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeVariableElement(this);
@@ -1031,7 +1031,6 @@ class InheritanceManager3 {
assert(fieldReference.element == null);
FieldElementImpl(reference: fieldReference, firstFragment: resultField);
resultField.type = executable.formalParameters[0].type;
return result;
}
@@ -1162,11 +1161,9 @@ class InheritanceManager3 {
resultFragment.element.variable = fieldElement;
if (firstElement is GetterElement) {
field.type = resultFragment.returnType;
fieldElement.type = resultFragment.returnType;
} else {
var type = resultFragment.parameters[0].element.type;
field.type = type;
fieldElement.type = type;
}
@@ -114,7 +114,6 @@ class FunctionExpressionResolver {
}
if (inferredType is! DynamicType) {
p.type = inferredType;
p.firstFragment.type = inferredType;
}
}
}
@@ -247,7 +247,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
fragment.hasImplicitType = true;
fragment.element.type = _typeProvider.objectType;
} else {
fragment.type = exceptionTypeNode.typeOrThrow;
fragment.element.type = exceptionTypeNode.typeOrThrow;
}
@@ -398,7 +397,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
if (node.type case var typeNode?) {
typeNode.accept(this);
fragment.type = typeNode.typeOrThrow;
fragment.element.type = typeNode.typeOrThrow;
} else {
fragment.hasImplicitType = true;
@@ -426,7 +424,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
_define(fragment.element);
fragment.hasImplicitType = node.type == null;
if (node.type case var typeNode?) {
fragment.type = typeNode.typeOrThrow;
fragment.element.type = typeNode.typeOrThrow;
}
node.declaredFragment = fragment;
@@ -667,7 +664,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
} else {
// Only for recovery, this should not happen in valid code.
fragment.element.type = node.type?.type ?? _dynamicType;
fragment.type = node.type?.type ?? _dynamicType;
_withElementWalker(null, () {
node.parameters?.accept(this);
});
@@ -895,7 +891,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
nullabilitySuffix: _getNullability(node.question != null),
);
fragment.element.type = type;
fragment.type = type;
}
});
},
@@ -1274,7 +1269,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
node.type?.accept(this);
if (_elementWalker == null) {
fragment.element.type = node.type?.type ?? _dynamicType;
fragment.type = node.type?.type ?? _dynamicType;
}
_setOrCreateMetadataElements(fragment, node.metadata);
@@ -1332,7 +1326,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
} else {
// Only for recovery, this should not happen in valid code.
element.element.type = node.type?.type ?? _dynamicType;
element.type = node.type?.type ?? _dynamicType;
_withElementWalker(null, () {
node.parameters?.accept(this);
});
@@ -1445,7 +1438,6 @@ class ResolutionVisitor extends RecursiveAstVisitor<void> {
localFragment.hasInitializer = initializerNode != null;
if (varList.type case var typeNode?) {
var type = typeNode.typeOrThrow;
localFragment.type = type;
localFragment.element.type = type;
} else {
localFragment.hasImplicitType = true;
@@ -2028,9 +2020,7 @@ class _VariableBinder
),
),
);
resultFragment
..enclosingFragment = first.firstFragment.enclosingFragment
..type = InvalidTypeImpl.instance;
resultFragment.enclosingFragment = first.firstFragment.enclosingFragment;
return resultFragment.element;
}
@@ -436,7 +436,6 @@ class AstBinaryReader {
}
node.declaredFragment = fragment;
fragment.element.type = nonDefaultElement.element.type;
fragment.type = nonDefaultElement.element.type;
return node;
}
@@ -1227,7 +1226,6 @@ class AstBinaryReader {
parameterKind: node.kind,
);
fragment.element.type = actualType;
fragment.type = actualType;
node.declaredFragment = fragment;
return node;
@@ -727,7 +727,6 @@ class LibraryReader {
reader._addTypeParameters2(enclosingElement.typeParameters);
_readFragmentMetadata(fragment, reader);
fragment.type = reader.readRequiredType();
if (reader.readOptionalExpression() case var initializer?) {
fragment.constantInitializer = initializer;
ConstantContextForExpressionImpl(fragment, initializer);
@@ -748,8 +747,6 @@ class LibraryReader {
_readFormalParameters2(unitElement, reader, parameter.parameters);
var type = reader.readType() ?? InvalidTypeImpl.instance;
parameter.element.type = type;
// TODO(scheglov): make the `type` property optional
parameter.type = type;
parameter.constantInitializer = reader.readOptionalExpression();
if (parameter is FieldFormalParameterFragmentImpl) {
// TODO(scheglov): use element
@@ -1295,7 +1292,6 @@ class LibraryReader {
readResolution: (fragment, reader) {
reader.currentLibraryFragment = fragment.libraryFragment;
_readFragmentMetadata(fragment, reader);
fragment.type = reader.readRequiredType();
if (reader.readOptionalExpression() case var initializer?) {
fragment.constantInitializer = initializer;
ConstantContextForExpressionImpl(fragment, initializer);
@@ -1809,7 +1805,6 @@ class ResolutionReader {
parameterKind: kind,
);
element.element.type = type;
element.type = type;
} else {
element = FormalParameterFragmentImpl(
firstTokenOffset: null,
@@ -1818,7 +1813,6 @@ class ResolutionReader {
parameterKind: kind,
);
element.element.type = type;
element.type = type;
}
element.hasImplicitType = hasImplicitType;
element.typeParameters = typeParameters;
@@ -422,7 +422,6 @@ class BundleWriter {
void _writeFieldFragment(FieldFragmentImpl fragment) {
_writeTemplateFragment(fragment, () {
_resolutionSink._writeMetadata(fragment.metadata);
_resolutionSink.writeType(fragment.type);
_resolutionSink._writeOptionalNode(fragment.constantInitializer);
});
}
@@ -644,7 +643,7 @@ class BundleWriter {
_writeTypeParameters(element.typeParameters, () {
_writeList(element.parameters, _writeParameterElement);
_resolutionSink.writeType(element.type2);
_resolutionSink.writeType(element.element.type);
_resolutionSink._writeOptionalNode(element.constantInitializer);
if (element is FieldFormalParameterFragmentImpl) {
@@ -741,7 +740,6 @@ class BundleWriter {
void _writeTopLevelVariableFragment(TopLevelVariableFragmentImpl fragment) {
_writeTemplateFragment(fragment, () {
_resolutionSink._writeMetadata(fragment.metadata);
_resolutionSink.writeType(fragment.type);
_resolutionSink._writeOptionalNode(fragment.constantInitializer);
});
}
@@ -1011,7 +1009,7 @@ class ResolutionSink extends _SummaryDataWriter {
writeBool(parameter.hasImplicitType);
writeBool(parameter.isInitializingFormal);
_writeTypeParameters(parameter.typeParameters, () {
writeType(parameter.type);
writeType(parameter.element.type);
_writeFragmentName(parameter);
_writeFormalParameters(
parameter.parameters,
@@ -156,7 +156,6 @@ class _Node extends graph.Node<_Node> {
var representationFragment = element.firstFragment.representation;
var representationElement = representationFragment.element;
representationFragment.type = type;
representationElement.type = type;
// TODO(scheglov): we repeat similar code in many places
representationElement.getter!.returnType = type;
@@ -179,10 +179,8 @@ class InstanceMemberInferrer {
var returnType = combinedGetterType();
accessor.returnType = returnType;
accessor.element.returnType = returnType;
// TODO(scheglov): store type in FieldElementImpl itself
var fieldElement = accessor.element.variable as FieldElementImpl;
fieldElement.type = returnType;
fieldElement.firstFragment.type = returnType;
return;
}
@@ -194,10 +192,8 @@ class InstanceMemberInferrer {
var returnType = combinedSetterType();
accessor.returnType = returnType;
accessor.element.returnType = returnType;
// TODO(scheglov): store type in FieldElementImpl itself
var fieldElement = accessor.element.variable as FieldElementImpl;
fieldElement.type = returnType;
fieldElement.firstFragment.type = returnType;
return;
}
@@ -226,11 +222,9 @@ class InstanceMemberInferrer {
if (overriddenGetters.isNotEmpty && overriddenSetters.isEmpty) {
var valueType = combinedGetterType();
parameter.element.type = valueType;
parameter.type = valueType;
var fieldElement = accessor.element.variable as FieldElementImpl;
if (fieldElement.getter == null) {
fieldElement.type = valueType;
fieldElement.firstFragment.type = valueType;
}
return;
}
@@ -246,7 +240,6 @@ class InstanceMemberInferrer {
if (overriddenSetters.isNotEmpty) {
var valueType = combinedSetterType();
parameter.element.type = valueType;
parameter.type = valueType;
var fieldElement = accessor.element.variable as FieldElementImpl;
fieldElement.type = valueType;
return;
@@ -399,16 +392,13 @@ class InstanceMemberInferrer {
var field = parameter.field;
if (field != null) {
parameter.element.type = field.element.type;
parameter.type = field.element.type;
}
} else if (parameter is SuperFormalParameterFragmentImpl) {
var superParameter = parameter.element.superConstructorParameter;
if (superParameter != null) {
parameter.element.type = superParameter.type;
parameter.type = superParameter.type;
} else {
parameter.element.type = DynamicTypeImpl.instance;
parameter.type = DynamicTypeImpl.instance;
}
}
}
@@ -548,7 +538,6 @@ class InstanceMemberInferrer {
(parameter, baseParameter) {
var type = substitution.substituteType(baseParameter.type);
parameter.type = type;
parameter.firstFragment.type = type;
},
);
// Update arguments of `SuperConstructorInvocation` to have the types
@@ -601,14 +590,11 @@ class InstanceMemberInferrer {
);
if (matchingParameter != null) {
parameter.element.type = matchingParameter.type;
parameter.type = matchingParameter.type;
} else {
parameter.element.type = DynamicTypeImpl.instance;
parameter.type = DynamicTypeImpl.instance;
}
} else {
parameter.element.type = DynamicTypeImpl.instance;
parameter.type = DynamicTypeImpl.instance;
}
}
@@ -794,7 +780,6 @@ class InstanceMemberInferrer {
}
static void _setFieldType(FieldFragmentImpl field, TypeImpl type) {
field.type = type;
field.element.type = type;
// TODO(scheglov): We repeat this code.
field.element.getter?.returnType = type;
@@ -805,7 +790,6 @@ class InstanceMemberInferrer {
setterElement.returnType = VoidTypeImpl.instance;
setterElement.firstFragment.returnType = VoidTypeImpl.instance;
setterElement.valueFormalParameter.type = type;
setterElement.valueFormalParameter.firstFragment.type = type;
}
}
}
@@ -213,7 +213,6 @@ class LibraryBuilder {
),
);
enum_.valuesTypeNode.type = valuesType;
enum_.valuesElement.type = valuesType;
enum_.valuesElement.element.type = valuesType;
// TODO(scheglov): We repeat this code.
enum_.valuesElement.element.getter!.returnType = valuesType;
@@ -184,7 +184,6 @@ class TypesBuilder {
case GetterElementImpl():
element.returnType = returnType;
(element.variable as TopLevelVariableElementImpl).type = returnType;
element.variable!.firstFragment.type = returnType;
case SetterElementImpl():
element.returnType = returnType;
var valueElement =
@@ -196,13 +195,10 @@ class TypesBuilder {
var valueNodeType = valueNodeElement?.type;
var valueType = valueNodeType ?? InvalidTypeImpl.instance;
valueElement?.type = valueType;
valueElement?.firstFragment.type = valueType;
var variableElement =
element.variable as TopLevelVariableElementImpl;
var variableElement = element.variable as TopLevelVariableElementImpl;
if (variableElement.isSynthetic) {
variableElement.type = valueType;
variableElement.firstFragment.type = valueType;
}
case TopLevelFunctionElementImpl():
element.returnType = returnType;
@@ -233,7 +229,6 @@ class TypesBuilder {
case GetterElementImpl():
element.returnType = returnType;
(element.variable as FieldElementImpl).type = returnType;
element.variable!.firstFragment.type = returnType;
case SetterElementImpl():
element.returnType = returnType;
var valueElement =
@@ -244,12 +239,10 @@ class TypesBuilder {
var valueNodeType = valueNodeElement?.type;
var valueType = valueNodeType ?? InvalidTypeImpl.instance;
valueElement?.type = valueType;
valueElement?.firstFragment.type = valueType;
var variableElement = element.variable as FieldElementImpl;
if (variableElement.isSynthetic && variableElement.getter == null) {
variableElement.type = valueType;
variableElement.firstFragment.type = valueType;
}
case MethodElementImpl():
element.returnType = returnType;
@@ -259,7 +252,6 @@ class TypesBuilder {
} else if (node is SimpleFormalParameterImpl) {
var fragment = node.declaredFragment!;
fragment.element.type = node.type?.type ?? _dynamicType;
fragment.type = node.type?.type ?? _dynamicType;
} else if (node is SuperFormalParameterImpl) {
_superFormalParameter(node);
} else if (node is TypeParameterImpl) {
@@ -270,7 +262,6 @@ class TypesBuilder {
for (var variable in node.variables) {
var variableFragment = variable.declaredFragment!;
var variableElement = variableFragment.element;
variableFragment.type = type;
variableElement.type = type;
if (variableElement is PropertyInducingElementImpl) {
if (variableElement.getter case var getterElement?) {
@@ -283,10 +274,6 @@ class TypesBuilder {
(setterElement.formalParameters.single
as FormalParameterElementImpl)
.type = type;
(setterElement.formalParameters.single
as FormalParameterElementImpl)
.firstFragment
.type = type;
}
}
}
@@ -342,10 +329,8 @@ class TypesBuilder {
_nullability(node, node.question != null),
);
fragment.element.type = type;
fragment.type = type;
} else {
fragment.element.type = node.type?.type ?? _dynamicType;
fragment.type = node.type?.type ?? _dynamicType;
}
}
@@ -373,7 +358,6 @@ class TypesBuilder {
);
var fragment = node.declaredFragment!;
fragment.element.type = type;
fragment.type = type;
}
void _genericFunctionType(GenericFunctionTypeImpl node) {
@@ -429,10 +413,8 @@ class TypesBuilder {
_nullability(node, node.question != null),
);
fragment.element.type = type;
fragment.type = type;
} else {
fragment.element.type = node.type?.type ?? _dynamicType;
fragment.type = node.type?.type ?? _dynamicType;
}
}
@@ -1049,7 +1049,7 @@ class _MockSdkElementsBuilder {
element.setter = setterElement;
}
fragment.type = type;
element.type = type;
return fragment;
}
@@ -1096,7 +1096,7 @@ class _MockSdkElementsBuilder {
);
fieldFragment.isStatic = isStatic;
fieldFragment.isSynthetic = true;
fieldFragment.type = type;
fieldElement.type = type;
var getterFragment = GetterFragmentImpl(name: name, firstTokenOffset: null);
var getterElement = GetterElementImpl(Reference.root(), getterFragment);
@@ -1273,7 +1273,7 @@ class _MockSdkElementsBuilder {
..isSynthetic = true;
var getterElement = GetterElementImpl(Reference.root(), getterFragment);
element.getter = getterElement;
fragment.type = type;
element.type = type;
return fragment;
}
@@ -247,13 +247,16 @@ mixin ElementsTypesMixin {
fragment.typeParameters = typeParameters.map((e) => e.asElement).toList();
fragment.interfaces = interfaces;
var field = FieldFragmentImpl(
var fieldFragment = FieldFragmentImpl(
name: representationName,
firstTokenOffset: null,
);
FieldElementImpl(reference: Reference.root(), firstFragment: field);
field.type = representationType;
fragment.fields = [field];
var fieldElement = FieldElementImpl(
reference: Reference.root(),
firstFragment: fieldFragment,
);
fieldElement.type = representationType;
fragment.fields = [fieldFragment];
fragment.typeErasure = representationType;
@@ -281,7 +284,6 @@ mixin ElementsTypesMixin {
name: representationName,
firstTokenOffset: null,
);
fieldFragment.type = representationType;
fragment.fields = [fieldFragment];
var fieldElement = FieldElementImpl(