@@ -12,7 +12,7 @@ import 'package:_fe_analyzer_shared/src/messages/codes.dart'
1212 messageJsInteropAnonymousFactoryPositionalParameters,
1313 messageJsInteropEnclosingClassJSAnnotation,
1414 messageJsInteropEnclosingClassJSAnnotationContext,
15- messageJsInteropExternalExtensionMemberNotOnJSClass ,
15+ messageJsInteropExternalExtensionMemberOnTypeInvalid ,
1616 messageJsInteropExternalMemberNotJSAnnotated,
1717 messageJsInteropIndexNotSupported,
1818 messageJsInteropNamedParameters,
@@ -282,13 +282,14 @@ class JsInteropChecks extends RecursiveVisitor {
282282 /// [member] is `external` and not an allowed `external` usage.
283283 void _checkDisallowedExternal (Member member) {
284284 if (member.isExternal) {
285- // TODO(rileyporter): Allow extension members on some Native classes.
286285 if (member.isExtensionMember) {
287- _diagnosticsReporter.report (
288- messageJsInteropExternalExtensionMemberNotOnJSClass,
289- member.fileOffset,
290- member.name.text.length,
291- member.fileUri);
286+ if (! _isNativeExtensionMember (member)) {
287+ _diagnosticsReporter.report (
288+ messageJsInteropExternalExtensionMemberOnTypeInvalid,
289+ member.fileOffset,
290+ member.name.text.length,
291+ member.fileUri);
292+ }
292293 } else if (! hasJSInteropAnnotation (member) &&
293294 ! _isAllowedExternalUsage (member)) {
294295 // Member could be JS annotated and not considered a JS interop member
@@ -338,6 +339,18 @@ class JsInteropChecks extends RecursiveVisitor {
338339 /// Returns whether given extension [member] is in an extension that is on a
339340 /// JS interop class.
340341 bool _isJSExtensionMember (Member member) {
342+ return _checkExtensionMember (member, hasJSInteropAnnotation);
343+ }
344+
345+ /// Returns whether given extension [member] is in an extension on a Native
346+ /// class.
347+ bool _isNativeExtensionMember (Member member) {
348+ return _checkExtensionMember (member, _nativeClasses.containsValue);
349+ }
350+
351+ /// Returns whether given extension [member] is on a class that passses the
352+ /// given [validateExtensionClass] .
353+ bool _checkExtensionMember (Member member, Function validateExtensionClass) {
341354 assert (member.isExtensionMember);
342355 if (_libraryExtensionsIndex == null ) {
343356 _libraryExtensionsIndex = {};
@@ -347,6 +360,6 @@ class JsInteropChecks extends RecursiveVisitor {
347360 }
348361
349362 var onType = _libraryExtensionsIndex! [member.reference]! .onType;
350- return onType is InterfaceType && hasJSInteropAnnotation (onType.classNode);
363+ return onType is InterfaceType && validateExtensionClass (onType.classNode);
351364 }
352365}
0 commit comments