Не удается открыть реализацию или объявление toUpperCase () или toLowerCase () в файле .dart в intellijIDEA - PullRequest
0 голосов
/ 13 июля 2020

с использованием файла .dart в Intellij IDEA, нажав F12, чтобы показать объявление, или Ctrl + Alt + B, чтобы показать, что реализация не работает для методов toUpperCase () или toLowerCase ()

они отлично работают с roundToDouble () и to round ()

какие-нибудь идеи, как это исправить?

Edit: ниже скриншот для кого-то на YouTube, кто мог это сделать! введите описание изображения здесь

1 Ответ

1 голос
/ 13 июля 2020

Потому что String не реализован как часть SDK, а вместо этого определяется временем выполнения c (класс String, который вы видите в SDK, - это просто класс abstract). Так что, если вы, например, компилируете в JavaScript, вы будете использовать другую реализацию (точнее, прямой вызов того же метода в JavaScript).

В VM методы String «вставлены» в класс с этим классом: https://github.com/dart-lang/sdk/blob/ea50b03cbee9971a3e3f1cc5c832fc2dfb941654/sdk/lib/_internal/vm/lib/string_patch.dart

Но, как вы можете видеть:

  String toUpperCase() native "String_toUpperCase";

  String toLowerCase() native "String_toLowerCase";

Эти два метода фактически реализуются вызовом в реализацию C ++. Поэтому нам нужно посмотреть здесь: https://github.com/dart-lang/sdk/blob/78df4ac452dd3ba69ac0c78559f6dde51eeeadb2/runtime/lib/string.cc

Где мы находим:

DEFINE_NATIVE_ENTRY(String_toLowerCase, 0, 1) {
  const String& receiver =
      String::CheckedHandle(zone, arguments->NativeArgAt(0));
  ASSERT(!receiver.IsNull());
  return String::ToLowerCase(receiver);
}

DEFINE_NATIVE_ENTRY(String_toUpperCase, 0, 1) {
  const String& receiver =
      String::CheckedHandle(zone, arguments->NativeArgAt(0));
  ASSERT(!receiver.IsNull());
  return String::ToUpperCase(receiver);
}

Эту реализацию можно найти здесь: https://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/vm/object.cc#L22023

StringPtr String::ToUpperCase(const String& str, Heap::Space space) {
  // TODO(cshapiro): create a fast-path for OneByteString instances.
  return Transform(CaseMapping::ToUpper, str, space);
}

StringPtr String::ToLowerCase(const String& str, Heap::Space space) {
  // TODO(cshapiro): create a fast-path for OneByteString instances.
  return Transform(CaseMapping::ToLower, str, space);
}

Где CaseMapping можно найти здесь: https://github.com/dart-lang/sdk/blob/da9697feb96364360bfaedbb1c661c20bf7a4cb0/runtime/platform/unicode.h#L170

И так далее и так далее ... :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...