Fix definingCombo == null for static field members of extension methods (#2404)
* fix
* forgot to write out statics
* Add tests
* dartfmt
diff --git a/lib/src/generator/generator_frontend.dart b/lib/src/generator/generator_frontend.dart
index 1fd974f..e99de66 100644
--- a/lib/src/generator/generator_frontend.dart
+++ b/lib/src/generator/generator_frontend.dart
@@ -146,6 +146,12 @@
_generatorBackend.generateProperty(
writer, packageGraph, lib, extension, property);
}
+
+ for (var staticField in filterNonDocumented(extension.staticFields)) {
+ indexAccumulator.add(staticField);
+ _generatorBackend.generateProperty(
+ writer, packageGraph, lib, extension, staticField);
+ }
}
for (var mixin in filterNonDocumented(lib.mixins)) {
diff --git a/lib/src/model/accessor.dart b/lib/src/model/accessor.dart
index 9c6512c..ff84265 100644
--- a/lib/src/model/accessor.dart
+++ b/lib/src/model/accessor.dart
@@ -28,12 +28,8 @@
GetterSetterCombo get definingCombo {
if (_definingCombo == null) {
var variable = (element as PropertyAccessorElement).variable;
- var accessor = isGetter ? variable.getter : variable.setter;
- var accessorLibrary = Library(accessor.library, packageGraph);
- var definingAccessor =
- ModelElement.from(accessor, accessorLibrary, packageGraph)
- as Accessor;
- _definingCombo = definingAccessor.enclosingCombo;
+ _definingCombo = ModelElement.fromElement(variable, packageGraph);
+ assert(_definingCombo != null, 'Unable to find defining combo');
}
return _definingCombo;
}
diff --git a/lib/src/model/model_element.dart b/lib/src/model/model_element.dart
index 58c57b4..3c1ad76 100644
--- a/lib/src/model/model_element.dart
+++ b/lib/src/model/model_element.dart
@@ -359,12 +359,14 @@
}
}
if (e is PropertyAccessorElement) {
- // TODO(jcollins-g): why test for ClassElement in enclosingElement?
+ // Accessors can be part of a [Container], or a part of a [Library].
if (e.enclosingElement is ClassElement ||
+ e.enclosingElement is ExtensionElement ||
e is MultiplyInheritedExecutableElement) {
if (enclosingContainer == null) {
return ContainerAccessor(e, library, packageGraph);
} else {
+ assert(e.enclosingElement is! ExtensionElement);
return ContainerAccessor.inherited(
e, library, packageGraph, enclosingContainer,
originalMember: originalMember);
diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart
index 9b3eda5..01ee005 100644
--- a/test/end2end/model_test.dart
+++ b/test/end2end/model_test.dart
@@ -1746,6 +1746,7 @@
group('Extension', () {
Extension arm, leg, ext, fancyList, uphill;
Extension documentOnceReexportOne, documentOnceReexportTwo;
+ Extension staticFieldExtension;
Library reexportOneLib, reexportTwoLib;
Class apple,
anotherExtended,
@@ -1784,6 +1785,8 @@
.firstWhere((e) => e.name == 'SimpleStringExtension')
.instanceMethods
.firstWhere((m) => m.name == 'doStuff');
+ staticFieldExtension = exLibrary.extensions
+ .firstWhere((e) => e.name == 'StaticFieldExtension');
extensions = exLibrary.publicExtensions.toList();
baseTest = fakeLibrary.classes.firstWhere((e) => e.name == 'BaseTest');
bigAnotherExtended =
@@ -1798,6 +1801,11 @@
fakeLibrary.classes.firstWhere((e) => e.name == 'SuperMegaTron');
});
+ test('static fields inside extensions do not crash', () {
+ expect(staticFieldExtension.staticFields.length, equals(1));
+ expect(staticFieldExtension.staticFields.first.name, equals('aStatic'));
+ });
+
test('basic canonicalization for extensions', () {
expect(documentOnceReexportOne.isCanonical, isFalse);
expect(
@@ -1980,11 +1988,11 @@
});
test('correctly finds all the extensions', () {
- expect(exLibrary.extensions, hasLength(8));
+ expect(exLibrary.extensions, hasLength(9));
});
test('correctly finds all the public extensions', () {
- expect(extensions, hasLength(6));
+ expect(extensions, hasLength(7));
});
});
diff --git a/testing/test_package/lib/example.dart b/testing/test_package/lib/example.dart
index 1bcc2b4..43151cc 100644
--- a/testing/test_package/lib/example.dart
+++ b/testing/test_package/lib/example.dart
@@ -648,6 +648,10 @@
void bar() {}
}
+extension StaticFieldExtension on Object {
+ static int aStatic;
+}
+
/// This class has nothing to do with [_Shhh], [FancyList], or [AnExtension.call],
/// but should not crash because we referenced them.
/// We should be able to find [DocumentThisExtensionOnce], too.