Change display_string_test to reflect new element model.

Delete `getDisplayString()`

Remove most `displayString()` overrides from `ElementImpl's` subclasses.

Add more precise `appendTo()` for most `ElementImpl` subclasses.

Change-Id: Ic955721f0698d2472a6bf56e7955490e8ccf4eaf
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/439544
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Fedor Shcheglov
2025-07-14 12:49:29 -07:00
committed by Commit Queue
parent f62f65b495
commit 5e057f9895
6 changed files with 198 additions and 457 deletions
@@ -1762,7 +1762,7 @@ typedef A = void Function(int);
var hover = await prepareHover('A');
_assertHover(
hover,
elementDescription: 'typedef A = void Function(int )',
elementDescription: 'typedef A = void Function(int)',
elementKind: 'type alias',
);
}
@@ -36,19 +36,11 @@ class ElementDisplayStringBuilder {
@override
String toString() => _buffer.toString();
void writeAbstractElement(FragmentImpl element) {
void writeAbstractElement(ElementImpl element) {
_write(element.name ?? '<unnamed ${element.runtimeType}>');
}
void writeAbstractElement2(ElementImpl element) {
_write(element.name ?? '<unnamed ${element.runtimeType}>');
}
void writeClassElement(ClassFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeClassElement(ClassElementImpl element) {
if (element.isSealed) {
_write('sealed ');
} else if (element.isAbstract) {
@@ -68,23 +60,17 @@ class ElementDisplayStringBuilder {
_write('class ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
_writeTypeParameters2(element.typeParameters);
_writeTypeIfNotObject(' extends ', element.supertype);
_writeTypesIfNotEmpty(' with ', element.mixins);
_writeTypesIfNotEmpty(' implements ', element.interfaces);
}
void writeCompilationUnitElement(LibraryFragmentImpl element) {
var path = element.source.fullName;
_write(path);
}
void writeConstructorElement(ConstructorElementMixin2 element) {
_writeType(element.returnType);
_write(' ');
_write(element.displayName);
_write(' ${element.displayName}');
_writeFormalParameters2(
element.formalParameters,
@@ -93,31 +79,18 @@ class ElementDisplayStringBuilder {
);
}
void writeConstructorFragment(ConstructorFragmentImpl element) {
_writeType(element.element.returnType);
_write(' ');
_write(element.displayName);
_writeFormalParameters(
element.parameters,
forElement: true,
allowMultiline: true,
);
void writeDynamicElement(DynamicElementImpl element) {
_write('dynamic');
}
void writeDynamicType() {
_write('dynamic');
}
void writeEnumElement(EnumFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeEnumElement(EnumElementImpl element) {
_write('enum ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
_writeTypeParameters2(element.typeParameters);
_writeTypesIfNotEmpty(' with ', element.mixins);
_writeTypesIfNotEmpty(' implements ', element.interfaces);
}
@@ -140,54 +113,23 @@ class ElementDisplayStringBuilder {
}
}
void writeExecutableFragment(ExecutableFragmentImpl fragment, String name) {
if (fragment.isAugmentation) {
_write('augment ');
}
if (fragment is! SetterFragmentImpl) {
_writeType(fragment.element.returnType);
_write(' ');
}
_write(name);
if (fragment is! GetterFragmentImpl) {
_writeTypeParameters(fragment.typeParameters);
_writeFormalParameters(
fragment.parameters,
forElement: true,
allowMultiline: true,
);
}
}
void writeExtensionElement(ExtensionFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeExtensionElement(ExtensionElementImpl element) {
_write('extension');
if (element.displayName.isNotEmpty) {
_write(' ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
if (element.name case var name?) {
_write(' $name');
}
_writeTypeParameters2(element.typeParameters);
_write(' on ');
_writeType(element.extendedType);
}
void writeExtensionTypeElement(ExtensionTypeFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeExtensionTypeElement(ExtensionTypeElementImpl element) {
_write('extension type ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
_writeTypeParameters2(element.typeParameters);
_write('(');
_writeType(element.representation.element.type);
_writeType(element.representation.type);
_write(' ');
_write(element.representation.name ?? '<null-name}>');
_write(')');
@@ -195,21 +137,7 @@ class ElementDisplayStringBuilder {
_writeTypesIfNotEmpty(' implements ', element.interfaces);
}
void writeFormalParameter(FormalParameterFragmentImpl element) {
if (element.isRequiredPositional) {
_writeWithoutDelimiters(element, forElement: true);
} else if (element.isOptionalPositional) {
_write('[');
_writeWithoutDelimiters(element, forElement: true);
_write(']');
} else if (element.isNamed) {
_write('{');
_writeWithoutDelimiters(element, forElement: true);
_write('}');
}
}
void writeFormalParameter2(FormalParameterElementMixin element) {
void writeFormalParameterElement(FormalParameterElementMixin element) {
if (element.isRequiredPositional) {
_writeWithoutDelimiters2(element, forElement: true);
} else if (element.isOptionalPositional) {
@@ -237,13 +165,15 @@ class ElementDisplayStringBuilder {
_writeNullability(type.nullabilitySuffix);
}
void writeGenericFunctionTypeElement(
GenericFunctionTypeFragmentImpl element,
) {
void writeGenericFunctionTypeElement(GenericFunctionTypeElementImpl element) {
_writeType(element.returnType);
_write(' Function');
_writeTypeParameters(element.typeParameters);
_writeFormalParameters(element.parameters, forElement: true);
_writeTypeParameters2(element.typeParameters);
_writeFormalParameters2(element.formalParameters.cast(), forElement: true);
}
void writeGetterElement(GetterElementImpl element) {
writeExecutableElement(element, 'get ${element.displayName}');
}
void writeInterfaceType(InterfaceType type) {
@@ -260,6 +190,10 @@ class ElementDisplayStringBuilder {
_write('InvalidType');
}
void writeLabelElement(LabelElementImpl element) {
_write(element.name ?? '<null-name>');
}
void writeLibraryElement(LibraryElementImpl element) {
_write('library ');
_write('${element.source.uri}');
@@ -275,20 +209,40 @@ class ElementDisplayStringBuilder {
_writeDirectiveUri(element.uri);
}
void writeMixinElement(MixinFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeLocalFunctionElement(LocalFunctionElementImpl element) {
_writeType(element.returnType);
_write(element.name ?? ' <null-name>');
_writeTypeParameters2(element.typeParameters);
_writeFormalParameters2(element.formalParameters, forElement: true);
}
void writeMethodElement(MethodElementImpl element) {
_writeType(element.returnType);
_write(' ');
_write(element.name ?? '<null-name>');
_writeTypeParameters2(element.typeParameters);
_writeFormalParameters2(
element.formalParameters,
forElement: true,
allowMultiline: true,
);
}
void writeMixinElement(MixinElementImpl element) {
if (element.isBase) {
_write('base ');
}
_write('mixin ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
_writeTypeParameters2(element.typeParameters);
_writeTypesIfNotEmpty(' on ', element.superclassConstraints);
_writeTypesIfNotEmpty(' implements ', element.interfaces);
}
void writeNeverElement(NeverElementImpl element) {
_write('Never');
}
void writeNeverType(NeverType type) {
_write('Never');
_writeNullability(type.nullabilitySuffix);
@@ -339,8 +293,7 @@ class ElementDisplayStringBuilder {
_write('{');
for (var field in namedFields) {
_writeType(field.type);
_write(' ');
_write(field.name);
_write(' ${field.name}');
if (index++ < fieldCount - 1) {
_write(', ');
}
@@ -357,45 +310,40 @@ class ElementDisplayStringBuilder {
_writeNullability(type.nullabilitySuffix);
}
void writeTypeAliasElement(TypeAliasFragmentImpl element) {
if (element.isAugmentation) {
_write('augment ');
}
void writeSetterElement(SetterElementImpl element) {
writeExecutableElement(element, 'set ${element.displayName}');
}
void writeTopLevelFunctionElement(TopLevelFunctionElementImpl element) {
_writeType(element.returnType);
_write(' ');
_write(element.name ?? ' <null-name>');
_writeTypeParameters2(element.typeParameters);
_writeFormalParameters2(
element.formalParameters,
forElement: true,
allowMultiline: true,
);
}
void writeTypeAliasElement(TypeAliasElementImpl element) {
_write('typedef ');
_write(element.displayName);
_writeTypeParameters(element.typeParameters);
_writeTypeParameters2(element.typeParameters);
_write(' = ');
var aliasedElement = element.aliasedElement;
if (aliasedElement != null) {
aliasedElement.appendTo(this);
} else {
_writeType(element.element.aliasedType);
_writeType(element.aliasedType);
}
}
void writeTypeParameter(TypeParameterFragmentImpl element) {
void writeTypeParameterElement(TypeParameterElementImpl element) {
var variance = element.variance;
if (!element.isLegacyCovariant && variance != Variance.unrelated) {
_write(variance.keyword);
_write(' ');
}
_write(element.displayName);
var bound = element.bound;
if (bound != null) {
_write(' extends ');
_writeType(bound);
}
}
void writeTypeParameter2(TypeParameterElementImpl element) {
var variance = element.variance;
if (!element.isLegacyCovariant && variance != Variance.unrelated) {
_write(variance.keyword);
_write(' ');
_write('${variance.keyword} ');
}
_write(element.displayName);
@@ -430,16 +378,9 @@ class ElementDisplayStringBuilder {
_write('_');
}
void writeVariableElement(VariableFragmentImpl element) {
_writeType(element.element.type);
_write(' ');
_write(element.displayName);
}
void writeVariableElement2(VariableElement2OrMember element) {
_writeType(element.type);
_write(' ');
_write(element.displayName);
_write(' ${element.displayName}');
}
void writeVoidType() {
@@ -472,65 +413,6 @@ class ElementDisplayStringBuilder {
}
}
void _writeFormalParameters(
List<FormalParameterFragmentImpl> parameters, {
required bool forElement,
bool allowMultiline = false,
}) {
// Assume the display string looks better wrapped when there are at least
// three parameters. This avoids having to pre-compute the single-line
// version and know the length of the function name/return type.
var multiline = allowMultiline && _multiline && parameters.length >= 3;
// The prefix for open groups is included in separator for single-line but
// not for multiline so must be added explicitly.
var openGroupPrefix = multiline ? ' ' : '';
var separator = multiline ? ',' : ', ';
var trailingComma = multiline ? ',\n' : '';
var parameterPrefix = multiline ? '\n ' : '';
_write('(');
_WriteFormalParameterKind? lastKind;
var lastClose = '';
void openGroup(_WriteFormalParameterKind kind, String open, String close) {
if (lastKind != kind) {
_write(lastClose);
if (lastKind != null) {
// We only need to include the space before the open group if there
// was a previous parameter, otherwise it goes immediately after the
// open paren.
_write(openGroupPrefix);
}
_write(open);
lastKind = kind;
lastClose = close;
}
}
for (var i = 0; i < parameters.length; i++) {
if (i != 0) {
_write(separator);
}
var parameter = parameters[i];
if (parameter.isRequiredPositional) {
openGroup(_WriteFormalParameterKind.requiredPositional, '', '');
} else if (parameter.isOptionalPositional) {
openGroup(_WriteFormalParameterKind.optionalPositional, '[', ']');
} else if (parameter.isNamed) {
openGroup(_WriteFormalParameterKind.named, '{', '}');
}
_write(parameterPrefix);
_writeWithoutDelimiters(parameter, forElement: forElement);
}
_write(trailingComma);
_write(lastClose);
_write(')');
}
void _writeFormalParameters2(
List<FormalParameterElementMixin> parameters, {
required bool forElement,
@@ -628,19 +510,6 @@ class ElementDisplayStringBuilder {
}
}
void _writeTypeParameters(List<TypeParameterFragmentImpl> elements) {
if (elements.isEmpty) return;
_write('<');
for (var i = 0; i < elements.length; i++) {
if (i != 0) {
_write(', ');
}
elements[i].appendTo(this);
}
_write('>');
}
void _writeTypeParameters2(List<TypeParameterElement> elements) {
if (elements.isEmpty) return;
@@ -670,32 +539,6 @@ class ElementDisplayStringBuilder {
}
}
void _writeWithoutDelimiters(
FormalParameterFragmentImpl element, {
required bool forElement,
}) {
if (element.isRequiredNamed) {
_write('required ');
}
// TODO(scheglov): write a placeholder, or remove completely
// When we do correct separate writing elements.
_writeType(element.element.type);
if (forElement || element.isNamed) {
_write(' ');
_write(element.displayName);
}
if (forElement) {
var defaultValueCode = element.element.defaultValueCode;
if (defaultValueCode != null) {
_write(' = ');
_write(defaultValueCode);
}
}
}
void _writeWithoutDelimiters2(
FormalParameterElementMixin element, {
required bool forElement,
@@ -707,8 +550,9 @@ class ElementDisplayStringBuilder {
_writeType(element.type);
if (forElement || element.isNamed) {
_write(' ');
_write(element.displayName);
if (element.name case var name?) {
_write(' $name');
}
}
if (forElement) {
+105 -191
View File
@@ -374,6 +374,11 @@ class ClassElementImpl extends InterfaceElementImpl implements ClassElement {
return accept(visitor);
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeClassElement(this);
}
@override
@trackedIndirectly
bool isExtendableIn(LibraryElement library) {
@@ -667,11 +672,6 @@ class ClassFragmentImpl extends ClassOrMixinFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeClassElement(this);
}
}
abstract class ClassOrMixinFragmentImpl extends InterfaceFragmentImpl {
@@ -888,23 +888,17 @@ class ConstructorElementImpl extends ExecutableElementImpl
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeConstructorElement(this);
}
/// Ensures that dependencies of this constructor, such as default values
/// of formal parameters, are evaluated.
void computeConstantDependencies() {
firstFragment.computeConstantDependencies();
}
@override
String displayString({bool multiline = false, bool preferTypeAlias = false}) {
// TODO(scheglov): de-duplicate
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
builder.writeConstructorElement(this);
return builder.toString();
}
@override
void visitChildren<T>(ElementVisitor2<T> visitor) {
for (var child in children) {
@@ -1077,11 +1071,6 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
firstTokenOffset ??
enclosingElement.offset;
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeConstructorFragment(this);
}
/// Ensures that dependencies of this constructor, such as default values
/// of formal parameters, are evaluated.
void computeConstantDependencies() {
@@ -1293,6 +1282,11 @@ class DynamicElementImpl extends TypeDefiningElementImpl {
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeDynamicElement(this);
}
}
/// The synthetic element representing the declaration of the type `dynamic`.
@@ -1864,7 +1858,7 @@ abstract class ElementImpl implements Element {
/// Append a textual representation of this element to the given [builder].
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeAbstractElement2(this);
builder.writeAbstractElement(this);
}
@override
@@ -2033,6 +2027,11 @@ class EnumElementImpl extends InterfaceElementImpl implements EnumElement {
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeEnumElement(this);
}
}
/// An [InterfaceFragmentImpl] which is an enum.
@@ -2068,11 +2067,6 @@ class EnumFragmentImpl extends InterfaceFragmentImpl implements EnumFragment {
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeEnumElement(this);
}
}
/// Common base class for all analyzer-internal classes that implement
@@ -2191,6 +2185,11 @@ abstract class ExecutableElementImpl extends FunctionTypedElementImpl
nullabilitySuffix: NullabilitySuffix.none,
);
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExecutableElement(this, name!);
}
}
abstract class ExecutableFragmentImpl extends _ExistingFragmentImpl
@@ -2353,11 +2352,6 @@ abstract class ExecutableFragmentImpl extends _ExistingFragmentImpl
List<FormalParameterFragmentImpl> get parameters_unresolved {
return _parameters;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExecutableFragment(this, displayName);
}
}
class ExtensionElementImpl extends InstanceElementImpl
@@ -2412,6 +2406,11 @@ class ExtensionElementImpl extends InstanceElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExtensionElement(this);
}
}
class ExtensionFragmentImpl extends InstanceFragmentImpl
@@ -2472,11 +2471,6 @@ class ExtensionFragmentImpl extends InstanceFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExtensionElement(this);
}
}
class ExtensionTypeElementImpl extends InterfaceElementImpl
@@ -2564,6 +2558,11 @@ class ExtensionTypeElementImpl extends InterfaceElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExtensionTypeElement(this);
}
}
class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
@@ -2617,11 +2616,6 @@ class ExtensionTypeFragmentImpl extends InterfaceFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExtensionTypeElement(this);
}
}
/// Common base class for all analyzer-internal classes that implement
@@ -3103,6 +3097,11 @@ class FormalParameterElementImpl extends PromotableElementImpl
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeFormalParameterElement(this);
}
@override
void visitChildren<T>(ElementVisitor2<T> visitor) {
for (var child in children) {
@@ -3378,11 +3377,6 @@ class FormalParameterFragmentImpl extends VariableFragmentImpl
_typeParameters = typeParameters;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeFormalParameter(this);
}
FormalParameterElementImpl _createElement(
FormalParameterFragment firstFragment,
) => FormalParameterElementImpl(firstFragment as FormalParameterFragmentImpl);
@@ -3452,19 +3446,6 @@ mixin FragmentedElementMixin<E extends Fragment> implements _Fragmented<E> {
}
return result;
}
String displayString({bool multiline = false, bool preferTypeAlias = false}) {
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
var fragment = firstFragment;
if (fragment is! FragmentImpl) {
throw UnsupportedError('Fragment is not an ElementImpl');
}
(fragment as FragmentImpl).appendTo(builder);
return builder.toString();
}
}
mixin FragmentedExecutableElementMixin<E extends ExecutableFragmentImpl>
@@ -3723,11 +3704,6 @@ abstract class FragmentImpl implements Fragment {
return identical(this, other);
}
/// Append a textual representation of this element to the given [builder].
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeAbstractElement(this);
}
/// Set this element as the enclosing element for given [element].
void encloseElement(FragmentImpl element) {
element.enclosingElement = this;
@@ -3740,36 +3716,6 @@ abstract class FragmentImpl implements Fragment {
}
}
/// Returns the presentation of this element as it should appear when
/// presented to users.
///
/// If [withNullability] is `true`, then [NullabilitySuffix.question] and
/// [NullabilitySuffix.star] in types will be represented as `?` and `*`.
/// [NullabilitySuffix.none] does not have any explicit presentation.
///
/// If [withNullability] is `false`, nullability suffixes will not be
/// included into the presentation.
///
/// If [multiline] is `true`, the string may be wrapped over multiple lines
/// with newlines to improve formatting. For example function signatures may
/// be formatted as if they had trailing commas.
///
/// Clients should not depend on the content of the returned value as it will
/// be changed if doing so would improve the UX.
String getDisplayString({
@Deprecated('Only non-nullable by default mode is supported')
bool withNullability = true,
bool multiline = false,
bool preferTypeAlias = false,
}) {
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
appendTo(builder);
return builder.toString();
}
/// Return `true` if this element has the given [modifier] associated with it.
bool hasModifier(Modifier modifier) => _modifiers[modifier];
@@ -3791,7 +3737,7 @@ abstract class FragmentImpl implements Fragment {
@override
String toString() {
return getDisplayString();
return "fragmentOf: $element";
}
void writeModifiers(BufferedSink writer) {
@@ -3889,7 +3835,7 @@ class GenericFunctionTypeElementImpl extends FunctionTypedElementImpl
@override
List<FormalParameterElement> get formalParameters =>
_wrappedElement.formalParameters
_wrappedElement.formalParameters
.map((fragment) => fragment.element)
.toList();
@@ -3936,7 +3882,7 @@ class GenericFunctionTypeElementImpl extends FunctionTypedElementImpl
String? get name3 => name;
@override
DartType get returnType => _wrappedElement.returnType;
TypeImpl get returnType => _wrappedElement.returnType;
@override
FunctionType get type => _wrappedElement.type;
@@ -3959,6 +3905,11 @@ class GenericFunctionTypeElementImpl extends FunctionTypedElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeGenericFunctionTypeElement(this);
}
}
/// The element used for a generic function type.
@@ -4065,11 +4016,6 @@ class GenericFunctionTypeFragmentImpl extends _ExistingFragmentImpl
set type(FunctionTypeImpl type) {
_type = type;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeGenericFunctionTypeElement(this);
}
}
/// Common base class for all analyzer-internal classes that implement
@@ -4163,6 +4109,11 @@ class GetterElementImpl extends PropertyAccessorElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeGetterElement(this);
}
}
class GetterFragmentImpl extends PropertyAccessorFragmentImpl
@@ -4185,11 +4136,6 @@ class GetterFragmentImpl extends PropertyAccessorFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExecutableFragment(this, 'get $displayName');
}
}
/// A concrete implementation of a [HideElementCombinator].
@@ -4388,15 +4334,6 @@ abstract class InstanceElementImpl extends ElementImpl
_setters = [..._setters, element];
}
@override
String displayString({
bool multiline = false,
bool preferTypeAlias = false,
}) => firstFragment.getDisplayString(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
@Deprecated('Use displayString instead')
@override
String displayString2({
@@ -5537,13 +5474,9 @@ class LabelElementImpl extends ElementImpl implements LabelElement {
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
String displayString({
bool multiline = false,
bool preferTypeAlias = false,
}) => _wrappedFragment.getDisplayString(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeLabelElement(this);
}
@Deprecated('Use displayString instead')
@override
@@ -6058,16 +5991,6 @@ class LibraryElementImpl extends ElementImpl
builder.writeLibraryElement(this);
}
@override
String displayString({bool multiline = false, bool preferTypeAlias = false}) {
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
appendTo(builder);
return builder.toString();
}
@Deprecated('Use displayString instead')
@override
String displayString2({
@@ -6721,11 +6644,6 @@ class LibraryFragmentImpl extends _ExistingFragmentImpl
fragment.enclosingElement = this;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeCompilationUnitElement(this);
}
/// Indicates whether it is unnecessary to report an undefined identifier
/// error for an identifier reference with the given [name] and optional
/// [prefix].
@@ -6987,13 +6905,9 @@ class LocalFunctionElementImpl extends ExecutableElementImpl
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
String displayString({
bool multiline = false,
bool preferTypeAlias = false,
}) => _wrappedFragment.getDisplayString(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeLocalFunctionElement(this);
}
@Deprecated('Use displayString instead')
@override
@@ -7110,16 +7024,6 @@ class LocalVariableElementImpl extends PromotableElementImpl
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
String displayString({bool multiline = false, bool preferTypeAlias = false}) {
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
builder.writeVariableElement2(this);
return builder.toString();
}
@Deprecated('Use displayString instead')
@override
String displayString2({
@@ -7681,6 +7585,11 @@ class MethodElementImpl extends ExecutableElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeMethodElement(this);
}
}
class MethodFragmentImpl extends ExecutableFragmentImpl
@@ -7816,6 +7725,11 @@ class MixinElementImpl extends InterfaceElementImpl implements MixinElement {
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeMixinElement(this);
}
@override
bool isImplementableIn(LibraryElement library) {
if (library == this.library) {
@@ -7894,11 +7808,6 @@ class MixinFragmentImpl extends ClassOrMixinFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeMixinElement(this);
}
}
/// The constants for all of the modifiers defined by the Dart language and for
@@ -8311,6 +8220,11 @@ class NeverElementImpl extends TypeDefiningElementImpl {
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeNeverElement(this);
}
DartType instantiate({required NullabilitySuffix nullabilitySuffix}) {
switch (nullabilitySuffix) {
case NullabilitySuffix.question:
@@ -8619,13 +8533,8 @@ class PrefixElementImpl extends ElementImpl implements PrefixElement {
}
@override
String displayString({bool multiline = false, bool preferTypeAlias = false}) {
var builder = ElementDisplayStringBuilder(
multiline: multiline,
preferTypeAlias: preferTypeAlias,
);
void appendTo(ElementDisplayStringBuilder builder) {
builder.writePrefixElement(this);
return builder.toString();
}
@Deprecated('Use displayString instead')
@@ -8957,6 +8866,11 @@ abstract class PropertyInducingElementImpl extends VariableElementImpl
}
List<PropertyInducingFragmentImpl> get _fragments;
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeVariableElement2(this);
}
}
/// Instances of this class are set for fields and top-level variables
@@ -9145,6 +9059,11 @@ class SetterElementImpl extends PropertyAccessorElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeSetterElement(this);
}
}
class SetterFragmentImpl extends PropertyAccessorFragmentImpl
@@ -9179,11 +9098,6 @@ class SetterFragmentImpl extends PropertyAccessorFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeExecutableFragment(this, 'set $displayName');
}
}
/// A concrete implementation of a [ShowElementCombinator].
@@ -9465,6 +9379,11 @@ class TopLevelFunctionElementImpl extends ExecutableElementImpl
@Deprecated('Use accept instead')
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeTopLevelFunctionElement(this);
}
}
/// A concrete implementation of a [TopLevelFunctionFragment].
@@ -9656,11 +9575,11 @@ class TypeAliasElementImpl extends TypeDefiningElementImpl
}
@override
Element? get aliasedElement {
ElementImpl? get aliasedElement {
switch (firstFragment.aliasedElement) {
case InstanceFragment instance:
case InstanceFragmentImpl instance:
return instance.element;
case GenericFunctionTypeFragment instance:
case GenericFunctionTypeFragmentImpl instance:
return instance.element;
}
return null;
@@ -9785,6 +9704,11 @@ class TypeAliasElementImpl extends TypeDefiningElementImpl
@override
T? accept2<T>(ElementVisitor2<T> visitor) => accept(visitor);
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeTypeAliasElement(this);
}
@override
TypeImpl instantiate({
required List<DartType> typeArguments,
@@ -9960,11 +9884,6 @@ class TypeAliasFragmentImpl extends _ExistingFragmentImpl
fragment.previousFragment = this;
nextFragment = fragment;
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeTypeAliasElement(this);
}
}
abstract class TypeDefiningElementImpl extends ElementImpl
@@ -10061,7 +9980,7 @@ class TypeParameterElementImpl extends TypeDefiningElementImpl
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeTypeParameter2(this);
builder.writeTypeParameterElement(this);
}
@override
@@ -10217,11 +10136,6 @@ class TypeParameterFragmentImpl extends FragmentImpl
set variance(shared.Variance? newVariance) => _variance = newVariance;
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeTypeParameter(this);
}
/// Computes the variance of the type parameters in the [type].
shared.Variance computeVarianceInType(DartType type) {
if (type is TypeParameterTypeImpl) {
@@ -10381,6 +10295,11 @@ abstract class VariableElementImpl extends ElementImpl
// TODO(scheglov): eventually move logic from PropertyInducingElementImpl
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeVariableElement2(this);
}
/// Return a representation of the value of this variable, forcing the value
/// to be computed if it had not previously been computed, or `null` if either
/// this variable was not declared with the 'const' modifier or if the value
@@ -10535,11 +10454,6 @@ abstract class VariableFragmentImpl extends FragmentImpl
}
throw StateError('($runtimeType) $this');
}
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeVariableElement(this);
}
}
abstract class _ExistingFragmentImpl extends FragmentImpl
@@ -991,7 +991,7 @@ class ParameterMember extends VariableMember with FormalParameterElementMixin {
@override
void appendTo(ElementDisplayStringBuilder builder) {
builder.writeFormalParameter2(this);
builder.writeFormalParameterElement(this);
}
@override
+1 -1
View File
@@ -5294,7 +5294,7 @@ class ScopeResolverVisitor extends UnifyingAstVisitor<void> {
node.type.accept(this);
var aliasedElement = element.aliasedElement;
if (aliasedElement is GenericFunctionTypeElement) {
if (aliasedElement is GenericFunctionTypeElementImpl) {
nameScope = FormalParameterScope(
TypeParameterScope(nameScope, aliasedElement.typeParameters),
aliasedElement.formalParameters,
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:analyzer/src/dart/element/element.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -22,8 +21,8 @@ class A {}
abstract class B<T> extends A {}
''');
var B = findElement2.class_('B').firstFragment as ClassFragmentImpl;
var displayString = B.getDisplayString();
var B = findElement2.class_('B');
var displayString = B.displayString();
expect(displayString, 'abstract class B<T> extends A');
}
@@ -33,9 +32,7 @@ extension StringExtension on String {}
''');
var element = findElement2.extension_('StringExtension');
var fragment = element.firstFragment as ExtensionFragmentImpl;
var displayString = fragment.getDisplayString();
var displayString = element.displayString();
expect(displayString, 'extension StringExtension on String');
}
@@ -45,9 +42,7 @@ extension on String {}
''');
var element = result.libraryElement2.extensions.single;
var fragment = element.firstFragment;
var displayString = fragment.getDisplayString();
var displayString = element.displayString();
expect(displayString, 'extension on String');
}
@@ -57,9 +52,7 @@ extension type MyString<T>(String it) implements String {}
''');
var element = findElement2.extensionType('MyString');
var fragment = element.firstFragment as ExtensionTypeFragmentImpl;
var displayString = fragment.getDisplayString();
var displayString = element.displayString();
expect(
displayString,
'extension type MyString<T>(String it) implements String',
@@ -74,13 +67,11 @@ abstract class A {
''');
var methodElement = findElement2.method('longMethodName');
var methodFragment = methodElement.firstFragment as MethodFragmentImpl;
var singleLine = methodFragment.getDisplayString();
var singleLine = methodElement.displayString();
expect(singleLine, '''
String? longMethodName(String? aaa, [String? bbb = 'a', String? ccc])''');
var multiLine = methodFragment.getDisplayString(multiline: true);
var multiLine = methodElement.displayString(multiline: true);
expect(multiLine, '''
String? longMethodName(
String? aaa, [
@@ -101,16 +92,14 @@ abstract class A {
''');
var methodElement = findElement2.method('longMethodName');
var methodFragment = methodElement.firstFragment as MethodFragmentImpl;
var singleLine = methodFragment.getDisplayString();
var singleLine = methodElement.displayString();
expect(
singleLine,
'''
String? longMethodName(String? aaa, [String? Function(String?, String?, String?) bbb, String? ccc])''',
);
var multiLine = methodFragment.getDisplayString(multiline: true);
var multiLine = methodElement.displayString(multiline: true);
expect(multiLine, '''
String? longMethodName(
String? aaa, [
@@ -125,9 +114,7 @@ String get a => '';
''');
var element = findElement2.topGet('a');
var fragment = element.firstFragment as GetterFragmentImpl;
expect(fragment.getDisplayString(), 'String get a');
expect(element.displayString(), 'String get a');
}
test_property_setter() async {
@@ -136,9 +123,7 @@ set a(String value) {}
''');
var element = findElement2.topSet('a');
var fragment = element.firstFragment as SetterFragmentImpl;
expect(fragment.getDisplayString(), 'set a(String value)');
expect(element.displayString(), 'set a(String value)');
}
test_shortMethod() async {
@@ -149,12 +134,10 @@ abstract class A {
''');
var element = findElement2.method('m');
var fragment = element.firstFragment as MethodFragmentImpl;
var singleLine = fragment.getDisplayString();
var singleLine = element.displayString();
expect(singleLine, 'String? m(String? a, [String? b])');
var multiLine = fragment.getDisplayString(multiline: true);
var multiLine = element.displayString(multiline: true);
// The signature is short enough that it remains on one line even for
// multiline: true.
expect(multiLine, 'String? m(String? a, [String? b])');