98befcf281
Change-Id: I365abf095f0801bb8ce864f3bbaa57ff298164c3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/402881 Reviewed-by: Nate Bosch <nbosch@google.com> Commit-Queue: Devon Carew <devoncarew@google.com>
91 lines
3.4 KiB
Dart
91 lines
3.4 KiB
Dart
// Copyright (c) 2020, 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.
|
|
|
|
/// Helpers for parsing Code object name produced by Code::QualifiedName
|
|
library;
|
|
|
|
// Wrapper around the name of a Code object produced by Code::QualifiedName.
|
|
//
|
|
// Raw textual representation of the name contains not just the name of itself,
|
|
// but also various attributes (whether this code object originates from the
|
|
// Dart function or from a stub, whether it is optimized or not, whether
|
|
// it corresponds to some synthetic function, etc).
|
|
class Name {
|
|
/// Raw textual representation of the name as it occurred in the output
|
|
/// of the AOT compiler.
|
|
final String raw;
|
|
|
|
/// Pretty version of the name, with some of the irrelevant information
|
|
/// removed from it.
|
|
///
|
|
/// Note: we still expect this name to be unique within compilation,
|
|
/// so we are not removing any details that are used for disambiguation.
|
|
/// The only exception are type testing stubs, these refer to type names
|
|
/// and types names are not bound to be unique between compilations.
|
|
late final String scrubbed =
|
|
raw.replaceAll(isStub ? _stubScrubbingRe : _scrubbingRe, '');
|
|
|
|
Name(this.raw);
|
|
|
|
/// Returns true if this name refers to a stub.
|
|
bool get isStub => raw.startsWith('[Stub] ');
|
|
|
|
/// Returns true if this name refers to an allocation stub.
|
|
bool get isAllocationStub => raw.startsWith('[Stub] Allocate ');
|
|
|
|
/// Returns true if this name refers to a type testing stub.
|
|
bool get isTypeTestingStub => raw.startsWith('[Stub] Type Test ');
|
|
|
|
/// Split this name into individual '.' separated components (e.g. names of
|
|
/// its parent functions).
|
|
List<String> get components {
|
|
// Break the rest of the name into components.
|
|
final result = scrubbed.split('.');
|
|
|
|
// Constructor names look like this 'new <ClassName>.<CtorName>' so
|
|
// we need to concatenate the first two components back to form
|
|
// the constructor name.
|
|
if (result.first.startsWith('new ')) {
|
|
result[0] = '${result[0]}${result[1]}';
|
|
result.removeAt(1);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/// Split raw name into individual '.' separated components (e.g. names of
|
|
/// its parent functions).
|
|
List<String> get rawComponents {
|
|
// Break the rest of the name into components.
|
|
final result = raw.split('.');
|
|
|
|
// Constructor names look like this 'new <ClassName>.<CtorName>' so
|
|
// we need to concatenate the first two components back to form
|
|
// the constructor name.
|
|
if (result.first.startsWith('new ')) {
|
|
result[0] = '${result[0]}.${result[1]}';
|
|
result.removeAt(1);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
static String collapse(String name) =>
|
|
name.replaceAll(_collapseRe, '<anonymous closure>');
|
|
}
|
|
|
|
// Remove useless prefixes and private library suffixes from the raw name.
|
|
//
|
|
// Note that we want to keep anonymous closure token positions in the name
|
|
// still, these names are formatted as '<anonymous closure @\d+>'.
|
|
final _scrubbingRe =
|
|
RegExp(r'\[(Optimized|Unoptimized|Stub)\]\s*|@\d+(?![>\d])');
|
|
|
|
// Remove useless prefixes and private library suffixes from the raw name
|
|
// for stubs.
|
|
final _stubScrubbingRe = RegExp(r'\[Stub\]\s*|@\d+|\(H[a-f\d]+\) ');
|
|
|
|
// Remove token positions from anonymous closure names.
|
|
final _collapseRe = RegExp(r'<anonymous closure @\d+>');
|