| Index: lib/src/codegen/js_interop.dart
|
| diff --git a/lib/src/codegen/js_interop.dart b/lib/src/codegen/js_interop.dart
|
| index 1e6dff69bcbaa90cd632c7b5ae37d12a6e94c3ed..777a0097bde7e47720d2dd05638683a0c11c2baf 100644
|
| --- a/lib/src/codegen/js_interop.dart
|
| +++ b/lib/src/codegen/js_interop.dart
|
| @@ -11,21 +11,40 @@ import 'package:analyzer/src/generated/constant.dart';
|
| bool _isJsLibType(String expectedName, Element e) =>
|
| e?.name == expectedName && _isJsLib(e.library);
|
|
|
| +/// Returns true if [e] represents any library from `package:js` or is the
|
| +/// internal `dart:_js_helper` library.
|
| bool _isJsLib(LibraryElement e) {
|
| - var libName = e?.name;
|
| - return libName == 'js' ||
|
| - libName == 'js.varargs' ||
|
| - libName == 'dart._js_helper';
|
| + if (e == null) return false;
|
| + var uri = e.source.uri;
|
| + if (uri.scheme == 'package' && uri.path.startsWith('js/')) return true;
|
| + if (uri.scheme == 'dart') {
|
| + return uri.path == '_js_helper' || uri.path == '_foreign_helper';
|
| + }
|
| + return false;
|
| }
|
|
|
| +/// Whether [value] is a `@rest` annotation (to be used on function parameters
|
| +/// to have them compiled as `...` rest params in ES6 outputs).
|
| bool isJsRestAnnotation(DartObjectImpl value) =>
|
| _isJsLibType('_Rest', value.type.element);
|
|
|
| +/// Whether [i] is a `spread` invocation (to be used on function arguments
|
| +/// to have them compiled as `...` spread args in ES6 outputs).
|
| bool isJsSpreadInvocation(MethodInvocation i) =>
|
| _isJsLibType('spread', i.methodName?.bestElement);
|
|
|
| // TODO(jmesserly): Move JsPeerInterface to package:js (see issue #135).
|
| -bool isJSAnnotation(DartObjectImpl value) => value.type.name == 'JS';
|
| +bool isJSAnnotation(DartObjectImpl value) =>
|
| + _isJsLibType('JS', value.type.element);
|
| +
|
| +/// Whether [value] is a `@JSExportName` (internal annotation used in SDK
|
| +/// instead of `@JS` from `package:js`).
|
| +bool isJSExportNameAnnotation(DartObjectImpl value) {
|
| + var e = value?.type?.element;
|
| + if (e?.name != 'JSExportName') return false;
|
| + var uri = e.source.uri;
|
| + return uri.scheme == 'dart' && uri.path == '_foreign_helper';
|
| +}
|
|
|
| bool isJsPeerInterface(DartObjectImpl value) =>
|
| value.type.name == 'JsPeerInterface';
|
|
|