blob: 4855843efbcd223638610c8ccc5265447aa41f5b [file] [log] [blame]
// 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:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/entities.dart';
import 'package:compiler/src/io/source_information.dart';
import '../memory_compiler.dart';
const String SOURCE = '''
var toplevelField;
void 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 = new Class();
c = new Class.named();
c.instanceField = c.instanceMethod();
c.instanceAnonymous();
c.instanceLocal();
c.instanceNestedLocal();
}
''';
check(Entity element, String expectedName) {
String name = computeElementNameForSourceMaps(element);
Expect.equals(expectedName, name,
"Unexpected name '$name' for $element, expected '$expectedName'.");
}
main() {
asyncTest(() async {
CompilationResult result =
await runCompiler(memorySourceFiles: {'main.dart': SOURCE});
Compiler compiler = result.compiler;
var env = compiler.backendClosedWorldForTesting.elementEnvironment;
LibraryEntity mainApp = env.mainLibrary;
Entity lookup(String name) {
Entity 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, subname) ??
env.lookupConstructor(cls, subname);
} else if (name.substring(0, 1) == name.substring(0, 1).toUpperCase()) {
element = env.lookupClass(mainApp, name);
} 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);
check(closure.enclosingClass, expectedName);
index++;
});
}
}
checkName('toplevelField');
checkName('toplevelMethod');
// TODO(johnniwinther): improve closure names.
checkName('toplevelAnonymous', ['toplevelAnonymous_closure']);
checkName('toplevelLocal', ['toplevelLocal_localMethod']);
checkName('Class');
checkName('main');
checkName('Class.staticField');
checkName('Class.staticMethod');
checkName('Class.staticAnonymous', ['Class_staticAnonymous_closure']);
checkName('Class.staticLocal', ['Class_staticLocal_localMethod']);
checkName('Class', ['Class_closure'], 'Class.');
checkName('Class.named', ['Class\$named_localMethod']);
checkName('Class.instanceField');
checkName('Class.instanceMethod');
checkName('Class.instanceAnonymous', ['Class_instanceAnonymous_closure']);
checkName('Class.instanceLocal', ['Class_instanceLocal_localMethod']);
checkName('Class.instanceNestedLocal', [
'Class_instanceNestedLocal_localMethod',
'Class_instanceNestedLocal_localMethod_closure',
'Class_instanceNestedLocal_localMethod_nestedLocalMethod'
]);
});
}