Skip to content

Commit 56536ba

Browse files
scheglovCommit Queue
authored andcommitted
Elements. Remove ConstructorElementMixin.
Change-Id: I4a5391d4a886f6d69c7bec35c86bd6b4e82d9c03 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/437261 Reviewed-by: Paul Berry <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent a8414a4 commit 56536ba

File tree

4 files changed

+117
-70
lines changed

4 files changed

+117
-70
lines changed

pkg/analyzer/lib/src/dart/element/display_string_builder.dart

Lines changed: 96 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,20 @@ class ElementDisplayStringBuilder {
8080
_write(path);
8181
}
8282

83-
void writeConstructorElement(ConstructorElementMixin element) {
84-
if (element.isAugmentation) {
85-
_write('augment ');
86-
}
83+
void writeConstructorElement(ConstructorElementMixin2 element) {
84+
_writeType(element.returnType);
85+
_write(' ');
86+
87+
_write(element.displayName);
88+
89+
_writeFormalParameters2(
90+
element.formalParameters,
91+
forElement: true,
92+
allowMultiline: true,
93+
);
94+
}
8795

96+
void writeConstructorFragment(ConstructorFragmentImpl element) {
8897
_writeType(element.returnType);
8998
_write(' ');
9099

@@ -487,6 +496,65 @@ class ElementDisplayStringBuilder {
487496
_write(')');
488497
}
489498

499+
void _writeFormalParameters2(
500+
List<FormalParameterElementMixin> parameters, {
501+
required bool forElement,
502+
bool allowMultiline = false,
503+
}) {
504+
// Assume the display string looks better wrapped when there are at least
505+
// three parameters. This avoids having to pre-compute the single-line
506+
// version and know the length of the function name/return type.
507+
var multiline = allowMultiline && _multiline && parameters.length >= 3;
508+
509+
// The prefix for open groups is included in separator for single-line but
510+
// not for multiline so must be added explicitly.
511+
var openGroupPrefix = multiline ? ' ' : '';
512+
var separator = multiline ? ',' : ', ';
513+
var trailingComma = multiline ? ',\n' : '';
514+
var parameterPrefix = multiline ? '\n ' : '';
515+
516+
_write('(');
517+
518+
_WriteFormalParameterKind? lastKind;
519+
var lastClose = '';
520+
521+
void openGroup(_WriteFormalParameterKind kind, String open, String close) {
522+
if (lastKind != kind) {
523+
_write(lastClose);
524+
if (lastKind != null) {
525+
// We only need to include the space before the open group if there
526+
// was a previous parameter, otherwise it goes immediately after the
527+
// open paren.
528+
_write(openGroupPrefix);
529+
}
530+
_write(open);
531+
lastKind = kind;
532+
lastClose = close;
533+
}
534+
}
535+
536+
for (var i = 0; i < parameters.length; i++) {
537+
if (i != 0) {
538+
_write(separator);
539+
}
540+
541+
var parameter = parameters[i];
542+
if (parameter.isRequiredPositional) {
543+
openGroup(_WriteFormalParameterKind.requiredPositional, '', '');
544+
} else if (parameter.isOptionalPositional) {
545+
openGroup(_WriteFormalParameterKind.optionalPositional, '[', ']');
546+
} else if (parameter.isNamed) {
547+
openGroup(_WriteFormalParameterKind.named, '{', '}');
548+
}
549+
_write(parameterPrefix);
550+
_writeWithoutDelimiters2(parameter, forElement: forElement);
551+
}
552+
553+
_write(trailingComma);
554+
_write(lastClose);
555+
_write(')');
556+
}
557+
490558
void _writeNullability(NullabilitySuffix nullabilitySuffix) {
491559
if (_withNullability) {
492560
switch (nullabilitySuffix) {
@@ -591,6 +659,30 @@ class ElementDisplayStringBuilder {
591659
}
592660
}
593661

662+
void _writeWithoutDelimiters2(
663+
FormalParameterElementMixin element, {
664+
required bool forElement,
665+
}) {
666+
if (element.isRequiredNamed) {
667+
_write('required ');
668+
}
669+
670+
_writeType(element.type);
671+
672+
if (forElement || element.isNamed) {
673+
_write(' ');
674+
_write(element.displayName);
675+
}
676+
677+
if (forElement) {
678+
var defaultValueCode = element.defaultValueCode;
679+
if (defaultValueCode != null) {
680+
_write(' = ');
681+
_write(defaultValueCode);
682+
}
683+
}
684+
}
685+
594686
static FunctionTypeImpl _uniqueTypeParameters(FunctionTypeImpl type) {
595687
if (type.typeParameters.isEmpty) {
596688
return type;

pkg/analyzer/lib/src/dart/element/element.dart

Lines changed: 20 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,20 @@ class ConstructorElementImpl extends ExecutableElementImpl
901901
firstFragment.computeConstantDependencies();
902902
}
903903

904+
@override
905+
String displayString2({
906+
bool multiline = false,
907+
bool preferTypeAlias = false,
908+
}) {
909+
// TODO(scheglov): de-duplicate
910+
var builder = ElementDisplayStringBuilder(
911+
multiline: multiline,
912+
preferTypeAlias: preferTypeAlias,
913+
);
914+
builder.writeConstructorElement(this);
915+
return builder.toString();
916+
}
917+
904918
@override
905919
void visitChildren2<T>(ElementVisitor2<T> visitor) {
906920
for (var child in children2) {
@@ -909,27 +923,6 @@ class ConstructorElementImpl extends ExecutableElementImpl
909923
}
910924
}
911925

912-
mixin ConstructorElementMixin implements ExecutableElementOrMember {
913-
@override
914-
ConstructorFragmentImpl get declaration;
915-
916-
/// Whether the constructor is a const constructor.
917-
bool get isConst;
918-
919-
/// Whether the constructor can be used as a default constructor - unnamed,
920-
/// and has no required parameters.
921-
bool get isDefaultConstructor;
922-
923-
/// Whether the constructor represents a factory constructor.
924-
bool get isFactory;
925-
926-
/// Whether the constructor represents a generative constructor.
927-
bool get isGenerative;
928-
929-
@override
930-
InterfaceTypeImpl get returnType;
931-
}
932-
933926
/// Common implementation for methods defined in [ConstructorElement].
934927
mixin ConstructorElementMixin2
935928
implements
@@ -957,7 +950,6 @@ mixin ConstructorElementMixin2
957950

958951
/// A concrete implementation of a [ConstructorFragment].
959952
class ConstructorFragmentImpl extends ExecutableFragmentImpl
960-
with ConstructorElementMixin
961953
implements ConstructorFragment {
962954
late final ConstructorElementImpl element;
963955

@@ -1033,7 +1025,7 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
10331025
InstanceFragment? get enclosingFragment =>
10341026
enclosingElement3 as InstanceFragment;
10351027

1036-
@override
1028+
/// Whether the constructor is a const constructor.
10371029
bool get isConst {
10381030
return hasModifier(Modifier.CONST);
10391031
}
@@ -1043,7 +1035,8 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
10431035
setModifier(Modifier.CONST, isConst);
10441036
}
10451037

1046-
@override
1038+
/// Whether the constructor can be used as a default constructor - unnamed,
1039+
/// and has no required parameters.
10471040
bool get isDefaultConstructor {
10481041
// unnamed
10491042
if (name2 != 'new') {
@@ -1059,7 +1052,7 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
10591052
return true;
10601053
}
10611054

1062-
@override
1055+
/// Whether the constructor represents a factory constructor.
10631056
bool get isFactory {
10641057
return hasModifier(Modifier.FACTORY);
10651058
}
@@ -1069,7 +1062,7 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
10691062
setModifier(Modifier.FACTORY, isFactory);
10701063
}
10711064

1072-
@override
1065+
/// Whether the constructor represents a generative constructor.
10731066
bool get isGenerative {
10741067
return !isFactory;
10751068
}
@@ -1119,7 +1112,7 @@ class ConstructorFragmentImpl extends ExecutableFragmentImpl
11191112

11201113
@override
11211114
void appendTo(ElementDisplayStringBuilder builder) {
1122-
builder.writeConstructorElement(this);
1115+
builder.writeConstructorFragment(this);
11231116
}
11241117

11251118
/// Ensures that dependencies of this constructor, such as default values

pkg/analyzer/lib/src/dart/element/member.dart

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import 'package:pub_semver/pub_semver.dart';
2020
/// A constructor element defined in a parameterized type where the values of
2121
/// the type parameters are known.
2222
class ConstructorMember extends ExecutableMember
23-
with ConstructorElementMixin, ConstructorElementMixin2
23+
with ConstructorElementMixin2
2424
implements ConstructorElement {
2525
/// Initialize a newly created element to represent a constructor, based on
2626
/// the [declaration], and applied [substitution].
@@ -143,25 +143,6 @@ class ConstructorMember extends ExecutableMember
143143
}
144144
}
145145

146-
/// If the given [element]'s type is different when any type parameters
147-
/// from the defining type's declaration are replaced with the actual type
148-
/// arguments from the [definingType], create a constructor member
149-
/// representing the given constructor. Return the member that was created, or
150-
/// the original constructor if no member was created.
151-
static ConstructorElementMixin from(
152-
ConstructorFragmentImpl element,
153-
InterfaceType definingType,
154-
) {
155-
if (definingType.typeArguments.isEmpty) {
156-
return element;
157-
}
158-
159-
return ConstructorMember(
160-
declaration: element,
161-
substitution: Substitution.fromInterfaceType(definingType),
162-
);
163-
}
164-
165146
/// If the given [element]'s type is different when any type parameters
166147
/// from the defining type's declaration are replaced with the actual type
167148
/// arguments from the [definingType], create a constructor member

pkg/analyzer/lib/src/utilities/extensions/element.dart

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -90,25 +90,6 @@ extension ConstructorElementImplExtension on ConstructorFragmentImpl {
9090
}
9191
}
9292

93-
extension ConstructorElementMixin2Extension on ConstructorElementMixin2 {
94-
ConstructorElementMixin get asElement {
95-
if (this case ConstructorMember member) {
96-
return member;
97-
}
98-
return (this as ConstructorElementImpl).lastFragment;
99-
}
100-
}
101-
102-
extension ConstructorElementMixinExtension on ConstructorElementMixin {
103-
ConstructorElementMixin2 get asElement2 {
104-
return switch (this) {
105-
ConstructorFragmentImpl(:var element) => element,
106-
ConstructorMember member => member,
107-
_ => throw UnsupportedError('Unsupported type: $runtimeType'),
108-
};
109-
}
110-
}
111-
11293
extension Element2Extension on Element {
11394
/// Whether the element is effectively [internal].
11495
bool get isInternal {

0 commit comments

Comments
 (0)