mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 04:37:12 +00:00
407428311f
Change-Id: I277a4f29d39c2c4d2669931b5f4837db65589167 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149522 Auto-Submit: Kevin Moore <kevmoo@google.com> Commit-Queue: Leaf Petersen <leafp@google.com> Reviewed-by: Leaf Petersen <leafp@google.com>
162 lines
4.9 KiB
Dart
162 lines
4.9 KiB
Dart
// Copyright (c) 2019, 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.
|
|
|
|
// Tests resolution of identifiers inside of extension methods
|
|
|
|
// Test the non error cases for an extension MyExt with member names
|
|
// overlapping the instance scopes against:
|
|
// - a class AGlobal which overlaps the names from the global scope as well
|
|
// as providing its own members
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
// Note: These imports may be deliberately unused. They bring certain
|
|
// names into scope, in order to test that certain resolution choices are
|
|
// made even in the presence of other symbols.
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// Do Not Delete.
|
|
// Bring global members into scope.
|
|
import "helpers/global_scope.dart";
|
|
|
|
// Do Not Delete.
|
|
// Bring a class AGlobal with instance members and global members into scope.
|
|
import "helpers/class_shadow.dart";
|
|
import "helpers/class_no_shadow.dart";
|
|
|
|
const bool extensionValue = true;
|
|
|
|
void checkExtensionValue(bool x) {
|
|
Expect.equals(x, extensionValue);
|
|
}
|
|
|
|
// Put the extension members in the global scope
|
|
int fieldInExtensionScope = globalValue;
|
|
int get getterInExtensionScope => globalValue;
|
|
set setterInExtensionScope(int x) {
|
|
checkGlobalValue(x);
|
|
}
|
|
|
|
int methodInExtensionScope() => globalValue;
|
|
|
|
// Put the superclass members in the global scope
|
|
int fieldInInstanceScope = globalValue;
|
|
int get getterInInstanceScope => globalValue;
|
|
set setterInInstanceScope(int x) {
|
|
checkGlobalValue(x);
|
|
}
|
|
|
|
int methodInInstanceScope() => globalValue;
|
|
|
|
// An extension which defines only its own members
|
|
extension MyExt on AGlobal {
|
|
bool get fieldInExtensionScope => extensionValue;
|
|
bool get getterInExtensionScope => extensionValue;
|
|
set setterInExtensionScope(bool x) {
|
|
checkExtensionValue(x);
|
|
}
|
|
|
|
bool methodInExtensionScope() => extensionValue;
|
|
|
|
bool get fieldInInstanceScope => extensionValue;
|
|
bool get getterInInstanceScope => extensionValue;
|
|
set setterInInstanceScope(bool x) {
|
|
checkExtensionValue(x);
|
|
}
|
|
|
|
bool methodInInstanceScope() => extensionValue;
|
|
|
|
void testNakedIdentifiers() {
|
|
// Members that are in the global namespace and the instance namespace
|
|
// resolve to the global namespace.
|
|
{
|
|
int t0 = fieldInGlobalScope;
|
|
checkGlobalValue(t0);
|
|
int t1 = getterInGlobalScope;
|
|
checkGlobalValue(t1);
|
|
setterInGlobalScope = globalValue;
|
|
int t2 = methodInGlobalScope();
|
|
checkGlobalValue(t2);
|
|
}
|
|
|
|
// Members that are in the global namespace and the local namespace resolve
|
|
// to the local namespace.
|
|
{
|
|
bool t0 = fieldInExtensionScope;
|
|
checkExtensionValue(t0);
|
|
bool t1 = getterInExtensionScope;
|
|
checkExtensionValue(t1);
|
|
setterInExtensionScope = extensionValue;
|
|
bool t2 = methodInExtensionScope();
|
|
checkExtensionValue(t2);
|
|
}
|
|
|
|
// Members that are in the global namespace and the instance and the local
|
|
// namespace resolve to the local namespace.
|
|
{
|
|
bool t0 = fieldInInstanceScope;
|
|
checkExtensionValue(t0);
|
|
bool t1 = getterInInstanceScope;
|
|
checkExtensionValue(t1);
|
|
setterInInstanceScope = extensionValue;
|
|
bool t2 = methodInInstanceScope();
|
|
checkExtensionValue(t2);
|
|
}
|
|
}
|
|
|
|
void instanceTest() {
|
|
MyExt(this).testNakedIdentifiers();
|
|
}
|
|
}
|
|
|
|
class B extends AGlobal {
|
|
void testNakedIdentifiers() {
|
|
// Members that are in the global namespace and the superclass namespace
|
|
// should resolve to the global name space, and not to the members of the
|
|
// superclass.
|
|
{
|
|
int t0 = fieldInGlobalScope;
|
|
checkGlobalValue(t0);
|
|
int t1 = getterInGlobalScope;
|
|
checkGlobalValue(t1);
|
|
setterInGlobalScope = globalValue;
|
|
int t2 = methodInGlobalScope();
|
|
checkGlobalValue(t2);
|
|
}
|
|
|
|
// Members that are in the global namespace and the extension namespace
|
|
// should resolve to the global name space, and not to the members of the
|
|
// extension.
|
|
{
|
|
int t0 = fieldInExtensionScope;
|
|
checkGlobalValue(t0);
|
|
int t1 = getterInExtensionScope;
|
|
checkGlobalValue(t1);
|
|
setterInExtensionScope = globalValue;
|
|
int t2 = methodInExtensionScope();
|
|
checkGlobalValue(t2);
|
|
}
|
|
|
|
// Members that are in the global namespace, and the superclass namespace,
|
|
// and the extension namespace, should resolve to the global name space, and
|
|
// not to the members of the extension nor the members of the superclass.
|
|
{
|
|
int t0 = fieldInInstanceScope;
|
|
checkGlobalValue(t0);
|
|
int t1 = getterInInstanceScope;
|
|
checkGlobalValue(t1);
|
|
setterInInstanceScope = globalValue;
|
|
int t2 = methodInInstanceScope();
|
|
checkGlobalValue(t2);
|
|
}
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
var a = new AGlobal();
|
|
a.instanceTest();
|
|
new B().testNakedIdentifiers();
|
|
}
|