mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:07:06 +00:00
efe0ddccab
Change-Id: I5eacb92ea6ce00d83b3440a473cca8dad0892a87 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/197165 Reviewed-by: Dmitry Stefantsov <dmitryas@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
62 lines
1.9 KiB
Dart
62 lines
1.9 KiB
Dart
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
library kernel.external_name;
|
|
|
|
import 'ast.dart';
|
|
|
|
/// Returns external (native) name of given [Member].
|
|
String? getExternalName(Member procedure) {
|
|
// Native procedures are marked as external and have an annotation,
|
|
// which looks like this:
|
|
//
|
|
// import 'dart:_internal' as internal;
|
|
//
|
|
// @internal.ExternalName("<name-of-native>")
|
|
// external Object foo(arg0, ...);
|
|
//
|
|
if (!procedure.isExternal) {
|
|
return null;
|
|
}
|
|
for (final Expression annotation in procedure.annotations) {
|
|
final String? value = _getExternalNameValue(annotation);
|
|
if (value != null) {
|
|
return value;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// Returns native extension URIs for given [library].
|
|
List<String> getNativeExtensionUris(Library library) {
|
|
final List<String> uris = <String>[];
|
|
for (Expression annotation in library.annotations) {
|
|
final String? value = _getExternalNameValue(annotation);
|
|
if (value != null) {
|
|
uris.add(value);
|
|
}
|
|
}
|
|
return uris;
|
|
}
|
|
|
|
String? _getExternalNameValue(Expression annotation) {
|
|
if (annotation is ConstructorInvocation) {
|
|
if (_isExternalName(annotation.target.enclosingClass)) {
|
|
return (annotation.arguments.positional.single as StringLiteral).value;
|
|
}
|
|
} else if (annotation is ConstantExpression) {
|
|
final Constant constant = annotation.constant;
|
|
if (constant is InstanceConstant) {
|
|
if (_isExternalName(constant.classNode)) {
|
|
return (constant.fieldValues.values.single as StringConstant).value;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
bool _isExternalName(Class klass) =>
|
|
klass.name == 'ExternalName' &&
|
|
klass.enclosingLibrary.importUri.toString() == 'dart:_internal';
|