Skip to content

Commit b47c37d

Browse files
authored
Fix definingCombo == null for static field members of extension methods (#2404)
* fix * forgot to write out statics * Add tests * dartfmt
1 parent 39cec16 commit b47c37d

File tree

5 files changed

+25
-9
lines changed

5 files changed

+25
-9
lines changed

lib/src/generator/generator_frontend.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ class GeneratorFrontEnd implements Generator {
146146
_generatorBackend.generateProperty(
147147
writer, packageGraph, lib, extension, property);
148148
}
149+
150+
for (var staticField in filterNonDocumented(extension.staticFields)) {
151+
indexAccumulator.add(staticField);
152+
_generatorBackend.generateProperty(
153+
writer, packageGraph, lib, extension, staticField);
154+
}
149155
}
150156

151157
for (var mixin in filterNonDocumented(lib.mixins)) {

lib/src/model/accessor.dart

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,8 @@ class Accessor extends ModelElement implements EnclosedElement {
2828
GetterSetterCombo get definingCombo {
2929
if (_definingCombo == null) {
3030
var variable = (element as PropertyAccessorElement).variable;
31-
var accessor = isGetter ? variable.getter : variable.setter;
32-
var accessorLibrary = Library(accessor.library, packageGraph);
33-
var definingAccessor =
34-
ModelElement.from(accessor, accessorLibrary, packageGraph)
35-
as Accessor;
36-
_definingCombo = definingAccessor.enclosingCombo;
31+
_definingCombo = ModelElement.fromElement(variable, packageGraph);
32+
assert(_definingCombo != null, 'Unable to find defining combo');
3733
}
3834
return _definingCombo;
3935
}

lib/src/model/model_element.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,12 +359,14 @@ abstract class ModelElement extends Canonicalization
359359
}
360360
}
361361
if (e is PropertyAccessorElement) {
362-
// TODO(jcollins-g): why test for ClassElement in enclosingElement?
362+
// Accessors can be part of a [Container], or a part of a [Library].
363363
if (e.enclosingElement is ClassElement ||
364+
e.enclosingElement is ExtensionElement ||
364365
e is MultiplyInheritedExecutableElement) {
365366
if (enclosingContainer == null) {
366367
return ContainerAccessor(e, library, packageGraph);
367368
} else {
369+
assert(e.enclosingElement is! ExtensionElement);
368370
return ContainerAccessor.inherited(
369371
e, library, packageGraph, enclosingContainer,
370372
originalMember: originalMember);

test/end2end/model_test.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,6 +1746,7 @@ void main() {
17461746
group('Extension', () {
17471747
Extension arm, leg, ext, fancyList, uphill;
17481748
Extension documentOnceReexportOne, documentOnceReexportTwo;
1749+
Extension staticFieldExtension;
17491750
Library reexportOneLib, reexportTwoLib;
17501751
Class apple,
17511752
anotherExtended,
@@ -1784,6 +1785,8 @@ void main() {
17841785
.firstWhere((e) => e.name == 'SimpleStringExtension')
17851786
.instanceMethods
17861787
.firstWhere((m) => m.name == 'doStuff');
1788+
staticFieldExtension = exLibrary.extensions
1789+
.firstWhere((e) => e.name == 'StaticFieldExtension');
17871790
extensions = exLibrary.publicExtensions.toList();
17881791
baseTest = fakeLibrary.classes.firstWhere((e) => e.name == 'BaseTest');
17891792
bigAnotherExtended =
@@ -1798,6 +1801,11 @@ void main() {
17981801
fakeLibrary.classes.firstWhere((e) => e.name == 'SuperMegaTron');
17991802
});
18001803

1804+
test('static fields inside extensions do not crash', () {
1805+
expect(staticFieldExtension.staticFields.length, equals(1));
1806+
expect(staticFieldExtension.staticFields.first.name, equals('aStatic'));
1807+
});
1808+
18011809
test('basic canonicalization for extensions', () {
18021810
expect(documentOnceReexportOne.isCanonical, isFalse);
18031811
expect(
@@ -1980,11 +1988,11 @@ void main() {
19801988
});
19811989

19821990
test('correctly finds all the extensions', () {
1983-
expect(exLibrary.extensions, hasLength(8));
1991+
expect(exLibrary.extensions, hasLength(9));
19841992
});
19851993

19861994
test('correctly finds all the public extensions', () {
1987-
expect(extensions, hasLength(6));
1995+
expect(extensions, hasLength(7));
19881996
});
19891997
});
19901998

testing/test_package/lib/example.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,10 @@ extension on Object {
648648
void bar() {}
649649
}
650650

651+
extension StaticFieldExtension on Object {
652+
static int aStatic;
653+
}
654+
651655
/// This class has nothing to do with [_Shhh], [FancyList], or [AnExtension.call],
652656
/// but should not crash because we referenced them.
653657
/// We should be able to find [DocumentThisExtensionOnce], too.

0 commit comments

Comments
 (0)