Skip to content

Commit dba6f94

Browse files
authored
Preserve type aliases for records in output (#3340)
* Test records in the experiments package * Refactor with tests * Rebuild after pub upgrade * Move constructor_tearoffs to the main test package so we can run tests on 2.19. * Update pubspec. * Fix up test package for new language version. * Fix references to remove new * Review comments
1 parent 96e6190 commit dba6f94

18 files changed

+540
-463
lines changed

lib/resources/docs.dart.js

Lines changed: 220 additions & 220 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/resources/docs.dart.js.map

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/src/element_type.dart

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -40,54 +40,14 @@ abstract class ElementType extends Privacy
4040

4141
factory ElementType._from(
4242
DartType f, Library library, PackageGraph packageGraph) {
43-
if (f is RecordType) {
44-
return RecordElementType(f, library, packageGraph);
45-
}
4643
var fElement = DartTypeExtension(f).element;
4744
if (fElement == null ||
4845
fElement.kind == ElementKind.DYNAMIC ||
4946
fElement.kind == ElementKind.NEVER) {
50-
// [UndefinedElementType]s.
51-
if (f is FunctionType) {
52-
if (f.alias?.element != null) {
53-
return AliasedFunctionTypeElementType(f, library, packageGraph);
54-
}
55-
return FunctionTypeElementType(f, library, packageGraph);
56-
}
57-
return UndefinedElementType(f, library, packageGraph);
58-
}
59-
// [DefinedElementType]s.
60-
var element = packageGraph.modelBuilder.fromElement(fElement);
61-
// `TypeAliasElement.alias.element` has different implications.
62-
// In that case it is an actual type alias of some kind (generic or
63-
// otherwise). Here however `alias.element` signals that this is a type
64-
// referring to an alias.
65-
if (f is! TypeAliasElement && f.alias?.element != null) {
66-
return AliasedElementType(
67-
f as ParameterizedType, library, packageGraph, element);
68-
}
69-
assert(f is ParameterizedType || f is TypeParameterType);
70-
// TODO(jcollins-g): strip out all the cruft that's accumulated
71-
// here for non-generic type aliases.
72-
var isGenericTypeAlias = f.alias?.element != null && f is! InterfaceType;
73-
if (f is FunctionType) {
74-
assert(f is ParameterizedType);
75-
// And finally, delete this case and its associated class
76-
// after https://dart-review.googlesource.com/c/sdk/+/201520
77-
// is in all published versions of analyzer this version of dartdoc
78-
// is compatible with.
79-
return CallableElementType(f, library, packageGraph, element);
47+
return UndefinedElementType._from(f, library, packageGraph);
8048
}
81-
if (isGenericTypeAlias) {
82-
return GenericTypeAliasElementType(
83-
f as TypeParameterType, library, packageGraph, element);
84-
}
85-
if (f is TypeParameterType) {
86-
return TypeParameterElementType(f, library, packageGraph, element);
87-
}
88-
assert(f is ParameterizedType);
89-
return ParameterizedElementType(
90-
f as ParameterizedType, library, packageGraph, element);
49+
var modelElement = packageGraph.modelBuilder.fromElement(fElement);
50+
return DefinedElementType._from(f, modelElement, library, packageGraph);
9151
}
9252

9353
/// The element of [type].
@@ -118,6 +78,24 @@ abstract class ElementType extends Privacy
11878
class UndefinedElementType extends ElementType {
11979
UndefinedElementType(super.f, super.library, super.packageGraph);
12080

81+
factory UndefinedElementType._from(
82+
DartType f, Library library, PackageGraph packageGraph) {
83+
// [UndefinedElementType]s.
84+
if (f.alias?.element != null) {
85+
if (f is FunctionType) {
86+
return AliasedUndefinedFunctionElementType(f, library, packageGraph);
87+
}
88+
return AliasedUndefinedElementType(f, library, packageGraph);
89+
}
90+
if (f is RecordType) {
91+
return RecordElementType(f, library, packageGraph);
92+
}
93+
if (f is FunctionType) {
94+
return FunctionTypeElementType(f, library, packageGraph);
95+
}
96+
return UndefinedElementType(f, library, packageGraph);
97+
}
98+
12199
@override
122100
bool get isPublic => true;
123101

@@ -196,16 +174,22 @@ class RecordElementType extends UndefinedElementType with Rendered {
196174
RecordType get type => super.type as RecordType;
197175
}
198176

199-
class AliasedFunctionTypeElementType extends FunctionTypeElementType
200-
with Aliased {
201-
AliasedFunctionTypeElementType(super.f, super.library, super.packageGraph) {
177+
class AliasedUndefinedFunctionElementType extends AliasedUndefinedElementType
178+
with Callable {
179+
AliasedUndefinedFunctionElementType(
180+
super.f, super.library, super.packageGraph);
181+
}
182+
183+
class AliasedUndefinedElementType extends UndefinedElementType
184+
with Aliased, Rendered {
185+
AliasedUndefinedElementType(super.f, super.library, super.packageGraph) {
202186
assert(type.alias?.element != null);
203187
assert(type.alias?.typeArguments != null);
204188
}
205189

206190
@override
207-
ElementTypeRenderer<AliasedFunctionTypeElementType> get _renderer =>
208-
packageGraph.rendererFactory.aliasedFunctionTypeElementTypeRenderer;
191+
ElementTypeRenderer get _renderer =>
192+
packageGraph.rendererFactory.aliasedUndefinedElementTypeRenderer;
209193
}
210194

211195
class ParameterizedElementType extends DefinedElementType with Rendered {
@@ -284,6 +268,35 @@ abstract class DefinedElementType extends ElementType {
284268
DefinedElementType(
285269
super.type, super.library, super.packageGraph, this.modelElement);
286270

271+
factory DefinedElementType._from(DartType f, ModelElement modelElement,
272+
Library library, PackageGraph packageGraph) {
273+
// `TypeAliasElement.alias.element` has different implications.
274+
// In that case it is an actual type alias of some kind (generic or
275+
// otherwise). Here however `alias.element` signals that this is a type
276+
// referring to an alias.
277+
if (f is! TypeAliasElement && f.alias?.element != null) {
278+
return AliasedElementType(
279+
f as ParameterizedType, library, packageGraph, modelElement);
280+
}
281+
assert(f is ParameterizedType || f is TypeParameterType);
282+
assert(f is! FunctionType,
283+
'detected DefinedElementType for FunctionType: analyzer version too old?');
284+
// TODO(jcollins-g): strip out all the cruft that's accumulated
285+
// here for non-generic type aliases.
286+
var isGenericTypeAlias = f.alias?.element != null && f is! InterfaceType;
287+
if (isGenericTypeAlias) {
288+
assert(false);
289+
return GenericTypeAliasElementType(
290+
f as TypeParameterType, library, packageGraph, modelElement);
291+
}
292+
if (f is TypeParameterType) {
293+
return TypeParameterElementType(f, library, packageGraph, modelElement);
294+
}
295+
assert(f is ParameterizedType);
296+
return ParameterizedElementType(
297+
f as ParameterizedType, library, packageGraph, modelElement);
298+
}
299+
287300
Element get element => modelElement.element;
288301

289302
@override

lib/src/generator/templates.runtime_renderers.dart

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15627,9 +15627,15 @@ const _invisibleGetters = {
1562715627
'hasNonFinalField',
1562815628
'hashCode',
1562915629
'isAbstract',
15630+
'isBase',
1563015631
'isDartCoreEnum',
1563115632
'isDartCoreObject',
15633+
'isExhaustive',
15634+
'isFinal',
15635+
'isInterface',
1563215636
'isMixinApplication',
15637+
'isMixinClass',
15638+
'isSealed',
1563315639
'isValidMixin',
1563415640
'runtimeType',
1563515641
'superclassConstraints'
@@ -15799,6 +15805,7 @@ const _invisibleGetters = {
1579915805
'hasOptionalTypeArgs',
1580015806
'hasOverride',
1580115807
'hasProtected',
15808+
'hasReopen',
1580215809
'hasRequired',
1580315810
'hasSealed',
1580415811
'hasUseResult',
@@ -15843,6 +15850,7 @@ const _invisibleGetters = {
1584315850
'isOverride',
1584415851
'isProtected',
1584515852
'isProxy',
15853+
'isReopen',
1584615854
'isRequired',
1584715855
'isSealed',
1584815856
'isTarget',
@@ -15877,6 +15885,7 @@ const _invisibleGetters = {
1587715885
'hasOptionalTypeArgs',
1587815886
'hasOverride',
1587915887
'hasProtected',
15888+
'hasReopen',
1588015889
'hasRequired',
1588115890
'hasSealed',
1588215891
'hasUseResult',
@@ -16126,6 +16135,7 @@ const _invisibleGetters = {
1612616135
'hasOptionalTypeArgs',
1612716136
'hasOverride',
1612816137
'hasProtected',
16138+
'hasReopen',
1612916139
'hasRequired',
1613016140
'hasSealed',
1613116141
'hasUseResult',
@@ -16155,6 +16165,11 @@ const _invisibleGetters = {
1615516165
'MixinElement': {
1615616166
'augmented',
1615716167
'hashCode',
16168+
'isBase',
16169+
'isExhaustive',
16170+
'isFinal',
16171+
'isInterface',
16172+
'isSealed',
1615816173
'runtimeType',
1615916174
'superclassConstraints'
1616016175
},
@@ -16279,6 +16294,7 @@ const _invisibleGetters = {
1627916294
'hasOptionalTypeArgs',
1628016295
'hasOverride',
1628116296
'hasProtected',
16297+
'hasReopen',
1628216298
'hasRequired',
1628316299
'hasSealed',
1628416300
'hasUseResult',

lib/src/render/element_type_renderer.dart

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,20 +138,20 @@ class RecordElementTypeRendererHtml
138138
}
139139
}
140140

141-
class AliasedFunctionTypeElementTypeRendererHtml
142-
extends ElementTypeRendererHtml<AliasedFunctionTypeElementType> {
143-
const AliasedFunctionTypeElementTypeRendererHtml();
141+
class AliasedUndefinedElementTypeRendererHtml
142+
extends ElementTypeRendererHtml<AliasedUndefinedElementType> {
143+
const AliasedUndefinedElementTypeRendererHtml();
144144

145145
@override
146-
String renderLinkedName(AliasedFunctionTypeElementType elementType) =>
146+
String renderLinkedName(AliasedUndefinedElementType elementType) =>
147147
_renderLinkedName(
148148
elementType,
149149
elementType.aliasElement.linkedName,
150150
elementType.aliasArguments,
151151
);
152152

153153
@override
154-
String renderNameWithGenerics(AliasedFunctionTypeElementType elementType) =>
154+
String renderNameWithGenerics(AliasedUndefinedElementType elementType) =>
155155
_renderNameWithGenerics(
156156
elementType,
157157
elementType.aliasElement.name,
@@ -340,20 +340,20 @@ class AliasedElementTypeRendererMd
340340
);
341341
}
342342

343-
class AliasedFunctionTypeElementTypeRendererMd
344-
extends ElementTypeRendererMd<AliasedFunctionTypeElementType> {
345-
const AliasedFunctionTypeElementTypeRendererMd();
343+
class AliasedUndefinedElementTypeRendererMd
344+
extends ElementTypeRendererMd<AliasedUndefinedElementType> {
345+
const AliasedUndefinedElementTypeRendererMd();
346346

347347
@override
348-
String renderLinkedName(AliasedFunctionTypeElementType elementType) =>
348+
String renderLinkedName(AliasedUndefinedElementType elementType) =>
349349
_renderLinkedName(
350350
elementType,
351351
elementType.aliasElement.linkedName,
352352
elementType.aliasArguments,
353353
);
354354

355355
@override
356-
String renderNameWithGenerics(AliasedFunctionTypeElementType elementType) =>
356+
String renderNameWithGenerics(AliasedUndefinedElementType elementType) =>
357357
_renderNameWithGenerics(
358358
elementType,
359359
elementType.aliasElement.name,

lib/src/render/renderer_factory.dart

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ abstract class RendererFactory {
5353

5454
ElementTypeRenderer<AliasedElementType> get aliasedElementTypeRenderer;
5555

56-
ElementTypeRenderer<AliasedFunctionTypeElementType>
57-
get aliasedFunctionTypeElementTypeRenderer;
56+
ElementTypeRenderer<AliasedUndefinedElementType>
57+
get aliasedUndefinedElementTypeRenderer;
5858

5959
ElementTypeRenderer<CallableElementType> get callableElementTypeRenderer;
6060

@@ -140,9 +140,9 @@ class HtmlRenderFactory extends RendererFactory {
140140
FeatureRenderer get featureRenderer => const FeatureRendererHtml();
141141

142142
@override
143-
ElementTypeRenderer<AliasedFunctionTypeElementType>
144-
get aliasedFunctionTypeElementTypeRenderer =>
145-
const AliasedFunctionTypeElementTypeRendererHtml();
143+
ElementTypeRenderer<AliasedUndefinedElementType>
144+
get aliasedUndefinedElementTypeRenderer =>
145+
const AliasedUndefinedElementTypeRendererHtml();
146146
}
147147

148148
class MdRenderFactory extends RendererFactory {
@@ -213,7 +213,7 @@ class MdRenderFactory extends RendererFactory {
213213
FeatureRenderer get featureRenderer => const FeatureRendererMd();
214214

215215
@override
216-
ElementTypeRenderer<AliasedFunctionTypeElementType>
217-
get aliasedFunctionTypeElementTypeRenderer =>
218-
const AliasedFunctionTypeElementTypeRendererMd();
216+
ElementTypeRenderer<AliasedUndefinedElementType>
217+
get aliasedUndefinedElementTypeRenderer =>
218+
const AliasedUndefinedElementTypeRendererMd();
219219
}

0 commit comments

Comments
 (0)