c878108cc8
All non-pubspec changes generated by `dart format pkg/compiler`. Change-Id: Iadaa70974816d96ccb47813fe72d5a2bb83d6bda Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400181 Reviewed-by: Nate Biggs <natebiggs@google.com> Commit-Queue: Mayank Patke <fishythefish@google.com>
182 lines
5.2 KiB
Dart
182 lines
5.2 KiB
Dart
// Copyright (c) 2015, 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 source_map_name_test;
|
|
|
|
import 'package:compiler/src/elements/names.dart';
|
|
import 'package:expect/async_helper.dart';
|
|
import 'package:expect/expect.dart';
|
|
import 'package:compiler/src/commandline_options.dart';
|
|
import 'package:compiler/src/common/elements.dart' show JElementEnvironment;
|
|
import 'package:compiler/src/compiler.dart';
|
|
import 'package:compiler/src/elements/entities.dart';
|
|
import 'package:compiler/src/io/kernel_source_information.dart';
|
|
import 'package:compiler/src/js_model/js_world.dart';
|
|
import 'package:compiler/src/util/memory_compiler.dart';
|
|
|
|
const String SOURCE = '''
|
|
|
|
var toplevelField;
|
|
toplevelMethod() {}
|
|
void toplevelAnonymous() {
|
|
var foo = () {};
|
|
}
|
|
void toplevelLocal() {
|
|
void localMethod() {}
|
|
}
|
|
|
|
class Class {
|
|
Class() {
|
|
var foo = () {};
|
|
}
|
|
Class.named() {
|
|
void localMethod() {}
|
|
}
|
|
static var staticField;
|
|
static staticMethod() {}
|
|
static void staticAnonymous() {
|
|
var foo = () {};
|
|
}
|
|
static void staticLocal() {
|
|
void localMethod() {}
|
|
}
|
|
var instanceField;
|
|
instanceMethod() {}
|
|
void instanceAnonymous() {
|
|
var foo = () {};
|
|
}
|
|
void instanceLocal() {
|
|
void localMethod() {}
|
|
}
|
|
void instanceNestedLocal() {
|
|
void localMethod() {
|
|
var foo = () {};
|
|
void nestedLocalMethod() {}
|
|
}
|
|
}
|
|
}
|
|
|
|
main() {
|
|
toplevelField = toplevelMethod();
|
|
toplevelAnonymous();
|
|
toplevelLocal();
|
|
|
|
Class.staticField = Class.staticMethod;
|
|
Class.staticAnonymous();
|
|
Class.staticLocal();
|
|
|
|
var c = Class();
|
|
c = Class.named();
|
|
c.instanceField = c.instanceMethod();
|
|
c.instanceAnonymous();
|
|
c.instanceLocal();
|
|
c.instanceNestedLocal();
|
|
}
|
|
''';
|
|
|
|
main() {
|
|
asyncTest(() async {
|
|
CompilationResult result = await runCompiler(
|
|
memorySourceFiles: {'main.dart': SOURCE},
|
|
options: [Flags.disableInlining],
|
|
);
|
|
Compiler compiler = result.compiler!;
|
|
JClosedWorld closedWorld = compiler.backendClosedWorldForTesting!;
|
|
JElementEnvironment env = closedWorld.elementEnvironment;
|
|
LibraryEntity mainApp = env.mainLibrary!;
|
|
|
|
check(MemberEntity element, String expectedName) {
|
|
String? name = computeKernelElementNameForSourceMaps(
|
|
closedWorld.elementMap,
|
|
element,
|
|
);
|
|
Expect.equals(
|
|
expectedName,
|
|
name,
|
|
"Unexpected name '$name' for $element, expected '$expectedName'.",
|
|
);
|
|
}
|
|
|
|
MemberEntity lookup(String name) {
|
|
MemberEntity? element;
|
|
int dotPosition = name.indexOf('.');
|
|
if (dotPosition != -1) {
|
|
String clsName = name.substring(0, dotPosition);
|
|
ClassEntity? cls = env.lookupClass(mainApp, clsName);
|
|
Expect.isNotNull(cls, "Class '$clsName' not found.");
|
|
var subname = name.substring(dotPosition + 1);
|
|
element =
|
|
env.lookupLocalClassMember(
|
|
cls!,
|
|
Name(subname, cls.library.canonicalUri),
|
|
) ??
|
|
env.lookupConstructor(cls, subname);
|
|
} else {
|
|
element = env.lookupLibraryMember(mainApp, name);
|
|
}
|
|
Expect.isNotNull(element, "Element '$name' not found.");
|
|
return element!;
|
|
}
|
|
|
|
void checkName(
|
|
String expectedName, [
|
|
List<String>? expectedClosureNames,
|
|
String? lookupName,
|
|
]) {
|
|
if (lookupName == null) {
|
|
lookupName = expectedName;
|
|
}
|
|
dynamic element = lookup(lookupName);
|
|
check(element, expectedName);
|
|
if (element is ConstructorEntity) {
|
|
env.forEachConstructorBody(element.enclosingClass, (body) {
|
|
if (body.name != element.name) return;
|
|
Expect.isNotNull(
|
|
body,
|
|
"Constructor body '${element.name}' not found.",
|
|
);
|
|
check(body, expectedName);
|
|
});
|
|
}
|
|
|
|
if (expectedClosureNames != null) {
|
|
int index = 0;
|
|
env.forEachNestedClosure(element, (closure) {
|
|
String expectedName = expectedClosureNames[index];
|
|
check(closure, expectedName);
|
|
index++;
|
|
});
|
|
}
|
|
}
|
|
|
|
checkName('toplevelField');
|
|
checkName('toplevelMethod');
|
|
checkName('toplevelAnonymous', ['toplevelAnonymous.<anonymous function>']);
|
|
checkName('toplevelLocal', ['toplevelLocal.localMethod']);
|
|
checkName('main');
|
|
|
|
checkName('Class.staticField');
|
|
checkName('Class.staticMethod');
|
|
checkName('Class.staticAnonymous', [
|
|
'Class.staticAnonymous.<anonymous function>',
|
|
]);
|
|
checkName('Class.staticLocal', ['Class.staticLocal.localMethod']);
|
|
|
|
checkName('Class', ['Class.<anonymous function>'], 'Class.');
|
|
checkName('Class.named', ['Class.named.localMethod']);
|
|
|
|
checkName('Class.instanceField');
|
|
checkName('Class.instanceMethod');
|
|
checkName('Class.instanceAnonymous', [
|
|
'Class.instanceAnonymous.<anonymous function>',
|
|
]);
|
|
checkName('Class.instanceLocal', ['Class.instanceLocal.localMethod']);
|
|
checkName('Class.instanceNestedLocal', [
|
|
'Class.instanceNestedLocal.localMethod',
|
|
'Class.instanceNestedLocal.localMethod.<anonymous function>',
|
|
'Class.instanceNestedLocal.localMethod.nestedLocalMethod',
|
|
]);
|
|
});
|
|
}
|